Compare commits
443 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
c3a73a41d1 | ||
|
|
b72baa3295 | ||
|
|
73ce22c8a4 | ||
|
|
c4f7e6659f | ||
|
|
0739ae006d | ||
|
|
eaa92e784d | ||
|
|
48589e0da1 | ||
|
|
0044d83801 | ||
|
|
50e917d232 | ||
|
|
ccd14e0462 | ||
|
|
d0c0104546 | ||
|
|
cd34ade638 | ||
|
|
3f91e33a8c | ||
|
|
17cc996288 | ||
|
|
385776dc0f | ||
|
|
e52278c371 | ||
|
|
7ffc8c1eda | ||
|
|
1359615c82 | ||
|
|
7a7a56940c | ||
|
|
bcbe83cb38 | ||
|
|
37f983aee3 | ||
|
|
77de3f2b9d | ||
|
|
f655b54937 | ||
|
|
cac99ebdd4 | ||
|
|
f0d0a1546a | ||
|
|
8e8459fa55 | ||
|
|
d53c55ecb5 | ||
|
|
ea33d61a90 | ||
|
|
2fcc3388dd | ||
|
|
ef7f033c32 | ||
|
|
7aa54dc92e | ||
|
|
d10ad1b413 | ||
|
|
34063a0b84 | ||
|
|
8c9d975d69 | ||
|
|
03b072b894 | ||
|
|
d1bed49808 | ||
|
|
6c3417d9b5 | ||
|
|
ba65226460 | ||
|
|
9c9cd168ee | ||
|
|
abb3d2a8d9 | ||
|
|
637fe8a04b | ||
|
|
be321e95e5 | ||
|
|
ed46c1486c | ||
|
|
c9fcfc6862 | ||
|
|
8495e37566 | ||
|
|
247bd43ae2 | ||
|
|
a6685b1559 | ||
|
|
66c4e8064b | ||
|
|
9d1fa3f202 | ||
|
|
a6985d7dc7 | ||
|
|
027c021ac9 | ||
|
|
604205ec09 | ||
|
|
77db016866 | ||
|
|
c6a009dbae | ||
|
|
4299e3f90c | ||
|
|
19f4812c03 | ||
|
|
d01c465a8d | ||
|
|
4f1409601e | ||
|
|
52cffe0864 | ||
|
|
0866d5c055 | ||
|
|
78c08f6503 | ||
|
|
27d0ac3d75 | ||
|
|
a8776002f3 | ||
|
|
31aa008566 | ||
|
|
9d405b4581 | ||
|
|
80c490a18b | ||
|
|
30c9c3739f | ||
|
|
ee0e7a09e0 | ||
|
|
bfd9577f0d | ||
|
|
0cada4ca76 | ||
|
|
a718ccc0b6 | ||
|
|
1fcfd8e645 | ||
|
|
c6dd932a0b | ||
|
|
b79eed01e0 | ||
|
|
3a7dbe9764 | ||
|
|
bef2534fa8 | ||
|
|
888dcd2559 | ||
|
|
2b69fca6bd | ||
|
|
7d088d42b4 | ||
|
|
f8ad303b13 | ||
|
|
3c59c6fc9b | ||
|
|
7353d729d7 | ||
|
|
62591e0e7a | ||
|
|
012f15d84b | ||
|
|
e57c6f94d2 | ||
|
|
40b27e8ad8 | ||
|
|
055e9f21b7 | ||
|
|
d7085b17fe | ||
|
|
0d4d7c9c0c | ||
|
|
99209d36e1 | ||
|
|
e2a9a0ff3d | ||
|
|
ab166959a4 | ||
|
|
ab692cfa3d | ||
|
|
c3ae6f3a4a | ||
|
|
5ef4a52bbd | ||
|
|
582768a5e4 | ||
|
|
1852d1cc6f | ||
|
|
7a5a541a4e | ||
|
|
72b03e009c | ||
|
|
1b113c1045 | ||
|
|
54959557ea | ||
|
|
d44cb7f256 | ||
|
|
3d063c95d1 | ||
|
|
09cab605fc | ||
|
|
666c8c0498 | ||
|
|
d3e764d7f9 | ||
|
|
7060625adf | ||
|
|
21b6e23e98 | ||
|
|
a0f794e372 | ||
|
|
9195504329 | ||
|
|
8c5d9dd549 | ||
|
|
580f6a5b6c | ||
|
|
74e76b460b | ||
|
|
c4570b37b7 | ||
|
|
cd0b0012d9 | ||
|
|
c055b4d32d | ||
|
|
75a9ff832a | ||
|
|
b64d3af1f3 | ||
|
|
fb6605bb40 | ||
|
|
3bfae80fa7 | ||
|
|
cb16cb0610 | ||
|
|
0baed1a275 | ||
|
|
42162c8015 | ||
|
|
0fab0c416d | ||
|
|
e2e262c8ce | ||
|
|
cf6596203b | ||
|
|
471911a54f | ||
|
|
9394f4f540 | ||
|
|
4e968216ad | ||
|
|
84a7a9555f | ||
|
|
8d12fd152b | ||
|
|
629b765abc | ||
|
|
63a89fa84a | ||
|
|
a3f89236a0 | ||
|
|
01560abafb | ||
|
|
b5698026ba | ||
|
|
6258ce75b7 | ||
|
|
6f34c74027 | ||
|
|
8add4f359b | ||
|
|
d8933c135f | ||
|
|
eb350e8d6c | ||
|
|
615fedd64d | ||
|
|
25bd82ecaa | ||
|
|
e0938e5e3a | ||
|
|
ec5e6c8443 | ||
|
|
25d8077474 | ||
|
|
06083f40d9 | ||
|
|
ec203f7f79 | ||
|
|
1b30d7d47a | ||
|
|
d9be9c958f | ||
|
|
ed09796e0d | ||
|
|
4bfa29c0ab | ||
|
|
4804bbb211 | ||
|
|
749102f9c2 | ||
|
|
0bcb1434b0 |
@@ -15,7 +15,8 @@ jobs:
|
|||||||
executor: docker
|
executor: docker
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
- setup_remote_docker
|
- setup_remote_docker:
|
||||||
|
version: 19.03.13
|
||||||
- run:
|
- run:
|
||||||
name: Build
|
name: Build
|
||||||
command: |
|
command: |
|
||||||
@@ -31,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
|
||||||
|
|||||||
2
.github/workflows/nodejs.yml
vendored
2
.github/workflows/nodejs.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
|||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [12.x, 14.x]
|
node-version: [12.x, 14.x, 15.x]
|
||||||
|
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
v14.4.0
|
v14.15.1
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
FROM node:14.4.0-alpine AS base
|
FROM node:14.15.1-alpine AS base
|
||||||
|
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
|
|
||||||
RUN npm i -g npm@latest
|
|
||||||
|
|
||||||
WORKDIR /misskey
|
WORKDIR /misskey
|
||||||
|
|
||||||
FROM base AS builder
|
FROM base AS builder
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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
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/**/*',
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
_lang_: "العربية"
|
_lang_: "العربية"
|
||||||
|
introMisskey: "اهلا بك! ميسكي هو منصة تدوين مصغر لا مركزية ومفتوحة المصدر.\nيمكنك مشاركة \"ملاحظات\" عن ما يجري حولك، وإخبار الجميع عن نفسك 📡\nتسمح لك \"الانفعالات\" بتعبير عن شعورك حول ملاحظات الآخرين 👍\nاكتشف عالمًا جديدًا 🚀"
|
||||||
monthAndDay: "{day}/{month}"
|
monthAndDay: "{day}/{month}"
|
||||||
search: "البحث"
|
search: "البحث"
|
||||||
notifications: "الإشعارات"
|
notifications: "الإشعارات"
|
||||||
@@ -32,6 +33,7 @@ favorite: "إضافة إلى المفضلة"
|
|||||||
favorites: "المفضلات"
|
favorites: "المفضلات"
|
||||||
unfavorite: "إزالة من المفضلة"
|
unfavorite: "إزالة من المفضلة"
|
||||||
pin: "دبّسها على الصفحة الشخصية"
|
pin: "دبّسها على الصفحة الشخصية"
|
||||||
|
unpin: "ألغ تثبيتها من ملفك الشخصي"
|
||||||
copyContent: "انسخ المحتوى"
|
copyContent: "انسخ المحتوى"
|
||||||
copyLink: "انسخ الرابط"
|
copyLink: "انسخ الرابط"
|
||||||
delete: "حذف"
|
delete: "حذف"
|
||||||
@@ -78,6 +80,7 @@ followRequest: "طلب اشتراك"
|
|||||||
followRequests: "طلبات الإشتراك"
|
followRequests: "طلبات الإشتراك"
|
||||||
unfollow: "إلغاء الاشتراك"
|
unfollow: "إلغاء الاشتراك"
|
||||||
followRequestPending: "طلبات الإشتراك المعلّقة"
|
followRequestPending: "طلبات الإشتراك المعلّقة"
|
||||||
|
enterEmoji: "أدخل إيموجي"
|
||||||
unrenote: "إلغاء مشاركة الملاحظة"
|
unrenote: "إلغاء مشاركة الملاحظة"
|
||||||
quote: "اقتبس"
|
quote: "اقتبس"
|
||||||
pinnedNote: "ملاحظة مدبسة"
|
pinnedNote: "ملاحظة مدبسة"
|
||||||
@@ -93,6 +96,8 @@ mute: "اكتم"
|
|||||||
unmute: "إلغاء الكتم"
|
unmute: "إلغاء الكتم"
|
||||||
block: "احجب"
|
block: "احجب"
|
||||||
unblock: "إلغاء الحجب"
|
unblock: "إلغاء الحجب"
|
||||||
|
suspend: "علِق"
|
||||||
|
unsuspend: "ألغ التعليق"
|
||||||
blockConfirm: "أمتأكد من حجب هذا الحساب؟"
|
blockConfirm: "أمتأكد من حجب هذا الحساب؟"
|
||||||
unblockConfirm: "أمتأكد من إلغاء حجب هذا الحساب؟"
|
unblockConfirm: "أمتأكد من إلغاء حجب هذا الحساب؟"
|
||||||
selectList: "اختر قائمة"
|
selectList: "اختر قائمة"
|
||||||
@@ -169,6 +174,7 @@ imageUrl: "عنوان URL للصورة"
|
|||||||
remove: "حذف"
|
remove: "حذف"
|
||||||
removed: "تم حذفه بنجاح"
|
removed: "تم حذفه بنجاح"
|
||||||
removeAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
removeAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
||||||
|
deleteAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
||||||
saved: "تم حفظه"
|
saved: "تم حفظه"
|
||||||
messaging: "الدردشة"
|
messaging: "الدردشة"
|
||||||
upload: "تحميل"
|
upload: "تحميل"
|
||||||
@@ -245,6 +251,7 @@ registration: "إنشاء حساب"
|
|||||||
enableRegistration: "تفعيل إنشاء الحسابات الجديدة"
|
enableRegistration: "تفعيل إنشاء الحسابات الجديدة"
|
||||||
invite: "دعوة"
|
invite: "دعوة"
|
||||||
basicInfo: "المعلومات الأساسية "
|
basicInfo: "المعلومات الأساسية "
|
||||||
|
pinnedNotes: "ملاحظة مدبسة"
|
||||||
hcaptchaSiteKey: "مفتاح الموقع"
|
hcaptchaSiteKey: "مفتاح الموقع"
|
||||||
hcaptchaSecretKey: "المفتاح السري"
|
hcaptchaSecretKey: "المفتاح السري"
|
||||||
recaptcha: "reCAPTCHA"
|
recaptcha: "reCAPTCHA"
|
||||||
@@ -267,7 +274,6 @@ popularTags: "الوسوم الرائجة"
|
|||||||
userList: "القوائم"
|
userList: "القوائم"
|
||||||
about: "عن"
|
about: "عن"
|
||||||
aboutMisskey: "عن Misskey"
|
aboutMisskey: "عن Misskey"
|
||||||
patrons: "الداعمون"
|
|
||||||
administrator: "المدير"
|
administrator: "المدير"
|
||||||
token: "الرمز المميز"
|
token: "الرمز المميز"
|
||||||
twoStepAuthentication: "الإستيثاق بعاملَيْن"
|
twoStepAuthentication: "الإستيثاق بعاملَيْن"
|
||||||
@@ -280,7 +286,6 @@ unregister: "إلغاء التسجيل"
|
|||||||
passwordLessLogin: "لِج مِن دون كلمة سرية"
|
passwordLessLogin: "لِج مِن دون كلمة سرية"
|
||||||
resetPassword: "أعد تعيين كلمتك السرية"
|
resetPassword: "أعد تعيين كلمتك السرية"
|
||||||
newPasswordIs: "كلمتك السرية الجديدة هي {password}"
|
newPasswordIs: "كلمتك السرية الجديدة هي {password}"
|
||||||
autoNoteWatch: "راقب الملاحظات تلقائيا"
|
|
||||||
share: "شارِك"
|
share: "شارِك"
|
||||||
notFound: "غير موجود"
|
notFound: "غير موجود"
|
||||||
help: "المساعدة"
|
help: "المساعدة"
|
||||||
@@ -304,6 +309,7 @@ noteOf: "ملاحظات {user}"
|
|||||||
inviteToGroup: "دعوة إلى فريق"
|
inviteToGroup: "دعوة إلى فريق"
|
||||||
noMessagesYet: "ليس هناك رسائل بعد"
|
noMessagesYet: "ليس هناك رسائل بعد"
|
||||||
newMessageExists: "لقد تلقيت رسالة جديدة"
|
newMessageExists: "لقد تلقيت رسالة جديدة"
|
||||||
|
invitations: "دعوة"
|
||||||
invitationCode: "رمز الدعوة"
|
invitationCode: "رمز الدعوة"
|
||||||
checking: "التحقق جارٍ"
|
checking: "التحقق جارٍ"
|
||||||
available: "متوفر"
|
available: "متوفر"
|
||||||
@@ -374,6 +380,14 @@ smtpHost: "المضيف"
|
|||||||
smtpUser: "اسم المستخدم"
|
smtpUser: "اسم المستخدم"
|
||||||
smtpPass: "الكلمة السرية"
|
smtpPass: "الكلمة السرية"
|
||||||
display: "المظهر"
|
display: "المظهر"
|
||||||
|
public: "للعامة"
|
||||||
|
_mfm:
|
||||||
|
mention: "أشر الى"
|
||||||
|
quote: "اقتبس"
|
||||||
|
emoji: "إيموجي مخصص"
|
||||||
|
search: "البحث"
|
||||||
|
_reversi:
|
||||||
|
total: "المجموع"
|
||||||
_channel:
|
_channel:
|
||||||
featured: "المتداوَلة"
|
featured: "المتداوَلة"
|
||||||
_sidebar:
|
_sidebar:
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ instance: "Instanz"
|
|||||||
settings: "Einstellungen"
|
settings: "Einstellungen"
|
||||||
basicSettings: "Allgemeine Einstellungen"
|
basicSettings: "Allgemeine Einstellungen"
|
||||||
otherSettings: "Andere Einstellungen"
|
otherSettings: "Andere Einstellungen"
|
||||||
openInWindow: "In neuem Fenster öffnen"
|
openInWindow: "In Fenster öffnen"
|
||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
timeline: "Chronik"
|
timeline: "Chronik"
|
||||||
noAccountDescription: "Dieser Nutzer hat seine Profilbeschreibung noch nicht ausgefüllt."
|
noAccountDescription: "Dieser Nutzer hat seine Profilbeschreibung noch nicht ausgefüllt."
|
||||||
@@ -33,6 +33,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"
|
||||||
@@ -87,6 +90,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,6 +101,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: "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"
|
||||||
@@ -124,7 +131,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"
|
||||||
@@ -214,6 +223,8 @@ imageUrl: "Bild-URL"
|
|||||||
remove: "Löschen"
|
remove: "Löschen"
|
||||||
removed: "Erfolgreich gelöscht"
|
removed: "Erfolgreich gelöscht"
|
||||||
removeAreYouSure: "Möchtest du \"{x}\" wirklich löschen?"
|
removeAreYouSure: "Möchtest du \"{x}\" wirklich löschen?"
|
||||||
|
deleteAreYouSure: "Möchtest du \"{x}\" wirklich löschen?"
|
||||||
|
resetAreYouSure: "Wirklich zurücksetzen?"
|
||||||
saved: "Gespeichert"
|
saved: "Gespeichert"
|
||||||
messaging: "Chat"
|
messaging: "Chat"
|
||||||
upload: "Hochladen"
|
upload: "Hochladen"
|
||||||
@@ -232,7 +243,7 @@ nUsersRead: "Von {n} gelesen"
|
|||||||
agreeTo: "Ich stimme {0} zu"
|
agreeTo: "Ich stimme {0} zu"
|
||||||
tos: "Nutzungsbedingungen"
|
tos: "Nutzungsbedingungen"
|
||||||
start: "Anfangen"
|
start: "Anfangen"
|
||||||
home: "Startseite"
|
home: "Home"
|
||||||
remoteUserCaution: "Diese Informationen sind möglicherweise veraltet, da der Benutzer von einer anderen Instanz stammt."
|
remoteUserCaution: "Diese Informationen sind möglicherweise veraltet, da der Benutzer von einer anderen Instanz stammt."
|
||||||
activity: "Aktivität"
|
activity: "Aktivität"
|
||||||
images: "Bilder"
|
images: "Bilder"
|
||||||
@@ -313,6 +324,10 @@ bannerUrl: "Banner-URL"
|
|||||||
basicInfo: "Basisdaten"
|
basicInfo: "Basisdaten"
|
||||||
pinnedUsers: "Angepinnte Benutzer"
|
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"
|
||||||
|
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"
|
||||||
@@ -353,13 +368,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"
|
||||||
@@ -373,8 +381,6 @@ unregister: "Deaktivieren"
|
|||||||
passwordLessLogin: "Passwortloses Anmelden einrichten"
|
passwordLessLogin: "Passwortloses Anmelden einrichten"
|
||||||
resetPassword: "Passwort zurücksetzen"
|
resetPassword: "Passwort zurücksetzen"
|
||||||
newPasswordIs: "Das neue Passwort ist \"{password}\""
|
newPasswordIs: "Das neue Passwort ist \"{password}\""
|
||||||
autoNoteWatch: "Notizen automatisch beobachten"
|
|
||||||
autoNoteWatchDescription: "Werde über Notizen, auf die du reagiert oder geantwortet hast, informiert"
|
|
||||||
reduceUiAnimation: "Animationen der Benutzeroberfläche reduzieren"
|
reduceUiAnimation: "Animationen der Benutzeroberfläche reduzieren"
|
||||||
share: "Teilen"
|
share: "Teilen"
|
||||||
notFound: "Nicht gefunden"
|
notFound: "Nicht gefunden"
|
||||||
@@ -412,6 +418,7 @@ noMessagesYet: "Noch keine Nachrichten"
|
|||||||
newMessageExists: "Du hast eine neue Nachricht"
|
newMessageExists: "Du hast eine neue Nachricht"
|
||||||
onlyOneFileCanBeAttached: "Es kann pro Nachricht nur eine Datei angehängt werden"
|
onlyOneFileCanBeAttached: "Es kann pro Nachricht nur eine Datei angehängt werden"
|
||||||
signinRequired: "Anmeldung erforderlich"
|
signinRequired: "Anmeldung erforderlich"
|
||||||
|
invitations: "Einladungen"
|
||||||
invitationCode: "Einladungscode"
|
invitationCode: "Einladungscode"
|
||||||
checking: "Wird überprüft..."
|
checking: "Wird überprüft..."
|
||||||
available: "Verfügbar"
|
available: "Verfügbar"
|
||||||
@@ -435,6 +442,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"
|
||||||
@@ -484,9 +492,10 @@ newNoteRecived: "Es gibt neue Notizen"
|
|||||||
sounds: "Töne"
|
sounds: "Töne"
|
||||||
listen: "Anhören"
|
listen: "Anhören"
|
||||||
none: "Keine"
|
none: "Keine"
|
||||||
showInPage: "In Seiten 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."
|
||||||
@@ -541,6 +550,12 @@ pluginInstallWarn: "Installiere nur vertrauenswürdige Plugins."
|
|||||||
deck: "Deck"
|
deck: "Deck"
|
||||||
undeck: "Deck verlassen"
|
undeck: "Deck verlassen"
|
||||||
useBlurEffectForModal: "Weichzeichnungseffekt für Modals verwenden"
|
useBlurEffectForModal: "Weichzeichnungseffekt für Modals verwenden"
|
||||||
|
useFullReactionPicker: "Vollständige Reaktionsauswahl nutzen"
|
||||||
|
width: "Breite"
|
||||||
|
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"
|
||||||
@@ -553,7 +568,8 @@ useStarForReactionFallback: "Verwende ★ falls das Reaktions-Emoji unbekannt is
|
|||||||
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"
|
||||||
@@ -585,6 +601,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"
|
||||||
@@ -593,6 +610,164 @@ fillAbuseReportDescription: "Bitte gib Details für diese Meldung an. Falls es s
|
|||||||
abuseReported: "Die Meldung wurde versendet. Vielen Dank."
|
abuseReported: "Die Meldung wurde versendet. Vielen Dank."
|
||||||
send: "Senden"
|
send: "Senden"
|
||||||
abuseMarkAsResolved: "Meldung als gelöst markieren"
|
abuseMarkAsResolved: "Meldung als gelöst markieren"
|
||||||
|
openInNewTab: "In neuem Tab öffnen"
|
||||||
|
openInSideView: "In Seitenansicht öffnen"
|
||||||
|
defaultNavigationBehaviour: "Standardnavigationsverhalten"
|
||||||
|
editTheseSettingsMayBreakAccount: "Bei Bearbeitung dieser Einstellungen besteht die Gefahr, dein Benutzerkonto zu beschädigen."
|
||||||
|
instanceTicker: "Instanz-Informationen von Notizen"
|
||||||
|
waitingFor: "Warte auf {x}"
|
||||||
|
random: "Zufällig"
|
||||||
|
system: "System"
|
||||||
|
switchUi: "UI wechseln"
|
||||||
|
desktop: "Desktop"
|
||||||
|
clip: "Clip"
|
||||||
|
createNew: "Neu erstellen"
|
||||||
|
optional: "Optional"
|
||||||
|
createNewClip: "Neuen Clip erstellen"
|
||||||
|
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: "Einstellungen treten nach einer Aktualisierung der Seite in Kraft. Jetzt aktualisieren?"
|
||||||
|
_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:
|
||||||
|
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."
|
||||||
|
dummy: "Misskey erweitert die Welt des Fediverse"
|
||||||
|
mention: "Erwähnung"
|
||||||
|
mentionDescription: "Mit At-Zeichen und Nutzername kann ein individueller Nutzer angegeben werden."
|
||||||
|
hashtag: "Hashtag"
|
||||||
|
hashtagDescription: "Mit einer Raute und Text kann ein Hashtag angegeben werden."
|
||||||
|
url: "URL"
|
||||||
|
urlDescription: "URLs können angezeigt werden."
|
||||||
|
link: "Link"
|
||||||
|
linkDescription: "Ein spezifizierter Textabschnitt kann als URL angezeigt werden."
|
||||||
|
bold: "Fett"
|
||||||
|
boldDescription: "Zeichen zur Betonung dicker erscheinen lassen."
|
||||||
|
small: "Klein"
|
||||||
|
smallDescription: "Inhalt klein und dünn erscheinen lassen."
|
||||||
|
center: "Zentrieren"
|
||||||
|
centerDescription: "Inhalt zentriert anzeigen lassen."
|
||||||
|
inlineCode: "Code (Eingebettet)"
|
||||||
|
inlineCodeDescription: "Syntax-Hervorhebung für (Programm-)Code eingebettet anzeigen lassen."
|
||||||
|
blockCode: "Code (Block)"
|
||||||
|
blockCodeDescription: "Syntax-Hervorhebung für mehrzeiligen (Programm-)Code als Block anzeigen lassen."
|
||||||
|
inlineMath: "Mathe (Eingebettet)"
|
||||||
|
inlineMathDescription: "Mathematische Formeln (KaTeX) eingebettet anzeigen."
|
||||||
|
blockMath: "Mathe (Block)"
|
||||||
|
blockMathDescription: "Mehrzeilige mathematische Formeln (KaTeX) als Block einbetten."
|
||||||
|
quote: "Zitationen"
|
||||||
|
quoteDescription: "Inhalt als Zitat anzeigen lassen."
|
||||||
|
emoji: "Benutzerdefinierte Emojis"
|
||||||
|
emojiDescription: "Emoji-Namen mit Doppelpunkten umschließen, um benutzerdefinierte Emojis anzeigen zu lassen."
|
||||||
|
search: "Suche"
|
||||||
|
searchDescription: "Eine vorgefertige Suchanfragebox anzeigen lassen."
|
||||||
|
flip: "Spiegelung"
|
||||||
|
flipDescription: "Inhalt horizontal oder vertikal gespiegelt anzeigen lassen."
|
||||||
|
jelly: "Animation (Dehnen)"
|
||||||
|
jellyDescription: "Verleiht eine sich dehnende Animation."
|
||||||
|
tada: "Animation (Tada)"
|
||||||
|
tadaDescription: "Verleiht eine Animation mit \"Tada!\"-Gefühl"
|
||||||
|
jump: "Animation (Sprung)"
|
||||||
|
jumpDescription: "Verleiht eine springende Animation."
|
||||||
|
bounce: "Animation (Federn)"
|
||||||
|
bounceDescription: "Erzeugt eine federnde Animation."
|
||||||
|
shake: "Animation (Zittern)"
|
||||||
|
shakeDescription: "Verleiht eine zitternde Animation."
|
||||||
|
twitch: "Animation (Zucken)"
|
||||||
|
twitchDescription: "Verleiht eine sehr stark zuckende Animation."
|
||||||
|
spin: "Animation (Rotieren)"
|
||||||
|
spinDescription: "Verleiht eine rotierende Animation."
|
||||||
|
_reversi:
|
||||||
|
reversi: "Reversi"
|
||||||
|
gameSettings: "Spieleinstellungen"
|
||||||
|
chooseBoard: "Spielbrett auswählen"
|
||||||
|
blackOrWhite: "Schwarz/Weiß"
|
||||||
|
blackIs: "{name} spielt Schwarz"
|
||||||
|
rules: "Regeln"
|
||||||
|
botSettings: "Optionen des Computergegners"
|
||||||
|
thisGameIsStartedSoon: "Dieses Spiel beginnt in wenigen Sekunden"
|
||||||
|
waitingForOther: "Warte auf den Zug des Gegenspielers"
|
||||||
|
waitingForMe: "Warte auf deinen Zug"
|
||||||
|
waitingBoth: "Mach dich bereit"
|
||||||
|
ready: "Bereit"
|
||||||
|
cancelReady: "Nicht bereit"
|
||||||
|
opponentTurn: "Zug deines Gegners"
|
||||||
|
myTurn: "Dein Zug"
|
||||||
|
turnOf: "Zug von {name}"
|
||||||
|
pastTurnOf: "Zug von {name}"
|
||||||
|
surrender: "Aufgeben"
|
||||||
|
surrendered: "durch Aufgabe"
|
||||||
|
drawn: "Unentschieden"
|
||||||
|
won: "{name} hat gesiegt"
|
||||||
|
black: "Schwarz"
|
||||||
|
white: "Weiß"
|
||||||
|
total: "Gesamt"
|
||||||
|
turnCount: " Zug {count}"
|
||||||
|
myGames: "Meine Runden"
|
||||||
|
allGames: "Alle Runden"
|
||||||
|
ended: "Beendet"
|
||||||
|
playing: "Laufend"
|
||||||
|
isLlotheo: "Der mit weniger Steinen gewinnt (Llotheo)"
|
||||||
|
loopedMap: "Wiederholendes Spielbrett"
|
||||||
|
canPutEverywhere: "Steine können überall platziert werden"
|
||||||
|
_instanceTicker:
|
||||||
|
none: "Nie anzeigen"
|
||||||
|
remote: "Für Benutzer fremder Instanzen anzeigen"
|
||||||
|
always: "Immer anzeigen"
|
||||||
_serverDisconnectedBehavior:
|
_serverDisconnectedBehavior:
|
||||||
reload: "Automatisch aktualisieren"
|
reload: "Automatisch aktualisieren"
|
||||||
dialog: "Warnungsfenster zeigen"
|
dialog: "Warnungsfenster zeigen"
|
||||||
@@ -609,7 +784,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"
|
||||||
@@ -626,6 +801,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"
|
||||||
@@ -699,6 +876,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"
|
||||||
@@ -810,6 +989,8 @@ _widgets:
|
|||||||
digitalClock: "Digitaluhr"
|
digitalClock: "Digitaluhr"
|
||||||
federation: "Föderation"
|
federation: "Föderation"
|
||||||
postForm: "Neue Notiz anfertigen"
|
postForm: "Neue Notiz anfertigen"
|
||||||
|
slideshow: "Diashow"
|
||||||
|
button: "Knopf"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Ausblenden"
|
hide: "Ausblenden"
|
||||||
show: "Mehr anzeigen"
|
show: "Mehr anzeigen"
|
||||||
@@ -864,9 +1045,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"
|
||||||
@@ -973,6 +1158,7 @@ _pages:
|
|||||||
created: "Seite erfolgreich erstellt"
|
created: "Seite erfolgreich erstellt"
|
||||||
updated: "Seite erfolgreich aktualisiert"
|
updated: "Seite erfolgreich aktualisiert"
|
||||||
deleted: "Seite erfolgreich gelöscht"
|
deleted: "Seite erfolgreich gelöscht"
|
||||||
|
pageSetting: "Seiteneinstellungen"
|
||||||
nameAlreadyExists: "Die angegebene Seiten-URL existiert bereits"
|
nameAlreadyExists: "Die angegebene Seiten-URL existiert bereits"
|
||||||
invalidNameTitle: "Die angegebene Seiten-URL ist ungültig"
|
invalidNameTitle: "Die angegebene Seiten-URL ist ungültig"
|
||||||
invalidNameText: "Überprüfe, ob der Seitentitel nicht leer ist"
|
invalidNameText: "Überprüfe, ob der Seitentitel nicht leer ist"
|
||||||
@@ -983,7 +1169,9 @@ _pages:
|
|||||||
unlike: "\"Gefällt mir\" entfernen"
|
unlike: "\"Gefällt mir\" entfernen"
|
||||||
my: "Meine Seiten"
|
my: "Meine Seiten"
|
||||||
liked: "Seiten, die mir gefallen"
|
liked: "Seiten, die mir gefallen"
|
||||||
|
featured: "Beliebt"
|
||||||
inspector: "Inspektor"
|
inspector: "Inspektor"
|
||||||
|
contents: "Inhalt"
|
||||||
content: "Inhalt"
|
content: "Inhalt"
|
||||||
variables: "Variablen"
|
variables: "Variablen"
|
||||||
title: "Titel"
|
title: "Titel"
|
||||||
@@ -1007,7 +1195,7 @@ _pages:
|
|||||||
text: "Text"
|
text: "Text"
|
||||||
textarea: "Textfeld"
|
textarea: "Textfeld"
|
||||||
section: "Abschnitt"
|
section: "Abschnitt"
|
||||||
image: "Bilder"
|
image: "Bild"
|
||||||
button: "Knopf"
|
button: "Knopf"
|
||||||
if: "Falls"
|
if: "Falls"
|
||||||
_if:
|
_if:
|
||||||
@@ -1022,7 +1210,7 @@ _pages:
|
|||||||
name: "Variablenname"
|
name: "Variablenname"
|
||||||
text: "Titel"
|
text: "Titel"
|
||||||
default: "Standardwert"
|
default: "Standardwert"
|
||||||
textareaInput: "Eingabe des mehrzeiligen Textfelds"
|
textareaInput: "Mehrzeiliges Texteingabefeld"
|
||||||
_textareaInput:
|
_textareaInput:
|
||||||
name: "Variablenname"
|
name: "Variablenname"
|
||||||
text: "Titel"
|
text: "Titel"
|
||||||
@@ -1037,6 +1225,11 @@ _pages:
|
|||||||
id: "Leinwand-ID"
|
id: "Leinwand-ID"
|
||||||
width: "Breite"
|
width: "Breite"
|
||||||
height: "Höhe"
|
height: "Höhe"
|
||||||
|
note: "Eingebettete Notiz"
|
||||||
|
_note:
|
||||||
|
id: "Notiz ID"
|
||||||
|
idDescription: "Du kannst alternativ auch die Notiz-URL angeben."
|
||||||
|
detailed: "Detailierte Ansicht"
|
||||||
switch: "Fallunterscheidung"
|
switch: "Fallunterscheidung"
|
||||||
_switch:
|
_switch:
|
||||||
name: "Variablenname"
|
name: "Variablenname"
|
||||||
@@ -1280,6 +1473,8 @@ _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"
|
||||||
@@ -1288,6 +1483,7 @@ _deck:
|
|||||||
stackLeft: "Nach links stapeln"
|
stackLeft: "Nach links stapeln"
|
||||||
popRight: "Nach rechts vom Stapel nehmen"
|
popRight: "Nach rechts vom Stapel nehmen"
|
||||||
_columns:
|
_columns:
|
||||||
|
main: "Hauptspalte"
|
||||||
widgets: "Widgets"
|
widgets: "Widgets"
|
||||||
notifications: "Benachrichtigungen"
|
notifications: "Benachrichtigungen"
|
||||||
tl: "Chronik"
|
tl: "Chronik"
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ instance: "Instance"
|
|||||||
settings: "Settings"
|
settings: "Settings"
|
||||||
basicSettings: "Basic Settings"
|
basicSettings: "Basic Settings"
|
||||||
otherSettings: "Other Settings"
|
otherSettings: "Other Settings"
|
||||||
openInWindow: "Open in new window"
|
openInWindow: "Open in window"
|
||||||
profile: "Profile"
|
profile: "Profile"
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
noAccountDescription: "This user has not written their bio yet."
|
noAccountDescription: "This user has not written their bio yet."
|
||||||
@@ -33,6 +33,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"
|
||||||
@@ -63,7 +66,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"
|
||||||
@@ -87,6 +90,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,6 +101,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 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"
|
||||||
@@ -124,7 +131,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"
|
||||||
@@ -214,6 +223,8 @@ imageUrl: "Image URL"
|
|||||||
remove: "Delete"
|
remove: "Delete"
|
||||||
removed: "Successfully deleted"
|
removed: "Successfully deleted"
|
||||||
removeAreYouSure: "Are you sure that you want to delete \"{x}\"?"
|
removeAreYouSure: "Are you sure that you want to delete \"{x}\"?"
|
||||||
|
deleteAreYouSure: "Are you sure that you want to delete \"{x}\"?"
|
||||||
|
resetAreYouSure: "Really reset?"
|
||||||
saved: "Saved"
|
saved: "Saved"
|
||||||
messaging: "Messaging"
|
messaging: "Messaging"
|
||||||
upload: "Upload"
|
upload: "Upload"
|
||||||
@@ -240,7 +251,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"
|
||||||
@@ -313,6 +324,10 @@ bannerUrl: "Banner image URL"
|
|||||||
basicInfo: "Basic info"
|
basicInfo: "Basic info"
|
||||||
pinnedUsers: "Pinned user"
|
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"
|
||||||
|
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"
|
||||||
@@ -353,13 +368,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"
|
||||||
@@ -373,8 +381,6 @@ unregister: "Unregister"
|
|||||||
passwordLessLogin: "Set up password-less login"
|
passwordLessLogin: "Set up password-less login"
|
||||||
resetPassword: "Reset password"
|
resetPassword: "Reset password"
|
||||||
newPasswordIs: "The new password is \"{password}\""
|
newPasswordIs: "The new password is \"{password}\""
|
||||||
autoNoteWatch: "Watch note automatically"
|
|
||||||
autoNoteWatchDescription: "Get notified about the notes which you reactioned or replied."
|
|
||||||
reduceUiAnimation: "Reduce UI animation"
|
reduceUiAnimation: "Reduce UI animation"
|
||||||
share: "Share"
|
share: "Share"
|
||||||
notFound: "Not found"
|
notFound: "Not found"
|
||||||
@@ -405,13 +411,14 @@ next: "Next"
|
|||||||
retype: "Enter again"
|
retype: "Enter again"
|
||||||
noteOf: "{user}'s notes"
|
noteOf: "{user}'s notes"
|
||||||
inviteToGroup: "Invite to group"
|
inviteToGroup: "Invite to group"
|
||||||
maxNoteTextLength: "Character limit of the note"
|
maxNoteTextLength: "Character limit of notes"
|
||||||
quoteAttached: "Quoted"
|
quoteAttached: "Quoted"
|
||||||
quoteQuestion: "Do you want to append a quote?"
|
quoteQuestion: "Do you want to append a quote?"
|
||||||
noMessagesYet: "No messages yet"
|
noMessagesYet: "No messages yet"
|
||||||
newMessageExists: "You've got a new message"
|
newMessageExists: "You've got a new message"
|
||||||
onlyOneFileCanBeAttached: "You can only attach one file to a message"
|
onlyOneFileCanBeAttached: "You can only attach one file to a message"
|
||||||
signinRequired: "Please sign in"
|
signinRequired: "Please sign in"
|
||||||
|
invitations: "Invitations"
|
||||||
invitationCode: "Invitation code"
|
invitationCode: "Invitation code"
|
||||||
checking: "Checking"
|
checking: "Checking"
|
||||||
available: "Available"
|
available: "Available"
|
||||||
@@ -435,6 +442,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"
|
||||||
@@ -484,9 +492,10 @@ newNoteRecived: "You've got a new note"
|
|||||||
sounds: "Sounds"
|
sounds: "Sounds"
|
||||||
listen: "Listen"
|
listen: "Listen"
|
||||||
none: "None"
|
none: "None"
|
||||||
showInPage: "Show in Pages"
|
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."
|
||||||
@@ -541,6 +550,12 @@ pluginInstallWarn: "Please do not install untrustworthy plugins."
|
|||||||
deck: "Deck"
|
deck: "Deck"
|
||||||
undeck: "Leave Deck"
|
undeck: "Leave Deck"
|
||||||
useBlurEffectForModal: "Use blur effect for modals"
|
useBlurEffectForModal: "Use blur effect for modals"
|
||||||
|
useFullReactionPicker: "Use full-size reaction picker"
|
||||||
|
width: "Width"
|
||||||
|
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"
|
||||||
@@ -553,7 +568,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"
|
||||||
@@ -585,6 +601,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"
|
||||||
@@ -593,6 +610,164 @@ fillAbuseReportDescription: "Please fill in the report details. If it is about a
|
|||||||
abuseReported: "Your report has been sent. Thank you very much."
|
abuseReported: "Your report has been sent. Thank you very much."
|
||||||
send: "Send"
|
send: "Send"
|
||||||
abuseMarkAsResolved: "Mark report as resolved"
|
abuseMarkAsResolved: "Mark report as resolved"
|
||||||
|
openInNewTab: "Open in new tab"
|
||||||
|
openInSideView: "Open in side view"
|
||||||
|
defaultNavigationBehaviour: "Default navigation behavior"
|
||||||
|
editTheseSettingsMayBreakAccount: "Editing these settings may damage your account."
|
||||||
|
instanceTicker: "Instance information of notes"
|
||||||
|
waitingFor: "Waiting for {x}"
|
||||||
|
random: "Random"
|
||||||
|
system: "System"
|
||||||
|
switchUi: "Switch UI"
|
||||||
|
desktop: "Desktop"
|
||||||
|
clip: "Clip"
|
||||||
|
createNew: "Create new"
|
||||||
|
optional: "Optional"
|
||||||
|
createNewClip: "Create new clip"
|
||||||
|
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: "Settings will be applied upon page reload. Reload now?"
|
||||||
|
_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:
|
||||||
|
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."
|
||||||
|
dummy: "Misskey expands the world of the Fediverse"
|
||||||
|
mention: "Mention"
|
||||||
|
mentionDescription: "Using an At-Symbol and a username, you can specify a specific user."
|
||||||
|
hashtag: "Hashtag"
|
||||||
|
hashtagDescription: "Using a number sign and text, you can specify a hashtag."
|
||||||
|
url: "URL"
|
||||||
|
urlDescription: "URLs can be displayed."
|
||||||
|
link: "Link"
|
||||||
|
linkDescription: "Specific parts of text can be displayed as URL."
|
||||||
|
bold: "Bold"
|
||||||
|
boldDescription: "Highlights letters by making them thicker."
|
||||||
|
small: "Small"
|
||||||
|
smallDescription: "Displays contents small and thinn."
|
||||||
|
center: "Center"
|
||||||
|
centerDescription: "Displays content centered."
|
||||||
|
inlineCode: "Code (Inline)"
|
||||||
|
inlineCodeDescription: "Displays inline syntax highlighting for (program-)code."
|
||||||
|
blockCode: "Code (Block)"
|
||||||
|
blockCodeDescription: "Displays syntax highlighting for multi-line (program-)code in a block."
|
||||||
|
inlineMath: "Math (In-line)"
|
||||||
|
inlineMathDescription: "Display math formulas (KaTeX) in-line"
|
||||||
|
blockMath: "Math (Block)"
|
||||||
|
blockMathDescription: "Display multi-line Math formulas (KaTeX) in a block"
|
||||||
|
quote: "Quote"
|
||||||
|
quoteDescription: "Displays content as quote."
|
||||||
|
emoji: "Custom Emoji"
|
||||||
|
emojiDescription: "By surrounding a custom emoji name with colons, custom emoji can be displayed."
|
||||||
|
search: "Search"
|
||||||
|
searchDescription: "Displays a search box with pre-entered text."
|
||||||
|
flip: "Flip"
|
||||||
|
flipDescription: "Flips content horizontally or vertically."
|
||||||
|
jelly: "Animation (Jelly)"
|
||||||
|
jellyDescription: "Infuses a jelly-like animation."
|
||||||
|
tada: "Animation (Tada)"
|
||||||
|
tadaDescription: "Infuses a \"Tada!\"-like animation."
|
||||||
|
jump: "Animation (Jump)"
|
||||||
|
jumpDescription: "Infuses a jumping animation."
|
||||||
|
bounce: "Animation (Bounce)"
|
||||||
|
bounceDescription: "Causes a bouncy animation."
|
||||||
|
shake: "Animation (Shake)"
|
||||||
|
shakeDescription: "Infuses a shaking animation."
|
||||||
|
twitch: "Animation (Twitch)"
|
||||||
|
twitchDescription: "Infuses a strongly twitching animation."
|
||||||
|
spin: "Animation (Spin)"
|
||||||
|
spinDescription: "Infuses a spinning animation."
|
||||||
|
_reversi:
|
||||||
|
reversi: "Reversi"
|
||||||
|
gameSettings: "Game settings"
|
||||||
|
chooseBoard: "Choose a board"
|
||||||
|
blackOrWhite: "Black/White"
|
||||||
|
blackIs: "{name} is playing Black"
|
||||||
|
rules: "Rules"
|
||||||
|
botSettings: "Bot options"
|
||||||
|
thisGameIsStartedSoon: "The game will start in a few seconds"
|
||||||
|
waitingForOther: "Waiting for the opponent's turn"
|
||||||
|
waitingForMe: "Waiting for your turn"
|
||||||
|
waitingBoth: "Get ready"
|
||||||
|
ready: "Ready"
|
||||||
|
cancelReady: "Cancel ready"
|
||||||
|
opponentTurn: "Opponent's turn"
|
||||||
|
myTurn: "Your turn"
|
||||||
|
turnOf: "{name}'s turn"
|
||||||
|
pastTurnOf: "{name}'s turn"
|
||||||
|
surrender: "Surrender"
|
||||||
|
surrendered: "By surrender"
|
||||||
|
drawn: "Draw"
|
||||||
|
won: "{name}'s win"
|
||||||
|
black: "Black"
|
||||||
|
white: "White"
|
||||||
|
total: "Total"
|
||||||
|
turnCount: "Turn {count}"
|
||||||
|
myGames: "My rounds"
|
||||||
|
allGames: "All rounds"
|
||||||
|
ended: "Ended"
|
||||||
|
playing: "Currently playing"
|
||||||
|
isLlotheo: "The one with fewer stones wins (Llotheo)"
|
||||||
|
loopedMap: "Looped map"
|
||||||
|
canPutEverywhere: "Tiles are placeable everywhere"
|
||||||
|
_instanceTicker:
|
||||||
|
none: "Never show"
|
||||||
|
remote: "Show for remote users"
|
||||||
|
always: "Always show"
|
||||||
_serverDisconnectedBehavior:
|
_serverDisconnectedBehavior:
|
||||||
reload: "Automatically reload"
|
reload: "Automatically reload"
|
||||||
dialog: "Show warning dialog"
|
dialog: "Show warning dialog"
|
||||||
@@ -609,7 +784,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"
|
||||||
@@ -626,6 +801,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"
|
||||||
@@ -699,6 +876,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"
|
||||||
@@ -810,6 +989,8 @@ _widgets:
|
|||||||
digitalClock: "Digital clock"
|
digitalClock: "Digital clock"
|
||||||
federation: "Federation"
|
federation: "Federation"
|
||||||
postForm: "Compose a note"
|
postForm: "Compose a note"
|
||||||
|
slideshow: "Slideshow"
|
||||||
|
button: "Button"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Hide"
|
hide: "Hide"
|
||||||
show: "Load more"
|
show: "Load more"
|
||||||
@@ -864,9 +1045,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"
|
||||||
@@ -973,6 +1158,7 @@ _pages:
|
|||||||
created: "Successfully created a page!"
|
created: "Successfully created a page!"
|
||||||
updated: "Successfully updated the page!"
|
updated: "Successfully updated the page!"
|
||||||
deleted: "The page has been deleted"
|
deleted: "The page has been deleted"
|
||||||
|
pageSetting: "Page settings"
|
||||||
nameAlreadyExists: "The specified page URL already exists"
|
nameAlreadyExists: "The specified page URL already exists"
|
||||||
invalidNameTitle: "The specified page URL is invalid"
|
invalidNameTitle: "The specified page URL is invalid"
|
||||||
invalidNameText: "Check whether that is not a blank"
|
invalidNameText: "Check whether that is not a blank"
|
||||||
@@ -983,7 +1169,9 @@ _pages:
|
|||||||
unlike: "Undo like"
|
unlike: "Undo like"
|
||||||
my: "My pages"
|
my: "My pages"
|
||||||
liked: "Liked pages"
|
liked: "Liked pages"
|
||||||
|
featured: "Featured"
|
||||||
inspector: "Inspector"
|
inspector: "Inspector"
|
||||||
|
contents: "Content"
|
||||||
content: "Page block"
|
content: "Page block"
|
||||||
variables: "Variables"
|
variables: "Variables"
|
||||||
title: "Title"
|
title: "Title"
|
||||||
@@ -1037,6 +1225,11 @@ _pages:
|
|||||||
id: "Canvas ID"
|
id: "Canvas ID"
|
||||||
width: "Width"
|
width: "Width"
|
||||||
height: "Height"
|
height: "Height"
|
||||||
|
note: "Embedded note"
|
||||||
|
_note:
|
||||||
|
id: "Note ID"
|
||||||
|
idDescription: "You can also paste the Note's URL to set it instead."
|
||||||
|
detailed: "Detailed view"
|
||||||
switch: "Switch"
|
switch: "Switch"
|
||||||
_switch:
|
_switch:
|
||||||
name: "Variable name"
|
name: "Variable name"
|
||||||
@@ -1280,6 +1473,8 @@ _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"
|
||||||
@@ -1288,6 +1483,7 @@ _deck:
|
|||||||
stackLeft: "Stack on the left"
|
stackLeft: "Stack on the left"
|
||||||
popRight: "Pop to the right"
|
popRight: "Pop to the right"
|
||||||
_columns:
|
_columns:
|
||||||
|
main: "Main"
|
||||||
widgets: "Widgets"
|
widgets: "Widgets"
|
||||||
notifications: "Notifications"
|
notifications: "Notifications"
|
||||||
tl: "Timeline"
|
tl: "Timeline"
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ noNotes: "No hay notas"
|
|||||||
noNotifications: "No hay notificaciones"
|
noNotifications: "No hay notificaciones"
|
||||||
instance: "Instancia"
|
instance: "Instancia"
|
||||||
settings: "Configuración"
|
settings: "Configuración"
|
||||||
|
basicSettings: "Configuración Básica"
|
||||||
|
otherSettings: "Configuración avanzada"
|
||||||
|
openInWindow: "Abrir en una ventana"
|
||||||
profile: "Perfil"
|
profile: "Perfil"
|
||||||
timeline: "Linea de tiempo"
|
timeline: "Linea de tiempo"
|
||||||
noAccountDescription: "Este usuario no tiene una descripción"
|
noAccountDescription: "Este usuario no tiene una descripción"
|
||||||
@@ -30,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"
|
||||||
@@ -40,6 +46,7 @@ deleteAndEditConfirm: "¿Quieres borrar y editar este nota? Las reacciones, reno
|
|||||||
addToList: "Agregar a lista"
|
addToList: "Agregar a lista"
|
||||||
sendMessage: "Énviar mensaje"
|
sendMessage: "Énviar mensaje"
|
||||||
copyUsername: "Copiar nombre de usuario"
|
copyUsername: "Copiar nombre de usuario"
|
||||||
|
searchUser: "Búsqueda de usuarios"
|
||||||
reply: "Responder"
|
reply: "Responder"
|
||||||
loadMore: "Ver más"
|
loadMore: "Ver más"
|
||||||
youGotNewFollower: "te ha seguido"
|
youGotNewFollower: "te ha seguido"
|
||||||
@@ -66,7 +73,11 @@ followers: "Seguidores"
|
|||||||
followsYou: "Te sigue"
|
followsYou: "Te sigue"
|
||||||
createList: "Crear lista"
|
createList: "Crear lista"
|
||||||
manageLists: "Administrar listas"
|
manageLists: "Administrar listas"
|
||||||
|
error: "Error"
|
||||||
|
somethingHappened: "Ocurrió un error"
|
||||||
retry: "Reintentar"
|
retry: "Reintentar"
|
||||||
|
pageLoadError: "Error al leer la página"
|
||||||
|
pageLoadErrorDescription: "Normalmente es debido a la red o al caché del navegador. Por favor limpie el caché o intente más tarde."
|
||||||
enterListName: "Ingrese nombre de lista"
|
enterListName: "Ingrese nombre de lista"
|
||||||
privacy: "Privacidad"
|
privacy: "Privacidad"
|
||||||
makeFollowManuallyApprove: "Aprobar manualmente las solicitudes de seguimiento"
|
makeFollowManuallyApprove: "Aprobar manualmente las solicitudes de seguimiento"
|
||||||
@@ -79,6 +90,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ú"
|
||||||
@@ -87,6 +101,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"
|
||||||
@@ -105,6 +120,8 @@ unsuspendConfirm: "¿Quiere dejar de suspender esta cuenta?"
|
|||||||
selectList: "Seleccione una lista"
|
selectList: "Seleccione una lista"
|
||||||
selectAntenna: "Seleccionar antena"
|
selectAntenna: "Seleccionar antena"
|
||||||
selectWidget: "Seleccionar widget"
|
selectWidget: "Seleccionar widget"
|
||||||
|
editWidgets: "Editar widgets"
|
||||||
|
editWidgetsExit: "Terminar edición"
|
||||||
customEmojis: "Emojis personalizados"
|
customEmojis: "Emojis personalizados"
|
||||||
emoji: "Emoji"
|
emoji: "Emoji"
|
||||||
emojiName: "Nombre del emoji"
|
emojiName: "Nombre del emoji"
|
||||||
@@ -114,7 +131,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."
|
||||||
@@ -204,6 +223,8 @@ imageUrl: "URL de la imágen"
|
|||||||
remove: "Borrar"
|
remove: "Borrar"
|
||||||
removed: "Borrado"
|
removed: "Borrado"
|
||||||
removeAreYouSure: "¿Desea borrar \"{x}\"?"
|
removeAreYouSure: "¿Desea borrar \"{x}\"?"
|
||||||
|
deleteAreYouSure: "¿Desea borrar \"{x}\"?"
|
||||||
|
resetAreYouSure: "¿Desea reestablecer?"
|
||||||
saved: "Guardado"
|
saved: "Guardado"
|
||||||
messaging: "Chat"
|
messaging: "Chat"
|
||||||
upload: "Subir"
|
upload: "Subir"
|
||||||
@@ -303,6 +324,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"
|
||||||
@@ -343,13 +368,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"
|
||||||
@@ -363,8 +381,6 @@ unregister: "Cancelar registro"
|
|||||||
passwordLessLogin: "Iniciar sesión sin contraseña"
|
passwordLessLogin: "Iniciar sesión sin contraseña"
|
||||||
resetPassword: "Resetear contraseña"
|
resetPassword: "Resetear contraseña"
|
||||||
newPasswordIs: "La nueva contraseña es \"{password}\""
|
newPasswordIs: "La nueva contraseña es \"{password}\""
|
||||||
autoNoteWatch: "Ver nota automáticamente"
|
|
||||||
autoNoteWatchDescription: "Recibe notificaciones sobre las notas de otros usuarios que a los que respondiste y reaccionaste"
|
|
||||||
reduceUiAnimation: "Reducir la animación de la UI"
|
reduceUiAnimation: "Reducir la animación de la UI"
|
||||||
share: "Compartir"
|
share: "Compartir"
|
||||||
notFound: "No se encuentra"
|
notFound: "No se encuentra"
|
||||||
@@ -402,6 +418,7 @@ noMessagesYet: "Aún no hay chat"
|
|||||||
newMessageExists: "Tienes un mensaje nuevo"
|
newMessageExists: "Tienes un mensaje nuevo"
|
||||||
onlyOneFileCanBeAttached: "Solo se puede añadir un archivo al mensaje"
|
onlyOneFileCanBeAttached: "Solo se puede añadir un archivo al mensaje"
|
||||||
signinRequired: "Iniciar sesión"
|
signinRequired: "Iniciar sesión"
|
||||||
|
invitations: "Invitar"
|
||||||
invitationCode: "Código de invitación"
|
invitationCode: "Código de invitación"
|
||||||
checking: "Comprobando"
|
checking: "Comprobando"
|
||||||
available: "Disponible"
|
available: "Disponible"
|
||||||
@@ -425,6 +442,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"
|
||||||
@@ -443,6 +461,7 @@ total: "Total"
|
|||||||
weekOverWeekChanges: "Dif semanal"
|
weekOverWeekChanges: "Dif semanal"
|
||||||
dayOverDayChanges: "Dif diaria"
|
dayOverDayChanges: "Dif diaria"
|
||||||
appearance: "Apariencia"
|
appearance: "Apariencia"
|
||||||
|
clientSettings: "Configuración del cliente"
|
||||||
accountSettings: "Ajustes de cuenta"
|
accountSettings: "Ajustes de cuenta"
|
||||||
promotion: "Promovido"
|
promotion: "Promovido"
|
||||||
promote: "Promover"
|
promote: "Promover"
|
||||||
@@ -473,7 +492,10 @@ newNoteRecived: "Tienes una nota nuevo"
|
|||||||
sounds: "Sonidos"
|
sounds: "Sonidos"
|
||||||
listen: "Escuchar"
|
listen: "Escuchar"
|
||||||
none: "Ninguna"
|
none: "Ninguna"
|
||||||
|
showInPage: "Mostrar en la página"
|
||||||
|
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"
|
||||||
@@ -528,6 +550,12 @@ pluginInstallWarn: "Por favor no instale plugins que no son de confianza"
|
|||||||
deck: "Deck"
|
deck: "Deck"
|
||||||
undeck: "Quitar deck"
|
undeck: "Quitar deck"
|
||||||
useBlurEffectForModal: "Usar efecto borroso en modales"
|
useBlurEffectForModal: "Usar efecto borroso en modales"
|
||||||
|
useFullReactionPicker: "Reacción"
|
||||||
|
width: "Ancho"
|
||||||
|
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"
|
||||||
@@ -540,7 +568,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"
|
||||||
@@ -566,6 +595,111 @@ notificationSetting: "Ajustes de Notificaciones"
|
|||||||
notificationSettingDesc: "Por favor elija el tipo de notificación a mostrar"
|
notificationSettingDesc: "Por favor elija el tipo de notificación a mostrar"
|
||||||
useGlobalSetting: "Usar ajustes globales"
|
useGlobalSetting: "Usar ajustes globales"
|
||||||
useGlobalSettingDesc: "Al activarse, se usará la configuración de notificaciones de la cuenta, al desactivarse se pueden hacer configuraciones particulares."
|
useGlobalSettingDesc: "Al activarse, se usará la configuración de notificaciones de la cuenta, al desactivarse se pueden hacer configuraciones particulares."
|
||||||
|
other: "Otro"
|
||||||
|
regenerateLoginToken: "Regenerar token de login"
|
||||||
|
regenerateLoginTokenDescription: "Regenerar el token usado internamente durante el login. No siempre es necesario hacerlo. Al hacerlo de nuevo, se deslogueará en todos los dispositivos."
|
||||||
|
setMultipleBySeparatingWithSpace: "Puedes añadir mas de uno, separado por espacios."
|
||||||
|
fileIdOrUrl: "Id del archivo o URL"
|
||||||
|
chatOpenBehavior: "Comportamiento al abrir el chat"
|
||||||
|
behavior: "Comportamiento"
|
||||||
|
sample: "Muestra"
|
||||||
|
abuseReports: "Reportes"
|
||||||
|
reportAbuse: "Reportar"
|
||||||
|
reportAbuseOf: "Reportar a {name}"
|
||||||
|
fillAbuseReportDescription: "Ingrese los detalles del reporte. Si hay una nota en particular, ingrese la URL de esta."
|
||||||
|
abuseReported: "Se ha enviado el reporte. Muchas gracias."
|
||||||
|
send: "Enviar"
|
||||||
|
abuseMarkAsResolved: "Marcar reporte como resuelto"
|
||||||
|
openInNewTab: "Abrir en una Nueva Pestaña"
|
||||||
|
openInSideView: "Abrir en una vista al costado"
|
||||||
|
defaultNavigationBehaviour: "Navegación por defecto"
|
||||||
|
editTheseSettingsMayBreakAccount: "Editar estas configuraciones puede dañar su cuenta."
|
||||||
|
instanceTicker: "Información de notas de la instancia"
|
||||||
|
waitingFor: "Esperando a {x}"
|
||||||
|
random: "Aleatorio"
|
||||||
|
system: "Sistema"
|
||||||
|
switchUi: "Cambiar interfaz de usuario"
|
||||||
|
desktop: "Escritorio"
|
||||||
|
clip: "Clip"
|
||||||
|
createNew: "Crear"
|
||||||
|
optional: "Opcional"
|
||||||
|
createNewClip: "Crear clip nuevo"
|
||||||
|
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"
|
||||||
|
_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."
|
||||||
|
mention: "Menciones"
|
||||||
|
mentionDescription: "El signo @ seguido de un nombre de usuario se puede utilizar para notificar a un usuario en particular."
|
||||||
|
hashtag: "Hashtag"
|
||||||
|
url: "URL"
|
||||||
|
link: "Vínculo"
|
||||||
|
bold: "Negrita"
|
||||||
|
center: "Centrar"
|
||||||
|
blockCode: "Código (bloque)"
|
||||||
|
blockCodeDescription: "Código de resaltado de sintaxis, como programas de varias líneas con bloques."
|
||||||
|
quote: "Citar"
|
||||||
|
emoji: "Emojis personalizados"
|
||||||
|
search: "Buscar"
|
||||||
|
flip: "Echar de un capirotazo"
|
||||||
|
flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda / derecha."
|
||||||
|
_reversi:
|
||||||
|
reversi: "Reversi"
|
||||||
|
gameSettings: "Configuración del juego"
|
||||||
|
chooseBoard: "Elegir tablero"
|
||||||
|
blackOrWhite: "Blancas/Negras"
|
||||||
|
blackIs: "{name} juega con fichas negras"
|
||||||
|
rules: "Reglas"
|
||||||
|
botSettings: "Opciones del bot"
|
||||||
|
thisGameIsStartedSoon: "El juego empezará en segundos"
|
||||||
|
waitingForOther: "Esperando el turno del adversario"
|
||||||
|
waitingForMe: "Esperando mi turno"
|
||||||
|
waitingBoth: "Prepárate"
|
||||||
|
ready: "Listo"
|
||||||
|
cancelReady: "No estoy listo"
|
||||||
|
opponentTurn: "Turno del adversario"
|
||||||
|
myTurn: "Mi turno"
|
||||||
|
turnOf: "Turno de {name}"
|
||||||
|
pastTurnOf: "Turno de {name}"
|
||||||
|
surrender: "Rendirse"
|
||||||
|
surrendered: "Por rendirse"
|
||||||
|
drawn: "Empate"
|
||||||
|
won: "{name} ha ganado"
|
||||||
|
black: "Negro"
|
||||||
|
white: "Blanco"
|
||||||
|
total: "Total"
|
||||||
|
turnCount: "Turno {count}"
|
||||||
|
myGames: "Mis juegos"
|
||||||
|
allGames: "Todos los juegos"
|
||||||
|
ended: "Finalizado"
|
||||||
|
playing: "Jugando"
|
||||||
|
isLlotheo: "El que tenga menos fichas gana (LLoTheO)"
|
||||||
|
loopedMap: "Mapa en bucle"
|
||||||
|
canPutEverywhere: "Puedes colocar donde quieras"
|
||||||
|
_instanceTicker:
|
||||||
|
none: "No mostrar"
|
||||||
|
remote: "Mostrar a usuarios remotos"
|
||||||
|
always: "Mostrar siempre"
|
||||||
_serverDisconnectedBehavior:
|
_serverDisconnectedBehavior:
|
||||||
reload: "Recargar automáticamente"
|
reload: "Recargar automáticamente"
|
||||||
dialog: "Mostrar diálogo de advertencia"
|
dialog: "Mostrar diálogo de advertencia"
|
||||||
@@ -783,6 +917,7 @@ _widgets:
|
|||||||
digitalClock: "Reloj digital"
|
digitalClock: "Reloj digital"
|
||||||
federation: "Federación"
|
federation: "Federación"
|
||||||
postForm: "Formulario"
|
postForm: "Formulario"
|
||||||
|
button: "Botón"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Ocultar"
|
hide: "Ocultar"
|
||||||
show: "Ver más"
|
show: "Ver más"
|
||||||
@@ -837,7 +972,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:
|
||||||
@@ -957,6 +1091,7 @@ _pages:
|
|||||||
my: "Mis páginas"
|
my: "Mis páginas"
|
||||||
liked: "Páginas que me gustan"
|
liked: "Páginas que me gustan"
|
||||||
inspector: "Inspector"
|
inspector: "Inspector"
|
||||||
|
contents: "Contenido"
|
||||||
content: "Bloque de página"
|
content: "Bloque de página"
|
||||||
variables: "Variables"
|
variables: "Variables"
|
||||||
title: "Título"
|
title: "Título"
|
||||||
|
|||||||
@@ -213,6 +213,7 @@ imageUrl: "URL de l’image"
|
|||||||
remove: "Supprimer"
|
remove: "Supprimer"
|
||||||
removed: "Supprimé"
|
removed: "Supprimé"
|
||||||
removeAreYouSure: "Supprimer «{x}» ?"
|
removeAreYouSure: "Supprimer «{x}» ?"
|
||||||
|
deleteAreYouSure: "Supprimer «{x}» ?"
|
||||||
saved: "Enregistré"
|
saved: "Enregistré"
|
||||||
messaging: "Discuter"
|
messaging: "Discuter"
|
||||||
upload: "Téléverser"
|
upload: "Téléverser"
|
||||||
@@ -312,6 +313,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"
|
||||||
@@ -352,13 +354,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"
|
||||||
@@ -372,8 +367,6 @@ unregister: "Se désinscrire"
|
|||||||
passwordLessLogin: "Connectez-vous sans mot de passe"
|
passwordLessLogin: "Connectez-vous sans mot de passe"
|
||||||
resetPassword: "Réinitialiser mot de passe"
|
resetPassword: "Réinitialiser mot de passe"
|
||||||
newPasswordIs: "Votre nouveau mot de passe est \"{password}\""
|
newPasswordIs: "Votre nouveau mot de passe est \"{password}\""
|
||||||
autoNoteWatch: "Surveiller les notes automatiquement"
|
|
||||||
autoNoteWatchDescription: "Soyez informé des notes auxquelles vous avez réagi ou répondu."
|
|
||||||
reduceUiAnimation: "Réduire les animations dans l’interface"
|
reduceUiAnimation: "Réduire les animations dans l’interface"
|
||||||
share: "Partager"
|
share: "Partager"
|
||||||
notFound: "Non trouvé"
|
notFound: "Non trouvé"
|
||||||
@@ -411,6 +404,7 @@ noMessagesYet: "Pas encore discuté"
|
|||||||
newMessageExists: "Vous avez un nouveau message"
|
newMessageExists: "Vous avez un nouveau message"
|
||||||
onlyOneFileCanBeAttached: "Vous ne pouvez joindre qu’un seul fichier au message"
|
onlyOneFileCanBeAttached: "Vous ne pouvez joindre qu’un seul fichier au message"
|
||||||
signinRequired: "Veuillez vous connecter"
|
signinRequired: "Veuillez vous connecter"
|
||||||
|
invitations: "Inviter"
|
||||||
invitationCode: "Code d’invitation"
|
invitationCode: "Code d’invitation"
|
||||||
checking: "Vérification"
|
checking: "Vérification"
|
||||||
available: "Disponible"
|
available: "Disponible"
|
||||||
@@ -538,6 +532,8 @@ pluginInstallWarn: "N’installez que des extensions provenant de sources de con
|
|||||||
deck: "Deck"
|
deck: "Deck"
|
||||||
undeck: "Quitter le deck"
|
undeck: "Quitter le deck"
|
||||||
useBlurEffectForModal: "Utiliser un effet de flou pour les modals"
|
useBlurEffectForModal: "Utiliser un effet de flou pour les modals"
|
||||||
|
width: "Largeur"
|
||||||
|
height: "Hauteur"
|
||||||
generateAccessToken: "Générer un jeton d'accès"
|
generateAccessToken: "Générer un jeton d'accès"
|
||||||
permission: "Autorisations "
|
permission: "Autorisations "
|
||||||
enableAll: "Tout activer"
|
enableAll: "Tout activer"
|
||||||
@@ -550,7 +546,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"
|
||||||
@@ -580,6 +575,18 @@ regenerateLoginToken: "Régénérer le jeton de connexion"
|
|||||||
setMultipleBySeparatingWithSpace: "Vous pouvez définir plus d’un, séparés par des espaces."
|
setMultipleBySeparatingWithSpace: "Vous pouvez définir plus d’un, séparés par des espaces."
|
||||||
fileIdOrUrl: "ID du fichier ou URL"
|
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"
|
||||||
|
public: "Public"
|
||||||
|
_mfm:
|
||||||
|
mention: "Mentionner"
|
||||||
|
hashtag: "Hashtags"
|
||||||
|
link: "Lien"
|
||||||
|
center: "Centrée"
|
||||||
|
quote: "Citer"
|
||||||
|
emoji: "Émojis personnalisés"
|
||||||
|
search: "Rechercher"
|
||||||
|
_reversi:
|
||||||
|
total: "Total"
|
||||||
_serverDisconnectedBehavior:
|
_serverDisconnectedBehavior:
|
||||||
reload: "Rechargement automatique"
|
reload: "Rechargement automatique"
|
||||||
_channel:
|
_channel:
|
||||||
@@ -755,6 +762,7 @@ _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"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Masquer"
|
hide: "Masquer"
|
||||||
show: "Afficher plus …"
|
show: "Afficher plus …"
|
||||||
@@ -809,7 +817,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:
|
||||||
@@ -929,6 +936,7 @@ _pages:
|
|||||||
my: "Mes pages"
|
my: "Mes pages"
|
||||||
liked: "Pages favorites"
|
liked: "Pages favorites"
|
||||||
inspector: "Inspecteur"
|
inspector: "Inspecteur"
|
||||||
|
contents: "Contenu"
|
||||||
content: "Bloc de page"
|
content: "Bloc de page"
|
||||||
variables: "Variables"
|
variables: "Variables"
|
||||||
title: "Titre"
|
title: "Titre"
|
||||||
|
|||||||
@@ -15,17 +15,24 @@ const merge = (...args) => args.reduce((a, c) => ({
|
|||||||
|
|
||||||
const languages = [
|
const languages = [
|
||||||
'ar-SA',
|
'ar-SA',
|
||||||
//'cs-CZ',
|
'cs-CZ',
|
||||||
//'da-DK',
|
'da-DK',
|
||||||
'de-DE',
|
'de-DE',
|
||||||
'en-US',
|
'en-US',
|
||||||
'es-ES',
|
'es-ES',
|
||||||
'fr-FR',
|
'fr-FR',
|
||||||
'ja-JP',
|
'ja-JP',
|
||||||
'ja-KS',
|
'ja-KS',
|
||||||
|
'kab-KAB',
|
||||||
|
'kn-IN',
|
||||||
'ko-KR',
|
'ko-KR',
|
||||||
//'nl-NL',
|
'nl-NL',
|
||||||
//'pl-PL',
|
'no-NO',
|
||||||
|
'pl-PL',
|
||||||
|
'pt-PT',
|
||||||
|
'ru-RU',
|
||||||
|
'ug-CN',
|
||||||
|
'uk-UA',
|
||||||
'zh-CN',
|
'zh-CN',
|
||||||
'zh-TW',
|
'zh-TW',
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -33,6 +33,9 @@ addUser: "ユーザーを追加"
|
|||||||
favorite: "お気に入り"
|
favorite: "お気に入り"
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
unfavorite: "お気に入り解除"
|
unfavorite: "お気に入り解除"
|
||||||
|
favorited: "お気に入りに登録しました。"
|
||||||
|
alreadyFavorited: "既にお気に入りに登録されています。"
|
||||||
|
cantFavorite: "お気に入りに登録できませんでした。"
|
||||||
pin: "ピン留め"
|
pin: "ピン留め"
|
||||||
unpin: "ピン留め解除"
|
unpin: "ピン留め解除"
|
||||||
copyContent: "内容をコピー"
|
copyContent: "内容をコピー"
|
||||||
@@ -87,6 +90,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 +101,7 @@ sensitive: "閲覧注意"
|
|||||||
add: "追加"
|
add: "追加"
|
||||||
reaction: "リアクション"
|
reaction: "リアクション"
|
||||||
reactionSettingDescription: "リアクションピッカーに表示するリアクションを設定します。"
|
reactionSettingDescription: "リアクションピッカーに表示するリアクションを設定します。"
|
||||||
|
reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押して追加します。"
|
||||||
rememberNoteVisibility: "公開範囲を記憶する"
|
rememberNoteVisibility: "公開範囲を記憶する"
|
||||||
attachCancel: "添付取り消し"
|
attachCancel: "添付取り消し"
|
||||||
markAsSensitive: "閲覧注意にする"
|
markAsSensitive: "閲覧注意にする"
|
||||||
@@ -124,7 +131,9 @@ settingGuide: "おすすめ設定"
|
|||||||
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
||||||
cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。"
|
cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。"
|
||||||
flagAsBot: "Botとして設定"
|
flagAsBot: "Botとして設定"
|
||||||
|
flagAsBotDescription: "このアカウントがプログラムによって運用される場合は、このフラグをオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったものになります。"
|
||||||
flagAsCat: "Catとして設定"
|
flagAsCat: "Catとして設定"
|
||||||
|
flagAsCatDescription: "このアカウントが猫であることを示す場合は、このフラグをオンにします。"
|
||||||
autoAcceptFollowed: "フォロー中ユーザーからのフォロリクを自動承認"
|
autoAcceptFollowed: "フォロー中ユーザーからのフォロリクを自動承認"
|
||||||
addAcount: "アカウント追加"
|
addAcount: "アカウント追加"
|
||||||
loginFailed: "ログインに失敗しました"
|
loginFailed: "ログインに失敗しました"
|
||||||
@@ -214,6 +223,8 @@ imageUrl: "画像URL"
|
|||||||
remove: "削除"
|
remove: "削除"
|
||||||
removed: "削除しました"
|
removed: "削除しました"
|
||||||
removeAreYouSure: "「{x}」を削除しますか?"
|
removeAreYouSure: "「{x}」を削除しますか?"
|
||||||
|
deleteAreYouSure: "「{x}」を削除しますか?"
|
||||||
|
resetAreYouSure: "リセットしますか?"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
messaging: "チャット"
|
messaging: "チャット"
|
||||||
upload: "アップロード"
|
upload: "アップロード"
|
||||||
@@ -313,6 +324,10 @@ bannerUrl: "バナー画像のURL"
|
|||||||
basicInfo: "基本情報"
|
basicInfo: "基本情報"
|
||||||
pinnedUsers: "ピン留めユーザー"
|
pinnedUsers: "ピン留めユーザー"
|
||||||
pinnedUsersDescription: "「みつける」ページなどにピン留めしたいユーザーを改行で区切って記述します。"
|
pinnedUsersDescription: "「みつける」ページなどにピン留めしたいユーザーを改行で区切って記述します。"
|
||||||
|
pinnedPages: "ピン留めページ"
|
||||||
|
pinnedPagesDescription: "インスタンスのトップページにピン留めしたいページのパスを改行で区切って記述します。"
|
||||||
|
pinnedClipId: "ピン留めするクリップのID"
|
||||||
|
pinnedNotes: "ピン留めされたノート"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "hCaptchaを有効にする"
|
enableHcaptcha: "hCaptchaを有効にする"
|
||||||
hcaptchaSiteKey: "サイトキー"
|
hcaptchaSiteKey: "サイトキー"
|
||||||
@@ -353,13 +368,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: "二段階認証"
|
||||||
@@ -373,8 +381,6 @@ unregister: "登録を解除"
|
|||||||
passwordLessLogin: "パスワード無しログイン"
|
passwordLessLogin: "パスワード無しログイン"
|
||||||
resetPassword: "パスワードをリセット"
|
resetPassword: "パスワードをリセット"
|
||||||
newPasswordIs: "新しいパスワードは「{password}」です"
|
newPasswordIs: "新しいパスワードは「{password}」です"
|
||||||
autoNoteWatch: "ノートの自動ウォッチ"
|
|
||||||
autoNoteWatchDescription: "あなたがリアクションしたり返信したりした他のユーザーのノートに関する通知を受け取るようにします。"
|
|
||||||
reduceUiAnimation: "UIのアニメーションを減らす"
|
reduceUiAnimation: "UIのアニメーションを減らす"
|
||||||
share: "共有"
|
share: "共有"
|
||||||
notFound: "見つかりません"
|
notFound: "見つかりません"
|
||||||
@@ -412,6 +418,7 @@ noMessagesYet: "まだチャットはありません"
|
|||||||
newMessageExists: "新しいメッセージがあります"
|
newMessageExists: "新しいメッセージがあります"
|
||||||
onlyOneFileCanBeAttached: "メッセージに添付できるファイルはひとつです"
|
onlyOneFileCanBeAttached: "メッセージに添付できるファイルはひとつです"
|
||||||
signinRequired: "ログインしてください"
|
signinRequired: "ログインしてください"
|
||||||
|
invitations: "招待"
|
||||||
invitationCode: "招待コード"
|
invitationCode: "招待コード"
|
||||||
checking: "確認しています"
|
checking: "確認しています"
|
||||||
available: "利用できます"
|
available: "利用できます"
|
||||||
@@ -435,6 +442,7 @@ useOsNativeEmojis: "OSネイティブの絵文字を使用"
|
|||||||
youHaveNoGroups: "グループがありません"
|
youHaveNoGroups: "グループがありません"
|
||||||
joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループを作成してください。"
|
joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループを作成してください。"
|
||||||
noHistory: "履歴はありません"
|
noHistory: "履歴はありません"
|
||||||
|
signinHistory: "ログイン履歴"
|
||||||
disableAnimatedMfm: "動きのあるMFMを無効にする"
|
disableAnimatedMfm: "動きのあるMFMを無効にする"
|
||||||
doing: "やっています"
|
doing: "やっています"
|
||||||
category: "カテゴリ"
|
category: "カテゴリ"
|
||||||
@@ -487,6 +495,7 @@ none: "なし"
|
|||||||
showInPage: "ページで表示"
|
showInPage: "ページで表示"
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
volume: "音量"
|
volume: "音量"
|
||||||
|
masterVolume: "マスター音量"
|
||||||
details: "詳細"
|
details: "詳細"
|
||||||
chooseEmoji: "絵文字を選択"
|
chooseEmoji: "絵文字を選択"
|
||||||
unableToProcess: "操作を完了できません"
|
unableToProcess: "操作を完了できません"
|
||||||
@@ -541,6 +550,12 @@ pluginInstallWarn: "信頼できないプラグインはインストールしな
|
|||||||
deck: "デッキ"
|
deck: "デッキ"
|
||||||
undeck: "デッキ解除"
|
undeck: "デッキ解除"
|
||||||
useBlurEffectForModal: "モーダルにぼかし効果を使用"
|
useBlurEffectForModal: "モーダルにぼかし効果を使用"
|
||||||
|
useFullReactionPicker: "フル機能リアクションピッカーを使用"
|
||||||
|
width: "幅"
|
||||||
|
height: "高さ"
|
||||||
|
large: "大"
|
||||||
|
medium: "中"
|
||||||
|
small: "小"
|
||||||
generateAccessToken: "アクセストークンの発行"
|
generateAccessToken: "アクセストークンの発行"
|
||||||
permission: "権限"
|
permission: "権限"
|
||||||
enableAll: "全て有効にする"
|
enableAll: "全て有効にする"
|
||||||
@@ -553,7 +568,8 @@ useStarForReactionFallback: "リアクション絵文字が不明な場合、代
|
|||||||
emailConfig: "メールサーバー設定"
|
emailConfig: "メールサーバー設定"
|
||||||
enableEmail: "メール配信機能を有効化する"
|
enableEmail: "メール配信機能を有効化する"
|
||||||
emailConfigInfo: "メールアドレスの確認やパスワードリセットの際に使います"
|
emailConfigInfo: "メールアドレスの確認やパスワードリセットの際に使います"
|
||||||
email: "メールアドレス"
|
email: "メール"
|
||||||
|
emailAddress: "メールアドレス"
|
||||||
smtpConfig: "SMTP サーバーの設定"
|
smtpConfig: "SMTP サーバーの設定"
|
||||||
smtpHost: "ホスト"
|
smtpHost: "ホスト"
|
||||||
smtpPort: "ポート"
|
smtpPort: "ポート"
|
||||||
@@ -585,6 +601,7 @@ regenerateLoginTokenDescription: "ログインに使用される内部トーク
|
|||||||
setMultipleBySeparatingWithSpace: "スペースで区切って複数設定できます。"
|
setMultipleBySeparatingWithSpace: "スペースで区切って複数設定できます。"
|
||||||
fileIdOrUrl: "ファイルIDまたはURL"
|
fileIdOrUrl: "ファイルIDまたはURL"
|
||||||
chatOpenBehavior: "チャットを開くときの動作"
|
chatOpenBehavior: "チャットを開くときの動作"
|
||||||
|
behavior: "動作"
|
||||||
sample: "サンプル"
|
sample: "サンプル"
|
||||||
abuseReports: "通報"
|
abuseReports: "通報"
|
||||||
reportAbuse: "通報"
|
reportAbuse: "通報"
|
||||||
@@ -597,6 +614,166 @@ openInNewTab: "新しいタブで開く"
|
|||||||
openInSideView: "サイドビューで開く"
|
openInSideView: "サイドビューで開く"
|
||||||
defaultNavigationBehaviour: "デフォルトのナビゲーション"
|
defaultNavigationBehaviour: "デフォルトのナビゲーション"
|
||||||
editTheseSettingsMayBreakAccount: "これらの設定を編集するとアカウントが破損する可能性があります。"
|
editTheseSettingsMayBreakAccount: "これらの設定を編集するとアカウントが破損する可能性があります。"
|
||||||
|
instanceTicker: "ノートのインスタンス情報"
|
||||||
|
waitingFor: "{x}を待っています"
|
||||||
|
random: "ランダム"
|
||||||
|
system: "システム"
|
||||||
|
switchUi: "UI切り替え"
|
||||||
|
desktop: "デスクトップ"
|
||||||
|
clip: "クリップ"
|
||||||
|
createNew: "新規作成"
|
||||||
|
optional: "任意"
|
||||||
|
createNewClip: "新しいクリップを作成"
|
||||||
|
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: "タイトルバーを表示する"
|
||||||
|
|
||||||
|
_aboutMisskey:
|
||||||
|
about: "Misskeyはsyuiloによって2014年から開発されている、オープンソースのソフトウェアです。"
|
||||||
|
contributors: "主なコントリビューター"
|
||||||
|
allContributors: "全てのコントリビューター"
|
||||||
|
source: "ソースコード"
|
||||||
|
translation: "Misskeyを翻訳"
|
||||||
|
donate: "Misskeyに寄付"
|
||||||
|
morePatrons: "他にも多くの方が支援してくれています。ありがとうございます🥰"
|
||||||
|
patrons: "支援者"
|
||||||
|
|
||||||
|
_nsfw:
|
||||||
|
respect: "閲覧注意のメディアは隠す"
|
||||||
|
ignore: "閲覧注意のメディアを隠さない"
|
||||||
|
force: "常にメディアを隠す"
|
||||||
|
|
||||||
|
_mfm:
|
||||||
|
cheatSheet: "MFMチートシート"
|
||||||
|
intro: "MFMは、Misskey内の様々な場所で使用できる専用のマークアップ言語です。ここでは、MFMで使用可能な構文一覧が確認できます。"
|
||||||
|
dummy: "MisskeyでFediverseの世界が広がります"
|
||||||
|
mention: "メンション"
|
||||||
|
mentionDescription: "アットマーク + ユーザー名で、特定のユーザーを示すことができます。"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
|
hashtagDescription: "ナンバーサイン + タグで、ハッシュタグを示すことができます。"
|
||||||
|
url: "URL"
|
||||||
|
urlDescription: "URLを示すことができます。"
|
||||||
|
link: "リンク"
|
||||||
|
linkDescription: "文章の特定の範囲を、URLに紐づけることができます。"
|
||||||
|
bold: "太字"
|
||||||
|
boldDescription: "文字を太く表示して強調することができます。"
|
||||||
|
small: "目立たなく"
|
||||||
|
smallDescription: "内容を小さく・薄く表示させることができます。"
|
||||||
|
center: "中央寄せ"
|
||||||
|
centerDescription: "内容を中央寄せで表示させることができます。"
|
||||||
|
inlineCode: "コード(インライン)"
|
||||||
|
inlineCodeDescription: "プログラムなどのコードをインラインでシンタックスハイライトします。"
|
||||||
|
blockCode: "コード(ブロック)"
|
||||||
|
blockCodeDescription: "複数行のプログラムなどのコードをブロックでシンタックスハイライトします。"
|
||||||
|
inlineMath: "数式(インライン)"
|
||||||
|
inlineMathDescription: "数式(KaTeX)をインラインで表示します。"
|
||||||
|
blockMath: "数式(ブロック)"
|
||||||
|
blockMathDescription: "複数行の数式(KaTeX)をブロックで表示します。"
|
||||||
|
quote: "引用"
|
||||||
|
quoteDescription: "内容が引用であることを示すことができます。"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
|
emojiDescription: "コロンでカスタム絵文字名を囲むと、カスタム絵文字を表示させることができます。"
|
||||||
|
search: "検索"
|
||||||
|
searchDescription: "入力済み検索ボックスを表示させることができます。"
|
||||||
|
flip: "反転"
|
||||||
|
flipDescription: "内容を上下または左右に反転させます。"
|
||||||
|
jelly: "アニメーション(びよんびよん)"
|
||||||
|
jellyDescription: "びよんびよんするアニメーションを与えます。"
|
||||||
|
tada: "アニメーション(じゃーん)"
|
||||||
|
tadaDescription: "ジャーン!という感じのアニメーションを与えます。"
|
||||||
|
jump: "アニメーション(ジャンプ)"
|
||||||
|
jumpDescription: "飛び跳ねるようなアニメーションを与えます。"
|
||||||
|
bounce: "アニメーション(バウンド)"
|
||||||
|
bounceDescription: "ぽよんぽよん弾むようなアニメーションを与えます。"
|
||||||
|
shake: "アニメーション(ぶるぶる)"
|
||||||
|
shakeDescription: "ぶるぶるするアニメーションを与えます。"
|
||||||
|
twitch: "アニメーション(ブレ)"
|
||||||
|
twitchDescription: "激しくブレるアニメーションを与えます。"
|
||||||
|
spin: "アニメーション(回転)"
|
||||||
|
spinDescription: "回転するアニメーションを与えます。"
|
||||||
|
|
||||||
|
_reversi:
|
||||||
|
reversi: "リバーシ"
|
||||||
|
gameSettings: "対局の設定"
|
||||||
|
chooseBoard: "ボードを選択"
|
||||||
|
blackOrWhite: "先行/後攻"
|
||||||
|
blackIs: "{name}が黒(先行)"
|
||||||
|
rules: "ルール"
|
||||||
|
botSettings: "Botのオプション"
|
||||||
|
thisGameIsStartedSoon: "対局は数秒後に開始されます"
|
||||||
|
waitingForOther: "相手の準備が完了するのを待っています"
|
||||||
|
waitingForMe: "あなたの準備が完了するのを待っています"
|
||||||
|
waitingBoth: "準備してください"
|
||||||
|
ready: "準備完了"
|
||||||
|
cancelReady: "準備を再開"
|
||||||
|
opponentTurn: "相手のターンです"
|
||||||
|
myTurn: "あなたのターンです"
|
||||||
|
turnOf: "{name}のターンです"
|
||||||
|
pastTurnOf: "{name}のターン"
|
||||||
|
surrender: "投了"
|
||||||
|
surrendered: "投了により"
|
||||||
|
drawn: "引き分け"
|
||||||
|
won: "{name}の勝ち"
|
||||||
|
black: "黒"
|
||||||
|
white: "白"
|
||||||
|
total: "合計"
|
||||||
|
turnCount: "{count}ターン目"
|
||||||
|
myGames: "自分の対局"
|
||||||
|
allGames: "みんなの対局"
|
||||||
|
ended: "終了"
|
||||||
|
playing: "対局中"
|
||||||
|
isLlotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
|
loopedMap: "ループマップ"
|
||||||
|
canPutEverywhere: "どこでも置けるモード"
|
||||||
|
|
||||||
|
_instanceTicker:
|
||||||
|
none: "表示しない"
|
||||||
|
remote: "リモートユーザーに表示"
|
||||||
|
always: "常に表示"
|
||||||
|
|
||||||
_serverDisconnectedBehavior:
|
_serverDisconnectedBehavior:
|
||||||
reload: "自動でリロード"
|
reload: "自動でリロード"
|
||||||
@@ -635,6 +812,8 @@ _theme:
|
|||||||
manage: "テーマの管理"
|
manage: "テーマの管理"
|
||||||
code: "テーマコード"
|
code: "テーマコード"
|
||||||
installed: "{name}をインストールしました"
|
installed: "{name}をインストールしました"
|
||||||
|
installedThemes: "インストールされたテーマ"
|
||||||
|
builtinThemes: "標準のテーマ"
|
||||||
alreadyInstalled: "そのテーマは既にインストールされています"
|
alreadyInstalled: "そのテーマは既にインストールされています"
|
||||||
invalid: "テーマの形式が間違っています"
|
invalid: "テーマの形式が間違っています"
|
||||||
make: "テーマを作る"
|
make: "テーマを作る"
|
||||||
@@ -710,6 +889,8 @@ _sfx:
|
|||||||
chatBg: "チャット(バックグラウンド)"
|
chatBg: "チャット(バックグラウンド)"
|
||||||
antenna: "アンテナ受信"
|
antenna: "アンテナ受信"
|
||||||
channel: "チャンネル通知"
|
channel: "チャンネル通知"
|
||||||
|
reversiPutBlack: "リバーシ: 黒が打ったとき"
|
||||||
|
reversiPutWhite: "リバーシ: 白が打ったとき"
|
||||||
|
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "謎"
|
unknown: "謎"
|
||||||
@@ -830,6 +1011,8 @@ _widgets:
|
|||||||
digitalClock: "デジタル時計"
|
digitalClock: "デジタル時計"
|
||||||
federation: "連合"
|
federation: "連合"
|
||||||
postForm: "投稿フォーム"
|
postForm: "投稿フォーム"
|
||||||
|
slideshow: "スライドショー"
|
||||||
|
button: "ボタン"
|
||||||
|
|
||||||
_cw:
|
_cw:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
@@ -889,9 +1072,13 @@ _profile:
|
|||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
description: "自己紹介"
|
description: "自己紹介"
|
||||||
youCanIncludeHashtags: "ハッシュタグを含めることができます。"
|
youCanIncludeHashtags: "ハッシュタグを含めることができます。"
|
||||||
metadata: "補足情報"
|
metadata: "追加情報"
|
||||||
|
metadataEdit: "追加情報を編集"
|
||||||
|
metadataDescription: "プロフィールに表として4つまでの追加情報を表示することができます。"
|
||||||
metadataLabel: "ラベル"
|
metadataLabel: "ラベル"
|
||||||
metadataContent: "内容"
|
metadataContent: "内容"
|
||||||
|
changeAvatar: "アバター画像を変更"
|
||||||
|
changeBanner: "バナー画像を変更"
|
||||||
|
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "全てのノート"
|
allNotes: "全てのノート"
|
||||||
@@ -1004,6 +1191,7 @@ _pages:
|
|||||||
created: "ページを作成しました"
|
created: "ページを作成しました"
|
||||||
updated: "ページを更新しました"
|
updated: "ページを更新しました"
|
||||||
deleted: "ページを削除しました"
|
deleted: "ページを削除しました"
|
||||||
|
pageSetting: "ページ設定"
|
||||||
nameAlreadyExists: "指定されたページURLは既に存在しています"
|
nameAlreadyExists: "指定されたページURLは既に存在しています"
|
||||||
invalidNameTitle: "不正なページURLです"
|
invalidNameTitle: "不正なページURLです"
|
||||||
invalidNameText: "空白でないか確認してください"
|
invalidNameText: "空白でないか確認してください"
|
||||||
@@ -1014,7 +1202,9 @@ _pages:
|
|||||||
unlike: "いいね解除"
|
unlike: "いいね解除"
|
||||||
my: "自分のページ"
|
my: "自分のページ"
|
||||||
liked: "いいねしたページ"
|
liked: "いいねしたページ"
|
||||||
|
featured: "人気"
|
||||||
inspector: "インスペクター"
|
inspector: "インスペクター"
|
||||||
|
contents: "コンテンツ"
|
||||||
content: "ページブロック"
|
content: "ページブロック"
|
||||||
variables: "変数"
|
variables: "変数"
|
||||||
title: "タイトル"
|
title: "タイトル"
|
||||||
@@ -1075,6 +1265,12 @@ _pages:
|
|||||||
width: "幅"
|
width: "幅"
|
||||||
height: "高さ"
|
height: "高さ"
|
||||||
|
|
||||||
|
note: "ノート埋め込み"
|
||||||
|
_note:
|
||||||
|
id: "ノートID"
|
||||||
|
idDescription: "ノートURLをペーストして設定することもできます。"
|
||||||
|
detailed: "詳細な表示"
|
||||||
|
|
||||||
switch: "スイッチ"
|
switch: "スイッチ"
|
||||||
_switch:
|
_switch:
|
||||||
name: "変数名"
|
name: "変数名"
|
||||||
@@ -1326,6 +1522,8 @@ _notification:
|
|||||||
_deck:
|
_deck:
|
||||||
alwaysShowMainColumn: "常にメインカラムを表示"
|
alwaysShowMainColumn: "常にメインカラムを表示"
|
||||||
columnAlign: "カラムの寄せ"
|
columnAlign: "カラムの寄せ"
|
||||||
|
columnMargin: "カラム間のマージン"
|
||||||
|
columnHeaderHeight: "カラムのヘッダー幅"
|
||||||
addColumn: "カラムを追加"
|
addColumn: "カラムを追加"
|
||||||
swapLeft: "左に移動"
|
swapLeft: "左に移動"
|
||||||
swapRight: "右に移動"
|
swapRight: "右に移動"
|
||||||
@@ -1335,6 +1533,7 @@ _deck:
|
|||||||
popRight: "右に出す"
|
popRight: "右に出す"
|
||||||
|
|
||||||
_columns:
|
_columns:
|
||||||
|
main: "メイン"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
tl: "タイムライン"
|
tl: "タイムライン"
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
---
|
---
|
||||||
_lang_: "日本語 (関西弁)"
|
_lang_: "日本語 (関西弁)"
|
||||||
introMisskey: "ようこそ!Misskeyは、オープンソースの分散型マイクロブログサービスやねん。\n「ノート」を作成しぃ、いま起こっとることを共有したり、あんたについて皆に発信しよう📡\n「リアクション」機能で、皆のノートに素はよ反応を追加することもできます✌\n新しい世界を探検しよう🚀"
|
introMisskey: "ようこそ!Misskeyってのは、オープンソースの分散型マイクロブログサービスやねん。\n「ノート」を作成し、いま起こっとることを共有したり、あんたんこととか皆に伝えていこう📡\n「リアクション」機能で、皆のノートに素はよ反応を追加することもできるんやで✌\n新しい世界を探検してみらん?🚀"
|
||||||
monthAndDay: "{month}月 {day}日"
|
monthAndDay: "{month}月 {day}日"
|
||||||
search: "探す"
|
search: "探す"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
fetchingAsApObject: "連合に照会中"
|
fetchingAsApObject: "今ちと連合に照会しとるで"
|
||||||
ok: "おっけー"
|
ok: "おっけー"
|
||||||
gotIt: "ほい"
|
gotIt: "ほい"
|
||||||
cancel: "やめとくわ"
|
cancel: "やめとくわ"
|
||||||
@@ -16,35 +16,43 @@ noNotes: "ノートはあらへん"
|
|||||||
noNotifications: "通知はあらへん"
|
noNotifications: "通知はあらへん"
|
||||||
instance: "インスタンス"
|
instance: "インスタンス"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
|
basicSettings: "基本設定"
|
||||||
|
otherSettings: "その他の設定"
|
||||||
|
openInWindow: "ウィンドウで開いてや"
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
noAccountDescription: "自己紹介はあらへん"
|
noAccountDescription: "自己紹介はあらへん"
|
||||||
login: "ログイン"
|
login: "ログイン"
|
||||||
loggingIn: "ログインしとります"
|
loggingIn: "ログインしよるで"
|
||||||
logout: "ログアウト"
|
logout: "ログアウト"
|
||||||
signup: "新規登録"
|
signup: "新規登録"
|
||||||
uploading: "アップロードしとります"
|
uploading: "アップロードしよるで"
|
||||||
save: "保存"
|
save: "とっとく"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
addUser: "ユーザー増やす"
|
addUser: "ユーザーを追加や"
|
||||||
favorite: "お気に入り"
|
favorite: "お気に入り"
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
unfavorite: "お気に入りやめる"
|
unfavorite: "やっぱ気に入らん"
|
||||||
pin: "ピン留め"
|
favorited: "お気に入りに登録したで"
|
||||||
unpin: "ピン留めやめる"
|
alreadyFavorited: "もうお気に入りに入れとるがな。"
|
||||||
|
cantFavorite: "アカン、お気に入り登録できへんかったで。"
|
||||||
|
pin: "ピン留めしとく"
|
||||||
|
unpin: "やっぱピン留めせん"
|
||||||
copyContent: "内容をコピー"
|
copyContent: "内容をコピー"
|
||||||
copyLink: "リンクをコピー"
|
copyLink: "リンクをコピー"
|
||||||
delete: "ほかす"
|
delete: "ほかす"
|
||||||
deleteAndEdit: "ほかして直す"
|
deleteAndEdit: "ほかして直す"
|
||||||
deleteAndEditConfirm: "このノートをほかしてもっかい直す?このノートへのリアクション、Remote、返信も全部消えんで"
|
deleteAndEditConfirm: "このノートをほかしてもっかい直す?このノートへのリアクション、Renote、返信も全部消えるんやけどそれでもええん?"
|
||||||
addToList: "リストに入れたる"
|
addToList: "リストに入れたる"
|
||||||
sendMessage: "メッセージを送る"
|
sendMessage: "メッセージを送る"
|
||||||
copyUsername: "ユーザー名をコピー"
|
copyUsername: "ユーザー名をコピー"
|
||||||
|
searchUser: "ユーザーを検索"
|
||||||
reply: "返す"
|
reply: "返す"
|
||||||
loadMore: "もっとあるやろ!"
|
loadMore: "もっとあるやろ!"
|
||||||
youGotNewFollower: "フォローされたで"
|
youGotNewFollower: "フォローされたで"
|
||||||
receiveFollowRequest: "フォローリクエストされたで"
|
receiveFollowRequest: "フォローリクエストされたで"
|
||||||
followRequestAccepted: "フォローが承認されたで"
|
followRequestAccepted: "フォローが承認されたで"
|
||||||
|
mention: "メンション"
|
||||||
mentions: "あんた宛て"
|
mentions: "あんた宛て"
|
||||||
directNotes: "ダイレクト投稿"
|
directNotes: "ダイレクト投稿"
|
||||||
importAndExport: "インポートとエクスポート"
|
importAndExport: "インポートとエクスポート"
|
||||||
@@ -57,7 +65,7 @@ unfollowConfirm: "{name}のフォローを解除してもええんか?"
|
|||||||
exportRequested: "エクスポートしてな、ってリクエストしたけど、これ多分めっちゃ時間かかるで。エクスポート終わったら「ドライブ」に突っ込んどくで。"
|
exportRequested: "エクスポートしてな、ってリクエストしたけど、これ多分めっちゃ時間かかるで。エクスポート終わったら「ドライブ」に突っ込んどくで。"
|
||||||
importRequested: "インポートしてな、ってリクエストしたけど、これ多分めっちゃ時間かかるで。"
|
importRequested: "インポートしてな、ってリクエストしたけど、これ多分めっちゃ時間かかるで。"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
noLists: "リストはあらへん"
|
noLists: "リストなんてあらへんで"
|
||||||
note: "ノート"
|
note: "ノート"
|
||||||
notes: "ノート"
|
notes: "ノート"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -65,31 +73,39 @@ followers: "フォロワー"
|
|||||||
followsYou: "フォローされとるで"
|
followsYou: "フォローされとるで"
|
||||||
createList: "リスト作る"
|
createList: "リスト作る"
|
||||||
manageLists: "リストの管理"
|
manageLists: "リストの管理"
|
||||||
retry: "もっぺんやってみる"
|
error: "エラー"
|
||||||
|
somethingHappened: "なんかアカンことが起こったで"
|
||||||
|
retry: "もっぺんやる?"
|
||||||
|
pageLoadError: "ページの読み込みに失敗してしもうたで…"
|
||||||
|
pageLoadErrorDescription: "これは普通、ネットワークかブラウザキャッシュが原因やからね。キャッシュをクリアするか、もうちっとだけ待ってくれへんか?"
|
||||||
enterListName: "リスト名を入れてや"
|
enterListName: "リスト名を入れてや"
|
||||||
privacy: "プライバシーってなんや?オカンの年齢か?"
|
privacy: "プライバシーってなんぞや?"
|
||||||
makeFollowManuallyApprove: "他人のフォローは許可してからや!"
|
makeFollowManuallyApprove: "他人からのフォローは自分が決める"
|
||||||
defaultNoteVisibility: "もとからの公開範囲"
|
defaultNoteVisibility: "もとからの公開範囲"
|
||||||
follow: "フォロー"
|
follow: "フォロー"
|
||||||
followRequest: "フォロー許してくれや!言うてみる"
|
followRequest: "フォローを頼む"
|
||||||
followRequests: "フォロー許してくれや!"
|
followRequests: "フォローを頼む"
|
||||||
unfollow: "フォローやめる"
|
unfollow: "フォローやめる"
|
||||||
followRequestPending: "フォロー許してくれるん待っとる"
|
followRequestPending: "フォロー許してくれるん待っとる"
|
||||||
enterEmoji: "絵文字を入れてや"
|
enterEmoji: "絵文字を入れてや"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
unrenote: "Renoteやめる"
|
unrenote: "Renoteやめる"
|
||||||
|
renoted: "Renoteしたで。"
|
||||||
|
cantRenote: "この投稿はRenoteできへんらしい。"
|
||||||
|
cantReRenote: "すまん、今このRenoteにRenoteはできへんのや。"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
pinnedNote: "ピン留めされたノート"
|
pinnedNote: "ピン留めされとるノート"
|
||||||
you: "あんた"
|
you: "あんた"
|
||||||
clickToShow: "押してみ、見せたるわ"
|
clickToShow: "押したら見えるようになるで"
|
||||||
sensitive: "見たらあかんで"
|
sensitive: "ちょっとアカンやつやで"
|
||||||
add: "増やす"
|
add: "増やす"
|
||||||
reaction: "リアクション"
|
reaction: "リアクション"
|
||||||
reactionSettingDescription: "リアクションピッカーに出しとくリアクションを選んでや。"
|
reactionSettingDescription: "リアクションピッカーに出しとくリアクションを選んでや。"
|
||||||
|
reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押すと追加できるで。"
|
||||||
rememberNoteVisibility: "公開範囲覚えといて"
|
rememberNoteVisibility: "公開範囲覚えといて"
|
||||||
attachCancel: "くっつけるのやめよか"
|
attachCancel: "やっぱ添付やめてくれん?"
|
||||||
markAsSensitive: "ちょっと見せられへんわ"
|
markAsSensitive: "ちょっとこれはアカン"
|
||||||
unmarkAsSensitive: "別にええんじゃね?"
|
unmarkAsSensitive: "そこまでアカンことないやろ"
|
||||||
enterFileName: "ファイル名を入れてや"
|
enterFileName: "ファイル名を入れてや"
|
||||||
mute: "ミュート"
|
mute: "ミュート"
|
||||||
unmute: "ミュートやめたる"
|
unmute: "ミュートやめたる"
|
||||||
@@ -97,30 +113,37 @@ block: "ブロック"
|
|||||||
unblock: "ブロックやめたる"
|
unblock: "ブロックやめたる"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
unsuspend: "溶かす"
|
unsuspend: "溶かす"
|
||||||
blockConfirm: "ブロックしてしもうてええか?"
|
blockConfirm: "ブロックしてもええんか?"
|
||||||
unblockConfirm: "ブロックすんのやめるけどええか?"
|
unblockConfirm: "ブロックやめたるってほんまか?"
|
||||||
suspendConfirm: "凍結してしもうてええか?"
|
suspendConfirm: "凍結してしもうてええか?"
|
||||||
unsuspendConfirm: "解凍するけどええか?"
|
unsuspendConfirm: "解凍するけどええか?"
|
||||||
selectList: "リストを選ぶ"
|
selectList: "リストを選ぶ"
|
||||||
|
selectAntenna: "アンテナを選ぶ"
|
||||||
|
selectWidget: "ウィジェットを選ぶ"
|
||||||
|
editWidgets: "ウィジェットをいじる"
|
||||||
|
editWidgetsExit: "編集終ったで"
|
||||||
customEmojis: "カスタム絵文字"
|
customEmojis: "カスタム絵文字"
|
||||||
|
emoji: "絵文字"
|
||||||
emojiName: "絵文字名"
|
emojiName: "絵文字名"
|
||||||
emojiUrl: "絵文字画像URL"
|
emojiUrl: "絵文字画像URL"
|
||||||
addEmoji: "絵文字を追加"
|
addEmoji: "絵文字を追加"
|
||||||
settingGuide: "ええ感じの設定"
|
settingGuide: "ええ感じの設定"
|
||||||
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
||||||
cacheRemoteFilesDescription: "この設定をチャラにすると、リモートファイルをキャッシュせず直リンクするようになります。サーバーのストレージを節約できますが、サムネイルが生成されへんので通信量が増加します。"
|
cacheRemoteFilesDescription: "この設定を切っとくと、リモートファイルをキャッシュせず直リンクするようになってしまうんやで? サーバーのストレージは節約できるんやけど、かわりにサムネイルが作られんくなるから通信量が増えるで?"
|
||||||
flagAsBot: "Botやでと言っとく"
|
flagAsBot: "Botやで"
|
||||||
flagAsCat: "Catやでと言っとく"
|
flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったもんになるんやで。"
|
||||||
autoAcceptFollowed: "フォローしとるユーザーからのフォロリクは全部勝手にええでって言うで"
|
flagAsCat: "Catやで"
|
||||||
|
flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?"
|
||||||
|
autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストには勝手に許可しとくで。"
|
||||||
addAcount: "アカウント追加"
|
addAcount: "アカウント追加"
|
||||||
loginFailed: "ログインに失敗してん"
|
loginFailed: "ログインに失敗してしもうた…"
|
||||||
showOnRemote: "リモートで見る"
|
showOnRemote: "リモートで見る"
|
||||||
general: "全般"
|
general: "全般"
|
||||||
wallpaper: "壁紙"
|
wallpaper: "壁紙"
|
||||||
setWallpaper: "壁紙を設定"
|
setWallpaper: "壁紙を設定"
|
||||||
removeWallpaper: "壁紙ほかす"
|
removeWallpaper: "壁紙を削除"
|
||||||
searchWith: "検索: {q}"
|
searchWith: "検索: {q}"
|
||||||
youHaveNoLists: "リストはあらへん"
|
youHaveNoLists: "リストがあらへんで?"
|
||||||
followConfirm: "{name}をフォローしてええか?"
|
followConfirm: "{name}をフォローしてええか?"
|
||||||
proxyAccount: "プロキシアカウント"
|
proxyAccount: "プロキシアカウント"
|
||||||
proxyAccountDescription: "プロキシアカウントは、代わりにフォローしてくれるアカウントや。例えば、551に豚まんが無いときやったり、ユーザーがリモートユーザーをアカウントに入れたとき、リストに入れられたユーザーが誰からもフォローされてないと寂しいやん。寂しいし、アクティビティも配達されへんから、プロキシアカウントがフォローしてくれるで。ええやつやん…"
|
proxyAccountDescription: "プロキシアカウントは、代わりにフォローしてくれるアカウントや。例えば、551に豚まんが無いときやったり、ユーザーがリモートユーザーをアカウントに入れたとき、リストに入れられたユーザーが誰からもフォローされてないと寂しいやん。寂しいし、アクティビティも配達されへんから、プロキシアカウントがフォローしてくれるで。ええやつやん…"
|
||||||
@@ -130,7 +153,7 @@ recipient: "宛先"
|
|||||||
annotation: "注釈"
|
annotation: "注釈"
|
||||||
federation: "連合"
|
federation: "連合"
|
||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
registeredAt: "一見さんになった日"
|
registeredAt: "初観測"
|
||||||
latestRequestSentAt: "ちょっと前のリクエスト送信"
|
latestRequestSentAt: "ちょっと前のリクエスト送信"
|
||||||
latestRequestReceivedAt: "ちょっと前のリクエスト受信"
|
latestRequestReceivedAt: "ちょっと前のリクエスト受信"
|
||||||
latestStatus: "ちょっと前のステータス"
|
latestStatus: "ちょっと前のステータス"
|
||||||
@@ -200,6 +223,8 @@ imageUrl: "画像URL"
|
|||||||
remove: "ほかす"
|
remove: "ほかす"
|
||||||
removed: "削除したで!"
|
removed: "削除したで!"
|
||||||
removeAreYouSure: "「{x}」はなおしてしもてええか?"
|
removeAreYouSure: "「{x}」はなおしてしもてええか?"
|
||||||
|
deleteAreYouSure: "「{x}」はなおしてしもてええか?"
|
||||||
|
resetAreYouSure: "リセットしてええん?"
|
||||||
saved: "保存したで!"
|
saved: "保存したで!"
|
||||||
messaging: "チャット"
|
messaging: "チャット"
|
||||||
upload: "アップロード"
|
upload: "アップロード"
|
||||||
@@ -257,7 +282,8 @@ copyUrl: "URLをコピー"
|
|||||||
rename: "名前を変えるで"
|
rename: "名前を変えるで"
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
nsfw: "見たらあかんで"
|
nsfw: "ちょっとアカンやつやで"
|
||||||
|
whenServerDisconnected: "サーバーとの接続が失くなってしもうたとき"
|
||||||
disconnectedFromServer: "サーバーが機嫌悪いねん"
|
disconnectedFromServer: "サーバーが機嫌悪いねん"
|
||||||
reload: "リロード"
|
reload: "リロード"
|
||||||
doNothing: "何もせんとく"
|
doNothing: "何もせんとく"
|
||||||
@@ -293,7 +319,21 @@ proxyRemoteFilesDescription: "この設定を入れると、保存しとらん
|
|||||||
driveCapacityPerLocalAccount: "ローカルユーザーひとりあたりのドライブ容量"
|
driveCapacityPerLocalAccount: "ローカルユーザーひとりあたりのドライブ容量"
|
||||||
driveCapacityPerRemoteAccount: "リモートユーザーひとりあたりのドライブ容量"
|
driveCapacityPerRemoteAccount: "リモートユーザーひとりあたりのドライブ容量"
|
||||||
inMb: "メガバイト単位"
|
inMb: "メガバイト単位"
|
||||||
|
iconUrl: "アイコン画像のURL"
|
||||||
|
bannerUrl: "バナー画像のURL"
|
||||||
|
basicInfo: "基本情報"
|
||||||
|
pinnedUsers: "ピン留めしたユーザー"
|
||||||
|
pinnedUsersDescription: "「みつける」ページとかにピン留めしたいユーザーをここに書けばええんやで。他ん人との名前は改行で区切ればええんやで。"
|
||||||
|
pinnedPages: "ピン留めページ"
|
||||||
|
pinnedNotes: "ピン留めされとるノート"
|
||||||
|
hcaptcha: "hCaptcha(キャプチャ)"
|
||||||
|
enableHcaptcha: "hCaptcha(キャプチャ)をつけとく"
|
||||||
|
hcaptchaSiteKey: "サイトキー"
|
||||||
|
hcaptchaSecretKey: "シークレットキー"
|
||||||
recaptcha: "reCAPTCHA"
|
recaptcha: "reCAPTCHA"
|
||||||
|
enableRecaptcha: "reCAPTCHA(リキャプチャ)を有効にする"
|
||||||
|
recaptchaSiteKey: "サイトキー"
|
||||||
|
recaptchaSecretKey: "シークレットキー"
|
||||||
avoidMultiCaptchaConfirm: "ぎょうさんのCaptchaをつこてしまうと、仲良うせんことがあるんや。他のCaptchaをなおしとこか?別にキャンセルしてもろうたらCaptchaは消されへんで済むけど知らんで。"
|
avoidMultiCaptchaConfirm: "ぎょうさんのCaptchaをつこてしまうと、仲良うせんことがあるんや。他のCaptchaをなおしとこか?別にキャンセルしてもろうたらCaptchaは消されへんで済むけど知らんで。"
|
||||||
antennas: "アンテナ"
|
antennas: "アンテナ"
|
||||||
manageAntennas: "アンテナいじる"
|
manageAntennas: "アンテナいじる"
|
||||||
@@ -326,13 +366,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: "二段階認証"
|
||||||
@@ -346,17 +379,91 @@ unregister: "登録やめる"
|
|||||||
passwordLessLogin: "パスワード無くてもログインできるようにする"
|
passwordLessLogin: "パスワード無くてもログインできるようにする"
|
||||||
resetPassword: "パスワードをリセット"
|
resetPassword: "パスワードをリセット"
|
||||||
newPasswordIs: "今度のパスワードは「{password}」や"
|
newPasswordIs: "今度のパスワードは「{password}」や"
|
||||||
|
reduceUiAnimation: "UIの動きやアニメーションを減らしてくれや。"
|
||||||
|
share: "わけわけ"
|
||||||
|
notFound: "見つからへんね"
|
||||||
notFoundDescription: "指定されたURLに該当するページはあらへんやった。"
|
notFoundDescription: "指定されたURLに該当するページはあらへんやった。"
|
||||||
|
uploadFolder: "とりあえずここへアップロード"
|
||||||
|
cacheClear: "キャッシュをほかす"
|
||||||
|
markAsReadAllNotifications: "通知はもう全て読んだわっ"
|
||||||
|
markAsReadAllUnreadNotes: "投稿は全て読んだわっ"
|
||||||
|
markAsReadAllTalkMessages: "チャットはもうぜんぶ読んだわっ"
|
||||||
|
help: "ヘルプ"
|
||||||
|
inputMessageHere: "ここにメッセージ書いてや"
|
||||||
close: "さいなら"
|
close: "さいなら"
|
||||||
|
group: "グループ"
|
||||||
|
groups: "グループ"
|
||||||
|
createGroup: "グループを作るで"
|
||||||
|
ownedGroups: "所有しとるグループ"
|
||||||
joinedGroups: "参加しとるグループ"
|
joinedGroups: "参加しとるグループ"
|
||||||
invites: "来てや"
|
invites: "来てや"
|
||||||
|
groupName: "グループ名"
|
||||||
|
members: "メンバー"
|
||||||
|
transfer: "譲渡"
|
||||||
|
messagingWithUser: "ユーザーとチャット"
|
||||||
|
messagingWithGroup: "グループでチャット"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "テキスト"
|
||||||
|
enable: "有効にするで"
|
||||||
|
next: "次"
|
||||||
|
retype: "もっかい入力"
|
||||||
|
noteOf: "{user}のノート"
|
||||||
|
inviteToGroup: "グループに招く"
|
||||||
|
maxNoteTextLength: "ノートの文字数制限"
|
||||||
|
quoteAttached: "引用付いとるで"
|
||||||
|
quoteQuestion: "引用として添付してもええか?"
|
||||||
|
noMessagesYet: "まだチャットはあらへんで"
|
||||||
|
newMessageExists: "新しいメッセージがきたで"
|
||||||
|
onlyOneFileCanBeAttached: "すまん、メッセージに添付できるファイルはひとつだけなんや。"
|
||||||
|
signinRequired: "ログインしてくれへん?"
|
||||||
|
invitations: "来てや"
|
||||||
|
invitationCode: "招待コード"
|
||||||
|
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: "パスワード"
|
||||||
|
_mfm:
|
||||||
|
mention: "メンション"
|
||||||
|
quote: "引用"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
|
search: "探す"
|
||||||
_sidebar:
|
_sidebar:
|
||||||
icon: "アイコン"
|
icon: "アイコン"
|
||||||
_theme:
|
_theme:
|
||||||
keys:
|
keys:
|
||||||
|
mention: "メンション"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "ノート"
|
note: "ノート"
|
||||||
@@ -438,8 +545,10 @@ _pages:
|
|||||||
array: "リスト"
|
array: "リスト"
|
||||||
_notification:
|
_notification:
|
||||||
youWereFollowed: "フォローされたで"
|
youWereFollowed: "フォローされたで"
|
||||||
|
youWereInvitedToGroup: "グループに招待されとるで"
|
||||||
_types:
|
_types:
|
||||||
follow: "フォロー"
|
follow: "フォロー"
|
||||||
|
mention: "メンション"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
reaction: "リアクション"
|
reaction: "リアクション"
|
||||||
|
|||||||
@@ -35,6 +35,9 @@ userList: "Tibdarin"
|
|||||||
uiLanguage: "Tutlayt n wegrudem"
|
uiLanguage: "Tutlayt n wegrudem"
|
||||||
smtpUser: "Isem n umseqdac"
|
smtpUser: "Isem n umseqdac"
|
||||||
smtpPass: "Awal uffir"
|
smtpPass: "Awal uffir"
|
||||||
|
_mfm:
|
||||||
|
mention: "Bder"
|
||||||
|
search: "Nadi"
|
||||||
_theme:
|
_theme:
|
||||||
keys:
|
keys:
|
||||||
mention: "Bder"
|
mention: "Bder"
|
||||||
@@ -54,6 +57,7 @@ _exportOrImport:
|
|||||||
blockingList: "Seḥbes"
|
blockingList: "Seḥbes"
|
||||||
userLists: "Tibdarin"
|
userLists: "Tibdarin"
|
||||||
_pages:
|
_pages:
|
||||||
|
contents: "Agbur"
|
||||||
font: "Tasefsit"
|
font: "Tasefsit"
|
||||||
fontSerif: "Serif"
|
fontSerif: "Serif"
|
||||||
fontSansSerif: "Sans Serif"
|
fontSansSerif: "Sans Serif"
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ instances: "ನಿದರ್ಶನ"
|
|||||||
remove: "ಅಳಿಸು"
|
remove: "ಅಳಿಸು"
|
||||||
smtpUser: "ಬಳಕೆಹೆಸರು"
|
smtpUser: "ಬಳಕೆಹೆಸರು"
|
||||||
smtpPass: "ಗುಪ್ತಪದ"
|
smtpPass: "ಗುಪ್ತಪದ"
|
||||||
|
_mfm:
|
||||||
|
search: "ಹುಡುಕು"
|
||||||
_sfx:
|
_sfx:
|
||||||
notification: "ಅಧಿಸೂಚನೆಗಳು"
|
notification: "ಅಧಿಸೂಚನೆಗಳು"
|
||||||
_widgets:
|
_widgets:
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ noNotes: "노트가 없습니다"
|
|||||||
noNotifications: "표시할 알림이 없습니다"
|
noNotifications: "표시할 알림이 없습니다"
|
||||||
instance: "인스턴스"
|
instance: "인스턴스"
|
||||||
settings: "설정"
|
settings: "설정"
|
||||||
|
basicSettings: "기본 설정"
|
||||||
|
otherSettings: "기타 설정"
|
||||||
|
openInWindow: "창으로 열기"
|
||||||
profile: "프로필"
|
profile: "프로필"
|
||||||
timeline: "타임라인"
|
timeline: "타임라인"
|
||||||
noAccountDescription: "자기소개가 없습니다"
|
noAccountDescription: "자기소개가 없습니다"
|
||||||
@@ -40,6 +43,7 @@ deleteAndEditConfirm: "이 노트를 삭제한 뒤 다시 편집하시겠습니
|
|||||||
addToList: "리스트에 추가"
|
addToList: "리스트에 추가"
|
||||||
sendMessage: "메시지 보내기"
|
sendMessage: "메시지 보내기"
|
||||||
copyUsername: "유저명 복사"
|
copyUsername: "유저명 복사"
|
||||||
|
searchUser: "사용자 검색"
|
||||||
reply: "답글"
|
reply: "답글"
|
||||||
loadMore: "더 보기"
|
loadMore: "더 보기"
|
||||||
youGotNewFollower: "새로운 팔로워가 있습니다"
|
youGotNewFollower: "새로운 팔로워가 있습니다"
|
||||||
@@ -66,7 +70,11 @@ followers: "팔로워"
|
|||||||
followsYou: "당신을 팔로우합니다"
|
followsYou: "당신을 팔로우합니다"
|
||||||
createList: "리스트 만들기"
|
createList: "리스트 만들기"
|
||||||
manageLists: "리스트 관리"
|
manageLists: "리스트 관리"
|
||||||
|
error: "오류"
|
||||||
|
somethingHappened: "오류가 발생했습니다"
|
||||||
retry: "다시 시도"
|
retry: "다시 시도"
|
||||||
|
pageLoadError: "페이지를 불러오지 못했습니다."
|
||||||
|
pageLoadErrorDescription: "네트워크 연결 또는 브라우저 캐시로 인해 발생했을 가능성이 높습니다. 캐시를 삭제하거나, 잠시 후 다시 시도해 주세요."
|
||||||
enterListName: "리스트 이름을 입력"
|
enterListName: "리스트 이름을 입력"
|
||||||
privacy: "프라이버시"
|
privacy: "프라이버시"
|
||||||
makeFollowManuallyApprove: "팔로우를 수동으로 승인"
|
makeFollowManuallyApprove: "팔로우를 수동으로 승인"
|
||||||
@@ -105,6 +113,8 @@ unsuspendConfirm: "이 계정의 정지를 해제하시겠습니까?"
|
|||||||
selectList: "리스트 선택"
|
selectList: "리스트 선택"
|
||||||
selectAntenna: "안테나 선택"
|
selectAntenna: "안테나 선택"
|
||||||
selectWidget: "위젯 선택"
|
selectWidget: "위젯 선택"
|
||||||
|
editWidgets: "위젯 편집"
|
||||||
|
editWidgetsExit: "편집 종료"
|
||||||
customEmojis: "커스텀 이모지"
|
customEmojis: "커스텀 이모지"
|
||||||
emoji: "이모지"
|
emoji: "이모지"
|
||||||
emojiName: "이모지 이름"
|
emojiName: "이모지 이름"
|
||||||
@@ -114,7 +124,9 @@ settingGuide: "추천 설정"
|
|||||||
cacheRemoteFiles: "리모트 파일을 캐시"
|
cacheRemoteFiles: "리모트 파일을 캐시"
|
||||||
cacheRemoteFilesDescription: "이 설정을 해지하면 리모트 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다."
|
cacheRemoteFilesDescription: "이 설정을 해지하면 리모트 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다."
|
||||||
flagAsBot: "나는 봇입니다"
|
flagAsBot: "나는 봇입니다"
|
||||||
|
flagAsBotDescription: "이 계정을 자동화된 수단으로 운용할 경우에 활성화해 주세요. 이 플래그를 활성화하면, 다른 봇이 이를 참고하여 봇 끼리의 무한 연쇄 반응을 회피하거나, 이 계정의 시스템 상에서의 취급이 Bot 운영에 최적화되는 등의 변화가 생깁니다."
|
||||||
flagAsCat: "나는 고양이다냥"
|
flagAsCat: "나는 고양이다냥"
|
||||||
|
flagAsCatDescription: "이 계정이 고양이라면 활성화 해주세요."
|
||||||
autoAcceptFollowed: "팔로우 중인 유저로부터의 팔로우 요청을 자동 수락"
|
autoAcceptFollowed: "팔로우 중인 유저로부터의 팔로우 요청을 자동 수락"
|
||||||
addAcount: "계정 추가"
|
addAcount: "계정 추가"
|
||||||
loginFailed: "로그인에 실패했습니다"
|
loginFailed: "로그인에 실패했습니다"
|
||||||
@@ -204,6 +216,8 @@ imageUrl: "이미지 URL"
|
|||||||
remove: "삭제"
|
remove: "삭제"
|
||||||
removed: "삭제하였습니다"
|
removed: "삭제하였습니다"
|
||||||
removeAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
|
removeAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
|
||||||
|
deleteAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
|
||||||
|
resetAreYouSure: "초기화 하시겠습니까?"
|
||||||
saved: "저장하였습니다"
|
saved: "저장하였습니다"
|
||||||
messaging: "대화"
|
messaging: "대화"
|
||||||
upload: "업로드"
|
upload: "업로드"
|
||||||
@@ -262,6 +276,7 @@ rename: "이름 변경"
|
|||||||
avatar: "아바타"
|
avatar: "아바타"
|
||||||
banner: "배너"
|
banner: "배너"
|
||||||
nsfw: "열람주의"
|
nsfw: "열람주의"
|
||||||
|
whenServerDisconnected: "서버와의 접속이 끊겼을 때"
|
||||||
disconnectedFromServer: "서버와의 연결이 끊어졌습니다"
|
disconnectedFromServer: "서버와의 연결이 끊어졌습니다"
|
||||||
reload: "새로고침"
|
reload: "새로고침"
|
||||||
doNothing: "무시하기"
|
doNothing: "무시하기"
|
||||||
@@ -302,6 +317,9 @@ bannerUrl: "배너 이미지 URL"
|
|||||||
basicInfo: "기본 정보"
|
basicInfo: "기본 정보"
|
||||||
pinnedUsers: "고정된 유저"
|
pinnedUsers: "고정된 유저"
|
||||||
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다."
|
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다."
|
||||||
|
pinnedPages: "고정한 페이지"
|
||||||
|
pinnedPagesDescription: "인스턴스의 대문에 고정하고 싶은 페이지의 경로를 한 줄에 하나씩 적습니다."
|
||||||
|
pinnedNotes: "고정해놓은 노트"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "hCaptcha 활성화"
|
enableHcaptcha: "hCaptcha 활성화"
|
||||||
hcaptchaSiteKey: "사이트 키"
|
hcaptchaSiteKey: "사이트 키"
|
||||||
@@ -342,13 +360,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단계 인증"
|
||||||
@@ -362,8 +373,6 @@ unregister: "등록 해제"
|
|||||||
passwordLessLogin: "비밀번호 없이 로그인"
|
passwordLessLogin: "비밀번호 없이 로그인"
|
||||||
resetPassword: "비밀번호 재설정"
|
resetPassword: "비밀번호 재설정"
|
||||||
newPasswordIs: "새로운 비밀번호는 \"{password}\" 입니다"
|
newPasswordIs: "새로운 비밀번호는 \"{password}\" 입니다"
|
||||||
autoNoteWatch: "노트를 자동으로 지켜보기"
|
|
||||||
autoNoteWatchDescription: "리액션하거나 답글을 남긴 다른 유저의 노트에 대한 알림을 받습니다."
|
|
||||||
reduceUiAnimation: "UI의 애니메이션을 줄이기"
|
reduceUiAnimation: "UI의 애니메이션을 줄이기"
|
||||||
share: "공유"
|
share: "공유"
|
||||||
notFound: "찾을 수 없습니다"
|
notFound: "찾을 수 없습니다"
|
||||||
@@ -401,6 +410,7 @@ noMessagesYet: "아직 대화가 없습니다"
|
|||||||
newMessageExists: "새 메시지가 있습니다"
|
newMessageExists: "새 메시지가 있습니다"
|
||||||
onlyOneFileCanBeAttached: "메시지에 첨부할 수 있는 파일은 하나까지입니다"
|
onlyOneFileCanBeAttached: "메시지에 첨부할 수 있는 파일은 하나까지입니다"
|
||||||
signinRequired: "로그인 해주세요"
|
signinRequired: "로그인 해주세요"
|
||||||
|
invitations: "초대"
|
||||||
invitationCode: "초대 코드"
|
invitationCode: "초대 코드"
|
||||||
checking: "확인하는 중입니다"
|
checking: "확인하는 중입니다"
|
||||||
available: "사용 가능합니다"
|
available: "사용 가능합니다"
|
||||||
@@ -424,6 +434,7 @@ useOsNativeEmojis: "OS 기본 이모지를 사용"
|
|||||||
youHaveNoGroups: "그룹이 없습니다"
|
youHaveNoGroups: "그룹이 없습니다"
|
||||||
joinOrCreateGroup: "다른 그룹의 초대를 받거나, 직접 새 그룹을 만들어 보세요."
|
joinOrCreateGroup: "다른 그룹의 초대를 받거나, 직접 새 그룹을 만들어 보세요."
|
||||||
noHistory: "기록이 없습니다"
|
noHistory: "기록이 없습니다"
|
||||||
|
signinHistory: "로그인 기록"
|
||||||
disableAnimatedMfm: "움직임이 있는 MFM을 비활성화"
|
disableAnimatedMfm: "움직임이 있는 MFM을 비활성화"
|
||||||
doing: "잠시만요"
|
doing: "잠시만요"
|
||||||
category: "카테고리"
|
category: "카테고리"
|
||||||
@@ -441,6 +452,7 @@ remote: "리모트"
|
|||||||
total: "합계"
|
total: "합계"
|
||||||
weekOverWeekChanges: "지난주보다"
|
weekOverWeekChanges: "지난주보다"
|
||||||
dayOverDayChanges: "어제보다"
|
dayOverDayChanges: "어제보다"
|
||||||
|
clientSettings: "클라이언트 설정"
|
||||||
accountSettings: "계정 설정"
|
accountSettings: "계정 설정"
|
||||||
promotion: "프로모션"
|
promotion: "프로모션"
|
||||||
promote: "프로모션하기"
|
promote: "프로모션하기"
|
||||||
@@ -463,6 +475,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 +483,10 @@ newNoteRecived: "새 노트가 있습니다"
|
|||||||
sounds: "소리"
|
sounds: "소리"
|
||||||
listen: "듣기"
|
listen: "듣기"
|
||||||
none: "없음"
|
none: "없음"
|
||||||
|
showInPage: "페이지로 보기"
|
||||||
|
popout: "새 창으로 열기"
|
||||||
volume: "음량"
|
volume: "음량"
|
||||||
|
masterVolume: "마스터 볼륨"
|
||||||
details: "자세히"
|
details: "자세히"
|
||||||
chooseEmoji: "이모지 선택"
|
chooseEmoji: "이모지 선택"
|
||||||
unableToProcess: "작업을 완료할 수 없습니다"
|
unableToProcess: "작업을 완료할 수 없습니다"
|
||||||
@@ -524,16 +540,22 @@ plugins: "플러그인"
|
|||||||
pluginInstallWarn: "신뢰할 수 없는 플러그인은 설치하지 마십시오."
|
pluginInstallWarn: "신뢰할 수 없는 플러그인은 설치하지 마십시오."
|
||||||
deck: "덱"
|
deck: "덱"
|
||||||
undeck: "덱 해제"
|
undeck: "덱 해제"
|
||||||
|
width: "폭"
|
||||||
|
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: "포트"
|
||||||
@@ -542,12 +564,118 @@ 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: "랜덤"
|
||||||
|
system: "시스템"
|
||||||
|
switchUi: "UI 전환"
|
||||||
|
desktop: "데스크탑"
|
||||||
|
clip: "클립"
|
||||||
|
createNew: "새로 만들기"
|
||||||
|
optional: "옵션"
|
||||||
|
createNewClip: "새 클립 만들기"
|
||||||
|
public: "공개"
|
||||||
|
manageAccessTokens: "액세스 토큰 관리"
|
||||||
|
yes: "예"
|
||||||
|
no: "아니오"
|
||||||
|
driveUsage: "드라이브 사용량"
|
||||||
|
noCrawle: "검색엔진의 인덱싱 거부"
|
||||||
|
noCrawleDescription: "검색엔진에 사용자 페이지, 노트, 페이지 등의 콘텐츠를 인덱싱되지 않게 합니다."
|
||||||
|
lockedAccountInfo: "팔로우를 승인으로 승인받더라도 노트의 공개 범위를 '팔로워'로 하지 않는 한 누구나 당신의 노트를 볼 수 있습니다."
|
||||||
|
alwaysMarkSensitive: "미디어를 항상 열람 주의로 설정"
|
||||||
|
emailVerified: "메일 주소가 확인되었습니다."
|
||||||
|
clips: "클립"
|
||||||
|
_nsfw:
|
||||||
|
ignore: "열람 주의 미디어 항상 표시"
|
||||||
|
_mfm:
|
||||||
|
cheatSheet: "MFM 도움말"
|
||||||
|
intro: "MFM는 Misskey의 다양한 곳에서 사용할 수 있는 전용 마크업 언어입니다. 여기에서는 MFM에서 사용할 수 있는 구문을 확인할 수 있습니다."
|
||||||
|
mention: "멘션"
|
||||||
|
mentionDescription: "골뱅이표(@) 뒤에 사용자명을 넣어 특정 유저를 나타낼 수 있습니다."
|
||||||
|
hashtag: "해시태그"
|
||||||
|
hashtagDescription: "샵 또는 우물정자(#)를 앞에 붙여서 해시태그를 나타낼 수 있습니다."
|
||||||
|
url: "URL"
|
||||||
|
urlDescription: "URL을 나타낼 수 있습니다."
|
||||||
|
link: "링크"
|
||||||
|
boldDescription: "문자를 굵게 강조합니다."
|
||||||
|
smallDescription: "내용을 작고 연하게 보이게 합니다."
|
||||||
|
center: "가운데 정렬"
|
||||||
|
centerDescription: "내용을 가운데 정렬로 보이게 합니다."
|
||||||
|
inlineCode: "코드(인라인)"
|
||||||
|
blockCode: "코드(블록)"
|
||||||
|
inlineMath: "수식(인라인)"
|
||||||
|
inlineMathDescription: "수식(KaTeX)를 인라인으로 보이게 합니다."
|
||||||
|
blockMath: "수식(블록)"
|
||||||
|
blockMathDescription: "여러 줄의 수식(KaTeX)를 블록으로 보이게 합니다."
|
||||||
|
quote: "인용"
|
||||||
|
emoji: "커스텀 이모지"
|
||||||
|
emojiDescription: "커스텀 이모지의 이름을 쌍점(:)으로 감싸서 커스텀 이모지를 사용합니다."
|
||||||
|
search: "검색"
|
||||||
|
searchDescription: "주어진 키워드가 입력된 검색창을 보이게 합니다."
|
||||||
|
flip: "플립"
|
||||||
|
flipDescription: "내용을 상하 또는 좌우로 반전시킵니다."
|
||||||
|
jump: "애니메이션(점프)"
|
||||||
|
_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: "합계"
|
||||||
|
turnCount: "{count}턴 째"
|
||||||
|
myGames: "내 대국"
|
||||||
|
allGames: "모두의 대국"
|
||||||
|
ended: "종료"
|
||||||
|
playing: "지금 대국 중"
|
||||||
|
isLlotheo: "돌이 적은 사람이 승리 (llotheo)"
|
||||||
|
loopedMap: "루프 지도"
|
||||||
|
canPutEverywhere: "어디에나 놓을 수 있음"
|
||||||
|
_instanceTicker:
|
||||||
|
none: "보이지 않음"
|
||||||
|
remote: "리모트 유저에게만 보이기"
|
||||||
|
always: "항상 보이기"
|
||||||
_channel:
|
_channel:
|
||||||
create: "채널 생성"
|
create: "채널 생성"
|
||||||
setBanner: "배너 설정"
|
setBanner: "배너 설정"
|
||||||
@@ -557,10 +685,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: "테마 찾아보기"
|
||||||
@@ -705,6 +834,7 @@ _widgets:
|
|||||||
digitalClock: "디지털 시계"
|
digitalClock: "디지털 시계"
|
||||||
federation: "연합"
|
federation: "연합"
|
||||||
postForm: "글 입력란"
|
postForm: "글 입력란"
|
||||||
|
button: "버튼"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "숨기기"
|
hide: "숨기기"
|
||||||
show: "더 보기"
|
show: "더 보기"
|
||||||
@@ -758,7 +888,6 @@ _profile:
|
|||||||
username: "유저명"
|
username: "유저명"
|
||||||
description: "자기소개"
|
description: "자기소개"
|
||||||
youCanIncludeHashtags: "해시 태그를 포함할 수 있습니다."
|
youCanIncludeHashtags: "해시 태그를 포함할 수 있습니다."
|
||||||
metadata: "추가 정보"
|
|
||||||
metadataLabel: "라벨"
|
metadataLabel: "라벨"
|
||||||
metadataContent: "내용"
|
metadataContent: "내용"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
@@ -878,6 +1007,7 @@ _pages:
|
|||||||
my: "내 페이지"
|
my: "내 페이지"
|
||||||
liked: "좋아요한 페이지"
|
liked: "좋아요한 페이지"
|
||||||
inspector: "인스펙터"
|
inspector: "인스펙터"
|
||||||
|
contents: "콘텐츠"
|
||||||
content: "페이지 블록"
|
content: "페이지 블록"
|
||||||
variables: "변수"
|
variables: "변수"
|
||||||
title: "제목"
|
title: "제목"
|
||||||
@@ -931,6 +1061,8 @@ _pages:
|
|||||||
id: "캔버스 ID"
|
id: "캔버스 ID"
|
||||||
width: "폭"
|
width: "폭"
|
||||||
height: "높이"
|
height: "높이"
|
||||||
|
_note:
|
||||||
|
detailed: "세부 정보 보기"
|
||||||
switch: "스위치"
|
switch: "스위치"
|
||||||
_switch:
|
_switch:
|
||||||
name: "변수명"
|
name: "변수명"
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ cancel: "Anuluj"
|
|||||||
enterUsername: "Wprowadź nazwę użytkownika"
|
enterUsername: "Wprowadź nazwę użytkownika"
|
||||||
smtpUser: "Nazwa użytkownika"
|
smtpUser: "Nazwa użytkownika"
|
||||||
smtpPass: "Hasło"
|
smtpPass: "Hasło"
|
||||||
|
_mfm:
|
||||||
|
search: "Szukaj"
|
||||||
_sfx:
|
_sfx:
|
||||||
notification: "Powiadomienia"
|
notification: "Powiadomienia"
|
||||||
_widgets:
|
_widgets:
|
||||||
|
|||||||
1040
locales/ru-RU.yml
1040
locales/ru-RU.yml
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,5 @@
|
|||||||
---
|
---
|
||||||
_lang_: "ياپونچە"
|
_lang_: "ياپونچە"
|
||||||
search: "ئىزدەش"
|
search: "ئىزدەش"
|
||||||
|
_mfm:
|
||||||
|
search: "ئىزدەش"
|
||||||
|
|||||||
1285
locales/uk-UA.yml
Normal file
1285
locales/uk-UA.yml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -11,7 +11,7 @@ ok: "OK"
|
|||||||
gotIt: "我明白了"
|
gotIt: "我明白了"
|
||||||
cancel: "取消"
|
cancel: "取消"
|
||||||
enterUsername: "输入用户名"
|
enterUsername: "输入用户名"
|
||||||
renotedBy: "{user} 转贴了"
|
renotedBy: "{user} 转发了"
|
||||||
noNotes: "没有帖文"
|
noNotes: "没有帖文"
|
||||||
noNotifications: "无通知"
|
noNotifications: "无通知"
|
||||||
instance: "实例"
|
instance: "实例"
|
||||||
@@ -33,6 +33,9 @@ addUser: "添加用户"
|
|||||||
favorite: "收藏"
|
favorite: "收藏"
|
||||||
favorites: "收藏"
|
favorites: "收藏"
|
||||||
unfavorite: "取消收藏"
|
unfavorite: "取消收藏"
|
||||||
|
favorited: "已加入收藏夹。"
|
||||||
|
alreadyFavorited: "收藏夹中已存在。"
|
||||||
|
cantFavorite: "无法添加到收藏夹。"
|
||||||
pin: "置顶"
|
pin: "置顶"
|
||||||
unpin: "取消置顶"
|
unpin: "取消置顶"
|
||||||
copyContent: "复制内容"
|
copyContent: "复制内容"
|
||||||
@@ -84,9 +87,12 @@ followRequest: "关注申请"
|
|||||||
followRequests: "关注申请"
|
followRequests: "关注申请"
|
||||||
unfollow: "取消关注"
|
unfollow: "取消关注"
|
||||||
followRequestPending: "发送关注申请"
|
followRequestPending: "发送关注申请"
|
||||||
enterEmoji: "输入Emoji"
|
enterEmoji: "输入表情符号"
|
||||||
renote: "转发"
|
renote: "转发"
|
||||||
unrenote: "取消转发"
|
unrenote: "取消转发"
|
||||||
|
renoted: "已转发。"
|
||||||
|
cantRenote: "该帖子无法转发。"
|
||||||
|
cantReRenote: "转发无法被再次转发。"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
pinnedNote: "已置顶的帖子"
|
pinnedNote: "已置顶的帖子"
|
||||||
you: "您"
|
you: "您"
|
||||||
@@ -95,6 +101,7 @@ sensitive: "阅读注意"
|
|||||||
add: "添加"
|
add: "添加"
|
||||||
reaction: "回应"
|
reaction: "回应"
|
||||||
reactionSettingDescription: "选择您想要置顶的回应。"
|
reactionSettingDescription: "选择您想要置顶的回应。"
|
||||||
|
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
|
||||||
rememberNoteVisibility: "记录公开范围"
|
rememberNoteVisibility: "记录公开范围"
|
||||||
attachCancel: "删除附件"
|
attachCancel: "删除附件"
|
||||||
markAsSensitive: "阅读注意"
|
markAsSensitive: "阅读注意"
|
||||||
@@ -115,16 +122,18 @@ selectAntenna: "天线选择"
|
|||||||
selectWidget: "选择小工具"
|
selectWidget: "选择小工具"
|
||||||
editWidgets: "编辑小工具"
|
editWidgets: "编辑小工具"
|
||||||
editWidgetsExit: "完成编辑"
|
editWidgetsExit: "完成编辑"
|
||||||
customEmojis: "自定义Emoji"
|
customEmojis: "自定义表情符号"
|
||||||
emoji: "表情符号"
|
emoji: "表情符号"
|
||||||
emojiName: "Emoji 名称"
|
emojiName: "表情符号名称"
|
||||||
emojiUrl: "emoji 地址"
|
emojiUrl: "表情符号地址"
|
||||||
addEmoji: "添加Emoji"
|
addEmoji: "添加表情符号"
|
||||||
settingGuide: "推荐配置"
|
settingGuide: "推荐配置"
|
||||||
cacheRemoteFiles: "远程文件缓存"
|
cacheRemoteFiles: "远程文件缓存"
|
||||||
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
|
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
|
||||||
flagAsBot: "这个账户是Bot"
|
flagAsBot: "这个账户是Bot"
|
||||||
|
flagAsBotDescription: "如果此帐户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让Misskey的内部系统将此帐户识别为机器人。"
|
||||||
flagAsCat: "这个账户是Cat"
|
flagAsCat: "这个账户是Cat"
|
||||||
|
flagAsCatDescription: "如果您想表明此帐户是一只猫,请打开此标志。"
|
||||||
autoAcceptFollowed: "自动允许关注"
|
autoAcceptFollowed: "自动允许关注"
|
||||||
addAcount: "添加账户"
|
addAcount: "添加账户"
|
||||||
loginFailed: "登录失败"
|
loginFailed: "登录失败"
|
||||||
@@ -164,7 +173,7 @@ jobQueue: "作业队列"
|
|||||||
cpuAndMemory: "CPU使用量"
|
cpuAndMemory: "CPU使用量"
|
||||||
network: "网络"
|
network: "网络"
|
||||||
disk: "存储"
|
disk: "存储"
|
||||||
instanceInfo: "实例情报"
|
instanceInfo: "实例信息"
|
||||||
statistics: "统计"
|
statistics: "统计"
|
||||||
clearQueue: "清除队列"
|
clearQueue: "清除队列"
|
||||||
clearQueueConfirmTitle: "确定清除队列?"
|
clearQueueConfirmTitle: "确定清除队列?"
|
||||||
@@ -185,7 +194,7 @@ done: "完成"
|
|||||||
processing: "处理中"
|
processing: "处理中"
|
||||||
preview: "预览"
|
preview: "预览"
|
||||||
default: "默认"
|
default: "默认"
|
||||||
noCustomEmojis: "无自定义Emoji"
|
noCustomEmojis: "没有自定义表情符号"
|
||||||
noJobs: "没有任务"
|
noJobs: "没有任务"
|
||||||
federating: "联合中"
|
federating: "联合中"
|
||||||
blocked: "已拦截"
|
blocked: "已拦截"
|
||||||
@@ -214,6 +223,8 @@ imageUrl: "图片URL"
|
|||||||
remove: "删除"
|
remove: "删除"
|
||||||
removed: "已删除"
|
removed: "已删除"
|
||||||
removeAreYouSure: "要删掉「{x}」吗?"
|
removeAreYouSure: "要删掉「{x}」吗?"
|
||||||
|
deleteAreYouSure: "要删掉「{x}」吗?"
|
||||||
|
resetAreYouSure: "恢复默认设置?"
|
||||||
saved: "已保存"
|
saved: "已保存"
|
||||||
messaging: "聊天"
|
messaging: "聊天"
|
||||||
upload: "上传"
|
upload: "上传"
|
||||||
@@ -313,6 +324,10 @@ bannerUrl: "Banner URL"
|
|||||||
basicInfo: "基本信息"
|
basicInfo: "基本信息"
|
||||||
pinnedUsers: "置顶用户"
|
pinnedUsers: "置顶用户"
|
||||||
pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。"
|
pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。"
|
||||||
|
pinnedPages: "固定页面"
|
||||||
|
pinnedPagesDescription: "输入您要固定到实例首页的页面路径,以换行符分隔。"
|
||||||
|
pinnedClipId: "置顶的片段ID"
|
||||||
|
pinnedNotes: "已置顶的帖子"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "启用 hCaptcha"
|
enableHcaptcha: "启用 hCaptcha"
|
||||||
hcaptchaSiteKey: "网站密钥"
|
hcaptchaSiteKey: "网站密钥"
|
||||||
@@ -353,13 +368,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: "两步验证"
|
||||||
@@ -373,8 +381,6 @@ unregister: "删除账户"
|
|||||||
passwordLessLogin: "无密码登录"
|
passwordLessLogin: "无密码登录"
|
||||||
resetPassword: "重置密码"
|
resetPassword: "重置密码"
|
||||||
newPasswordIs: "新的密码是「{password}」"
|
newPasswordIs: "新的密码是「{password}」"
|
||||||
autoNoteWatch: "自动关注帖子"
|
|
||||||
autoNoteWatchDescription: "让您能够收到关于「回应」和回复其他用户的帖子的通知。"
|
|
||||||
reduceUiAnimation: "减少UI动画"
|
reduceUiAnimation: "减少UI动画"
|
||||||
share: "分享"
|
share: "分享"
|
||||||
notFound: "未找到"
|
notFound: "未找到"
|
||||||
@@ -412,6 +418,7 @@ noMessagesYet: "现在没有新的聊天"
|
|||||||
newMessageExists: "新信息"
|
newMessageExists: "新信息"
|
||||||
onlyOneFileCanBeAttached: "只能添加一个附件"
|
onlyOneFileCanBeAttached: "只能添加一个附件"
|
||||||
signinRequired: "请先登录"
|
signinRequired: "请先登录"
|
||||||
|
invitations: "邀请"
|
||||||
invitationCode: "邀请码"
|
invitationCode: "邀请码"
|
||||||
checking: "正在确认"
|
checking: "正在确认"
|
||||||
available: "可用"
|
available: "可用"
|
||||||
@@ -431,10 +438,11 @@ or: "或者"
|
|||||||
uiLanguage: "显示语言"
|
uiLanguage: "显示语言"
|
||||||
groupInvited: "群组招待"
|
groupInvited: "群组招待"
|
||||||
aboutX: "关于 {x}"
|
aboutX: "关于 {x}"
|
||||||
useOsNativeEmojis: "使用OS原生Emoji"
|
useOsNativeEmojis: "使用OS原生表情符号"
|
||||||
youHaveNoGroups: "没有群组"
|
youHaveNoGroups: "没有群组"
|
||||||
joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。"
|
joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。"
|
||||||
noHistory: "没有历史记录"
|
noHistory: "没有历史记录"
|
||||||
|
signinHistory: "登录历史"
|
||||||
disableAnimatedMfm: "禁用MFM动画"
|
disableAnimatedMfm: "禁用MFM动画"
|
||||||
doing: "正在进行"
|
doing: "正在进行"
|
||||||
category: "类别"
|
category: "类别"
|
||||||
@@ -487,6 +495,7 @@ none: "空"
|
|||||||
showInPage: "在页面中显示"
|
showInPage: "在页面中显示"
|
||||||
popout: "弹窗"
|
popout: "弹窗"
|
||||||
volume: "音量"
|
volume: "音量"
|
||||||
|
masterVolume: "主音量"
|
||||||
details: "详情"
|
details: "详情"
|
||||||
chooseEmoji: "选择表情符号"
|
chooseEmoji: "选择表情符号"
|
||||||
unableToProcess: "操作无法完成"
|
unableToProcess: "操作无法完成"
|
||||||
@@ -530,7 +539,7 @@ poll: "调查问卷"
|
|||||||
useCw: "隐藏内容"
|
useCw: "隐藏内容"
|
||||||
enablePlayer: "打开播放器"
|
enablePlayer: "打开播放器"
|
||||||
disablePlayer: "关闭播放器"
|
disablePlayer: "关闭播放器"
|
||||||
expandTweet: "展开推文"
|
expandTweet: "展开贴文"
|
||||||
themeEditor: "主题编辑器"
|
themeEditor: "主题编辑器"
|
||||||
description: "描述"
|
description: "描述"
|
||||||
author: "作者"
|
author: "作者"
|
||||||
@@ -541,6 +550,12 @@ pluginInstallWarn: "请不要安装不明来源的插件"
|
|||||||
deck: "Deck"
|
deck: "Deck"
|
||||||
undeck: "取消Deck"
|
undeck: "取消Deck"
|
||||||
useBlurEffectForModal: "模态框使用模糊效果"
|
useBlurEffectForModal: "模态框使用模糊效果"
|
||||||
|
useFullReactionPicker: "使用全功能的回应工具栏"
|
||||||
|
width: "宽度"
|
||||||
|
height: "高度"
|
||||||
|
large: "大"
|
||||||
|
medium: "中"
|
||||||
|
small: "小"
|
||||||
generateAccessToken: "生成访问令牌"
|
generateAccessToken: "生成访问令牌"
|
||||||
permission: "权限"
|
permission: "权限"
|
||||||
enableAll: "启用全部"
|
enableAll: "启用全部"
|
||||||
@@ -549,11 +564,12 @@ tokenRequested: "允许访问账户"
|
|||||||
pluginTokenRequestedDescription: "此插件将能够拥有此处设置的权限"
|
pluginTokenRequestedDescription: "此插件将能够拥有此处设置的权限"
|
||||||
notificationType: "通知类型"
|
notificationType: "通知类型"
|
||||||
edit: "编辑"
|
edit: "编辑"
|
||||||
useStarForReactionFallback: "如果回应的颜文字未知,则使用★作为代替"
|
useStarForReactionFallback: "如果回应的是未知表情符号,则使用★作为代替"
|
||||||
emailConfig: "邮件服务器设置"
|
emailConfig: "邮件服务器设置"
|
||||||
enableEmail: "启用发送邮件功能"
|
enableEmail: "启用发送邮件功能"
|
||||||
emailConfigInfo: "用于确认电子邮件和密码重置"
|
emailConfigInfo: "用于确认电子邮件和密码重置"
|
||||||
email: "邮件地址"
|
email: "邮箱"
|
||||||
|
emailAddress: "电子邮件地址"
|
||||||
smtpConfig: "SMTP服务器设置"
|
smtpConfig: "SMTP服务器设置"
|
||||||
smtpHost: "主机名"
|
smtpHost: "主机名"
|
||||||
smtpPort: "端口"
|
smtpPort: "端口"
|
||||||
@@ -585,6 +601,7 @@ regenerateLoginTokenDescription: "重新生成用于登录的内部令牌。通
|
|||||||
setMultipleBySeparatingWithSpace: "您可以使用空格分隔多个项目。"
|
setMultipleBySeparatingWithSpace: "您可以使用空格分隔多个项目。"
|
||||||
fileIdOrUrl: "文件ID或者URL"
|
fileIdOrUrl: "文件ID或者URL"
|
||||||
chatOpenBehavior: "聊天窗口打开时的行为"
|
chatOpenBehavior: "聊天窗口打开时的行为"
|
||||||
|
behavior: "行为"
|
||||||
sample: "示例"
|
sample: "示例"
|
||||||
abuseReports: "举报"
|
abuseReports: "举报"
|
||||||
reportAbuse: "举报"
|
reportAbuse: "举报"
|
||||||
@@ -593,6 +610,164 @@ fillAbuseReportDescription: "请填写举报的详细原因。如果有对方发
|
|||||||
abuseReported: "内容已发送。感谢您的报告。"
|
abuseReported: "内容已发送。感谢您的报告。"
|
||||||
send: "发送"
|
send: "发送"
|
||||||
abuseMarkAsResolved: "处理完毕"
|
abuseMarkAsResolved: "处理完毕"
|
||||||
|
openInNewTab: "在新标签页中打开"
|
||||||
|
openInSideView: "在侧边栏中打开"
|
||||||
|
defaultNavigationBehaviour: "默认导航"
|
||||||
|
editTheseSettingsMayBreakAccount: "编辑这些设置可以会损坏您的账号"
|
||||||
|
instanceTicker: "帖子的实例信息"
|
||||||
|
waitingFor: "等待{x}"
|
||||||
|
random: "随机"
|
||||||
|
system: "系统"
|
||||||
|
switchUi: "切换界面"
|
||||||
|
desktop: "桌面"
|
||||||
|
clip: "片段"
|
||||||
|
createNew: "新建"
|
||||||
|
optional: "可选"
|
||||||
|
createNewClip: "新建片段"
|
||||||
|
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: "页面刷新后设置才会生效。是否现在刷新页面?"
|
||||||
|
_aboutMisskey:
|
||||||
|
about: "Misskey是由syuilo于2014年开发的开源软件。"
|
||||||
|
contributors: "主要贡献者"
|
||||||
|
allContributors: "全体贡献者"
|
||||||
|
source: "源代码"
|
||||||
|
translation: "翻译Misskey"
|
||||||
|
donate: "赞助Misskey"
|
||||||
|
morePatrons: "还有很多其他的人也在支持我们,非常感谢🥰"
|
||||||
|
patrons: "支持者"
|
||||||
|
_nsfw:
|
||||||
|
respect: "隐藏NSFW内容"
|
||||||
|
ignore: "不隐藏NSFW内容"
|
||||||
|
force: "总是隐藏内容"
|
||||||
|
_mfm:
|
||||||
|
cheatSheet: "MFM代码速查表"
|
||||||
|
intro: "MFM是一种在Misskey中的各个位置使用的专用标记语言。在这里您可以看到MFM中可用的语法列表。"
|
||||||
|
dummy: "通过Misskey扩展Fediverse的世界"
|
||||||
|
mention: "提及"
|
||||||
|
mentionDescription: "可以使用 @+用户名 来指示特定用户"
|
||||||
|
hashtag: "话题标签"
|
||||||
|
hashtagDescription: "可以使用井号+文字来表示话题标签。"
|
||||||
|
url: "URL"
|
||||||
|
urlDescription: "可以表示URL地址。"
|
||||||
|
link: "链接"
|
||||||
|
linkDescription: "可以将部分文字和URL关联起来。"
|
||||||
|
bold: "粗体"
|
||||||
|
boldDescription: "可以将文字显示为粗体来表示强调。"
|
||||||
|
small: "缩小"
|
||||||
|
smallDescription: "可以使内容文字变小、变淡。"
|
||||||
|
center: "居中"
|
||||||
|
centerDescription: "可以将内容居中显示。"
|
||||||
|
inlineCode: "代码(内嵌)"
|
||||||
|
inlineCodeDescription: "将文字中的程序代码语法高亮显示。"
|
||||||
|
blockCode: "代码(块)"
|
||||||
|
blockCodeDescription: "语法高亮显示整块程序代码。"
|
||||||
|
inlineMath: "数学公式(内嵌)"
|
||||||
|
inlineMathDescription: "显示内嵌的KaTex公式。"
|
||||||
|
blockMath: "数学公式(块)"
|
||||||
|
blockMathDescription: "显示整块的多行KaTex数学公式。"
|
||||||
|
quote: "引用"
|
||||||
|
quoteDescription: "可以用来表示引用的内容。"
|
||||||
|
emoji: "自定义表情符号"
|
||||||
|
emojiDescription: "可以将自定义表情符号使用冒号括起来,就可以显示自定义表情符号了。"
|
||||||
|
search: "搜索"
|
||||||
|
searchDescription: "显示含有搜索内容示例的搜索框。"
|
||||||
|
flip: "翻转"
|
||||||
|
flipDescription: "将内容上下或左右翻转。"
|
||||||
|
jelly: "动画(果冻)"
|
||||||
|
jellyDescription: "显示果冻一样的动画效果。"
|
||||||
|
tada: "动画(锵锵)"
|
||||||
|
tadaDescription: "显示\"锵锵!\"的动画效果。"
|
||||||
|
jump: "动画(跳动)"
|
||||||
|
jumpDescription: "显示跳动的动画效果。"
|
||||||
|
bounce: "动画(弹性)"
|
||||||
|
bounceDescription: "显示弹性一样的动画效果。"
|
||||||
|
shake: "动画(摇晃)"
|
||||||
|
shakeDescription: "显示摇晃的动画效果。"
|
||||||
|
twitch: "动画(颤抖)"
|
||||||
|
twitchDescription: "显示强烈颤抖的动画效果。"
|
||||||
|
spin: "动画(回转)"
|
||||||
|
spinDescription: "显示回转的动画效果。"
|
||||||
|
_reversi:
|
||||||
|
reversi: "黑白棋"
|
||||||
|
gameSettings: "对局设置"
|
||||||
|
chooseBoard: "棋盘选择"
|
||||||
|
blackOrWhite: "先手/后手"
|
||||||
|
blackIs: "{name}执黑(先走)"
|
||||||
|
rules: "规则"
|
||||||
|
botSettings: "机器人设置"
|
||||||
|
thisGameIsStartedSoon: "对局在几秒后开始"
|
||||||
|
waitingForOther: "等待对手准备"
|
||||||
|
waitingForMe: "等待您的准备"
|
||||||
|
waitingBoth: "请准备"
|
||||||
|
ready: "准备就绪"
|
||||||
|
cancelReady: "重新准备"
|
||||||
|
opponentTurn: "对手的会合"
|
||||||
|
myTurn: "您的回合"
|
||||||
|
turnOf: "{name}的回合"
|
||||||
|
pastTurnOf: "{name}的回合"
|
||||||
|
surrender: "认输 "
|
||||||
|
surrendered: "对手认输"
|
||||||
|
drawn: "平局"
|
||||||
|
won: "{name}获胜"
|
||||||
|
black: "黑"
|
||||||
|
white: "白"
|
||||||
|
total: "总计"
|
||||||
|
turnCount: "{count}回合"
|
||||||
|
myGames: "我的对局"
|
||||||
|
allGames: "所有对局"
|
||||||
|
ended: "结束"
|
||||||
|
playing: "对局中"
|
||||||
|
isLlotheo: "棋子较少一方获胜(LLoTheO规则)"
|
||||||
|
loopedMap: "循环棋盘"
|
||||||
|
canPutEverywhere: "可以下在任意位置"
|
||||||
|
_instanceTicker:
|
||||||
|
none: "不显示"
|
||||||
|
remote: "显示给远程用户"
|
||||||
|
always: "始终显示"
|
||||||
_serverDisconnectedBehavior:
|
_serverDisconnectedBehavior:
|
||||||
reload: "自动重载"
|
reload: "自动重载"
|
||||||
dialog: "对话框警告"
|
dialog: "对话框警告"
|
||||||
@@ -615,7 +790,7 @@ _wordMute:
|
|||||||
muteWords: "禁用词"
|
muteWords: "禁用词"
|
||||||
muteWordsDescription: "使用空格分隔表示AND逻辑,使用换行符分隔表示OR逻辑。"
|
muteWordsDescription: "使用空格分隔表示AND逻辑,使用换行符分隔表示OR逻辑。"
|
||||||
muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。"
|
muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。"
|
||||||
softDescription: "隐藏时间轴中指定条件的帖文。"
|
softDescription: "隐藏时间线中指定条件的帖文。"
|
||||||
hardDescription: "防止将具有指定条件的帖文添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。"
|
hardDescription: "防止将具有指定条件的帖文添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。"
|
||||||
soft: "软屏蔽"
|
soft: "软屏蔽"
|
||||||
hard: "硬屏蔽"
|
hard: "硬屏蔽"
|
||||||
@@ -626,6 +801,8 @@ _theme:
|
|||||||
manage: "主题管理"
|
manage: "主题管理"
|
||||||
code: "主题代码"
|
code: "主题代码"
|
||||||
installed: "{name} 已安装"
|
installed: "{name} 已安装"
|
||||||
|
installedThemes: "已安装的主题"
|
||||||
|
builtinThemes: "标准主题"
|
||||||
alreadyInstalled: "此主题已经安装"
|
alreadyInstalled: "此主题已经安装"
|
||||||
invalid: "主题格式错误"
|
invalid: "主题格式错误"
|
||||||
make: "制作主题"
|
make: "制作主题"
|
||||||
@@ -699,6 +876,8 @@ _sfx:
|
|||||||
chatBg: "聊天背景"
|
chatBg: "聊天背景"
|
||||||
antenna: "天线接收"
|
antenna: "天线接收"
|
||||||
channel: "频道通知"
|
channel: "频道通知"
|
||||||
|
reversiPutBlack: "黑白棋:黑方下子时"
|
||||||
|
reversiPutWhite: "黑白棋:白方下子时"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "未知"
|
unknown: "未知"
|
||||||
future: "未来"
|
future: "未来"
|
||||||
@@ -810,6 +989,8 @@ _widgets:
|
|||||||
digitalClock: "数字时钟"
|
digitalClock: "数字时钟"
|
||||||
federation: "联邦宇宙"
|
federation: "联邦宇宙"
|
||||||
postForm: "投稿窗口"
|
postForm: "投稿窗口"
|
||||||
|
slideshow: "幻灯片展示"
|
||||||
|
button: "按钮"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "隐藏"
|
hide: "隐藏"
|
||||||
show: "查看更多"
|
show: "查看更多"
|
||||||
@@ -864,9 +1045,13 @@ _profile:
|
|||||||
username: "用户名"
|
username: "用户名"
|
||||||
description: "个人简介"
|
description: "个人简介"
|
||||||
youCanIncludeHashtags: "您可以包含一个哈希标签。"
|
youCanIncludeHashtags: "您可以包含一个哈希标签。"
|
||||||
metadata: "额外信息"
|
metadata: "附加信息"
|
||||||
|
metadataEdit: "附加信息编辑"
|
||||||
|
metadataDescription: "最多可以在个人资料中以表格形式显示四条其他信息。"
|
||||||
metadataLabel: "标签"
|
metadataLabel: "标签"
|
||||||
metadataContent: "内容"
|
metadataContent: "内容"
|
||||||
|
changeAvatar: "修改头像"
|
||||||
|
changeBanner: "修改横幅"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "所有帖子"
|
allNotes: "所有帖子"
|
||||||
followingList: "关注中"
|
followingList: "关注中"
|
||||||
@@ -973,6 +1158,7 @@ _pages:
|
|||||||
created: "页面已创建"
|
created: "页面已创建"
|
||||||
updated: "页面已更新"
|
updated: "页面已更新"
|
||||||
deleted: "该页面已被删除"
|
deleted: "该页面已被删除"
|
||||||
|
pageSetting: "页面设置"
|
||||||
nameAlreadyExists: "该页面URL已存在"
|
nameAlreadyExists: "该页面URL已存在"
|
||||||
invalidNameTitle: "无效的页面URL"
|
invalidNameTitle: "无效的页面URL"
|
||||||
invalidNameText: "请确认该项不为空"
|
invalidNameText: "请确认该项不为空"
|
||||||
@@ -983,7 +1169,9 @@ _pages:
|
|||||||
unlike: "取消赞"
|
unlike: "取消赞"
|
||||||
my: "我的页面"
|
my: "我的页面"
|
||||||
liked: "喜欢的页面"
|
liked: "喜欢的页面"
|
||||||
|
featured: "热门"
|
||||||
inspector: "检查器"
|
inspector: "检查器"
|
||||||
|
contents: "内容"
|
||||||
content: "页面内容"
|
content: "页面内容"
|
||||||
variables: "变量"
|
variables: "变量"
|
||||||
title: "标题"
|
title: "标题"
|
||||||
@@ -1037,6 +1225,11 @@ _pages:
|
|||||||
id: "画布ID"
|
id: "画布ID"
|
||||||
width: "宽度"
|
width: "宽度"
|
||||||
height: "高度"
|
height: "高度"
|
||||||
|
note: "嵌入的帖子"
|
||||||
|
_note:
|
||||||
|
id: "帖子ID"
|
||||||
|
idDescription: "您也可以通过粘贴帖子的URL来进行设置。"
|
||||||
|
detailed: "显示详细信息"
|
||||||
switch: "开关"
|
switch: "开关"
|
||||||
_switch:
|
_switch:
|
||||||
name: "变量名"
|
name: "变量名"
|
||||||
@@ -1280,6 +1473,8 @@ _notification:
|
|||||||
_deck:
|
_deck:
|
||||||
alwaysShowMainColumn: "总是显示主列"
|
alwaysShowMainColumn: "总是显示主列"
|
||||||
columnAlign: "列对齐"
|
columnAlign: "列对齐"
|
||||||
|
columnMargin: "列间距"
|
||||||
|
columnHeaderHeight: "列标题高度"
|
||||||
addColumn: "添加列"
|
addColumn: "添加列"
|
||||||
swapLeft: "向左移动"
|
swapLeft: "向左移动"
|
||||||
swapRight: "向右移动"
|
swapRight: "向右移动"
|
||||||
@@ -1288,6 +1483,7 @@ _deck:
|
|||||||
stackLeft: "向左折叠"
|
stackLeft: "向左折叠"
|
||||||
popRight: "向右弹出"
|
popRight: "向右弹出"
|
||||||
_columns:
|
_columns:
|
||||||
|
main: "主列"
|
||||||
widgets: "小工具"
|
widgets: "小工具"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
tl: "时间线"
|
tl: "时间线"
|
||||||
|
|||||||
@@ -4,15 +4,15 @@ introMisskey: "歡迎! Misskey是一個開源的去中心化的社群網站。
|
|||||||
monthAndDay: "{month}月 {day}日"
|
monthAndDay: "{month}月 {day}日"
|
||||||
search: "搜尋"
|
search: "搜尋"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
username: "使用名稱"
|
username: "使用者名稱"
|
||||||
password: "密碼"
|
password: "密碼"
|
||||||
fetchingAsApObject: "從 Fediverse 查詢中..."
|
fetchingAsApObject: "從 Fediverse 查詢中..."
|
||||||
ok: "確定"
|
ok: "OK"
|
||||||
gotIt: "知道了"
|
gotIt: "知道了"
|
||||||
cancel: "取消"
|
cancel: "取消"
|
||||||
enterUsername: "輸入使用者名稱"
|
enterUsername: "輸入使用者名稱"
|
||||||
renotedBy: "{user} 轉發了"
|
renotedBy: "{user} 轉發了"
|
||||||
noNotes: "貼文不可用。"
|
noNotes: "箋文不可用。"
|
||||||
noNotifications: "沒有通知"
|
noNotifications: "沒有通知"
|
||||||
instance: "實例"
|
instance: "實例"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
@@ -33,6 +33,9 @@ addUser: "新增使用者"
|
|||||||
favorite: "收藏"
|
favorite: "收藏"
|
||||||
favorites: "已加星號"
|
favorites: "已加星號"
|
||||||
unfavorite: "取消收藏"
|
unfavorite: "取消收藏"
|
||||||
|
favorited: "已添加至收藏夾"
|
||||||
|
alreadyFavorited: "已經有添加入收藏夾過了"
|
||||||
|
cantFavorite: "無法添加至收藏夾"
|
||||||
pin: "置頂"
|
pin: "置頂"
|
||||||
unpin: "取消置頂"
|
unpin: "取消置頂"
|
||||||
copyContent: "複製內容"
|
copyContent: "複製內容"
|
||||||
@@ -63,8 +66,8 @@ exportRequested: "已請求匯出。這可能會花一點時間。結束後檔
|
|||||||
importRequested: "已請求匯入。這可能會花一點時間"
|
importRequested: "已請求匯入。這可能會花一點時間"
|
||||||
lists: "清單"
|
lists: "清單"
|
||||||
noLists: "沒有清單"
|
noLists: "沒有清單"
|
||||||
note: "貼文"
|
note: "箋文"
|
||||||
notes: "筆記"
|
notes: "箋文"
|
||||||
following: "追隨中"
|
following: "追隨中"
|
||||||
followers: "追隨者"
|
followers: "追隨者"
|
||||||
followsYou: "追隨你的人"
|
followsYou: "追隨你的人"
|
||||||
@@ -74,6 +77,7 @@ error: "錯誤"
|
|||||||
somethingHappened: "發生錯誤"
|
somethingHappened: "發生錯誤"
|
||||||
retry: "重試"
|
retry: "重試"
|
||||||
pageLoadError: "載入頁面失敗"
|
pageLoadError: "載入頁面失敗"
|
||||||
|
pageLoadErrorDescription: "這通常是因為網路錯誤或是瀏覽器快取殘留的原因。請先清除瀏覽器快取,稍後再重試"
|
||||||
enterListName: "輸入清單名稱"
|
enterListName: "輸入清單名稱"
|
||||||
privacy: "隱私"
|
privacy: "隱私"
|
||||||
makeFollowManuallyApprove: "手動審核追隨請求"
|
makeFollowManuallyApprove: "手動審核追隨請求"
|
||||||
@@ -86,6 +90,9 @@ followRequestPending: "追隨許可批准中"
|
|||||||
enterEmoji: "輸入表情符號"
|
enterEmoji: "輸入表情符號"
|
||||||
renote: "轉發貼文"
|
renote: "轉發貼文"
|
||||||
unrenote: "取消轉發貼文"
|
unrenote: "取消轉發貼文"
|
||||||
|
renoted: "轉發成功"
|
||||||
|
cantRenote: "這篇貼文無法轉發。"
|
||||||
|
cantReRenote: "無法轉發之前已經轉發過的內容"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
pinnedNote: "已置頂的貼文"
|
pinnedNote: "已置頂的貼文"
|
||||||
you: "您"
|
you: "您"
|
||||||
@@ -94,13 +101,14 @@ sensitive: "敏感內容"
|
|||||||
add: "新增"
|
add: "新增"
|
||||||
reaction: "反應"
|
reaction: "反應"
|
||||||
reactionSettingDescription: "置頂「反應」表情符號\n"
|
reactionSettingDescription: "置頂「反應」表情符號\n"
|
||||||
|
reactionSettingDescription2: "拖動以重新列序,點擊以刪除,按下 + 添加。"
|
||||||
rememberNoteVisibility: "記住筆記隱私設定"
|
rememberNoteVisibility: "記住筆記隱私設定"
|
||||||
attachCancel: "移除附件"
|
attachCancel: "移除附件"
|
||||||
markAsSensitive: "標記為敏感內容"
|
markAsSensitive: "標記為敏感內容"
|
||||||
unmarkAsSensitive: "取消標記為敏感內容"
|
unmarkAsSensitive: "取消標記為敏感內容"
|
||||||
enterFileName: "請輸入檔案名稱"
|
enterFileName: "請輸入檔案名稱"
|
||||||
mute: "消音"
|
mute: "靜音"
|
||||||
unmute: "解除消音"
|
unmute: "解除靜音"
|
||||||
block: "封鎖"
|
block: "封鎖"
|
||||||
unblock: "解除封鎖"
|
unblock: "解除封鎖"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@@ -121,9 +129,11 @@ emojiUrl: "表情符號URL"
|
|||||||
addEmoji: "新增表情符號"
|
addEmoji: "新增表情符號"
|
||||||
settingGuide: "推薦設定"
|
settingGuide: "推薦設定"
|
||||||
cacheRemoteFiles: "緩存非遠程檔案"
|
cacheRemoteFiles: "緩存非遠程檔案"
|
||||||
cacheRemoteFilesDescription: "如果禁用此設定,遠程文件將會被直接連結而非緩存。禁用將節省服務器上的存儲空間,但會因為沒有生成預覽圖而增加流量。"
|
cacheRemoteFilesDescription: "禁用此設定會停止遠端檔案的緩存,從而節省儲存空間。但資料會因直接連線從而產生額外連接數據。"
|
||||||
flagAsBot: "此帳戶是Bot"
|
flagAsBot: "此使用者是機器人"
|
||||||
flagAsCat: "此帳戶是Cat"
|
flagAsBotDescription: "如果本帳戶是由程式控制,請啟用此選項。啟用後,會作為標示幫助其他開發者防止機器人之間產生無限互動的行為,並會調整Misskey內部系統將本帳戶識別為機器人"
|
||||||
|
flagAsCat: "此使用者是貓"
|
||||||
|
flagAsCatDescription: "如果想將本帳戶標示為一隻貓,請開啟此標示"
|
||||||
autoAcceptFollowed: "自動許可追隨"
|
autoAcceptFollowed: "自動許可追隨"
|
||||||
addAcount: "新增帳號"
|
addAcount: "新增帳號"
|
||||||
loginFailed: "登入失敗"
|
loginFailed: "登入失敗"
|
||||||
@@ -171,8 +181,8 @@ clearCachedFiles: "清除快取資料"
|
|||||||
clearCachedFilesConfirm: "確定要清除緩存資料嗎?"
|
clearCachedFilesConfirm: "確定要清除緩存資料嗎?"
|
||||||
blockedInstances: "已封鎖的實例"
|
blockedInstances: "已封鎖的實例"
|
||||||
blockedInstancesDescription: "請逐行輸入需要封鎖的實例。已封鎖的實例將無法與本實例進行通訊。"
|
blockedInstancesDescription: "請逐行輸入需要封鎖的實例。已封鎖的實例將無法與本實例進行通訊。"
|
||||||
muteAndBlock: "禁言 / 封鎖"
|
muteAndBlock: "靜音/封鎖"
|
||||||
mutedUsers: "已禁言用戶"
|
mutedUsers: "已靜音用戶"
|
||||||
blockedUsers: "已封鎖用戶"
|
blockedUsers: "已封鎖用戶"
|
||||||
noUsers: "無用戶"
|
noUsers: "無用戶"
|
||||||
editProfile: "編輯個人檔案"
|
editProfile: "編輯個人檔案"
|
||||||
@@ -212,6 +222,8 @@ imageUrl: "圖片URL"
|
|||||||
remove: "刪除"
|
remove: "刪除"
|
||||||
removed: "成功移除"
|
removed: "成功移除"
|
||||||
removeAreYouSure: "確定要刪掉「{x}」嗎?"
|
removeAreYouSure: "確定要刪掉「{x}」嗎?"
|
||||||
|
deleteAreYouSure: "確定要刪掉「{x}」嗎?"
|
||||||
|
resetAreYouSure: "確定要重設嗎?"
|
||||||
saved: "已保存"
|
saved: "已保存"
|
||||||
messaging: "傳送訊息"
|
messaging: "傳送訊息"
|
||||||
upload: "上傳"
|
upload: "上傳"
|
||||||
@@ -227,6 +239,7 @@ messageRead: "已讀"
|
|||||||
noMoreHistory: "沒有更多歷史紀錄"
|
noMoreHistory: "沒有更多歷史紀錄"
|
||||||
startMessaging: "開始傳送訊息"
|
startMessaging: "開始傳送訊息"
|
||||||
nUsersRead: "{n}人已讀"
|
nUsersRead: "{n}人已讀"
|
||||||
|
agreeTo: "我同意{0}"
|
||||||
tos: "使用條款"
|
tos: "使用條款"
|
||||||
start: "開始"
|
start: "開始"
|
||||||
home: "首頁"
|
home: "首頁"
|
||||||
@@ -287,7 +300,7 @@ tosUrl: "服務條款URL"
|
|||||||
thisYear: "今年"
|
thisYear: "今年"
|
||||||
thisMonth: "本月"
|
thisMonth: "本月"
|
||||||
today: "本日"
|
today: "本日"
|
||||||
dayX: "{day}天"
|
dayX: "{day}日"
|
||||||
monthX: "{month}月"
|
monthX: "{month}月"
|
||||||
yearX: "{year}年"
|
yearX: "{year}年"
|
||||||
pages: "頁面"
|
pages: "頁面"
|
||||||
@@ -310,6 +323,9 @@ bannerUrl: "橫幅圖片URL"
|
|||||||
basicInfo: "基本資訊"
|
basicInfo: "基本資訊"
|
||||||
pinnedUsers: "置頂用戶"
|
pinnedUsers: "置頂用戶"
|
||||||
pinnedUsersDescription: "在「發現」頁面中使用換行標記想要置頂的用戶。"
|
pinnedUsersDescription: "在「發現」頁面中使用換行標記想要置頂的用戶。"
|
||||||
|
pinnedPages: "釘選頁面"
|
||||||
|
pinnedPagesDescription: "輸入要固定至實例首頁的頁面路徑,以換行符分隔。"
|
||||||
|
pinnedNotes: "已置頂的貼文"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "啟用 hCaptcha"
|
enableHcaptcha: "啟用 hCaptcha"
|
||||||
hcaptchaSiteKey: "網站金鑰"
|
hcaptchaSiteKey: "網站金鑰"
|
||||||
@@ -327,6 +343,7 @@ antennaKeywords: "包含關鍵字"
|
|||||||
antennaExcludeKeywords: "排除關鍵字"
|
antennaExcludeKeywords: "排除關鍵字"
|
||||||
antennaKeywordsDescription: "用空格分隔指定AND、用換行符分隔指定OR"
|
antennaKeywordsDescription: "用空格分隔指定AND、用換行符分隔指定OR"
|
||||||
notifyAntenna: "通知我有新的貼文"
|
notifyAntenna: "通知我有新的貼文"
|
||||||
|
withFileAntenna: "僅帶有附件的箋文"
|
||||||
serviceworker: "ServiceWorker"
|
serviceworker: "ServiceWorker"
|
||||||
enableServiceworker: "開啟 ServiceWorker"
|
enableServiceworker: "開啟 ServiceWorker"
|
||||||
antennaUsersDescription: "指定用換行符分隔的用戶名"
|
antennaUsersDescription: "指定用換行符分隔的用戶名"
|
||||||
@@ -349,13 +366,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: "雙重身份驗證"
|
||||||
@@ -369,8 +379,6 @@ unregister: "刪除賬戶"
|
|||||||
passwordLessLogin: "設置無密碼登入"
|
passwordLessLogin: "設置無密碼登入"
|
||||||
resetPassword: "重置密碼"
|
resetPassword: "重置密碼"
|
||||||
newPasswordIs: "新密碼為「{password}」"
|
newPasswordIs: "新密碼為「{password}」"
|
||||||
autoNoteWatch: "自動追隨貼文"
|
|
||||||
autoNoteWatchDescription: "收到反應或回覆過的貼文的通知"
|
|
||||||
reduceUiAnimation: "減少介面的動態視覺"
|
reduceUiAnimation: "減少介面的動態視覺"
|
||||||
share: "分享"
|
share: "分享"
|
||||||
notFound: "找不到"
|
notFound: "找不到"
|
||||||
@@ -399,7 +407,7 @@ text: "文字"
|
|||||||
enable: "啟用"
|
enable: "啟用"
|
||||||
next: "下一步"
|
next: "下一步"
|
||||||
retype: "重新輸入"
|
retype: "重新輸入"
|
||||||
noteOf: "{user}的貼文"
|
noteOf: "{user}的箋文"
|
||||||
inviteToGroup: "邀請至群組"
|
inviteToGroup: "邀請至群組"
|
||||||
maxNoteTextLength: "貼文的字數限制"
|
maxNoteTextLength: "貼文的字數限制"
|
||||||
quoteAttached: "引用"
|
quoteAttached: "引用"
|
||||||
@@ -408,6 +416,7 @@ noMessagesYet: "沒有訊息"
|
|||||||
newMessageExists: "有新的訊息"
|
newMessageExists: "有新的訊息"
|
||||||
onlyOneFileCanBeAttached: "只能添加一個附件"
|
onlyOneFileCanBeAttached: "只能添加一個附件"
|
||||||
signinRequired: "請先登入"
|
signinRequired: "請先登入"
|
||||||
|
invitations: "邀請"
|
||||||
invitationCode: "邀請碼"
|
invitationCode: "邀請碼"
|
||||||
checking: "確認中"
|
checking: "確認中"
|
||||||
available: "可用的"
|
available: "可用的"
|
||||||
@@ -431,6 +440,7 @@ useOsNativeEmojis: "使用OS原生表情符號"
|
|||||||
youHaveNoGroups: "找不到群組"
|
youHaveNoGroups: "找不到群組"
|
||||||
joinOrCreateGroup: "請加入現有群組,或創建新群組。"
|
joinOrCreateGroup: "請加入現有群組,或創建新群組。"
|
||||||
noHistory: "沒有歷史紀錄"
|
noHistory: "沒有歷史紀錄"
|
||||||
|
signinHistory: "登錄歷史"
|
||||||
disableAnimatedMfm: "禁用MFM動畫"
|
disableAnimatedMfm: "禁用MFM動畫"
|
||||||
doing: "正在進行"
|
doing: "正在進行"
|
||||||
category: "類別"
|
category: "類別"
|
||||||
@@ -440,21 +450,42 @@ createAccount: "建立帳戶"
|
|||||||
existingAcount: "現有帳戶"
|
existingAcount: "現有帳戶"
|
||||||
regenerate: "再生"
|
regenerate: "再生"
|
||||||
fontSize: "字體大小"
|
fontSize: "字體大小"
|
||||||
|
noFollowRequests: "沒有要求跟隨您的申請"
|
||||||
openImageInNewTab: "於新分頁中開啟圖片"
|
openImageInNewTab: "於新分頁中開啟圖片"
|
||||||
|
dashboard: "儀表板"
|
||||||
local: "本地"
|
local: "本地"
|
||||||
remote: "遠端"
|
remote: "遠端"
|
||||||
total: "合計"
|
total: "合計"
|
||||||
|
weekOverWeekChanges: "與上週相比"
|
||||||
|
dayOverDayChanges: "與前一日相比"
|
||||||
appearance: "外觀"
|
appearance: "外觀"
|
||||||
accountSettings: "帳戶設置"
|
clientSettings: "用戶端設定"
|
||||||
|
accountSettings: "帳號設定"
|
||||||
|
promotion: "推廣貼文"
|
||||||
|
promote: "推廣"
|
||||||
|
numberOfDays: "有效天數"
|
||||||
|
hideThisNote: "隱藏此貼文"
|
||||||
|
showFeaturedNotesInTimeline: "在時間軸上顯示熱門推薦"
|
||||||
|
objectStorageBaseUrl: "Base URL"
|
||||||
|
objectStorageBucket: "儲存空間(Bucket)"
|
||||||
objectStoragePrefix: "前綴"
|
objectStoragePrefix: "前綴"
|
||||||
|
objectStorageEndpoint: "訪問網域名稱(Endpoint)"
|
||||||
|
objectStorageEndpointDesc: "如要使用AWS S3,請留空。否則請根據伺服器要求以'<host>'或 '<host>:<port>'的形式設定訪問網域名稱(Endpoint)。"
|
||||||
|
objectStorageRegion: "地域(Region)"
|
||||||
objectStorageUseSSL: "使用SSL"
|
objectStorageUseSSL: "使用SSL"
|
||||||
objectStorageUseProxy: "使用網路代理"
|
objectStorageUseProxy: "使用網路代理"
|
||||||
|
objectStorageSetPublicRead: "上載時設定為\"public-read\""
|
||||||
serverLogs: "伺服器日誌"
|
serverLogs: "伺服器日誌"
|
||||||
deleteAll: "刪除所有記錄"
|
deleteAll: "刪除所有記錄"
|
||||||
|
showFixedPostForm: "在時間線頂部顯示貼文表格"
|
||||||
|
newNoteRecived: "有新的箋文"
|
||||||
sounds: "音效"
|
sounds: "音效"
|
||||||
|
listen: "聆聽"
|
||||||
none: "無"
|
none: "無"
|
||||||
showInPage: "在頁面中顯示"
|
showInPage: "在頁面中顯示"
|
||||||
|
popout: "彈出型窗口"
|
||||||
volume: "音量"
|
volume: "音量"
|
||||||
|
masterVolume: "主音量"
|
||||||
details: "詳細資訊"
|
details: "詳細資訊"
|
||||||
chooseEmoji: "選擇您的表情符號\n"
|
chooseEmoji: "選擇您的表情符號\n"
|
||||||
unableToProcess: "操作無法完成"
|
unableToProcess: "操作無法完成"
|
||||||
@@ -472,10 +503,12 @@ descendingOrder: "降冪"
|
|||||||
scratchpad: "暫存記憶體"
|
scratchpad: "暫存記憶體"
|
||||||
output: "輸出"
|
output: "輸出"
|
||||||
script: "腳本"
|
script: "腳本"
|
||||||
|
disablePagesScript: "停用頁面的AiScript腳本"
|
||||||
updateRemoteUser: "更新非本地用戶資料"
|
updateRemoteUser: "更新非本地用戶資料"
|
||||||
deleteAllFiles: "刪除所有檔案"
|
deleteAllFiles: "刪除所有檔案"
|
||||||
deleteAllFilesConfirm: "要删除所有檔案吗?"
|
deleteAllFilesConfirm: "要删除所有檔案吗?"
|
||||||
removeAllFollowing: "解除所有追隨"
|
removeAllFollowing: "解除所有追隨"
|
||||||
|
removeAllFollowingDescription: "解除{host}所有的跟隨。在實例不再存在時執行。"
|
||||||
userSuspended: "該用戶已被凍結"
|
userSuspended: "該用戶已被凍結"
|
||||||
userSilenced: "該用戶已被禁言。"
|
userSilenced: "該用戶已被禁言。"
|
||||||
sidebar: "側邊列"
|
sidebar: "側邊列"
|
||||||
@@ -505,6 +538,12 @@ plugins: "插件"
|
|||||||
pluginInstallWarn: "請不要安裝來源不明的插件。"
|
pluginInstallWarn: "請不要安裝來源不明的插件。"
|
||||||
deck: "多欄模式"
|
deck: "多欄模式"
|
||||||
undeck: "取消多欄模式"
|
undeck: "取消多欄模式"
|
||||||
|
useBlurEffectForModal: "在模態框使用模糊效果"
|
||||||
|
width: "寬度"
|
||||||
|
height: "高度"
|
||||||
|
large: "大"
|
||||||
|
medium: "中"
|
||||||
|
small: "小"
|
||||||
permission: "權限"
|
permission: "權限"
|
||||||
enableAll: "啟用全部"
|
enableAll: "啟用全部"
|
||||||
disableAll: "停用全部"
|
disableAll: "停用全部"
|
||||||
@@ -512,24 +551,118 @@ tokenRequested: "允許訪問帳號"
|
|||||||
notificationType: "通知形式"
|
notificationType: "通知形式"
|
||||||
edit: "編輯"
|
edit: "編輯"
|
||||||
useStarForReactionFallback: "以★代替未知的表情符號"
|
useStarForReactionFallback: "以★代替未知的表情符號"
|
||||||
emailConfig: "電郵服務器設定"
|
emailConfig: "電子郵件伺服器設定"
|
||||||
enableEmail: "啟用發送電郵功能"
|
enableEmail: "啟用發送電郵功能"
|
||||||
emailConfigInfo: "用於確認電郵地址及密碼重置"
|
emailConfigInfo: "用於確認電郵地址及密碼重置"
|
||||||
email: "電郵地址"
|
email: "電子郵件"
|
||||||
smtpConfig: "SMTP服務器設定"
|
emailAddress: "電郵地址"
|
||||||
|
smtpConfig: "SMTP伺服器設定"
|
||||||
smtpHost: "主機"
|
smtpHost: "主機"
|
||||||
smtpPort: "端口"
|
smtpPort: "端口"
|
||||||
smtpUser: "使用名稱"
|
smtpUser: "使用者名稱"
|
||||||
smtpPass: "密碼"
|
smtpPass: "密碼"
|
||||||
|
emptyToDisableSmtpAuth: "留空使用者名稱和密碼以禁用SMTP驗證。"
|
||||||
|
testEmail: "郵件測試發送"
|
||||||
|
wordMute: "靜音文字"
|
||||||
|
userSaysSomething: "{name}說了什麼"
|
||||||
|
makeActive: "啟用"
|
||||||
display: "檢視"
|
display: "檢視"
|
||||||
copy: "複製"
|
copy: "複製"
|
||||||
metrics: "指標"
|
metrics: "指標"
|
||||||
|
overview: "概覽"
|
||||||
logs: "日誌"
|
logs: "日誌"
|
||||||
delayed: "延遲"
|
delayed: "延遲"
|
||||||
database: "資料庫"
|
database: "資料庫"
|
||||||
channel: "頻道"
|
channel: "頻道"
|
||||||
create: "新增"
|
create: "新增"
|
||||||
notificationSetting: "管理通知"
|
notificationSetting: "通知設定"
|
||||||
|
notificationSettingDesc: "選擇顯示通知的類型"
|
||||||
|
useGlobalSetting: "使用全域設定"
|
||||||
|
other: "其他"
|
||||||
|
regenerateLoginTokenDescription: "再生用於登入的內部權杖。一般情況下是不需要這樣做的。一旦再生,所有裝置將會被登出。"
|
||||||
|
fileIdOrUrl: "文檔ID或者URL"
|
||||||
|
chatOpenBehavior: "開啟聊天窗口時的行為"
|
||||||
|
behavior: "行為"
|
||||||
|
sample: "範例 "
|
||||||
|
abuseReports: "檢舉"
|
||||||
|
reportAbuse: "檢舉"
|
||||||
|
reportAbuseOf: "檢舉{name}"
|
||||||
|
fillAbuseReportDescription: "請填寫檢舉的詳細理由。可以的話,請附上針對的URL網址。"
|
||||||
|
abuseReported: "內容已經發送。感謝您的報告。"
|
||||||
|
send: "發送"
|
||||||
|
abuseMarkAsResolved: "處理完畢"
|
||||||
|
openInNewTab: "在新分頁中開啟"
|
||||||
|
openInSideView: "在側欄中開啟"
|
||||||
|
instanceTicker: "箋文的實例資訊"
|
||||||
|
random: "隨機"
|
||||||
|
system: "系統"
|
||||||
|
switchUi: "切換界面"
|
||||||
|
optional: "可選"
|
||||||
|
public: "公開"
|
||||||
|
notesCount: "箋文數量"
|
||||||
|
repliesCount: "回覆數量\n"
|
||||||
|
renotesCount: "轉發數量"
|
||||||
|
repliedCount: "回覆數量"
|
||||||
|
yes: "確定"
|
||||||
|
no: "取消"
|
||||||
|
driveFilesCount: "雲端硬碟檔案數量"
|
||||||
|
driveUsage: "雲端硬碟使用量"
|
||||||
|
noCrawleDescription: "請求網路搜尋引擎不要索引你的個人資料頁、箋文及頁面等。"
|
||||||
|
lockedAccountInfo: "即使你通過了追隨者請求,除非你將筆記的公開範圍設定為 「追隨者」,否則任何人都能看見你的箋文。"
|
||||||
|
notSet: "未設定"
|
||||||
|
noteFavoritesCount: "收藏箋文的數目"
|
||||||
|
pageLikesCount: "頁面被喜歡次數"
|
||||||
|
pageLikedCount: "頁面被喜歡次數"
|
||||||
|
contact: "聯絡人"
|
||||||
|
clips: "標籤"
|
||||||
|
experimentalFeatures: "測試中的功能"
|
||||||
|
developer: "開發者"
|
||||||
|
showGapBetweenNotesInTimeline: "分開顯示時間線上的箋文。"
|
||||||
|
left: "左"
|
||||||
|
wide: "寬"
|
||||||
|
narrow: "窄"
|
||||||
|
reloadToApplySetting: "設定將會在頁面重新載入之後生效。要現在就重載頁面嗎?"
|
||||||
|
_aboutMisskey:
|
||||||
|
about: "Misskey是由syuilo於2014年開發的開源軟件。"
|
||||||
|
contributors: "主要貢獻者"
|
||||||
|
allContributors: "全體貢獻人員"
|
||||||
|
source: "原始碼"
|
||||||
|
translation: "翻譯Misskey"
|
||||||
|
donate: "捐贈給Misskey"
|
||||||
|
morePatrons: "感謝你們的支持、 幫助。 🥰"
|
||||||
|
patrons: "贊助者"
|
||||||
|
_nsfw:
|
||||||
|
respect: "隱藏NSFW內容"
|
||||||
|
ignore: "不隱藏NSFW內容"
|
||||||
|
force: "隱藏所有內容"
|
||||||
|
_mfm:
|
||||||
|
mention: "提及"
|
||||||
|
hashtag: "#tag"
|
||||||
|
url: "URL"
|
||||||
|
link: "鏈接"
|
||||||
|
bold: "粗體"
|
||||||
|
center: "置中"
|
||||||
|
quote: "引用"
|
||||||
|
emoji: "自訂表情符號"
|
||||||
|
search: "搜尋"
|
||||||
|
_reversi:
|
||||||
|
reversi: "黑白棋"
|
||||||
|
gameSettings: "對弈設定"
|
||||||
|
chooseBoard: "選擇棋盤"
|
||||||
|
rules: "規則"
|
||||||
|
botSettings: "機器人設定"
|
||||||
|
opponentTurn: "對手回合"
|
||||||
|
myTurn: "你的回合"
|
||||||
|
turnOf: "{name}的回合"
|
||||||
|
pastTurnOf: "{name}的回合"
|
||||||
|
surrender: "認輸"
|
||||||
|
black: "黑"
|
||||||
|
white: "白"
|
||||||
|
total: "合計"
|
||||||
|
ended: "已結束"
|
||||||
|
playing: "正在對弈"
|
||||||
|
_instanceTicker:
|
||||||
|
always: "總是顯示"
|
||||||
_serverDisconnectedBehavior:
|
_serverDisconnectedBehavior:
|
||||||
reload: "自動重載"
|
reload: "自動重載"
|
||||||
dialog: "以對話框警告"
|
dialog: "以對話框警告"
|
||||||
@@ -537,7 +670,7 @@ _serverDisconnectedBehavior:
|
|||||||
_channel:
|
_channel:
|
||||||
create: "建立頻道"
|
create: "建立頻道"
|
||||||
edit: "編輯頻道"
|
edit: "編輯頻道"
|
||||||
setBanner: "設置封面圖"
|
setBanner: "設定橫幅"
|
||||||
removeBanner: "移除封面圖"
|
removeBanner: "移除封面圖"
|
||||||
featured: "流行"
|
featured: "流行"
|
||||||
owned: "管理中"
|
owned: "管理中"
|
||||||
@@ -549,19 +682,34 @@ _sidebar:
|
|||||||
hide: "隱藏"
|
hide: "隱藏"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "加入靜音文字"
|
muteWords: "加入靜音文字"
|
||||||
|
softDescription: "隱藏時間軸中指定條件的箋文。"
|
||||||
|
mutedNotes: "已靜音的箋文"
|
||||||
_theme:
|
_theme:
|
||||||
|
constant: "常數"
|
||||||
|
defaultValue: "預設值"
|
||||||
color: "顏色"
|
color: "顏色"
|
||||||
func: "函数"
|
func: "函数"
|
||||||
|
argument: "引數"
|
||||||
|
alpha: "透明度"
|
||||||
|
darken: "暗度"
|
||||||
|
lighten: "亮度"
|
||||||
keys:
|
keys:
|
||||||
bg: "背景"
|
bg: "背景"
|
||||||
|
fg: "文本"
|
||||||
|
shadow: "陰影"
|
||||||
|
link: "鏈接"
|
||||||
|
hashtag: "#tag"
|
||||||
mention: "提及"
|
mention: "提及"
|
||||||
|
mentionMe: "提及我"
|
||||||
renote: "轉發貼文"
|
renote: "轉發貼文"
|
||||||
divider: "分割線"
|
divider: "分割線"
|
||||||
infoBg: "資訊背景"
|
infoBg: "資訊背景"
|
||||||
infoFg: "資訊內容"
|
infoFg: "資訊內容"
|
||||||
|
infoWarnBg: "警告背景"
|
||||||
|
infoWarnFg: "警告字元"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "貼文"
|
note: "箋文"
|
||||||
noteMy: "我的貼文"
|
noteMy: "我的箋文"
|
||||||
notification: "通知"
|
notification: "通知"
|
||||||
chat: "傳送訊息"
|
chat: "傳送訊息"
|
||||||
channel: "頻道通知"
|
channel: "頻道通知"
|
||||||
@@ -580,7 +728,7 @@ _time:
|
|||||||
second: "秒"
|
second: "秒"
|
||||||
minute: "分鐘"
|
minute: "分鐘"
|
||||||
hour: "小時"
|
hour: "小時"
|
||||||
day: "天"
|
day: "日"
|
||||||
_tutorial:
|
_tutorial:
|
||||||
title: "Misskey使用方法"
|
title: "Misskey使用方法"
|
||||||
step1_1: "歡迎!"
|
step1_1: "歡迎!"
|
||||||
@@ -593,8 +741,9 @@ _tutorial:
|
|||||||
step3_3: "輸入完內容後,按視窗右上角的按鈕來發文"
|
step3_3: "輸入完內容後,按視窗右上角的按鈕來發文"
|
||||||
step3_4: "不知道該寫什麼內容嗎?試試看「開始使用Misskey了」如何。"
|
step3_4: "不知道該寫什麼內容嗎?試試看「開始使用Misskey了」如何。"
|
||||||
step4_1: "筆記發出去了嗎?"
|
step4_1: "筆記發出去了嗎?"
|
||||||
step4_2: "如果你的貼文有顯示在時間軸上,就代表已經發文成功。"
|
step4_2: "如果你的箋文出現在時間軸上,就代表發文成功。"
|
||||||
step5_1: "現在試試看追隨其他人來讓你的時間軸變得更生動吧。"
|
step5_1: "現在試試看追隨其他人來讓你的時間軸變得更生動吧。"
|
||||||
|
step5_2: "你可以在{featured}上看到受歡迎的貼文,你也可以選擇從列表中追隨你喜歡的人,或者在{explore}上找到熱門使用者。"
|
||||||
step5_3: "想要追隨其他人,只要點擊他們的頭像並按「追隨」即可。"
|
step5_3: "想要追隨其他人,只要點擊他們的頭像並按「追隨」即可。"
|
||||||
step5_4: "如果使用者的名字旁有鎖頭的圖示,代表他們需要手動核准你的追隨請求。"
|
step5_4: "如果使用者的名字旁有鎖頭的圖示,代表他們需要手動核准你的追隨請求。"
|
||||||
step6_1: "現在你可以在時間軸上看到其他用戶的貼文"
|
step6_1: "現在你可以在時間軸上看到其他用戶的貼文"
|
||||||
@@ -602,6 +751,8 @@ _tutorial:
|
|||||||
step6_3: "在他人的貼文按下「+」的圖示即可選擇想要的表情符號來進行「反應」。"
|
step6_3: "在他人的貼文按下「+」的圖示即可選擇想要的表情符號來進行「反應」。"
|
||||||
step7_1: "以上為Misskey的基本操作說明,教學在此告一段落。辛苦了。"
|
step7_1: "以上為Misskey的基本操作說明,教學在此告一段落。辛苦了。"
|
||||||
step7_2: "歡迎到{help}來瞭解更多Misskey相關介紹。"
|
step7_2: "歡迎到{help}來瞭解更多Misskey相關介紹。"
|
||||||
|
_2fa:
|
||||||
|
registerDevice: "註冊裝置"
|
||||||
_permissions:
|
_permissions:
|
||||||
"read:blocks": "已封鎖用戶名單"
|
"read:blocks": "已封鎖用戶名單"
|
||||||
"write:blocks": "編輯已封鎖用戶名單"
|
"write:blocks": "編輯已封鎖用戶名單"
|
||||||
@@ -610,15 +761,32 @@ _permissions:
|
|||||||
"read:favorites": "瀏覽已收藏"
|
"read:favorites": "瀏覽已收藏"
|
||||||
"write:favorites": "編輯收藏清單"
|
"write:favorites": "編輯收藏清單"
|
||||||
"write:following": "追隨/解除追隨"
|
"write:following": "追隨/解除追隨"
|
||||||
"write:notes": "撰寫或刪除貼文"
|
"read:messaging": "顯示訊息"
|
||||||
|
"write:messaging": "撰寫或刪除私人訊息"
|
||||||
|
"read:mutes": "顯示已靜音列表"
|
||||||
|
"write:mutes": "編輯已靜音列表"
|
||||||
|
"write:notes": "撰寫或刪除箋文"
|
||||||
"read:notifications": "查看通知"
|
"read:notifications": "查看通知"
|
||||||
|
"write:notifications": "編輯通知"
|
||||||
"read:reactions": "查看反應"
|
"read:reactions": "查看反應"
|
||||||
"write:reactions": "編輯反應"
|
"write:reactions": "編輯反應"
|
||||||
"write:votes": "投票"
|
"write:votes": "投票"
|
||||||
|
"read:pages": "顯示頁面"
|
||||||
|
"write:pages": "編輯頁面"
|
||||||
|
"read:page-likes": "顯示頁面的已喜歡"
|
||||||
|
"write:page-likes": "編輯頁面上喜歡"
|
||||||
|
"read:user-groups": "顯示使用者群組"
|
||||||
|
"write:user-groups": "編輯使用者群組"
|
||||||
"read:channels": "已查看的頻道"
|
"read:channels": "已查看的頻道"
|
||||||
"write:channels": "操作頻道"
|
"write:channels": "編輯頻道"
|
||||||
|
_auth:
|
||||||
|
shareAccess: "要授權「“{name}”」存取您的帳戶嗎?"
|
||||||
_antennaSources:
|
_antennaSources:
|
||||||
all: "全部貼文"
|
all: "全部箋文"
|
||||||
|
homeTimeline: "來自已追隨使用者的箋文"
|
||||||
|
users: "來自特定使用者的箋文"
|
||||||
|
userList: "來自特定清單中的箋文"
|
||||||
|
userGroup: "來自特定群組的箋文"
|
||||||
_weekday:
|
_weekday:
|
||||||
sunday: "週日"
|
sunday: "週日"
|
||||||
monday: "週一"
|
monday: "週一"
|
||||||
@@ -639,6 +807,7 @@ _widgets:
|
|||||||
photos: "照片"
|
photos: "照片"
|
||||||
digitalClock: "電子時鐘"
|
digitalClock: "電子時鐘"
|
||||||
federation: "聯邦宇宙"
|
federation: "聯邦宇宙"
|
||||||
|
button: "按鈕"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "隱藏"
|
hide: "隱藏"
|
||||||
show: "瀏覽更多"
|
show: "瀏覽更多"
|
||||||
@@ -648,68 +817,238 @@ _poll:
|
|||||||
noOnlyOneChoice: "至少需要兩個選項。"
|
noOnlyOneChoice: "至少需要兩個選項。"
|
||||||
expiration: "期限"
|
expiration: "期限"
|
||||||
infinite: "無期限"
|
infinite: "無期限"
|
||||||
|
at: "結束時間"
|
||||||
deadlineDate: "截止日期"
|
deadlineDate: "截止日期"
|
||||||
deadlineTime: "小時"
|
deadlineTime: "小時"
|
||||||
|
duration: "時長"
|
||||||
votesCount: "{n}票"
|
votesCount: "{n}票"
|
||||||
totalVotes: "一共{n}票"
|
totalVotes: "一共{n}票"
|
||||||
vote: "投票"
|
vote: "投票"
|
||||||
showResult: "顯示結果"
|
showResult: "顯示結果"
|
||||||
voted: "已投票"
|
voted: "已投票"
|
||||||
closed: "已結束"
|
closed: "已結束"
|
||||||
|
remainingDays: "{d}天{h}小時後結束"
|
||||||
_visibility:
|
_visibility:
|
||||||
|
public: "公開"
|
||||||
home: "首頁"
|
home: "首頁"
|
||||||
followers: "追隨者"
|
followers: "追隨者"
|
||||||
|
specified: "指定使用者"
|
||||||
|
specifiedDescription: "僅發送至指定使用者"
|
||||||
localOnly: "僅限本地"
|
localOnly: "僅限本地"
|
||||||
|
localOnlyDescription: "對遠端使用者隱藏"
|
||||||
_postForm:
|
_postForm:
|
||||||
|
replyPlaceholder: "回覆此箋文..."
|
||||||
|
quotePlaceholder: "引用此貼文..."
|
||||||
channelPlaceholder: "發佈到頻道"
|
channelPlaceholder: "發佈到頻道"
|
||||||
|
_placeholders:
|
||||||
|
a: "今天過得如何?"
|
||||||
|
b: "有什麼新鮮事嗎?"
|
||||||
|
c: "有什麼新鮮想法嗎?"
|
||||||
|
d: "想要發布些什麼嗎?"
|
||||||
|
e: "寫些什麼吧..."
|
||||||
|
f: "期待你發佈的內容..."
|
||||||
_profile:
|
_profile:
|
||||||
name: "名稱"
|
name: "名稱"
|
||||||
username: "使用名稱"
|
username: "使用者名稱"
|
||||||
|
description: "關於我"
|
||||||
|
youCanIncludeHashtags: "你也可以在「關於我」中加上 #tag"
|
||||||
metadataLabel: "標籤"
|
metadataLabel: "標籤"
|
||||||
metadataContent: "内容"
|
metadataContent: "内容"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "全部貼文"
|
allNotes: "全部箋文"
|
||||||
followingList: "追隨中"
|
followingList: "追隨中"
|
||||||
muteList: "消音"
|
muteList: "靜音"
|
||||||
blockingList: "封鎖"
|
blockingList: "封鎖"
|
||||||
userLists: "清單"
|
userLists: "清單"
|
||||||
_charts:
|
_charts:
|
||||||
remoteNotesIncDec: "非本地貼文的數目增减"
|
usersIncDec: "使用者増減"
|
||||||
|
usersTotal: "使用者合共"
|
||||||
|
activeUsers: "活躍使用者"
|
||||||
|
notesIncDec: "箋文増減"
|
||||||
|
localNotesIncDec: "本地箋文増減"
|
||||||
|
remoteNotesIncDec: "遠端箋文數目增减"
|
||||||
|
notesTotal: "箋文合共"
|
||||||
|
filesIncDec: "檔案増減"
|
||||||
|
filesTotal: "累計檔案"
|
||||||
|
storageUsageIncDec: "儲存空間的増減"
|
||||||
|
storageUsageTotal: "已使用的儲存空間合共"
|
||||||
_instanceCharts:
|
_instanceCharts:
|
||||||
|
requests: "請求"
|
||||||
|
users: "使用者増減"
|
||||||
|
usersTotal: "總計使用者"
|
||||||
|
notes: "箋文増減"
|
||||||
|
notesTotal: "累計箋文"
|
||||||
|
ff: "追隨/追隨者的増減"
|
||||||
|
ffTotal: "追隨/追隨者累計"
|
||||||
cacheSize: "增加或減少快取用量"
|
cacheSize: "增加或減少快取用量"
|
||||||
cacheSizeTotal: "快取大小總計"
|
cacheSizeTotal: "快取大小總計"
|
||||||
|
files: "檔案數量的増減"
|
||||||
|
filesTotal: "檔案數量總計"
|
||||||
_timelines:
|
_timelines:
|
||||||
home: "首頁"
|
home: "首頁"
|
||||||
|
local: "本地"
|
||||||
|
social: "社群"
|
||||||
|
global: "全域"
|
||||||
_rooms:
|
_rooms:
|
||||||
|
roomOf: "{user}的房間"
|
||||||
|
addFurniture: "擺放家具"
|
||||||
|
translate: "移動 "
|
||||||
|
rotate: "旋轉"
|
||||||
|
exit: "返回"
|
||||||
|
remove: "移除"
|
||||||
|
clear: "全部移除"
|
||||||
|
clearConfirm: "確定要移除全部家具嗎?"
|
||||||
|
leaveConfirm: "修改未儲存,是否要離開?"
|
||||||
|
chooseImage: "選擇圖像"
|
||||||
|
roomType: "房間種類"
|
||||||
|
carpetColor: "地板顏色"
|
||||||
_roomType:
|
_roomType:
|
||||||
default: "預設"
|
default: "預設"
|
||||||
|
washitsu: "和室"
|
||||||
_furnitures:
|
_furnitures:
|
||||||
|
milk: "牛奶盒"
|
||||||
|
bed: "床"
|
||||||
|
low-table: "咖啡桌"
|
||||||
|
desk: "書桌"
|
||||||
|
chair: "椅子"
|
||||||
|
chair2: "椅子2"
|
||||||
|
fan: "通風機"
|
||||||
|
pc: "電腦"
|
||||||
|
plant: "觀葉植物"
|
||||||
|
plant2: "觀葉植物2"
|
||||||
|
eraser: "橡皮擦"
|
||||||
|
pencil: "鉛筆"
|
||||||
|
pudding: "布丁"
|
||||||
|
cardboard-box: "紙板箱"
|
||||||
|
cardboard-box2: "紙板箱2"
|
||||||
|
cardboard-box3: "紙板箱3"
|
||||||
|
book: "讀物"
|
||||||
|
book2: "讀物2"
|
||||||
|
piano: "鋼琴"
|
||||||
|
moon: "月亮"
|
||||||
|
corkboard: "木栓板"
|
||||||
|
mousepad: "滑鼠墊"
|
||||||
monitor: "監視器"
|
monitor: "監視器"
|
||||||
keyboard: "鍵盤"
|
keyboard: "鍵盤"
|
||||||
|
carpet-stripe: "條紋地毯"
|
||||||
|
bin: "垃圾箱"
|
||||||
|
cup-noodle: "杯面"
|
||||||
|
holo-display: "投影機"
|
||||||
|
energy-drink: "能量飲料"
|
||||||
|
doll-ai: "小藍的人偶公仔"
|
||||||
|
banknote: "大疊鈔票"
|
||||||
_pages:
|
_pages:
|
||||||
|
newPage: "建立頁面"
|
||||||
|
editPage: "編輯頁面"
|
||||||
|
readPage: "正檢視原始碼"
|
||||||
|
created: "頁面已建立"
|
||||||
|
updated: "頁面已更新"
|
||||||
deleted: "頁面已被刪除"
|
deleted: "頁面已被刪除"
|
||||||
|
pageSetting: "頁面設定"
|
||||||
|
nameAlreadyExists: "指定的頁面URL已經存在"
|
||||||
|
invalidNameTitle: "指定的頁面URL無效"
|
||||||
|
invalidNameText: "請確定是否為非空白"
|
||||||
|
editThisPage: "編輯此頁面"
|
||||||
|
viewSource: "檢視原始碼"
|
||||||
|
viewPage: "顯示頁面"
|
||||||
like: "喜歡"
|
like: "喜歡"
|
||||||
unlike: "收回喜歡"
|
unlike: "收回喜歡"
|
||||||
|
my: "我的頁面"
|
||||||
|
liked: "已喜歡的頁面"
|
||||||
|
featured: "人氣"
|
||||||
|
inspector: "面板檢查"
|
||||||
|
contents: "內容"
|
||||||
|
content: "頁面方塊"
|
||||||
|
variables: "變數"
|
||||||
|
title: "標題"
|
||||||
|
url: "頁面網址"
|
||||||
|
summary: "頁面摘要"
|
||||||
|
alignCenter: "置中"
|
||||||
|
hideTitleWhenPinned: "被置頂於個人資料時隱藏頁面標題"
|
||||||
|
font: "字型"
|
||||||
|
fontSerif: "襯線體"
|
||||||
|
fontSansSerif: "無襯線體"
|
||||||
|
eyeCatchingImageSet: "設定封面影像"
|
||||||
|
eyeCatchingImageRemove: "刪除封面影像"
|
||||||
|
chooseBlock: "新增方塊"
|
||||||
|
selectType: "選擇類型"
|
||||||
|
enterVariableName: "請輸入變數名稱"
|
||||||
|
variableNameIsAlreadyUsed: "變數名稱已被佔用"
|
||||||
|
contentBlocks: "內容"
|
||||||
|
inputBlocks: "輸入"
|
||||||
|
specialBlocks: "特殊"
|
||||||
blocks:
|
blocks:
|
||||||
|
text: "文本"
|
||||||
|
textarea: "文字區域"
|
||||||
|
section: "區段"
|
||||||
image: "圖片"
|
image: "圖片"
|
||||||
|
button: "按鈕"
|
||||||
|
if: "如果"
|
||||||
|
_if:
|
||||||
|
variable: "變數"
|
||||||
_post:
|
_post:
|
||||||
text: "内容"
|
text: "内容"
|
||||||
|
canvasId: "畫布ID"
|
||||||
|
textInput: "插入文字"
|
||||||
|
_textInput:
|
||||||
|
name: "變數名稱"
|
||||||
|
text: "標題"
|
||||||
|
default: "預設值"
|
||||||
|
textareaInput: "多行文字输入"
|
||||||
_textareaInput:
|
_textareaInput:
|
||||||
name: "變數名稱"
|
name: "變數名稱"
|
||||||
|
text: "標題"
|
||||||
|
default: "預設值"
|
||||||
numberInput: "輸入數值"
|
numberInput: "輸入數值"
|
||||||
_numberInput:
|
_numberInput:
|
||||||
name: "變數名稱"
|
name: "變數名稱"
|
||||||
_canvas:
|
|
||||||
width: "寬度"
|
|
||||||
_counter:
|
|
||||||
text: "標題"
|
text: "標題"
|
||||||
|
default: "預設值"
|
||||||
|
canvas: "畫布"
|
||||||
|
_canvas:
|
||||||
|
id: "畫布ID"
|
||||||
|
width: "寬度"
|
||||||
|
height: "高度"
|
||||||
|
note: "嵌式箋文"
|
||||||
|
_note:
|
||||||
|
id: "箋文ID"
|
||||||
|
detailed: "顯示詳細內容"
|
||||||
|
switch: "開關"
|
||||||
|
_switch:
|
||||||
|
name: "變數名稱"
|
||||||
|
text: "標題"
|
||||||
|
default: "預設值"
|
||||||
|
counter: "計數器"
|
||||||
|
_counter:
|
||||||
|
name: "變數名稱"
|
||||||
|
text: "標題"
|
||||||
|
inc: "増加値"
|
||||||
_button:
|
_button:
|
||||||
text: "標題"
|
text: "標題"
|
||||||
|
colored: "彩色"
|
||||||
|
action: "按下按鈕後發生的行為"
|
||||||
_action:
|
_action:
|
||||||
_dialog:
|
_dialog:
|
||||||
content: "内容"
|
content: "内容"
|
||||||
|
resetRandom: "重設亂數"
|
||||||
|
pushEvent: "發送事件"
|
||||||
|
_pushEvent:
|
||||||
|
event: "事件名稱"
|
||||||
|
no-variable: "沒有"
|
||||||
|
callAiScript: "調用AiScript"
|
||||||
|
_callAiScript:
|
||||||
|
functionName: "函數名稱"
|
||||||
|
radioButton: "選項"
|
||||||
|
_radioButton:
|
||||||
|
name: "變數名稱"
|
||||||
|
title: "標題"
|
||||||
|
default: "預設值"
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
|
logical: "邏輯運算"
|
||||||
|
operation: "計算"
|
||||||
|
comparison: "對比"
|
||||||
|
random: "隨機"
|
||||||
value: "數值 "
|
value: "數值 "
|
||||||
fn: "函数"
|
fn: "函数"
|
||||||
text: "文本操作"
|
text: "文本操作"
|
||||||
@@ -719,6 +1058,8 @@ _pages:
|
|||||||
text: "文本"
|
text: "文本"
|
||||||
multiLineText: "文本 (多行)"
|
multiLineText: "文本 (多行)"
|
||||||
textList: "文本列表"
|
textList: "文本列表"
|
||||||
|
_strLen:
|
||||||
|
arg1: "文本"
|
||||||
_strPick:
|
_strPick:
|
||||||
arg1: "文本"
|
arg1: "文本"
|
||||||
arg2: "字元位置"
|
arg2: "字元位置"
|
||||||
@@ -732,18 +1073,22 @@ _pages:
|
|||||||
_add:
|
_add:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
|
subtract: "减去"
|
||||||
_subtract:
|
_subtract:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
|
multiply: "乘"
|
||||||
_multiply:
|
_multiply:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
|
divide: "除"
|
||||||
_divide:
|
_divide:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
_mod:
|
_mod:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
|
round: "四舍五入"
|
||||||
_round:
|
_round:
|
||||||
arg1: "數值"
|
arg1: "數值"
|
||||||
eq: "A和B相等"
|
eq: "A和B相等"
|
||||||
@@ -785,6 +1130,7 @@ _pages:
|
|||||||
not: "否"
|
not: "否"
|
||||||
_not:
|
_not:
|
||||||
arg1: "否"
|
arg1: "否"
|
||||||
|
random: "隨機"
|
||||||
_random:
|
_random:
|
||||||
arg1: "機率"
|
arg1: "機率"
|
||||||
rannum: "亂數"
|
rannum: "亂數"
|
||||||
@@ -827,6 +1173,8 @@ _pages:
|
|||||||
arg1: "文字"
|
arg1: "文字"
|
||||||
_numberToString:
|
_numberToString:
|
||||||
arg1: "數值"
|
arg1: "數值"
|
||||||
|
_splitStrByLine:
|
||||||
|
arg1: "文本"
|
||||||
ref: "變數"
|
ref: "變數"
|
||||||
aiScriptVar: "AiScript的變數"
|
aiScriptVar: "AiScript的變數"
|
||||||
fn: "函数"
|
fn: "函数"
|
||||||
@@ -842,6 +1190,7 @@ _pages:
|
|||||||
array: "清單"
|
array: "清單"
|
||||||
stringArray: "文本列表"
|
stringArray: "文本列表"
|
||||||
enviromentVariables: "環境變數"
|
enviromentVariables: "環境變數"
|
||||||
|
pageVariables: "頁面元素"
|
||||||
_relayStatus:
|
_relayStatus:
|
||||||
requesting: "等待核准"
|
requesting: "等待核准"
|
||||||
accepted: "已通過核准"
|
accepted: "已通過核准"
|
||||||
@@ -853,15 +1202,31 @@ _notification:
|
|||||||
yourFollowRequestAccepted: "您的追隨請求已通過"
|
yourFollowRequestAccepted: "您的追隨請求已通過"
|
||||||
youWereInvitedToGroup: "您有新的群組邀請"
|
youWereInvitedToGroup: "您有新的群組邀請"
|
||||||
_types:
|
_types:
|
||||||
|
all: "全部 "
|
||||||
follow: "追隨中"
|
follow: "追隨中"
|
||||||
mention: "提及"
|
mention: "提及"
|
||||||
|
reply: "回覆"
|
||||||
renote: "轉發貼文"
|
renote: "轉發貼文"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
reaction: "反應"
|
reaction: "反應"
|
||||||
|
receiveFollowRequest: "已收到追隨請求"
|
||||||
|
followRequestAccepted: "追隨請求已接受"
|
||||||
|
app: "應用程式通知"
|
||||||
_deck:
|
_deck:
|
||||||
|
alwaysShowMainColumn: "總是顯示主欄"
|
||||||
|
columnAlign: "對齊欄位"
|
||||||
|
addColumn: "新增欄位"
|
||||||
|
swapLeft: "向左移動"
|
||||||
|
swapRight: "向右移動"
|
||||||
|
swapUp: "往上移動"
|
||||||
|
swapDown: "往下移動"
|
||||||
|
stackLeft: "向左折疊"
|
||||||
|
popRight: "向右彈出"
|
||||||
_columns:
|
_columns:
|
||||||
|
widgets: "小工具"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
tl: "時間軸"
|
tl: "時間軸"
|
||||||
antenna: "天線"
|
antenna: "天線"
|
||||||
list: "清單"
|
list: "清單"
|
||||||
mentions: "提及"
|
mentions: "提及"
|
||||||
|
direct: "指定使用者"
|
||||||
|
|||||||
14
migration/1603776877564-instance-theme-color.ts
Normal file
14
migration/1603776877564-instance-theme-color.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class instanceThemeColor1603776877564 implements MigrationInterface {
|
||||||
|
name = 'instanceThemeColor1603776877564'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "instance" ADD "themeColor" character varying(64) DEFAULT null`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "themeColor"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
14
migration/1603781553011-instance-favicon.ts
Normal file
14
migration/1603781553011-instance-favicon.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class instanceFavicon1603781553011 implements MigrationInterface {
|
||||||
|
name = 'instanceFavicon1603781553011'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "instance" ADD "faviconUrl" character varying(256) DEFAULT null`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "faviconUrl"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
14
migration/1604821689616-delete-auto-watch.ts
Normal file
14
migration/1604821689616-delete-auto-watch.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class deleteAutoWatch1604821689616 implements MigrationInterface {
|
||||||
|
name = 'deleteAutoWatch1604821689616'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "autoWatch"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD "autoWatch" boolean NOT NULL DEFAULT false`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
15
migration/1605408848373-clip-description.ts
Normal file
15
migration/1605408848373-clip-description.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class clipDescription1605408848373 implements MigrationInterface {
|
||||||
|
name = 'clipDescription1605408848373'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "clip" ADD "description" character varying(2048) DEFAULT null`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
|
||||||
|
await queryRunner.query(`ALTER TABLE "clip" DROP COLUMN "description"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
434
migration/1605408971051-comments.ts
Normal file
434
migration/1605408971051-comments.ts
Normal file
@@ -0,0 +1,434 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class comments1605408971051 implements MigrationInterface {
|
||||||
|
name = 'comments1605408971051'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "log"."createdAt" IS 'The created date of the Log.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_folder"."createdAt" IS 'The created date of the DriveFolder.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_folder"."name" IS 'The name of the DriveFolder.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_folder"."userId" IS 'The owner ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_folder"."parentId" IS 'The parent folder ID. If null, it means the DriveFolder is located in root.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."createdAt" IS 'The created date of the DriveFile.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."userId" IS 'The owner ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."userHost" IS 'The host of owner. It will be null if the user in local.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."md5" IS 'The MD5 hash of the DriveFile.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."name" IS 'The file name of the DriveFile.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."type" IS 'The content type (MIME) of the DriveFile.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."size" IS 'The file size (bytes) of the DriveFile.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."comment" IS 'The comment of the DriveFile.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."blurhash" IS 'The BlurHash string.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."properties" IS 'The any properties of the DriveFile. For example, it includes image width/height.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."url" IS 'The URL of the DriveFile.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."thumbnailUrl" IS 'The URL of the thumbnail of the DriveFile.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."webpublicUrl" IS 'The URL of the webpublic of the DriveFile.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."uri" IS 'The URI of the DriveFile. it will be null when the DriveFile is local.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."folderId" IS 'The parent folder ID. If null, it means the DriveFile is located in root.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."isSensitive" IS 'Whether the DriveFile is NSFW.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."isLink" IS 'Whether the DriveFile is direct link to remote server.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."createdAt" IS 'The created date of the User.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."updatedAt" IS 'The updated date of the User.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."username" IS 'The username of the User.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."usernameLower" IS 'The username (lowercased) of the User.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."name" IS 'The name of the User.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."followersCount" IS 'The count of followers.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."followingCount" IS 'The count of following.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."notesCount" IS 'The count of notes.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."avatarId" IS 'The ID of avatar DriveFile.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."bannerId" IS 'The ID of banner DriveFile.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isSuspended" IS 'Whether the User is suspended.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isSilenced" IS 'Whether the User is silenced.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isLocked" IS 'Whether the User is locked.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isBot" IS 'Whether the User is a bot.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isCat" IS 'Whether the User is a cat.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isAdmin" IS 'Whether the User is the admin.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isModerator" IS 'Whether the User is a moderator.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."host" IS 'The host of the User. It will be null if the origin of the user is local.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."inbox" IS 'The inbox URL of the User. It will be null if the origin of the user is local.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."sharedInbox" IS 'The sharedInbox URL of the User. It will be null if the origin of the user is local.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."featured" IS 'The featured URL of the User. It will be null if the origin of the user is local.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."uri" IS 'The URI of the User. It will be null if the origin of the user is local.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."token" IS 'The native access token of the User. It will be null if the origin of the user is local.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "app"."createdAt" IS 'The created date of the App.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "app"."userId" IS 'The owner ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "app"."secret" IS 'The secret key of the App.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "app"."name" IS 'The name of the App.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "app"."description" IS 'The description of the App.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "app"."permission" IS 'The permission of the App.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "app"."callbackUrl" IS 'The callbackUrl of the App.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "access_token"."createdAt" IS 'The created date of the AccessToken.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "access_token"."lastUsedAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "access_token"."session" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "access_token"."appId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "access_token"."name" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "access_token"."description" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "access_token"."iconUrl" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel"."createdAt" IS 'The created date of the Channel.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel"."userId" IS 'The owner ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel"."name" IS 'The name of the Channel.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel"."description" IS 'The description of the Channel.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel"."bannerId" IS 'The ID of banner Channel.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel"."notesCount" IS 'The count of notes.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel"."usersCount" IS 'The count of users.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."createdAt" IS 'The created date of the Note.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."replyId" IS 'The ID of reply target.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."renoteId" IS 'The ID of renote target.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."userId" IS 'The ID of author.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."uri" IS 'The URI of a note. it will be null when the note is local.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."url" IS 'The human readable url of a note. it will be null when the note is local.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."channelId" IS 'The ID of source channel.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."userHost" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."replyUserId" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."replyUserHost" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."renoteUserId" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."renoteUserHost" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "poll_vote"."createdAt" IS 'The created date of the PollVote.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_reaction"."createdAt" IS 'The created date of the NoteReaction.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_watching"."createdAt" IS 'The created date of the NoteWatching.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_watching"."userId" IS 'The watcher ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_watching"."noteId" IS 'The target Note ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_watching"."noteUserId" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_unread"."noteUserId" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_unread"."noteChannelId" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."createdAt" IS 'The created date of the FollowRequest.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followeeId" IS 'The followee user ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followerId" IS 'The follower user ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."requestId" IS 'id of Follow Activity.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followerHost" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followerInbox" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followerSharedInbox" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followeeHost" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followeeInbox" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followeeSharedInbox" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group"."createdAt" IS 'The created date of the UserGroup.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group"."userId" IS 'The ID of owner.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group_invitation"."createdAt" IS 'The created date of the UserGroupInvitation.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group_invitation"."userId" IS 'The user ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group_invitation"."userGroupId" IS 'The group ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "notification"."createdAt" IS 'The created date of the Notification.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "notification"."notifieeId" IS 'The ID of recipient user of the Notification.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "notification"."isRead" IS 'Whether the Notification is read.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "meta"."localDriveCapacityMb" IS 'Drive capacity of a local user (MB)'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "meta"."remoteDriveCapacityMb" IS 'Drive capacity of a remote user (MB)'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "meta"."maxNoteTextLength" IS 'Max allowed note text length in characters'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."createdAt" IS 'The created date of the Following.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followeeId" IS 'The followee user ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followerId" IS 'The follower user ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followerHost" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followerInbox" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followerSharedInbox" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followeeHost" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followeeInbox" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followeeSharedInbox" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."caughtAt" IS 'The caught date of the Instance.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."host" IS 'The host of the Instance.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."usersCount" IS 'The count of the users of the Instance.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."notesCount" IS 'The count of the notes of the Instance.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."softwareName" IS 'The software of the Instance.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."softwareVersion" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."openRegistrations" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."name" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."description" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."maintainerName" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."maintainerEmail" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."iconUrl" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."faviconUrl" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."themeColor" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "muting"."createdAt" IS 'The created date of the Muting.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "muting"."muteeId" IS 'The mutee user ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "muting"."muterId" IS 'The muter user ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "blocking"."createdAt" IS 'The created date of the Blocking.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "blocking"."blockeeId" IS 'The blockee user ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "blocking"."blockerId" IS 'The blocker user ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_list"."createdAt" IS 'The created date of the UserList.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_list"."userId" IS 'The owner ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_list"."name" IS 'The name of the UserList.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_list_joining"."createdAt" IS 'The created date of the UserListJoining.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_list_joining"."userId" IS 'The user ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_list_joining"."userListId" IS 'The list ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group_joining"."createdAt" IS 'The created date of the UserGroupJoining.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group_joining"."userId" IS 'The user ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group_joining"."userGroupId" IS 'The group ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_favorite"."createdAt" IS 'The created date of the NoteFavorite.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "abuse_user_report"."createdAt" IS 'The created date of the AbuseUserReport.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "abuse_user_report"."targetUserHost" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "abuse_user_report"."reporterHost" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "messaging_message"."createdAt" IS 'The created date of the MessagingMessage.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "messaging_message"."userId" IS 'The sender user ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "messaging_message"."groupId" IS 'The recipient group ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "signin"."createdAt" IS 'The created date of the Signin.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "auth_session"."createdAt" IS 'The created date of the AuthSession.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "reversi_game"."createdAt" IS 'The created date of the ReversiGame.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "reversi_game"."startedAt" IS 'The started date of the ReversiGame.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "reversi_game"."form1" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "reversi_game"."form2" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "reversi_matching"."createdAt" IS 'The created date of the ReversiMatching.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_note_pining"."createdAt" IS 'The created date of the UserNotePinings.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "poll"."noteId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "poll"."noteVisibility" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "poll"."userId" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "poll"."userHost" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_keypair"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_publickey"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "page"."createdAt" IS 'The created date of the Page.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "page"."updatedAt" IS 'The updated date of the Page.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "page"."userId" IS 'The ID of author.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."location" IS 'The location of the User.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."birthday" IS 'The birthday (YYYY-MM-DD) of the User.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."description" IS 'The description (bio) of the User.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."url" IS 'Remote URL of the user.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."email" IS 'The email address of the User.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."password" IS 'The password hash of the User. It will be null if the origin of the user is local.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."clientData" IS 'The client-specific data of the User.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."room" IS 'The room data of the User.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."userHost" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_security_key"."id" IS 'Variable-length id given to navigator.credentials.get()'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_security_key"."publicKey" IS 'Variable-length public key used to verify attestations (hex-encoded).'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_security_key"."lastUsed" IS 'The date of the last time the UserSecurityKey was successfully validated.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_security_key"."name" IS 'User-defined name for this key'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "attestation_challenge"."challenge" IS 'Hex-encoded sha256 hash of the challenge.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "attestation_challenge"."createdAt" IS 'The date challenge was created for expiry purposes.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "attestation_challenge"."registrationChallenge" IS 'Indicates that the challenge is only for registration purposes if true to prevent the challenge for being used as authentication.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "moderation_log"."createdAt" IS 'The created date of the ModerationLog.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "announcement"."createdAt" IS 'The created date of the Announcement.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "announcement"."updatedAt" IS 'The updated date of the Announcement.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "announcement_read"."createdAt" IS 'The created date of the AnnouncementRead.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "clip"."createdAt" IS 'The created date of the Clip.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "clip"."userId" IS 'The owner ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "clip"."name" IS 'The name of the Clip.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "clip"."description" IS 'The description of the Clip.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "clip_note"."noteId" IS 'The note ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "clip_note"."clipId" IS 'The clip ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "antenna"."createdAt" IS 'The created date of the Antenna.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "antenna"."userId" IS 'The owner ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "antenna"."name" IS 'The name of the Antenna.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "antenna_note"."noteId" IS 'The note ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "antenna_note"."antennaId" IS 'The antenna ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "promo_note"."noteId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "promo_note"."userId" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "promo_read"."createdAt" IS 'The created date of the PromoRead.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "muted_note"."noteId" IS 'The note ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "muted_note"."userId" IS 'The user ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "muted_note"."reason" IS 'The reason of the MutedNote.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel_following"."createdAt" IS 'The created date of the ChannelFollowing.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel_following"."followeeId" IS 'The followee channel ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel_following"."followerId" IS 'The follower user ID.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel_note_pining"."createdAt" IS 'The created date of the ChannelNotePining.'`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel_note_pining"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel_following"."followerId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel_following"."followeeId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel_following"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "muted_note"."reason" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "muted_note"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "muted_note"."noteId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "promo_read"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "promo_note"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "promo_note"."noteId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "antenna_note"."antennaId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "antenna_note"."noteId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "antenna"."name" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "antenna"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "antenna"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "clip_note"."clipId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "clip_note"."noteId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "clip"."description" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "clip"."name" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "clip"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "clip"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "announcement_read"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "announcement"."updatedAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "announcement"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "moderation_log"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "attestation_challenge"."registrationChallenge" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "attestation_challenge"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "attestation_challenge"."challenge" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_security_key"."name" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_security_key"."lastUsed" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_security_key"."publicKey" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_security_key"."id" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."userHost" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."room" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."clientData" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."password" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."email" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."url" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."description" IS 'The description (bio) of the User.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."birthday" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."location" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "page"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "page"."updatedAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "page"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_publickey"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_keypair"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "poll"."userHost" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "poll"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "poll"."noteVisibility" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "poll"."noteId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_note_pining"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "reversi_matching"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "reversi_game"."form2" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "reversi_game"."form1" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "reversi_game"."startedAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "reversi_game"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "auth_session"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "signin"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "messaging_message"."groupId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "messaging_message"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "messaging_message"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "abuse_user_report"."reporterHost" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "abuse_user_report"."targetUserHost" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "abuse_user_report"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_favorite"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group_joining"."userGroupId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group_joining"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group_joining"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_list_joining"."userListId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_list_joining"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_list_joining"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_list"."name" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_list"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_list"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "blocking"."blockerId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "blocking"."blockeeId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "blocking"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "muting"."muterId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "muting"."muteeId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "muting"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."themeColor" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."faviconUrl" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."iconUrl" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."maintainerEmail" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."maintainerName" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."description" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."name" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."openRegistrations" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."softwareVersion" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."softwareName" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."notesCount" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."usersCount" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."host" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "instance"."caughtAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followeeSharedInbox" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followeeInbox" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followeeHost" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followerSharedInbox" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followerInbox" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followerHost" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followerId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."followeeId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "following"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "meta"."maxNoteTextLength" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "meta"."remoteDriveCapacityMb" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "meta"."localDriveCapacityMb" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "notification"."isRead" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "notification"."notifieeId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "notification"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group_invitation"."userGroupId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group_invitation"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group_invitation"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_group"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followeeSharedInbox" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followeeInbox" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followeeHost" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followerSharedInbox" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followerInbox" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followerHost" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."requestId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followerId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."followeeId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "follow_request"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_unread"."noteChannelId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_unread"."noteUserId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_watching"."noteUserId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_watching"."noteId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_watching"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_watching"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note_reaction"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "poll_vote"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."renoteUserHost" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."renoteUserId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."replyUserHost" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."replyUserId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."userHost" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."channelId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."url" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."uri" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."renoteId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."replyId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "note"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel"."usersCount" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel"."notesCount" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel"."bannerId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel"."description" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel"."name" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "channel"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "access_token"."iconUrl" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "access_token"."description" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "access_token"."name" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "access_token"."appId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "access_token"."session" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "access_token"."lastUsedAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "access_token"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "app"."callbackUrl" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "app"."permission" IS 'The permission of the App.'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "app"."description" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "app"."name" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "app"."secret" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "app"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "app"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."token" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."uri" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."featured" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."sharedInbox" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."inbox" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."host" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isModerator" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isAdmin" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isCat" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isBot" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isLocked" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isSilenced" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isSuspended" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."bannerId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."avatarId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."notesCount" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."followingCount" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."followersCount" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."name" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."usernameLower" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."username" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."updatedAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."isLink" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."isSensitive" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."folderId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."uri" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."webpublicUrl" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."thumbnailUrl" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."url" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."properties" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."blurhash" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."comment" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."size" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."type" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."name" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."md5" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."userHost" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_file"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_folder"."parentId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_folder"."userId" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_folder"."name" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "drive_folder"."createdAt" IS NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "log"."createdAt" IS NULL`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
14
migration/1605585339718-instance-pinned-pages.ts
Normal file
14
migration/1605585339718-instance-pinned-pages.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class instancePinnedPages1605585339718 implements MigrationInterface {
|
||||||
|
name = 'instancePinnedPages1605585339718'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
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> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "pinnedPages"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
16
migration/1605965516823-instance-images.ts
Normal file
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
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
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
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"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
135
package.json
135
package.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
||||||
"version": "12.50.0",
|
"version": "12.65.0",
|
||||||
"codename": "indigo",
|
"codename": "indigo",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -35,20 +35,20 @@
|
|||||||
"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",
|
||||||
"@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 +59,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,80 +70,82 @@
|
|||||||
"@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/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.22",
|
"@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.4.0",
|
"@typescript-eslint/parser": "4.10.0",
|
||||||
"@vue/compiler-sfc": "3.0.2",
|
"@vue/compiler-sfc": "3.0.3",
|
||||||
"abort-controller": "3.0.0",
|
"abort-controller": "3.0.0",
|
||||||
"apexcharts": "3.22.0",
|
"apexcharts": "3.22.3",
|
||||||
"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.770.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.0",
|
"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.3",
|
"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.6.5",
|
"core-js": "3.8.1",
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "5.0.0",
|
"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.11.0",
|
"eslint": "7.16.0",
|
||||||
"eslint-plugin-vue": "7.1.0",
|
"eslint-plugin-vue": "7.3.0",
|
||||||
"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.0",
|
"file-type": "16.0.1",
|
||||||
"fluent-ffmpeg": "2.1.2",
|
"fluent-ffmpeg": "2.1.2",
|
||||||
"glob": "7.1.6",
|
"glob": "7.1.6",
|
||||||
"got": "11.7.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": "1.4.0",
|
"gulp-terser": "2.0.0",
|
||||||
"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",
|
||||||
@@ -152,7 +154,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",
|
||||||
@@ -175,25 +176,26 @@
|
|||||||
"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",
|
||||||
"mocha": "8.1.3",
|
"matter-js": "0.14.2",
|
||||||
|
"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.13",
|
"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.1",
|
"pg": "8.5.1",
|
||||||
"portscanner": "2.2.0",
|
"portscanner": "2.2.0",
|
||||||
"postcss": "8.1.3",
|
"postcss": "8.2.1",
|
||||||
"postcss-loader": "4.0.4",
|
"postcss-loader": "4.1.0",
|
||||||
"prismjs": "1.22.0",
|
"prismjs": "1.22.0",
|
||||||
"probe-image-size": "5.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",
|
||||||
"pug": "2.0.4",
|
"pug": "2.0.4",
|
||||||
@@ -215,8 +217,8 @@
|
|||||||
"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.27.0",
|
"sass": "1.29.0",
|
||||||
"sass-loader": "10.0.4",
|
"sass-loader": "10.1.0",
|
||||||
"seedrandom": "3.0.5",
|
"seedrandom": "3.0.5",
|
||||||
"sharp": "0.26.2",
|
"sharp": "0.26.2",
|
||||||
"speakeasy": "2.0.0",
|
"speakeasy": "2.0.0",
|
||||||
@@ -224,45 +226,42 @@
|
|||||||
"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.27.10",
|
"systeminformation": "4.31.1",
|
||||||
"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",
|
||||||
"tinycolor2": "1.4.2",
|
"tinycolor2": "1.4.2",
|
||||||
"tmp": "0.2.1",
|
"tmp": "0.2.1",
|
||||||
"ts-loader": "8.0.6",
|
"ts-loader": "8.0.11",
|
||||||
"ts-node": "9.0.0",
|
"ts-node": "9.1.0",
|
||||||
"tslint": "6.1.3",
|
"tslint": "6.1.3",
|
||||||
"tslint-sonarts": "1.9.0",
|
"tslint-sonarts": "1.9.0",
|
||||||
"typeorm": "0.2.28",
|
"typeorm": "0.2.29",
|
||||||
"typescript": "4.0.3",
|
"typescript": "4.1.2",
|
||||||
"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": "3.0.3",
|
||||||
"vue-color": "2.7.1",
|
"vue-color": "2.7.1",
|
||||||
"vue-draggable-next": "1.0.8",
|
"vue-json-pretty": "1.7.1",
|
||||||
"vue-i18n": "9.0.0-beta.6",
|
"vue-loader": "16.0.0",
|
||||||
"vue-json-pretty": "1.7.0",
|
"vue-prism-editor": "2.0.0-alpha.2",
|
||||||
"vue-loader": "16.0.0-beta.8",
|
"vue-router": "4.0.1",
|
||||||
"vue-prism-editor": "1.2.2",
|
|
||||||
"vue-router": "4.0.0-beta.13",
|
|
||||||
"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-beta.4",
|
|
||||||
"vuex-persistedstate": "3.1.0",
|
|
||||||
"web-push": "3.4.4",
|
"web-push": "3.4.4",
|
||||||
"webpack": "5.2.0",
|
"webpack": "5.10.1",
|
||||||
"webpack-cli": "4.1.0",
|
"webpack-cli": "4.3.0",
|
||||||
"websocket": "1.0.32",
|
"websocket": "1.0.33",
|
||||||
"ws": "7.3.1",
|
"ws": "7.4.1",
|
||||||
"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
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
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
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>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
86
src/client/account.ts
Normal file
86
src/client/account.ts
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
import { reactive } from 'vue';
|
||||||
|
import { apiUrl } from '@/config';
|
||||||
|
import { waiting } from '@/os';
|
||||||
|
|
||||||
|
// TODO: 他のタブと永続化されたstateを同期
|
||||||
|
|
||||||
|
type Account = {
|
||||||
|
id: string;
|
||||||
|
token: string;
|
||||||
|
clientData: Record<string, any>;
|
||||||
|
};
|
||||||
|
|
||||||
|
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/sounds/syuilo/kick.mp3
Normal file
BIN
src/client/assets/sounds/syuilo/kick.mp3
Normal file
Binary file not shown.
BIN
src/client/assets/sounds/syuilo/snare.mp3
Normal file
BIN
src/client/assets/sounds/syuilo/snare.mp3
Normal file
Binary file not shown.
@@ -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>
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, markRaw } from 'vue';
|
||||||
import { emojilist } from '../../misc/emojilist';
|
import { emojilist } from '../../misc/emojilist';
|
||||||
import contains from '@/scripts/contains';
|
import contains from '@/scripts/contains';
|
||||||
import { twemojiSvgBase } from '../../misc/twemoji-base';
|
import { twemojiSvgBase } from '../../misc/twemoji-base';
|
||||||
@@ -122,22 +122,12 @@ export default defineComponent({
|
|||||||
users: [],
|
users: [],
|
||||||
hashtags: [],
|
hashtags: [],
|
||||||
emojis: [],
|
emojis: [],
|
||||||
|
items: [],
|
||||||
select: -1,
|
select: -1,
|
||||||
emojilist,
|
|
||||||
emojiDb: [] as EmojiDef[]
|
emojiDb: [] as EmojiDef[]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
|
||||||
items(): HTMLCollection {
|
|
||||||
return (this.$refs.suggests as Element).children;
|
|
||||||
},
|
|
||||||
|
|
||||||
useOsNativeEmojis(): boolean {
|
|
||||||
return this.$store.state.device.useOsNativeEmojis;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
showing() {
|
showing() {
|
||||||
if (!this.showing) {
|
if (!this.showing) {
|
||||||
@@ -148,13 +138,14 @@ export default defineComponent({
|
|||||||
|
|
||||||
updated() {
|
updated() {
|
||||||
this.setPosition();
|
this.setPosition();
|
||||||
|
this.items = (this.$refs.suggests as Element | undefined)?.children || [];
|
||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
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) {
|
||||||
@@ -180,7 +171,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
emojiDefinitions.sort((a, b) => a.name.length - b.name.length);
|
emojiDefinitions.sort((a, b) => a.name.length - b.name.length);
|
||||||
|
|
||||||
this.emojiDb = emojiDefinitions.concat(emjdb);
|
this.emojiDb = markRaw(emojiDefinitions.concat(emjdb));
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
this.textarea.addEventListener('keydown', this.onKeydown);
|
this.textarea.addEventListener('keydown', this.onKeydown);
|
||||||
@@ -371,6 +362,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
selectNext() {
|
selectNext() {
|
||||||
if (++this.select >= this.items.length) this.select = 0;
|
if (++this.select >= this.items.length) this.select = 0;
|
||||||
|
if (this.items.length === 0) this.select = -1;
|
||||||
this.applySelect();
|
this.applySelect();
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -384,8 +376,10 @@ export default defineComponent({
|
|||||||
el.removeAttribute('data-selected');
|
el.removeAttribute('data-selected');
|
||||||
}
|
}
|
||||||
|
|
||||||
this.items[this.select].setAttribute('data-selected', 'true');
|
if (this.select !== -1) {
|
||||||
(this.items[this.select] as any).focus();
|
this.items[this.select].setAttribute('data-selected', 'true');
|
||||||
|
(this.items[this.select] as any).focus();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
chooseUser() {
|
chooseUser() {
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -1,24 +1,24 @@
|
|||||||
<template>
|
<template>
|
||||||
<MkA :to="`/channels/${channel.id}`" class="eftoefju _panel" tabindex="-1">
|
<MkA :to="`/channels/${channel.id}`" class="eftoefju _panel" tabindex="-1">
|
||||||
<div class="banner" v-if="channel.bannerUrl" :style="`background-image: url('${channel.bannerUrl}')`">
|
<div class="banner" :style="bannerStyle">
|
||||||
<div class="fade"></div>
|
<div class="fade"></div>
|
||||||
<div class="name"><Fa :icon="faSatelliteDish"/> {{ channel.name }}</div>
|
<div class="name"><Fa :icon="faSatelliteDish"/> {{ channel.name }}</div>
|
||||||
<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>
|
||||||
@@ -45,6 +45,16 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
bannerStyle() {
|
||||||
|
if (this.channel.bannerUrl) {
|
||||||
|
return { backgroundImage: `url(${this.channel.bannerUrl})` };
|
||||||
|
} else {
|
||||||
|
return { backgroundColor: '#4c5e6d' };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
faSatelliteDish, faUsers, faPencilAlt,
|
faSatelliteDish, faUsers, faPencilAlt,
|
||||||
|
|||||||
@@ -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];
|
||||||
|
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;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<div class="icon" v-if="icon">
|
<div class="icon" v-if="icon">
|
||||||
<Fa :icon="icon"/>
|
<Fa :icon="icon"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="icon" v-else-if="!input && !select && !user" :class="type">
|
<div class="icon" v-else-if="!input && !select" :class="type">
|
||||||
<Fa :icon="faCheck" v-if="type === 'success'"/>
|
<Fa :icon="faCheck" v-if="type === 'success'"/>
|
||||||
<Fa :icon="faTimesCircle" v-if="type === 'error'"/>
|
<Fa :icon="faTimesCircle" v-if="type === 'error'"/>
|
||||||
<Fa :icon="faExclamationTriangle" v-if="type === 'warning'"/>
|
<Fa :icon="faExclamationTriangle" v-if="type === 'warning'"/>
|
||||||
@@ -12,11 +12,9 @@
|
|||||||
<Fa :icon="faQuestionCircle" v-if="type === 'question'"/>
|
<Fa :icon="faQuestionCircle" v-if="type === 'question'"/>
|
||||||
<Fa :icon="faSpinner" pulse v-if="type === 'waiting'"/>
|
<Fa :icon="faSpinner" pulse v-if="type === 'waiting'"/>
|
||||||
</div>
|
</div>
|
||||||
<header v-if="title" v-html="title"></header>
|
<header v-if="title"><Mfm :text="title"/></header>
|
||||||
<header v-if="title == null && user">{{ $t('enterUsername') }}</header>
|
<div class="body" v-if="text"><Mfm :text="text"/></div>
|
||||||
<div class="body" v-if="text" v-html="text"></div>
|
|
||||||
<MkInput v-if="input" v-model:value="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></MkInput>
|
<MkInput v-if="input" v-model:value="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></MkInput>
|
||||||
<MkInput v-if="user" v-model:value="userInputValue" autofocus @keydown="onInputKeydown"><template #prefix>@</template></MkInput>
|
|
||||||
<MkSelect v-if="select" v-model:value="selectedValue" autofocus>
|
<MkSelect v-if="select" v-model:value="selectedValue" autofocus>
|
||||||
<template v-if="select.items">
|
<template v-if="select.items">
|
||||||
<option v-for="item in select.items" :value="item.value">{{ item.text }}</option>
|
<option v-for="item in select.items" :value="item.value">{{ item.text }}</option>
|
||||||
@@ -28,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 && !user" :disabled="!canOk">{{ (showCancelButton || input || select || user) ? $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 || user">{{ $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>
|
||||||
@@ -46,8 +44,6 @@ import MkModal from '@/components/ui/modal.vue';
|
|||||||
import MkButton from '@/components/ui/button.vue';
|
import MkButton from '@/components/ui/button.vue';
|
||||||
import MkInput from '@/components/ui/input.vue';
|
import MkInput from '@/components/ui/input.vue';
|
||||||
import MkSelect from '@/components/ui/select.vue';
|
import MkSelect from '@/components/ui/select.vue';
|
||||||
import parseAcct from '../../misc/acct/parse';
|
|
||||||
import * as os from '@/os';
|
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
@@ -77,9 +73,6 @@ export default defineComponent({
|
|||||||
select: {
|
select: {
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
user: {
|
|
||||||
required: false
|
|
||||||
},
|
|
||||||
icon: {
|
icon: {
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
@@ -105,28 +98,12 @@ export default defineComponent({
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
inputValue: this.input && this.input.default ? this.input.default : null,
|
inputValue: this.input && this.input.default ? this.input.default : null,
|
||||||
userInputValue: null,
|
|
||||||
selectedValue: this.select ? this.select.default ? this.select.default : this.select.items ? this.select.items[0].value : this.select.groupedItems[0].items[0].value : null,
|
selectedValue: this.select ? this.select.default ? this.select.default : this.select.items ? this.select.items[0].value : this.select.groupedItems[0].items[0].value : null,
|
||||||
canOk: true,
|
|
||||||
faTimesCircle, faQuestionCircle, faSpinner, faInfoCircle, faExclamationTriangle, faCheck
|
faTimesCircle, faQuestionCircle, faSpinner, faInfoCircle, faExclamationTriangle, faCheck
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
watch: {
|
|
||||||
userInputValue() {
|
|
||||||
if (this.user) {
|
|
||||||
os.api('users/show', parseAcct(this.userInputValue)).then(u => {
|
|
||||||
this.canOk = u != null;
|
|
||||||
}).catch(() => {
|
|
||||||
this.canOk = false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.user) this.canOk = false;
|
|
||||||
|
|
||||||
document.addEventListener('keydown', this.onKeydown);
|
document.addEventListener('keydown', this.onKeydown);
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -141,21 +118,13 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
async ok() {
|
async ok() {
|
||||||
if (!this.canOk) return;
|
|
||||||
if (!this.showOkButton) return;
|
if (!this.showOkButton) return;
|
||||||
|
|
||||||
if (this.user) {
|
const result =
|
||||||
const user = await os.api('users/show', parseAcct(this.userInputValue));
|
this.input ? this.inputValue :
|
||||||
if (user) {
|
this.select ? this.selectedValue :
|
||||||
this.done(false, user);
|
true;
|
||||||
}
|
this.done(false, result);
|
||||||
} else {
|
|
||||||
const result =
|
|
||||||
this.input ? this.inputValue :
|
|
||||||
this.select ? this.selectedValue :
|
|
||||||
true;
|
|
||||||
this.done(false, result);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
cancel() {
|
cancel() {
|
||||||
@@ -200,15 +169,15 @@ export default defineComponent({
|
|||||||
font-size: 32px;
|
font-size: 32px;
|
||||||
|
|
||||||
&.success {
|
&.success {
|
||||||
color: var(--accent);
|
color: var(--success);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.error {
|
&.error {
|
||||||
color: #ec4137;
|
color: var(--error);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.warning {
|
&.warning {
|
||||||
color: #ecb637;
|
color: var(--warn);
|
||||||
}
|
}
|
||||||
|
|
||||||
> * {
|
> * {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
70
src/client/components/drive-select-dialog.vue
Normal file
70
src/client/components/drive-select-dialog.vue
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
<template>
|
||||||
|
<XModalWindow ref="dialog"
|
||||||
|
:width="800"
|
||||||
|
:height="500"
|
||||||
|
:with-ok-button="true"
|
||||||
|
:ok-button-disabled="(type === 'file') && (selected.length === 0)"
|
||||||
|
@click="cancel()"
|
||||||
|
@close="cancel()"
|
||||||
|
@ok="ok()"
|
||||||
|
@closed="$emit('closed')"
|
||||||
|
>
|
||||||
|
<template #header>
|
||||||
|
{{ 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>
|
||||||
|
</template>
|
||||||
|
<XDrive :multiple="multiple" @changeSelection="onChangeSelection" @selected="ok()" :select="type"/>
|
||||||
|
</XModalWindow>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import XDrive from './drive.vue';
|
||||||
|
import XModalWindow from '@/components/ui/modal-window.vue';
|
||||||
|
import number from '@/filters/number';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
components: {
|
||||||
|
XDrive,
|
||||||
|
XModalWindow,
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: 'file'
|
||||||
|
},
|
||||||
|
multiple: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
emits: ['done', 'closed'],
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
selected: []
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
ok() {
|
||||||
|
this.$emit('done', this.selected);
|
||||||
|
this.$refs.dialog.close();
|
||||||
|
},
|
||||||
|
|
||||||
|
cancel() {
|
||||||
|
this.$emit('done');
|
||||||
|
this.$refs.dialog.close();
|
||||||
|
},
|
||||||
|
|
||||||
|
onChangeSelection(xs) {
|
||||||
|
this.selected = xs;
|
||||||
|
},
|
||||||
|
|
||||||
|
number
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -1,72 +1,44 @@
|
|||||||
<template>
|
<template>
|
||||||
<XModalWindow ref="dialog"
|
<XWindow ref="window"
|
||||||
:width="800"
|
:initial-width="800"
|
||||||
:height="500"
|
:initial-height="500"
|
||||||
:with-ok-button="true"
|
:can-resize="true"
|
||||||
:ok-button-disabled="(type === 'file') && (selected.length === 0)"
|
|
||||||
@click="cancel()"
|
|
||||||
@close="cancel()"
|
|
||||||
@ok="ok()"
|
|
||||||
@closed="$emit('closed')"
|
@closed="$emit('closed')"
|
||||||
>
|
>
|
||||||
<template #header>
|
<template #header>
|
||||||
{{ multiple ? ((type === 'file') ? $t('selectFiles') : $t('selectFolders')) : ((type === 'file') ? $t('selectFile') : $t('selectFolder')) }}
|
{{ $ts.drive }}
|
||||||
<span v-if="selected.length > 0" style="margin-left: 8px; opacity: 0.5;">({{ number(selected.length) }})</span>
|
|
||||||
</template>
|
</template>
|
||||||
<div>
|
<XDrive :initial-folder="initialFolder"/>
|
||||||
<XDrive :multiple="multiple" @changeSelection="onChangeSelection" @selected="ok()" :select="type"/>
|
</XWindow>
|
||||||
</div>
|
|
||||||
</XModalWindow>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import XDrive from './drive.vue';
|
import XDrive from './drive.vue';
|
||||||
import XModalWindow from '@/components/ui/modal-window.vue';
|
import XWindow from '@/components/ui/window.vue';
|
||||||
import number from '@/filters/number';
|
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
XDrive,
|
XDrive,
|
||||||
XModalWindow,
|
XWindow,
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
type: {
|
initialFolder: {
|
||||||
type: String,
|
type: Object,
|
||||||
required: false,
|
required: false
|
||||||
default: 'file'
|
|
||||||
},
|
},
|
||||||
multiple: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
emits: ['done', 'closed'],
|
emits: ['closed'],
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
selected: []
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
ok() {
|
|
||||||
this.$emit('done', this.selected);
|
|
||||||
this.$refs.dialog.close();
|
|
||||||
},
|
|
||||||
|
|
||||||
cancel() {
|
|
||||||
this.$emit('done');
|
|
||||||
this.$refs.dialog.close();
|
|
||||||
},
|
|
||||||
|
|
||||||
onChangeSelection(xs) {
|
|
||||||
this.selected = xs;
|
|
||||||
},
|
|
||||||
|
|
||||||
number
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -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"/>
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
<div class="rghtznwe"
|
<div class="rghtznwe"
|
||||||
:class="{ draghover }"
|
:class="{ draghover }"
|
||||||
@click="onClick"
|
@click="onClick"
|
||||||
|
@contextmenu.stop="onContextmenu"
|
||||||
@mouseover="onMouseover"
|
@mouseover="onMouseover"
|
||||||
@mouseout="onMouseout"
|
@mouseout="onMouseout"
|
||||||
@dragover.prevent.stop="onDragover"
|
@dragover.prevent.stop="onDragover"
|
||||||
@@ -18,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>
|
||||||
@@ -27,8 +28,9 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import { faFolder, faFolderOpen } from '@fortawesome/free-regular-svg-icons';
|
import { faFolder, faFolderOpen, faTrashAlt, faWindowRestore } from '@fortawesome/free-regular-svg-icons';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { faICursor } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
@@ -153,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
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -193,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 }) => {
|
||||||
@@ -211,35 +213,51 @@ 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) {
|
||||||
|
os.contextMenu([{
|
||||||
|
text: this.$ts.openInWindow,
|
||||||
|
icon: faWindowRestore,
|
||||||
|
action: () => {
|
||||||
|
os.popup(import('./drive-window.vue'), {
|
||||||
|
initialFolder: this.folder
|
||||||
|
}, {
|
||||||
|
}, 'closed');
|
||||||
|
}
|
||||||
|
}, null, {
|
||||||
|
text: this.$ts.rename,
|
||||||
|
icon: faICursor,
|
||||||
|
action: this.rename
|
||||||
|
}, null, {
|
||||||
|
text: this.$ts.delete,
|
||||||
|
icon: faTrashAlt,
|
||||||
|
danger: true,
|
||||||
|
action: this.deleteFolder
|
||||||
|
}], e);
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -24,18 +24,18 @@
|
|||||||
<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"/>
|
||||||
@@ -64,7 +64,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
initFolder: {
|
initialFolder: {
|
||||||
type: Object,
|
type: Object,
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
@@ -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)
|
||||||
});
|
});
|
||||||
@@ -151,15 +151,15 @@ export default defineComponent({
|
|||||||
this.connection.on('folderUpdated', this.onStreamDriveFolderUpdated);
|
this.connection.on('folderUpdated', this.onStreamDriveFolderUpdated);
|
||||||
this.connection.on('folderDeleted', this.onStreamDriveFolderDeleted);
|
this.connection.on('folderDeleted', this.onStreamDriveFolderDeleted);
|
||||||
|
|
||||||
if (this.initFolder) {
|
if (this.initialFolder) {
|
||||||
this.move(this.initFolder);
|
this.move(this.initialFolder);
|
||||||
} else {
|
} else {
|
||||||
this.fetch();
|
this.fetch();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
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(); }
|
||||||
}];
|
}];
|
||||||
@@ -639,6 +639,10 @@ export default defineComponent({
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.yfudmmck {
|
.yfudmmck {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
> nav {
|
> nav {
|
||||||
display: block;
|
display: block;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
@@ -698,6 +702,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
> .main {
|
> .main {
|
||||||
|
flex: 1;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
|
||||||
&, * {
|
&, * {
|
||||||
|
|||||||
@@ -1,75 +1,106 @@
|
|||||||
<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">
|
<div class="omfetrab _popup" :class="['w' + width, 'h' + height, { big }]">
|
||||||
<header>
|
<input ref="search" class="search" :class="{ filled: q != null && q != '' }" v-model.trim="q" :placeholder="$ts.search" @paste.stop="paste" @keyup.enter="done()">
|
||||||
<button v-for="(category, i) in categories"
|
|
||||||
class="_button"
|
|
||||||
@click="go(category)"
|
|
||||||
:class="{ active: category.isActive }"
|
|
||||||
:key="i"
|
|
||||||
>
|
|
||||||
<Fa :icon="category.icon" fixed-width/>
|
|
||||||
</button>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<div class="emojis">
|
<div class="emojis">
|
||||||
<template v-if="categories[0].isActive">
|
<section class="result">
|
||||||
<header class="category"><Fa :icon="faHistory" fixed-width/> {{ $t('recentUsed') }}</header>
|
<div v-if="searchResultCustom.length > 0">
|
||||||
<div class="list">
|
<button v-for="emoji in searchResultCustom"
|
||||||
<button v-for="emoji in ($store.state.device.recentEmojis || [])"
|
|
||||||
class="_button"
|
class="_button"
|
||||||
:title="emoji.name"
|
:title="emoji.name"
|
||||||
@click="chosen(emoji)"
|
@click="chosen(emoji, $event)"
|
||||||
:key="emoji"
|
:key="emoji"
|
||||||
|
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">
|
||||||
<header class="category"><Fa :icon="faAsterisk" fixed-width/> {{ $t('customEmojis') }}</header>
|
<button v-for="emoji in searchResultUnicode"
|
||||||
</template>
|
|
||||||
|
|
||||||
<template v-if="categories.find(x => x.isActive).name">
|
|
||||||
<div class="list">
|
|
||||||
<button v-for="emoji in emojilist.filter(e => e.category === categories.find(x => x.isActive).name)"
|
|
||||||
class="_button"
|
class="_button"
|
||||||
:title="emoji.name"
|
:title="emoji.name"
|
||||||
@click="chosen(emoji)"
|
@click="chosen(emoji, $event)"
|
||||||
|
:key="emoji.name"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<MkEmoji :emoji="emoji.char"/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div class="index">
|
||||||
|
<section v-if="showPinned">
|
||||||
|
<div>
|
||||||
|
<button v-for="emoji in pinned"
|
||||||
|
class="_button"
|
||||||
|
@click="chosen(emoji, $event)"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<MkEmoji :emoji="emoji" :normal="true"/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<header class="_acrylic"><Fa :icon="faClock" fixed-width/> {{ $ts.recentUsed }}</header>
|
||||||
|
<div>
|
||||||
|
<button v-for="emoji in $store.state.recentlyUsedEmojis"
|
||||||
|
class="_button"
|
||||||
|
@click="chosen(emoji, $event)"
|
||||||
|
:key="emoji"
|
||||||
|
>
|
||||||
|
<MkEmoji :emoji="emoji" :normal="true"/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div class="arrow"><Fa :icon="faChevronDown"/></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<section v-for="category in customEmojiCategories" :key="'custom:' + category" class="custom">
|
||||||
|
<header class="_acrylic" v-appear="() => visibleCategories[category] = true">{{ category || $ts.other }}</header>
|
||||||
|
<div v-if="visibleCategories[category]">
|
||||||
|
<button v-for="emoji in customEmojis.filter(e => e.category === category)"
|
||||||
|
class="_button"
|
||||||
|
:title="emoji.name"
|
||||||
|
@click="chosen(emoji, $event)"
|
||||||
|
:key="emoji.name"
|
||||||
|
>
|
||||||
|
<img :src="$store.state.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url"/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section v-for="category in categories" :key="category.name" class="unicode">
|
||||||
|
<header class="_acrylic" v-appear="() => category.isActive = true"><Fa :icon="category.icon" fixed-width/> {{ category.name }}</header>
|
||||||
|
<div v-if="category.isActive">
|
||||||
|
<button v-for="emoji in emojilist.filter(e => e.category === category.name)"
|
||||||
|
class="_button"
|
||||||
|
:title="emoji.name"
|
||||||
|
@click="chosen(emoji, $event)"
|
||||||
:key="emoji.name"
|
:key="emoji.name"
|
||||||
>
|
>
|
||||||
<MkEmoji :emoji="emoji.char"/>
|
<MkEmoji :emoji="emoji.char"/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</section>
|
||||||
<template v-else>
|
|
||||||
<div v-for="(key, i) in Object.keys(customEmojis)" :key="i">
|
|
||||||
<header class="sub" v-if="key">{{ key }}</header>
|
|
||||||
<div class="list">
|
|
||||||
<button v-for="emoji in customEmojis[key]"
|
|
||||||
class="_button"
|
|
||||||
:title="emoji.name"
|
|
||||||
@click="chosen(emoji)"
|
|
||||||
:key="emoji.name"
|
|
||||||
>
|
|
||||||
<img :src="$store.state.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url"/>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</MkModal>
|
</MkModal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, markRaw } from 'vue';
|
||||||
import { emojilist } from '../../misc/emojilist';
|
import { emojilist } from '../../misc/emojilist';
|
||||||
import { getStaticImageUrl } from '@/scripts/get-static-image-url';
|
import { getStaticImageUrl } from '@/scripts/get-static-image-url';
|
||||||
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice, faGlobe, faHistory, faUser } from '@fortawesome/free-solid-svg-icons';
|
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice, faGlobe, faClock, faUser, faChevronDown } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faHeart, faFlag, faLaugh } from '@fortawesome/free-regular-svg-icons';
|
import { faHeart, faFlag, faLaugh } from '@fortawesome/free-regular-svg-icons';
|
||||||
import { groupByX } from '../../prelude/array';
|
|
||||||
import MkModal from '@/components/ui/modal.vue';
|
import MkModal from '@/components/ui/modal.vue';
|
||||||
|
import Particle from '@/components/particle.vue';
|
||||||
|
import * as os from '@/os';
|
||||||
|
import { isDeviceTouch } from '../scripts/is-device-touch';
|
||||||
|
import { emojiCategories } from '@/instance';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
@@ -80,20 +111,33 @@ export default defineComponent({
|
|||||||
src: {
|
src: {
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
|
showPinned: {
|
||||||
|
required: false,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
asReactionPicker: {
|
||||||
|
required: false
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
emits: ['done', 'closed'],
|
emits: ['done', 'closed'],
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
emojilist,
|
emojilist: markRaw(emojilist),
|
||||||
getStaticImageUrl,
|
getStaticImageUrl,
|
||||||
customEmojis: {},
|
pinned: this.$store.state.reactions,
|
||||||
faGlobe, faHistory,
|
width: this.asReactionPicker ? this.$store.state.reactionPickerWidth : 3,
|
||||||
|
height: this.asReactionPicker ? this.$store.state.reactionPickerHeight : 2,
|
||||||
|
big: this.asReactionPicker ? isDeviceTouch : false,
|
||||||
|
customEmojiCategories: emojiCategories,
|
||||||
|
customEmojis: this.$instance.emojis,
|
||||||
|
visibleCategories: {},
|
||||||
|
q: null,
|
||||||
|
searchResultCustom: [],
|
||||||
|
searchResultUnicode: [],
|
||||||
|
faGlobe, faClock, faChevronDown,
|
||||||
categories: [{
|
categories: [{
|
||||||
icon: faAsterisk,
|
|
||||||
isActive: true
|
|
||||||
}, {
|
|
||||||
name: 'face',
|
name: 'face',
|
||||||
icon: faLaugh,
|
icon: faLaugh,
|
||||||
isActive: false
|
isActive: false
|
||||||
@@ -134,38 +178,211 @@ export default defineComponent({
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
watch: {
|
||||||
let local = this.$store.state.instance.meta.emojis;
|
q() {
|
||||||
local = groupByX(local, (x: any) => x.category || '');
|
if (this.q == null || this.q === '') {
|
||||||
this.customEmojis = local;
|
this.searchResultCustom = [];
|
||||||
|
this.searchResultUnicode = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const q = this.q.replace(/:/g, '');
|
||||||
|
|
||||||
|
const searchCustom = () => {
|
||||||
|
const max = 8;
|
||||||
|
const emojis = this.customEmojis;
|
||||||
|
const matches = new Set();
|
||||||
|
|
||||||
|
const exactMatch = emojis.find(e => e.name === q);
|
||||||
|
if (exactMatch) matches.add(exactMatch);
|
||||||
|
|
||||||
|
if (q.includes(' ')) { // AND検索
|
||||||
|
const keywords = q.split(' ');
|
||||||
|
|
||||||
|
// 名前にキーワードが含まれている
|
||||||
|
for (const emoji of emojis) {
|
||||||
|
if (keywords.every(keyword => emoji.name.includes(keyword))) {
|
||||||
|
matches.add(emoji);
|
||||||
|
if (matches.size >= max) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (matches.size >= max) return matches;
|
||||||
|
|
||||||
|
// 名前またはエイリアスにキーワードが含まれている
|
||||||
|
for (const emoji of emojis) {
|
||||||
|
if (keywords.every(keyword => emoji.name.includes(keyword) || emoji.aliases.some(alias => alias.includes(keyword)))) {
|
||||||
|
matches.add(emoji);
|
||||||
|
if (matches.size >= max) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (const emoji of emojis) {
|
||||||
|
if (emoji.name.startsWith(q)) {
|
||||||
|
matches.add(emoji);
|
||||||
|
if (matches.size >= max) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (matches.size >= max) return matches;
|
||||||
|
|
||||||
|
for (const emoji of emojis) {
|
||||||
|
if (emoji.aliases.some(alias => alias.startsWith(q))) {
|
||||||
|
matches.add(emoji);
|
||||||
|
if (matches.size >= max) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (matches.size >= max) return matches;
|
||||||
|
|
||||||
|
for (const emoji of emojis) {
|
||||||
|
if (emoji.name.includes(q)) {
|
||||||
|
matches.add(emoji);
|
||||||
|
if (matches.size >= max) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (matches.size >= max) return matches;
|
||||||
|
|
||||||
|
for (const emoji of emojis) {
|
||||||
|
if (emoji.aliases.some(alias => alias.includes(q))) {
|
||||||
|
matches.add(emoji);
|
||||||
|
if (matches.size >= max) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return matches;
|
||||||
|
};
|
||||||
|
|
||||||
|
const searchUnicode = () => {
|
||||||
|
const max = 8;
|
||||||
|
const emojis = this.emojilist;
|
||||||
|
const matches = new Set();
|
||||||
|
|
||||||
|
const exactMatch = emojis.find(e => e.name === q);
|
||||||
|
if (exactMatch) matches.add(exactMatch);
|
||||||
|
|
||||||
|
if (q.includes(' ')) { // AND検索
|
||||||
|
const keywords = q.split(' ');
|
||||||
|
|
||||||
|
// 名前にキーワードが含まれている
|
||||||
|
for (const emoji of emojis) {
|
||||||
|
if (keywords.every(keyword => emoji.name.includes(keyword))) {
|
||||||
|
matches.add(emoji);
|
||||||
|
if (matches.size >= max) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (matches.size >= max) return matches;
|
||||||
|
|
||||||
|
// 名前またはエイリアスにキーワードが含まれている
|
||||||
|
for (const emoji of emojis) {
|
||||||
|
if (keywords.every(keyword => emoji.name.includes(keyword) || emoji.keywords.some(alias => alias.includes(keyword)))) {
|
||||||
|
matches.add(emoji);
|
||||||
|
if (matches.size >= max) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (const emoji of emojis) {
|
||||||
|
if (emoji.name.startsWith(q)) {
|
||||||
|
matches.add(emoji);
|
||||||
|
if (matches.size >= max) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (matches.size >= max) return matches;
|
||||||
|
|
||||||
|
for (const emoji of emojis) {
|
||||||
|
if (emoji.keywords.some(keyword => keyword.startsWith(q))) {
|
||||||
|
matches.add(emoji);
|
||||||
|
if (matches.size >= max) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (matches.size >= max) return matches;
|
||||||
|
|
||||||
|
for (const emoji of emojis) {
|
||||||
|
if (emoji.name.includes(q)) {
|
||||||
|
matches.add(emoji);
|
||||||
|
if (matches.size >= max) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (matches.size >= max) return matches;
|
||||||
|
|
||||||
|
for (const emoji of emojis) {
|
||||||
|
if (emoji.keywords.some(keyword => keyword.includes(q))) {
|
||||||
|
matches.add(emoji);
|
||||||
|
if (matches.size >= max) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return matches;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.searchResultCustom = Array.from(searchCustom());
|
||||||
|
this.searchResultUnicode = Array.from(searchUnicode());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
if (!os.isMobile) {
|
||||||
|
this.$refs.search.focus({
|
||||||
|
preventScroll: true
|
||||||
|
});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
go(category: any) {
|
getKey(emoji: any) {
|
||||||
this.goCategory(category.name);
|
return typeof emoji === 'string' ? emoji : (emoji.char || `:${emoji.name}:`);
|
||||||
},
|
},
|
||||||
|
|
||||||
goCategory(name: string) {
|
chosen(emoji: any, ev) {
|
||||||
let matched = false;
|
if (ev) {
|
||||||
for (const c of this.categories) {
|
const el = ev.currentTarget || ev.target;
|
||||||
c.isActive = c.name === name;
|
const rect = el.getBoundingClientRect();
|
||||||
if (c.isActive) {
|
const x = rect.left + (el.clientWidth / 2);
|
||||||
matched = true;
|
const y = rect.top + (el.clientHeight / 2);
|
||||||
}
|
os.popup(Particle, { x, y }, {}, 'end');
|
||||||
}
|
}
|
||||||
if (!matched) {
|
|
||||||
this.categories[0].isActive = true;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
chosen(emoji: any) {
|
const key = this.getKey(emoji);
|
||||||
const getKey = (emoji: any) => emoji.char || `:${emoji.name}:`;
|
this.$emit('done', key);
|
||||||
let recents = this.$store.state.device.recentEmojis || [];
|
|
||||||
recents = recents.filter((e: any) => getKey(e) !== getKey(emoji));
|
|
||||||
recents.unshift(emoji)
|
|
||||||
this.$store.commit('device/set', { key: 'recentEmojis', value: recents.splice(0, 16) });
|
|
||||||
this.$emit('done', getKey(emoji));
|
|
||||||
this.$refs.modal.close();
|
this.$refs.modal.close();
|
||||||
|
|
||||||
|
// 最近使った絵文字更新
|
||||||
|
if (!this.pinned.includes(key)) {
|
||||||
|
let recents = this.$store.state.recentlyUsedEmojis;
|
||||||
|
recents = recents.filter((e: any) => e !== key);
|
||||||
|
recents.unshift(key);
|
||||||
|
this.$store.set('recentlyUsedEmojis', recents.splice(0, 16));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
paste(event) {
|
||||||
|
const paste = (event.clipboardData || window.clipboardData).getData('text');
|
||||||
|
if (this.done(paste)) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
done(query) {
|
||||||
|
if (query == null) query = this.q;
|
||||||
|
if (query == null) return;
|
||||||
|
const q = query.replace(/:/g, '');
|
||||||
|
const exactMatchCustom = this.customEmojis.find(e => e.name === q);
|
||||||
|
if (exactMatchCustom) {
|
||||||
|
this.chosen(exactMatchCustom);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
const exactMatchUnicode = this.emojilist.find(e => e.char === q || e.name === q);
|
||||||
|
if (exactMatchUnicode) {
|
||||||
|
this.chosen(exactMatchUnicode);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (this.searchResultCustom.length > 0) {
|
||||||
|
this.chosen(this.searchResultCustom[0]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (this.searchResultUnicode.length > 0) {
|
||||||
|
this.chosen(this.searchResultUnicode[0]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -173,87 +390,144 @@ export default defineComponent({
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.omfetrab {
|
.omfetrab {
|
||||||
width: 350px;
|
$pad: 8px;
|
||||||
|
--eachSize: 40px;
|
||||||
|
|
||||||
> header {
|
display: flex;
|
||||||
display: flex;
|
flex-direction: column;
|
||||||
|
contain: content;
|
||||||
|
|
||||||
> button {
|
&.big {
|
||||||
flex: 1;
|
--eachSize: 44px;
|
||||||
padding: 10px 0;
|
}
|
||||||
font-size: 16px;
|
|
||||||
transition: color 0.2s ease;
|
|
||||||
|
|
||||||
&:hover {
|
&.w1 {
|
||||||
color: var(--textHighlighted);
|
width: calc((var(--eachSize) * 5) + (#{$pad} * 2));
|
||||||
transition: color 0s;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
&.active {
|
&.w2 {
|
||||||
color: var(--accent);
|
width: calc((var(--eachSize) * 6) + (#{$pad} * 2));
|
||||||
transition: color 0s;
|
}
|
||||||
}
|
|
||||||
|
&.w3 {
|
||||||
|
width: calc((var(--eachSize) * 7) + (#{$pad} * 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
&.h1 {
|
||||||
|
--height: calc((var(--eachSize) * 4) + (#{$pad} * 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
&.h2 {
|
||||||
|
--height: calc((var(--eachSize) * 6) + (#{$pad} * 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
&.h3 {
|
||||||
|
--height: calc((var(--eachSize) * 8) + (#{$pad} * 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
> .search {
|
||||||
|
width: 100%;
|
||||||
|
padding: 12px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-size: 1em;
|
||||||
|
outline: none;
|
||||||
|
border: none;
|
||||||
|
background: transparent;
|
||||||
|
color: var(--fg);
|
||||||
|
|
||||||
|
&:not(.filled) {
|
||||||
|
order: 1;
|
||||||
|
z-index: 2;
|
||||||
|
box-shadow: 0px -1px 0 0px var(--divider);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .emojis {
|
> .emojis {
|
||||||
height: 300px;
|
height: var(--height);
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
|
|
||||||
> header.category {
|
scrollbar-width: none;
|
||||||
position: sticky;
|
|
||||||
top: 0;
|
&::-webkit-scrollbar {
|
||||||
left: 0;
|
display: none;
|
||||||
z-index: 1;
|
|
||||||
padding: 8px;
|
|
||||||
background: var(--panel);
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
header.sub {
|
> .index {
|
||||||
padding: 4px 8px;
|
min-height: var(--height);
|
||||||
font-size: 12px;
|
position: relative;
|
||||||
}
|
border-bottom: solid 1px var(--divider);
|
||||||
|
|
||||||
div.list {
|
> .arrow {
|
||||||
display: grid;
|
position: absolute;
|
||||||
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
|
bottom: 0;
|
||||||
gap: 4px;
|
left: 0;
|
||||||
padding: 8px;
|
|
||||||
|
|
||||||
> button {
|
|
||||||
position: relative;
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
padding: 16px 0;
|
||||||
|
text-align: center;
|
||||||
|
opacity: 0.5;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
&:before {
|
section {
|
||||||
content: '';
|
> header {
|
||||||
display: block;
|
position: sticky;
|
||||||
width: 1px;
|
top: 0;
|
||||||
height: 0;
|
left: 0;
|
||||||
padding-bottom: 100%;
|
z-index: 1;
|
||||||
}
|
padding: 8px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
> div {
|
||||||
|
padding: $pad;
|
||||||
|
|
||||||
|
> button {
|
||||||
|
position: relative;
|
||||||
|
padding: 0;
|
||||||
|
width: var(--eachSize);
|
||||||
|
height: var(--eachSize);
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
outline: solid 2px var(--focus);
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background: var(--accent);
|
||||||
|
box-shadow: inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
&:hover {
|
|
||||||
> * {
|
> * {
|
||||||
transform: scale(1.2);
|
font-size: 24px;
|
||||||
transition: transform 0s;
|
height: 1.25em;
|
||||||
|
vertical-align: -.25em;
|
||||||
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
> * {
|
&.result {
|
||||||
position: absolute;
|
border-bottom: solid 1px var(--divider);
|
||||||
top: 0;
|
|
||||||
left: 0;
|
&:empty {
|
||||||
width: 100%;
|
display: none;
|
||||||
height: 100%;
|
|
||||||
object-fit: contain;
|
|
||||||
font-size: 28px;
|
|
||||||
transition: transform 0.2s ease;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.unicode {
|
||||||
|
min-height: 384px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.custom {
|
||||||
|
min-height: 64px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"> ({{ $ts.optional }})</span>
|
||||||
|
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||||
|
</FormInput>
|
||||||
|
<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"> ({{ $ts.optional }})</span>
|
||||||
|
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||||
|
</FormInput>
|
||||||
|
<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"> ({{ $ts.optional }})</span>
|
||||||
|
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||||
|
</FormTextarea>
|
||||||
|
<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>
|
||||||
</MkInput>
|
</FormSwitch>
|
||||||
<MkInput v-else-if="form[item].type === 'string' && !item.multiline" v-model:value="values[item]" type="text">
|
<FormSelect v-else-if="form[item].type === 'enum'" v-model:value="values[item]">
|
||||||
<span v-text="form[item].label || item"></span>
|
<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>
|
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||||
</MkInput>
|
</FormRange>
|
||||||
<MkTextarea v-else-if="form[item].type === 'string' && item.multiline" v-model:value="values[item]">
|
<FormButton v-else-if="form[item].type === 'button'" @click="form[item].action($event, values)">
|
||||||
<span v-text="form[item].label || item"></span>
|
<span v-text="form[item].content || item"></span>
|
||||||
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
</FormButton>
|
||||||
</MkTextarea>
|
</template>
|
||||||
<MkSwitch v-else-if="form[item].type === 'boolean'" v-model:value="values[item]">
|
</FormBase>
|
||||||
<span v-text="form[item].label || item"></span>
|
|
||||||
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
|
||||||
</MkSwitch>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</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
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
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
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
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
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
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
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
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
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
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
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
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
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
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,7 +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 { deckmode } from '@/config';
|
import { url } from '@/config';
|
||||||
|
import { popout } from '@/scripts/popout';
|
||||||
|
import { ColdDeviceStorage } from '@/store';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
inject: {
|
inject: {
|
||||||
@@ -31,6 +33,10 @@ export default defineComponent({
|
|||||||
type: String,
|
type: String,
|
||||||
required: false,
|
required: false,
|
||||||
},
|
},
|
||||||
|
behavior: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
@@ -52,51 +58,69 @@ 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.navHook && 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(this.to);
|
copyToClipboard(`${url}${this.to}`);
|
||||||
}
|
}
|
||||||
}], e);
|
}], e);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
window() {
|
||||||
|
os.pageWindow(this.to);
|
||||||
|
},
|
||||||
|
|
||||||
|
popout() {
|
||||||
|
popout(this.to);
|
||||||
|
},
|
||||||
|
|
||||||
nav() {
|
nav() {
|
||||||
|
if (this.to.startsWith('/my/messaging')) {
|
||||||
|
if (ColdDeviceStorage.get('chatOpenBehavior') === 'window') return this.window();
|
||||||
|
if (ColdDeviceStorage.get('chatOpenBehavior') === 'popout') return this.popout();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.behavior) {
|
||||||
|
if (this.behavior === 'window') {
|
||||||
|
return this.window();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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 !== '/') {
|
||||||
this.sideViewHook(this.to);
|
return this.sideViewHook(this.to);
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (this.$store.state.device.deckNavWindow && deckmode && this.to !== '/') {
|
|
||||||
os.pageWindow(this.to);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$router.push(this.to);
|
if (this.$router.currentRoute.value.path === this.to) {
|
||||||
|
window.scroll({ top: 0, behavior: 'smooth' });
|
||||||
|
} else {
|
||||||
|
this.$router.push(this.to);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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,25 +1,20 @@
|
|||||||
<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>:{{ name }}:</span>
|
<span v-else>{{ emoji }}</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<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';
|
||||||
import * as os from '@/os';
|
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
name: {
|
|
||||||
type: String,
|
|
||||||
required: false
|
|
||||||
},
|
|
||||||
emoji: {
|
emoji: {
|
||||||
type: String,
|
type: String,
|
||||||
required: false
|
required: true
|
||||||
},
|
},
|
||||||
normal: {
|
normal: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
@@ -50,18 +45,22 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
|
isCustom(): boolean {
|
||||||
|
return this.emoji.startsWith(':');
|
||||||
|
},
|
||||||
|
|
||||||
alt(): string {
|
alt(): string {
|
||||||
return this.customEmoji ? `:${this.customEmoji.name}:` : this.char;
|
return this.customEmoji ? `:${this.customEmoji.name}:` : this.char;
|
||||||
},
|
},
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -69,11 +68,11 @@ export default defineComponent({
|
|||||||
watch: {
|
watch: {
|
||||||
ce: {
|
ce: {
|
||||||
handler() {
|
handler() {
|
||||||
if (this.name) {
|
if (this.isCustom) {
|
||||||
const customEmoji = this.ce.find(x => x.name == this.name);
|
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;
|
||||||
}
|
}
|
||||||
@@ -84,7 +83,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
if (!this.name) {
|
if (!this.isCustom) {
|
||||||
this.char = this.emoji;
|
this.char = this.emoji;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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: {
|
||||||
37
src/client/components/global/i18n.ts
Normal file
37
src/client/components/global/i18n.ts
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import { h, defineComponent } from 'vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
src: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
tag: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: 'span',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
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' ? x : this.$slots[x.arg]()));
|
||||||
|
}
|
||||||
|
});
|
||||||
143
src/client/components/global/misskey-flavored-markdown.vue
Normal file
143
src/client/components/global/misskey-flavored-markdown.vue
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
<template>
|
||||||
|
<mfm-core v-bind="$attrs" class="havbbuyv" :class="{ nowrap: $attrs['nowrap'] }"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import MfmCore from '@/components/mfm';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
components: {
|
||||||
|
MfmCore
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
@keyframes mfm-spin {
|
||||||
|
0% { transform: rotate(0deg); }
|
||||||
|
100% { transform: rotate(360deg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes mfm-spinX {
|
||||||
|
0% { transform: perspective(128px) rotateX(0deg); }
|
||||||
|
100% { transform: perspective(128px) rotateX(360deg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes mfm-spinY {
|
||||||
|
0% { transform: perspective(128px) rotateY(0deg); }
|
||||||
|
100% { transform: perspective(128px) rotateY(360deg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes mfm-jump {
|
||||||
|
0% { transform: translateY(0); }
|
||||||
|
25% { transform: translateY(-16px); }
|
||||||
|
50% { transform: translateY(0); }
|
||||||
|
75% { transform: translateY(-8px); }
|
||||||
|
100% { transform: translateY(0); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes mfm-bounce {
|
||||||
|
0% { transform: translateY(0) scale(1, 1); }
|
||||||
|
25% { transform: translateY(-16px) scale(1, 1); }
|
||||||
|
50% { transform: translateY(0) scale(1, 1); }
|
||||||
|
75% { transform: translateY(0) scale(1.5, 0.75); }
|
||||||
|
100% { transform: translateY(0) scale(1, 1); }
|
||||||
|
}
|
||||||
|
|
||||||
|
// const val = () => `translate(${Math.floor(Math.random() * 20) - 10}px, ${Math.floor(Math.random() * 20) - 10}px)`;
|
||||||
|
// let css = '';
|
||||||
|
// for (let i = 0; i <= 100; i += 5) { css += `${i}% { transform: ${val()} }\n`; }
|
||||||
|
@keyframes mfm-twitch {
|
||||||
|
0% { transform: translate(7px, -2px) }
|
||||||
|
5% { transform: translate(-3px, 1px) }
|
||||||
|
10% { transform: translate(-7px, -1px) }
|
||||||
|
15% { transform: translate(0px, -1px) }
|
||||||
|
20% { transform: translate(-8px, 6px) }
|
||||||
|
25% { transform: translate(-4px, -3px) }
|
||||||
|
30% { transform: translate(-4px, -6px) }
|
||||||
|
35% { transform: translate(-8px, -8px) }
|
||||||
|
40% { transform: translate(4px, 6px) }
|
||||||
|
45% { transform: translate(-3px, 1px) }
|
||||||
|
50% { transform: translate(2px, -10px) }
|
||||||
|
55% { transform: translate(-7px, 0px) }
|
||||||
|
60% { transform: translate(-2px, 4px) }
|
||||||
|
65% { transform: translate(3px, -8px) }
|
||||||
|
70% { transform: translate(6px, 7px) }
|
||||||
|
75% { transform: translate(-7px, -2px) }
|
||||||
|
80% { transform: translate(-7px, -8px) }
|
||||||
|
85% { transform: translate(9px, 3px) }
|
||||||
|
90% { transform: translate(-3px, -2px) }
|
||||||
|
95% { transform: translate(-10px, 2px) }
|
||||||
|
100% { transform: translate(-2px, -6px) }
|
||||||
|
}
|
||||||
|
|
||||||
|
// const val = () => `translate(${Math.floor(Math.random() * 6) - 3}px, ${Math.floor(Math.random() * 6) - 3}px) rotate(${Math.floor(Math.random() * 24) - 12}deg)`;
|
||||||
|
// let css = '';
|
||||||
|
// for (let i = 0; i <= 100; i += 5) { css += `${i}% { transform: ${val()} }\n`; }
|
||||||
|
@keyframes mfm-shake {
|
||||||
|
0% { transform: translate(-3px, -1px) rotate(-8deg) }
|
||||||
|
5% { transform: translate(0px, -1px) rotate(-10deg) }
|
||||||
|
10% { transform: translate(1px, -3px) rotate(0deg) }
|
||||||
|
15% { transform: translate(1px, 1px) rotate(11deg) }
|
||||||
|
20% { transform: translate(-2px, 1px) rotate(1deg) }
|
||||||
|
25% { transform: translate(-1px, -2px) rotate(-2deg) }
|
||||||
|
30% { transform: translate(-1px, 2px) rotate(-3deg) }
|
||||||
|
35% { transform: translate(2px, 1px) rotate(6deg) }
|
||||||
|
40% { transform: translate(-2px, -3px) rotate(-9deg) }
|
||||||
|
45% { transform: translate(0px, -1px) rotate(-12deg) }
|
||||||
|
50% { transform: translate(1px, 2px) rotate(10deg) }
|
||||||
|
55% { transform: translate(0px, -3px) rotate(8deg) }
|
||||||
|
60% { transform: translate(1px, -1px) rotate(8deg) }
|
||||||
|
65% { transform: translate(0px, -1px) rotate(-7deg) }
|
||||||
|
70% { transform: translate(-1px, -3px) rotate(6deg) }
|
||||||
|
75% { transform: translate(0px, -2px) rotate(4deg) }
|
||||||
|
80% { transform: translate(-2px, -1px) rotate(3deg) }
|
||||||
|
85% { transform: translate(1px, -3px) rotate(-10deg) }
|
||||||
|
90% { transform: translate(1px, 0px) rotate(3deg) }
|
||||||
|
95% { transform: translate(-2px, 0px) rotate(-3deg) }
|
||||||
|
100% { transform: translate(2px, 1px) rotate(2deg) }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes mfm-rubberBand {
|
||||||
|
from { transform: scale3d(1, 1, 1); }
|
||||||
|
30% { transform: scale3d(1.25, 0.75, 1); }
|
||||||
|
40% { transform: scale3d(0.75, 1.25, 1); }
|
||||||
|
50% { transform: scale3d(1.15, 0.85, 1); }
|
||||||
|
65% { transform: scale3d(0.95, 1.05, 1); }
|
||||||
|
75% { transform: scale3d(1.05, 0.95, 1); }
|
||||||
|
to { transform: scale3d(1, 1, 1); }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.havbbuyv {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
|
||||||
|
&.nowrap {
|
||||||
|
white-space: pre;
|
||||||
|
word-wrap: normal; // https://codeday.me/jp/qa/20190424/690106.html
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep(.quote) {
|
||||||
|
display: block;
|
||||||
|
margin: 8px;
|
||||||
|
padding: 6px 0 6px 12px;
|
||||||
|
color: var(--fg);
|
||||||
|
border-left: solid 3px var(--fg);
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep(pre) {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
> ::v-deep(code) {
|
||||||
|
font-size: 0.8em;
|
||||||
|
word-break: break-all;
|
||||||
|
padding: 4px 6px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<time class="mk-time" :title="absolute">
|
<time :title="absolute">
|
||||||
<template v-if="mode == 'relative'">{{ relative }}</template>
|
<template v-if="mode == 'relative'">{{ relative }}</template>
|
||||||
<template v-else-if="mode == 'absolute'">{{ absolute }}</template>
|
<template v-else-if="mode == 'absolute'">{{ absolute }}</template>
|
||||||
<template v-else-if="mode == 'detail'">{{ absolute }} ({{ relative }})</template>
|
<template v-else-if="mode == 'detail'">{{ absolute }} ({{ relative }})</template>
|
||||||
@@ -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() {
|
||||||
@@ -71,7 +71,7 @@ export default defineComponent({
|
|||||||
if (!document.body.contains(this.$el)) return;
|
if (!document.body.contains(this.$el)) return;
|
||||||
if (this.close) return;
|
if (this.close) return;
|
||||||
|
|
||||||
const { dispose } = os.popup(await import('@/components/url-preview-popup.vue'), {
|
const { dispose } = await os.popup(import('@/components/url-preview-popup.vue'), {
|
||||||
url: this.url,
|
url: this.url,
|
||||||
source: this.$el
|
source: this.$el
|
||||||
});
|
});
|
||||||
@@ -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');
|
||||||
|
|||||||
@@ -41,10 +41,13 @@ export default defineComponent({
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.xubzgfga {
|
.xubzgfga {
|
||||||
max-width: 1024px;
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
> header,
|
> header,
|
||||||
> footer {
|
> footer {
|
||||||
|
align-self: center;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding: 6px 9px;
|
padding: 6px 9px;
|
||||||
font-size: 90%;
|
font-size: 90%;
|
||||||
@@ -60,7 +63,10 @@ export default defineComponent({
|
|||||||
|
|
||||||
> img {
|
> img {
|
||||||
display: block;
|
display: block;
|
||||||
max-width: 100%;
|
flex: 1;
|
||||||
|
min-height: 0;
|
||||||
|
object-fit: contain;
|
||||||
|
width: 100%;
|
||||||
cursor: zoom-out;
|
cursor: zoom-out;
|
||||||
image-orientation: from-image;
|
image-orientation: from-image;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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, {
|
||||||
|
|||||||
62
src/client/components/instance-ticker.vue
Normal file
62
src/client/components/instance-ticker.vue
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
<template>
|
||||||
|
<div class="hpaizdrt" :style="bg">
|
||||||
|
<img v-if="info.faviconUrl" class="icon" :src="info.faviconUrl"/>
|
||||||
|
<span class="name">{{ info.name }}</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import { instanceName } from '@/config';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
instance: {
|
||||||
|
type: Object,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
info: this.instance || {
|
||||||
|
faviconUrl: '/favicon.ico',
|
||||||
|
name: instanceName,
|
||||||
|
themeColor: (document.querySelector('meta[name="theme-color-orig"]') as HTMLMetaElement)?.content
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
bg(): any {
|
||||||
|
const themeColor = this.info.themeColor || '#777777';
|
||||||
|
return {
|
||||||
|
background: `linear-gradient(90deg, ${themeColor}, ${themeColor + '00'})`
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.hpaizdrt {
|
||||||
|
$height: 1.1rem;
|
||||||
|
|
||||||
|
height: $height;
|
||||||
|
border-radius: 4px 0 0 4px;
|
||||||
|
overflow: hidden;
|
||||||
|
color: #fff;
|
||||||
|
|
||||||
|
> .icon {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .name {
|
||||||
|
margin-left: 4px;
|
||||||
|
line-height: $height;
|
||||||
|
font-size: 0.9em;
|
||||||
|
vertical-align: top;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
152
src/client/components/launch-pad.vue
Normal file
152
src/client/components/launch-pad.vue
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
<template>
|
||||||
|
<MkModal ref="modal" @click="$refs.modal.close()" @closed="$emit('closed')">
|
||||||
|
<div class="szkkfdyq _popup">
|
||||||
|
<div class="main">
|
||||||
|
<template v-for="item in items">
|
||||||
|
<button v-if="item.action" class="_button" @click="$event => { item.action($event); close(); }">
|
||||||
|
<Fa :icon="item.icon" class="icon"/>
|
||||||
|
<div class="text">{{ item.text }}</div>
|
||||||
|
<i v-if="item.indicate"><Fa :icon="faCircle"/></i>
|
||||||
|
</button>
|
||||||
|
<MkA v-else :to="item.to" @click.passive="close()">
|
||||||
|
<Fa :icon="item.icon" class="icon"/>
|
||||||
|
<div class="text">{{ item.text }}</div>
|
||||||
|
<i v-if="item.indicate"><Fa :icon="faCircle"/></i>
|
||||||
|
</MkA>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
<div class="sub">
|
||||||
|
<MkA to="/docs" @click.passive="close()">
|
||||||
|
<Fa :icon="faQuestionCircle" class="icon"/>
|
||||||
|
<div class="text">{{ $ts.help }}</div>
|
||||||
|
</MkA>
|
||||||
|
<MkA to="/about" @click.passive="close()">
|
||||||
|
<Fa :icon="faInfoCircle" class="icon"/>
|
||||||
|
<div class="text">{{ $t('aboutX', { x: instanceName }) }}</div>
|
||||||
|
</MkA>
|
||||||
|
<MkA to="/about-misskey" @click.passive="close()">
|
||||||
|
<Fa :icon="faInfoCircle" class="icon"/>
|
||||||
|
<div class="text">{{ $ts.aboutMisskey }}</div>
|
||||||
|
</MkA>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</MkModal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import { faQuestionCircle, faInfoCircle, faCircle } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import MkModal from '@/components/ui/modal.vue';
|
||||||
|
import { sidebarDef } from '@/sidebar';
|
||||||
|
import { instanceName } from '@/config';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
components: {
|
||||||
|
MkModal,
|
||||||
|
},
|
||||||
|
|
||||||
|
emits: ['closed'],
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
menuDef: sidebarDef,
|
||||||
|
items: [],
|
||||||
|
instanceName,
|
||||||
|
faQuestionCircle, faInfoCircle, faCircle,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
menu(): string[] {
|
||||||
|
return this.$store.state.menu;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
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 => ({
|
||||||
|
type: def.to ? 'link' : 'button',
|
||||||
|
text: this.$ts[def.title],
|
||||||
|
icon: def.icon,
|
||||||
|
to: def.to,
|
||||||
|
action: def.action,
|
||||||
|
indicate: def.indicated,
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
close() {
|
||||||
|
this.$refs.modal.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.szkkfdyq {
|
||||||
|
width: 100%;
|
||||||
|
max-height: 100%;
|
||||||
|
max-width: 800px;
|
||||||
|
padding: 32px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow: auto;
|
||||||
|
text-align: center;
|
||||||
|
border-radius: 16px;
|
||||||
|
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .main, > .sub {
|
||||||
|
> * {
|
||||||
|
position: relative;
|
||||||
|
display: inline-flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 128px;
|
||||||
|
height: 128px;
|
||||||
|
border-radius: var(--radius);
|
||||||
|
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: rgba(0, 0, 0, 0.05);
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .icon {
|
||||||
|
font-size: 26px;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .text {
|
||||||
|
margin-top: 8px;
|
||||||
|
font-size: 0.9em;
|
||||||
|
line-height: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
> i {
|
||||||
|
position: absolute;
|
||||||
|
top: 32px;
|
||||||
|
left: 32px;
|
||||||
|
color: var(--indicator);
|
||||||
|
font-size: 8px;
|
||||||
|
animation: blink 1s infinite;
|
||||||
|
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
top: 16px;
|
||||||
|
left: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .sub {
|
||||||
|
margin-top: 8px;
|
||||||
|
padding-top: 8px;
|
||||||
|
border-top: solid 1px var(--divider);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -46,7 +46,7 @@ export default defineComponent({
|
|||||||
if (!document.body.contains(this.$el)) return;
|
if (!document.body.contains(this.$el)) return;
|
||||||
if (this.close) return;
|
if (this.close) return;
|
||||||
|
|
||||||
const { dispose } = os.popup(await import('@/components/url-preview-popup.vue'), {
|
const { dispose } = await os.popup(import('@/components/url-preview-popup.vue'), {
|
||||||
url: this.url,
|
url: this.url,
|
||||||
source: this.$el
|
source: this.$el
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
<div class="mk-media-banner">
|
<div class="mk-media-banner">
|
||||||
<div class="sensitive" v-if="media.isSensitive && hide" @click="hide = false">
|
<div class="sensitive" v-if="media.isSensitive && hide" @click="hide = false">
|
||||||
<span class="icon"><Fa :icon="faExclamationTriangle"/></span>
|
<span class="icon"><Fa :icon="faExclamationTriangle"/></span>
|
||||||
<b>{{ $t('sensitive') }}</b>
|
<b>{{ $ts.sensitive }}</b>
|
||||||
<span>{{ $t('clickToShow') }}</span>
|
<span>{{ $ts.clickToShow }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="audio" v-else-if="media.type.startsWith('audio') && media.type !== 'audio/midi'">
|
<div class="audio" v-else-if="media.type.startsWith('audio') && media.type !== 'audio/midi'">
|
||||||
<audio class="audio"
|
<audio class="audio"
|
||||||
@@ -29,6 +29,7 @@
|
|||||||
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 * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { ColdDeviceStorage } from '@/store';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
@@ -45,12 +46,12 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
const audioTag = this.$refs.audio as HTMLAudioElement;
|
const audioTag = this.$refs.audio 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.audio as HTMLAudioElement;
|
const audioTag = this.$refs.audio as HTMLAudioElement;
|
||||||
this.$store.commit('device/set', { key: 'mediaVolume', value: audioTag.volume });
|
ColdDeviceStorage.set('mediaVolume', audioTag.volume);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
<ImgWithBlurhash class="bg" :hash="image.blurhash" :title="image.name"/>
|
<ImgWithBlurhash class="bg" :hash="image.blurhash" :title="image.name"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<div>
|
<div>
|
||||||
<b><Fa :icon="faExclamationTriangle"/> {{ $t('sensitive') }}</b>
|
<b><Fa :icon="faExclamationTriangle"/> {{ $ts.sensitive }}</b>
|
||||||
<span>{{ $t('clickToShow') }}</span>
|
<span>{{ $ts.clickToShow }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -52,13 +52,11 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
url(): any {
|
url(): any {
|
||||||
let url = this.$store.state.device.disableShowingAnimatedImages
|
let url = this.$store.state.disableShowingAnimatedImages
|
||||||
? getStaticImageUrl(this.image.thumbnailUrl)
|
? getStaticImageUrl(this.image.thumbnailUrl)
|
||||||
: this.image.thumbnailUrl;
|
: this.image.thumbnailUrl;
|
||||||
|
|
||||||
if (this.$store.state.device.loadRemoteMedia) {
|
if (this.raw || this.$store.state.loadRawImages) {
|
||||||
url = null;
|
|
||||||
} else if (this.raw || this.$store.state.device.loadRawImages) {
|
|
||||||
url = this.image.url;
|
url = this.image.url;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,7 +66,7 @@ export default defineComponent({
|
|||||||
created() {
|
created() {
|
||||||
// Plugin:register_note_view_interruptor を使って書き換えられる可能性があるためwatchする
|
// Plugin:register_note_view_interruptor を使って書き換えられる可能性があるためwatchする
|
||||||
this.$watch('image', () => {
|
this.$watch('image', () => {
|
||||||
this.hide = this.image.isSensitive && !this.$store.state.device.alwaysShowNsfw;
|
this.hide = (this.$store.state.nsfw === 'force') ? true : this.image.isSensitive && (this.$store.state.nsfw !== 'ignore');
|
||||||
if (this.image.blurhash) {
|
if (this.image.blurhash) {
|
||||||
this.color = extractAvgColorFromBlurhash(this.image.blurhash);
|
this.color = extractAvgColorFromBlurhash(this.image.blurhash);
|
||||||
}
|
}
|
||||||
@@ -79,7 +77,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onClick() {
|
onClick() {
|
||||||
if (this.$store.state.device.imageNewTab) {
|
if (this.$store.state.imageNewTab) {
|
||||||
window.open(this.image.url, '_blank');
|
window.open(this.image.url, '_blank');
|
||||||
} else {
|
} else {
|
||||||
os.popup(ImageViewer, {
|
os.popup(ImageViewer, {
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ export default defineComponent({
|
|||||||
raw: {
|
raw: {
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
// specify the parent element
|
|
||||||
parentElement: {}
|
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -66,7 +64,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
if (this.$refs.gridOuter) {
|
if (this.$refs.gridOuter) {
|
||||||
let height = 287;
|
let height = 287;
|
||||||
const parent = this.parentElement || this.$parent.$el;
|
const parent = this.$parent.$el;
|
||||||
|
|
||||||
if (this.$refs.gridOuter.clientHeight) {
|
if (this.$refs.gridOuter.clientHeight) {
|
||||||
height = this.$refs.gridOuter.clientHeight;
|
height = this.$refs.gridOuter.clientHeight;
|
||||||
@@ -81,11 +79,6 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
|
||||||
parentElement() {
|
|
||||||
this.size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="icozogqfvdetwohsdglrbswgrejoxbdj" v-if="hide" @click="hide = false">
|
<div class="icozogqfvdetwohsdglrbswgrejoxbdj" v-if="hide" @click="hide = false">
|
||||||
<div>
|
<div>
|
||||||
<b><Fa :icon="faExclamationTriangle"/> {{ $t('sensitive') }}</b>
|
<b><Fa :icon="faExclamationTriangle"/> {{ $ts.sensitive }}</b>
|
||||||
<span>{{ $t('clickToShow') }}</span>
|
<span>{{ $ts.clickToShow }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="kkjnbbplepmiyuadieoenjgutgcmtsvu" v-else>
|
<div class="kkjnbbplepmiyuadieoenjgutgcmtsvu" v-else>
|
||||||
@@ -48,7 +48,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.hide = this.video.isSensitive && !this.$store.state.device.alwaysShowNsfw;
|
this.hide = (this.$store.state.nsfw === 'force') ? true : this.video.isSensitive && (this.$store.state.nsfw !== 'ignore');
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<MkA class="ldlomzub" :class="{ isMe }" :to="url" v-user-preview="canonical" v-if="url.startsWith('/')">
|
<MkA class="ldlomzub" :class="{ isMe }" :to="url" v-user-preview="canonical" v-if="url.startsWith('/')">
|
||||||
<span class="me" v-if="isMe">{{ $t('you') }}</span>
|
<span class="me" v-if="isMe">{{ $ts.you }}</span>
|
||||||
<span class="main">
|
<span class="main">
|
||||||
<span class="username">@{{ username }}</span>
|
<span class="username">@{{ username }}</span>
|
||||||
<span class="host" v-if="(host != localHost) || $store.state.settings.showFullAcct">@{{ toUnicode(host) }}</span>
|
<span class="host" v-if="(host != localHost) || $store.state.showFullAcct">@{{ toUnicode(host) }}</span>
|
||||||
</span>
|
</span>
|
||||||
</MkA>
|
</MkA>
|
||||||
<a class="ldlomzub" :href="url" target="_blank" rel="noopener" v-else>
|
<a class="ldlomzub" :href="url" target="_blank" rel="noopener" v-else>
|
||||||
@@ -50,8 +50,8 @@ export default defineComponent({
|
|||||||
return this.host === localHost ? `@${this.username}` : `@${this.username}@${toUnicode(this.host)}`;
|
return this.host === localHost ? `@${this.username}` : `@${this.username}@${toUnicode(this.host)}`;
|
||||||
},
|
},
|
||||||
isMe(): boolean {
|
isMe(): boolean {
|
||||||
return this.$store.getters.isSignedIn && (
|
return this.$i && (
|
||||||
`@${this.username}@${toUnicode(this.host)}` === `@${this.$store.state.i.username}@${toUnicode(localHost)}`.toLowerCase()
|
`@${this.username}@${toUnicode(this.host)}` === `@${this.$i.username}@${toUnicode(localHost)}`.toLowerCase()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
import { VNode, defineComponent, h } from 'vue';
|
import { VNode, defineComponent, h } from 'vue';
|
||||||
import { MfmForest } from '../../mfm/prelude';
|
import { MfmForest } from '@/../mfm/prelude';
|
||||||
import { parse, parsePlain } from '../../mfm/parse';
|
import { parse, parsePlain } from '@/../mfm/parse';
|
||||||
import MkUrl from './url.vue';
|
import MkUrl from '@/components/global/url.vue';
|
||||||
import MkLink from './link.vue';
|
import MkLink from '@/components/link.vue';
|
||||||
import MkMention from './mention.vue';
|
import MkMention from '@/components/mention.vue';
|
||||||
import MkEmoji from './emoji.vue';
|
import MkEmoji from '@/components/global/emoji.vue';
|
||||||
import { concat } from '../../prelude/array';
|
import { concat } from '@/../prelude/array';
|
||||||
import MkFormula from './formula.vue';
|
import MkFormula from '@/components/formula.vue';
|
||||||
import MkCode from './code.vue';
|
import MkCode from '@/components/code.vue';
|
||||||
import MkGoogle from './google.vue';
|
import MkGoogle from '@/components/google.vue';
|
||||||
import MkA from './ui/a.vue';
|
import MkA from '@/components/global/a.vue';
|
||||||
import { host } from '@/config';
|
import { host } from '@/config';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@@ -77,10 +77,66 @@ export default defineComponent({
|
|||||||
}, genEl(token.children));
|
}, genEl(token.children));
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'big': {
|
case 'fn': {
|
||||||
return h('strong', {
|
// TODO: CSSを文字列で組み立てていくと token.node.props.args.~~~ 経由でCSSインジェクションできるのでよしなにやる
|
||||||
style: `display: inline-block; font-size: 150%;` + (this.$store.state.device.animatedMfm ? 'animation: anime-tada 1s linear infinite both;' : ''),
|
let style;
|
||||||
}, genEl(token.children));
|
switch (token.node.props.name) {
|
||||||
|
case 'tada': {
|
||||||
|
style = `font-size: 150%;` + (this.$store.state.animatedMfm ? 'animation: tada 1s linear infinite both;' : '');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'jelly': {
|
||||||
|
const speed = token.node.props.args.speed || '1s';
|
||||||
|
style = (this.$store.state.animatedMfm ? `animation: mfm-rubberBand ${speed} linear infinite both;` : '');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'twitch': {
|
||||||
|
const speed = token.node.props.args.speed || '0.5s';
|
||||||
|
style = this.$store.state.animatedMfm ? `animation: mfm-twitch ${speed} ease infinite;` : '';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'shake': {
|
||||||
|
const speed = token.node.props.args.speed || '0.5s';
|
||||||
|
style = this.$store.state.animatedMfm ? `animation: mfm-shake ${speed} ease infinite;` : '';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'spin': {
|
||||||
|
const direction =
|
||||||
|
token.node.props.args.left ? 'reverse' :
|
||||||
|
token.node.props.args.alternate ? 'alternate' :
|
||||||
|
'normal';
|
||||||
|
const anime =
|
||||||
|
token.node.props.args.x ? 'mfm-spinX' :
|
||||||
|
token.node.props.args.y ? 'mfm-spinY' :
|
||||||
|
'mfm-spin';
|
||||||
|
const speed = token.node.props.args.speed || '1.5s';
|
||||||
|
style = this.$store.state.animatedMfm ? `animation: ${anime} ${speed} linear infinite; animation-direction: ${direction};` : '';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'jump': {
|
||||||
|
style = this.$store.state.animatedMfm ? 'animation: mfm-jump 0.75s linear infinite;' : '';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'bounce': {
|
||||||
|
style = this.$store.state.animatedMfm ? 'animation: mfm-bounce 0.75s linear infinite; transform-origin: center bottom;' : '';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'flip': {
|
||||||
|
const transform =
|
||||||
|
(token.node.props.args.h && token.node.props.args.v) ? 'scale(-1, -1)' :
|
||||||
|
token.node.props.args.v ? 'scaleY(-1)' :
|
||||||
|
'scaleX(-1)';
|
||||||
|
style = `transform: ${transform};`;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (style == null) {
|
||||||
|
return h('span', {}, ['[', token.node.props.name, ...genEl(token.children), ']']);
|
||||||
|
} else {
|
||||||
|
return h('span', {
|
||||||
|
style: 'display: inline-block;' + style,
|
||||||
|
}, genEl(token.children));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'small': {
|
case 'small': {
|
||||||
@@ -95,36 +151,6 @@ export default defineComponent({
|
|||||||
}, genEl(token.children))];
|
}, genEl(token.children))];
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'motion': {
|
|
||||||
return h('span', {
|
|
||||||
style: 'display: inline-block;' + (this.$store.state.device.animatedMfm ? 'animation: anime-rubberBand 1s linear infinite both;' : ''),
|
|
||||||
}, genEl(token.children));
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'spin': {
|
|
||||||
const direction =
|
|
||||||
token.node.props.attr == 'left' ? 'reverse' :
|
|
||||||
token.node.props.attr == 'alternate' ? 'alternate' :
|
|
||||||
'normal';
|
|
||||||
const style = this.$store.state.device.animatedMfm
|
|
||||||
? `animation: anime-spin 1.5s linear infinite; animation-direction: ${direction};` : '';
|
|
||||||
return h('span', {
|
|
||||||
style: 'display: inline-block;' + style
|
|
||||||
}, genEl(token.children));
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'jump': {
|
|
||||||
return h('span', {
|
|
||||||
style: this.$store.state.device.animatedMfm ? 'display: inline-block; animation: anime-jump 0.75s linear infinite;' : 'display: inline-block;'
|
|
||||||
}, genEl(token.children));
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'flip': {
|
|
||||||
return h('span', {
|
|
||||||
style: 'display: inline-block; transform: scaleX(-1);'
|
|
||||||
}, genEl(token.children));
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'url': {
|
case 'url': {
|
||||||
return [h(MkUrl, {
|
return [h(MkUrl, {
|
||||||
key: Math.random(),
|
key: Math.random(),
|
||||||
@@ -186,17 +212,10 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'title': {
|
|
||||||
return [h('div', {
|
|
||||||
class: 'title'
|
|
||||||
}, genEl(token.children))];
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'emoji': {
|
case 'emoji': {
|
||||||
return [h(MkEmoji, {
|
return [h(MkEmoji, {
|
||||||
key: Math.random(),
|
key: Math.random(),
|
||||||
emoji: token.node.props.emoji,
|
emoji: token.node.props.name ? `:${token.node.props.name}:` : token.node.props.emoji,
|
||||||
name: token.node.props.name,
|
|
||||||
customEmojis: this.customEmojis,
|
customEmojis: this.customEmojis,
|
||||||
normal: this.plain
|
normal: this.plain
|
||||||
})];
|
})];
|
||||||
|
|||||||
@@ -1,51 +0,0 @@
|
|||||||
<template>
|
|
||||||
<mfm-core v-bind="$attrs" class="havbbuyv" :class="{ nowrap: $attrs['nowrap'] }"/>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import { defineComponent } from 'vue';
|
|
||||||
import MfmCore from './mfm';
|
|
||||||
|
|
||||||
export default defineComponent({
|
|
||||||
components: {
|
|
||||||
MfmCore
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.havbbuyv {
|
|
||||||
white-space: pre-wrap;
|
|
||||||
|
|
||||||
&.nowrap {
|
|
||||||
white-space: pre;
|
|
||||||
word-wrap: normal; // https://codeday.me/jp/qa/20190424/690106.html
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep(.quote) {
|
|
||||||
display: block;
|
|
||||||
margin: 8px;
|
|
||||||
padding: 6px 0 6px 12px;
|
|
||||||
color: var(--fg);
|
|
||||||
border-left: solid 3px var(--fg);
|
|
||||||
opacity: 0.7;
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep(pre) {
|
|
||||||
font-size: 0.8em;
|
|
||||||
}
|
|
||||||
|
|
||||||
> ::v-deep(code) {
|
|
||||||
font-size: 0.8em;
|
|
||||||
word-break: break-all;
|
|
||||||
padding: 4px 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep(.title) {
|
|
||||||
text-align: center;
|
|
||||||
border-bottom: solid 1px var(--divider);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user