Compare commits

...

453 Commits

Author SHA1 Message Date
d1bd9fa552 12.62.0 2020-12-05 18:38:46 +09:00
393bd76959 New Crowdin updates (#6907)
* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)
2020-12-05 18:38:10 +09:00
97165fbaf5 トップページを強化 2020-12-05 18:18:37 +09:00
feca9940bc トップページデザインを改修 2020-12-05 16:05:40 +09:00
fbbc7d005d 🎨 2020-12-05 12:57:15 +09:00
af5b4749b0 Use vuedraggable instead of vue-draggable-next
Fix #6852
2020-12-05 12:50:09 +09:00
b4e5fe7e71 Update deps
Fix #6915
2020-12-05 11:01:27 +09:00
1671aef0bd Merge pull request #6919 from syuilo/dependabot/npm_and_yarn/vue/compiler-sfc-3.0.4 2020-12-05 01:32:00 +00:00
ffe5a12773 Merge pull request #6918 from syuilo/dependabot/npm_and_yarn/types/qrcode-1.3.5 2020-12-04 20:28:57 +00:00
9ca01b65de Bump @vue/compiler-sfc from 3.0.3 to 3.0.4
Bumps [@vue/compiler-sfc](https://github.com/vuejs/vue-next/tree/HEAD/packages/compiler-sfc) from 3.0.3 to 3.0.4.
- [Release notes](https://github.com/vuejs/vue-next/releases)
- [Changelog](https://github.com/vuejs/vue-next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-next/commits/v3.0.4/packages/compiler-sfc)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-04 20:24:03 +00:00
f50ed905a8 Merge pull request #6917 from syuilo/dependabot/npm_and_yarn/types/markdown-it-10.0.3 2020-12-04 20:23:55 +00:00
d7156b8cdd Bump @types/qrcode from 1.3.4 to 1.3.5
Bumps [@types/qrcode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/qrcode) from 1.3.4 to 1.3.5.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/qrcode)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-04 20:21:32 +00:00
14442ffa18 Merge pull request #6916 from syuilo/dependabot/npm_and_yarn/postcss-8.1.14 2020-12-04 20:21:10 +00:00
d454596c33 Bump @types/markdown-it from 10.0.1 to 10.0.3
Bumps [@types/markdown-it](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/markdown-it) from 10.0.1 to 10.0.3.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/markdown-it)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-04 20:14:19 +00:00
7d510cf780 Bump postcss from 8.1.6 to 8.1.14
Bumps [postcss](https://github.com/postcss/postcss) from 8.1.6 to 8.1.14.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.1.6...8.1.14)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-04 20:13:50 +00:00
8121cbf10c Merge pull request #6914 from syuilo/dependabot/npm_and_yarn/ts-node-9.1.0 2020-12-03 20:38:23 +00:00
d34d20c393 Merge pull request #6912 from syuilo/dependabot/npm_and_yarn/apexcharts-3.22.2 2020-12-03 20:30:33 +00:00
e773c272be Bump ts-node from 9.0.0 to 9.1.0
Bumps [ts-node](https://github.com/TypeStrong/ts-node) from 9.0.0 to 9.1.0.
- [Release notes](https://github.com/TypeStrong/ts-node/releases)
- [Commits](https://github.com/TypeStrong/ts-node/compare/v9.0.0...v9.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-03 20:29:37 +00:00
0c072249d8 Merge pull request #6911 from syuilo/dependabot/npm_and_yarn/cli-highlight-2.1.9 2020-12-03 20:29:02 +00:00
d0b7b662b4 Bump apexcharts from 3.22.1 to 3.22.2
Bumps [apexcharts](https://github.com/apexcharts/apexcharts.js) from 3.22.1 to 3.22.2.
- [Release notes](https://github.com/apexcharts/apexcharts.js/releases)
- [Commits](https://github.com/apexcharts/apexcharts.js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-03 20:22:14 +00:00
4b5aa286a0 Merge pull request #6910 from syuilo/dependabot/npm_and_yarn/types/rename-1.0.2 2020-12-03 20:21:58 +00:00
2310c74d0b Bump cli-highlight from 2.1.4 to 2.1.9
Bumps [cli-highlight](https://github.com/felixfbecker/cli-highlight) from 2.1.4 to 2.1.9.
- [Release notes](https://github.com/felixfbecker/cli-highlight/releases)
- [Commits](https://github.com/felixfbecker/cli-highlight/compare/v2.1.4...v2.1.9)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-03 20:21:51 +00:00
af251bf0c4 Merge pull request #6909 from syuilo/dependabot/npm_and_yarn/types/parsimmon-1.10.5 2020-12-03 20:21:51 +00:00
16204ac13b Merge pull request #6908 from syuilo/dependabot/npm_and_yarn/babel/plugin-transform-runtime-7.12.1 2020-12-03 20:21:39 +00:00
7c8645fe29 Bump @types/rename from 1.0.1 to 1.0.2
Bumps [@types/rename](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/rename) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/rename)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-03 20:14:13 +00:00
bd82173caa Bump @types/parsimmon from 1.10.4 to 1.10.5
Bumps [@types/parsimmon](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/parsimmon) from 1.10.4 to 1.10.5.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/parsimmon)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-03 20:13:45 +00:00
2e8a0b0fac Bump @babel/plugin-transform-runtime from 7.11.0 to 7.12.1
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.11.0 to 7.12.1.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.1/packages/babel-plugin-transform-runtime)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-03 20:13:38 +00:00
38b7f4364c 12.61.1 2020-12-03 23:08:42 +09:00
3a33e406c7 Add suffix slot to MkLink 2020-12-03 23:06:46 +09:00
8d0c5268d1 update deps 2020-12-03 22:57:47 +09:00
08bec5abd9 New Crowdin updates (#6869)
* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)
2020-12-03 22:54:00 +09:00
cc4b6e5eea 🎨 2020-12-03 22:52:50 +09:00
e6cb07bef4 Merge pull request #6903 from syuilo/dependabot/npm_and_yarn/postcss-loader-4.1.0 2020-12-02 20:33:03 +00:00
249bfcc5f0 Bump postcss-loader from 4.0.4 to 4.1.0
Bumps [postcss-loader](https://github.com/webpack-contrib/postcss-loader) from 4.0.4 to 4.1.0.
- [Release notes](https://github.com/webpack-contrib/postcss-loader/releases)
- [Changelog](https://github.com/webpack-contrib/postcss-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/postcss-loader/compare/v4.0.4...v4.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-02 20:23:27 +00:00
108c4b4342 Merge pull request #6902 from syuilo/dependabot/npm_and_yarn/pg-8.5.1 2020-12-02 20:23:14 +00:00
38befa51ac Bump pg from 8.4.2 to 8.5.1
Bumps [pg](https://github.com/brianc/node-postgres) from 8.4.2 to 8.5.1.
- [Release notes](https://github.com/brianc/node-postgres/releases)
- [Changelog](https://github.com/brianc/node-postgres/blob/master/CHANGELOG.md)
- [Commits](https://github.com/brianc/node-postgres/compare/pg@8.4.2...pg@8.5.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-02 20:13:54 +00:00
6a76118710 Merge pull request #6898 from syuilo/dependabot/npm_and_yarn/eslint-7.14.0 2020-12-01 21:05:39 +00:00
f049694fa1 Bump eslint from 7.12.1 to 7.14.0
Bumps [eslint](https://github.com/eslint/eslint) from 7.12.1 to 7.14.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v7.12.1...v7.14.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-01 20:14:15 +00:00
515a6b74a2 Merge pull request #6892 from syuilo/dependabot/npm_and_yarn/webpack-5.9.0 2020-11-30 20:52:58 +00:00
d1291b3b4c Bump webpack from 5.8.0 to 5.9.0
Bumps [webpack](https://github.com/webpack/webpack) from 5.8.0 to 5.9.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.8.0...v5.9.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-30 20:45:20 +00:00
d2abc28a2b Merge pull request #6895 from syuilo/dependabot/npm_and_yarn/markdown-it-anchor-6.0.1 2020-11-30 20:43:55 +00:00
12142f8c5e Merge pull request #6893 from syuilo/dependabot/npm_and_yarn/types/ws-7.4.0 2020-11-30 20:43:01 +00:00
41d7a8de66 Bump @types/ws from 7.2.7 to 7.4.0
Bumps [@types/ws](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/ws) from 7.2.7 to 7.4.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/ws)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-30 20:33:08 +00:00
c7a65c13aa Bump markdown-it-anchor from 6.0.0 to 6.0.1
Bumps [markdown-it-anchor](https://github.com/valeriangalliat/markdown-it-anchor) from 6.0.0 to 6.0.1.
- [Release notes](https://github.com/valeriangalliat/markdown-it-anchor/releases)
- [Changelog](https://github.com/valeriangalliat/markdown-it-anchor/blob/master/CHANGELOG.md)
- [Commits](https://github.com/valeriangalliat/markdown-it-anchor/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-30 20:31:09 +00:00
fbf0baadba Merge pull request #6891 from syuilo/dependabot/npm_and_yarn/types/webpack-4.41.25 2020-11-30 20:30:45 +00:00
ea31e62795 Merge pull request #6890 from syuilo/dependabot/npm_and_yarn/types/parsimmon-1.10.4 2020-11-30 20:24:37 +00:00
910b145f42 Merge pull request #6889 from syuilo/dependabot/npm_and_yarn/types/bull-3.14.4 2020-11-30 20:23:15 +00:00
952a793f80 Merge pull request #6886 from syuilo/dependabot/npm_and_yarn/elastic/elasticsearch-7.10.0 2020-11-30 20:23:10 +00:00
46f2ffaa5c Bump @types/webpack from 4.41.24 to 4.41.25
Bumps [@types/webpack](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/webpack) from 4.41.24 to 4.41.25.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/webpack)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-30 20:22:49 +00:00
45ba7989c1 Merge pull request #6887 from syuilo/dependabot/npm_and_yarn/nodemailer-6.4.16 2020-11-30 20:22:32 +00:00
c4cf3331e9 Bump @types/parsimmon from 1.10.2 to 1.10.4
Bumps [@types/parsimmon](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/parsimmon) from 1.10.2 to 1.10.4.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/parsimmon)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-30 20:16:00 +00:00
6d75ca0bcb Bump @types/bull from 3.14.0 to 3.14.4
Bumps [@types/bull](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/bull) from 3.14.0 to 3.14.4.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/bull)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-30 20:15:30 +00:00
050fb55326 Bump nodemailer from 6.4.15 to 6.4.16
Bumps [nodemailer](https://github.com/nodemailer/nodemailer) from 6.4.15 to 6.4.16.
- [Release notes](https://github.com/nodemailer/nodemailer/releases)
- [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodemailer/nodemailer/compare/v6.4.15...v6.4.16)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-30 20:14:30 +00:00
9d1d9c3540 Bump @elastic/elasticsearch from 7.8.0 to 7.10.0
Bumps [@elastic/elasticsearch](https://github.com/elastic/elasticsearch-js) from 7.8.0 to 7.10.0.
- [Release notes](https://github.com/elastic/elasticsearch-js/releases)
- [Changelog](https://github.com/elastic/elasticsearch-js/blob/master/docs/breaking-changes.asciidoc)
- [Commits](https://github.com/elastic/elasticsearch-js/compare/v7.8.0...v7.10.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-30 20:14:13 +00:00
fdde966808 利用規約へのリンクをインスタンス情報ページに追加 2020-11-29 22:59:09 +09:00
c6ce7b1045 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-11-29 22:38:39 +09:00
ce743054d6 🎨 2020-11-29 22:37:56 +09:00
99970b6864 Bump @types/ratelimiter from 2.1.28 to 3.4.0 (#6882)
Bumps [@types/ratelimiter](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/ratelimiter) from 2.1.28 to 3.4.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/ratelimiter)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-11-29 22:18:50 +09:00
42110bcd33 Fix #6701 2020-11-29 22:13:10 +09:00
9677b0bfb1 ユーザーページで横にページが広がる場合がある問題を修正 2020-11-29 21:53:21 +09:00
a7762972fa 12.61.0 2020-11-29 19:27:24 +09:00
dda3b4152e [Security] Bump systeminformation from 4.28.1 to 4.30.7 (#6885)
Bumps [systeminformation](https://github.com/sebhildebrandt/systeminformation) from 4.28.1 to 4.30.7. **This update includes a security fix.**
- [Release notes](https://github.com/sebhildebrandt/systeminformation/releases)
- [Changelog](https://github.com/sebhildebrandt/systeminformation/blob/v4.30.7/CHANGELOG.md)
- [Commits](https://github.com/sebhildebrandt/systeminformation/compare/v4.28.1...v4.30.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-11-29 18:53:04 +09:00
b7aa6d6c1f Bump vue-router from 4.0.0-rc.2 to 4.0.0-rc.5 (#6877)
Bumps [vue-router](https://github.com/vuejs/vue-router) from 4.0.0-rc.2 to 4.0.0-rc.5.
- [Release notes](https://github.com/vuejs/vue-router/releases)
- [Changelog](https://github.com/vuejs/vue-router/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-router/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-11-29 18:52:16 +09:00
909a3b805f Bump ws from 7.3.1 to 7.4.0 (#6875)
Bumps [ws](https://github.com/websockets/ws) from 7.3.1 to 7.4.0.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.3.1...7.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-11-29 18:51:30 +09:00
848d2e00e7 Merge pull request #6881 from syuilo/dependabot/npm_and_yarn/types/jsdom-16.2.5 2020-11-29 09:50:04 +00:00
642662941f Merge pull request #6879 from syuilo/dependabot/npm_and_yarn/types/koa__multer-2.0.2 2020-11-29 09:43:59 +00:00
0028a529a8 Merge pull request #6876 from syuilo/dependabot/npm_and_yarn/types/fluent-ffmpeg-2.1.16 2020-11-29 09:40:29 +00:00
62131e864b Merge pull request #6874 from syuilo/dependabot/npm_and_yarn/sass-loader-10.1.0 2020-11-29 09:38:45 +00:00
0c58b43831 Merge pull request #6873 from syuilo/dependabot/npm_and_yarn/types/redis-2.8.28 2020-11-29 09:37:10 +00:00
5a3d6c4fba Bump @types/jsdom from 16.2.3 to 16.2.5
Bumps [@types/jsdom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jsdom) from 16.2.3 to 16.2.5.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jsdom)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-29 09:34:59 +00:00
a031fa3875 Merge pull request #6871 from syuilo/dependabot/npm_and_yarn/highlight.js-9.18.5 2020-11-29 09:34:35 +00:00
721ed97a83 Bump @types/koa__multer from 2.0.1 to 2.0.2
Bumps [@types/koa__multer](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/koa__multer) from 2.0.1 to 2.0.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/koa__multer)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-29 09:29:56 +00:00
944927ac2d Bump @types/fluent-ffmpeg from 2.1.14 to 2.1.16
Bumps [@types/fluent-ffmpeg](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/fluent-ffmpeg) from 2.1.14 to 2.1.16.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/fluent-ffmpeg)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-29 09:28:32 +00:00
7705749d28 Bump sass-loader from 10.0.5 to 10.1.0
Bumps [sass-loader](https://github.com/webpack-contrib/sass-loader) from 10.0.5 to 10.1.0.
- [Release notes](https://github.com/webpack-contrib/sass-loader/releases)
- [Changelog](https://github.com/webpack-contrib/sass-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/sass-loader/compare/v10.0.5...v10.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-29 09:27:39 +00:00
cf7f42ebc4 Bump @types/redis from 2.8.25 to 2.8.28
Bumps [@types/redis](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/redis) from 2.8.25 to 2.8.28.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/redis)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-29 09:27:10 +00:00
f195968b6d [Security] Bump highlight.js from 9.18.1 to 9.18.5
Bumps [highlight.js](https://github.com/highlightjs/highlight.js) from 9.18.1 to 9.18.5. **This update includes a security fix.**
- [Release notes](https://github.com/highlightjs/highlight.js/releases)
- [Changelog](https://github.com/highlightjs/highlight.js/blob/9.18.5/CHANGES.md)
- [Commits](https://github.com/highlightjs/highlight.js/compare/9.18.1...9.18.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-29 09:26:32 +00:00
4d6bffdc8a スクラッチパッドが動かないのを修正 2020-11-29 18:22:35 +09:00
f62c6a05a9 Improve setting page 2020-11-29 18:06:35 +09:00
fa550a2a78 note/clip/page タブをmobileでも 2020-11-29 17:47:49 +09:00
960c27375c 🎨 2020-11-29 17:32:51 +09:00
e87b3e2933 wip 2020-11-29 16:37:33 +09:00
133766bf8c Use BIZ UDGothic 2020-11-29 16:26:50 +09:00
aa6b25e9e7 wip 2020-11-29 16:25:44 +09:00
abde13221f 🎨 2020-11-29 12:46:05 +09:00
cb17be5e2b New Crowdin updates (#6867)
* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Ukrainian)
2020-11-29 12:40:21 +09:00
17d62b689d wip 2020-11-29 12:34:39 +09:00
9bf5dc67f5 wip 2020-11-29 11:25:43 +09:00
4eab9b4354 wip 2020-11-29 00:43:03 +09:00
d39c153c57 wip 2020-11-29 00:18:54 +09:00
e5992742d4 Update README.md 2020-11-28 18:20:38 +09:00
72ed803c2a 12.60.1 2020-11-28 14:21:54 +09:00
9ec0e59431 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-11-28 14:21:42 +09:00
5328ed64f3 lint 2020-11-28 14:21:33 +09:00
33e8d61d65 New Crowdin updates (#6855)
* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Ukrainian)
2020-11-28 14:20:46 +09:00
3584786387 Use Node v14.15.1 (#6861)
https://nodejs.org/en/blog/vulnerability/november-2020-security-releases/
2020-11-28 14:20:32 +09:00
34f662ead5 Tweak wallpaperOverlay 2020-11-28 13:30:09 +09:00
2d53481cf5 Update style.scss 2020-11-28 13:08:07 +09:00
10fb029609 Resolve #6858 2020-11-28 13:05:57 +09:00
0281961f15 Update about page 2020-11-28 12:44:39 +09:00
fede4eeb89 wip 2020-11-28 12:19:57 +09:00
ab50d5ef20 wip 2020-11-28 12:15:22 +09:00
f4e02d4a4c Tweak style 2020-11-28 11:53:18 +09:00
167640df8d Update vue 2020-11-28 11:53:08 +09:00
fe01437aa4 Update about-misskey page 2020-11-28 11:52:57 +09:00
037fce4d6a Use BIZ UDPGothic 2020-11-27 21:44:14 +09:00
db8b824b84 12.60.0 2020-11-25 21:41:50 +09:00
b71f62535d New Crowdin updates (#6851)
* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)
2020-11-25 21:36:55 +09:00
e9a1e281b9 Fix #6854 2020-11-25 21:33:57 +09:00
0144408500 nanka iroiro (#6853)
* wip

* Update maps.ts

* wip

* wip

* wip

* wip

* Update base.vue

* wip

* wip

* wip

* wip

* Update link.vue

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Update privacy.vue

* wip

* wip

* wip

* wip

* Update range.vue

* wip

* wip

* wip

* wip

* Update profile.vue

* wip

* Update a.vue

* Update index.vue

* wip

* Update sidebar.vue

* wip

* wip

* Update account-info.vue

* Update a.vue

* wip

* wip

* Update sounds.vue

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Update account-info.vue

* Update account-info.vue

* wip

* wip

* wip

* Update d-persimmon.json5

* wip
2020-11-25 21:31:34 +09:00
7660839e40 フォントレンダリングを調整 2020-11-22 17:58:08 +09:00
d1ca851ebe Update webpack 2020-11-21 00:48:00 +09:00
35a281d443 Update reversi maps 2020-11-19 17:16:48 +09:00
c2690fff47 ✌️ 2020-11-19 14:11:29 +09:00
c3a73a41d1 12.59.0 2020-11-18 13:06:32 +09:00
b72baa3295 New Crowdin updates (#6841)
* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (French)
2020-11-18 12:40:40 +09:00
73ce22c8a4 Update dependencies 🚀 2020-11-18 12:19:11 +09:00
c4f7e6659f Improve reaction picker 2020-11-18 12:09:14 +09:00
0739ae006d Improve usability 2020-11-18 11:21:35 +09:00
eaa92e784d Resolve #6840 2020-11-17 22:52:07 +09:00
48589e0da1 12.58.0 2020-11-17 15:04:15 +09:00
0044d83801 nanka iroiro (#6847)
* wip

* wip

* wip

* wip

* Update ja-JP.yml

* wip

* wip

* wip
2020-11-17 14:59:15 +09:00
50e917d232 12.57.4 2020-11-15 17:40:53 +09:00
ccd14e0462 クリップのOGP対応 2020-11-15 17:40:49 +09:00
d0c0104546 12.57.3 2020-11-15 17:35:44 +09:00
cd34ade638 非ログイン時にクリップを取得できない問題を修正 2020-11-15 17:35:40 +09:00
3f91e33a8c 12.57.2 2020-11-15 17:32:36 +09:00
17cc996288 他人のpublicなクリップを取得できない問題を修正 2020-11-15 17:32:29 +09:00
385776dc0f Update config.yml 2020-11-15 16:06:18 +09:00
e52278c371 12.57.1 2020-11-15 16:04:21 +09:00
7ffc8c1eda Update config.yml
https://support.circleci.com/hc/en-us/articles/360050934711
2020-11-15 16:04:08 +09:00
1359615c82 Add missing translations 2020-11-15 14:18:35 +09:00
7a7a56940c 一旦パブリックにしないとクリップ作成できない問題を修正 2020-11-15 14:18:25 +09:00
bcbe83cb38 12.57.0 2020-11-15 13:50:02 +09:00
37f983aee3 New Crowdin updates (#6838)
* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Kabyle)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (French)
2020-11-15 13:49:38 +09:00
77de3f2b9d Pages埋め込みノートで詳細表示にするかどうか選べるように 2020-11-15 13:47:15 +09:00
f655b54937 Improve Pages
Resolve #6654
2020-11-15 13:42:04 +09:00
cac99ebdd4 wip: clip 2020-11-15 12:47:54 +09:00
f0d0a1546a Use node v14.15.0 (#6837)
* Use node v14.15.0

* Update Dockerfile
2020-11-15 12:35:28 +09:00
8e8459fa55 wip: clip 2020-11-15 12:34:47 +09:00
d53c55ecb5 wip: clip 2020-11-15 12:04:54 +09:00
ea33d61a90 Add description 2020-11-15 10:35:36 +09:00
2fcc3388dd Update about-misskey.vue 2020-11-15 10:21:56 +09:00
ef7f033c32 CI: Node 15.x でも回すように (#6836) 2020-11-14 15:13:59 +09:00
7aa54dc92e Update Dockerfile 2020-11-14 15:12:43 +09:00
d10ad1b413 12.56.0 2020-11-14 14:34:04 +09:00
34063a0b84 New Crowdin updates (#6820)
* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)
2020-11-14 14:32:53 +09:00
8c9d975d69 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-11-14 14:32:04 +09:00
03b072b894 Resolve #6704 2020-11-14 14:32:01 +09:00
d1bed49808 typoらしきものを修正 (#6825)
mame→name
2020-11-14 12:52:38 +09:00
6c3417d9b5 Improve MkRadios 2020-11-14 12:50:24 +09:00
ba65226460 UI整理 2020-11-14 12:16:28 +09:00
9c9cd168ee Improve emoji picker 2020-11-14 11:47:30 +09:00
abb3d2a8d9 Fix #6832 2020-11-14 09:59:33 +09:00
637fe8a04b Update dependencies 🚀 2020-11-14 09:54:39 +09:00
be321e95e5 Bump node version 2020-11-14 09:45:16 +09:00
ed46c1486c Fix toHtml (#6824) 2020-11-10 21:00:14 +09:00
c9fcfc6862 Better MFM rendering 2020-11-09 22:32:01 +09:00
8495e37566 Fix router 2020-11-09 22:31:50 +09:00
247bd43ae2 12.55.0 2020-11-08 17:10:43 +09:00
a6685b1559 New Crowdin updates (#6814)
* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Kabyle)

* New translations ja-JP.yml (Kannada)

* New translations ja-JP.yml (Uyghur)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (French)
2020-11-08 17:09:42 +09:00
66c4e8064b Add bounce MFM animation 2020-11-08 17:08:51 +09:00
9d1fa3f202 autoWatch機能を削除 2020-11-08 16:49:23 +09:00
a6985d7dc7 Fix #6819 2020-11-08 16:37:51 +09:00
027c021ac9 アスタリスク3つでのtadaアニメーションを復活 2020-11-08 16:35:22 +09:00
604205ec09 MFMチートシートに数式追加 2020-11-08 16:14:49 +09:00
77db016866 MFMチートシート 2020-11-08 15:24:46 +09:00
c6a009dbae 最近使用した絵文字からリアクションピッカーに設定してある絵文字は除外するように 2020-11-08 13:58:16 +09:00
4299e3f90c スマホでデスクトップモードにできないように 2020-11-08 13:39:36 +09:00
19f4812c03 Remove outdated test 2020-11-08 12:42:13 +09:00
d01c465a8d ユーザーピッカーに最近使用したユーザーを表示するように 2020-11-08 12:40:56 +09:00
4f1409601e Respect order when userIds specified 2020-11-08 12:40:31 +09:00
52cffe0864 絵文字ピッカーで最近使用した絵文字がバグっているのを修正
あとMkEmojiをリファクタリング
2020-11-08 12:08:07 +09:00
0866d5c055 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-11-08 11:25:31 +09:00
78c08f6503 Clean up 2020-11-08 11:25:28 +09:00
27d0ac3d75 In HTML to MFM, use angle bracket if needed (#6817) 2020-11-08 00:38:50 +09:00
a8776002f3 Improve readability 2020-11-07 23:43:03 +09:00
31aa008566 Improve MFM
MFMの構文を調整 + 新しいアニメーション追加
Resolve #6816
2020-11-07 23:41:21 +09:00
9d405b4581 絵文字ピッカーでエンターしたときに検索結果の先頭のもので確定できるように 2020-11-07 21:33:36 +09:00
80c490a18b 絵文字ピッカーでAND検索に対応 2020-11-07 21:28:28 +09:00
30c9c3739f 12.54.0 2020-11-07 12:49:16 +09:00
ee0e7a09e0 Update dependencies 🚀 2020-11-07 12:48:21 +09:00
bfd9577f0d 絵文字ピッカーを開いたときに画面がスクロールするのを修正 2020-11-07 12:35:12 +09:00
0cada4ca76 New Crowdin updates (#6801)
* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)
2020-11-07 12:32:27 +09:00
a718ccc0b6 Add missing languages (#6800) 2020-11-07 12:32:08 +09:00
1fcfd8e645 ヘッダーに表示されるタブのインジケーターを実装 (#6803)
* Implemente indicators on headers

* 微調整
2020-11-07 12:31:23 +09:00
c6dd932a0b Improve usability 2020-11-07 12:30:16 +09:00
b79eed01e0 絵文字ピッカーの検索に絵文字をペーストしたとき確定されないのを修正 2020-11-07 10:56:38 +09:00
3a7dbe9764 UI切り替えがサイドバーに設置されていない場合に機能しない問題を修正 2020-11-07 10:54:52 +09:00
bef2534fa8 絵文字ピッカーを強化 + 絵文字ピッカーをリアクションピッカーとして使えるように
Resolve #5079
Resolve #3219
2020-11-07 10:43:27 +09:00
888dcd2559 画像ダイアログでスクロールが発生しないように 2020-11-07 05:00:42 +09:00
2b69fca6bd 12.53.0 2020-11-03 22:11:23 +09:00
7d088d42b4 New Crowdin updates (#6797)
* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)
2020-11-03 22:08:29 +09:00
f8ad303b13 リバーシの観戦者を表示するように
Resolve #1830
2020-11-03 22:02:55 +09:00
3c59c6fc9b Refactoring 2020-11-03 20:36:12 +09:00
7353d729d7 ヘッダーの戻るボタンがページリロードすると消える問題を修正 2020-11-03 20:28:38 +09:00
62591e0e7a リバーシのリプレイ
Related #1240
2020-11-03 19:54:35 +09:00
012f15d84b chore: β 2020-11-03 17:17:42 +09:00
e57c6f94d2 Clean up 2020-11-03 17:16:38 +09:00
40b27e8ad8 Clean up 2020-11-03 17:13:21 +09:00
055e9f21b7 wip: Desktop UI 2020-11-03 17:04:37 +09:00
d7085b17fe wip: Desktop UI 2020-11-03 17:00:47 +09:00
0d4d7c9c0c Tweak page window initial size 2020-11-03 17:00:18 +09:00
99209d36e1 Fix bug of c3ae6f3a4 2020-11-03 16:21:28 +09:00
e2a9a0ff3d Refactoring 2020-11-03 15:59:13 +09:00
ab166959a4 Improve performance 2020-11-03 15:49:31 +09:00
ab692cfa3d Fix bug of c3ae6f3a4 2020-11-03 15:44:56 +09:00
c3ae6f3a4a Refactor 2020-11-03 15:22:55 +09:00
5ef4a52bbd Improve usability of emoji page 2020-11-03 10:54:41 +09:00
582768a5e4 チャットリンクの挙動を改善 2020-11-03 10:43:50 +09:00
1852d1cc6f Improve drive 2020-11-03 10:27:00 +09:00
7a5a541a4e 相対パスでコピーされるのを修正 2020-11-03 10:06:19 +09:00
72b03e009c 12.52.0 2020-11-02 17:28:13 +09:00
1b113c1045 Update webpack 🚀 2020-11-02 17:28:02 +09:00
54959557ea New Crowdin updates (#6766)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)
2020-11-02 17:27:42 +09:00
d44cb7f256 Add new MFM animation syntax 2020-11-02 15:37:42 +09:00
3d063c95d1 🎨 2020-11-02 15:16:48 +09:00
09cab605fc Add new MFM animation 2020-11-02 15:16:37 +09:00
666c8c0498 Improve usability 2020-11-01 22:49:08 +09:00
d3e764d7f9 Improve task manager 2020-11-01 22:43:19 +09:00
7060625adf Improve task manager etc 2020-11-01 22:09:16 +09:00
21b6e23e98 メモリリークの一因になってそうだったのでrefを渡すのを削除 2020-11-01 15:04:46 +09:00
a0f794e372 Improve task manager 2020-11-01 14:05:06 +09:00
9195504329 Improve task manager 2020-11-01 13:38:48 +09:00
8c5d9dd549 🎨 2020-11-01 12:32:34 +09:00
580f6a5b6c Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-11-01 12:26:58 +09:00
74e76b460b 🎨 2020-11-01 12:26:46 +09:00
c4570b37b7 🎨 2020-11-01 12:26:38 +09:00
cd0b0012d9 メッセージ (トーク/チャット) 削除の連合 (#6789) 2020-11-01 12:14:42 +09:00
c055b4d32d fix(client): ストリーミングのメモリリークを修正
SharedConnection や NonSharedConnection のインスタンスを Vue コンポーネントの data に含むと、Vue が Proxy に変換するため、Stream クラス内部でインスタンス同士の比較をしても false になり、使われなくなったインスタンスがメモリ上に残り続ける。
なお、チャンネルへの接続/切断は頻繁に行うものではないため、メモリリークといっても影響は軽微とみられる。
2020-11-01 11:57:34 +09:00
75a9ff832a タスクマネージャー(wip) 2020-11-01 11:39:38 +09:00
b64d3af1f3 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-10-31 10:19:12 +09:00
fb6605bb40 API: blocking/create or deleteで完全なUser情報を返すように 2020-10-31 10:19:10 +09:00
3bfae80fa7 補完でタブが効かなくなるケースを修正 (#6779) 2020-10-31 09:43:28 +09:00
cb16cb0610 Fix #6781 2020-10-31 09:39:22 +09:00
0baed1a275 チャンネル一覧でバナーが無いとチャンネル名が出ないのを修正 (#6778) 2020-10-31 05:53:02 +09:00
42162c8015 TOOLS: Created demote tool based on mark-admin.ts (#6776)
* TOOLS: Created demote tool based on mark-admin.ts

* TOOLS: Removed trailing whitespace on demote-admin.ts
2020-10-31 00:21:02 +09:00
0fab0c416d リバーシで相手のターンでも置くことができるのを修正 (#6777) 2020-10-30 22:39:33 +09:00
e2e262c8ce リンクをコピーでパスしかコピーされない問題を修正 (#6785) 2020-10-30 18:22:14 +09:00
cf6596203b 検索ショートカットが使えないのを修正 (#6783) 2020-10-30 16:42:51 +09:00
471911a54f Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-10-28 22:48:25 +09:00
9394f4f540 Fix error dialog 2020-10-28 22:47:57 +09:00
4e968216ad ドライブファイル参照がシステムユーザーで落ちるのを修正 (#6774) 2020-10-28 22:24:16 +09:00
84a7a9555f ウィンドウ右クリックでサイドビューで開けるように 2020-10-28 22:21:53 +09:00
8d12fd152b ウィンドウ内のリンクを右クリックしたときに「サイドビューで開く」が無いのを修正 2020-10-28 22:21:40 +09:00
629b765abc 12.51.0 2020-10-27 18:29:15 +09:00
63a89fa84a カスタム絵文字がつぶれる問題を修正 2020-10-27 18:28:37 +09:00
a3f89236a0 New Crowdin updates (#6760)
* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Japanese, Kansai)
2020-10-27 18:24:34 +09:00
01560abafb Fix #6762 2020-10-27 18:21:52 +09:00
b5698026ba Fix emojilist.json (#6764) 2020-10-27 18:15:35 +09:00
6258ce75b7 Reversi (#6765)
* wip

* wip

* wip

* wip

* Update game.setting.vue

* wip

* wip

* Update game.setting.vue

* wip

* Update game.board.vue

* wip

* Update sidebar.ts
2020-10-27 18:11:41 +09:00
6f34c74027 Update popup animation 2020-10-27 16:46:13 +09:00
8add4f359b 🎨 2020-10-27 16:45:24 +09:00
d8933c135f リモートインスタンス情報を強制更新するAPIを追加 2020-10-27 16:45:14 +09:00
eb350e8d6c Better favicon detection 2020-10-27 16:44:54 +09:00
615fedd64d Instance Ticker 2020-10-27 16:16:59 +09:00
25bd82ecaa Default behavior option for MkA component 2020-10-27 13:53:47 +09:00
e0938e5e3a Add animation of context menu 2020-10-25 23:22:27 +09:00
ec5e6c8443 APIコンソール 2020-10-25 16:11:08 +09:00
25d8077474 Fix bug 2020-10-25 15:45:47 +09:00
06083f40d9 🎨 2020-10-25 12:47:40 +09:00
ec203f7f79 Use MFM instead of v-html to avoid XSS 2020-10-25 12:25:13 +09:00
1b30d7d47a Clean up 2020-10-25 11:29:10 +09:00
d9be9c958f 投稿失敗したときにエラー表示するように 2020-10-25 11:19:20 +09:00
ed09796e0d 🎨 2020-10-25 11:06:55 +09:00
4bfa29c0ab コンテキストメニューの位置計算を改善 2020-10-25 11:01:03 +09:00
4804bbb211 インポート/エクスポート設定を復活 2020-10-25 10:48:33 +09:00
749102f9c2 ヘッダーにもコンテキストメニュー追加 2020-10-25 09:26:19 +09:00
0bcb1434b0 Refactor 2020-10-25 09:15:20 +09:00
2e537e618c 12.50.0 2020-10-25 01:30:38 +09:00
fe3b7a2ad3 New Crowdin updates (#6756)
* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)
2020-10-25 01:24:55 +09:00
90db793fd0 regesit 2020-10-25 01:24:01 +09:00
7bd2a6ad61 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-10-25 01:23:41 +09:00
745f4d2439 regedit 2020-10-25 01:23:23 +09:00
254cfaea28 自前ルーティング (#6759)
* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip
2020-10-25 01:21:41 +09:00
d4da5a1eea Update dependencies 🚀 2020-10-24 11:12:29 +09:00
c0f8297414 Fix migration bug 2020-10-23 17:46:31 +09:00
834cb2ea1a 12.49.1 2020-10-22 23:31:11 +09:00
d82769abd4 New Crowdin updates (#6748)
* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)
2020-10-22 23:30:54 +09:00
adf01ed4a4 Fix #6749 (#6754) 2020-10-22 23:10:23 +09:00
09c007b3aa Update dependencies 🚀 2020-10-22 23:09:03 +09:00
526ff177aa Update dependenceis 🚀 2020-10-21 22:20:03 +09:00
0e40d4e796 Clean up 2020-10-21 21:50:24 +09:00
172ebab7bd Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-10-21 19:36:50 +09:00
aa4493fe5c Fix api permission definition 2020-10-21 19:36:47 +09:00
a68a88f79e Update README.md 2020-10-20 17:32:17 +09:00
1de7dc94e1 Delete CHANGELOG.md 2020-10-19 20:55:19 +09:00
59cb7992e2 12.49.0 2020-10-19 19:43:30 +09:00
87b15df47b Auto adjust window size 2020-10-19 19:42:55 +09:00
6932d86240 New Crowdin updates (#6667)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (English)
2020-10-19 19:39:05 +09:00
87f61e714a Resolve #6087 2020-10-19 19:29:04 +09:00
5762e2d9ba 12.48.3 2020-10-19 15:06:26 +09:00
f0691c8a4f 🎨 2020-10-19 15:05:29 +09:00
6d7e4fe2a1 fb07116a4 のコミット忘れ 2020-10-19 14:50:57 +09:00
7dc789f470 Fix: optional chaining (#6747) 2020-10-19 14:48:56 +09:00
190d1bbf3c デフォルト公開範囲が機能していない問題を修正 2020-10-19 14:46:55 +09:00
a755dd5f9e Add note 2020-10-19 14:46:32 +09:00
0846a7b94e Remove unused themes 2020-10-19 13:20:00 +09:00
d8be0511f1 Fix design 2020-10-19 13:17:37 +09:00
fb07116a4c 🎨 2020-10-19 13:17:11 +09:00
fe453c15e3 ページのセクション内などが表示されない問題を修正 (#6746) 2020-10-19 09:30:21 +09:00
059aeef6a0 MFM のバッククオートで囲ったコードが表示されないのを修正 (#6741) 2020-10-19 08:37:07 +09:00
30e25451d6 Update settings.vue (#6742) 2020-10-19 08:23:50 +09:00
7f0fd55c9a 12.48.2 2020-10-18 22:23:36 +09:00
0e9b496deb 🎨 2020-10-18 21:21:52 +09:00
8294c18e70 🎨 2020-10-18 18:50:45 +09:00
39575b4696 🎨 2020-10-18 16:58:20 +09:00
29e9801d5c Resolve #6684
Co-Authored-By: sobadon <37328795+sobadon@users.noreply.github.com>
2020-10-18 16:43:22 +09:00
eaf83bffb0 LTL / GTLが無効でもボタンが表示されるのを修正 2020-10-18 16:33:23 +09:00
bb25ece745 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-10-18 16:10:38 +09:00
754b5629e4 🎨 2020-10-18 16:10:28 +09:00
ee63403548 Fix test (#6733) 2020-10-18 16:03:51 +09:00
87edeb41da Fix poll editor bug 2020-10-18 15:52:34 +09:00
41fe804587 Clean up 2020-10-18 15:52:26 +09:00
02466acc4b Fix page bug 2020-10-18 12:55:26 +09:00
8470a64e6b Fix page editor bug 2020-10-18 12:30:54 +09:00
9939e0f9a9 Clean up 2020-10-18 12:30:47 +09:00
ce5f552d0c Fix channel design 2020-10-18 12:16:42 +09:00
7d4c535233 Make unrenote button danger 2020-10-18 10:38:35 +09:00
57cd0fb93f Fix user page bug 2020-10-18 10:28:17 +09:00
a15299ae53 Improve api error dialog 2020-10-18 10:21:02 +09:00
1df7abfbb9 Improve waiting dialog 2020-10-18 10:11:34 +09:00
85a0f696bc ActivityPubでリモートのオブジェクトをGETするときのリクエストをHTTP Signatureで署名するオプション (#6731)
* Sign ActivityPub GET

* Fix v12, v12.48.0 UI bug
2020-10-18 01:46:40 +09:00
ba3c62bf9c Fix lint (#6732)
* Fix lint

* nl
2020-10-18 01:23:46 +09:00
c17e97b6a6 12.48.1 2020-10-18 00:55:43 +09:00
2d80cd0e7b Update ja-JP.yml 2020-10-18 00:54:29 +09:00
eedc572f0c Deckで長いタイトルのページを開くとヘッダーが伸びる問題を修正 2020-10-18 00:54:20 +09:00
2de1df3514 Add sample view in theme-editor 2020-10-18 00:49:02 +09:00
2d96af1255 Remove needless margin 2020-10-17 23:49:17 +09:00
163325ef89 Clean up 2020-10-17 23:48:12 +09:00
23979bf09a 12.48.0 2020-10-17 20:16:17 +09:00
7199e6f4e0 Migrate to Vue3 (#6587)
* Update reaction.vue

* fix  bug

* wip

* wip

* wjio

* wip

* Revert "wip"

This reverts commit e427f2160adf4e8a4147006e25a89854edab0033.

* wip

* wip

* wip

* Update init.ts

* Update drive-window.vue

* wip

* wip

* Use PascalCase for components

* Use PascalCase for components

* update dep

* wip

* wip

* wip

* Update init.ts

* wip

* Update paging.ts

* Update test.vue

* watch deep

* wip

* lint

* wip

* wip

* wip

* wip

* wiop

* wip

* Update webpack.config.ts

* alllow null poll

* wip

* wip

* wip

* wiop

* UI redesign & refactor (#6714)

* wip

* wip

* wip

* wip

* wip

* Update drive.vue

* Update word-mute.vue

* wip

* wip

* wip

* clean up

* wip

* Update default.vue

* wip

* Update notes.vue

* Update mfm.ts

* Update index.home.vue

* Update post-form.vue

* Update post-form-attaches.vue

* wip

* Update post-form.vue

* Update sidebar.vue

* wip

* wip

* Update index.vue

* wip

* Update default.vue

* Update index.vue

* Update index.vue

* wip

* Update post-form-attaches.vue

* Update note.vue

* wip

* clean up

* Update notes.vue

* wip

* wip

* Update ja-JP.yml

* wip

* wip

* Update index.vue

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Update default.vue

* wip

* Update _dark.json5

* wip

* wip

* wip

* clean up

* wip

* wip

* Update index.vue

* Update test.vue

* wip

* wip

* fix

* wip

* wip

* wip

* wip

* clena yop

* wip

* wip

* Update store.ts

* Update messaging-room.vue

* Update default.widgets.vue

* fix

* wip

* wip

* Update modal.vue

* wip

* Update os.ts

* Update os.ts

* Update deck.vue

* Update init.ts

* wip

* Update ja-JP.yml

* v-sizeは単にwindowのresizeを監視するだけで良いかもしれない

* Update modal.vue

* wip

* Update tooltip.ts

* wip

* wip

* wip

* wip

* wip

* Update image-viewer.vue

* wip

* wip

* Update style.scss

* Update style.scss

* Update visitor.vue

* wip

* Update init.ts

* Update init.ts

* wip

* wip

* Update visitor.vue

* Update visitor.vue

* Update visitor.vue

* Update visitor.vue

* wip

* wip

* Update modal.vue

* Update header.vue

* Update menu.vue

* Update about.vue

* Update about-misskey.vue

* wip

* wip

* Update visitor.vue

* Update tooltip.ts

* wip

* Update drive.vue

* wip

* Update style.scss

* Update header.vue

* wip

* wip

* Update users.user.vue

* Update announcements.vue

* wip

* wip

* wip

* Update emojis.vue

* wip

* Update emojis.vue

* Update style.scss

* Update users.vue

* wip

* Update style.scss

* wip

* Update welcome.entrance.vue

* Update radio.vue

* Update size.ts

* Update emoji-edit-dialog.vue

* wip

* Update emojis.vue

* wip

* Update emojis.vue

* Update emojis.vue

* Update emojis.vue

* wip

* wip

* wip

* wip

* Update file-dialog.vue

* wip

* wip

* Update token-generate-window.vue

* Update notification-setting-window.vue

* wip

* wip

* Update _error_.vue

* Update ja-JP.yml

* wip

* wip

* Update store.ts

* Update emojis.vue

* Update emojis.vue

* Update emojis.vue

* Update announcements.vue

* Update store.ts

* wip

* Update page-editor.vue

* wip

* wip

* Update modal.vue

* wip

* Update select-file.ts

* Update timeline.vue

* Update emojis.vue

* Update os.ts

* wip

* Update user-select.vue

* Update mfm.ts

* Update get-file-info.ts

* Update drive.vue

* Update init.ts

* Update mfm.ts

* wip

* wip

* Update window.vue

* Update note.vue

* wip

* wip

* Update user-info.vue

* wip

* wip

* wip

* wip

* wip

* Update header.vue

* Update header.vue

* wip

* Update explore.vue

* wip

* wip

* wip

* Update webpack.config.ts

* wip

* wip

* wip

* wip

* wip

* wip

* Update autocomplete.ts

* wip

* wip

* wip

* Update toast.vue

* wip

* Update post-form-dialog.vue

* wip

* wip

* wip

* wip

* wip

* Update users.vue

* wip

* Update explore.vue

* wip

* wip

* wip

* Update package.json

* wip

* Update icon-dialog.vue

* wip

* wip

* Update user-preview.ts

* wip

* wip

* wip

* wip

* wip

* Update instance.vue

* Update user-name.vue

* Update federation.vue

* Update instance.vue

* wip

* wip

* Update tag.vue

* wip

* wip

* wip

* wip

* wip

* Update instance.vue

* wip

* Update os.ts

* Update os.ts

* wip

* wip

* wip

* Update router.ts

* wip

* Update init.ts

* Update note.vue

* Update messages.vue

* wip

* wip

* wip

* wip

* wip

* google

* wip

* wip

* wip

* wip

* Update theme-editor.vue

* wip

* wip

* Update room.vue

* Update channel-editor.vue

* wip

* Update window.vue

* Update window.vue

* wip

* Update window.vue

* Update window.vue

* wip

* Update menu.vue

* wip

* wip

* wip

* wip

* Update messaging-room.vue

* wip

* Update post-form.vue

* Update default.widgets.vue

* Update window.vue

* wip
2020-10-17 20:12:00 +09:00
a40f38b2b5 CW の input でも投稿ショートカットが動作するように (#6690) 2020-10-09 14:22:32 +09:00
00a17ed5d4 /streamingに非WebSocketリクエストが来るとおかしくなるのを修正 Fix #6718 (#6719) 2020-10-09 14:20:34 +09:00
b594366f06 Update resolutions (#6723) 2020-10-09 14:17:15 +09:00
e9284930df Update nested-property (#6720) 2020-10-01 19:51:34 +09:00
ea7504f564 匿名ユーザーでapp/showをリクエストすると500を返すのを修正 Fix #6715 (#6716) 2020-09-28 21:27:05 +09:00
c1f6d996f6 Fix: Channel 投稿を削除編集すると Channel 外に投稿されるのを修正 (#6707) 2020-09-22 00:54:24 +09:00
df71dbb024 Resolve #6692 (#6703) 2020-09-18 22:18:21 +09:00
f104e9b6cc chore: better error text 2020-09-17 21:05:47 +09:00
e29b5c2326 fix(client): Fix #6698 2020-09-11 21:50:44 +09:00
925868dcdb Update dependencies (#6678) 2020-08-30 18:20:14 +09:00
d7df26d92b Fix channels list pagination (#6679) 2020-08-30 18:18:34 +09:00
42d1c67d56 fix(server): Fix #6669 2020-08-29 09:39:50 +09:00
c2d7929391 Expose proxyAccountName (#6670) 2020-08-29 08:56:32 +09:00
5864b52a81 Update create-notification.ts 2020-08-29 03:26:44 +09:00
493d32b3dc Fix #6676 2020-08-29 03:14:27 +09:00
ed141338fb Safari で mk-select に光沢がかかるのを修正 (#6668) 2020-08-23 11:05:04 +09:00
95db488c48 12.47.1 2020-08-22 10:11:46 +09:00
d5e1e523b6 New Crowdin updates (#6661)
* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)
2020-08-22 10:11:14 +09:00
cd0f8a4ef9 表示する通知を種別ごとに設定できるように (#6647)
* ストリーミング以外は一通り実装

* ストリーミング分も適用

* 通知のグローバル設定をサーバーサイドに保存

* グローバル通知を使うようにしたら更新されなくなるのを修正

* サーバーサイド処理

* i/notifications のパラメーター includeTypes に空配列を渡すと全部の通知が来る問題を修正

* 全て有効/無効ボタンを実装

* Squashed commit of the following:

commit c3c111529e
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Wed Aug 19 22:29:04 2020 +0900

    12.47.0

commit 2dbab66cfe
Author: syuilo <Syuilotan@yahoo.co.jp>
Date:   Wed Aug 19 22:24:39 2020 +0900

    New Crowdin updates (#6617)

    * New translations ja-JP.yml (French)

    * New translations ja-JP.yml (Arabic)

    * New translations ja-JP.yml (French)

    * New translations ja-JP.yml (Spanish)

    * New translations ja-JP.yml (German)

    * New translations ja-JP.yml (Chinese Simplified)

    * New translations ja-JP.yml (German)

    * New translations ja-JP.yml (English)

    * New translations ja-JP.yml (Spanish)

    * New translations ja-JP.yml (Chinese Simplified)

    * New translations ja-JP.yml (German)

    * New translations ja-JP.yml (English)

    * New translations ja-JP.yml (Chinese Simplified)

    * New translations ja-JP.yml (Spanish)

    * New translations ja-JP.yml (Chinese Simplified)

    * New translations ja-JP.yml (German)

    * New translations ja-JP.yml (English)

    * New translations ja-JP.yml (Spanish)

    * New translations ja-JP.yml (German)

    * New translations ja-JP.yml (English)

    * New translations ja-JP.yml (German)

    * New translations ja-JP.yml (English)

    * New translations ja-JP.yml (Chinese Simplified)

    * New translations ja-JP.yml (Chinese Simplified)

    * New translations ja-JP.yml (Korean)

    * New translations ja-JP.yml (Korean)

    * New translations ja-JP.yml (Korean)

    * New translations ja-JP.yml (Spanish)

    * New translations ja-JP.yml (Chinese Traditional)

    * New translations ja-JP.yml (Chinese Traditional)

    * New translations ja-JP.yml (Chinese Traditional)

    * New translations ja-JP.yml (Chinese Traditional)

    * New translations ja-JP.yml (Chinese Traditional)

    * New translations ja-JP.yml (Chinese Traditional)

    * New translations ja-JP.yml (Chinese Traditional)

    * New translations ja-JP.yml (Chinese Traditional)

    * New translations ja-JP.yml (Chinese Traditional)

    * New translations ja-JP.yml (English)

    * New translations ja-JP.yml (Korean)

    * New translations ja-JP.yml (Chinese Simplified)

    * New translations ja-JP.yml (German)

    * New translations ja-JP.yml (Spanish)

    * New translations ja-JP.yml (Arabic)

    * New translations ja-JP.yml (French)

    * New translations ja-JP.yml (Chinese Traditional)

    * New translations ja-JP.yml (Chinese Simplified)

    * New translations ja-JP.yml (Chinese Simplified)

    * New translations ja-JP.yml (German)

    * New translations ja-JP.yml (German)

    * New translations ja-JP.yml (German)

    * New translations ja-JP.yml (English)

    * New translations ja-JP.yml (German)

    * New translations ja-JP.yml (English)

    * New translations ja-JP.yml (Chinese Traditional)

    * New translations ja-JP.yml (Japanese, Kansai)

    * New translations ja-JP.yml (English)

    * New translations ja-JP.yml (Korean)

    * New translations ja-JP.yml (Chinese Simplified)

    * New translations ja-JP.yml (German)

    * New translations ja-JP.yml (Spanish)

    * New translations ja-JP.yml (Arabic)

    * New translations ja-JP.yml (French)

    * New translations ja-JP.yml (Chinese Traditional)

    * New translations ja-JP.yml (German)

    * New translations ja-JP.yml (English)

    * New translations ja-JP.yml (Chinese Simplified)

commit 01238d6b1a
Author: Acid Chicken (硫酸鶏) <root@acid-chicken.com>
Date:   Wed Aug 19 22:24:02 2020 +0900

    Update README.md [AUTOGEN] (#6593)

commit c34f302b1c
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Wed Aug 19 21:47:18 2020 +0900

    enhance(client): サーバーから切断されたときにダイアログで警告を表示できるように

commit 6870262f8d
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Wed Aug 19 17:52:11 2020 +0900

    enhance(client): Better element visible detection

commit c54d5e7040
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Wed Aug 19 17:51:31 2020 +0900

    fix(clinet): 誤字によりスクロールイベントリスナが解除されていなかったのを修正

commit 0ace009a54
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Tue Aug 18 22:52:54 2020 +0900

    fix(server): Prevent error when recieve non-json data from websocket

    Fix #6658

commit 48e8ee440b
Author: MeiMei <30769358+mei23@users.noreply.github.com>
Date:   Tue Aug 18 22:48:52 2020 +0900

    WebPのアニメーションが失われるのを修正 Fix #6625 (#6649)

commit 9855405b89
Author: syuilo <Syuilotan@yahoo.co.jp>
Date:   Tue Aug 18 22:44:21 2020 +0900

    Channel (#6621)

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wop

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * add notes

    * wip

    * wip

    * wip

    * wip

    * sound

    * wip

    * add kick_gaba2

    * wip

commit 122076e8ea
Author: MeiMei <30769358+mei23@users.noreply.github.com>
Date:   Sat Aug 15 04:27:19 2020 +0900

    Sign (request-target) Fix #6652 (#6656)

commit 7c5ac2cbb4
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Fri Aug 14 15:24:55 2020 +0900

    perf(server): Add isSensitive index to improve query performance

commit ccda2181c1
Author: MeiMei <30769358+mei23@users.noreply.github.com>
Date:   Fri Aug 14 00:54:33 2020 +0900

    GCSに大きいファイルがアップロードできないのを修正 Fix #6254 (#6648)

commit b5fe4ba9be
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Thu Aug 13 23:02:43 2020 +0900

    WIP: Improve admin dashboard

commit fd9c7d525a
Merge: 080574e13 ee0a44559
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Thu Aug 13 21:27:10 2020 +0900

    Merge branch 'develop' of https://github.com/syuilo/misskey into develop

commit 080574e13d
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Thu Aug 13 21:27:06 2020 +0900

    WIP: Improve admin dashboard

commit ee0a445590
Author: MeiMei <30769358+mei23@users.noreply.github.com>
Date:   Thu Aug 13 20:05:01 2020 +0900

    Option objectStorageSetPublicRead (#6645)

commit bb342c7601
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Thu Aug 13 19:56:46 2020 +0900

    WIP: Improve admin dashboard

commit ed17636fb9
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Thu Aug 13 17:58:16 2020 +0900

    WIP: Improve admin dashboard

commit c59d7d941a
Author: syuilo <Syuilotan@yahoo.co.jp>
Date:   Wed Aug 12 17:42:12 2020 +0900

    Update README.md

    Close #6644

commit 377377595a
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Mon Aug 10 20:23:51 2020 +0900

    enhance(client): Improve admin page

commit d63aef9963
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Mon Aug 10 13:55:00 2020 +0900

    chore(client): Fix style

commit e9b28fa3c0
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Mon Aug 10 13:00:10 2020 +0900

    chore(client): Design tweaks

commit be255dc583
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Mon Aug 10 12:42:51 2020 +0900

    chore(client): Design tweak

commit 18eb7c6087
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Mon Aug 10 12:31:22 2020 +0900

    chore(client): Design tweaks

commit cf29e69813
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Mon Aug 10 12:28:35 2020 +0900

    chore(client): Fix bug

commit 132da7e3c0
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Mon Aug 10 12:20:58 2020 +0900

    Update ja-JP.yml

commit 26df23bb64
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Mon Aug 10 12:18:02 2020 +0900

    chore(client): fix style

commit 76389ad619
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Mon Aug 10 12:15:58 2020 +0900

    chore(client): Design tweaks

commit 7cde8cfbf2
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Mon Aug 10 11:51:43 2020 +0900

    chore(client): Design tweaks

commit 4eb2ddac4e
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Mon Aug 10 11:24:30 2020 +0900

    chore(client): Design tweaks

commit dc51eef27c
Merge: bff8a23cb 9c5efb9da
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Mon Aug 10 10:38:00 2020 +0900

    Merge branch 'develop' of https://github.com/syuilo/misskey into develop

commit bff8a23cbc
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Mon Aug 10 10:37:57 2020 +0900

    chore(client): Design tweaks

commit 9c5efb9da0
Author: rinsuki <428rinsuki+git@gmail.com>
Date:   Mon Aug 10 01:33:01 2020 +0900

    Dockerのビルド時にgitを入れるように (#6639)

    917d3d0bd3 でgitの依存関係が追加されたのにgitが入っていないのでコケていた

commit 48b8320e5e
Author: rinsuki <428rinsuki+git@gmail.com>
Date:   Mon Aug 10 01:32:27 2020 +0900

    Fix #6637 (#6638)

    * Fix #6637

    * fix lint

commit 9b2ed96c1c
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Sun Aug 9 15:59:38 2020 +0900

    chore: Clean up

commit 69d9aa71f2
Author: syuilo <Syuilotan@yahoo.co.jp>
Date:   Sun Aug 9 15:51:02 2020 +0900

    Full view mode (#6636)

    * wuip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * wip

    * Update folder.vue

    * wip

    * Update size.ts

    * wip

    * wip

    * Update index.vue

    * wip

commit 13683780cd
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Sun Aug 9 13:49:44 2020 +0900

    ✌️

commit d780e5b251
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Sun Aug 9 13:46:19 2020 +0900

    enhance(client): ミュートされたノート数を表示するようにしたり

commit 917d3d0bd3
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Sat Aug 8 10:30:38 2020 +0900

    chore: Update dependencies 🚀

commit 4b19c53697
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Sat Aug 8 10:27:37 2020 +0900

    client: テーマコードをコピーできるようにしたり

commit 2d40a15d2b
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Fri Aug 7 11:27:37 2020 +0900

    refactor: Extract well-known services

commit 2bdcd22ad4
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Tue Aug 4 23:09:48 2020 +0900

    enhance(api): アクセストークンを作成する際、createdAtをlastUsedAtを揃えるようにして、未使用かどうかを判定できるように

commit f73a4e1304
Author: MeiMei <30769358+mei23@users.noreply.github.com>
Date:   Tue Aug 4 21:12:55 2020 +0900

    Update .dockerignore (#6620)

commit b265cdbd84
Author: Xeltica <7106976+Xeltica@users.noreply.github.com>
Date:   Mon Aug 3 13:40:32 2020 +0900

    Update CHANGELOG.md

commit a04d8b95c2
Author: Xeltica <7106976+Xeltica@users.noreply.github.com>
Date:   Mon Aug 3 13:40:13 2020 +0900

    Update CHANGELOG.md

commit 0e9a8c0cd4
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Sun Aug 2 13:59:05 2020 +0900

    fix(client): Message read state is not reactive

commit 5ae8a3c7e8
Author: syuilo <syuilotan@yahoo.co.jp>
Date:   Sun Aug 2 13:49:28 2020 +0900

    refactor

* fix: includeTypes 未指定時に通知が返ってこなくなるバグを修正

* 最適化とバグ修正

* 挙動を修正

* Update ja-JP.yml

* 不要なimportを削除

* ✌

* 不要なコードの削除

* Update notification-setting-window.vue

* Update notification-setting-window.vue

* 🎨

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2020-08-22 10:06:17 +09:00
6dac505af9 Update dependencies 🚀 2020-08-22 08:03:11 +09:00
9d398040cb fix an error on /api-doc (#6665) 2020-08-22 04:25:47 +09:00
aa55acedc9 Fix not to reject non-image file uploads (#6664)
* fix not to reject non-image file uploads

* handle an error from sharp
2020-08-22 04:25:25 +09:00
eb70d6f226 Fix a slow query on channel timeline (#6663) 2020-08-20 17:17:55 +09:00
36f0963d78 Update CHANGELOG.md 2020-08-19 23:09:21 +09:00
c3c111529e 12.47.0 2020-08-19 22:29:04 +09:00
2dbab66cfe New Crowdin updates (#6617)
* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)
2020-08-19 22:24:39 +09:00
01238d6b1a Update README.md [AUTOGEN] (#6593) 2020-08-19 22:24:02 +09:00
c34f302b1c enhance(client): サーバーから切断されたときにダイアログで警告を表示できるように 2020-08-19 21:47:18 +09:00
6870262f8d enhance(client): Better element visible detection 2020-08-19 17:52:11 +09:00
c54d5e7040 fix(clinet): 誤字によりスクロールイベントリスナが解除されていなかったのを修正 2020-08-19 17:51:31 +09:00
0ace009a54 fix(server): Prevent error when recieve non-json data from websocket
Fix #6658
2020-08-18 22:52:54 +09:00
48e8ee440b WebPのアニメーションが失われるのを修正 Fix #6625 (#6649) 2020-08-18 22:48:52 +09:00
9855405b89 Channel (#6621)
* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wop

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* add notes

* wip

* wip

* wip

* wip

* sound

* wip

* add kick_gaba2

* wip
2020-08-18 22:44:21 +09:00
122076e8ea Sign (request-target) Fix #6652 (#6656) 2020-08-15 04:27:19 +09:00
7c5ac2cbb4 perf(server): Add isSensitive index to improve query performance 2020-08-14 15:24:55 +09:00
ccda2181c1 GCSに大きいファイルがアップロードできないのを修正 Fix #6254 (#6648) 2020-08-14 00:54:33 +09:00
b5fe4ba9be WIP: Improve admin dashboard 2020-08-13 23:02:43 +09:00
fd9c7d525a Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-08-13 21:27:10 +09:00
080574e13d WIP: Improve admin dashboard 2020-08-13 21:27:06 +09:00
ee0a445590 Option objectStorageSetPublicRead (#6645) 2020-08-13 20:05:01 +09:00
bb342c7601 WIP: Improve admin dashboard 2020-08-13 19:56:46 +09:00
ed17636fb9 WIP: Improve admin dashboard 2020-08-13 17:58:16 +09:00
c59d7d941a Update README.md
Close #6644
2020-08-12 17:42:12 +09:00
377377595a enhance(client): Improve admin page 2020-08-10 20:23:51 +09:00
d63aef9963 chore(client): Fix style 2020-08-10 13:55:00 +09:00
e9b28fa3c0 chore(client): Design tweaks 2020-08-10 13:00:10 +09:00
be255dc583 chore(client): Design tweak 2020-08-10 12:42:51 +09:00
18eb7c6087 chore(client): Design tweaks 2020-08-10 12:31:22 +09:00
cf29e69813 chore(client): Fix bug 2020-08-10 12:28:35 +09:00
132da7e3c0 Update ja-JP.yml 2020-08-10 12:20:58 +09:00
26df23bb64 chore(client): fix style 2020-08-10 12:18:02 +09:00
76389ad619 chore(client): Design tweaks 2020-08-10 12:15:58 +09:00
7cde8cfbf2 chore(client): Design tweaks 2020-08-10 11:51:43 +09:00
4eb2ddac4e chore(client): Design tweaks 2020-08-10 11:24:30 +09:00
dc51eef27c Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-08-10 10:38:00 +09:00
bff8a23cbc chore(client): Design tweaks 2020-08-10 10:37:57 +09:00
9c5efb9da0 Dockerのビルド時にgitを入れるように (#6639)
917d3d0bd3 でgitの依存関係が追加されたのにgitが入っていないのでコケていた
2020-08-10 01:33:01 +09:00
48b8320e5e Fix #6637 (#6638)
* Fix #6637

* fix lint
2020-08-10 01:32:27 +09:00
9b2ed96c1c chore: Clean up 2020-08-09 15:59:38 +09:00
69d9aa71f2 Full view mode (#6636)
* wuip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Update folder.vue

* wip

* Update size.ts

* wip

* wip

* Update index.vue

* wip
2020-08-09 15:51:02 +09:00
13683780cd ✌️ 2020-08-09 13:49:44 +09:00
d780e5b251 enhance(client): ミュートされたノート数を表示するようにしたり 2020-08-09 13:46:19 +09:00
917d3d0bd3 chore: Update dependencies 🚀 2020-08-08 10:30:38 +09:00
4b19c53697 client: テーマコードをコピーできるようにしたり 2020-08-08 10:27:37 +09:00
2d40a15d2b refactor: Extract well-known services 2020-08-07 11:27:37 +09:00
2bdcd22ad4 enhance(api): アクセストークンを作成する際、createdAtをlastUsedAtを揃えるようにして、未使用かどうかを判定できるように 2020-08-04 23:09:48 +09:00
f73a4e1304 Update .dockerignore (#6620) 2020-08-04 21:12:55 +09:00
b265cdbd84 Update CHANGELOG.md 2020-08-03 13:40:32 +09:00
a04d8b95c2 Update CHANGELOG.md 2020-08-03 13:40:13 +09:00
0e9a8c0cd4 fix(client): Message read state is not reactive 2020-08-02 13:59:05 +09:00
5ae8a3c7e8 refactor 2020-08-02 13:49:28 +09:00
70ee172128 12.46.0 2020-08-02 00:10:30 +09:00
b9febc00f9 Update aiscript 2020-08-02 00:09:54 +09:00
0112e2f7ec New Crowdin updates (#6611)
* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Korean)
2020-08-01 23:44:07 +09:00
60736bab2a fix(client): Broken syntax highlight 2020-08-01 23:30:51 +09:00
fb7c4ee21a チャットでCmd+Enterできないのを修正 (#6614) 2020-08-01 21:50:21 +09:00
e93c06cd00 fix appearance 2020-08-01 18:01:48 +09:00
0a99345909 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-08-01 16:39:52 +09:00
3d08ff7cb4 🎨 2020-08-01 16:39:48 +09:00
057ce73ba1 refactor 2020-08-01 12:04:30 +09:00
66b07578c5 Fold sidebar (#6610)
* wip

* wip
2020-08-01 10:53:23 +09:00
de3b365563 chore: Remove debug code 2020-08-01 10:03:47 +09:00
7bb8d8b27e refactor(client): Fix order of component property 2020-08-01 10:02:37 +09:00
9008664606 fix(client): Cannot read announcement
Fix #6609
2020-08-01 10:02:03 +09:00
7374905c28 12.45.1 2020-08-01 01:00:19 +09:00
718e20de60 New Crowdin updates (#6599)
* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)
2020-08-01 00:59:40 +09:00
73d166323d Update dependencies 🚀 2020-08-01 00:56:09 +09:00
3589fc6f4f refactor 2020-07-31 19:21:13 +09:00
feed6c7acc Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-07-31 19:09:49 +09:00
2522e7388d fix(client): Reactivate poll 2020-07-31 19:09:38 +09:00
09cfd620bb Add "files/" to .dockerignore (#6607) 2020-07-31 04:59:52 +09:00
362e95263d 非ログイン時にウェルカムメッセージが被る問題を修正 (#6509)
* fix #6493

* Fix indentation
2020-07-30 23:56:17 +09:00
c6837b9fdf Mapping files folder outside the container (#6598)
In order to prevent the loss of files uploaded by users when upgrading Misskey deployed with Docker.
**But** it might be necessary to create the folder before `docker-compose up -d` (Not fully tested)
2020-07-30 21:13:38 +09:00
71878f93e4 自分のノートにリアクションを押せるように (#6506)
* resolve #6468

* リモートから来たセルフリアクションの対応
2020-07-30 20:28:35 +09:00
f5d43b1f25 Simplified Chinese Install & Setup Guides Added (#6604)
* Simplified Chinese Install & Setup Guides Added

* Using lists in navigation between languages

* (Delete a closing bracket added by mistake

Co-authored-by: Candinya <dev@lcy.moe>
2020-07-30 18:05:26 +09:00
770e7378be 12.45.0 2020-07-30 01:29:15 +09:00
b9a8620d2f Update AiScript 2020-07-30 01:26:20 +09:00
d1c8b2993e Add doc 2020-07-30 01:26:09 +09:00
01e9b3c2f6 fix(client): プラグインの設定がnullになることがある問題を修正 2020-07-30 00:58:01 +09:00
57203de4cb feat(client): プラグインのIDを不要に 2020-07-30 00:41:17 +09:00
74d0e83a8a Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-07-30 00:35:30 +09:00
9eee5644b9 feat(client): プラグインの設定にdescriptionを表示できるように 2020-07-30 00:35:07 +09:00
9fe6f9417e Update CHANGELOG.md 2020-07-29 23:57:08 +09:00
e7de5f6051 feat(client): Plugin:register_note_post_interruptor API 2020-07-29 23:37:50 +09:00
60d81d74e3 feat(client): AiScript: Plugin:open_url function 2020-07-29 23:10:04 +09:00
2701a7e85f fix(client): 通知のノートがリアクティブではない問題を修正
Fix #6602
2020-07-29 23:03:08 +09:00
31a0afdaab fix(client): ピン留めされたノートがリアクティブではない問題を修正 2020-07-29 23:02:59 +09:00
9f87545901 12.44.1 2020-07-29 01:50:39 +09:00
9f94f60ede fix(client): 通知が流れない問題を修正 2020-07-29 01:50:30 +09:00
0ca3c0bca1 12.44.0 2020-07-29 01:17:54 +09:00
27611cef77 New Crowdin updates (#6592)
* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Kabyle)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)
2020-07-29 01:17:14 +09:00
30df8ea121 feat(client): AiScript: ノート書き換えAPI 2020-07-29 01:15:02 +09:00
595ad04ddb feat(client): プラグインを無効にできるように 2020-07-28 19:02:28 +09:00
6b8354ccbf enhance(client): Use tab component for page list 2020-07-28 10:08:08 +09:00
1b9d316e7c refactor: Rename function 2020-07-28 09:38:41 +09:00
a8adc46f3b refactor: Rename function 2020-07-28 09:36:43 +09:00
0efa969a15 chore: Remove debug code 2020-07-27 23:26:32 +09:00
14b7f05af4 refactor(client): Use v-model for note component, freeze object
Related: #6595
2020-07-27 23:25:37 +09:00
cf43dd6ec5 ワードミュート (#6594)
* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip
2020-07-27 13:34:20 +09:00
b5a1fdd4c7 refactor(client): Do not mutate prop directly
Related #6595
2020-07-27 08:46:21 +09:00
b32737cdff Merge pull request #6432 from syuilo/patch/autogen/v11
[AUTOMATED] Update README.md
2020-07-26 06:43:46 +00:00
b505874613 Update README.md [AUTOGEN] 2020-07-14 18:00:09 +09:00
643 changed files with 36349 additions and 18738 deletions

View File

@ -15,7 +15,8 @@ jobs:
executor: docker
steps:
- checkout
- setup_remote_docker
- setup_remote_docker:
version: 19.03.13
- run:
name: Build
command: |

View File

@ -154,3 +154,6 @@ id: 'aid'
# Media Proxy
#mediaProxy: https://example.com/proxy
# Sign to ActivityPub GET request (default: false)
#signToActivityPubGet: true

View File

@ -5,8 +5,10 @@
.vscode
Dockerfile
build/
built/
db/
docker-compose.yml
elasticsearch/
node_modules/
redis/
files/

View File

@ -12,7 +12,7 @@ jobs:
strategy:
matrix:
node-version: [12.x, 14.x]
node-version: [12.x, 14.x, 15.x]
services:
postgres:

View File

@ -1 +1 @@
v14.4.0
v14.15.1

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,7 @@
FROM node:14.4.0-alpine AS base
FROM node:14.15.1-alpine AS base
ENV NODE_ENV=production
RUN npm i -g npm@latest
WORKDIR /misskey
FROM base AS builder
@ -12,6 +10,7 @@ RUN apk add --no-cache \
autoconf \
automake \
file \
git \
g++ \
gcc \
libc-dev \

View File

@ -6,8 +6,9 @@
[![CircleCI](https://img.shields.io/circleci/project/github/syuilo/misskey.svg?style=for-the-badge&logo=circleci)](https://circleci.com/gh/syuilo/misskey)
[![Dependencies](https://img.shields.io/david/syuilo/misskey.svg?style=for-the-badge&logo=npm)](https://david-dm.org/syuilo/misskey)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=for-the-badge&logo=github)](http://makeapullrequest.com)
[![Awesome Humane Tech](https://raw.githubusercontent.com/humanetech-community/awesome-humane-tech/main/humane-tech-badge.svg?sanitize=true)](https://github.com/humanetech-community/awesome-humane-tech)
**A forever evolving, sophisticated microblogging platform.**
**A forever evolving, interplanetary microblogging platform.**
<p align="justify">
<a href="https://join.misskey.page/">Misskey</a> is a decentralized microblogging platform born on Earth.
@ -112,7 +113,6 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<td><img src="https://c8.patreon.com/2/200/20832595" alt="Roujo " width="100"></td>
<td><img src="https://c8.patreon.com/2/200/27956229" alt="Oliver Maximilian Seidel" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/3.png?token-time=2145916800&token-hash=oH_i7gJjNT7Ot6j9JiVwy7ZJIBqACVnzLqlz4YrDAZA%3D" alt="weepjp " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/605366/c9dc408fdcbf412fb183ca5b06235f8d/1.jpeg?token-time=2145916800&token-hash=oaqsjLqOFjWN5I9hm2epOaTXaEtKwQUy5OW-EpAz6-g%3D" alt="Jon Leibowitz" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19045173/cb91c0f345c24d4ebfd05f19906d5e26/1.png?token-time=2145916800&token-hash=o_zKBytJs_AxHwSYw_5R8eD0eSJe3RoTR3kR3Q0syN0%3D" alt="kiritan " width="100"></td>
<td><img src="https://c8.patreon.com/2/200/27648259" alt="みなしま " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/24430516/b1964ac5b9f746d2a12ff53dbc9aa40a/1.jpg?token-time=2145916800&token-hash=bmEiMGYpp3bS7hCCbymjGGsHBZM3AXuBOFO3Kro37PU%3D" alt="Eduardo Quiros" width="100"></td>
@ -120,7 +120,6 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<td><a href="https://www.patreon.com/user?u=20832595">Roujo </a></td>
<td><a href="https://www.patreon.com/user?u=27956229">Oliver Maximilian Seidel</a></td>
<td><a href="https://www.patreon.com/weepjp">weepjp </a></td>
<td><a href="https://www.patreon.com/jonleibowitz">Jon Leibowitz</a></td>
<td><a href="https://www.patreon.com/user?u=19045173">kiritan </a></td>
<td><a href="https://www.patreon.com/user?u=27648259">みなしま </a></td>
<td><a href="https://www.patreon.com/user?u=24430516">Eduardo Quiros</a></td>
@ -132,10 +131,9 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<td><img src="https://c8.patreon.com/2/200/557245" alt="mkatze " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/23915207/25428766ecd745478e600b3d7f871eb2/1.png?token-time=2145916800&token-hash=urCLLA4KjJZX92Y1CxcBP4d8bVTHGkiaPnQZp-Tqz68%3D" alt="kabo2468y " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/8249688/4aacf36b6b244ab1bc6653591b6640df/2.png?token-time=2145916800&token-hash=1ZEf2w6L34253cZXS_HlVevLEENWS9QqrnxGUAYblPo%3D" alt="AureoleArk " width="100"></td>
<td><img src="https://c8.patreon.com/2/200/21285325" alt="Nie(sha) " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5670915/ee175f0bfb6347ffa4ea101a8c097bff/1.jpg?token-time=2145916800&token-hash=mPLM9CA-riFHx-myr3bLZJuH2xBRHA9se5VbHhLIOuA%3D" alt="osapon " width="100"></td>
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18899730/6a22797f68254034a854d69ea2445fc8/1.png?token-time=2145916800&token-hash=b_uj57yxo5VzkSOUS7oXE_762dyOTB_oxzbO6lFNG3k%3D" alt="YuzuRyo61 " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/36813045/29876ea679d443bcbba3c3f16edab8c2/2.jpeg?token-time=2145916800&token-hash=YCKWnIhrV9rjUCV9KqtJnEqjy_uGYF3WMXftjUdpi7o%3D" alt="Wataru Manji (manji0)" width="100"></td>
</tr><tr>
<td><a href="https://www.patreon.com/Nesakko">Nesakko</a></td>
<td><a href="https://www.patreon.com/user?u=776209">Demogrognard</a></td>
@ -143,72 +141,75 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<td><a href="https://www.patreon.com/user?u=557245">mkatze </a></td>
<td><a href="https://www.patreon.com/user?u=23915207">kabo2468y </a></td>
<td><a href="https://www.patreon.com/AureoleArk">AureoleArk </a></td>
<td><a href="https://www.patreon.com/user?u=21285325">Nie(sha) </a></td>
<td><a href="https://www.patreon.com/osapon">osapon </a></td>
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ </a></td>
<td><a href="https://www.patreon.com/Yuzulia">YuzuRyo61 </a></td>
<td><a href="https://www.patreon.com/user?u=36813045">Wataru Manji (manji0)</a></td>
</tr></table>
<table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18899730/6a22797f68254034a854d69ea2445fc8/1.png?token-time=2145916800&token-hash=b_uj57yxo5VzkSOUS7oXE_762dyOTB_oxzbO6lFNG3k%3D" alt="YuzuRyo61 " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5788159/af42076ab3354bb49803cfba65f94bee/1.jpg?token-time=2145916800&token-hash=iSaxp_Yr2-ZiU2YVi9rcpZZj9mj3UvNSMrZr4CU4qtA%3D" alt="mewl hayabusa" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/28779508/3cd4cb7f017f4ee0864341e3464d42f9/1.png?token-time=2145916800&token-hash=eGQtR15be44kgvh8fw2Jx8Db4Bv15YBp2ldxh0EKRxA%3D" alt="S Y" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/16542964" alt="Takumi Sugita" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/38837364/9421361c54c645ac8f5fc442a40c32e9/1.png?token-time=2145916800&token-hash=TUZB48Nem3BeUPLBH6s3P6WyKBnQOy0xKaDSTBBUNzA%3D" alt="xianon" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/26340354/08834cf767b3449e93098ef73a434e2f/2.png?token-time=2145916800&token-hash=nyM8DnKRL8hR47HQ619mUzsqVRpkWZjgtgBU9RY15Uc%3D" alt="totokoro " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19356899/496b4681d33b4520bd7688e0fd19c04d/2.jpeg?token-time=2145916800&token-hash=_sTj3dUBOhn9qwiJ7F19Qd-yWWfUqJC_0jG1h0agEqQ%3D" alt="sheeta.s " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5827393/59893c191dda408f9cabd0f20a3a5627/1.jpeg?token-time=2145916800&token-hash=i9N05vOph-eP1LTLb9_npATjYOpntL0ZsHNaZFSsPmE%3D" alt="motcha " width="100"></td>
</tr><tr>
<td><a href="https://www.patreon.com/Yuzulia">YuzuRyo61 </a></td>
<td><a href="https://www.patreon.com/hs_sh_net">mewl hayabusa</a></td>
<td><a href="https://www.patreon.com/user?u=28779508">S Y</a></td>
<td><a href="https://www.patreon.com/user?u=16542964">Takumi Sugita</a></td>
<td><a href="https://www.patreon.com/user?u=17866454">sikyosyounin </a></td>
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
<td><a href="https://www.patreon.com/user?u=38837364">xianon</a></td>
<td><a href="https://www.patreon.com/user?u=26340354">totokoro </a></td>
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s </a></td>
<td><a href="https://www.patreon.com/user?u=5827393">motcha </a></td>
</tr></table>
<table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19356899/496b4681d33b4520bd7688e0fd19c04d/2.jpeg?token-time=2145916800&token-hash=_sTj3dUBOhn9qwiJ7F19Qd-yWWfUqJC_0jG1h0agEqQ%3D" alt="sheeta.s " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5827393/59893c191dda408f9cabd0f20a3a5627/1.jpeg?token-time=2145916800&token-hash=i9N05vOph-eP1LTLb9_npATjYOpntL0ZsHNaZFSsPmE%3D" alt="motcha " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/20494440/540beaf2445f408ea6597bc61e077bb3/1.png?token-time=2145916800&token-hash=UJ0JQge64Bx9XmN_qYA1inMQhrWf4U91fqz7VAKJeSg%3D" alt="axtuki1 " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13737140/1adf7835017d479280d90fe8d30aade2/1.png?token-time=2145916800&token-hash=0pdle8h5pDZrww0BDOjdz6zO-HudeGTh36a3qi1biVU%3D" alt="Satsuki Yanagi" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1.jpg?token-time=2145916800&token-hash=nVAntpybQrznE0rg05keLrSE6ogPKJXB13rmrJng42c%3D" alt="takimura " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13100201/fc5be4fa90444f09a9c8a06f72385272/1.png?token-time=2145916800&token-hash=i8PjlgfOB2LPEdbtWyx8ZPsBKhGcNZqcw_FQmH71UGU%3D" alt="aqz tamaina" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/28295158/cd2451bfb94a449dbf705ef4718cd355/2.jpeg?token-time=2145916800&token-hash=MRv3BxufHPuCyiBSxU5UYmLGvD6YZlhtSFRfMWg2k4U%3D" alt="012 " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/9109588/e3cffc48d20a4e43afe04123e696781d/3.png?token-time=2145916800&token-hash=T_VIUA0IFIbleZv4pIjiszZGnQonwn34sLCYFIhakBo%3D" alt="nafuchoco " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/619ab87cc08448439222631ebb26802f/1.gif?token-time=2145916800&token-hash=o27K7M02s1z-LkDUEO5Oa7cu-GviRXeOXxryi4o_6VU%3D" alt="Atsuko Tominaga" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3.png?token-time=2145916800&token-hash=FTm3WVom4dJ9NwWMU4OpCL_8Yc13WiwEbKrDPyTZTPs%3D" alt="natalie " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3.png?token-time=2145916800&token-hash=FTm3WVom4dJ9NwWMU4OpCL_8Yc13WiwEbKrDPyTZTPs%3D" alt="natalie" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/26144593/9514b10a5c1b42a3af58621aee213d1d/1.png?token-time=2145916800&token-hash=v1PYRsjzu4c_mndN4Hvi_dlispZJsuGRCQeNS82pUSM%3D" alt="EBISUME" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5923936/2a743cbfbff946c2af3f09026047c0da/2.png?token-time=2145916800&token-hash=h6yphW1qnM0n_NOWaf8qtszMRLXEwIxfk5beu4RxdT0%3D" alt="noellabo " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/2384390/5681180e1efb46a8b28e0e8d4c8b9037/1.jpg?token-time=2145916800&token-hash=SJcMy-Q1BcS940-LFUVOMfR7-5SgrzsEQGhYb3yowFk%3D" alt="CG " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpg?token-time=2145916800&token-hash=7bkMqTwHPRsJPGAq42PYdDXDZBVGLqdgr1ZmBxX8GFQ%3D" alt="Hekovic " width="100"></td>
</tr><tr>
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s </a></td>
<td><a href="https://www.patreon.com/user?u=5827393">motcha </a></td>
<td><a href="https://www.patreon.com/user?u=20494440">axtuki1 </a></td>
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
<td><a href="https://www.patreon.com/takimura">takimura </a></td>
<td><a href="https://www.patreon.com/aqz">aqz tamaina</a></td>
<td><a href="https://www.patreon.com/user?u=28295158">012 </a></td>
<td><a href="https://www.patreon.com/nijimiss">nafuchoco </a></td>
<td><a href="https://www.patreon.com/user?u=9109588">nafuchoco </a></td>
<td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td>
<td><a href="https://www.patreon.com/user?u=4389829">natalie </a></td>
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
<td><a href="https://www.patreon.com/user?u=26144593">EBISUME</a></td>
<td><a href="https://www.patreon.com/noellabo">noellabo </a></td>
<td><a href="https://www.patreon.com/Corset">CG </a></td>
<td><a href="https://www.patreon.com/hekovic">Hekovic </a></td>
</tr></table>
<table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/2384390/5681180e1efb46a8b28e0e8d4c8b9037/1.jpg?token-time=2145916800&token-hash=SJcMy-Q1BcS940-LFUVOMfR7-5SgrzsEQGhYb3yowFk%3D" alt="CG " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpg?token-time=2145916800&token-hash=7bkMqTwHPRsJPGAq42PYdDXDZBVGLqdgr1ZmBxX8GFQ%3D" alt="Hekovic " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/24641572/b4fd175424814f15b0ca9178d2d2d2e4/1.png?token-time=2145916800&token-hash=e2fyqdbuJbpCckHcwux7rbuW6OPkKdERcus0u2wIEWU%3D" alt="uroco @99" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/14661394" alt="Chandler " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1.png?token-time=2145916800&token-hash=hBayGfOmQH3kRMdNnDe4oCZD_9fsJWSt29xXR3KRMVk%3D" alt="Nokotaro Takeda" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/23932002" alt="nenohi " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/9481273/7fa89168e72943859c3d3c96e424ed31/4.jpeg?token-time=2145916800&token-hash=5w1QV1qXe-NdWbdFmp1H7O_-QBsSiV0haumk3XTHIEg%3D" alt="Efertone " width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1.jpeg?token-time=2145916800&token-hash=vGe7wXGqmA8Q7m-kDNb6fyGdwk-Dxk4F-ut8ZZu51RM%3D" alt="Takashi Shibuya" width="100"></td>
</tr><tr>
<td><a href="https://www.patreon.com/Corset">CG </a></td>
<td><a href="https://www.patreon.com/hekovic">Hekovic </a></td>
<td><a href="https://www.patreon.com/user?u=24641572">uroco @99</a></td>
<td><a href="https://www.patreon.com/user?u=14661394">Chandler </a></td>
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
<td><a href="https://www.patreon.com/user?u=23932002">nenohi </a></td>
<td><a href="https://www.patreon.com/efertone">Efertone </a></td>
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
</tr></table>
**Last updated:** Tue, 02 Jun 2020 00:00:08 UTC
**Last updated:** Sun, 26 Jul 2020 07:00:10 UTC
<!-- PATREON_END -->
[backer-url]: #backers

View File

@ -13,6 +13,8 @@ services:
networks:
- internal_network
- external_network
volumes:
- ./files:/misskey/files
redis:
restart: always

View File

@ -4,3 +4,30 @@ Docs for users are located in `src/docs`.
これらのドキュメントはMisskeyの開発者またはMisskeyインスタンス運営者向けです。
利用者向けのドキュメントは`src/docs`にあります。
这些文档是为 Misskey 的贡献者,或是 Misskey 实例的管理者准备的。
为用户准备的文档放置在 `src/docs` 文件夹中。
## 日本語版
- [Misskey構築の手引き](./setup.ja.md)
- [運営ガイド](./manage.ja.md)
- [Dockerを使ったMisskey構築方法](./docker.ja.md)
## English Version
- [Misskey Setup and Installation Guide](./setup.en.md)
- [Management guide](./manage.en.md)
- [Docker Guide](./docker.en.md)
## Française Version
- [Guide d'installation et de configuration de Misskey](./setup.fr.md)
- [Guide d'administration](./manage.fr.md)
- [Guide Docker](./docker.fr.md)
## 简体中文版
- [Misskey 设置和安装指南](./setup.zh.md)
- [运营指南](./manage.zh.md)
- [Docker 部署指南](./docker.zh.md)

View File

@ -3,7 +3,8 @@ Docker Guide
This guide describes how to install and setup Misskey with Docker.
[Japanese version also available - 日本語版もあります](./docker.ja.md)
- [Japanese version also available - 日本語版もあります](./docker.ja.md)
- [Simplified Chinese version also available - 简体中文版同样可用](./docker.zh.md)
----------------------------------------------------------------

View File

@ -3,8 +3,9 @@ Guide Docker
Ce guide explique comment installer et configurer Misskey avec Docker.
[Version japonaise également disponible - Japanese version also available - 日本語版もあります](./docker.ja.md)
[Version anglaise également disponible - English version also available - 英語版もあります](./docker.en.md)
- [Version japonaise également disponible - Japanese version also available - 日本語版もあります](./docker.ja.md)
- [Version anglaise également disponible - English version also available - 英語版もあります](./docker.en.md)
- [Version Chinois simplifié également disponible - Simplified Chinese version also available - 简体中文版同样可用](./docker.zh.md)
----------------------------------------------------------------

View File

@ -3,7 +3,8 @@ Dockerを使ったMisskey構築方法
このガイドはDockerを使ったMisskeyセットアップ方法について解説します。
[英語版もあります - English version also available](./docker.en.md)
- [英語版もあります - English version also available](./docker.en.md)
- [简体中文版同样可用 - Simplified Chinese version also available](./docker.zh.md)
----------------------------------------------------------------

96
docs/docker.zh.md Normal file
View File

@ -0,0 +1,96 @@
Docker 部署指南
================================================================
这份指南描述了如何使用Docker安装并设置 Misskey 。
- [日本語版もあります - Japanese version also available](./docker.ja.md)
- [英語版もあります - English version also available](./docker.en.md)
----------------------------------------------------------------
*1.* 下载 Misskey
----------------------------------------------------------------
1. 克隆 Misskey 项目的 master 分支。
`git clone -b master git://github.com/syuilo/misskey.git`
2. 进入 misskey 文件夹。
`cd misskey`
3. 检查 [最新发布版](https://github.com/syuilo/misskey/releases/latest) 标签。
`git checkout master`
*2.* 配置 Misskey
----------------------------------------------------------------
可以按照如下方式创建配置文件:
``` bash
cd .config
cp example.yml default.yml
cp docker_example.env docker.env
```
### `default.yml`
这个文件的编辑工作基本与非 Docker 环境的版本相同。
但请注意, Postgresql、 Redis 和 Elasticsearch 的 **主机名(hostname)** 配置不应该是 `localhost` ,它们被设置在 `docker-compose.yml` 文件中。
以下是默认的主机名:
| 服务 | 主机名 |
|---------------|----------|
| Postgresql | `db` |
| Redis | `redis` |
| Elasticsearch | `es` |
### `docker.env`
在这个文件中配置 Postgresql 。
至少需要如下这些配置:
| 名称 | 描述 |
|---------------------|---------------|
| `POSTGRES_PASSWORD` | 数据库密码 |
| `POSTGRES_USER` | 数据库用户名 |
| `POSTGRES_DB` | 数据库名 |
*3.* 配置 Docker
----------------------------------------------------------------
编辑 `docker-compose.yml` 文件。
*4.* 构建 Misskey
----------------------------------------------------------------
使用如下的方式构建Misskey
`docker-compose build`
*5.* 初始化数据库
----------------------------------------------------------------
``` bash
docker-compose run --rm web yarn run init
```
*6.* 完成了!
----------------------------------------------------------------
干得不错现在您拥有了一个可以运行Misskey的环境啦。
### 正常启动
只需要 `docker-compose up -d` 即可。玩得愉快!
### 如何将您的 Misskey 服务器升级至最新版本
1. `git stash`
2. `git checkout master`
3. `git pull`
4. `git stash pop`
5. `docker-compose build`
6. 检查 [更新日志](../CHANGELOG.md) 以获取升级迁移信息。
7. `docker-compose stop && docker-compose up -d`
### 如何执行 [控制台指令](manage.zh.md):
`docker-compose run --rm web node built/tools/mark-admin @example`
----------------------------------------------------------------
如果您有任何疑问或是困惑,欢迎与我们联系!

14
docs/manage.zh.md Normal file
View File

@ -0,0 +1,14 @@
# 运营指南
## 检查任务队列的状态
即将到来……
## 设置用户为管理员
``` shell
node built/tools/mark-admin (用户名)
```
样例
``` shell
node built/tools/mark-admin @syuilo
```

View File

@ -4,7 +4,8 @@ Misskey Setup and Installation Guide
We thank you for your interest in setting up your Misskey server!
This guide describes how to install and setup Misskey.
[Japanese version also available - 日本語版もあります](./setup.ja.md)
- [Japanese version also available - 日本語版もあります](./setup.ja.md)
- [Simplified Chinese version also available - 简体中文版同样可用](./setup.zh.md)
----------------------------------------------------------------

View File

@ -4,7 +4,9 @@ Guide d'installation et de configuration de Misskey
Nous vous remerçions de l'intrêt que vous manifestez pour l'installation de votre propre instance Misskey !
Ce guide décrit les étapes à suivre afin d'installer et de configurer une instance Misskey.
[La version en japonnais est également disponible sur - 日本語版もあります](./setup.ja.md)
- [La version en japonnais est également disponible sur - 日本語版もあります](./setup.ja.md)
- [Version anglaise également disponible - English version also available - 英語版もあります](./setup.en.md)
- [Version Chinois simplifié également disponible - Simplified Chinese version also available - 简体中文版同样可用](./setup.zh.md)
----------------------------------------------------------------

View File

@ -4,7 +4,8 @@ Misskey構築の手引き
Misskeyサーバーの構築にご関心をお寄せいただきありがとうございます
このガイドではMisskeyのインストール・セットアップ方法について解説します。
[英語版もあります - English version also available](./setup.en.md)
- [英語版もあります - English version also available](./setup.en.md)
- [简体中文版同样可用 - Simplified Chinese version also available](./setup.zh.md)
----------------------------------------------------------------

146
docs/setup.zh.md Normal file
View File

@ -0,0 +1,146 @@
Misskey 设置和安装指南
================================================================
非常感谢您对构建 Misskey 服务器的关注!
这份指南描述了 Misskey 的安装与设置流程。
- [日本語版もあります - Japanese version also available](./setup.ja.md)
- [英語版もあります - English version also available](./setup.en.md)
----------------------------------------------------------------
*1.* 创建 Misskey 用户
----------------------------------------------------------------
直接使用 root 用户来运行 misskey 也许并不是一个好主意,因此我们有必要创建一个专用的用户。
以 Debian 为例:
``` bash
adduser --disabled-password --disabled-login misskey
```
*2.* 安装依赖
----------------------------------------------------------------
请安装并设置如下这些软件:
#### Dependencies :package:
* **[Node.js](https://nodejs.org/en/)** (12.x, 14.x)
* **[PostgreSQL](https://www.postgresql.org/)** (>= 10)
* **[Redis](https://redis.io/)**
##### Optional
* [Yarn](https://yarnpkg.com/) *可选,但出于安全因素考虑还是推荐安装。如果您没有安装, 您需要使用 `npx yarn` 来代替 `yarn`.*
* [Elasticsearch](https://www.elastic.co/) - 为了启用搜索功能,这个搜索引擎是有必要的。
* [FFmpeg](https://www.ffmpeg.org/)
*3.* 安装 Misskey
----------------------------------------------------------------
1. 连接至 misskey 用户.
`su - misskey`
2. 克隆 Misskey 项目的 master 分支。
`git clone -b master git://github.com/syuilo/misskey.git`
3. 进入 misskey 文件夹。
`cd misskey`
4. 检查 [最新发布版](https://github.com/syuilo/misskey/releases/latest) 标签。
`git checkout master`
5. 安装 Misskey 的依赖。
`yarn`
*4.* 配置 Misskey
----------------------------------------------------------------
1. 复制 `.config/example.yml` 并重命名为 `default.yml`。
`cp .config/example.yml .config/default.yml`
2. 编辑 `default.yml`
*5.* 构建 Misskey
----------------------------------------------------------------
使用如下的指令构建 Misskey
`NODE_ENV=production yarn build`
如果您使用的是 Debian 您需要安装 `build-essential`, `python` 环境包。
如果您仍然遇到有关某些模块的错误,您可以使用 node-gyp:
1. `npx node-gyp configure`
2. `npx node-gyp build`
3. `NODE_ENV=production yarn build`
*6.* 初始化数据库
----------------------------------------------------------------
``` bash
yarn run init
```
*7.* 完成了!
----------------------------------------------------------------
干得不错现在您拥有了一个可以运行Misskey的环境啦。
### 正常启动
只需要 `NODE_ENV=production npm start` 即可。玩得愉快!
### 使用 systemd 来启动
1. 在此处创建一个 systemd 服务:
`/etc/systemd/system/misskey.service`
2. 编辑它,粘贴如下内容并保存:
```
[Unit]
Description=Misskey daemon
[Service]
Type=simple
User=misskey
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/misskey
Environment="NODE_ENV=production"
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always
[Install]
WantedBy=multi-user.target
```
3. 重启 systemd 并设置 misskey 服务自动启动:
`systemctl daemon-reload ; systemctl enable misskey`
4. 启动 misskey 服务:
`systemctl start misskey`
您可以使用 `systemctl status misskey` 来检查服务是否正在运行。
### 如何将您的 Misskey 服务器升级至最新版本
1. `git checkout master`
2. `git pull`
3. `yarn install`
4. `NODE_ENV=production yarn build`
5. `yarn migrate`
6. 重启您的 Misskey 进程来应用改变。
7. 尽情享受吧!
如果您在更新时遇到任何问题,请尝试以下操作:
1. `yarn clean` 或是 `yarn cleanall`
2. 重试升级 (请不要忘记 `yarn install`
----------------------------------------------------------------
如果您有任何疑问或是困惑,欢迎与我们联系!

View File

@ -7,9 +7,6 @@ import * as gulp from 'gulp';
import * as ts from 'gulp-typescript';
import * as rimraf from 'rimraf';
import * as rename from 'gulp-rename';
const cleanCSS = require('gulp-clean-css');
const sass = require('gulp-dart-sass');
const fiber = require('fibers');
const locales: { [x: string]: any } = require('./locales');
const meta = require('./package.json');
@ -61,13 +58,6 @@ gulp.task('cleanall', gulp.parallel('clean', cb =>
rimraf('./node_modules', cb)
));
gulp.task('build:client:styles', () =>
gulp.src('./src/client/style.scss')
.pipe(sass({ fiber }))
.pipe(cleanCSS())
.pipe(gulp.dest('./built/client/assets/'))
);
gulp.task('copy:client', () =>
gulp.src([
'./assets/**/*',
@ -87,7 +77,6 @@ gulp.task('copy:docs', () =>
);
gulp.task('build:client', gulp.parallel(
'build:client:styles',
'copy:client',
'copy:docs'
));

View File

@ -1,5 +1,6 @@
---
_lang_: "العربية"
introMisskey: "اهلا بك! ميسكي هو منصة تدوين مصغر لا مركزية ومفتوحة المصدر.\nيمكنك مشاركة \"ملاحظات\" عن ما يجري حولك، وإخبار الجميع عن نفسك 📡\nتسمح لك \"الانفعالات\" بتعبير عن شعورك حول ملاحظات الآخرين 👍\nاكتشف عالمًا جديدًا 🚀"
monthAndDay: "{day}/{month}"
search: "البحث"
notifications: "الإشعارات"
@ -14,8 +15,12 @@ noNotes: "لم يتم العثور على أية ملاحظات"
noNotifications: "ليس هناك أية اشعارات"
instance: "مثيل الخادم"
settings: "الاعدادات"
basicSettings: "الاعدادات الأساسية"
otherSettings: "إعدادات أخرى"
openInWindow: "افتح في نافذة جديدة"
profile: "الملف التعريفي"
timeline: "الخيط الزمني"
noAccountDescription: "لم يكتب هذا المستخدم سيرته بعد."
login: "لِج"
loggingIn: "جارٍ تسجيل الدخول"
logout: "الخروج"
@ -28,22 +33,31 @@ favorite: "إضافة إلى المفضلة"
favorites: "المفضلات"
unfavorite: "إزالة من المفضلة"
pin: "دبّسها على الصفحة الشخصية"
unpin: "ألغ تثبيتها من ملفك الشخصي"
copyContent: "انسخ المحتوى"
copyLink: "انسخ الرابط"
delete: "حذف"
deleteAndEdit: "إزالة وإعادة الصياغة"
deleteAndEditConfirm: "أمتأكد من حذف الملاحظة؟ ستفقد كل مشاركاتها، والتفاعلات، والردود عليها."
addToList: "أضفه إلى قائمة"
sendMessage: "أرسل رسالة"
copyUsername: "انسخ اسم المستخدم"
searchUser: "ابحث عن مستخدمين"
reply: "رد"
loadMore: "عرض المزيد"
youGotNewFollower: "يتابعك"
receiveFollowRequest: "تلقيت طلب متابعة"
followRequestAccepted: "قُبل طلب المتابعة"
mention: "أشر الى"
mentions: "الإشارات"
directNotes: "الملاحظات المباشرة"
importAndExport: "إستورد / صدر"
import: "استيراد"
export: "تصدير"
files: "الملفات"
download: "تنزيل"
driveFileDeleteConfirm: "أمتأكد من حذف ملف {name}؟ كل الملاحظات المُرفق بها هذا الملف ستحذف."
unfollowConfirm: "أمتأكد من إلغاء متابعة {name}؟"
lists: "القوائم"
noLists: "ليس لديك أية قائمة"
note: "ملاحظة"
@ -53,8 +67,10 @@ followers: "المتابِعين"
followsYou: "يتابعك"
createList: "إنشاء قائمة"
manageLists: "إدارة القوائم"
error: "حدث خطأ ما"
error: "خطأ"
somethingHappened: "حدث خطأ"
retry: "حاول مجددًا"
pageLoadError: "فشل تحميل الصفحة"
enterListName: "اسم القائمة"
privacy: "الخصوصية"
makeFollowManuallyApprove: "القبول يدويا طلبات الإشتراك"
@ -64,6 +80,7 @@ followRequest: "طلب اشتراك"
followRequests: "طلبات الإشتراك"
unfollow: "إلغاء الاشتراك"
followRequestPending: "طلبات الإشتراك المعلّقة"
enterEmoji: "أدخل إيموجي"
unrenote: "إلغاء مشاركة الملاحظة"
quote: "اقتبس"
pinnedNote: "ملاحظة مدبسة"
@ -71,16 +88,26 @@ you: "أنت"
clickToShow: "اضغط للعرض"
sensitive: "محتوى حساس"
add: "إضافة"
reaction: "تفاعل"
rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات"
attachCancel: "أزل المرفق"
enterFileName: "ادخل اسم الملف"
mute: "اكتم"
unmute: "إلغاء الكتم"
block: "احجب"
unblock: "إلغاء الحجب"
suspend: "علِق"
unsuspend: "ألغ التعليق"
blockConfirm: "أمتأكد من حجب هذا الحساب؟"
unblockConfirm: "أمتأكد من إلغاء حجب هذا الحساب؟"
selectList: "اختر قائمة"
editWidgetsExit: "تم"
customEmojis: "إيموجي مخصص"
addEmoji: "إضافة إيموجي"
cacheRemoteFiles: "خزن مؤقتا الملفات البعيدة"
autoAcceptFollowed: "اقبل طلبات المتابعة تلقائيا من الحسابات المتابَعة"
addAcount: "إضافة حساب"
loginFailed: "فشل الولوج"
showOnRemote: "رؤيته على مثيل الخادم البُعدي"
general: "الرئيسية"
wallpaper: "خلفية الشاشة"
@ -88,6 +115,7 @@ setWallpaper: "استخدم خلفية الشاشة"
removeWallpaper: "إزالة خلفية الشاشة"
searchWith: "البحث: {q}"
youHaveNoLists: "لا تمتلك أية قائمة"
followConfirm: "أتريد متابعة {name}؟"
proxyAccount: "حساب وكيل البروكسي"
host: "المضيف"
selectUser: "حدّد مستخدمًا"
@ -96,6 +124,8 @@ annotation: "التعليقات"
federation: "الفديرالية"
instances: "مثيل الخادم"
latestRequestSentAt: "آخر طلب أرسِل في"
latestRequestReceivedAt: "آخر طلب تُلقي في"
storageUsage: "مساحة التخزين المستخدمة"
charts: "المنحنيات البيانية"
perHour: "في الساعة"
perDay: "في اليوم"
@ -127,7 +157,6 @@ processing: "المعالجة جارية"
preview: "معاينة"
default: "افتراضي"
noCustomEmojis: "ليس هناك إيموجيات"
customEmojisOfRemote: "الإيموجيات القادمة مِن مثيلات الخوادم الأخرى"
federating: "الفديرالية جارية"
blocked: "محجوب"
suspended: "مُعلّق"
@ -145,6 +174,7 @@ imageUrl: "عنوان URL للصورة"
remove: "حذف"
removed: "تم حذفه بنجاح"
removeAreYouSure: "متأكد من أنك تريد حذف {x}؟"
deleteAreYouSure: "متأكد من أنك تريد حذف {x}؟"
saved: "تم حفظه"
messaging: "الدردشة"
upload: "تحميل"
@ -221,6 +251,7 @@ registration: "إنشاء حساب"
enableRegistration: "تفعيل إنشاء الحسابات الجديدة"
invite: "دعوة"
basicInfo: "المعلومات الأساسية "
pinnedNotes: "ملاحظة مدبسة"
hcaptchaSiteKey: "مفتاح الموقع"
hcaptchaSecretKey: "المفتاح السري"
recaptcha: "reCAPTCHA"
@ -243,7 +274,6 @@ popularTags: "الوسوم الرائجة"
userList: "القوائم"
about: "عن"
aboutMisskey: "عن Misskey"
patrons: "الداعمون"
administrator: "المدير"
token: "الرمز المميز"
twoStepAuthentication: "الإستيثاق بعاملَيْن"
@ -256,8 +286,6 @@ unregister: "إلغاء التسجيل"
passwordLessLogin: "لِج مِن دون كلمة سرية"
resetPassword: "أعد تعيين كلمتك السرية"
newPasswordIs: "كلمتك السرية الجديدة هي {password}"
autoReloadWhenDisconnected: "إنعاش تلقائي عندما يُقطَع الإتصال بالخادم"
autoNoteWatch: "راقب الملاحظات تلقائيا"
share: "شارِك"
notFound: "غير موجود"
help: "المساعدة"
@ -281,6 +309,7 @@ noteOf: "ملاحظات {user}"
inviteToGroup: "دعوة إلى فريق"
noMessagesYet: "ليس هناك رسائل بعد"
newMessageExists: "لقد تلقيت رسالة جديدة"
invitations: "دعوة"
invitationCode: "رمز الدعوة"
checking: "التحقق جارٍ"
available: "متوفر"
@ -314,7 +343,6 @@ total: "المجموع"
weekOverWeekChanges: "أسبوعيا"
dayOverDayChanges: "يوميا"
appearance: "المظهر"
clinetSettings: "إعدادات التطبيق"
accountSettings: "إعدادات الحساب"
promotion: "ترقية"
promote: "روِّج"
@ -351,6 +379,21 @@ pluginInstallWarn: "يرجى تنصيب إضافات ذات مصدر موثوق
smtpHost: "المضيف"
smtpUser: "اسم المستخدم"
smtpPass: "الكلمة السرية"
display: "المظهر"
public: "للعامة"
_mfm:
mention: "أشر الى"
quote: "اقتبس"
emoji: "إيموجي مخصص"
search: "البحث"
_reversi:
total: "المجموع"
_channel:
featured: "المتداوَلة"
_sidebar:
full: "كامل"
icon: "الصورة الرمزية"
hide: "إخفاء"
_theme:
explore: "استكشف قوالب المظهر"
install: "تنصيب قالب"
@ -360,6 +403,7 @@ _theme:
make: "إنشاء قالب"
alpha: "الشفافية"
keys:
mention: "أشر الى"
messageBg: "خلفية الدردشة"
_sfx:
note: "الملاحظات"
@ -500,6 +544,11 @@ _notification:
youGotMessagingMessageFromUser: "لقد تلقيت رسالة مِن {name}"
youGotMessagingMessageFromGroup: "لقد أرسِلَت رسالة إلى الفريق {name}"
youWereFollowed: "يتابعك"
_types:
follow: "المتابَعون"
mention: "أشر الى"
quote: "اقتبس"
reaction: "تفاعل"
_deck:
_columns:
notifications: "الإشعارات"

View File

@ -16,6 +16,9 @@ noNotes: "Keine Notizen"
noNotifications: "Keine Benachrichtigungen"
instance: "Instanz"
settings: "Einstellungen"
basicSettings: "Allgemeine Einstellungen"
otherSettings: "Andere Einstellungen"
openInWindow: "In Fenster öffnen"
profile: "Profil"
timeline: "Chronik"
noAccountDescription: "Dieser Nutzer hat seine Profilbeschreibung noch nicht ausgefüllt."
@ -40,6 +43,7 @@ deleteAndEditConfirm: "Möchtest du diese Notiz wirklich löschen und bearbeiten
addToList: "Zu Liste hinzufügen"
sendMessage: "Nachricht senden"
copyUsername: "Benutzernamen kopieren"
searchUser: "Benutzersuche"
reply: "Antworten"
loadMore: "Mehr anzeigen"
youGotNewFollower: "Du hast einen neuen Follower"
@ -66,8 +70,11 @@ followers: "Gefolgt von"
followsYou: "Folgt dir"
createList: "Liste erstellen"
manageLists: "Listen verwalten"
error: "Ein Problem ist aufgetreten"
error: "Fehler"
somethingHappened: "Ein Fehler ist aufgetreten"
retry: "Wiederholen"
pageLoadError: "Laden der Seite fehlgeschlagen."
pageLoadErrorDescription: "Dieser Fehler wird meist durch Netzwerkfehler oder den Browser-Cache verursacht. Versuche den Browser-Cache zu leeren und es nach kurzer Zeit noch einmal zu probieren."
enterListName: "Listennamen eingeben"
privacy: "Privatsphäre"
makeFollowManuallyApprove: "Follow-Anfragen benötigen Bestätigung"
@ -84,14 +91,15 @@ quote: "Zitieren"
pinnedNote: "Angepinnte Notiz"
you: "Du"
clickToShow: "Klicke, um diesen Inhalt anzusehen"
sensitive: "Dieser Inhalt ist NSFW"
sensitive: "NSFW"
add: "Hinzufügen"
reaction: "Reaktionen"
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"
attachCancel: "Anhang entfernen"
markAsSensitive: "Als sensitiv markieren"
unmarkAsSensitive: "Markierung als sensitiv zurücknehmen"
markAsSensitive: "Als NSFW markieren"
unmarkAsSensitive: "Markierung als NSFW zurücknehmen"
enterFileName: "Dateinamen eingeben"
mute: "Stummschalten"
unmute: "Stummschaltung aufheben"
@ -104,6 +112,10 @@ unblockConfirm: "Möchtest du diese Blockierung wirklich aufheben?"
suspendConfirm: "Möchtest du diesen Benutzer wirklich sperren?"
unsuspendConfirm: "Möchtest du die Sperrung dieses Benutzers wirklich aufheben?"
selectList: "Wähle eine Liste aus"
selectAntenna: "Antenne auswählen"
selectWidget: "Widget auswählen"
editWidgets: "Widgets bearbeiten"
editWidgetsExit: "Fertig"
customEmojis: "Benutzerdefinierte Emojis"
emoji: "Emoji"
emojiName: "Emojiname"
@ -113,7 +125,9 @@ settingGuide: "Empfohlene Einstellung"
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."
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"
flagAsCatDescription: "Setze diese Flag um dieses Benutzerkonto als Katze zu markieren."
autoAcceptFollowed: "Follow-Anfragen automatisch akzeptieren"
addAcount: "Benutzerkonto hinzufügen"
loginFailed: "Login fehlgeschlagen"
@ -163,7 +177,7 @@ clearCachedFilesConfirm: "Sollen alle im Cache gespeicherten Dateien von anderen
blockedInstances: "Blockierte Instanzen"
blockedInstancesDescription: "Gib den Hostnamen der Instanz an, die blockiert werden soll. Blockierte Instanzen können nicht mehr mit dieser kommunizieren."
muteAndBlock: "Stummgeschaltet / Blockiert"
mutedUsers: "Stummgestellte Benutzer"
mutedUsers: "Stummgeschaltete Benutzer"
blockedUsers: "Blockierte Benutzer"
noUsers: "Keine Benutzer"
editProfile: "Profil bearbeiten"
@ -175,7 +189,6 @@ processing: "In Bearbeitung"
preview: "Vorschau"
default: "Standard"
noCustomEmojis: "Es existieren keine Emojis"
customEmojisOfRemote: "Emojis von anderen Instanzen"
noJobs: "Es gibt keine Jobs"
federating: "Föderiert"
blocked: "Blockiert"
@ -204,6 +217,8 @@ imageUrl: "Bild-URL"
remove: "Löschen"
removed: "Erfolgreich gelöscht"
removeAreYouSure: "Möchtest du \"{x}\" wirklich löschen?"
deleteAreYouSure: "Möchtest du \"{x}\" wirklich löschen?"
resetAreYouSure: "Wirklich zurücksetzen?"
saved: "Gespeichert"
messaging: "Chat"
upload: "Hochladen"
@ -261,7 +276,8 @@ copyUrl: "URL kopieren"
rename: "Umbenennen"
avatar: "Profilbild"
banner: "Banner"
nsfw: "Dieser Inhalt ist NSFW"
nsfw: "NSFW"
whenServerDisconnected: "Bei Verbindungsverlust zum Server"
disconnectedFromServer: "Verbindung zum Server wurde getrennt"
reload: "Aktualisieren"
doNothing: "Ignorieren"
@ -302,6 +318,10 @@ bannerUrl: "Banner-URL"
basicInfo: "Basisdaten"
pinnedUsers: "Angepinnte Benutzer"
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"
enableHcaptcha: "hCaptcha aktivieren"
hcaptchaSiteKey: "Site key"
@ -342,13 +362,6 @@ popularTags: "Beliebte Schlagwörter"
userList: "Listen"
about: "Über"
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"
token: "Token"
twoStepAuthentication: "Zwei-Faktor-Authentifizierung"
@ -362,9 +375,6 @@ unregister: "Deaktivieren"
passwordLessLogin: "Passwortloses Anmelden einrichten"
resetPassword: "Passwort zurücksetzen"
newPasswordIs: "Das neue Passwort ist \"{password}\""
autoReloadWhenDisconnected: "Automatisch aktualisieren wenn die Serververbindung getrennt wird"
autoNoteWatch: "Notizen automatisch beobachten"
autoNoteWatchDescription: "Werde über Notizen, auf die du reagiert oder geantwortet hast, informiert"
reduceUiAnimation: "Animationen der Benutzeroberfläche reduzieren"
share: "Teilen"
notFound: "Nicht gefunden"
@ -402,6 +412,7 @@ noMessagesYet: "Noch keine Nachrichten"
newMessageExists: "Du hast eine neue Nachricht"
onlyOneFileCanBeAttached: "Es kann pro Nachricht nur eine Datei angehängt werden"
signinRequired: "Anmeldung erforderlich"
invitations: "Einladungen"
invitationCode: "Einladungscode"
checking: "Wird überprüft..."
available: "Verfügbar"
@ -425,6 +436,7 @@ useOsNativeEmojis: "Eingebaute Emojis des Betriebssystems benutzen"
youHaveNoGroups: "Keine Gruppen vorhanden"
joinOrCreateGroup: "Lass dich zu einer Gruppe einladen oder erstelle deine eigene."
noHistory: "Kein Verlauf"
signinHistory: "Anmeldungsverlauf"
disableAnimatedMfm: "MFM, die Animationen enthalten, deaktivieren"
doing: "In Bearbeitung"
category: "Kategorie"
@ -443,7 +455,7 @@ total: "Gesamt"
weekOverWeekChanges: "Wöchentlich"
dayOverDayChanges: "Täglich"
appearance: "Aussehen"
clinetSettings: "Client-Einstellungen"
clientSettings: "Client-Einstellungen"
accountSettings: "Benutzerkonto-Einstellungen"
promotion: "Hervorgehoben"
promote: "Hervorheben"
@ -466,6 +478,7 @@ objectStorageUseSSL: "SSL verwenden"
objectStorageUseSSLDesc: "Deaktiviere dies falls du für die API-Verbindungen kein HTTPS verwenden wirst"
objectStorageUseProxy: "Über Proxy verbinden"
objectStorageUseProxyDesc: "Deaktiviere dies falls du keinen Proxy für den Objektspeicher verwenden wirst"
objectStorageSetPublicRead: "Bei Upload auf \"public-read\" stellen"
serverLogs: "Serverprotokolle"
deleteAll: "Alle löschen"
showFixedPostForm: "Bereich zum Schreiben neuer Notizen am Anfang der Chronik anzeigen"
@ -473,7 +486,10 @@ newNoteRecived: "Es gibt neue Notizen"
sounds: "Töne"
listen: "Anhören"
none: "Keine"
showInPage: "In Seite anzeigen"
popout: "Pop-Up"
volume: "Lautstärke"
masterVolume: "Gesamtlautstärke"
details: "Details"
chooseEmoji: "Wähle ein Emoji"
unableToProcess: "Der Vorgang konnte nicht abgeschlossen werden."
@ -515,7 +531,6 @@ enableInfiniteScroll: "Automatisch mehr Notizen laden"
visibility: "Sichtbarkeit"
poll: "Umfrage"
useCw: "Inhalt verstecken"
fixedWidgetsPosition: "Widgetposition fixieren"
enablePlayer: "Video-Player öffnen"
disablePlayer: "Video-Player schließen"
expandTweet: "Tweet ausklappen"
@ -529,21 +544,250 @@ pluginInstallWarn: "Installiere nur vertrauenswürdige Plugins."
deck: "Deck"
undeck: "Deck verlassen"
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"
permission: "Berechtigungen"
enableAll: "Alle aktivieren"
disableAll: "Alle deaktivieren"
tokenRequested: "Benutzerkontozugriff gewähren"
pluginTokenRequestedDescription: "Dieses Plugin wird die hier konfigurierten Berechtigungen verwenden können."
notificationType: "Benachrichtigungstyp"
edit: "Bearbeiten"
useStarForReactionFallback: "Verwende ★ falls das Reaktions-Emoji unbekannt ist"
emailConfig: "Email-Server Konfiguration"
enableEmail: "Email-Versand aktivieren"
emailConfigInfo: "Zur Email-Bestätigung bei Registrierung und zum Zurücksetzen des Passworts verwendet"
email: "Email"
emailAddress: "Email-Adresse"
smtpConfig: "SMTP-Server Konfiguration"
smtpHost: "Host"
smtpPort: "Port"
smtpUser: "Benutzername"
smtpPass: "Passwort"
emptyToDisableSmtpAuth: "Benutzername und Passwort leer lassen um SMTP-Verifizierung zu deaktivieren"
smtpSecure: "Für SMTP-Verbindungen implizit SSL/TLS verwenden"
smtpSecureInfo: "Schalte dies aus, falls du STARTTLS verwendest"
testEmail: "Email-Versand testen"
wordMute: "Wort-Stummschaltung"
userSaysSomething: "{name} hat etwas gesagt."
makeActive: "Aktivieren"
display: "Anzeige"
copy: "Kopieren"
metrics: "Metriken"
overview: "Übersicht"
logs: "Logs"
delayed: "Verzögert"
database: "Datenbank"
channel: "Kanäle"
create: "Erstellen"
notificationSetting: "Benachrichtigungseinstellungen"
notificationSettingDesc: "Wähle die Art der anzuzeigenden Benachrichtigung"
useGlobalSetting: "Globale Einstellung verwenden"
useGlobalSettingDesc: "Wenn dies eingeschaltet ist, werden die Benachrichtigungseinstellungen deines Benutzerkontos verwendet. Wenn dies ausgeschaltet ist, können individuelle Einstellungen vorgenommen werden."
other: "Andere"
regenerateLoginToken: "Login-Token regenerieren"
regenerateLoginTokenDescription: "Den bei Logins intern verwendeten Token regenerieren. Normalerweise wird dies nicht benötigt. Bei Regeneration werden alle Geräte ausgeloggt."
setMultipleBySeparatingWithSpace: "Trenne Elemente durch ein Leerzeichen um mehrere Einstellungen zu kofigurieren."
fileIdOrUrl: "Datei-ID oder URL"
chatOpenBehavior: "Verhalten des Chatfensters bei Öffnung"
behavior: "Verhalten"
sample: "Beispiel"
abuseReports: "Melden"
reportAbuse: "Melden"
reportAbuseOf: "{name} melden"
fillAbuseReportDescription: "Bitte gib Details für diese Meldung an. Falls es sich um eine spezielle Notiz handelt, bitte gib dessen URL an."
abuseReported: "Die Meldung wurde versendet. Vielen Dank."
send: "Senden"
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. Unter {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"
_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:
reload: "Automatisch aktualisieren"
dialog: "Warnungsfenster zeigen"
quiet: "Unaufdringlich warnen"
_channel:
create: "Kanal erstellen"
edit: "Kanal bearbeiten"
setBanner: "Kanalbanner festlegen"
removeBanner: "Kanalbanner entfernen"
featured: "Trends"
owned: "Besitzt"
following: "Gefolgt"
usersCount: "{n} Teilnehmer"
notesCount: "{n} Notizen"
_sidebar:
full: "Voll"
icon: "Symbole"
hide: "Ausblenden"
_wordMute:
muteWords: "Wort stummschalten"
muteWordsDescription: "Mit Leerzeichen für eine \"UND\"-Verknüpfung trennen, durch Zeilenumbrüche für eine \"ODER\"-Verknüpfung trennen."
muteWordsDescription2: "Umgib Schlüsselworter mit Schrägstrichen, um Reguläre Ausdrücke zu verwenden."
softDescription: "Notizen, die die eingestellten Konditionen erfüllen, in der Chronik ausblenden"
hardDescription: "Verhindern, dass Notizen, die die eingestellten Konditionen erfüllen, der Chronik hinzugefügt werden. Zudem werden diese Notizen auch nicht der Chronik hinzugefügt, falls die Konditionen geändert werden."
soft: "Leicht"
hard: "Schwer"
mutedNotes: "Stummgeschaltete Notizen"
_theme:
explore: "Themen erforschen"
install: "Thema installieren"
manage: "Themaverwaltung"
code: "Themen-Code"
installed: "{name} wurde installiert"
installedThemes: "Installierte Themen"
builtinThemes: "Eingebaute Themen"
alreadyInstalled: "Dieses Thema ist bereits installiert"
invalid: "Themenformat ist ungültig"
make: "Farbthema erstellen"
@ -616,6 +860,9 @@ _sfx:
chat: "Chat"
chatBg: "Nachrichten (Hintergrund)"
antenna: "Antennen"
channel: "Kanalbenachrichtigung"
reversiPutBlack: "Reversi: Schwarz macht einen Zug"
reversiPutWhite: "Reversi: Weiß macht einen Zug"
_ago:
unknown: "Unbekannt"
future: "Zukunft"
@ -681,9 +928,9 @@ _permissions:
"write:mutes": "Stummschaltungen bearbeiten"
"write:notes": "Notizen schreiben oder löschen"
"read:notifications": "Benachrichtigungen lesen"
"write:notifications": "Mit Benachrichtigungen arbeiten"
"write:notifications": "Benachrichtigungen bearbeiten"
"read:reactions": "Reaktionen lesen"
"write:reactions": "Reaktionen hinzufügen und bearbeiten"
"write:reactions": "Reaktionen hinzufügen und ändern"
"write:votes": "In Umfragen abstimmen"
"read:pages": "Deine Seiten lesen"
"write:pages": "Deine Seiten bearbeiten oder löschen"
@ -691,6 +938,8 @@ _permissions:
"write:page-likes": "Liste der Seiten, die mir gefallen, bearbeiten"
"read:user-groups": "Benutzergruppen lesen"
"write:user-groups": "Benutzergruppen bearbeiten oder löschen"
"read:channels": "Kanäle lesen"
"write:channels": "Kanäle bearbeiten"
_auth:
shareAccess: "Möchtest du \"{name}\" authorisieren, auf dieses Benuzerkonto zugreifen zu können?"
shareAccessAsk: "Bist du dir sicher, dass du diese Anwendung authorisieren möchtest, auf dein Benutzerkonto zugreifen zu können?"
@ -724,6 +973,7 @@ _widgets:
photos: "Fotos"
digitalClock: "Digitaluhr"
federation: "Föderation"
postForm: "Neue Notiz anfertigen"
_cw:
hide: "Ausblenden"
show: "Mehr anzeigen"
@ -765,6 +1015,7 @@ _visibility:
_postForm:
replyPlaceholder: "Dieser Notiz antworten..."
quotePlaceholder: "Diese Notiz zitieren..."
channelPlaceholder: "In einen Kanal senden"
_placeholders:
a: "Was machst du momentan?"
b: "Was ist um dich herum los?"
@ -777,9 +1028,13 @@ _profile:
username: "Benutzername"
description: "Über mich"
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"
metadataContent: "Inhalt"
changeAvatar: "Profilbild ändern"
changeBanner: "Banner ändern"
_exportOrImport:
allNotes: "Alle Notizen"
followingList: "Gefolgte Benutzer"
@ -886,6 +1141,7 @@ _pages:
created: "Seite erfolgreich erstellt"
updated: "Seite erfolgreich aktualisiert"
deleted: "Seite erfolgreich gelöscht"
pageSetting: "Seiteneinstellungen"
nameAlreadyExists: "Die angegebene Seiten-URL existiert bereits"
invalidNameTitle: "Die angegebene Seiten-URL ist ungültig"
invalidNameText: "Überprüfe, ob der Seitentitel nicht leer ist"
@ -896,7 +1152,9 @@ _pages:
unlike: "\"Gefällt mir\" entfernen"
my: "Meine Seiten"
liked: "Seiten, die mir gefallen"
featured: "Beliebt"
inspector: "Inspektor"
contents: "Inhalt"
content: "Inhalt"
variables: "Variablen"
title: "Titel"
@ -920,7 +1178,7 @@ _pages:
text: "Text"
textarea: "Textfeld"
section: "Abschnitt"
image: "Bilder"
image: "Bild"
button: "Knopf"
if: "Falls"
_if:
@ -935,7 +1193,7 @@ _pages:
name: "Variablenname"
text: "Titel"
default: "Standardwert"
textareaInput: "Eingabe des mehrzeiligen Textfelds"
textareaInput: "Mehrzeiliges Texteingabefeld"
_textareaInput:
name: "Variablenname"
text: "Titel"
@ -950,6 +1208,11 @@ _pages:
id: "Leinwand-ID"
width: "Breite"
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:
name: "Variablenname"
@ -1177,10 +1440,29 @@ _notification:
youReceivedFollowRequest: "Du hast eine Follow-Anfrage erhalten"
yourFollowRequestAccepted: "Deine Follow-Anfrage wurde akzeptiert"
youWereInvitedToGroup: "Du wurdest in eine Gruppe eingeladen"
_types:
all: "Alle"
follow: "Neue Follower"
mention: "Erwähnungen"
reply: "Antworten"
renote: "Renotes"
quote: "Zitationen"
reaction: "Reaktionen"
pollVote: "Antworten auf Umfragen"
receiveFollowRequest: "Follow-Anfrage erhalten"
followRequestAccepted: "Follow-Anfrage akzeptiert"
groupInvited: "Gruppeneinladung erhalten"
app: "Benachrichtigungen von Apps"
_deck:
alwaysShowMainColumn: "Hauptspalte immer zeigen"
columnAlign: "Spalten ausrichten"
addColumn: "Spalte hinzufügen"
swapLeft: "Nach links verschieben"
swapRight: "Nach rechts verschieben"
swapUp: "Nach oben verschieben"
swapDown: "Nach unten verschieben"
stackLeft: "Nach links stapeln"
popRight: "Nach rechts vom Stapel nehmen"
_columns:
widgets: "Widgets"
notifications: "Benachrichtigungen"

View File

@ -16,6 +16,9 @@ noNotes: "No notes"
noNotifications: "No notifications"
instance: "Instance"
settings: "Settings"
basicSettings: "Basic Settings"
otherSettings: "Other Settings"
openInWindow: "Open in window"
profile: "Profile"
timeline: "Timeline"
noAccountDescription: "This user has not written their bio yet."
@ -29,7 +32,7 @@ users: "Users"
addUser: "Add a user"
favorite: "Favorite"
favorites: "Favorites"
unfavorite: "Undo favorite"
unfavorite: "Unfavorite"
pin: "Pin to profile"
unpin: "Unpin from profile"
copyContent: "Copy contents"
@ -40,6 +43,7 @@ deleteAndEditConfirm: "Are you sure you want to delete this note and edit it? Yo
addToList: "Add to list"
sendMessage: "Send a message"
copyUsername: "Copy username"
searchUser: "User search"
reply: "Reply"
loadMore: "Load more"
youGotNewFollower: "Followed you"
@ -66,8 +70,11 @@ followers: "Followers"
followsYou: "Follows you"
createList: "Create list"
manageLists: "Manage lists"
error: "Something happened :("
error: "Error"
somethingHappened: "An error occurred"
retry: "Retry"
pageLoadError: "Failed to load page"
pageLoadErrorDescription: "This is normally caused by network errors or the browser's cache. Try clearung the cache and then try again after waiting a little while."
enterListName: "List name"
privacy: "Privacy"
makeFollowManuallyApprove: "Follow requests require approval"
@ -88,6 +95,7 @@ sensitive: "NSFW"
add: "Add"
reaction: "Reaction"
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"
attachCancel: "Remove attachment"
markAsSensitive: "Mark as NSFW"
@ -104,6 +112,10 @@ unblockConfirm: "Are you sure that you want to unblock this account?"
suspendConfirm: "Are you sure that you want to suspend this account?"
unsuspendConfirm: "Are you sure you that want to unsuspend this account?"
selectList: "Select a list"
selectAntenna: "Select an Antenna"
selectWidget: "Select a widget"
editWidgets: "Edit widgets"
editWidgetsExit: "Done"
customEmojis: "Custom Emoji"
emoji: "Emoji"
emojiName: "Emoji name"
@ -113,7 +125,9 @@ settingGuide: "Suggested Configuration"
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."
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"
flagAsCatDescription: "Toggle this flag on for this account to be marked as a cat."
autoAcceptFollowed: "Automatically approve follow requests from users you're following"
addAcount: "Add Account"
loginFailed: "Failed to sign in"
@ -175,7 +189,6 @@ processing: "Processing"
preview: "Preview"
default: "Default"
noCustomEmojis: "There are no emojis"
customEmojisOfRemote: "Emojis from other instances"
noJobs: "There are no jobs"
federating: "Federating"
blocked: "Blocked"
@ -204,6 +217,8 @@ imageUrl: "Image URL"
remove: "Delete"
removed: "Successfully deleted"
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"
messaging: "Messaging"
upload: "Upload"
@ -262,6 +277,7 @@ rename: "Rename"
avatar: "Avatar"
banner: "Banner"
nsfw: "NSFW"
whenServerDisconnected: "When losing connection to the server"
disconnectedFromServer: "Connection to the server was interrupted."
reload: "Refresh"
doNothing: "Ignore"
@ -302,6 +318,10 @@ bannerUrl: "Banner image URL"
basicInfo: "Basic info"
pinnedUsers: "Pinned user"
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"
enableHcaptcha: "Enable hCaptcha"
hcaptchaSiteKey: "Site key"
@ -342,13 +362,6 @@ popularTags: "Trending Tags"
userList: "Lists"
about: "About"
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"
token: "Token"
twoStepAuthentication: "Two-factor authentication"
@ -362,9 +375,6 @@ unregister: "Unregister"
passwordLessLogin: "Set up password-less login"
resetPassword: "Reset password"
newPasswordIs: "The new password is \"{password}\""
autoReloadWhenDisconnected: "Auto refresh when disconnected from server"
autoNoteWatch: "Watch note automatically"
autoNoteWatchDescription: "Get notified about the notes which you reactioned or replied."
reduceUiAnimation: "Reduce UI animation"
share: "Share"
notFound: "Not found"
@ -395,13 +405,14 @@ next: "Next"
retype: "Enter again"
noteOf: "{user}'s notes"
inviteToGroup: "Invite to group"
maxNoteTextLength: "Character limit of the note"
maxNoteTextLength: "Character limit of notes"
quoteAttached: "Quoted"
quoteQuestion: "Do you want to append a quote?"
noMessagesYet: "No messages yet"
newMessageExists: "You've got a new message"
onlyOneFileCanBeAttached: "You can only attach one file to a message"
signinRequired: "Please sign in"
invitations: "Invitations"
invitationCode: "Invitation code"
checking: "Checking"
available: "Available"
@ -425,6 +436,7 @@ useOsNativeEmojis: "Use OS native Emojis"
youHaveNoGroups: "You have no groups"
joinOrCreateGroup: "Get invited to join the groups or you can create your own group."
noHistory: "No history items"
signinHistory: "Login history"
disableAnimatedMfm: "Disable MFM with animation"
doing: "On my way"
category: "Category"
@ -443,7 +455,7 @@ total: "Total"
weekOverWeekChanges: "Weekly"
dayOverDayChanges: "Daily"
appearance: "Appearance"
clinetSettings: "Client Settings"
clientSettings: "Client settings"
accountSettings: "Account Settings"
promotion: "Promoted"
promote: "Promote"
@ -466,6 +478,7 @@ objectStorageUseSSL: "Use SSL"
objectStorageUseSSLDesc: "Turn off this if you are not going to use HTTPS for API connection"
objectStorageUseProxy: "Connect over Proxy"
objectStorageUseProxyDesc: "Turn off this if you are not going to use Proxy for ObjectStorage connection"
objectStorageSetPublicRead: "Set \"public-read\" on upload"
serverLogs: "Server logs"
deleteAll: "Delete all"
showFixedPostForm: "Display the posting form at the top of the timeline"
@ -473,7 +486,10 @@ newNoteRecived: "You've got a new note"
sounds: "Sounds"
listen: "Listen"
none: "None"
showInPage: "Show in page"
popout: "Pop-out"
volume: "Volume"
masterVolume: "Master volume"
details: "Details"
chooseEmoji: "Choose an emoji"
unableToProcess: "The operation could not be completed."
@ -515,7 +531,6 @@ enableInfiniteScroll: "Enable infinite scrolling"
visibility: "Visiblility"
poll: "Poll"
useCw: "Hide content"
fixedWidgetsPosition: "Make widget position fixed"
enablePlayer: "Open video player"
disablePlayer: "Close video player"
expandTweet: "Expand tweet"
@ -529,21 +544,250 @@ pluginInstallWarn: "Please do not install untrustworthy plugins."
deck: "Deck"
undeck: "Leave Deck"
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"
permission: "Permissions"
enableAll: "Enable all"
disableAll: "Disable all"
tokenRequested: "Grant access to account"
pluginTokenRequestedDescription: "This plugin will be able to use the permissions set here."
notificationType: "Notification type"
edit: "Edit"
useStarForReactionFallback: "Use ★ as fallback if the reaction emoji is unknown"
emailConfig: "Email server configuration"
enableEmail: "Enable email distribution"
emailConfigInfo: "Used to confirm your email during sign-up and if you forget your password"
email: "Email"
emailAddress: "Email address"
smtpConfig: "SMTP Server configuration"
smtpHost: "Host"
smtpPort: "Port"
smtpUser: "Username"
smtpPass: "Password"
emptyToDisableSmtpAuth: "Leave username and password empty to disable SMTP verification"
smtpSecure: "Use implicit SSL/TLS for SMTP connections"
smtpSecureInfo: "Turn this off when using STARTTLS"
testEmail: "Test email delivery"
wordMute: "Word mute"
userSaysSomething: "{name} said something"
makeActive: "Activate"
display: "Display"
copy: "Copy"
metrics: "Metrics"
overview: "Overview"
logs: "Logs"
delayed: "Delayed"
database: "Database"
channel: "Channels"
create: "Create"
notificationSetting: "Notification settings"
notificationSettingDesc: "Select the type of notification to display"
useGlobalSetting: "Use global setting"
useGlobalSettingDesc: "If turned on, your account's notification settings will be used. If turned off, individual configurations can be made."
other: "Other"
regenerateLoginToken: "Regenerate login token"
regenerateLoginTokenDescription: "Regenerate the token used internally during login. Normally this action is not necessary. If regenerated, all devices will be logged out."
setMultipleBySeparatingWithSpace: "You can set multiple by separating them with spaces."
fileIdOrUrl: "File-ID or URL"
chatOpenBehavior: "Behavior of the chat window when opened"
behavior: "Behavior"
sample: "Sample"
abuseReports: "Reports"
reportAbuse: "Report"
reportAbuseOf: "Report {name}"
fillAbuseReportDescription: "Please fill in the report details. If it is about a specific note, please include its URL."
abuseReported: "Your report has been sent. Thank you very much."
send: "Send"
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"
_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:
reload: "Automatically reload"
dialog: "Show warning dialog"
quiet: "Show unobtrusive warning"
_channel:
create: "Create channel"
edit: "Edit channel"
setBanner: "Set banner"
removeBanner: "Remove banner"
featured: "Trending"
owned: "Owned"
following: "Followed"
usersCount: "{n} Participants"
notesCount: "{n} Notes"
_sidebar:
full: "Full"
icon: "Icons"
hide: "Hide"
_wordMute:
muteWords: "Word to mute"
muteWordsDescription: "Separate with spaces for AND condition. Separate with line breaks for OR."
muteWordsDescription2: "Surround keywords by slashes to use regular expressions."
softDescription: "Hide notes fulfilling the set conditions from the timeline."
hardDescription: "Prevent notes fulfilling the set conditions from being added to the timeline. In addition, these notes will not be added to the timeline even if the conditions are changed."
soft: "Soft"
hard: "Hard"
mutedNotes: "Muted notes"
_theme:
explore: "Explore Themes"
install: "Install theme"
manage: "Themes manager"
code: "Theme code"
installed: "{name} has been installed"
installedThemes: "Installed themes"
builtinThemes: "Built-in themes"
alreadyInstalled: "The theme is already installed"
invalid: "Theme format is invalid"
make: "Make a theme"
@ -616,6 +860,9 @@ _sfx:
chat: "Messaging"
chatBg: "Messaging (Background)"
antenna: "Antenna Reception"
channel: "Channel notifications"
reversiPutBlack: "Reversi: Black makes a move"
reversiPutWhite: "Reversi: White makes a move"
_ago:
unknown: "Unknown"
future: "Future"
@ -691,6 +938,8 @@ _permissions:
"write:page-likes": "Edit likes on pages"
"read:user-groups": "View user groups"
"write:user-groups": "Edit or delete user groups"
"read:channels": "Read channels"
"write:channels": "Modify channels"
_auth:
shareAccess: "Would you like to authorize \"{name}\" to access this account?"
shareAccessAsk: "Are you sure you want to authorize this application to access your account?"
@ -724,6 +973,7 @@ _widgets:
photos: "Photos"
digitalClock: "Digital clock"
federation: "Federation"
postForm: "Compose a note"
_cw:
hide: "Hide"
show: "Load more"
@ -765,6 +1015,7 @@ _visibility:
_postForm:
replyPlaceholder: "Reply to this note..."
quotePlaceholder: "Quote this note..."
channelPlaceholder: "Post to channel"
_placeholders:
a: "What are you up to?"
b: "What's happening around you?"
@ -777,9 +1028,13 @@ _profile:
username: "Username"
description: "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"
metadataContent: "Content"
changeAvatar: "Change avatar"
changeBanner: "Change banner"
_exportOrImport:
allNotes: "All notes"
followingList: "Following"
@ -886,6 +1141,7 @@ _pages:
created: "Successfully created a page!"
updated: "Successfully updated the page!"
deleted: "The page has been deleted"
pageSetting: "Page settings"
nameAlreadyExists: "The specified page URL already exists"
invalidNameTitle: "The specified page URL is invalid"
invalidNameText: "Check whether that is not a blank"
@ -896,7 +1152,9 @@ _pages:
unlike: "Undo like"
my: "My pages"
liked: "Liked pages"
featured: "Featured"
inspector: "Inspector"
contents: "Content"
content: "Page block"
variables: "Variables"
title: "Title"
@ -950,6 +1208,11 @@ _pages:
id: "Canvas ID"
width: "Width"
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:
name: "Variable name"
@ -1177,10 +1440,29 @@ _notification:
youReceivedFollowRequest: "You've received a follow request"
yourFollowRequestAccepted: "Your follow request was accepted"
youWereInvitedToGroup: "Invited to group"
_types:
all: "All"
follow: "Follows"
mention: "Mentions"
reply: "Replies"
renote: "Renotes"
quote: "Quotes"
reaction: "Reactions"
pollVote: "Votes on polls"
receiveFollowRequest: "Follow request received"
followRequestAccepted: "Follow request accepted"
groupInvited: "Invited to groups"
app: "Notifications from apps"
_deck:
alwaysShowMainColumn: "Always show main column"
columnAlign: "Align columns"
addColumn: "Add column"
swapLeft: "Swap to left"
swapRight: "Swap to right"
swapUp: "Swap with above"
swapDown: "Swap with below"
stackLeft: "Stack on the left"
popRight: "Pop to the right"
_columns:
widgets: "Widgets"
notifications: "Notifications"

View File

@ -16,6 +16,9 @@ noNotes: "No hay notas"
noNotifications: "No hay notificaciones"
instance: "Instancia"
settings: "Configuración"
basicSettings: "Configuración Básica"
otherSettings: "Configuración avanzada"
openInWindow: "Abrir en una ventana"
profile: "Perfil"
timeline: "Linea de tiempo"
noAccountDescription: "Este usuario no tiene una descripción"
@ -40,6 +43,7 @@ deleteAndEditConfirm: "¿Quieres borrar y editar este nota? Las reacciones, reno
addToList: "Agregar a lista"
sendMessage: "Énviar mensaje"
copyUsername: "Copiar nombre de usuario"
searchUser: "Búsqueda de usuarios"
reply: "Responder"
loadMore: "Ver más"
youGotNewFollower: "te ha seguido"
@ -66,8 +70,11 @@ followers: "Seguidores"
followsYou: "Te sigue"
createList: "Crear lista"
manageLists: "Administrar listas"
error: "Ocurrió un problema"
error: "Error"
somethingHappened: "Ocurrió un error"
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"
privacy: "Privacidad"
makeFollowManuallyApprove: "Aprobar manualmente las solicitudes de seguimiento"
@ -104,6 +111,10 @@ unblockConfirm: "¿Quiere dejar de bloquear esta cuenta?"
suspendConfirm: "¿Quiere suspender esta cuenta?"
unsuspendConfirm: "¿Quiere dejar de suspender esta cuenta?"
selectList: "Seleccione una lista"
selectAntenna: "Seleccionar antena"
selectWidget: "Seleccionar widget"
editWidgets: "Editar widgets"
editWidgetsExit: "Terminar edición"
customEmojis: "Emojis personalizados"
emoji: "Emoji"
emojiName: "Nombre del emoji"
@ -175,7 +186,6 @@ processing: "Procesando"
preview: "Vista previa"
default: "Predeterminado"
noCustomEmojis: "No hay emojis personalizados"
customEmojisOfRemote: "Emojis remotos"
noJobs: "No hay trabajos"
federating: "Federando"
blocked: "Bloqueando"
@ -204,6 +214,7 @@ imageUrl: "URL de la imágen"
remove: "Borrar"
removed: "Borrado"
removeAreYouSure: "¿Desea borrar \"{x}\"?"
deleteAreYouSure: "¿Desea borrar \"{x}\"?"
saved: "Guardado"
messaging: "Chat"
upload: "Subir"
@ -262,6 +273,7 @@ rename: "Renombrar"
avatar: "Avatar"
banner: "Banner"
nsfw: "Marcado como sensible"
whenServerDisconnected: "Cuando se pierda la conexión con el servidor"
disconnectedFromServer: "Desconectado del servidor"
reload: "Recargar"
doNothing: "No hacer nada"
@ -302,6 +314,7 @@ bannerUrl: "URL de la imagen del banner"
basicInfo: "Información básica"
pinnedUsers: "Usuarios fijados"
pinnedUsersDescription: "Describir los usuarios que quiere fijar en la página \"Descubrir\" separados por una linea nueva"
pinnedNotes: "Nota fijada"
hcaptcha: "hCaptcha"
enableHcaptcha: "Habilitar hCaptcha"
hcaptchaSiteKey: "Clave del sitio"
@ -342,13 +355,6 @@ popularTags: "Etiquetas populares"
userList: "Lista"
about: "Información"
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"
token: "Token"
twoStepAuthentication: "Autenticación de dos factores"
@ -362,9 +368,6 @@ unregister: "Cancelar registro"
passwordLessLogin: "Iniciar sesión sin contraseña"
resetPassword: "Resetear contraseña"
newPasswordIs: "La nueva contraseña es \"{password}\""
autoReloadWhenDisconnected: "Recargar automáticamente cuando el servidor está desconectado"
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"
share: "Compartir"
notFound: "No se encuentra"
@ -402,6 +405,7 @@ noMessagesYet: "Aún no hay chat"
newMessageExists: "Tienes un mensaje nuevo"
onlyOneFileCanBeAttached: "Solo se puede añadir un archivo al mensaje"
signinRequired: "Iniciar sesión"
invitations: "Invitar"
invitationCode: "Código de invitación"
checking: "Comprobando"
available: "Disponible"
@ -443,7 +447,7 @@ total: "Total"
weekOverWeekChanges: "Dif semanal"
dayOverDayChanges: "Dif diaria"
appearance: "Apariencia"
clinetSettings: "Ajustes del cliente"
clientSettings: "Configuración del cliente"
accountSettings: "Ajustes de cuenta"
promotion: "Promovido"
promote: "Promover"
@ -466,6 +470,7 @@ objectStorageUseSSL: "Usar SSL"
objectStorageUseSSLDesc: "Desactive esto si no va a usar HTTPS para la conexión API"
objectStorageUseProxy: "Conectarse a través de Proxy"
objectStorageUseProxyDesc: "Desactive esto si no va a usar Proxy para la conexión de Almacenamiento de objetos"
objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir "
serverLogs: "Registros del servidor"
deleteAll: "Eliminar todos"
showFixedPostForm: "Mostrar el formulario de las entradas encima de la línea de tiempo"
@ -473,6 +478,8 @@ newNoteRecived: "Tienes una nota nuevo"
sounds: "Sonidos"
listen: "Escuchar"
none: "Ninguna"
showInPage: "Mostrar en la página"
popout: "Popout"
volume: "Volumen"
details: "Detalles"
chooseEmoji: "Elije un emoji"
@ -515,7 +522,6 @@ enableInfiniteScroll: "Activar scroll infinito"
visibility: "Visibilidad"
poll: "Encuesta"
useCw: "Esconder contenidos"
fixedWidgetsPosition: "Fijar la posición de los widgets"
enablePlayer: "Abrir reproductor"
disablePlayer: "Cerrar reproductor"
expandTweet: "Expandir tweet"
@ -529,17 +535,21 @@ pluginInstallWarn: "Por favor no instale plugins que no son de confianza"
deck: "Deck"
undeck: "Quitar deck"
useBlurEffectForModal: "Usar efecto borroso en modales"
useFullReactionPicker: "Reacción"
width: "Ancho"
height: "Altura"
generateAccessToken: "Generar token de acceso"
permission: "Permisos"
enableAll: "Activar todo"
disableAll: "Desactivar todo"
tokenRequested: "Permiso de acceso a la cuenta"
pluginTokenRequestedDescription: "Este plugin podrá usar los permisos descritos aquí"
notificationType: "Tipo de notificación"
edit: "Editar"
useStarForReactionFallback: "En caso de que los emojis de reacciones no sean claros, usar en su lugar una estrella"
emailConfig: "Configuración del servidor de correos"
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"
email: "Correo electrónico"
smtpConfig: "Configuración del servidor SMTP"
smtpHost: "Host"
smtpPort: "Puerto"
@ -549,6 +559,128 @@ emptyToDisableSmtpAuth: "Deje el nombre del usuario y la contraseña en blanco p
smtpSecure: "Usar SSL/TLS implícito en la conexión SMTP"
smtpSecureInfo: "Apagar cuando se use STARTTLS"
testEmail: "Prueba de envío"
wordMute: "Silenciar palabras"
userSaysSomething: "{name} dijo algo"
makeActive: "Activar"
display: "Apariencia"
copy: "Copiar"
metrics: "Métricas"
overview: "Resumen"
logs: "Registros"
delayed: "atrasado"
database: "Base de datos"
channel: "Canal"
create: "Crear"
notificationSetting: "Ajustes de Notificaciones"
notificationSettingDesc: "Por favor elija el tipo de notificación a mostrar"
useGlobalSetting: "Usar ajustes globales"
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"
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"
public: "Público"
_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:
reload: "Recargar automáticamente"
dialog: "Mostrar diálogo de advertencia"
quiet: "Advertencia discreta"
_channel:
create: "Crear canal"
edit: "Editar canal"
setBanner: "Elegir banner"
removeBanner: "Borrar banner"
featured: "Tendencias"
owned: "Dueño"
following: "Siguiendo"
usersCount: "{n} participantes"
notesCount: "{n} notas"
_sidebar:
full: "Completo"
icon: "Avatar"
hide: "Ocultar"
_wordMute:
muteWords: "Palabras que silenciar"
muteWordsDescription: "Separar con espacios indica una declaracion And, separar con lineas nuevas indica una declaracion Or。"
muteWordsDescription2: "Encerrar las palabras clave entre numerales para usar expresiones regulares"
softDescription: "Ocultar en la linea de tiempo las notas que cumplen las condiciones"
hardDescription: "Evitar que se agreguen a la linea de tiempo las notas que cumplen las condiciones. Las notas no agregadas seguirán quitadas aunque cambien las condiciones."
soft: "Suave"
hard: "Duro"
mutedNotes: "Notas silenciadas"
_theme:
explore: "Explorar temas"
install: "Instalar tema"
@ -627,6 +759,7 @@ _sfx:
chat: "Chat"
chatBg: "Chat (Fondo)"
antenna: "Antena receptora"
channel: "Notificaciones del canal"
_ago:
unknown: "Desconocido"
future: "Futuro"
@ -702,6 +835,8 @@ _permissions:
"write:page-likes": "Administrar páginas que te gustan"
"read:user-groups": "Ver grupos de usuarios"
"write:user-groups": "Administrar grupos de usuarios"
"read:channels": "Ver canal"
"write:channels": "Modificar canal"
_auth:
shareAccess: "¿Desea permitir el acceso a la cuenta \"{name}\"?"
shareAccessAsk: "¿Está seguro de que desea autorizar esta aplicación para acceder a su cuenta?"
@ -735,6 +870,7 @@ _widgets:
photos: "Fotos"
digitalClock: "Reloj digital"
federation: "Federación"
postForm: "Formulario"
_cw:
hide: "Ocultar"
show: "Ver más"
@ -776,6 +912,7 @@ _visibility:
_postForm:
replyPlaceholder: "Responder a esta nota"
quotePlaceholder: "Citar esta nota"
channelPlaceholder: "Postear en el canal"
_placeholders:
a: "¿Qué haces?"
b: "¿Te pasó algo?"
@ -788,7 +925,6 @@ _profile:
username: "Nombre de usuario"
description: "Descripción"
youCanIncludeHashtags: "Puedes añadir hashtags"
metadata: "Información adicional"
metadataLabel: "Etiqueta"
metadataContent: "Contenido"
_exportOrImport:
@ -908,6 +1044,7 @@ _pages:
my: "Mis páginas"
liked: "Páginas que me gustan"
inspector: "Inspector"
contents: "Contenido"
content: "Bloque de página"
variables: "Variables"
title: "Título"
@ -1188,10 +1325,29 @@ _notification:
youReceivedFollowRequest: "Has mandado una solicitud de seguimiento"
yourFollowRequestAccepted: "Tu solicitud de seguimiento fue aceptada"
youWereInvitedToGroup: "Invitado al grupo"
_types:
all: "Todo"
follow: "Siguiendo"
mention: "Menciones"
reply: "Respuestas"
renote: "Renotar"
quote: "Citar"
reaction: "Reacción"
pollVote: "Votado en la encuesta"
receiveFollowRequest: "Recibió una solicitud de seguimiento"
followRequestAccepted: "El seguimiento fue aceptado"
groupInvited: "Invitado al grupo"
app: "Notificaciones desde aplicaciones"
_deck:
alwaysShowMainColumn: "Siempre mostrar la columna principal"
columnAlign: "Alinear columnas"
addColumn: "Agregar columna"
swapLeft: "Mover a la izquierda"
swapRight: "Mover a la derecha"
swapUp: "Mover arriba"
swapDown: "Mover abajo"
stackLeft: "Apilar a la izquierda"
popRight: "Sacar a la derecha"
_columns:
widgets: "Widgets"
notifications: "Notificaciones"

View File

@ -16,6 +16,9 @@ noNotes: "Aucune note"
noNotifications: "Aucune notification"
instance: "Instance"
settings: "Paramètres"
basicSettings: "Paramètres basiques"
otherSettings: "Autres paramètres"
openInWindow: "Ouvrir dans une nouvelle fenêtre"
profile: "Profil"
timeline: "Fil"
noAccountDescription: "Lutilisateur·rice na pas encore renseigné de biographie de présentation sur son profil."
@ -40,6 +43,7 @@ deleteAndEditConfirm: "Êtes-vous sûr·e de vouloir supprimer cette note et la
addToList: "Ajouter à une liste"
sendMessage: "Envoyer un message"
copyUsername: "Copier le nom dutilisateur·rice"
searchUser: "Chercher un·e utilisateur·rice"
reply: "Répondre"
loadMore: "Afficher plus …"
youGotNewFollower: "Vous suit"
@ -66,8 +70,10 @@ followers: "Abonné·e·s"
followsYou: "Vous suit"
createList: "Créer une liste"
manageLists: "Gérer les listes"
error: "Une erreur est survenue"
error: "Erreur"
somethingHappened: "Une erreur est survenue"
retry: "Réessayer"
pageLoadError: "Le chargement de la page a échoué"
enterListName: "Nom de la liste"
privacy: "Confidentialité"
makeFollowManuallyApprove: "Accepter manuellement les demandes dabonnement"
@ -104,6 +110,10 @@ unblockConfirm: "Êtes-vous sûr·e de vouloir débloquer ce compte ?"
suspendConfirm: "Êtes-vous sûr·e de vouloir suspendre ce compte ?"
unsuspendConfirm: "Êtes-vous sûr·e de vouloir annuler la suspension de ce compte ?"
selectList: "Sélectionner une liste"
selectAntenna: "Sélectionner une antenne"
selectWidget: "Sélectionner un widget"
editWidgets: "Modifier les widgets"
editWidgetsExit: "Fait"
customEmojis: "Émojis personnalisés"
emoji: "Émoji"
emojiName: "Nom de lémoji"
@ -175,7 +185,6 @@ processing: "Traitement en cours"
preview: "Prévisualisation"
default: "Par défaut"
noCustomEmojis: "Il n'y a pas démoji"
customEmojisOfRemote: "Émojis provenant des autres instances"
noJobs: "Il ny a aucune tâche planifiée"
federating: "En cours de fédération"
blocked: "Bloqué·e"
@ -204,6 +213,7 @@ imageUrl: "URL de limage"
remove: "Supprimer"
removed: "Supprimé"
removeAreYouSure: "Supprimer «{x}» ?"
deleteAreYouSure: "Supprimer «{x}» ?"
saved: "Enregistré"
messaging: "Discuter"
upload: "Téléverser"
@ -262,6 +272,7 @@ rename: "Renommer"
avatar: "Avatar"
banner: "Bannière"
nsfw: "Contenu sensible"
whenServerDisconnected: "Lorsque la connexion au serveur est perdue"
disconnectedFromServer: "Déconnecté·e du serveur"
reload: "Rafraîchir"
doNothing: "Ignorer"
@ -302,6 +313,7 @@ bannerUrl: "URL de limage de la bannière"
basicInfo: "Informations basiques"
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."
pinnedNotes: "Note épinglée"
hcaptcha: "hCaptcha"
enableHcaptcha: "Activer hCaptcha"
hcaptchaSiteKey: "Clé du site"
@ -342,13 +354,6 @@ popularTags: "Mots-clés populaires"
userList: "Listes"
about: "Informations"
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"
token: "Jeton"
twoStepAuthentication: "Authentification à deux facteurs"
@ -362,9 +367,6 @@ unregister: "Se désinscrire"
passwordLessLogin: "Connectez-vous sans mot de passe"
resetPassword: "Réinitialiser mot de passe"
newPasswordIs: "Votre nouveau mot de passe est \"{password}\""
autoReloadWhenDisconnected: "Rechargement automatique lorsque le serveur se déconnecte"
autoNoteWatch: "Surveiller les notes automatiquement"
autoNoteWatchDescription: "Soyez informé des notes auxquelles vous avez réagi ou répondu."
reduceUiAnimation: "Réduire les animations dans linterface"
share: "Partager"
notFound: "Non trouvé"
@ -402,6 +404,7 @@ noMessagesYet: "Pas encore discuté"
newMessageExists: "Vous avez un nouveau message"
onlyOneFileCanBeAttached: "Vous ne pouvez joindre quun seul fichier au message"
signinRequired: "Veuillez vous connecter"
invitations: "Inviter"
invitationCode: "Code dinvitation"
checking: "Vérification"
available: "Disponible"
@ -443,7 +446,7 @@ total: "Total"
weekOverWeekChanges: "Diff hebdo"
dayOverDayChanges: "Diff quotidien"
appearance: "Aspect"
clinetSettings: "Paramètres du client"
clientSettings: "Paramètres du client"
accountSettings: "Paramètres du compte"
promotion: "Promu"
promote: "Promouvoir"
@ -473,6 +476,7 @@ newNoteRecived: "Vous avez une nouvelle note"
sounds: "Sons"
listen: "Écouter"
none: "Rien"
popout: "Fenêtre contextuelle"
volume: "Volume"
details: "Détails"
chooseEmoji: "Choisissez un émoji"
@ -515,7 +519,6 @@ enableInfiniteScroll: "Activer le défilement infini"
visibility: "Visibilité"
poll: "Sondage"
useCw: "Masquer le contenu"
fixedWidgetsPosition: "Rendre la position du widget fixe"
enablePlayer: "Activer le lecteur vidéo"
disablePlayer: "Désactiver le lecteur vidéo"
expandTweet: "Étendre le tweet"
@ -526,9 +529,81 @@ leaveConfirm: "Vous avez des modifications non-sauvegardées. Voulez-vous les ig
manage: "Gestion"
plugins: "Extensions"
pluginInstallWarn: "Ninstallez que des extensions provenant de sources de confiance."
deck: "Deck"
undeck: "Quitter le deck"
useBlurEffectForModal: "Utiliser un effet de flou pour les modals"
width: "Largeur"
height: "Hauteur"
generateAccessToken: "Générer un jeton d'accès"
permission: "Autorisations "
enableAll: "Tout activer"
disableAll: "Tout désactiver"
tokenRequested: "Autoriser l'accès au compte"
pluginTokenRequestedDescription: "Ce plugin pourra utiliser les autorisations définies ici."
notificationType: "Type de notifications"
edit: "Editer"
useStarForReactionFallback: "Utiliser ★ comme alternative si lémoji de réaction est inconnu"
emailConfig: "Configuration du serveur email"
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 doubli."
smtpConfig: "Paramètres du serveur SMTP"
smtpHost: "Hôte"
smtpPort: "Port"
smtpUser: "Nom dutilisateur·rice"
smtpPass: "Mot de passe"
emptyToDisableSmtpAuth: "Laisser le nom dutilisateur et le mot de passe vides pour désactiver la vérification SMTP"
smtpSecure: "Utiliser SSL/TLS implicitement dans les connexions SMTP"
smtpSecureInfo: "Désactiver cette option lorsque STARTTLS est utilisé"
testEmail: "Tester la distribution de courriel"
wordMute: "Filtre de mots"
userSaysSomething: "{name} a dit quelque chose"
makeActive: "Activer"
display: "Affichage"
copy: "Copier"
metrics: "Métriques"
overview: "Aperçu"
logs: "Journaux"
delayed: "en retard"
database: "Base de données"
channel: "Canaux"
create: "Créer"
notificationSetting: "Paramètres des notifications "
notificationSettingDesc: "Sélectionnez le type de notification à afficher"
useGlobalSetting: "Utiliser paramètre général"
other: "Autre"
regenerateLoginToken: "Régénérer le jeton de connexion"
setMultipleBySeparatingWithSpace: "Vous pouvez définir plus dun, séparés par des espaces."
fileIdOrUrl: "ID du fichier ou URL"
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:
reload: "Rechargement automatique"
_channel:
create: "Créer un canal"
edit: "Éditer le canal"
removeBanner: "Supprimer la bannière"
featured: "Tendances"
usersCount: "{n} Participants"
notesCount: "{n} Notes"
_sidebar:
full: "Complet"
icon: "Avatar"
hide: "Masquer"
_wordMute:
muteWords: "Mot à mettre en sourdine"
muteWordsDescription: "Séparer avec des espaces pour la condition AND. Séparer avec un saut de ligne pour une condition OR."
mutedNotes: "Notes mises en sourdine"
_theme:
explore: "Explorer les thèmes"
install: "Installer un thème"
@ -539,6 +614,8 @@ _theme:
invalid: "Le format du thème n'est pas valide"
make: "Créer un thème"
base: "Base"
addConstant: "Ajouter une constante"
constant: "Constante"
defaultValue: "Valeur par défaut"
color: "Couleur"
key: "Clé "
@ -564,6 +641,7 @@ _theme:
renote: "Renote"
divider: "Séparateur"
infoWarnFg: "Texte davertissement"
cwBg: "Arrière-plan du CW"
badge: "Badge"
messageBg: "Arrière plan de la discussion"
_sfx:
@ -648,6 +726,8 @@ _permissions:
"write:page-likes": "Mettre à jour les favoris sur les Pages"
"read:user-groups": "Voir les groupes d'utilisateur·rice·s"
"write:user-groups": "Éditer les groupes des utilisateur·rice·s"
"read:channels": "Lire les canaux"
"write:channels": "Modifier les canaux"
_auth:
shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?"
shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre compte?"
@ -681,6 +761,7 @@ _widgets:
photos: "Photos"
digitalClock: "Horloge numérique"
federation: "Fédération"
postForm: "Formulaire à publier"
_cw:
hide: "Masquer"
show: "Afficher plus …"
@ -722,6 +803,7 @@ _visibility:
_postForm:
replyPlaceholder: "Répondre à cette note ..."
quotePlaceholder: "Citez cette note ..."
channelPlaceholder: "Publier vers le canal"
_placeholders:
a: "Quoi de neuf ?"
b: "Quoi de neuf ?"
@ -734,7 +816,6 @@ _profile:
username: "Nom dutilisateur·rice"
description: "À propos de moi"
youCanIncludeHashtags: "Vous pouvez également inclure des hashtags."
metadata: "Informations complémentaires"
metadataLabel: "Étiquette"
metadataContent: "Contenu"
_exportOrImport:
@ -854,6 +935,7 @@ _pages:
my: "Mes pages"
liked: "Pages favorites"
inspector: "Inspecteur"
contents: "Contenu"
content: "Bloc de page"
variables: "Variables"
title: "Titre"
@ -1134,10 +1216,23 @@ _notification:
youReceivedFollowRequest: "Vous avez reçu une demande dabonnement"
yourFollowRequestAccepted: "Votre demande dabonnement a été accepté"
youWereInvitedToGroup: "Invité au groupe"
_types:
all: "Toutes"
follow: "Abonnements"
mention: "Mentionner"
reply: "Réponses"
renote: "Renote"
quote: "Citer"
reaction: "Réactions"
groupInvited: "Invité aux groupes"
app: "Notifications provenant des apps"
_deck:
alwaysShowMainColumn: "Toujours afficher la colonne principale"
columnAlign: "Aligner les colonnes"
addColumn: "Ajouter une colonne"
swapLeft: "Déplacer à gauche"
swapRight: "Déplacer à droite"
stackLeft: "Empiler à gauche"
_columns:
widgets: "Widgets"
notifications: "Notifications"

View File

@ -15,17 +15,24 @@ const merge = (...args) => args.reduce((a, c) => ({
const languages = [
'ar-SA',
//'cs-CZ',
//'da-DK',
'cs-CZ',
'da-DK',
'de-DE',
'en-US',
'es-ES',
'fr-FR',
'ja-JP',
'ja-KS',
'kab-KAB',
'kn-IN',
'ko-KR',
//'nl-NL',
//'pl-PL',
'nl-NL',
'no-NO',
'pl-PL',
'pt-PT',
'ru-RU',
'ug-CN',
'uk-UA',
'zh-CN',
'zh-TW',
];

View File

@ -16,6 +16,9 @@ noNotes: "ノートはありません"
noNotifications: "通知はありません"
instance: "インスタンス"
settings: "設定"
basicSettings: "基本設定"
otherSettings: "その他の設定"
openInWindow: "ウィンドウで開く"
profile: "プロフィール"
timeline: "タイムライン"
noAccountDescription: "自己紹介はありません"
@ -40,6 +43,7 @@ deleteAndEditConfirm: "このノートを削除してもう一度編集します
addToList: "リストに追加"
sendMessage: "メッセージを送信"
copyUsername: "ユーザー名をコピー"
searchUser: "ユーザーを検索"
reply: "返信"
loadMore: "もっと見る"
youGotNewFollower: "フォローされました"
@ -66,8 +70,11 @@ followers: "フォロワー"
followsYou: "フォローされています"
createList: "リスト作成"
manageLists: "リストの管理"
error: "問題が発生しました"
error: "エラー"
somethingHappened: "問題が発生しました"
retry: "再試行"
pageLoadError: "ページの読み込みに失敗しました。"
pageLoadErrorDescription: "これは通常、ネットワークまたはブラウザキャッシュが原因です。キャッシュをクリアするか、しばらく待ってから再度試してください。"
enterListName: "リスト名を入力"
privacy: "プライバシー"
makeFollowManuallyApprove: "フォローを承認制にする"
@ -88,6 +95,7 @@ sensitive: "閲覧注意"
add: "追加"
reaction: "リアクション"
reactionSettingDescription: "リアクションピッカーに表示するリアクションを設定します。"
reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押して追加します。"
rememberNoteVisibility: "公開範囲を記憶する"
attachCancel: "添付取り消し"
markAsSensitive: "閲覧注意にする"
@ -106,6 +114,8 @@ unsuspendConfirm: "解凍しますか?"
selectList: "リストを選択"
selectAntenna: "アンテナを選択"
selectWidget: "ウィジェットを選択"
editWidgets: "ウィジェットを編集"
editWidgetsExit: "編集を終了"
customEmojis: "カスタム絵文字"
emoji: "絵文字"
emojiName: "絵文字名"
@ -115,7 +125,9 @@ settingGuide: "おすすめ設定"
cacheRemoteFiles: "リモートのファイルをキャッシュする"
cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。"
flagAsBot: "Botとして設定"
flagAsBotDescription: "このアカウントがプログラムによって運用される場合は、このフラグをオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったものになります。"
flagAsCat: "Catとして設定"
flagAsCatDescription: "このアカウントが猫であることを示す場合は、このフラグをオンにします。"
autoAcceptFollowed: "フォロー中ユーザーからのフォロリクを自動承認"
addAcount: "アカウント追加"
loginFailed: "ログインに失敗しました"
@ -177,7 +189,6 @@ processing: "処理中"
preview: "プレビュー"
default: "デフォルト"
noCustomEmojis: "絵文字はありません"
customEmojisOfRemote: "リモートの絵文字"
noJobs: "ジョブはありません"
federating: "連合中"
blocked: "ブロック中"
@ -206,6 +217,8 @@ imageUrl: "画像URL"
remove: "削除"
removed: "削除しました"
removeAreYouSure: "「{x}」を削除しますか?"
deleteAreYouSure: "「{x}」を削除しますか?"
resetAreYouSure: "リセットしますか?"
saved: "保存しました"
messaging: "チャット"
upload: "アップロード"
@ -264,6 +277,7 @@ rename: "名前を変更"
avatar: "アイコン"
banner: "バナー"
nsfw: "閲覧注意"
whenServerDisconnected: "サーバーとの接続が失われたとき"
disconnectedFromServer: "サーバーから切断されました"
reload: "リロード"
doNothing: "なにもしない"
@ -304,6 +318,10 @@ bannerUrl: "バナー画像のURL"
basicInfo: "基本情報"
pinnedUsers: "ピン留めユーザー"
pinnedUsersDescription: "「みつける」ページなどにピン留めしたいユーザーを改行で区切って記述します。"
pinnedPages: "ピン留めページ"
pinnedPagesDescription: "インスタンスのトップページにピン留めしたいページのパスを改行で区切って記述します。"
pinnedClipId: "ピン留めするクリップのID"
pinnedNotes: "ピン留めされたノート"
hcaptcha: "hCaptcha"
enableHcaptcha: "hCaptchaを有効にする"
hcaptchaSiteKey: "サイトキー"
@ -344,13 +362,6 @@ popularTags: "人気のタグ"
userList: "リスト"
about: "情報"
aboutMisskey: "Misskeyについて"
aboutMisskeyText: "Misskeyはsyuiloによって2014年から開発されている、オープンソースのソフトウェアです。"
misskeyMembers: "現在以下のメンバーによって開発・メンテナンスされています:"
misskeySource: "ソースコードはここで公開されています:"
misskeyTranslation: "Misskeyの翻訳にご協力をお願いします:"
misskeyDonate: "Misskeyに寄付をして開発をサポートできます:"
morePatrons: "他にも多くの方が支援してくれています。ありがとうございます🥰"
patrons: "支援者"
administrator: "管理者"
token: "トークン"
twoStepAuthentication: "二段階認証"
@ -364,9 +375,6 @@ unregister: "登録を解除"
passwordLessLogin: "パスワード無しログイン"
resetPassword: "パスワードをリセット"
newPasswordIs: "新しいパスワードは「{password}」です"
autoReloadWhenDisconnected: "サーバー切断時に自動リロード"
autoNoteWatch: "ノートの自動ウォッチ"
autoNoteWatchDescription: "あなたがリアクションしたり返信したりした他のユーザーのノートに関する通知を受け取るようにします。"
reduceUiAnimation: "UIのアニメーションを減らす"
share: "共有"
notFound: "見つかりません"
@ -404,6 +412,7 @@ noMessagesYet: "まだチャットはありません"
newMessageExists: "新しいメッセージがあります"
onlyOneFileCanBeAttached: "メッセージに添付できるファイルはひとつです"
signinRequired: "ログインしてください"
invitations: "招待"
invitationCode: "招待コード"
checking: "確認しています"
available: "利用できます"
@ -427,6 +436,7 @@ useOsNativeEmojis: "OSネイティブの絵文字を使用"
youHaveNoGroups: "グループがありません"
joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループを作成してください。"
noHistory: "履歴はありません"
signinHistory: "ログイン履歴"
disableAnimatedMfm: "動きのあるMFMを無効にする"
doing: "やっています"
category: "カテゴリ"
@ -445,7 +455,7 @@ total: "合計"
weekOverWeekChanges: "前週比"
dayOverDayChanges: "前日比"
appearance: "アピアランス"
clinetSettings: "クライアント設定"
clientSettings: "クライアント設定"
accountSettings: "アカウント設定"
promotion: "プロモーション"
promote: "プロモート"
@ -468,6 +478,7 @@ objectStorageUseSSL: "SSLを使用する"
objectStorageUseSSLDesc: "API接続にhttpsを使用しない場合はオフにしてください"
objectStorageUseProxy: "Proxyを利用する"
objectStorageUseProxyDesc: "API接続にproxyを利用しない場合はオフにしてください"
objectStorageSetPublicRead: "アップロード時に'public-read'を設定する"
serverLogs: "サーバーログ"
deleteAll: "全て削除"
showFixedPostForm: "タイムライン上部に投稿フォームを表示する"
@ -475,7 +486,10 @@ newNoteRecived: "新しいノートがあります"
sounds: "サウンド"
listen: "聴く"
none: "なし"
showInPage: "ページで表示"
popout: "ポップアウト"
volume: "音量"
masterVolume: "マスター音量"
details: "詳細"
chooseEmoji: "絵文字を選択"
unableToProcess: "操作を完了できません"
@ -517,7 +531,6 @@ enableInfiniteScroll: "自動でもっと見る"
visibility: "公開範囲"
poll: "アンケート"
useCw: "内容を隠す"
fixedWidgetsPosition: "ウィジェットの位置を固定する"
enablePlayer: "プレイヤーを開く"
disablePlayer: "プレイヤーを閉じる"
expandTweet: "ツイートを展開する"
@ -531,6 +544,12 @@ pluginInstallWarn: "信頼できないプラグインはインストールしな
deck: "デッキ"
undeck: "デッキ解除"
useBlurEffectForModal: "モーダルにぼかし効果を使用"
useFullReactionPicker: "フル機能リアクションピッカーを使用"
width: "幅"
height: "高さ"
large: "大"
medium: "中"
small: "小"
generateAccessToken: "アクセストークンの発行"
permission: "権限"
enableAll: "全て有効にする"
@ -543,7 +562,8 @@ useStarForReactionFallback: "リアクション絵文字が不明な場合、代
emailConfig: "メールサーバー設定"
enableEmail: "メール配信機能を有効化する"
emailConfigInfo: "メールアドレスの確認やパスワードリセットの際に使います"
email: "メールアドレス"
email: "メール"
emailAddress: "メールアドレス"
smtpConfig: "SMTP サーバーの設定"
smtpHost: "ホスト"
smtpPort: "ポート"
@ -553,6 +573,222 @@ emptyToDisableSmtpAuth: "ユーザー名とパスワードを空欄にするこ
smtpSecure: "SMTP 接続に暗黙的なSSL/TLSを使用する"
smtpSecureInfo: "STARTTLS使用時はオフにします。"
testEmail: "配信テスト"
wordMute: "ワードミュート"
userSaysSomething: "{name}が何かを言いました"
makeActive: "アクティブにする"
display: "表示"
copy: "コピー"
metrics: "メトリクス"
overview: "概要"
logs: "ログ"
delayed: "遅延"
database: "データベース"
channel: "チャンネル"
create: "作成"
notificationSetting: "通知設定"
notificationSettingDesc: "表示する通知の種別を選択してください。"
useGlobalSetting: "グローバル設定を使う"
useGlobalSettingDesc: "オンにすると、アカウントの通知設定が使用されます。オフにすると、個別に設定できるようになります。"
other: "その他"
regenerateLoginToken: "ログイントークンを再生成"
regenerateLoginTokenDescription: "ログインに使用される内部トークンを再生成します。通常この操作を行う必要はありません。再生成すると、全てのデバイスでログアウトされます。"
setMultipleBySeparatingWithSpace: "スペースで区切って複数設定できます。"
fileIdOrUrl: "ファイルIDまたはURL"
chatOpenBehavior: "チャットを開くときの動作"
behavior: "動作"
sample: "サンプル"
abuseReports: "通報"
reportAbuse: "通報"
reportAbuseOf: "{name}を通報する"
fillAbuseReportDescription: "通報理由の詳細を記入してください。対象のートがある場合はそのURLも記入してください。"
abuseReported: "内容が送信されました。ご報告ありがとうございました。"
send: "送信"
abuseMarkAsResolved: "対応済みにする"
openInNewTab: "新しいタブで開く"
openInSideView: "サイドビューで開く"
defaultNavigationBehaviour: "デフォルトのナビゲーション"
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: "開発者"
_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:
reload: "自動でリロード"
dialog: "ダイアログで警告"
quiet: "控えめに警告"
_channel:
create: "チャンネルを作成"
edit: "チャンネルを編集"
setBanner: "バナーを設定"
removeBanner: "バナーを削除"
featured: "トレンド"
owned: "管理中"
following: "フォロー中"
usersCount: "{n}人が参加中"
notesCount: "{n}投稿があります"
_sidebar:
full: "フル"
icon: "アイコン"
hide: "隠す"
_wordMute:
muteWords: "ミュートするワード"
muteWordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります。"
muteWordsDescription2: "キーワードをスラッシュで囲むと正規表現になります。"
softDescription: "指定した条件のノートをタイムラインから隠します。"
hardDescription: "指定した条件のノートをタイムラインに追加しないようにします。追加されなかったノートは、条件を変更しても除外されたままになります。"
soft: "ソフト"
hard: "ハード"
mutedNotes: "ミュートされたノート"
_theme:
explore: "テーマを探す"
@ -560,6 +796,8 @@ _theme:
manage: "テーマの管理"
code: "テーマコード"
installed: "{name}をインストールしました"
installedThemes: "インストールされたテーマ"
builtinThemes: "標準のテーマ"
alreadyInstalled: "そのテーマは既にインストールされています"
invalid: "テーマの形式が間違っています"
make: "テーマを作る"
@ -634,6 +872,9 @@ _sfx:
chat: "チャット"
chatBg: "チャット(バックグラウンド)"
antenna: "アンテナ受信"
channel: "チャンネル通知"
reversiPutBlack: "リバーシ: 黒が打ったとき"
reversiPutWhite: "リバーシ: 白が打ったとき"
_ago:
unknown: "謎"
@ -714,6 +955,8 @@ _permissions:
"write:page-likes": "ページのいいねを操作する"
"read:user-groups": "ユーザーグループを見る"
"write:user-groups": "ユーザーグループを操作する"
"read:channels": "チャンネルを見る"
"write:channels": "チャンネルを操作する"
_auth:
shareAccess: "「{name}」がアカウントにアクセスすることを許可しますか?"
@ -751,6 +994,7 @@ _widgets:
photos: "フォト"
digitalClock: "デジタル時計"
federation: "連合"
postForm: "投稿フォーム"
_cw:
hide: "隠す"
@ -796,6 +1040,7 @@ _visibility:
_postForm:
replyPlaceholder: "このノートに返信..."
quotePlaceholder: "このノートを引用..."
channelPlaceholder: "チャンネルに投稿..."
_placeholders:
a: "いまどうしてる?"
b: "何かありましたか?"
@ -809,9 +1054,13 @@ _profile:
username: "ユーザー名"
description: "自己紹介"
youCanIncludeHashtags: "ハッシュタグを含めることができます。"
metadata: "補足情報"
metadata: "追加情報"
metadataEdit: "追加情報を編集"
metadataDescription: "プロフィールに表として4つまでの追加情報を表示することができます。"
metadataLabel: "ラベル"
metadataContent: "内容"
changeAvatar: "アバター画像を変更"
changeBanner: "バナー画像を変更"
_exportOrImport:
allNotes: "全てのノート"
@ -924,6 +1173,7 @@ _pages:
created: "ページを作成しました"
updated: "ページを更新しました"
deleted: "ページを削除しました"
pageSetting: "ページ設定"
nameAlreadyExists: "指定されたページURLは既に存在しています"
invalidNameTitle: "不正なページURLです"
invalidNameText: "空白でないか確認してください"
@ -934,7 +1184,9 @@ _pages:
unlike: "いいね解除"
my: "自分のページ"
liked: "いいねしたページ"
featured: "人気"
inspector: "インスペクター"
contents: "コンテンツ"
content: "ページブロック"
variables: "変数"
title: "タイトル"
@ -995,6 +1247,12 @@ _pages:
width: "幅"
height: "高さ"
note: "ノート埋め込み"
_note:
id: "ートID"
idDescription: "ートURLをペーストして設定することもできます。"
detailed: "詳細な表示"
switch: "スイッチ"
_switch:
name: "変数名"
@ -1237,8 +1495,11 @@ _notification:
renote: "Renote"
quote: "引用"
reaction: "リアクション"
pollVote: "投票"
receiveFollowRequest: "フォローリクエスト"
pollVote: "アンケートに投票された"
receiveFollowRequest: "フォロー申請を受け取った"
followRequestAccepted: "フォローが受理された"
groupInvited: "グループに招待された"
app: "連携アプリからの通知"
_deck:
alwaysShowMainColumn: "常にメインカラムを表示"

View File

@ -1,12 +1,12 @@
---
_lang_: "日本語 (関西弁)"
introMisskey: "ようこそMisskeyは、オープンソースの分散型マイクロブログサービスやねん。\n「ート」を作成し、いま起こっとることを共有したり、あんたについて皆に発信しよう📡\n「リアクション」機能で、皆のートに素はよ反応を追加することもできます✌\n新しい世界を探検しよう🚀"
introMisskey: "ようこそMisskeyってのは、オープンソースの分散型マイクロブログサービスやねん。\n「ート」を作成し、いま起こっとることを共有したり、あんたんこととか皆に伝えていこう📡\n「リアクション」機能で、皆のートに素はよ反応を追加することもできるんやで✌\n新しい世界を探検してみらん?🚀"
monthAndDay: "{month}月 {day}日"
search: "探す"
notifications: "通知"
username: "ユーザー名"
password: "パスワード"
fetchingAsApObject: "連合に照会"
fetchingAsApObject: "今ちと連合に照会しとるで"
ok: "おっけー"
gotIt: "ほい"
cancel: "やめとくわ"
@ -16,35 +16,40 @@ noNotes: "ノートはあらへん"
noNotifications: "通知はあらへん"
instance: "インスタンス"
settings: "設定"
basicSettings: "基本設定"
otherSettings: "その他の設定"
openInWindow: "ウィンドウで開いてや"
profile: "プロフィール"
timeline: "タイムライン"
noAccountDescription: "自己紹介はあらへん"
login: "ログイン"
loggingIn: "ログインしとります"
loggingIn: "ログインしよるで"
logout: "ログアウト"
signup: "新規登録"
uploading: "アップロードしとります"
save: "保存"
uploading: "アップロードしよるで"
save: "とっとく"
users: "ユーザー"
addUser: "ユーザー増やす"
addUser: "ユーザーを追加や"
favorite: "お気に入り"
favorites: "お気に入り"
unfavorite: "お気に入りやめる"
pin: "ピン留め"
unpin: "ピン留めやめる"
unfavorite: "やっぱ気に入らん"
pin: "ピン留めしとく"
unpin: "やっぱピン留めせん"
copyContent: "内容をコピー"
copyLink: "リンクをコピー"
delete: "ほかす"
deleteAndEdit: "ほかして直す"
deleteAndEditConfirm: "このートをほかしてもっかい直すこのートへのリアクション、Remote、返信も全部消えんで"
deleteAndEditConfirm: "このートをほかしてもっかい直すこのートへのリアクション、Renote、返信も全部消えるんやけどそれでもええん?"
addToList: "リストに入れたる"
sendMessage: "メッセージを送る"
copyUsername: "ユーザー名をコピー"
searchUser: "ユーザーを検索"
reply: "返す"
loadMore: "もっとあるやろ!"
youGotNewFollower: "フォローされたで"
receiveFollowRequest: "フォローリクエストされたで"
followRequestAccepted: "フォローが承認されたで"
mention: "メンション"
mentions: "あんた宛て"
directNotes: "ダイレクト投稿"
importAndExport: "インポートとエクスポート"
@ -57,7 +62,7 @@ unfollowConfirm: "{name}のフォローを解除してもええんか?"
exportRequested: "エクスポートしてな、ってリクエストしたけど、これ多分めっちゃ時間かかるで。エクスポート終わったら「ドライブ」に突っ込んどくで。"
importRequested: "インポートしてな、ってリクエストしたけど、これ多分めっちゃ時間かかるで。"
lists: "リスト"
noLists: "リストあらへん"
noLists: "リストなんてあらへん"
note: "ノート"
notes: "ノート"
following: "フォロー"
@ -65,32 +70,35 @@ followers: "フォロワー"
followsYou: "フォローされとるで"
createList: "リスト作る"
manageLists: "リストの管理"
error: "問題が発生してん"
retry: "もっぺんやってみる"
error: "エラー"
somethingHappened: "なんかアカンことが起こったで"
retry: "もっぺんやる?"
pageLoadError: "ページの読み込みに失敗してしもうたで…"
pageLoadErrorDescription: "これは普通、ネットワークかブラウザキャッシュが原因やからね。キャッシュをクリアするか、もうちっとだけ待ってくれへんか?"
enterListName: "リスト名を入れてや"
privacy: "プライバシーってなんや?オカンの年齢か"
makeFollowManuallyApprove: "他人のフォローは許可してからや!"
privacy: "プライバシーってなんや?"
makeFollowManuallyApprove: "他人からのフォローは自分が決める"
defaultNoteVisibility: "もとからの公開範囲"
follow: "フォロー"
followRequest: "フォロー許してくれや!言うてみる"
followRequests: "フォロー許してくれや!"
followRequest: "フォローを頼む"
followRequests: "フォローを頼む"
unfollow: "フォローやめる"
followRequestPending: "フォロー許してくれるん待っとる"
enterEmoji: "絵文字を入れてや"
renote: "Renote"
unrenote: "Renoteやめる"
quote: "引用"
pinnedNote: "ピン留めされノート"
pinnedNote: "ピン留めされとるノート"
you: "あんた"
clickToShow: "押してみ、見せたるわ"
sensitive: "見たらあかんで"
clickToShow: "押したら見えるようになるで"
sensitive: "ちょっとアカンやつやで"
add: "増やす"
reaction: "リアクション"
reactionSettingDescription: "リアクションピッカーに出しとくリアクションを選んでや。"
rememberNoteVisibility: "公開範囲覚えといて"
attachCancel: "くっつけるのやめよか"
markAsSensitive: "ちょっと見せられへんわ"
unmarkAsSensitive: "別にええんじゃね?"
attachCancel: "やっぱ添付やめてくれん?"
markAsSensitive: "ちょっとこれはアカン"
unmarkAsSensitive: "そこまでアカンことないやろ"
enterFileName: "ファイル名を入れてや"
mute: "ミュート"
unmute: "ミュートやめたる"
@ -98,30 +106,35 @@ block: "ブロック"
unblock: "ブロックやめたる"
suspend: "凍結"
unsuspend: "溶かす"
blockConfirm: "ブロックしてしもうてええか?"
unblockConfirm: "ブロックすんのやめるけどええか?"
blockConfirm: "ブロックしてええか?"
unblockConfirm: "ブロックやめたるってほんまか?"
suspendConfirm: "凍結してしもうてええか?"
unsuspendConfirm: "解凍するけどええか?"
selectList: "リストを選ぶ"
selectAntenna: "アンテナを選ぶ"
selectWidget: "ウィジェットを選ぶ"
editWidgets: "ウィジェットをいじる"
editWidgetsExit: "編集終ったで"
customEmojis: "カスタム絵文字"
emoji: "絵文字"
emojiName: "絵文字名"
emojiUrl: "絵文字画像URL"
addEmoji: "絵文字を追加"
settingGuide: "ええ感じの設定"
cacheRemoteFiles: "リモートのファイルをキャッシュする"
cacheRemoteFilesDescription: "この設定をチャラにすると、リモートファイルをキャッシュせず直リンクするようになります。サーバーのストレージ節約できますが、サムネイルが生成されへんので通信量が増加します。"
flagAsBot: "Botやでと言っとく"
flagAsCat: "Catやでと言っとく"
autoAcceptFollowed: "フォローしとるユーザーからのフォロリクは全部勝手にええでって言うで"
cacheRemoteFilesDescription: "この設定を切っとくと、リモートファイルをキャッシュせず直リンクするようになってしまうんやで? サーバーのストレージ節約できるんやけど、かわりにサムネイルが作られんくなるから通信量が増えるで?"
flagAsBot: "Botやで"
flagAsCat: "Catやで"
autoAcceptFollowed: "フォローしとるユーザーからのフォロリクエストには勝手に許可しとくで。"
addAcount: "アカウント追加"
loginFailed: "ログインに失敗して"
loginFailed: "ログインに失敗してしもうた…"
showOnRemote: "リモートで見る"
general: "全般"
wallpaper: "壁紙"
setWallpaper: "壁紙を設定"
removeWallpaper: "壁紙ほかす"
removeWallpaper: "壁紙を削除"
searchWith: "検索: {q}"
youHaveNoLists: "リストあらへん"
youHaveNoLists: "リストあらへんで?"
followConfirm: "{name}をフォローしてええか?"
proxyAccount: "プロキシアカウント"
proxyAccountDescription: "プロキシアカウントは、代わりにフォローしてくれるアカウントや。例えば、551に豚まんが無いときやったり、ユーザーがリモートユーザーをアカウントに入れたとき、リストに入れられたユーザーが誰からもフォローされてないと寂しいやん。寂しいし、アクティビティも配達されへんから、プロキシアカウントがフォローしてくれるで。ええやつやん…"
@ -131,7 +144,7 @@ recipient: "宛先"
annotation: "注釈"
federation: "連合"
instances: "インスタンス"
registeredAt: "一見さんになった日"
registeredAt: "初観測"
latestRequestSentAt: "ちょっと前のリクエスト送信"
latestRequestReceivedAt: "ちょっと前のリクエスト受信"
latestStatus: "ちょっと前のステータス"
@ -173,7 +186,6 @@ processing: "処理しとる"
preview: "プレビュー"
default: "デフォルト"
noCustomEmojis: "絵文字はあらへん"
customEmojisOfRemote: "リモートの絵文字"
noJobs: "ジョブはあらへん"
federating: "連合しとる"
blocked: "ブロックしとる"
@ -202,6 +214,7 @@ imageUrl: "画像URL"
remove: "ほかす"
removed: "削除したで!"
removeAreYouSure: "「{x}」はなおしてしもてええか?"
deleteAreYouSure: "「{x}」はなおしてしもてええか?"
saved: "保存したで!"
messaging: "チャット"
upload: "アップロード"
@ -259,7 +272,8 @@ copyUrl: "URLをコピー"
rename: "名前を変えるで"
avatar: "アイコン"
banner: "バナー"
nsfw: "見たらあかんで"
nsfw: "ちょっとアカンやつやで"
whenServerDisconnected: "サーバーとの接続が失くなってしもうたとき"
disconnectedFromServer: "サーバーが機嫌悪いねん"
reload: "リロード"
doNothing: "何もせんとく"
@ -295,7 +309,20 @@ proxyRemoteFilesDescription: "この設定を入れると、保存しとらん
driveCapacityPerLocalAccount: "ローカルユーザーひとりあたりのドライブ容量"
driveCapacityPerRemoteAccount: "リモートユーザーひとりあたりのドライブ容量"
inMb: "メガバイト単位"
iconUrl: "アイコン画像のURL"
bannerUrl: "バナー画像のURL"
basicInfo: "基本情報"
pinnedUsers: "ピン留めしたユーザー"
pinnedUsersDescription: "「みつける」ページとかにピン留めしたいユーザーをここに書けばええんやで。他ん人との名前は改行で区切ればええんやで。"
pinnedNotes: "ピン留めされとるノート"
hcaptcha: "hCaptchaキャプチャ"
enableHcaptcha: "hCaptchaキャプチャをつけとく"
hcaptchaSiteKey: "サイトキー"
hcaptchaSecretKey: "シークレットキー"
recaptcha: "reCAPTCHA"
enableRecaptcha: "reCAPTCHAリキャプチャを有効にする"
recaptchaSiteKey: "サイトキー"
recaptchaSecretKey: "シークレットキー"
avoidMultiCaptchaConfirm: "ぎょうさんのCaptchaをつこてしまうと、仲良うせんことがあるんや。他のCaptchaをなおしとこか別にキャンセルしてもろうたらCaptchaは消されへんで済むけど知らんで。"
antennas: "アンテナ"
manageAntennas: "アンテナいじる"
@ -328,13 +355,6 @@ popularTags: "人気のタグ"
userList: "リスト"
about: "情報"
aboutMisskey: "Misskeyってなんや"
aboutMisskeyText: "Misskeyはsyuiloいう人が2014年からずっと作ってはる、オープンソースなソフトウェアや。"
misskeyMembers: "今んとここんだけのメンバーが作って、メンテナンスしてはる:"
misskeySource: "ソースコードはこっから見てな:"
misskeyTranslation: "Misskeyの翻訳手伝うてくれへん:"
misskeyDonate: "Misskeyにお金あげたら開発のサポートになるで:"
morePatrons: "他にもぎょうさんの人からサポートしてもろてんねん。ほんまおおきに🥰"
patrons: "支援者"
administrator: "管理者"
token: "トークン"
twoStepAuthentication: "二段階認証"
@ -348,16 +368,58 @@ unregister: "登録やめる"
passwordLessLogin: "パスワード無くてもログインできるようにする"
resetPassword: "パスワードをリセット"
newPasswordIs: "今度のパスワードは「{password}」や"
autoReloadWhenDisconnected: "サーバーが調子悪いときには自動でリロードしたる"
reduceUiAnimation: "UIの動きやアニメーションを減らしてくれや。"
share: "わけわけ"
notFound: "見つからへんね"
notFoundDescription: "指定されたURLに該当するページはあらへんやった。"
uploadFolder: "とりあえずここへアップロード"
cacheClear: "キャッシュをほかす"
markAsReadAllNotifications: "通知はもう全て読んだわっ"
markAsReadAllUnreadNotes: "投稿は全て読んだわっ"
markAsReadAllTalkMessages: "チャットはもうぜんぶ読んだわっ"
help: "ヘルプ"
inputMessageHere: "ここにメッセージ書いてや"
close: "さいなら"
group: "グループ"
groups: "グループ"
createGroup: "グループを作るで"
ownedGroups: "所有しとるグループ"
joinedGroups: "参加しとるグループ"
invites: "来てや"
groupName: "グループ名"
members: "メンバー"
transfer: "譲渡"
messagingWithUser: "ユーザーとチャット"
messagingWithGroup: "グループでチャット"
title: "タイトル"
text: "テキスト"
enable: "有効にするで"
next: "次"
retype: "もっかい入力"
noteOf: "{user}のノート"
inviteToGroup: "グループに招く"
maxNoteTextLength: "ノートの文字数制限"
quoteAttached: "引用付いとるで"
quoteQuestion: "引用として添付してもええか?"
noMessagesYet: "まだチャットはあらへんで"
newMessageExists: "新しいメッセージがきたで"
onlyOneFileCanBeAttached: "すまん、メッセージに添付できるファイルはひとつだけなんや。"
invitations: "来てや"
invitationCode: "招待コード"
checking: "確認しとるで"
smtpHost: "ホスト"
smtpUser: "ユーザー名"
smtpPass: "パスワード"
_mfm:
mention: "メンション"
quote: "引用"
emoji: "カスタム絵文字"
search: "探す"
_sidebar:
icon: "アイコン"
_theme:
keys:
mention: "メンション"
renote: "Renote"
_sfx:
note: "ノート"
@ -439,6 +501,12 @@ _pages:
array: "リスト"
_notification:
youWereFollowed: "フォローされたで"
_types:
follow: "フォロー"
mention: "メンション"
renote: "Renote"
quote: "引用"
reaction: "リアクション"
_deck:
_columns:
notifications: "通知"

View File

@ -35,6 +35,9 @@ userList: "Tibdarin"
uiLanguage: "Tutlayt n wegrudem"
smtpUser: "Isem n umseqdac"
smtpPass: "Awal uffir"
_mfm:
mention: "Bder"
search: "Nadi"
_theme:
keys:
mention: "Bder"
@ -54,6 +57,7 @@ _exportOrImport:
blockingList: "Seḥbes"
userLists: "Tibdarin"
_pages:
contents: "Agbur"
font: "Tasefsit"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
@ -82,6 +86,9 @@ _pages:
array: "Tibdarin"
_notification:
youWereFollowed: "Yeṭṭafaṛ-ik·em-id"
_types:
follow: "Ig ṭṭafaṛ"
mention: "Bder"
_deck:
_columns:
notifications: "Ilɣuyen"

View File

@ -56,6 +56,8 @@ instances: "ನಿದರ್ಶನ"
remove: "ಅಳಿಸು"
smtpUser: "ಬಳಕೆಹೆಸರು"
smtpPass: "ಗುಪ್ತಪದ"
_mfm:
search: "ಹುಡುಕು"
_sfx:
notification: "ಅಧಿಸೂಚನೆಗಳು"
_widgets:

View File

@ -16,6 +16,9 @@ noNotes: "노트가 없습니다"
noNotifications: "표시할 알림이 없습니다"
instance: "인스턴스"
settings: "설정"
basicSettings: "기본 설정"
otherSettings: "기타 설정"
openInWindow: "창으로 열기"
profile: "프로필"
timeline: "타임라인"
noAccountDescription: "자기소개가 없습니다"
@ -40,6 +43,7 @@ deleteAndEditConfirm: "이 노트를 삭제한 뒤 다시 편집하시겠습니
addToList: "리스트에 추가"
sendMessage: "메시지 보내기"
copyUsername: "유저명 복사"
searchUser: "사용자 검색"
reply: "답글"
loadMore: "더 보기"
youGotNewFollower: "새로운 팔로워가 있습니다"
@ -66,8 +70,11 @@ followers: "팔로워"
followsYou: "당신을 팔로우합니다"
createList: "리스트 만들기"
manageLists: "리스트 관리"
error: "오류가 발생했습니다"
error: "오류"
somethingHappened: "오류가 발생했습니다"
retry: "다시 시도"
pageLoadError: "페이지를 불러오지 못했습니다."
pageLoadErrorDescription: "네트워크 연결 또는 브라우저 캐시로 인해 발생했을 가능성이 높습니다. 캐시를 삭제하거나, 잠시 후 다시 시도해 주세요."
enterListName: "리스트 이름을 입력"
privacy: "프라이버시"
makeFollowManuallyApprove: "팔로우를 수동으로 승인"
@ -104,6 +111,10 @@ unblockConfirm: "이 계정의 차단을 해제하시겠습니까?"
suspendConfirm: "이 계정을 정지하시겠습니까?"
unsuspendConfirm: "이 계정의 정지를 해제하시겠습니까?"
selectList: "리스트 선택"
selectAntenna: "안테나 선택"
selectWidget: "위젯 선택"
editWidgets: "위젯 편집"
editWidgetsExit: "편집 종료"
customEmojis: "커스텀 이모지"
emoji: "이모지"
emojiName: "이모지 이름"
@ -113,7 +124,9 @@ settingGuide: "추천 설정"
cacheRemoteFiles: "리모트 파일을 캐시"
cacheRemoteFilesDescription: "이 설정을 해지하면 리모트 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다."
flagAsBot: "나는 봇입니다"
flagAsBotDescription: "이 계정을 자동화된 수단으로 운용할 경우에 활성화해 주세요. 이 플래그를 활성화하면, 다른 봇이 이를 참고하여 봇 끼리의 무한 연쇄 반응을 회피하거나, 이 계정의 시스템 상에서의 취급이 Bot 운영에 최적화되는 등의 변화가 생깁니다."
flagAsCat: "나는 고양이다냥"
flagAsCatDescription: "이 계정이 고양이라면 활성화 해주세요."
autoAcceptFollowed: "팔로우 중인 유저로부터의 팔로우 요청을 자동 수락"
addAcount: "계정 추가"
loginFailed: "로그인에 실패했습니다"
@ -175,7 +188,6 @@ processing: "처리중"
preview: "미리보기"
default: "기본값"
noCustomEmojis: "이모지가 없습니다"
customEmojisOfRemote: "다른 인스턴스들의 이모지"
noJobs: "작업이 없습니다"
federating: "연합 중"
blocked: "차단됨"
@ -204,6 +216,8 @@ imageUrl: "이미지 URL"
remove: "삭제"
removed: "삭제하였습니다"
removeAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
deleteAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
resetAreYouSure: "초기화 하시겠습니까?"
saved: "저장하였습니다"
messaging: "대화"
upload: "업로드"
@ -262,6 +276,7 @@ rename: "이름 변경"
avatar: "아바타"
banner: "배너"
nsfw: "열람주의"
whenServerDisconnected: "서버와의 접속이 끊겼을 때"
disconnectedFromServer: "서버와의 연결이 끊어졌습니다"
reload: "새로고침"
doNothing: "무시하기"
@ -302,6 +317,9 @@ bannerUrl: "배너 이미지 URL"
basicInfo: "기본 정보"
pinnedUsers: "고정된 유저"
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다."
pinnedPages: "고정한 페이지"
pinnedPagesDescription: "인스턴스의 대문에 고정하고 싶은 페이지의 경로를 한 줄에 하나씩 적습니다."
pinnedNotes: "고정해놓은 노트"
hcaptcha: "hCaptcha"
enableHcaptcha: "hCaptcha 활성화"
hcaptchaSiteKey: "사이트 키"
@ -342,13 +360,6 @@ popularTags: "인기 태그"
userList: "리스트"
about: "정보"
aboutMisskey: "Misskey에 대하여"
aboutMisskeyText: "Misskey는 syuilo에 의해서 2014년부터 개발되어 온 오픈소스 소프트웨어 입니다."
misskeyMembers: "현재는 아래 멤버들에 의해 개발 및 유지보수 되고 있습니다:"
misskeySource: "소스코드는 여기에 공개되어 있습니다:"
misskeyTranslation: "Misskey의 번역을 함께해 주시길 부탁드립니다:"
misskeyDonate: "Misskey에 기부하심으로써 개발에 도움을 주실 수 있습니다:"
morePatrons: "이 외에도 다른 많은 분들이 도움을 주시고 계십니다. 감사합니다🥰"
patrons: "후원자들"
administrator: "관리자"
token: "토큰"
twoStepAuthentication: "2단계 인증"
@ -362,9 +373,6 @@ unregister: "등록 해제"
passwordLessLogin: "비밀번호 없이 로그인"
resetPassword: "비밀번호 재설정"
newPasswordIs: "새로운 비밀번호는 \"{password}\" 입니다"
autoReloadWhenDisconnected: "서버와의 연결이 끊기면 자동 새로고침"
autoNoteWatch: "노트를 자동으로 지켜보기"
autoNoteWatchDescription: "리액션하거나 답글을 남긴 다른 유저의 노트에 대한 알림을 받습니다."
reduceUiAnimation: "UI의 애니메이션을 줄이기"
share: "공유"
notFound: "찾을 수 없습니다"
@ -402,6 +410,7 @@ noMessagesYet: "아직 대화가 없습니다"
newMessageExists: "새 메시지가 있습니다"
onlyOneFileCanBeAttached: "메시지에 첨부할 수 있는 파일은 하나까지입니다"
signinRequired: "로그인 해주세요"
invitations: "초대"
invitationCode: "초대 코드"
checking: "확인하는 중입니다"
available: "사용 가능합니다"
@ -425,6 +434,7 @@ useOsNativeEmojis: "OS 기본 이모지를 사용"
youHaveNoGroups: "그룹이 없습니다"
joinOrCreateGroup: "다른 그룹의 초대를 받거나, 직접 새 그룹을 만들어 보세요."
noHistory: "기록이 없습니다"
signinHistory: "로그인 기록"
disableAnimatedMfm: "움직임이 있는 MFM을 비활성화"
doing: "잠시만요"
category: "카테고리"
@ -432,7 +442,7 @@ tags: "태그"
docSource: "이 문서의 소스"
createAccount: "계정 만들기"
existingAcount: "기존 계정"
regenerate: "다시 생성"
regenerate: "생성"
fontSize: "글자 크기"
noFollowRequests: "처리되지 않은 팔로우 요청이 없습니다"
openImageInNewTab: "새 탭에서 이미지 열기"
@ -442,7 +452,7 @@ remote: "리모트"
total: "합계"
weekOverWeekChanges: "지난주보다"
dayOverDayChanges: "어제보다"
clinetSettings: "클라이언트 설정"
clientSettings: "클라이언트 설정"
accountSettings: "계정 설정"
promotion: "프로모션"
promote: "프로모션하기"
@ -465,6 +475,7 @@ objectStorageUseSSL: "SSL 사용"
objectStorageUseSSLDesc: "API 호출시 HTTPS 를 사용하지 않는 경우 OFF 로 설정해 주세요"
objectStorageUseProxy: "연결에 프록시를 사용"
objectStorageUseProxyDesc: "오브젝트 스토리지 API 호출시 프록시를 사용하지 않는 경우 OFF 로 설정해 주세요"
objectStorageSetPublicRead: "업로드할 때 'public-read'를 설정하기"
serverLogs: "서버 로그"
deleteAll: "모두 삭제"
showFixedPostForm: "타임라인 상단에 글 작성란을 표시"
@ -472,7 +483,10 @@ newNoteRecived: "새 노트가 있습니다"
sounds: "소리"
listen: "듣기"
none: "없음"
showInPage: "페이지로 보기"
popout: "새 창으로 열기"
volume: "음량"
masterVolume: "마스터 볼륨"
details: "자세히"
chooseEmoji: "이모지 선택"
unableToProcess: "작업을 완료할 수 없습니다"
@ -514,7 +528,6 @@ enableInfiniteScroll: "자동으로 좀 더 보기"
visibility: "공개 범위"
poll: "투표"
useCw: "내용 숨기기"
fixedWidgetsPosition: "위젯의 위치 고정"
enablePlayer: "플레이어 열기"
disablePlayer: "플레이어 닫기"
expandTweet: "트윗 확장하기"
@ -527,9 +540,157 @@ plugins: "플러그인"
pluginInstallWarn: "신뢰할 수 없는 플러그인은 설치하지 마십시오."
deck: "덱"
undeck: "덱 해제"
width: "폭"
height: "높이"
large: "크게"
medium: "보통"
small: "작게"
generateAccessToken: "액세스 토큰 생성"
permission: "권한"
enableAll: "전체 선택"
disableAll: "전체 해제"
tokenRequested: "계정 접근 허용"
pluginTokenRequestedDescription: "이 플러그인은 여기서 설정한 권한을 사용할 수 있게 됩니다."
notificationType: "알림 유형"
edit: "편집"
useStarForReactionFallback: "알 수 없는 리액션 이모지 대신 ★ 사용"
emailConfig: "메일 서버 설정"
emailConfigInfo: "가입 시 메일 주소 확인이나 비밀번호 초기화 시에 사용합니다."
smtpConfig: "SMTP 서버 설정"
smtpHost: "호스트"
smtpPort: "포트"
smtpUser: "유저명"
smtpPass: "비밀번호"
emptyToDisableSmtpAuth: "SMTP 인증을 사용하지 않으려면 공란으로 비워둡니다."
smtpSecure: "SMTP 연결에 Implicit SSL/TTS 사용"
smtpSecureInfo: "STARTTLS 사용 시에는 해제합니다."
testEmail: "이메일 전송 테스트"
wordMute: "단어 뮤트"
makeActive: "활성화"
display: "표시"
copy: "복사"
overview: "요약"
logs: "로그"
delayed: "지연"
database: "데이터베이스"
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:
create: "채널 생성"
setBanner: "배너 설정"
removeBanner: "배너 삭제"
featured: "트렌드"
following: "팔로잉"
usersCount: "{n}명 참여 중"
notesCount: "{n}노트"
_sidebar:
icon: "아이콘"
hide: "숨기기"
_wordMute:
muteWords: "뮤트할 단어"
muteWordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으로 구분하는 경우 OR로 지정됩니다。"
mutedNotes: "뮤트된 노트"
_theme:
explore: "테마 찾아보기"
install: "테마 설치"
@ -550,7 +711,10 @@ _theme:
func: "함수"
funcKind: "함수 종류"
argument: "매개변수"
importInfo: "여기에 테마 코드를 붙여 넣어 에디터로 불러올 수 있습니다."
keys:
link: "링크"
hashtag: "해시태그"
mention: "멘션"
renote: "Renote"
divider: "구분선"
@ -669,6 +833,7 @@ _widgets:
photos: "사진"
digitalClock: "디지털 시계"
federation: "연합"
postForm: "글 입력란"
_cw:
hide: "숨기기"
show: "더 보기"
@ -722,7 +887,6 @@ _profile:
username: "유저명"
description: "자기소개"
youCanIncludeHashtags: "해시 태그를 포함할 수 있습니다."
metadata: "추가 정보"
metadataLabel: "라벨"
metadataContent: "내용"
_exportOrImport:
@ -842,6 +1006,7 @@ _pages:
my: "내 페이지"
liked: "좋아요한 페이지"
inspector: "인스펙터"
contents: "콘텐츠"
content: "페이지 블록"
variables: "변수"
title: "제목"
@ -895,6 +1060,8 @@ _pages:
id: "캔버스 ID"
width: "폭"
height: "높이"
_note:
detailed: "세부 정보 보기"
switch: "스위치"
_switch:
name: "변수명"
@ -1120,7 +1287,22 @@ _notification:
youReceivedFollowRequest: "새로운 팔로우 요청이 있습니다"
yourFollowRequestAccepted: "팔로우 요청이 수락되었습니다"
youWereInvitedToGroup: "그룹에 초대되었습니다"
_types:
follow: "팔로잉"
mention: "멘션"
renote: "Renote"
quote: "인용"
reaction: "리액션"
_deck:
alwaysShowMainColumn: "메인 칼럼 항상 표시"
columnAlign: "칼럼 정렬"
addColumn: "칼럼 추가"
swapLeft: "왼쪽으로 이동"
swapRight: "오른쪽으로 이동"
swapUp: "위로 이동"
swapDown: "아래로 이동"
stackLeft: "왼쪽에 쌓기"
popRight: "오른쪽으로 빼기"
_columns:
widgets: "위젯"
notifications: "알림"

View File

@ -1,2 +1,23 @@
---
_lang_: "język polski"
search: "Szukaj"
notifications: "Powiadomienia"
username: "Nazwa użytkownika"
password: "Hasło"
ok: "OK"
gotIt: "Rozumiem!"
cancel: "Anuluj"
enterUsername: "Wprowadź nazwę użytkownika"
smtpUser: "Nazwa użytkownika"
smtpPass: "Hasło"
_mfm:
search: "Szukaj"
_sfx:
notification: "Powiadomienia"
_widgets:
notifications: "Powiadomienia"
_profile:
username: "Nazwa użytkownika"
_deck:
_columns:
notifications: "Powiadomienia"

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,5 @@
---
_lang_: "ياپونچە"
search: "ئىزدەش"
_mfm:
search: "ئىزدەش"

867
locales/uk-UA.yml Normal file
View File

@ -0,0 +1,867 @@
---
_lang_: "Українська"
introMisskey: "Ласкаво просимо! Misskey - децентралізована служба мікроблогів з відкритим кодом.\nСтворюйте \"нотатки\", щоб поділитися тим, що відбувається, і розповісти всім про себе 📡\nЗа допомогою \"реакцій\" ви також можете швидко висловити свої почуття щодо нотаток інших 👍\nДавайте досліджувати новий світ 🚀"
monthAndDay: "{month}/{day}"
search: "Пошук"
notifications: "Сповіщення"
username: "Ім'я користувача"
password: "Пароль"
fetchingAsApObject: "Отримуємо з федіверсу..."
ok: "OK"
gotIt: "Зрозуміло!"
cancel: "Скасувати"
enterUsername: "Введіть ім'я користувача"
renotedBy: "Поширено {user}"
noNotes: "Немає нотаток"
noNotifications: "Немає сповіщень"
instance: "Інстанс"
settings: "Налаштування"
basicSettings: "Основні налаштування"
otherSettings: "Інші налаштування"
openInWindow: "Відкрити у вікні"
profile: "Профіль"
timeline: "Стрічка"
noAccountDescription: "Цей користувач ще нічого не написав про себе"
login: "Увійти"
loggingIn: "Здійснюємо вхід..."
logout: "Вийти"
signup: "Реєстрація"
uploading: "Завантаження..."
save: "Зберегти"
users: "Користувачі"
addUser: "Додати користувача"
favorite: "Обране"
favorites: "Обране"
unfavorite: "Видалити з обраного"
pin: "Закріпити"
unpin: "Відкріпити"
copyContent: "Скопіювати контент"
copyLink: "Скопіювати посилання"
delete: "Видалити"
deleteAndEdit: "Видалити й редагувати"
deleteAndEditConfirm: "Ви впевнені, що хочете видалити цю нотатку та відредагувати її? Ви втратите всі реакції, поширення та відповіді на неї."
addToList: "Додати до списку"
sendMessage: "Надіслати повідомлення"
copyUsername: "Скопіювати ім’я користувача"
searchUser: "Пошук користувачів"
reply: "Відповісти"
loadMore: "Показати більше"
youGotNewFollower: "Новий підписник"
receiveFollowRequest: "Отримано запит на підписку"
followRequestAccepted: "Підписка прийнята"
mention: "Згадка"
mentions: "Згадки"
directNotes: "Прямі повідомлення"
importAndExport: "Імпорт та експорт"
import: "Імпорт"
export: "Експорт"
files: "Файли"
download: "Завантажити"
driveFileDeleteConfirm: "Ви впевнені, що хочете видалити файл {name}? Нотатки із цим файлом також буде видалено."
unfollowConfirm: "Ви впевнені, що хочете відписатися від {name}?"
exportRequested: "Ви запросили експорт. Це може зайняти деякий час. Після завершення експорту отриманий файл буде додано на диск."
importRequested: "Ви запросили імпорт. Це може зайняти деякий час."
lists: "Списки"
noLists: "Немає списків"
note: "Нотатки"
notes: "Нотатки"
following: "Підписки"
followers: "Підписники"
followsYou: "Підписаний(-а) на вас"
createList: "Створити список"
manageLists: "Управління списками"
error: "Помилка"
somethingHappened: "Щось пішло не так"
retry: "Спробувати знову"
pageLoadError: "Помилка при завантаженні сторінки"
pageLoadErrorDescription: "Зазвичай це пов’язано з помилками мережі або кешем браузера. Очистіть кеш або почекайте трохи й спробуйте ще раз."
enterListName: "Введіть назву списку"
privacy: "Приватність"
makeFollowManuallyApprove: "Підтверджувати підписників уручну"
defaultNoteVisibility: "Видимість за замовчуванням"
follow: "Підписка"
followRequest: "Запит на підписку"
followRequests: "Запити на підписку"
unfollow: "Відписатися"
followRequestPending: "Очікуючі запити на підписку"
enterEmoji: "Введіть емодзі"
renote: "Поширити"
unrenote: "Відміна поширення"
quote: "Цитата"
pinnedNote: "Закріплена нотатка"
you: "Ви"
clickToShow: "Натисніть для перегляду"
sensitive: "NSFW"
add: "Додати"
reaction: "Реакції"
reactionSettingDescription: "Виберіть свої улюблені реакції, які хочете закріпити в селекторі реакцій."
rememberNoteVisibility: "Пам’ятати параметри видимісті"
attachCancel: "Видалити вкладення"
markAsSensitive: "Позначити як NSFW"
unmarkAsSensitive: "Зняти позначку NSFW"
enterFileName: "Введіть ім'я файлу"
mute: "Ігнорувати"
unmute: "Показувати"
block: "Заблокувати"
unblock: "Розблокувати"
suspend: "Призупинити"
unsuspend: "Відновити"
blockConfirm: "Ви впевнені, що хочете заблокувати цей акаунт?"
unblockConfirm: "Ви впевнені, що хочете розблокувати цей акаунт?"
suspendConfirm: "Ви впевнені, що хочете призупинити цей акаунт?"
unsuspendConfirm: "Ви впевнені, що хочете відновити цей акаунт?"
selectList: "Виберіть список"
selectAntenna: "Виберіть антену"
selectWidget: "Виберіть віджет"
editWidgets: "Редагувати віджети"
editWidgetsExit: "Готово"
customEmojis: "Кастомні емоджі"
emoji: "Емоджі"
emojiName: "Назва емоджі"
emojiUrl: "URL емодзі"
addEmoji: "Додати емодзі"
settingGuide: "Рекомендована конфігурація"
cacheRemoteFiles: "Кешувати дані з інших інстансів"
cacheRemoteFilesDescription: "Якщо кешування вимкнено, віддалені файли завантажуються безпосередньо з віддаленого інстансу. Це зменшує використання сховища, але збільшує трафік, оскільки не генеруются ескізи."
flagAsBot: "Акаунт бота"
flagAsCat: "Акаунт кота"
autoAcceptFollowed: "Автоматично приймати запити на підписку від користувачів, на яких ви підписані"
addAcount: "Додати акаунт"
loginFailed: "Не вдалося увійти"
showOnRemote: "Переглянути в оригіналі"
general: "Загальне"
wallpaper: "Шпалери"
setWallpaper: "Встановити шпалери"
removeWallpaper: "Прибрати шпалери"
searchWith: "Пошук: {q}"
youHaveNoLists: "У вас немає списків"
followConfirm: "Підписатися на {name}?"
proxyAccount: "Проксі-акаунт"
host: "Хост"
selectUser: "Виберіть користувача"
recipient: "Кому"
annotation: "Коментар"
federation: "Федіверс"
instances: "Інстанс"
registeredAt: "Приєднався(-лась)"
latestRequestSentAt: "Останній запит надіслано"
latestRequestReceivedAt: "Останній запит прийнято"
latestStatus: "Останній статус"
storageUsage: "Використання простіру"
charts: "Графіки"
perHour: "Щогодинно"
perDay: "Щоденно"
stopActivityDelivery: "Припинити розсилання активності"
blockThisInstance: "Заблокувати цей інстанс"
operations: "Операції"
software: "Програмне забезпечення"
version: "Версія"
metadata: "Метадані"
withNFiles: "файли: {n}"
monitor: "Монітор"
jobQueue: "Черга завдань"
cpuAndMemory: "ЦП та пам'ять"
network: "Мережа"
disk: "Диск"
instanceInfo: "Про цей інстанс"
statistics: "Статистика"
clearQueue: "Очистити чергу"
clearQueueConfirmTitle: "Ви впевнені, що хочете очистити чергу?"
clearQueueConfirmText: "Будь-які невідправлені нотатки, що залишилися в черзі, не будуть передані. Зазвичай ця операція НЕ потрібна."
clearCachedFiles: "Очистити кеш"
clearCachedFilesConfirm: "Ви впевнені, що хочете видалити всі кешовані файли?"
blockedInstances: "Заблоковані інстанси"
blockedInstancesDescription: "Вкажіть інстанси, які потрібно заблокувати. Перелічені інстанси більше не зможуть спілкуватися з цим інстансом."
muteAndBlock: "Ігнор і блокування"
mutedUsers: "Ігноровані користувачі"
blockedUsers: "Заблоковані користувачі"
noUsers: "Немає користувачів"
editProfile: "Редагувати профіль"
noteDeleteConfirm: "Ви дійсно хочете видалити цю нотатку?"
pinLimitExceeded: "Більше нотаток не можна закріпити"
intro: "Встановлення Misskey завершено! Будь ласка, створіть акаунт адміністратора."
done: "Готово"
processing: "Обробка"
preview: "Передогляд"
default: "За умовчанням"
noCustomEmojis: "Немає кастомних емоджі"
noJobs: "Немає завдань"
federating: "Федерується"
blocked: "Заблоковано"
suspended: "Призупинено"
all: "Всі"
subscribing: "Підписка"
publishing: "Публікація"
notResponding: "Не відповідає"
instanceFollowing: "Підписка на інстанс"
instanceFollowers: "Підписники інстансу"
instanceUsers: "Користувачі цього інстансу"
changePassword: "Змінити пароль"
security: "Безпека"
retypedNotMatch: "Введені дані не збігаються."
currentPassword: "Поточний пароль"
newPassword: "Новий пароль"
newPasswordRetype: "Новий пароль (повторно)"
attachFile: "Вкласти файл"
more: "Бiльше!"
featured: "Популярні"
usernameOrUserId: "Ім'я або ID користувача"
noSuchUser: "Користувача не знайдено"
lookup: "Пошук"
announcements: "Оголошення"
imageUrl: "URL зображення"
remove: "Видалити"
removed: "Видалено"
removeAreYouSure: "Ви впевнені, що хочете видалити \"{x}\"?"
deleteAreYouSure: "Ви впевнені, що хочете видалити \"{x}\"?"
resetAreYouSure: "Дійсно ресет?"
saved: "Збережено"
messaging: "Чати"
upload: "Завантажити"
fromDrive: "З диска"
fromUrl: "З URL"
uploadFromUrl: "Завантажити з URL"
uploadFromUrlDescription: "URL-адреса файлу для завантаження"
uploadFromUrlRequested: "Обрано завантаження"
uploadFromUrlMayTakeTime: "Завантаження може зайняти деякий час."
explore: "Огляд"
games: "Ігри Misskey"
messageRead: "Прочитано"
noMoreHistory: "Подальшої історії немає"
startMessaging: "Розпочати діалог"
nUsersRead: "Прочитали {n}"
agreeTo: "Я погоджуюсь з {0}"
tos: "Умови використання"
start: "Розпочати"
home: "Домівка"
remoteUserCaution: "Інформація може бути неповною, оскільки це віддалений користувач."
activity: "Активність"
images: "Зображення"
birthday: "День народження"
yearsOld: "{age} років"
registeredDate: "Приєднався(-лась)"
location: "Локація"
theme: "Тема"
themeForLightMode: "Світла тема"
themeForDarkMode: "Темна тема"
light: "Світла"
dark: "Темна"
lightThemes: "Світлі теми"
darkThemes: "Темні теми"
syncDeviceDarkMode: "Синхронізувати темний режим із налаштуваннями вашого пристрою"
drive: "Диск"
fileName: "Ім'я файлу"
selectFile: "Вибрати файл"
selectFiles: "Вибрати файли"
selectFolder: "Вибрати теку"
selectFolders: "Вибрати теки"
renameFile: "Перейменувати файл"
folderName: "Ім'я теки"
createFolder: "Створити теку"
renameFolder: "Перейменувати теку"
deleteFolder: "Видалити теку"
addFile: "Додати файл"
emptyDrive: "Диск порожній"
emptyFolder: "Тека порожня"
unableToDelete: "Видалення неможливе"
inputNewFileName: "Введіть ім'я нового файлу"
inputNewFolderName: "Введіть ім'я нової теки"
circularReferenceFolder: "Ви намагаєтесь перемістити папку в її підпапку."
hasChildFilesOrFolders: "Ця тека не порожня і не може бути видалена"
copyUrl: "Копіювати URL"
rename: "Перейменувати"
avatar: "Аватар"
banner: "Банер"
nsfw: "NSFW"
whenServerDisconnected: "Коли зв’язок із сервером втрачено"
disconnectedFromServer: "Зв’язок із сервером було перервано"
reload: "Оновити"
doNothing: "Нічого не робити"
reloadConfirm: "Перезавантажити стрічку?"
watch: "Стежити"
unwatch: "Не стежити"
accept: "Прийняти"
reject: "Відхилити"
instanceName: "Назва інстансу"
instanceDescription: "Описання інстансу"
maintainerName: "Ім'я адміністратора"
maintainerEmail: "Email адміністратора"
tosUrl: "URL умов використання"
thisYear: "Рік"
thisMonth: "Місяць"
today: "День"
dayX: "{day}"
monthX: "{month}"
yearX: "{year}"
pages: "Сторінки"
integration: "Інтеграція"
connectSerice: "Під’єднати"
disconnectSerice: "Відключитися"
enableLocalTimeline: "Увімкнути локальну стрічку"
enableGlobalTimeline: "Увімкнути глобальну стрічку"
disablingTimelinesInfo: "Адміністратори та модератори завжди мають доступ до всіх стрічок, навіть якщо вони вимкнуті."
registration: "Реєстрація"
enableRegistration: "Дозволити реєстрацію"
invite: "Запросити"
proxyRemoteFiles: "Проксувати файли з інших інстансів"
driveCapacityPerLocalAccount: "Об'єм диска на одного локального користувача"
driveCapacityPerRemoteAccount: "Об'єм диска на одного віддаленого користувача"
inMb: "В мегабайтах"
iconUrl: "URL аватара"
bannerUrl: "URL банера"
basicInfo: "Основна інформація"
pinnedUsers: "Закріплені користувачі"
pinnedPages: "Закріплені сторінки"
pinnedPagesDescription: "Введіть шляхи сторінок, які ви бажаєте закріпити на головній сторінці цього інстанса, розділені новими рядками."
pinnedNotes: "Закріплена нотатка"
hcaptcha: "hCaptcha"
enableHcaptcha: "Увімкнути hCaptcha"
hcaptchaSiteKey: "Ключ сайту"
hcaptchaSecretKey: "Секретний ключ"
recaptcha: "reCAPTCHA"
enableRecaptcha: "Увімкнути reCAPTCHA"
recaptchaSiteKey: "Ключ сайту"
recaptchaSecretKey: "Секретний ключ"
antennas: "Антени"
manageAntennas: "Налаштування антен"
name: "Ім'я"
antennaSource: "Джерело антени"
antennaKeywords: "Ключові слова антени"
antennaExcludeKeywords: "Винятки"
notifyAntenna: "Сповіщати про нові нотатки"
withFileAntenna: "Тільки нотатки з вкладеними файлами"
serviceworker: "ServiceWorker"
enableServiceworker: "Ввімкнути ServiceWorker"
caseSensitive: "З урахуванням регістру"
withReplies: "Включаючи відповіді"
connectedTo: "Наступні акаунти під'єднані"
notesAndReplies: "Нотатки та відповіді"
withFiles: "Файли"
silence: "Заглушити"
silenceConfirm: "Ви впевнені, що хочете заглушити цього користувача?"
unsilence: "Не глушити"
unsilenceConfirm: "Ви впевнені, що хочете скасувати глушіння цього користувача?"
popularUsers: "Популярні користувачі"
recentlyUpdatedUsers: "Нещодавно активні користувачі"
recentlyRegisteredUsers: "Нещодавно зареєстровані користувачі"
recentlyDiscoveredUsers: "Нещодавно знайдені користувачі"
exploreUsersCount: "{count} користувачів"
exploreFediverse: "Огляд федіверсу"
popularTags: "Популярні теги"
userList: "Списки"
about: "Інформація"
aboutMisskey: "Про Misskey"
administrator: "Адмін"
token: "Токен"
twoStepAuthentication: "Двохфакторна аутентифікація"
moderator: "Модератор"
nUsersMentioned: "Згадали: {n}"
securityKey: "Ключ захисту"
securityKeyName: "Назва ключа"
registerSecurityKey: "Зареєструвати ключ захисту"
lastUsed: "Востаннє використано"
unregister: "Скасувати реєстрацію"
passwordLessLogin: "Налаштувати вхід без пароля"
resetPassword: "Скинути пароль"
newPasswordIs: "Новий пароль: {password}"
reduceUiAnimation: "Зменшити анімацію інтерфейсу"
share: "Поділитись"
notFound: "Не знайдено"
notFoundDescription: "Сторінка за вказаною адресою не знайдена."
uploadFolder: "Місце для завантаження за замовчуванням"
cacheClear: "Очистити кеш"
markAsReadAllNotifications: "Позначити всі сповіщення як прочитані"
markAsReadAllUnreadNotes: "Позначити всі нотатки як прочитані"
markAsReadAllTalkMessages: "Позначити всі повідомлення як прочитані"
help: "Допомога"
inputMessageHere: "Введіть повідомлення тут"
close: "Закрити"
group: "Група"
groups: "Групи"
createGroup: "Створити групу"
ownedGroups: "Власні групи"
joinedGroups: "Членство в групах"
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: "Доступно"
unavailable: "Недоступно"
usernameInvalidFormat: "літери, цифри та _ є прийнятними"
tooShort: "Занадто короткий"
tooLong: "Занадто довгий"
weakPassword: "Слабкий пароль"
normalPassword: "Достатній пароль"
strongPassword: "Міцний пароль"
passwordMatched: "Все вірно"
passwordNotMatched: "Паролі не співпадають"
signinWith: "Увійти за допомогою {x}"
signinFailed: "Не вдалося увійти. Введені ім’я користувача або пароль неправильнi."
tapSecurityKey: "Торкніться ключа безпеки"
or: "або"
uiLanguage: "Мова інтерфейсу"
groupInvited: "Запрошення до групи"
aboutX: "Про {x}"
useOsNativeEmojis: "Використовувати емодзі ОС"
youHaveNoGroups: "Немає груп"
joinOrCreateGroup: "Отримуйте запрошення до груп або створюйте свої власні групи."
noHistory: "Історія порожня"
signinHistory: "Історія входів"
disableAnimatedMfm: "Відключити анімації MFM"
doing: "Виконується"
category: "Категорія"
tags: "Теги"
docSource: "Джерело цього документа"
createAccount: "Створити акаунт"
existingAcount: "Існуючий акаунт"
regenerate: "Оновити"
fontSize: "Розмір шрифту"
noFollowRequests: "Немає запитів на підписку"
openImageInNewTab: "Відкрити зображення в новій вкладці"
dashboard: "Панель приладів"
local: "Локальні"
remote: "Віддалені"
total: "Всього"
weekOverWeekChanges: "Тиждень"
dayOverDayChanges: "Доба"
appearance: "Вигляд"
clientSettings: "Налаштування клієнта"
accountSettings: "Налаштування акаунта"
promotion: "Виділене"
promote: "Виділити"
numberOfDays: "Кількість днів"
hideThisNote: "Сховати цю нотатку"
showFeaturedNotesInTimeline: "Показувати популярні нотатки у стрічці"
objectStorage: "Object Storage"
useObjectStorage: "Використовувати object storage"
objectStorageBaseUrl: "Base URL"
objectStorageBucket: "Bucket"
objectStoragePrefix: "Prefix"
objectStorageEndpoint: "Endpoint"
objectStorageRegion: "Region"
objectStorageUseSSL: "Використовувати SSL"
objectStorageUseProxy: "Використовувати Proxy"
serverLogs: "Журнал сервера"
deleteAll: "Видалити все"
newNoteRecived: "Є нові нотатки"
sounds: "Звуки"
listen: "Слухати"
none: "Відсутній"
showInPage: "Показати на сторінці"
popout: "Від'єднати"
volume: "Гучність"
masterVolume: "Загальна гучність"
details: "Детальніше"
chooseEmoji: "Виберіть емодзі"
unableToProcess: "Не вдається завершити операцію"
recentUsed: "Нещодавні"
install: "Встановити"
uninstall: "Видалити"
installedApps: "Встановлені аплікації"
nothing: "Тут нічого немає"
installedDate: "Дата встановлення"
lastUsedDate: "Дата використання"
state: "Стан"
sort: "Сортування"
ascendingOrder: "За зростанням"
descendingOrder: "За спаданням"
scratchpad: "Чернетка"
scratchpadDescription: "Scratchpad надає середовище для експериментів з AiScript. Ви можете писати, виконувати його і тестувати взаємодію з Misskey."
output: "Вихід"
script: "Скрипт"
disablePagesScript: "Вимкнути AiScript на Сторінках"
updateRemoteUser: "Оновити інформацію про віддаленого користувача"
deleteAllFiles: "Видалити всі файли"
deleteAllFilesConfirm: "Ви дійсно хочете видалити всі файли?"
removeAllFollowing: "Скасувати всі підписки"
removeAllFollowingDescription: "Скасувати підписку на всі акаунти з {host}. Будь ласка, робіть це, якщо інстанс більше не існує."
sidebar: "Бокова панель"
divider: "Розділювач"
addItem: "Додати елемент"
rooms: "Кімнати"
relays: "Ретранслятори"
addRelay: "Додати ретранслятор"
inboxUrl: "Inbox URL"
addedRelays: "Додані ретранслятори"
serviceworkerInfo: "Повинен бути ввімкнений для push-сповіщень."
deletedNote: "Видалена нотатка"
enableInfiniteScroll: "Увімкнути нескінченну прокрутку"
visibility: "Видимість"
poll: "Опитування"
useCw: "Приховати вміст"
enablePlayer: "Відкрити відеоплеєр"
disablePlayer: "Закрити відеоплеєр"
expandTweet: "Розгорнути твіт"
themeEditor: "Редактор тем"
description: "Опис"
author: "Автор"
manage: "Управління"
plugins: "Плагіни"
deck: "Дек"
undeck: "Залишити Дек"
useBlurEffectForModal: "Ефект розмиття під модальними діалогами"
useFullReactionPicker: "Повнорозмірний селектор реакцій"
width: "Ширина"
height: "Висота"
large: "Крупний"
medium: "Середній"
small: "Маленький"
generateAccessToken: "Згенерувати токен доступу"
permission: "Права"
enableAll: "Увімкнути все"
disableAll: "Вимкнути все"
tokenRequested: "Надати доступ до акаунту"
notificationType: "Тип сповіщення"
edit: "Редагувати"
useStarForReactionFallback: "Використовувати ★ як запасний варіант, якщо емодзі реакції невідомий"
emailConfig: "Налаштування email сервера"
email: "E-mail"
emailAddress: "E-mail адреса"
smtpHost: "Хост"
smtpPort: "Порт"
smtpUser: "Ім'я користувача"
smtpPass: "Пароль"
testEmail: "Тестовий email"
wordMute: "Блокування слів"
makeActive: "Активувати"
display: "Відображення"
copy: "Скопіювати"
metrics: "Показники"
overview: "Огляд"
logs: "Журнал"
delayed: "Затримка"
database: "База даних"
channel: "Канали"
create: "Створити"
notificationSetting: "Параметри сповіщень"
notificationSettingDesc: "Виберіть типи сповіщень для відображення"
useGlobalSetting: "Застосувати глобальнi параметри"
other: "Інше"
regenerateLoginToken: "Оновити Login Token"
behavior: "Поведінка"
sample: "Приклад"
abuseReports: "Скарги"
reportAbuse: "Поскаржитись"
reportAbuseOf: "Поскаржитись на {name}"
send: "Відправити"
abuseMarkAsResolved: "Позначити скаргу як вирішену"
openInNewTab: "Відкрити в новій вкладці"
defaultNavigationBehaviour: "Поведінка навігації за замовчуванням"
editTheseSettingsMayBreakAccount: "Зміна цих параметрів може призвести до пошкодження вашого акаунта."
instanceTicker: "Мітка з назвою інстанса в нотатках"
waitingFor: "Чекаємо на {x}"
random: "Випадковий"
system: "Система"
switchUi: "Інтерфейс"
desktop: "Десктоп"
clip: "Добірка"
createNew: "Створити новий"
optional: "Необов'язково"
public: "Публічний"
i18nInfo: "Misskey перекладається на різні мови волонтерами. Ви можете допомогти: {link}"
manageAccessTokens: "Керування токенами доступу"
accountInfo: "Інформація про акаунт"
notesCount: "Кількість нотаток"
repliesCount: "Кількість надісланих відповідей"
renotesCount: "Кількість поширень"
repliedCount: "Кількість отриманих відповідей"
renotedCount: "Кількість отриманих поширень"
followingCount: "Кількість підписок"
followersCount: "Кількість підписників"
sentReactionsCount: "Кількість надісланих реакцій"
receivedReactionsCount: "Кількість отриманих реакцій"
pollVotesCount: "Кількість надісланих голосів"
pollVotedCount: "Кількість отриманих голосів"
yes: "Так"
no: "Ні"
driveFilesCount: "Кількість файлів на диску"
driveUsage: "Використання місця на диску"
noCrawle: "Заборонити індексацію"
noCrawleDescription: "Просити пошукові системи не індексувати ваш профіль, нотатки, сторінки тощо."
alwaysMarkSensitive: "Позначати NSFW за замовчуванням"
loadRawImages: "Відображати вкладені зображення повністю замість ескізів"
disableShowingAnimatedImages: "Не програвати анімовані зображення"
notSet: "Не налаштовано"
emailVerified: "Електронну пошту підтверджено."
noteFavoritesCount: "Кількість улюблених нотаток"
pageLikesCount: "Кількість отриманих вподобань сторінки"
pageLikedCount: "Кількість вподобаних сторінок"
reversiCount: "Кількість матчів \"Реверсі\""
contact: "Контакт"
useSystemFont: "Використовувати стандартний шрифт системи"
clips: "Добірка"
experimentalFeatures: "Експериментальні функції"
developer: "Розробник"
_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, яку можна використовувати в багатьох місцях. Тут ви можете переглянути приклади її синтаксису."
dummy: "Misskey розширює світ Федіверсу"
mention: "Згадка"
mentionDescription: "За допомогою знака \"@\" перед ім'ям можна згадати конкретного користувача."
hashtag: "Хештеґ"
hashtagDescription: "За допомогою знака \"решітка\" перед словом задається хештег."
url: "URL"
urlDescription: "Відображаються URL-адреси."
link: "Посилання"
linkDescription: "Окремі частини тексту можуть містити посилання"
bold: "Жирний шрифт"
boldDescription: "Виділяє літери, роблячи їх товще"
small: "Дрібний шрифт"
smallDescription: "Робить текст маленьким і тонким"
center: "По центру"
centerDescription: "Показує вміст у центрі"
inlineCode: "Код (у рядку)"
inlineCodeDescription: "Показує фрагмент тексту у рядку як програмний код"
blockCode: "Код (блок)"
blockCodeDescription: "Показує кілька рядків тексту як блок програмного кода"
inlineMath: "Формула (у рядку)"
inlineMathDescription: "Відображення математичних формул (KaTeX) у рядку"
blockMath: "Формули (блок)"
quote: "Цитата"
emoji: "Кастомні емоджі"
search: "Пошук"
searchDescription: "Відображає вікно пошуку з попередньо введеним текстом"
flipDescription: "Віддзеркалює вміст по горизонталі або вертикалі"
jelly: "Анімація (желе)"
jellyDescription: "Створює желеподібну анімацію"
tada: "Анімація (Тада!)"
tadaDescription: "Створює анімацію з відчуттям \"Тада!\""
jump: "Анімація (стрибки)"
jumpDescription: "Показує стрибаючу анімацію"
bounce: "Анімація (пружина)"
shake: "Анімація (Shake)"
twitch: "Анімація (Twitch)"
spin: "Анімація (Spin)"
_reversi:
reversi: "Реверсі"
gameSettings: "Налаштування гри"
chooseBoard: "Вибір дошки"
blackOrWhite: "Чорні / Білі"
blackIs: "{name} грає чорними"
rules: "Правила"
botSettings: "Параметри бота"
thisGameIsStartedSoon: "Гра розпочнеться через кілька секунд"
waitingForOther: "Чекаємо на хід суперника"
waitingForMe: "Чекаємо на ваш хід"
waitingBoth: "Приготуйтесь"
ready: "Готовність"
cancelReady: "Скасувати готовність"
opponentTurn: "Хід суперника"
myTurn: "Ваш хід"
turnOf: "Хід {name}"
pastTurnOf: "Хід {name}"
surrender: "Здатися"
drawn: "Нічия"
won: "Перемога {name}"
black: "Чорні"
white: "Білі"
total: "Всього"
turnCount: "Хід {count}"
myGames: "Мої ігри"
allGames: "Усі ігри"
ended: "Завершено"
_instanceTicker:
none: "Не відображати"
remote: "Відображати для віддалених користувачів"
always: "Відображати завжди"
_serverDisconnectedBehavior:
reload: "Автоматично перезавантажити"
dialog: "Показати діалогове вікно"
quiet: "Показати ненав’язливе попередження"
_channel:
create: "Створити канал"
edit: "Редагувати канал"
setBanner: "Встановити банер"
removeBanner: "Видалити банер"
featured: "Тренди"
usersCount: "{n} учасників"
notesCount: "{n} дописів"
_sidebar:
full: "Повна"
icon: "Аватар"
hide: "Сховати"
_wordMute:
soft: "М'яко"
hard: "Жорстко"
mutedNotes: "Заблоковані нотатки"
_theme:
keys:
accent: "Акцент"
bg: "Фон"
fg: "Текст"
focus: "Фокус"
indicator: "Індикатор"
panel: "Панель"
shadow: "Тінь"
header: "Заголовок"
navBg: "Фон бокової панелі"
navFg: "Текст бокової панелі"
navHoverFg: "Текст бокової панелі (під курсором)"
navActive: "Текст бокової панелі (активне)"
navIndicator: "Індикатор бокової панелі"
link: "Посилання"
hashtag: "Хештеґ"
mention: "Згадка"
mentionMe: "Згадки (мене)"
renote: "Поширити"
divider: "Розділювач"
_sfx:
note: "Нотатки"
notification: "Сповіщення"
chat: "Чати"
_ago:
unknown: "Невідомо"
future: "Майбутнє"
justNow: "Щойно"
secondsAgo: "{n}с тому"
minutesAgo: "{n}х тому"
hoursAgo: "{n}г тому"
daysAgo: "{n}д тому"
weeksAgo: "{n} тиж. тому"
monthsAgo: "{n} міс. тому"
yearsAgo: "{n} р. тому"
_time:
second: "с"
minute: "х"
hour: "г"
day: "д"
_tutorial:
title: "Як користуватись Misskey"
step1_1: "Ласкаво просимо!"
step1_3: "Наразі ваша стрічка порожня, оскільки ви ще не написали жодної нотатки і не підписані на інших."
step3_2: "Наступним кроком є написання нотатки. Це можна зробити, натиснувши зображення олівця на екрані."
_2fa:
registerKey: "Зареєструвати новий ключ безпеки"
_permissions:
"write:account": "Змінити дані акаунту"
"read:blocks": "Переглянути список заблокованих"
"write:blocks": "Редагувати список заблокованих"
"read:drive": "Переглянути вміст Диска"
_antennaSources:
homeTimeline: "Нотатки тих, на кого ви підписані"
_widgets:
notifications: "Сповіщення"
timeline: "Стрічка"
activity: "Активність"
federation: "Федіверс"
_cw:
show: "Показати більше"
_poll:
deadlineTime: "г"
_visibility:
home: "Домівка"
followers: "Підписники"
localOnly: "Лише локально"
_postForm:
replyPlaceholder: "Відповідь на цю нотатку..."
_profile:
name: "Ім'я"
username: "Ім'я користувача"
_exportOrImport:
followingList: "Підписки"
muteList: "Ігнорувати"
blockingList: "Заблокувати"
userLists: "Списки"
_timelines:
home: "Домівка"
_rooms:
_roomType:
default: "За умовчанням"
_furnitures:
monitor: "Монітор"
_pages:
featured: "Популярні"
blocks:
image: "Зображення"
script:
categories:
list: "Списки"
blocks:
_join:
arg1: "Списки"
_randomPick:
arg1: "Списки"
_dailyRandomPick:
arg1: "Списки"
_seedRandomPick:
arg2: "Списки"
_pick:
arg1: "Списки"
_listLen:
arg1: "Списки"
_fn:
arg1: "Вихід"
types:
array: "Списки"
_relayStatus:
requesting: "Очікує затвердження"
accepted: "Затверджено"
rejected: "Відхилено"
_notification:
youGotQuote: "{name} цитує вас"
youRenoted: "{name} поширює"
youGotMessagingMessageFromUser: "Повідомлення від {name}"
youGotMessagingMessageFromGroup: "Нове повідомлення в групі {name}"
youWereFollowed: "Новий підписник"
youWereInvitedToGroup: "Запрошення до групи"
_types:
follow: "Підписки"
mention: "Згадка"
renote: "Поширити"
quote: "Цитата"
reaction: "Реакції"
pollVote: "Опитування"
receiveFollowRequest: "Запит на підписку"
followRequestAccepted: "Прийнята підписка"
groupInvited: "Запрошення до груп"
app: "Сповіщення від додатків"
_deck:
alwaysShowMainColumn: "Завжди показувати головну колонку"
columnAlign: "Вирівняти стовпці"
addColumn: "Додати стовпець"
swapLeft: "Пересунути ліворуч"
swapRight: "Пересунути праворуч"
swapUp: "Пересунути вгору"
swapDown: "Пересунути вниз"
stackLeft: "У стовпчик вліво"
popRight: "Витягнути вправо"
_columns:
widgets: "Віджети"
notifications: "Сповіщення"
tl: "Стрічка"
antenna: "Антени"
list: "Списки"
mentions: "Згадки"
direct: "Особисте"

View File

@ -16,6 +16,9 @@ noNotes: "没有帖文"
noNotifications: "无通知"
instance: "实例"
settings: "设置"
basicSettings: "基本设置"
otherSettings: "其他设置"
openInWindow: "在新窗口中打开"
profile: "个人资料"
timeline: "时间线"
noAccountDescription: "这个人很懒,没有写自我介绍"
@ -40,6 +43,7 @@ deleteAndEditConfirm: "要删除此帖并再次编辑吗?对此帖的所有回
addToList: "添加至列表"
sendMessage: "发送"
copyUsername: "复制用户名"
searchUser: "搜索用户"
reply: "回复"
loadMore: "查看更多"
youGotNewFollower: "你有新的关注者"
@ -66,8 +70,11 @@ followers: "关注者"
followsYou: "关注了你"
createList: "创建列表"
manageLists: "管理列表"
error: "有点小问题"
error: "错误"
somethingHappened: "出现了问题"
retry: "重试"
pageLoadError: "页面加载失败。"
pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。"
enterListName: "输入列表名称"
privacy: "隐私"
makeFollowManuallyApprove: "关注者请求需要批准"
@ -77,7 +84,7 @@ followRequest: "关注申请"
followRequests: "关注申请"
unfollow: "取消关注"
followRequestPending: "发送关注申请"
enterEmoji: "输入Emoji"
enterEmoji: "输入表情符号"
renote: "转发"
unrenote: "取消转发"
quote: "引用"
@ -86,8 +93,9 @@ you: "您"
clickToShow: "点击以显示"
sensitive: "阅读注意"
add: "添加"
reaction: "应"
reactionSettingDescription: "选择您想要固定在反应选择器中的反应。"
reaction: "应"
reactionSettingDescription: "选择您想要置顶的回应。"
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
rememberNoteVisibility: "记录公开范围"
attachCancel: "删除附件"
markAsSensitive: "阅读注意"
@ -104,16 +112,22 @@ unblockConfirm: "确定要解除屏蔽吗?"
suspendConfirm: "要冻结吗?"
unsuspendConfirm: "要解除冻结吗?"
selectList: "选择列表"
selectAntenna: "天线选择"
selectWidget: "选择小工具"
editWidgets: "编辑小工具"
editWidgetsExit: "完成编辑"
customEmojis: "自定义Emoji"
emoji: "表情符号"
emojiName: "Emoji 名称"
emojiUrl: "emoji 地址"
addEmoji: "添加Emoji"
emojiName: "表情符号名称"
emojiUrl: "表情符号地址"
addEmoji: "添加表情符号"
settingGuide: "推荐配置"
cacheRemoteFiles: "远程文件缓存"
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
flagAsBot: "这个账户是Bot"
flagAsBotDescription: "如果此帐户由程序控制请启用此项。启用后此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为并让Misskey的内部系统将此帐户识别为机器人。"
flagAsCat: "这个账户是Cat"
flagAsCatDescription: "如果您想表明此帐户是一只猫,请打开此标志。"
autoAcceptFollowed: "自动允许关注"
addAcount: "添加账户"
loginFailed: "登录失败"
@ -153,7 +167,7 @@ jobQueue: "作业队列"
cpuAndMemory: "CPU使用量"
network: "网络"
disk: "存储"
instanceInfo: "实例情报"
instanceInfo: "实例信息"
statistics: "统计"
clearQueue: "清除队列"
clearQueueConfirmTitle: "确定清除队列?"
@ -174,8 +188,7 @@ done: "完成"
processing: "处理中"
preview: "预览"
default: "默认"
noCustomEmojis: "自定义Emoji"
customEmojisOfRemote: "远程Emoji"
noCustomEmojis: "没有自定义表情符号"
noJobs: "没有任务"
federating: "联合中"
blocked: "已拦截"
@ -204,6 +217,8 @@ imageUrl: "图片URL"
remove: "删除"
removed: "已删除"
removeAreYouSure: "要删掉「{x}」吗?"
deleteAreYouSure: "要删掉「{x}」吗?"
resetAreYouSure: "恢复默认设置?"
saved: "已保存"
messaging: "聊天"
upload: "上传"
@ -262,6 +277,7 @@ rename: "重命名"
avatar: "头像"
banner: "Banner"
nsfw: "阅读注意"
whenServerDisconnected: "与服务器连接中断时"
disconnectedFromServer: "已从服务器断开连接"
reload: "重新加载"
doNothing: "什么都不做"
@ -283,7 +299,7 @@ dayX: "{day}日"
monthX: "{month}月"
yearX: "{year}年"
pages: "页面"
integration: "连携"
integration: "关联"
connectSerice: "已连接"
disconnectSerice: "断开连接"
enableLocalTimeline: "启用本地时间线功能"
@ -302,6 +318,10 @@ bannerUrl: "Banner URL"
basicInfo: "基本信息"
pinnedUsers: "置顶用户"
pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。"
pinnedPages: "固定页面"
pinnedPagesDescription: "输入您要固定到实例首页的页面路径,以换行符分隔。"
pinnedClipId: "置顶的片段ID"
pinnedNotes: "已置顶的帖子"
hcaptcha: "hCaptcha"
enableHcaptcha: "启用 hCaptcha"
hcaptchaSiteKey: "网站密钥"
@ -342,13 +362,6 @@ popularTags: "热门标签"
userList: "列表"
about: "关于"
aboutMisskey: "关于 Misskey"
aboutMisskeyText: "Misskey是由syuilo于2014年开发的开放源代码软件。"
misskeyMembers: "现在由以下成员进行开发和维护:"
misskeySource: "源代码在这里公开:"
misskeyTranslation: "与我们一同进行Misskey的翻译工作"
misskeyDonate: "可以向 Misskey 进行捐款以支持开发:"
morePatrons: "还有很多其他的人也在支持我们,非常感谢🥰"
patrons: "支持者"
administrator: "管理员"
token: "令牌"
twoStepAuthentication: "两步验证"
@ -356,15 +369,12 @@ moderator: "版主"
nUsersMentioned: "{n} 被提到"
securityKey: "安全密钥"
securityKeyName: "密钥名称"
registerSecurityKey: "注册安全密钥"
registerSecurityKey: "注册硬件安全密钥"
lastUsed: "最后使用:"
unregister: "删除账户"
passwordLessLogin: "无密码登录"
resetPassword: "重置密码"
newPasswordIs: "新的密码是「{password}」"
autoReloadWhenDisconnected: "断开连接时自动重新加载"
autoNoteWatch: "自动关注帖子"
autoNoteWatchDescription: "让您能够收到关于「反应」和回复其他用户的帖子的通知。"
reduceUiAnimation: "减少UI动画"
share: "分享"
notFound: "未找到"
@ -402,6 +412,7 @@ noMessagesYet: "现在没有新的聊天"
newMessageExists: "新信息"
onlyOneFileCanBeAttached: "只能添加一个附件"
signinRequired: "请先登录"
invitations: "邀请"
invitationCode: "邀请码"
checking: "正在确认"
available: "可用"
@ -421,10 +432,11 @@ or: "或者"
uiLanguage: "显示语言"
groupInvited: "群组招待"
aboutX: "关于 {x}"
useOsNativeEmojis: "使用OS原生Emoji"
useOsNativeEmojis: "使用OS原生表情符号"
youHaveNoGroups: "没有群组"
joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。"
noHistory: "没有历史记录"
signinHistory: "登录历史"
disableAnimatedMfm: "禁用MFM动画"
doing: "正在进行"
category: "类别"
@ -443,7 +455,7 @@ total: "总计"
weekOverWeekChanges: "与前一周相比"
dayOverDayChanges: "与前一日相比"
appearance: "外观"
clinetSettings: "客户端设置"
clientSettings: "客户端设置"
accountSettings: "账户设置"
promotion: "推广"
promote: "推广"
@ -453,19 +465,20 @@ showFeaturedNotesInTimeline: "在时间线上显示热门推荐"
objectStorage: "对象存储"
useObjectStorage: "使用对象存储"
objectStorageBaseUrl: "基本网址"
objectStorageBaseUrlDesc: "供参考的URL。如果使用CDN或Proxy则其URL为S3\"https://<bucket>.s3.amazonaws.com\"、GCS等\"https://storage-googleapis.proxy.ustclug.org/<bucket>\"。"
objectStorageBaseUrlDesc: "URL前缀用于构造URL到对象媒体的引用如果使用的是CDN或反向代理请指定其URL否则请根据您使用的服务指定可公开访问的地址。例如“https://<bucket>.s3.amazonaws.com”用于AWS S3https://storage.googleapis.com/<bucket>”用于GCS"
objectStorageBucket: "存储桶"
objectStorageBucketDesc: "请指定使用的对象存储服务的存储桶名称。"
objectStoragePrefix: "前缀"
objectStoragePrefixDesc: "文件将存储在此前缀的目录下。"
objectStorageEndpoint: "端点"
objectStorageEndpointDesc: "S3默认情况下为空否则请为每个服务指定端点。 指定为“<host>”或“<host>:<port>”。"
objectStorageEndpointDesc: "如果你希望使用AWS S3请留空。否则请根据你使用的服务来进行设置指定端点形式为“<host>”或“<host>:<port>”。"
objectStorageRegion: "可用区"
objectStorageRegionDesc: "指定一个可用区例如“xx-east-1”。 如果您的对象存储服务没有可用区概念请将其留空或填写“us-east-1”。"
objectStorageUseSSL: "使用SSL"
objectStorageUseSSLDesc: "如果不使用https进行API连接请关闭。"
objectStorageUseProxy: "使用代理"
objectStorageUseProxyDesc: "如果您不使用代理进行API连接请将其关闭。"
objectStorageSetPublicRead: "上传时设置为public-read"
serverLogs: "服务器日志"
deleteAll: "删除全部"
showFixedPostForm: "在时间线顶部显示帖子表单"
@ -473,7 +486,10 @@ newNoteRecived: "有新的帖子"
sounds: "声音"
listen: "听"
none: "空"
showInPage: "在页面中显示"
popout: "弹窗"
volume: "音量"
masterVolume: "主音量"
details: "详情"
chooseEmoji: "选择表情符号"
unableToProcess: "操作无法完成"
@ -488,8 +504,8 @@ state: "状态"
sort: "排序"
ascendingOrder: "升序"
descendingOrder: "降序"
scratchpad: "暂存器"
scratchpadDescription: "暂存器为AiScript提供了实验环境。您可以编写代码以与Misskey交互运行它并查看结果。"
scratchpad: "便签本"
scratchpadDescription: "便签本为AiScript提供了实验环境。您可以编写代码以与Misskey交互运行它并查看结果。"
output: "输出"
script: "脚本"
disablePagesScript: "禁用页面脚本"
@ -515,7 +531,6 @@ enableInfiniteScroll: "启用自动滚动页面模式"
visibility: "可见性"
poll: "调查问卷"
useCw: "隐藏内容"
fixedWidgetsPosition: "固定小工具的位置"
enablePlayer: "打开播放器"
disablePlayer: "关闭播放器"
expandTweet: "展开推文"
@ -529,22 +544,250 @@ pluginInstallWarn: "请不要安装不明来源的插件"
deck: "Deck"
undeck: "取消Deck"
useBlurEffectForModal: "模态框使用模糊效果"
useFullReactionPicker: "使用全功能的回应工具栏"
width: "宽度"
height: "高度"
large: "大"
medium: "中"
small: "小"
generateAccessToken: "生成访问令牌"
permission: "权限"
enableAll: "启用全部"
disableAll: "禁用全部"
tokenRequested: "允许访问账户"
pluginTokenRequestedDescription: "此插件将能够拥有此处设置的权限"
notificationType: "通知类型"
edit: "编辑"
useStarForReactionFallback: "如果回应的是未知表情符号,则使用★作为代替"
emailConfig: "邮件服务器设置"
enableEmail: "启用发送邮件功能"
emailConfigInfo: "用于确认电子邮件和密码重置"
email: "邮箱"
emailAddress: "电子邮件地址"
smtpConfig: "SMTP服务器设置"
smtpHost: "主机名"
smtpPort: "端口"
smtpUser: "用户名"
smtpPass: "密码"
emptyToDisableSmtpAuth: "用户名和密码留空可以禁用SMTP验证"
smtpSecure: "在 SMTP 连接中使用隐式 SSL / TLS"
smtpSecureInfo: "使用STARTTLS时关闭。"
testEmail: "邮件发送测试"
wordMute: "文字屏蔽"
userSaysSomething: "{name}说了什么"
makeActive: "激活"
display: "显示"
copy: "复制"
metrics: "指标"
overview: "概述"
logs: "日志"
delayed: "延迟"
database: "数据库"
channel: "频道"
create: "创建"
notificationSetting: "通知设置"
notificationSettingDesc: "选择要显示的通知类型。"
useGlobalSetting: "使用全局设置"
useGlobalSettingDesc: "启用时,将使用帐户通知设置。关闭时,则可以单独设置。"
other: "其他"
regenerateLoginToken: "重新生成登录令牌"
regenerateLoginTokenDescription: "重新生成用于登录的内部令牌。通常您不需要这样做。重新生成后,您将在所有设备上登出。"
setMultipleBySeparatingWithSpace: "您可以使用空格分隔多个项目。"
fileIdOrUrl: "文件ID或者URL"
chatOpenBehavior: "聊天窗口打开时的行为"
behavior: "行为"
sample: "示例"
abuseReports: "举报"
reportAbuse: "举报"
reportAbuseOf: "举报{name}"
fillAbuseReportDescription: "请填写举报的详细原因。如果有对方发的帖子请同时填写URL地址。"
abuseReported: "内容已发送。感谢您的报告。"
send: "发送"
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: "开发者"
_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:
reload: "自动重载"
dialog: "对话框警告"
quiet: "安静警告"
_channel:
create: "创建频道"
edit: "编辑频道"
setBanner: "设置横幅"
removeBanner: "删除横幅"
featured: "热点"
owned: "管理中"
following: "正在关注"
usersCount: "有{n}人参与"
notesCount: "有{n}个帖子"
_sidebar:
full: "全部"
icon: "图标"
hide: "隐藏"
_wordMute:
muteWords: "禁用词"
muteWordsDescription: "使用空格分隔表示AND逻辑使用换行符分隔表示OR逻辑。"
muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。"
softDescription: "隐藏时间轴中指定条件的帖文。"
hardDescription: "防止将具有指定条件的帖文添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。"
soft: "软屏蔽"
hard: "硬屏蔽"
mutedNotes: "被屏蔽的帖文"
_theme:
explore: "寻找主题"
install: "安装主题"
manage: "主题管理"
code: "主题代码"
installed: "{name} 已安装"
installedThemes: "已安装的主题"
builtinThemes: "标准主题"
alreadyInstalled: "此主题已经安装"
invalid: "主题格式错误"
make: "制作主题"
@ -598,7 +841,7 @@ _theme:
cwFg: "CW 按钮文本"
cwHoverBg: "CW 按钮背景(悬停)"
toastBg: "吐司提示背景"
toastFg: "司提示文本"
toastFg: "司提示文本"
buttonBg: "按钮背景"
buttonHoverBg: "按钮背景(悬停)"
inputBorder: "输入框边框"
@ -617,6 +860,9 @@ _sfx:
chat: "聊天"
chatBg: "聊天背景"
antenna: "天线接收"
channel: "频道通知"
reversiPutBlack: "黑白棋:黑方下子时"
reversiPutWhite: "黑白棋:白方下子时"
_ago:
unknown: "未知"
future: "未来"
@ -651,9 +897,9 @@ _tutorial:
step5_3: "要关注其他用户,请单击他的头像,然后在他的个人资料上按下“关注”按钮。"
step5_4: "如果用户的名称旁边有锁定图标,则该用户需要手动批准您的关注请求。"
step6_1: "现在,您将可以在时间线上看到其他用户的帖子。"
step6_2: "您还可以在其他人的帖子上进行「应」,以快速做出简单回复。"
step6_3: "在他人的贴子上按下「+」图标,即可选择想要的表情来进行「应」。"
step7_1: "对Misskey基本操作的简单介绍到此结束了。 辛苦了!"
step6_2: "您还可以在其他人的帖子上进行「应」,以快速做出简单回复。"
step6_3: "在他人的贴子上按下「+」图标,即可选择想要的表情来进行「应」。"
step7_1: "对Misskey基本操作的简单介绍到此结束了。 辛苦了!"
step7_2: "如果你想了解更多有关Misskey的信息请参见{help}。"
step7_3: "接下来享受Misskey带来的乐趣吧🚀"
_2fa:
@ -664,7 +910,7 @@ _2fa:
step2: "然后,扫描屏幕上显示的二维码。"
step3: "输入您的应用提供的动态口令以完成设置。"
step4: "从现在开始,任何登录操作都将要求您提供动态口令。"
securityKeyInfo: "您可以设置使用支持FIDO2的硬件安全密钥、指纹或设备上的PIN来保护您的登录过程。"
securityKeyInfo: "您可以设置使用支持FIDO2的硬件安全密钥、设备上的指纹或PIN来保护您的登录过程。"
_permissions:
"read:account": "查看账户信息"
"write:account": "更改帐户信息"
@ -692,6 +938,8 @@ _permissions:
"write:page-likes": "操作喜欢的页面"
"read:user-groups": "查看用户组"
"write:user-groups": "操作用户组"
"read:channels": "查看频道"
"write:channels": "管理频道"
_auth:
shareAccess: "您要授权允许“{name}”访问您的帐户吗?"
shareAccessAsk: "您确定要授权此应用程序访问您的帐户吗?"
@ -725,6 +973,7 @@ _widgets:
photos: "照片"
digitalClock: "数字时钟"
federation: "联邦宇宙"
postForm: "投稿窗口"
_cw:
hide: "隐藏"
show: "查看更多"
@ -766,6 +1015,7 @@ _visibility:
_postForm:
replyPlaceholder: "回复这个帖子..."
quotePlaceholder: "引用这个帖子..."
channelPlaceholder: "发布到频道…"
_placeholders:
a: "现在如何?"
b: "发生了什么?"
@ -778,9 +1028,13 @@ _profile:
username: "用户名"
description: "个人简介"
youCanIncludeHashtags: "您可以包含一个哈希标签。"
metadata: "额外信息"
metadata: "附加信息"
metadataEdit: "附加信息编辑"
metadataDescription: "最多可以在个人资料中以表格形式显示四条其他信息。"
metadataLabel: "标签"
metadataContent: "内容"
changeAvatar: "修改头像"
changeBanner: "修改横幅"
_exportOrImport:
allNotes: "所有帖子"
followingList: "关注中"
@ -887,6 +1141,7 @@ _pages:
created: "页面已创建"
updated: "页面已更新"
deleted: "该页面已被删除"
pageSetting: "页面设置"
nameAlreadyExists: "该页面URL已存在"
invalidNameTitle: "无效的页面URL"
invalidNameText: "请确认该项不为空"
@ -897,7 +1152,9 @@ _pages:
unlike: "取消赞"
my: "我的页面"
liked: "喜欢的页面"
featured: "热门"
inspector: "检查器"
contents: "内容"
content: "页面内容"
variables: "变量"
title: "标题"
@ -951,6 +1208,11 @@ _pages:
id: "画布ID"
width: "宽度"
height: "高度"
note: "嵌入的帖子"
_note:
id: "帖子ID"
idDescription: "您也可以通过粘贴帖子的URL来进行设置。"
detailed: "显示详细信息"
switch: "开关"
_switch:
name: "变量名"
@ -1178,12 +1440,31 @@ _notification:
youReceivedFollowRequest: "您有新的关注请求"
yourFollowRequestAccepted: "您的关注请求已通过"
youWereInvitedToGroup: "您有新的群组邀请"
_types:
all: "全部"
follow: "关注中"
mention: "提及"
reply: "回复"
renote: "转发"
quote: "引用"
reaction: "回应"
pollVote: "问卷调查已投票"
receiveFollowRequest: "收到关注请求"
followRequestAccepted: "关注请求已接受"
groupInvited: "加入群组邀请"
app: "关联应用的通知"
_deck:
alwaysShowMainColumn: "总是显示主列"
columnAlign: "列对齐"
addColumn: "添加列"
swapLeft: "向左移动"
swapRight: "向右移动"
swapUp: "向上移动"
swapDown: "向下移动"
stackLeft: "向左折叠"
popRight: "向右弹出"
_columns:
widgets: "小部件"
widgets: "小工具"
notifications: "通知"
tl: "时间线"
antenna: "天线"

View File

@ -1,21 +1,24 @@
---
_lang_: "中文(繁體)"
_lang_: "繁體中文"
introMisskey: "歡迎! Misskey是一個開源的去中心化的社群網站。\n通過「貼文」來分享現在發生的事情吧 📡\n「反應」功能可以讓你快速的對大家的「帖子」來表達感情👍\n一起來探索新的世界吧 🚀"
monthAndDay: "{month}月 {day}日"
search: "搜尋"
notifications: "通知"
username: "使用名稱"
username: "使用名稱"
password: "密碼"
fetchingAsApObject: "從 Fediverse 查詢中..."
ok: "確定"
ok: "OK"
gotIt: "知道了"
cancel: "取消"
enterUsername: "輸入使用者名稱"
renotedBy: "{user}轉發"
renotedBy: "{user} 轉發"
noNotes: "貼文不可用。"
noNotifications: "沒有通知"
instance: "實例"
settings: "設定"
basicSettings: "基本設定"
otherSettings: "其他設定"
openInWindow: "在新視窗開啟"
profile: "個人檔案"
timeline: "時間軸"
noAccountDescription: "此用戶還沒有自我介紹"
@ -40,6 +43,7 @@ deleteAndEditConfirm: "要刪除並再次編輯嗎?此貼文的所有反應,
addToList: "添加至清單"
sendMessage: "發送訊息"
copyUsername: "複製用戶名"
searchUser: "搜尋用戶"
reply: "回覆"
loadMore: "瀏覽更多"
youGotNewFollower: "您有新的追隨者"
@ -47,6 +51,7 @@ receiveFollowRequest: "收到追隨請求"
followRequestAccepted: "追隨請求已接受"
mention: "提及"
mentions: "提及"
directNotes: "私信"
importAndExport: "匯入 / 匯出"
import: "匯入"
export: "匯出"
@ -65,8 +70,10 @@ followers: "追隨者"
followsYou: "追隨你的人"
createList: "建立清單"
manageLists: "管理清單"
error: "發生錯誤"
error: "錯誤"
somethingHappened: "發生錯誤"
retry: "重試"
pageLoadError: "載入頁面失敗"
enterListName: "輸入清單名稱"
privacy: "隱私"
makeFollowManuallyApprove: "手動審核追隨請求"
@ -92,8 +99,8 @@ attachCancel: "移除附件"
markAsSensitive: "標記為敏感內容"
unmarkAsSensitive: "取消標記為敏感內容"
enterFileName: "請輸入檔案名稱"
mute: "音"
unmute: "解除音"
mute: "音"
unmute: "解除音"
block: "封鎖"
unblock: "解除封鎖"
suspend: "凍結"
@ -103,17 +110,24 @@ unblockConfirm: "確定解除封鎖此用戶?"
suspendConfirm: "確定凍結此帳號?"
unsuspendConfirm: "確定解凍此帳號?"
selectList: "選擇清單"
selectAntenna: "選擇天線"
selectWidget: "選擇小工具"
editWidgets: "編輯小工具"
editWidgetsExit: "停止編輯"
customEmojis: "自訂表情符號"
emoji: "表情符號"
emojiName: "表情符號名稱"
emojiUrl: "表情符號URL"
addEmoji: "新增表情符號"
settingGuide: "推薦設定"
flagAsBot: "此帳戶是Bot"
flagAsCat: "此帳戶是Cat"
cacheRemoteFiles: "緩存非遠程檔案"
cacheRemoteFilesDescription: "禁用此設定會停止遠端檔案的緩存,從而節省儲存空間。但資料會因直接連線從而產生額外連接數據。"
flagAsBot: "此使用者是機器人"
flagAsCat: "此使用者是貓"
autoAcceptFollowed: "自動許可追隨"
addAcount: "新增帳號"
loginFailed: "登入失敗"
showOnRemote: "轉到所在實例顯示"
general: "一般"
wallpaper: "桌布"
setWallpaper: "設定桌布"
@ -122,12 +136,16 @@ searchWith: "搜尋: {q}"
youHaveNoLists: "沒有任何清單"
followConfirm: "你真的要關注{name}嗎?"
proxyAccount: "代理帳號"
proxyAccountDescription: "代理帳號是在某些情況下充當其他服務器用戶的帳號。例如,當用戶將一個來自其他服務器的帳號放在列表中時,由於沒有其他用戶關注該帳號,該指令不會傳送到該服務器上,因此會由代理帳戶關注。"
host: "主機"
selectUser: "選取使用者"
recipient: "發送至"
annotation: "註解"
federation: "聯邦宇宙"
instances: "實例"
registeredAt: "初次觀測"
latestRequestSentAt: "上次發送的請求"
latestRequestReceivedAt: "上次收到的請求"
latestStatus: "最後狀態"
storageUsage: "已使用容量"
charts: "圖表"
@ -148,12 +166,13 @@ instanceInfo: "實例資訊"
statistics: "統計"
clearQueue: "清除佇列"
clearQueueConfirmTitle: "確定要清除佇列嗎?"
clearQueueConfirmText: "未發佈的帖子將不會發佈。您通常不需要確認。"
clearCachedFiles: "清除快取資料"
clearCachedFilesConfirm: "確定要清除緩存資料嗎?"
blockedInstances: "已封鎖的實例"
blockedInstancesDescription: "請逐行輸入需要封鎖的實例。已封鎖的實例將無法與本實例進行通訊。"
muteAndBlock: "禁言 / 封鎖"
mutedUsers: "已禁言用戶"
muteAndBlock: "靜音/封鎖"
mutedUsers: "已靜音用戶"
blockedUsers: "已封鎖用戶"
noUsers: "無用戶"
editProfile: "編輯個人檔案"
@ -165,7 +184,6 @@ processing: "處理中"
preview: "預覽"
default: "預設"
noCustomEmojis: "沒有表情符號"
customEmojisOfRemote: "來自其他實例的表情符號"
noJobs: "沒有任務"
federating: "整合搜索中"
blocked: "已封鎖"
@ -194,12 +212,15 @@ imageUrl: "圖片URL"
remove: "刪除"
removed: "成功移除"
removeAreYouSure: "確定要刪掉「{x}」嗎?"
deleteAreYouSure: "確定要刪掉「{x}」嗎?"
saved: "已保存"
messaging: "傳送訊息"
upload: "上傳"
fromDrive: "從雲端"
fromUrl: "從URL"
uploadFromUrl: "從網址上傳"
uploadFromUrlDescription: "您要上傳的文件的URL"
uploadFromUrlRequested: "已請求上傳"
uploadFromUrlMayTakeTime: "還需要一些時間才能完成上傳。"
explore: "探索"
games: "Misskey 遊戲"
@ -207,9 +228,11 @@ messageRead: "已讀"
noMoreHistory: "沒有更多歷史紀錄"
startMessaging: "開始傳送訊息"
nUsersRead: "{n}人已讀"
agreeTo: "我同意{0}"
tos: "使用條款"
start: "開始"
home: "首頁"
remoteUserCaution: "由於該用戶來自遠端實例,因此資料用戶並未即時更新。"
activity: "動態"
images: "圖片"
birthday: "生日"
@ -217,10 +240,13 @@ yearsOld: "{age}歲"
registeredDate: "註冊日期"
location: "位置"
theme: "外觀主題"
themeForLightMode: "在淺色模式下使用的主題"
themeForDarkMode: "在深色模式下使用的主題"
light: "淺色"
dark: "灰暗"
lightThemes: "明亮主題"
darkThemes: "灰暗主題"
syncDeviceDarkMode: "將深色模式與設備設置同步"
drive: "雲端硬碟"
fileName: "檔案名稱"
selectFile: "選擇檔案"
@ -238,11 +264,14 @@ emptyFolder: "空的資料夾"
unableToDelete: "無法刪除"
inputNewFileName: "輸入檔案名稱"
inputNewFolderName: "輸入新資料夾的名稱"
circularReferenceFolder: "目標文件夾是您要移動的文件夾的子文件夾。"
hasChildFilesOrFolders: "此文件夾不是空的,無法刪除。"
copyUrl: "複製URL"
rename: "重新命名"
avatar: "頭像"
banner: "橫幅"
nsfw: "敏感內容"
whenServerDisconnected: "與服務器的連接中斷時"
disconnectedFromServer: "與伺服器中斷連線"
reload: "重新載入"
doNothing: "無視"
@ -269,10 +298,12 @@ connectSerice: "連線"
disconnectSerice: "中斷連線"
enableLocalTimeline: "開啟本地時間軸"
enableGlobalTimeline: "開啟全球時間軸"
disablingTimelinesInfo: "即使您禁用了時間線功能,管理員和協調人仍可以繼續使用,以方便您。"
registration: "註冊"
enableRegistration: "開啟新用戶註冊"
invite: "邀請"
proxyRemoteFiles: "代理遠程檔案"
proxyRemoteFiles: "遠端代理檔案"
proxyRemoteFilesDescription: "啟用此設置後,由於超出存儲容量而未保存或刪除的遠程文件將被本地代理,並且將生成預覽圖。這不影響服務器的存儲。"
driveCapacityPerLocalAccount: "每個本地用戶的雲端容量"
driveCapacityPerRemoteAccount: "每個非本地用戶的雲端容量"
inMb: "以Mbps為單位"
@ -280,6 +311,8 @@ iconUrl: "圖像URL"
bannerUrl: "橫幅圖片URL"
basicInfo: "基本資訊"
pinnedUsers: "置頂用戶"
pinnedUsersDescription: "在「發現」頁面中使用換行標記想要置頂的用戶。"
pinnedNotes: "已置頂的貼文"
hcaptcha: "hCaptcha"
enableHcaptcha: "啟用 hCaptcha"
hcaptchaSiteKey: "網站金鑰"
@ -288,13 +321,21 @@ recaptcha: "reCAPTCHA"
enableRecaptcha: "啟用 reCAPTCHA"
recaptchaSiteKey: "網站金鑰"
recaptchaSecretKey: "金鑰"
avoidMultiCaptchaConfirm: "使用多種驗證方式可能會造成干擾,您要禁用其他驗證方式嗎?您可以按“取消”保留多種驗證方式。"
antennas: "天線"
manageAntennas: "管理天線"
name: "名稱"
antennaKeywords: "包含的關鍵字"
antennaSource: "接收來源"
antennaKeywords: "包含關鍵字"
antennaExcludeKeywords: "排除關鍵字"
antennaKeywordsDescription: "用空格分隔指定AND、用換行符分隔指定OR"
notifyAntenna: "通知我有新的貼文"
serviceworker: "ServiceWorker"
enableServiceworker: "開啟 ServiceWorker"
antennaUsersDescription: "指定用換行符分隔的用戶名"
caseSensitive: "區分大小寫"
withReplies: "包含回覆"
connectedTo: "您的帳號已連接到以下社交帳號"
notesAndReplies: "貼文與回覆"
withFiles: "附件"
silence: "禁言"
@ -311,10 +352,6 @@ popularTags: "熱門標籤"
userList: "清單"
about: "資訊"
aboutMisskey: "關於 Misskey"
misskeyTranslation: "幫助我們為Misskey的翻譯工作出一分力"
misskeyDonate: "向Misskey捐款以支援我們開發工作"
morePatrons: "感激你們的支持、 幫助。 🥰"
patrons: "贊助者"
administrator: "管理員"
token: "令牌"
twoStepAuthentication: "雙重身份驗證"
@ -328,9 +365,6 @@ unregister: "刪除賬戶"
passwordLessLogin: "設置無密碼登入"
resetPassword: "重置密碼"
newPasswordIs: "新密碼為「{password}」"
autoReloadWhenDisconnected: "和伺服器斷線時自動重新載入"
autoNoteWatch: "自動追隨貼文"
autoNoteWatchDescription: "收到反應或回覆過的貼文的通知"
reduceUiAnimation: "減少介面的動態視覺"
share: "分享"
notFound: "找不到"
@ -346,6 +380,7 @@ close: "關閉"
group: "群組"
groups: "群組"
createGroup: "創建群組"
ownedGroups: "擁有的群組"
joinedGroups: "群組成員"
invites: "邀請"
groupName: "群組名稱"
@ -367,6 +402,7 @@ noMessagesYet: "沒有訊息"
newMessageExists: "有新的訊息"
onlyOneFileCanBeAttached: "只能添加一個附件"
signinRequired: "請先登入"
invitations: "邀請"
invitationCode: "邀請碼"
checking: "確認中"
available: "可用的"
@ -379,16 +415,53 @@ normalPassword: "密碼強度普通"
strongPassword: "密碼強度堅強"
passwordMatched: "密碼一致"
passwordNotMatched: "密碼不一致"
signinWith: "以{x}登錄"
signinFailed: "登入失敗。 請檢查用戶名和密碼。"
tapSecurityKey: "點擊安全密鑰"
or: "或者"
uiLanguage: "介面語言"
groupInvited: "您有新的群組邀請"
aboutX: "關於{x}"
useOsNativeEmojis: "使用OS原生表情符號"
youHaveNoGroups: "找不到群組"
joinOrCreateGroup: "請加入現有群組,或創建新群組。"
noHistory: "沒有歷史紀錄"
disableAnimatedMfm: "禁用MFM動畫"
doing: "正在進行"
category: "類別"
tags: "標籤"
docSource: "文件來源"
createAccount: "建立帳戶"
existingAcount: "現有帳戶"
regenerate: "再生"
fontSize: "字體大小"
openImageInNewTab: "於新分頁中開啟圖片"
local: "本地"
remote: "遠端"
total: "合計"
clinetSettings: "用戶端設定"
weekOverWeekChanges: "與上週相比"
dayOverDayChanges: "與前一日相比"
appearance: "外觀"
clientSettings: "用戶端設定"
accountSettings: "帳號設定"
promotion: "推廣貼文"
promote: "推廣"
numberOfDays: "有效天數"
hideThisNote: "隱藏此貼文"
showFeaturedNotesInTimeline: "在時間軸上顯示熱門推薦"
objectStorageBaseUrl: "Base URL"
objectStorageBucket: "儲存空間Bucket"
objectStoragePrefix: "前綴"
objectStorageEndpoint: "訪問網域名稱Endpoint"
objectStorageEndpointDesc: "如要使用AWS S3請留空。否則請根據伺服器要求以'<host>'或 '<host>:<port>'的形式設定訪問網域名稱Endpoint。"
objectStorageRegion: "地域Region"
objectStorageUseSSL: "使用SSL"
objectStorageUseProxy: "使用網路代理"
serverLogs: "伺服器日誌"
deleteAll: "刪除所有記錄"
sounds: "音效"
none: "無"
showInPage: "在頁面中顯示"
volume: "音量"
details: "詳細資訊"
chooseEmoji: "選擇您的表情符號\n"
@ -396,29 +469,165 @@ unableToProcess: "操作無法完成"
recentUsed: "最近使用"
install: "安裝"
uninstall: "解除安裝"
installedApps: "已授權的應用程式"
nothing: "未發現"
installedDate: "安裝時間"
lastUsedDate: "最後上線日期"
state: "狀態"
sort: "排序"
ascendingOrder: "昇冪"
descendingOrder: "降冪"
scratchpad: "暫存記憶體"
output: "輸出"
script: "腳本"
updateRemoteUser: "更新非本地用戶資料"
deleteAllFiles: "刪除所有檔案"
deleteAllFilesConfirm: "要删除所有檔案吗?"
removeAllFollowing: "解除所有追隨"
userSuspended: "該用戶已被凍結"
userSilenced: "該用戶已被禁言。"
sidebar: "側邊列"
divider: "分割線"
addItem: "新增項目"
rooms: "房間"
relays: "中繼"
addRelay: "添加中繼"
inboxUrl: "私信URL"
addedRelays: "已添加的中繼"
serviceworkerInfo: "您需要啟用推送通知"
deletedNote: "已删除的貼文"
invisibleNote: "隱藏的帖子"
enableInfiniteScroll: "啟用自動滾動頁面模式"
visibility: "公開範圍"
poll: "投票"
useCw: "隱藏內容"
enablePlayer: "打開播放器"
disablePlayer: "關閉播放器"
expandTweet: "展開推文"
themeEditor: "主題編輯器"
description: "描述"
author: "作者"
leaveConfirm: "有未保存的更改。要放棄嗎?"
manage: "管理"
plugins: "插件"
pluginInstallWarn: "請不要安裝來源不明的插件。"
deck: "多欄模式"
undeck: "取消多欄模式"
width: "寬度"
height: "高度"
permission: "權限"
enableAll: "啟用全部"
disableAll: "停用全部"
tokenRequested: "允許訪問帳號"
notificationType: "通知形式"
edit: "編輯"
useStarForReactionFallback: "以★代替未知的表情符號"
emailConfig: "電子郵件伺服器設定"
enableEmail: "啟用發送電郵功能"
emailConfigInfo: "用於確認電郵地址及密碼重置"
smtpConfig: "SMTP伺服器設定"
smtpHost: "主機"
smtpUser: "使用名稱"
smtpPort: "端口"
smtpUser: "使用者名稱"
smtpPass: "密碼"
emptyToDisableSmtpAuth: "留空使用者名稱和密碼以禁用SMTP驗證。"
testEmail: "郵件測試發送"
wordMute: "靜音文字"
display: "檢視"
copy: "複製"
metrics: "指標"
overview: "概覽"
logs: "日誌"
delayed: "延遲"
database: "資料庫"
channel: "頻道"
create: "新增"
notificationSetting: "通知設定"
other: "其他"
regenerateLoginTokenDescription: "再生用於登入的內部權杖。一般情況下是不需要這樣做的。一旦再生,所有裝置將會被登出。"
sample: "範例 "
abuseReports: "檢舉"
reportAbuse: "檢舉"
reportAbuseOf: "檢舉{name}"
send: "發送"
openInNewTab: "在新分頁中開啟"
random: "隨機"
system: "系統"
public: "公開"
_mfm:
mention: "提及"
hashtag: "#tag"
link: "鏈接"
quote: "引用"
emoji: "自訂表情符號"
search: "搜尋"
_reversi:
reversi: "黑白棋"
gameSettings: "對弈設定"
chooseBoard: "選擇棋盤"
rules: "規則"
botSettings: "機器人設定"
opponentTurn: "對手回合"
myTurn: "你的回合"
turnOf: "{name}的回合"
pastTurnOf: "{name}的回合"
surrender: "認輸"
black: "黑"
white: "白"
total: "合計"
ended: "已結束"
playing: "正在對弈"
_instanceTicker:
always: "總是顯示"
_serverDisconnectedBehavior:
reload: "自動重載"
dialog: "以對話框警告"
quiet: "適當地警告"
_channel:
create: "建立頻道"
edit: "編輯頻道"
setBanner: "設定橫幅"
removeBanner: "移除封面圖"
featured: "流行"
owned: "管理中"
following: "關注中"
usersCount: "有{n}人參與"
notesCount: "有{n}個帖子"
_sidebar:
icon: "頭像"
hide: "隱藏"
_wordMute:
muteWords: "加入靜音文字"
mutedNotes: "已靜音的貼文"
_theme:
constant: "常數"
defaultValue: "預設值"
color: "顏色"
func: "函数"
argument: "引數"
alpha: "透明度"
darken: "暗度"
lighten: "亮度"
keys:
bg: "背景"
fg: "文本"
shadow: "陰影"
link: "鏈接"
hashtag: "#tag"
mention: "提及"
mentionMe: "提及我"
renote: "轉發貼文"
divider: "分割線"
infoBg: "資訊背景"
infoFg: "資訊內容"
infoWarnBg: "警告背景"
infoWarnFg: "警告字元"
_sfx:
note: "貼文"
noteMy: "我的貼文"
notification: "通知"
chat: "傳送訊息"
channel: "頻道通知"
_ago:
unknown: "未知"
future: "未來"
@ -449,6 +658,7 @@ _tutorial:
step4_1: "筆記發出去了嗎?"
step4_2: "如果你的貼文有顯示在時間軸上,就代表已經發文成功。"
step5_1: "現在試試看追隨其他人來讓你的時間軸變得更生動吧。"
step5_2: "你可以在{featured}上看到受歡迎的貼文,你也可以選擇從列表中追隨你喜歡的人,或者在{explore}上找到熱門使用者。"
step5_3: "想要追隨其他人,只要點擊他們的頭像並按「追隨」即可。"
step5_4: "如果使用者的名字旁有鎖頭的圖示,代表他們需要手動核准你的追隨請求。"
step6_1: "現在你可以在時間軸上看到其他用戶的貼文"
@ -456,6 +666,8 @@ _tutorial:
step6_3: "在他人的貼文按下「+」的圖示即可選擇想要的表情符號來進行「反應」。"
step7_1: "以上為Misskey的基本操作說明教學在此告一段落。辛苦了。"
step7_2: "歡迎到{help}來瞭解更多Misskey相關介紹。"
_2fa:
registerDevice: "註冊裝置"
_permissions:
"read:blocks": "已封鎖用戶名單"
"write:blocks": "編輯已封鎖用戶名單"
@ -464,11 +676,32 @@ _permissions:
"read:favorites": "瀏覽已收藏"
"write:favorites": "編輯收藏清單"
"write:following": "追隨/解除追隨"
"read:messaging": "顯示訊息"
"write:messaging": "撰寫或刪除私人訊息"
"read:mutes": "顯示已靜音列表"
"write:mutes": "編輯已靜音列表"
"write:notes": "撰寫或刪除貼文"
"read:notifications": "查看通知"
"write:notifications": "編輯通知"
"read:reactions": "查看反應"
"write:reactions": "編輯反應"
"write:votes": "投票"
"read:pages": "顯示頁面"
"write:pages": "編輯頁面"
"read:page-likes": "顯示頁面的已喜歡"
"write:page-likes": "編輯頁面上喜歡"
"read:user-groups": "顯示使用者群組"
"write:user-groups": "編輯使用者群組"
"read:channels": "已查看的頻道"
"write:channels": "編輯頻道"
_auth:
shareAccess: "要授權「“{name}”」存取您的帳戶嗎?"
_antennaSources:
all: "全部貼文"
homeTimeline: "來自已追隨使用者的貼文"
users: "來自特定使用者的貼文"
userList: "來自特定清單中的貼文"
userGroup: "來自特定群組的貼文"
_weekday:
sunday: "週日"
monday: "週一"
@ -478,61 +711,235 @@ _weekday:
friday: "週五"
saturday: "週六"
_widgets:
memo: "備忘錄"
notifications: "通知"
timeline: "時間軸"
calendar: "行事曆"
trends: "發燒貼文"
clock: "時鐘"
rss: "RSS閱讀器"
activity: "動態"
photos: "照片"
digitalClock: "電子時鐘"
federation: "聯邦宇宙"
_cw:
hide: "隱藏"
show: "瀏覽更多"
chars: "{count}字元"
files: "{count} 個檔案"
_poll:
noOnlyOneChoice: "至少需要兩個選項。"
expiration: "期限"
infinite: "無期限"
at: "結束時間"
deadlineDate: "截止日期"
deadlineTime: "小時"
duration: "時長"
votesCount: "{n}票"
totalVotes: "一共{n}票"
vote: "投票"
showResult: "顯示結果"
voted: "已投票"
closed: "已結束"
remainingDays: "{d}天{h}小時後結束"
_visibility:
public: "公開"
home: "首頁"
followers: "追隨者"
specified: "指定使用者"
specifiedDescription: "僅發送至指定使用者"
localOnly: "僅限本地"
localOnlyDescription: "對遠端使用者隱藏"
_postForm:
replyPlaceholder: "回覆此貼文..."
quotePlaceholder: "引用此貼文..."
channelPlaceholder: "發佈到頻道"
_placeholders:
a: "今天過得如何?"
b: "有什麼新鮮事嗎?"
c: "有什麼新鮮想法嗎?"
d: "想要發布些什麼嗎?"
e: "寫些什麼吧..."
f: "期待你發佈的內容..."
_profile:
name: "名稱"
username: "使用名稱"
username: "使用名稱"
description: "關於我"
youCanIncludeHashtags: "你也可以在「關於我」中加上 #tag"
metadataLabel: "標籤"
metadataContent: "内容"
_exportOrImport:
allNotes: "全部貼文"
followingList: "追隨中"
muteList: "音"
muteList: "音"
blockingList: "封鎖"
userLists: "清單"
_charts:
usersIncDec: "使用者増減"
usersTotal: "使用者合共"
activeUsers: "活躍使用者"
notesIncDec: "貼文増減"
localNotesIncDec: "本地貼文増減"
remoteNotesIncDec: "非本地貼文的數目增减"
notesTotal: "貼文合共"
filesIncDec: "檔案増減"
filesTotal: "累計檔案"
storageUsageIncDec: "儲存空間的増減"
storageUsageTotal: "已使用的儲存空間合共"
_instanceCharts:
requests: "請求"
users: "使用者増減"
usersTotal: "總計使用者"
notes: "貼文増減"
notesTotal: "累計貼文"
ff: "追隨/追隨者的増減"
ffTotal: "追隨/追隨者累計"
cacheSize: "增加或減少快取用量"
cacheSizeTotal: "快取大小總計"
files: "檔案數量的増減"
filesTotal: "檔案數量總計"
_timelines:
home: "首頁"
local: "本地"
social: "社群"
global: "全域"
_rooms:
roomOf: "{user}的房間"
addFurniture: "擺放家具"
translate: "移動 "
rotate: "旋轉"
exit: "返回"
remove: "移除"
clear: "全部移除"
clearConfirm: "確定要移除全部家具嗎?"
leaveConfirm: "修改未儲存,是否要離開?"
chooseImage: "選擇圖像"
roomType: "房間種類"
carpetColor: "地板顏色"
_roomType:
default: "預設"
washitsu: "和室"
_furnitures:
milk: "牛奶盒"
bed: "床"
low-table: "咖啡桌"
desk: "書桌"
chair: "椅子"
chair2: "椅子2"
fan: "通風機"
pc: "電腦"
plant: "觀葉植物"
plant2: "觀葉植物2"
eraser: "橡皮擦"
pencil: "鉛筆"
pudding: "布丁"
cardboard-box: "紙板箱"
cardboard-box2: "紙板箱2"
cardboard-box3: "紙板箱3"
book: "讀物"
book2: "讀物2"
piano: "鋼琴"
moon: "月亮"
corkboard: "木栓板"
mousepad: "滑鼠墊"
monitor: "監視器"
keyboard: "鍵盤"
carpet-stripe: "條紋地毯"
bin: "垃圾箱"
cup-noodle: "杯面"
holo-display: "投影機"
energy-drink: "能量飲料"
doll-ai: "小藍的人偶公仔"
banknote: "大疊鈔票"
_pages:
newPage: "建立頁面"
editPage: "編輯頁面"
created: "頁面已建立"
updated: "頁面已更新"
deleted: "頁面已被刪除"
editThisPage: "編輯此頁面"
viewSource: "檢視原始碼"
viewPage: "顯示頁面"
like: "喜歡"
unlike: "收回喜歡"
my: "我的頁面"
liked: "已喜歡的頁面"
inspector: "面板檢查"
variables: "變數"
title: "標題"
url: "頁面網址"
font: "字型"
fontSerif: "襯線體"
fontSansSerif: "無襯線體"
inputBlocks: "輸入"
blocks:
text: "文本"
textarea: "文字區域"
section: "區段"
image: "圖片"
button: "按鈕"
if: "如果"
_if:
variable: "變數"
_post:
text: "内容"
canvasId: "畫布ID"
textInput: "插入文字"
_textInput:
name: "變數名稱"
text: "標題"
default: "預設值"
textareaInput: "多行文字输入"
_textareaInput:
name: "變數名稱"
text: "標題"
default: "預設值"
numberInput: "輸入數值"
_numberInput:
name: "變數名稱"
_canvas:
width: "寬度"
_counter:
text: "標題"
default: "預設值"
canvas: "畫布"
_canvas:
id: "畫布ID"
width: "寬度"
height: "高度"
switch: "開關"
_switch:
name: "變數名稱"
text: "標題"
default: "預設值"
counter: "計數器"
_counter:
name: "變數名稱"
text: "標題"
inc: "増加値"
_button:
text: "標題"
colored: "彩色"
action: "按下按鈕後發生的行為"
_action:
_dialog:
content: "内容"
resetRandom: "重設亂數"
pushEvent: "發送事件"
_pushEvent:
event: "事件名稱"
no-variable: "沒有"
callAiScript: "調用AiScript"
_callAiScript:
functionName: "函數名稱"
radioButton: "選項"
_radioButton:
name: "變數名稱"
title: "標題"
default: "預設值"
script:
categories:
logical: "邏輯運算"
operation: "計算"
comparison: "對比"
random: "隨機"
value: "數值 "
fn: "函数"
text: "文本操作"
@ -542,6 +949,8 @@ _pages:
text: "文本"
multiLineText: "文本 (多行)"
textList: "文本列表"
_strLen:
arg1: "文本"
_strPick:
arg1: "文本"
arg2: "字元位置"
@ -555,18 +964,22 @@ _pages:
_add:
arg1: "A"
arg2: "B"
subtract: "减去"
_subtract:
arg1: "A"
arg2: "B"
multiply: "乘"
_multiply:
arg1: "A"
arg2: "B"
divide: "除"
_divide:
arg1: "A"
arg2: "B"
_mod:
arg1: "A"
arg2: "B"
round: "四舍五入"
_round:
arg1: "數值"
eq: "A和B相等"
@ -608,6 +1021,7 @@ _pages:
not: "否"
_not:
arg1: "否"
random: "隨機"
_random:
arg1: "機率"
rannum: "亂數"
@ -650,6 +1064,8 @@ _pages:
arg1: "文字"
_numberToString:
arg1: "數值"
_splitStrByLine:
arg1: "文本"
ref: "變數"
aiScriptVar: "AiScript的變數"
fn: "函数"
@ -665,17 +1081,43 @@ _pages:
array: "清單"
stringArray: "文本列表"
enviromentVariables: "環境變數"
pageVariables: "頁面元素"
_relayStatus:
requesting: "等待核准"
accepted: "已通過核准"
rejected: "已拒絕"
_notification:
youRenoted: "{name} 轉發了你的貼文"
youGotPoll: "{name}已投票"
youWereFollowed: "您有新的追隨者"
yourFollowRequestAccepted: "您的追隨請求已通過"
youWereInvitedToGroup: "您有新的群組邀請"
_types:
all: "全部 "
follow: "追隨中"
mention: "提及"
reply: "回覆"
renote: "轉發貼文"
quote: "引用"
reaction: "反應"
receiveFollowRequest: "已收到追隨請求"
followRequestAccepted: "追隨請求已接受"
app: "應用程式通知"
_deck:
alwaysShowMainColumn: "總是顯示主欄"
columnAlign: "對齊欄位"
addColumn: "新增欄位"
swapLeft: "向左移動"
swapRight: "向右移動"
swapUp: "往上移動"
swapDown: "往下移動"
stackLeft: "向左折疊"
popRight: "向右彈出"
_columns:
widgets: "小工具"
notifications: "通知"
tl: "時間軸"
antenna: "天線"
list: "清單"
mentions: "提及"
direct: "指定使用者"

View File

@ -0,0 +1,30 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class wordMute1595771249699 implements MigrationInterface {
name = 'wordMute1595771249699'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`CREATE TABLE "muted_note" ("id" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, CONSTRAINT "PK_897e2eff1c0b9b64e55ca1418a4" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_70ab9786313d78e4201d81cdb8" ON "muted_note" ("noteId") `);
await queryRunner.query(`CREATE INDEX "IDX_d8e07aa18c2d64e86201601aec" ON "muted_note" ("userId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a8c6bfd637d3f1d67a27c48e27" ON "muted_note" ("noteId", "userId") `);
await queryRunner.query(`ALTER TABLE "user_profile" ADD "enableWordMute" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`ALTER TABLE "user_profile" ADD "mutedWords" jsonb NOT NULL DEFAULT '[]'`);
await queryRunner.query(`CREATE INDEX "IDX_3befe6f999c86aff06eb0257b4" ON "user_profile" ("enableWordMute") `);
await queryRunner.query(`ALTER TABLE "muted_note" ADD CONSTRAINT "FK_70ab9786313d78e4201d81cdb89" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "muted_note" ADD CONSTRAINT "FK_d8e07aa18c2d64e86201601aec1" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "muted_note" DROP CONSTRAINT "FK_d8e07aa18c2d64e86201601aec1"`);
await queryRunner.query(`ALTER TABLE "muted_note" DROP CONSTRAINT "FK_70ab9786313d78e4201d81cdb89"`);
await queryRunner.query(`DROP INDEX "IDX_3befe6f999c86aff06eb0257b4"`);
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "mutedWords"`);
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "enableWordMute"`);
await queryRunner.query(`DROP INDEX "IDX_a8c6bfd637d3f1d67a27c48e27"`);
await queryRunner.query(`DROP INDEX "IDX_d8e07aa18c2d64e86201601aec"`);
await queryRunner.query(`DROP INDEX "IDX_70ab9786313d78e4201d81cdb8"`);
await queryRunner.query(`DROP TABLE "muted_note"`);
}
}

View File

@ -0,0 +1,18 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class wordMute21595782306083 implements MigrationInterface {
name = 'wordMute21595782306083'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`CREATE TYPE "muted_note_reason_enum" AS ENUM('word', 'manual', 'spam', 'other')`);
await queryRunner.query(`ALTER TABLE "muted_note" ADD "reason" "muted_note_reason_enum" NOT NULL`);
await queryRunner.query(`CREATE INDEX "IDX_636e977ff90b23676fb5624b25" ON "muted_note" ("reason") `);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP INDEX "IDX_636e977ff90b23676fb5624b25"`);
await queryRunner.query(`ALTER TABLE "muted_note" DROP COLUMN "reason"`);
await queryRunner.query(`DROP TYPE "muted_note_reason_enum"`);
}
}

View File

@ -0,0 +1,58 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class channel1596548170836 implements MigrationInterface {
name = 'channel1596548170836'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`CREATE TABLE "channel" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "lastNotedAt" TIMESTAMP WITH TIME ZONE, "userId" character varying(32) NOT NULL, "name" character varying(128) NOT NULL, "description" character varying(2048), "bannerId" character varying(32), "notesCount" integer NOT NULL DEFAULT 0, "usersCount" integer NOT NULL DEFAULT 0, CONSTRAINT "PK_590f33ee6ee7d76437acf362e39" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_71cb7b435b7c0d4843317e7e16" ON "channel" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_29ef80c6f13bcea998447fce43" ON "channel" ("lastNotedAt") `);
await queryRunner.query(`CREATE INDEX "IDX_823bae55bd81b3be6e05cff438" ON "channel" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_0f58c11241e649d2a638a8de94" ON "channel" ("notesCount") `);
await queryRunner.query(`CREATE INDEX "IDX_094b86cd36bb805d1aa1e8cc9a" ON "channel" ("usersCount") `);
await queryRunner.query(`CREATE TABLE "channel_following" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "followeeId" character varying(32) NOT NULL, "followerId" character varying(32) NOT NULL, CONSTRAINT "PK_8b104be7f7415113f2a02cd5bdd" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_11e71f2511589dcc8a4d3214f9" ON "channel_following" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_0e43068c3f92cab197c3d3cd86" ON "channel_following" ("followeeId") `);
await queryRunner.query(`CREATE INDEX "IDX_6d8084ec9496e7334a4602707e" ON "channel_following" ("followerId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_2e230dd45a10e671d781d99f3e" ON "channel_following" ("followerId", "followeeId") `);
await queryRunner.query(`CREATE TABLE "channel_note_pining" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "channelId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, CONSTRAINT "PK_44f7474496bcf2e4b741681146d" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_8125f950afd3093acb10d2db8a" ON "channel_note_pining" ("channelId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_f36fed37d6d4cdcc68c803cd9c" ON "channel_note_pining" ("channelId", "noteId") `);
await queryRunner.query(`ALTER TABLE "note" ADD "channelId" character varying(32) DEFAULT null`);
await queryRunner.query(`CREATE INDEX "IDX_f22169eb10657bded6d875ac8f" ON "note" ("channelId") `);
await queryRunner.query(`ALTER TABLE "channel" ADD CONSTRAINT "FK_823bae55bd81b3be6e05cff4383" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "channel" ADD CONSTRAINT "FK_999da2bcc7efadbfe0e92d3bc19" FOREIGN KEY ("bannerId") REFERENCES "drive_file"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_f22169eb10657bded6d875ac8f9" FOREIGN KEY ("channelId") REFERENCES "channel"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "channel_following" ADD CONSTRAINT "FK_0e43068c3f92cab197c3d3cd86e" FOREIGN KEY ("followeeId") REFERENCES "channel"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "channel_following" ADD CONSTRAINT "FK_6d8084ec9496e7334a4602707e1" FOREIGN KEY ("followerId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "channel_note_pining" ADD CONSTRAINT "FK_8125f950afd3093acb10d2db8a8" FOREIGN KEY ("channelId") REFERENCES "channel"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "channel_note_pining" ADD CONSTRAINT "FK_10b19ef67d297ea9de325cd4502" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "channel_note_pining" DROP CONSTRAINT "FK_10b19ef67d297ea9de325cd4502"`);
await queryRunner.query(`ALTER TABLE "channel_note_pining" DROP CONSTRAINT "FK_8125f950afd3093acb10d2db8a8"`);
await queryRunner.query(`ALTER TABLE "channel_following" DROP CONSTRAINT "FK_6d8084ec9496e7334a4602707e1"`);
await queryRunner.query(`ALTER TABLE "channel_following" DROP CONSTRAINT "FK_0e43068c3f92cab197c3d3cd86e"`);
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_f22169eb10657bded6d875ac8f9"`);
await queryRunner.query(`ALTER TABLE "channel" DROP CONSTRAINT "FK_999da2bcc7efadbfe0e92d3bc19"`);
await queryRunner.query(`ALTER TABLE "channel" DROP CONSTRAINT "FK_823bae55bd81b3be6e05cff4383"`);
await queryRunner.query(`DROP INDEX "IDX_f22169eb10657bded6d875ac8f"`);
await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "channelId"`);
await queryRunner.query(`DROP INDEX "IDX_f36fed37d6d4cdcc68c803cd9c"`);
await queryRunner.query(`DROP INDEX "IDX_8125f950afd3093acb10d2db8a"`);
await queryRunner.query(`DROP TABLE "channel_note_pining"`);
await queryRunner.query(`DROP INDEX "IDX_2e230dd45a10e671d781d99f3e"`);
await queryRunner.query(`DROP INDEX "IDX_6d8084ec9496e7334a4602707e"`);
await queryRunner.query(`DROP INDEX "IDX_0e43068c3f92cab197c3d3cd86"`);
await queryRunner.query(`DROP INDEX "IDX_11e71f2511589dcc8a4d3214f9"`);
await queryRunner.query(`DROP TABLE "channel_following"`);
await queryRunner.query(`DROP INDEX "IDX_094b86cd36bb805d1aa1e8cc9a"`);
await queryRunner.query(`DROP INDEX "IDX_0f58c11241e649d2a638a8de94"`);
await queryRunner.query(`DROP INDEX "IDX_823bae55bd81b3be6e05cff438"`);
await queryRunner.query(`DROP INDEX "IDX_29ef80c6f13bcea998447fce43"`);
await queryRunner.query(`DROP INDEX "IDX_71cb7b435b7c0d4843317e7e16"`);
await queryRunner.query(`DROP TABLE "channel"`);
}
}

View File

@ -0,0 +1,14 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class channel21596786425167 implements MigrationInterface {
name = 'channel21596786425167'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "channel_following" ADD "readCursor" TIMESTAMP WITH TIME ZONE NOT NULL`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "channel_following" DROP COLUMN "readCursor"`);
}
}

View File

@ -0,0 +1,14 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class objectStorageSetPublicRead1597230137744 implements MigrationInterface {
name = 'objectStorageSetPublicRead1597230137744'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageSetPublicRead" boolean NOT NULL DEFAULT false`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageSetPublicRead"`);
}
}

View File

@ -0,0 +1,16 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class IncludingNotificationTypes1597236229720 implements MigrationInterface {
name = 'IncludingNotificationTypes1597236229720'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`CREATE TYPE "user_profile_includingnotificationtypes_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`);
await queryRunner.query(`ALTER TABLE "user_profile" ADD "includingNotificationTypes" "user_profile_includingnotificationtypes_enum" array`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "includingNotificationTypes"`);
await queryRunner.query(`DROP TYPE "user_profile_includingnotificationtypes_enum"`);
}
}

View File

@ -0,0 +1,14 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class addSensitiveIndex1597385880794 implements MigrationInterface {
name = 'addSensitiveIndex1597385880794'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`CREATE INDEX "IDX_a7eba67f8b3fa27271e85d2e26" ON "drive_file" ("isSensitive") `);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP INDEX "IDX_a7eba67f8b3fa27271e85d2e26"`);
}
}

View File

@ -0,0 +1,27 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class channelUnread1597459042300 implements MigrationInterface {
name = 'channelUnread1597459042300'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`TRUNCATE TABLE "note_unread"`, undefined);
await queryRunner.query(`ALTER TABLE "channel_following" DROP COLUMN "readCursor"`);
await queryRunner.query(`ALTER TABLE "note_unread" ADD "isMentioned" boolean NOT NULL`);
await queryRunner.query(`ALTER TABLE "note_unread" ADD "noteChannelId" character varying(32)`);
await queryRunner.query(`CREATE INDEX "IDX_25b1dd384bec391b07b74b861c" ON "note_unread" ("isMentioned") `);
await queryRunner.query(`CREATE INDEX "IDX_89a29c9237b8c3b6b3cbb4cb30" ON "note_unread" ("isSpecified") `);
await queryRunner.query(`CREATE INDEX "IDX_29e8c1d579af54d4232939f994" ON "note_unread" ("noteUserId") `);
await queryRunner.query(`CREATE INDEX "IDX_6a57f051d82c6d4036c141e107" ON "note_unread" ("noteChannelId") `);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP INDEX "IDX_6a57f051d82c6d4036c141e107"`);
await queryRunner.query(`DROP INDEX "IDX_29e8c1d579af54d4232939f994"`);
await queryRunner.query(`DROP INDEX "IDX_89a29c9237b8c3b6b3cbb4cb30"`);
await queryRunner.query(`DROP INDEX "IDX_25b1dd384bec391b07b74b861c"`);
await queryRunner.query(`ALTER TABLE "note_unread" DROP COLUMN "noteChannelId"`);
await queryRunner.query(`ALTER TABLE "note_unread" DROP COLUMN "isMentioned"`);
await queryRunner.query(`ALTER TABLE "channel_following" ADD "readCursor" TIMESTAMP WITH TIME ZONE NOT NULL`);
}
}

View File

@ -0,0 +1,16 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class ChannelNoteIdDescIndex1597893996136 implements MigrationInterface {
name = 'ChannelNoteIdDescIndex1597893996136'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP INDEX "IDX_f22169eb10657bded6d875ac8f"`);
await queryRunner.query(`CREATE INDEX "IDX_note_on_channelId_and_id_desc" ON "note" ("channelId", "id" desc)`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP INDEX "IDX_note_on_channelId_and_id_desc"`);
await queryRunner.query(`CREATE INDEX "IDX_f22169eb10657bded6d875ac8f" ON "note" ("channelId") `);
}
}

View File

@ -0,0 +1,20 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class mutingNotificationTypes1600353287890 implements MigrationInterface {
name = 'mutingNotificationTypes1600353287890'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "includingNotificationTypes"`);
await queryRunner.query(`DROP TYPE "public"."user_profile_includingnotificationtypes_enum"`);
await queryRunner.query(`CREATE TYPE "user_profile_mutingnotificationtypes_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`);
await queryRunner.query(`ALTER TABLE "user_profile" ADD "mutingNotificationTypes" "user_profile_mutingnotificationtypes_enum" array NOT NULL DEFAULT '{}'`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "mutingNotificationTypes"`);
await queryRunner.query(`DROP TYPE "user_profile_mutingnotificationtypes_enum"`);
await queryRunner.query(`CREATE TYPE "public"."user_profile_includingnotificationtypes_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`);
await queryRunner.query(`ALTER TABLE "user_profile" ADD "includingNotificationTypes" "user_profile_includingnotificationtypes_enum" array`);
}
}

View File

@ -0,0 +1,32 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class refineAbuseUserReport1603094348345 implements MigrationInterface {
name = 'refineAbuseUserReport1603094348345'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP CONSTRAINT "FK_d049123c413e68ca52abe734203"`);
await queryRunner.query(`DROP INDEX "IDX_d049123c413e68ca52abe73420"`);
await queryRunner.query(`DROP INDEX "IDX_5cd442c3b2e74fdd99dae20243"`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" RENAME COLUMN "userId" TO "targetUserId"`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD "assigneeId" character varying(32)`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD "resolved" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "comment"`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD "comment" character varying(2048) NOT NULL DEFAULT '{}'::varchar[]`);
await queryRunner.query(`CREATE INDEX "IDX_2b15aaf4a0dc5be3499af7ab6a" ON "abuse_user_report" ("resolved") `);
await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD CONSTRAINT "FK_08b883dd5fdd6f9c4c1572b36de" FOREIGN KEY ("assigneeId") REFERENCES "user"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP CONSTRAINT "FK_08b883dd5fdd6f9c4c1572b36de"`);
await queryRunner.query(`DROP INDEX "IDX_2b15aaf4a0dc5be3499af7ab6a"`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "comment"`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD "comment" character varying(512) NOT NULL DEFAULT '{}'::varchar[]`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "resolved"`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "assigneeId"`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" RENAME COLUMN "targetUserId" TO "userId"`);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_5cd442c3b2e74fdd99dae20243" ON "abuse_user_report" ("userId", "reporterId") `);
await queryRunner.query(`CREATE INDEX "IDX_d049123c413e68ca52abe73420" ON "abuse_user_report" ("userId") `);
await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD CONSTRAINT "FK_d049123c413e68ca52abe734203" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
}
}

View File

@ -0,0 +1,20 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class refineAbuseUserReport21603095701770 implements MigrationInterface {
name = 'refineAbuseUserReport21603095701770'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD "targetUserHost" character varying(128)`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD "reporterHost" character varying(128)`);
await queryRunner.query(`CREATE INDEX "IDX_4ebbf7f93cdc10e8d1ef2fc6cd" ON "abuse_user_report" ("targetUserHost") `);
await queryRunner.query(`CREATE INDEX "IDX_f8d8b93740ad12c4ce8213a199" ON "abuse_user_report" ("reporterHost") `);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP INDEX "IDX_f8d8b93740ad12c4ce8213a199"`);
await queryRunner.query(`DROP INDEX "IDX_4ebbf7f93cdc10e8d1ef2fc6cd"`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "reporterHost"`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "targetUserHost"`);
}
}

View 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"`);
}
}

View 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"`);
}
}

View 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`);
}
}

View 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"`);
}
}

View 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`);
}
}

View 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"`);
}
}

View 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"`);
}
}

View 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"`);
}
}

View 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"`);
}
}

View File

@ -1,7 +1,7 @@
{
"name": "misskey",
"author": "syuilo <syuilotan@yahoo.co.jp>",
"version": "12.43.0",
"version": "12.62.0",
"codename": "indigo",
"repository": {
"type": "git",
@ -30,27 +30,26 @@
"resolutions": {
"chokidar": "^3.3.1",
"constantinople": "^4.0.1",
"core-js": "^3.6.5",
"gulp/gulp-cli/yargs/yargs-parser": "5.0.0-security.0",
"lodash": "^4.17.19",
"mocha/serialize-javascript": "^3.1.0"
"jsonld/rdf-canonize/node-forge": "0.10.0",
"lodash": "^4.17.20"
},
"dependencies": {
"@babel/plugin-transform-runtime": "7.10.3",
"@elastic/elasticsearch": "7.8.0",
"@fortawesome/fontawesome-svg-core": "1.2.29",
"@fortawesome/free-brands-svg-icons": "5.13.1",
"@fortawesome/free-regular-svg-icons": "5.13.1",
"@fortawesome/free-solid-svg-icons": "5.13.1",
"@fortawesome/vue-fontawesome": "0.1.10",
"@babel/plugin-transform-runtime": "7.12.1",
"@elastic/elasticsearch": "7.10.0",
"@fortawesome/fontawesome-svg-core": "1.2.32",
"@fortawesome/free-brands-svg-icons": "5.15.1",
"@fortawesome/free-regular-svg-icons": "5.15.1",
"@fortawesome/free-solid-svg-icons": "5.15.1",
"@fortawesome/vue-fontawesome": "3.0.0-2",
"@koa/cors": "3.1.0",
"@koa/multer": "3.0.0",
"@koa/router": "9.0.1",
"@sinonjs/fake-timers": "6.0.1",
"@syuilo/aiscript": "0.8.0",
"@syuilo/aiscript": "0.11.1",
"@types/bcryptjs": "2.4.2",
"@types/bull": "3.14.0",
"@types/cbor": "5.0.0",
"@types/bull": "3.14.4",
"@types/cbor": "5.0.1",
"@types/dateformat": "3.0.1",
"@types/double-ended-queue": "2.1.1",
"@types/escape-regexp": "0.0.0",
@ -60,7 +59,7 @@
"@types/gulp-replace": "0.0.31",
"@types/is-url": "1.2.28",
"@types/js-yaml": "3.12.5",
"@types/jsdom": "16.2.3",
"@types/jsdom": "16.2.5",
"@types/jsonld": "1.5.1",
"@types/katex": "0.11.0",
"@types/koa": "2.11.3",
@ -72,9 +71,9 @@
"@types/koa-send": "4.1.2",
"@types/koa-views": "2.0.4",
"@types/koa__cors": "3.0.1",
"@types/koa__multer": "2.0.1",
"@types/koa__multer": "2.0.2",
"@types/koa__router": "8.0.2",
"@types/markdown-it": "10.0.1",
"@types/markdown-it": "10.0.3",
"@types/mocha": "7.0.2",
"@types/node": "14.0.22",
"@types/node-fetch": "2.5.7",
@ -82,88 +81,87 @@
"@types/nprogress": "0.2.0",
"@types/oauth": "0.9.1",
"@types/parse5": "5.0.3",
"@types/parsimmon": "1.10.2",
"@types/parsimmon": "1.10.5",
"@types/portscanner": "2.1.0",
"@types/pug": "2.0.4",
"@types/qrcode": "1.3.4",
"@types/qrcode": "1.3.5",
"@types/random-seed": "0.3.3",
"@types/ratelimiter": "2.1.28",
"@types/redis": "2.8.25",
"@types/rename": "1.0.1",
"@types/ratelimiter": "3.4.0",
"@types/redis": "2.8.28",
"@types/rename": "1.0.2",
"@types/request-stats": "3.0.0",
"@types/rimraf": "3.0.0",
"@types/seedrandom": "2.4.28",
"@types/sharp": "0.25.0",
"@types/sharp": "0.26.0",
"@types/sinonjs__fake-timers": "6.0.1",
"@types/speakeasy": "2.0.5",
"@types/tinycolor2": "1.4.2",
"@types/tmp": "0.2.0",
"@types/uuid": "8.0.0",
"@types/uuid": "8.3.0",
"@types/web-push": "3.3.0",
"@types/webpack": "4.41.18",
"@types/webpack": "4.41.25",
"@types/webpack-stream": "3.2.11",
"@types/websocket": "1.0.1",
"@types/ws": "7.2.6",
"@typescript-eslint/parser": "3.6.0",
"@types/ws": "7.4.0",
"@typescript-eslint/parser": "4.6.1",
"@vue/compiler-sfc": "3.0.3",
"abort-controller": "3.0.0",
"apexcharts": "3.19.3",
"apexcharts": "3.22.2",
"autobind-decorator": "2.4.0",
"autosize": "4.0.2",
"autwh": "0.1.0",
"aws-sdk": "2.713.0",
"aws-sdk": "2.787.0",
"bcryptjs": "2.4.3",
"blurhash": "1.1.3",
"bull": "3.15.0",
"bull": "3.18.1",
"cafy": "15.2.1",
"cbor": "5.0.2",
"cbor": "5.1.0",
"chalk": "4.1.0",
"chart.js": "2.9.3",
"cli-highlight": "2.1.4",
"chart.js": "2.9.4",
"cli-highlight": "2.1.9",
"commander": "4.1.1",
"content-disposition": "0.5.3",
"core-js": "3.6.5",
"core-js": "3.7.0",
"crc-32": "1.2.0",
"css-loader": "3.6.0",
"css-loader": "5.0.1",
"cssnano": "4.1.10",
"dateformat": "3.0.3",
"deep-entries": "3.1.0",
"diskusage": "1.1.3",
"double-ended-queue": "2.1.0-0",
"escape-regexp": "0.0.1",
"eslint": "7.4.0",
"eslint-plugin-vue": "6.2.2",
"eventemitter3": "4.0.4",
"eslint": "7.14.0",
"eslint-plugin-vue": "7.1.0",
"eventemitter3": "4.0.7",
"feed": "4.2.1",
"fibers": "5.0.0",
"file-type": "14.6.2",
"file-type": "16.0.1",
"fluent-ffmpeg": "2.1.2",
"glob": "7.1.6",
"got": "11.8.0",
"gulp": "4.0.2",
"gulp-clean-css": "4.3.0",
"gulp-dart-sass": "1.0.2",
"gulp-rename": "2.0.0",
"gulp-replace": "1.0.0",
"gulp-sourcemaps": "2.6.5",
"gulp-terser": "1.2.0",
"gulp-tslint": "8.1.4",
"gulp-typescript": "6.0.0-alpha.1",
"hard-source-webpack-plugin": "0.13.1",
"hcaptcha": "0.0.2",
"html-minifier": "4.0.0",
"http-proxy-agent": "4.0.1",
"http-signature": "1.3.4",
"http-signature": "1.3.5",
"https-proxy-agent": "5.0.0",
"idb-keyval": "3.2.0",
"insert-text-at-cursor": "0.3.0",
"is-root": "2.1.0",
"is-svg": "4.2.1",
"js-yaml": "3.14.0",
"jsdom": "16.3.0",
"jsdom": "16.4.0",
"json5": "2.1.3",
"json5-loader": "4.0.0",
"jsonld": "3.1.1",
"json5-loader": "4.0.1",
"jsonld": "3.2.0",
"jsrsasign": "8.0.20",
"katex": "0.11.1",
"katex": "0.12.0",
"koa": "2.13.0",
"koa-bodyparser": "4.3.0",
"koa-favicon": "2.1.0",
@ -172,104 +170,97 @@
"koa-mount": "4.0.0",
"koa-send": "5.0.1",
"koa-slow": "2.1.0",
"koa-views": "6.3.0",
"koa-views": "6.3.1",
"langmap": "0.0.16",
"lookup-dns-cache": "2.1.0",
"markdown-it": "11.0.0",
"markdown-it-anchor": "5.3.0",
"mocha": "8.0.1",
"markdown-it": "11.0.1",
"markdown-it-anchor": "6.0.1",
"mocha": "8.2.1",
"moji": "0.5.1",
"ms": "2.1.2",
"multer": "1.4.2",
"nested-property": "2.0.1",
"node-fetch": "2.6.0",
"nodemailer": "6.4.10",
"nprogress": "0.2.0",
"nested-property": "4.0.0",
"node-fetch": "2.6.1",
"nodemailer": "6.4.16",
"object-assign-deep": "0.4.0",
"os-utils": "0.0.14",
"parse5": "6.0.0",
"parsimmon": "1.14.0",
"pg": "8.3.0",
"portal-vue": "2.1.7",
"p-cancelable": "2.0.0",
"parse5": "6.0.1",
"parsimmon": "1.16.0",
"pg": "8.5.1",
"portscanner": "2.2.0",
"postcss-loader": "3.0.0",
"prismjs": "1.20.0",
"probe-image-size": "5.0.0",
"postcss": "8.1.14",
"postcss-loader": "4.1.0",
"prismjs": "1.22.0",
"probe-image-size": "6.0.0",
"promise-limit": "2.7.0",
"promise-sequential": "1.1.1",
"pug": "2.0.4",
"punycode": "2.1.1",
"pureimage": "0.2.1",
"pureimage": "0.2.5",
"qrcode": "1.4.4",
"random-seed": "0.3.0",
"randomcolor": "0.5.4",
"ratelimiter": "3.4.1",
"recaptcha-promise": "0.1.3",
"re2": "1.15.8",
"recaptcha-promise": "1.0.0",
"reconnecting-websocket": "4.4.0",
"redis": "3.0.2",
"redis-lock": "0.1.4",
"reflect-metadata": "0.1.13",
"regenerator-runtime": "0.13.5",
"regenerator-runtime": "0.13.7",
"rename": "1.0.4",
"request-stats": "3.0.0",
"require-all": "3.0.0",
"rimraf": "3.0.2",
"rndstr": "1.0.0",
"s-age": "1.1.2",
"sass": "1.26.10",
"sass-loader": "9.0.2",
"sass": "1.29.0",
"sass-loader": "10.1.0",
"seedrandom": "3.0.5",
"sharp": "0.25.4",
"sharp": "0.26.2",
"speakeasy": "2.0.0",
"stringz": "2.1.0",
"style-loader": "1.2.1",
"style-loader": "2.0.0",
"summaly": "2.4.0",
"syslog-pro": "1.0.0",
"systeminformation": "4.26.9",
"systeminformation": "4.30.7",
"syuilo-password-strength": "0.0.1",
"textarea-caret": "3.1.0",
"three": "0.117.1",
"tinycolor2": "1.4.1",
"tinycolor2": "1.4.2",
"tmp": "0.2.1",
"ts-loader": "8.0.0",
"ts-node": "8.10.2",
"tslint": "6.1.2",
"ts-loader": "8.0.9",
"ts-node": "9.1.0",
"tslint": "6.1.3",
"tslint-sonarts": "1.9.0",
"typeorm": "0.2.25",
"typescript": "3.9.6",
"typeorm": "0.2.29",
"typescript": "4.0.5",
"ulid": "2.3.0",
"url-loader": "4.1.0",
"uuid": "8.2.0",
"v-animate-css": "0.0.3",
"url-loader": "4.1.1",
"uuid": "8.3.1",
"v-debounce": "0.1.2",
"vue": "2.6.11",
"vanilla-tilt": "1.7.0",
"vue": "3.0.3",
"vue-color": "2.7.1",
"vue-content-loading": "1.6.0",
"vue-cropperjs": "4.1.0",
"vue-i18n": "8.18.2",
"vue-json-pretty": "1.6.5",
"vue-loader": "15.9.3",
"vue-marquee-text-component": "1.1.1",
"vue-meta": "2.4.0",
"vue-prism-component": "1.2.0",
"vue-prism-editor": "0.6.1",
"vue-router": "3.3.4",
"vue-i18n": "9.0.0-beta.7",
"vue-json-pretty": "1.7.1",
"vue-loader": "16.0.0",
"vue-prism-editor": "2.0.0-alpha.2",
"vue-router": "4.0.0-rc.6",
"vue-style-loader": "4.1.2",
"vue-svg-inline-loader-corejs3": "1.5.0",
"vue-template-compiler": "2.6.11",
"vuedraggable": "2.24.0",
"vuex": "3.5.1",
"vuex-persistedstate": "3.0.1",
"vuedraggable": "4.0.1",
"vuex": "4.0.0-rc.2",
"vuex-persistedstate": "3.1.0",
"web-push": "3.4.4",
"webpack": "5.0.0-beta.22",
"webpack-cli": "3.3.12",
"websocket": "1.0.31",
"ws": "7.3.1",
"webpack": "5.9.0",
"webpack-cli": "4.2.0",
"websocket": "1.0.32",
"ws": "7.4.0",
"xev": "2.0.1"
},
"devDependencies": {
"@types/chai": "4.2.11",
"@types/fluent-ffmpeg": "2.1.14",
"@types/fluent-ffmpeg": "2.1.16",
"chai": "4.2.0",
"cross-env": "7.0.2"
}

View File

@ -1,21 +0,0 @@
type Obj = { [key: string]: any };
declare module 'nested-property' {
interface IHasNestedPropertyOptions {
own?: boolean;
}
interface IIsInNestedPropertyOptions {
validPath?: boolean;
}
export function set<T>(object: T, property: string, value: any): T;
export function get(object: Obj, property: string): any;
export function has(object: Obj, property: string, options?: IHasNestedPropertyOptions): boolean;
export function hasOwn(object: Obj, property: string, options?: IHasNestedPropertyOptions): boolean;
export function isIn(object: Obj, property: string, objectInPath: Obj, options?: IIsInNestedPropertyOptions): boolean;
}

12
src/client/.eslintrc Normal file
View File

@ -0,0 +1,12 @@
{
"globals": {
"_DEV_": false,
"_LANGS_": false,
"_VERSION_": false,
"_ENV_": false,
"_PERF_PREFIX_": false,
"_DATA_TRANSFER_DRIVE_FILE_": false,
"_DATA_TRANSFER_DRIVE_FOLDER_": false,
"_DATA_TRANSFER_DECK_COLUMN_": false
}
}

8
src/client/@types/global.d.ts vendored Normal file
View File

@ -0,0 +1,8 @@
declare const _LANGS_: string[];
declare const _VERSION_: string;
declare const _ENV_: string;
declare const _DEV_: boolean;
declare const _PERF_PREFIX_: string;
declare const _DATA_TRANSFER_DRIVE_FILE_: string;
declare const _DATA_TRANSFER_DRIVE_FOLDER_: string;
declare const _DATA_TRANSFER_DECK_COLUMN_: string;

5
src/client/@types/vue.d.ts vendored Normal file
View File

@ -0,0 +1,5 @@
declare module '*.vue' {
import { defineComponent } from 'vue';
const component: ReturnType<typeof defineComponent>;
export default component;
}

12
src/client/@types/vuex-shim.d.ts vendored Normal file
View File

@ -0,0 +1,12 @@
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>;
}
}

View File

@ -1,765 +0,0 @@
<template>
<div class="mk-app" v-hotkey.global="keymap">
<header class="header">
<div class="title" ref="title">
<transition :name="$store.state.device.animation ? 'header' : ''" mode="out-in" appear>
<button class="_button back" v-if="canBack" @click="back()"><fa :icon="faChevronLeft"/></button>
</transition>
<transition :name="$store.state.device.animation ? 'header' : ''" mode="out-in" appear>
<div class="body" :key="pageKey">
<div class="default">
<portal-target name="avatar" slim/>
<h1 class="title"><portal-target name="icon" slim/><portal-target name="title" slim/></h1>
</div>
<div class="custom">
<portal-target name="header" slim/>
</div>
</div>
</transition>
</div>
<div class="sub">
<button v-if="widgetsEditMode" class="_button edit active" @click="widgetsEditMode = false"><fa :icon="faGripVertical"/></button>
<button v-else class="_button edit" @click="widgetsEditMode = true"><fa :icon="faGripVertical"/></button>
<div class="search">
<fa :icon="faSearch"/>
<input type="search" :placeholder="$t('search')" v-model="searchQuery" v-autocomplete="{ model: 'searchQuery' }" :disabled="searchWait" @keypress="searchKeypress"/>
</div>
<button v-if="$store.getters.isSignedIn" class="post _buttonPrimary" @click="post()"><fa :icon="faPencilAlt"/></button>
<x-clock v-if="isDesktop" class="clock"/>
</div>
</header>
<x-sidebar ref="nav"/>
<div class="contents" ref="contents" :class="{ wallpaper }">
<main ref="main">
<div class="content">
<transition :name="$store.state.device.animation ? 'page' : ''" mode="out-in" @enter="onTransition">
<keep-alive :include="['index']">
<router-view></router-view>
</keep-alive>
</transition>
</div>
<div class="powerd-by" :class="{ visible: !$store.getters.isSignedIn }">
<b><router-link to="/">{{ host }}</router-link></b>
<small>Powered by <a href="https://github.com/syuilo/misskey" target="_blank">Misskey</a></small>
</div>
</main>
<template v-if="isDesktop">
<div v-for="place in ['left', 'right']" ref="widgets" class="widgets" :class="{ edit: widgetsEditMode, fixed: $store.state.device.fixedWidgetsPosition, empty: widgets[place].length === 0 && !widgetsEditMode }" :key="place">
<div class="spacer"></div>
<div class="container" v-if="widgetsEditMode">
<mk-button primary @click="addWidget(place)" class="add"><fa :icon="faPlus"/></mk-button>
<x-draggable
:list="widgets[place]"
handle=".handle"
animation="150"
class="sortable"
@sort="onWidgetSort"
>
<div v-for="widget in widgets[place]" class="customize-container _panel" :key="widget.id">
<header>
<span class="handle"><fa :icon="faBars"/></span>{{ $t('_widgets.' + widget.name) }}<button class="remove _button" @click="removeWidget(widget)"><fa :icon="faTimes"/></button>
</header>
<div @click="widgetFunc(widget.id)">
<component class="_close_ _forceContainerFull_" :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true"/>
</div>
</div>
</x-draggable>
</div>
<div class="container" v-else>
<component v-for="widget in widgets[place]" class="_close_ _forceContainerFull_" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget"/>
</div>
</div>
</template>
</div>
<div class="buttons">
<button class="button nav _button" @click="showNav" ref="navButton"><fa :icon="faBars"/><i v-if="navIndicated"><fa :icon="faCircle"/></i></button>
<button v-if="$route.name === 'index'" class="button home _button" @click="top()"><fa :icon="faHome"/></button>
<button v-else class="button home _button" @click="$router.push('/')"><fa :icon="faHome"/></button>
<button v-if="$store.getters.isSignedIn" class="button notifications _button" @click="$router.push('/my/notifications')"><fa :icon="faBell"/><i v-if="$store.state.i.hasUnreadNotification"><fa :icon="faCircle"/></i></button>
<button v-if="$store.getters.isSignedIn" class="button post _buttonPrimary" @click="post()"><fa :icon="faPencilAlt"/></button>
</div>
<button v-if="$store.getters.isSignedIn" class="post _buttonPrimary" @click="post()"><fa :icon="faPencilAlt"/></button>
<stream-indicator v-if="$store.getters.isSignedIn"/>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import { faGripVertical, faChevronLeft, faHashtag, faBroadcastTower, faFireAlt, faEllipsisH, faPencilAlt, faBars, faTimes, faSearch, faUserCog, faCog, faUser, faHome, faStar, faCircle, faAt, faListUl, faPlus, faUserClock, faUsers, faTachometerAlt, faExchangeAlt, faGlobe, faChartBar, faCloud, faServer, faInfoCircle, faQuestionCircle, faProjectDiagram } from '@fortawesome/free-solid-svg-icons';
import { faBell, faEnvelope, faLaugh, faComments } from '@fortawesome/free-regular-svg-icons';
import { v4 as uuid } from 'uuid';
import { host } from './config';
import { search } from './scripts/search';
import { StickySidebar } from './scripts/sticky-sidebar';
import { widgets } from './widgets';
import XSidebar from './components/sidebar.vue';
const DESKTOP_THRESHOLD = 1100;
export default Vue.extend({
components: {
XSidebar,
XClock: () => import('./components/header-clock.vue').then(m => m.default),
MkButton: () => import('./components/ui/button.vue').then(m => m.default),
XDraggable: () => import('vuedraggable'),
},
data() {
return {
host: host,
pageKey: 0,
searching: false,
connection: null,
searchQuery: '',
searchWait: false,
widgetsEditMode: false,
isDesktop: window.innerWidth >= DESKTOP_THRESHOLD,
canBack: false,
menuDef: this.$store.getters.nav({}),
wallpaper: localStorage.getItem('wallpaper') != null,
faGripVertical, faChevronLeft, faComments, faHashtag, faBroadcastTower, faFireAlt, faEllipsisH, faPencilAlt, faBars, faTimes, faBell, faSearch, faUserCog, faCog, faUser, faHome, faStar, faCircle, faAt, faEnvelope, faListUl, faPlus, faUserClock, faLaugh, faUsers, faTachometerAlt, faExchangeAlt, faGlobe, faChartBar, faCloud, faServer, faProjectDiagram
};
},
computed: {
keymap(): any {
return {
'd': () => {
if (this.$store.state.device.syncDeviceDarkMode) return;
this.$store.commit('device/set', { key: 'darkMode', value: !this.$store.state.device.darkMode });
},
'p': this.post,
'n': this.post,
's': this.search,
'h|/': this.help
};
},
widgets(): any[] {
if (this.$store.getters.isSignedIn) {
const widgets = this.$store.state.deviceUser.widgets;
return {
left: widgets.filter(x => x.place === 'left'),
right: widgets.filter(x => x.place == null || x.place === 'right'),
mobile: widgets.filter(x => x.place === 'mobile'),
};
} else {
return {
left: [],
right: [{
name: 'welcome',
id: 'a', place: 'right', data: {}
}, {
name: 'calendar',
id: 'b', place: 'right', data: {}
}, {
name: 'trends',
id: 'c', place: 'right', data: {}
}],
mobile: [],
};
}
},
menu(): string[] {
return this.$store.state.deviceUser.menu;
},
navIndicated(): boolean {
if (!this.$store.getters.isSignedIn) return false;
for (const def in this.menuDef) {
if (def === 'notifications') continue; // 通知は下にボタンとして表示されてるから
if (this.menuDef[def].indicated) return true;
}
return false;
}
},
watch: {
$route(to, from) {
this.pageKey++;
this.canBack = (window.history.length > 0 && !['index'].includes(to.name));
},
isDesktop() {
this.$nextTick(() => {
this.attachSticky();
});
}
},
created() {
document.documentElement.style.overflowY = 'scroll';
if (this.$store.getters.isSignedIn) {
this.connection = this.$root.stream.useSharedConnection('main');
this.connection.on('notification', this.onNotification);
if (this.$store.state.deviceUser.widgets.length === 0) {
this.$store.commit('deviceUser/setWidgets', [{
name: 'calendar',
id: 'a', place: 'right', data: {}
}, {
name: 'notifications',
id: 'b', place: 'right', data: {}
}, {
name: 'trends',
id: 'c', place: 'right', data: {}
}]);
}
}
},
mounted() {
const adjustTitlePosition = () => {
const left = this.$refs.main.getBoundingClientRect().left - this.$refs.nav.$el.offsetWidth;
if (left >= 0) {
this.$refs.title.style.left = left + 'px';
}
};
adjustTitlePosition();
const ro = new ResizeObserver((entries, observer) => {
adjustTitlePosition();
});
ro.observe(this.$refs.contents);
window.addEventListener('resize', adjustTitlePosition, { passive: true });
if (!this.isDesktop) {
window.addEventListener('resize', () => {
if (window.innerWidth >= DESKTOP_THRESHOLD) this.isDesktop = true;
}, { passive: true });
}
// widget follow
this.attachSticky();
},
methods: {
showNav() {
this.$refs.nav.show();
},
attachSticky() {
if (!this.isDesktop) return;
if (this.$store.state.device.fixedWidgetsPosition) return;
const stickyWidgetColumns = this.$refs.widgets.map(w => new StickySidebar(w.children[1], w.children[0], w.offsetTop));
window.addEventListener('scroll', () => {
for (const stickyWidgetColumn of stickyWidgetColumns) {
stickyWidgetColumn.calc(window.scrollY);
}
}, { passive: true });
},
top() {
window.scroll({ top: 0, behavior: 'smooth' });
},
help() {
this.$router.push('/docs/keyboard-shortcut');
},
back() {
if (this.canBack) window.history.back();
},
onTransition() {
if (window._scroll) window._scroll();
},
post() {
this.$root.post();
},
search() {
if (this.searching) return;
this.$root.dialog({
title: this.$t('search'),
input: true
}).then(async ({ canceled, result: query }) => {
if (canceled || query == null || query === '') return;
this.searching = true;
search(this, query).finally(() => {
this.searching = false;
});
});
},
searchKeypress(e) {
if (e.keyCode === 13) {
this.searchWait = true;
search(this, this.searchQuery).finally(() => {
this.searchWait = false;
this.searchQuery = '';
});
}
},
async onNotification(notification) {
if (document.visibilityState === 'visible') {
this.$root.stream.send('readNotification', {
id: notification.id
});
this.$root.new(await import('./components/toast.vue').then(m => m.default), {
notification
});
}
this.$root.sound('notification');
},
widgetFunc(id) {
this.$refs[id][0].setting();
},
onWidgetSort() {
this.saveHome();
},
async addWidget(place) {
const { canceled, result: widget } = await this.$root.dialog({
type: null,
title: this.$t('chooseWidget'),
select: {
items: widgets.map(widget => ({
value: widget,
text: this.$t('_widgets.' + widget),
}))
},
showCancelButton: true
});
if (canceled) return;
this.$store.commit('deviceUser/addWidget', {
name: widget,
id: uuid(),
place: place,
data: {}
});
},
removeWidget(widget) {
this.$store.commit('deviceUser/removeWidget', widget);
},
saveHome() {
this.$store.commit('deviceUser/setWidgets', [...this.widgets.left, ...this.widgets.right, ...this.widgets.mobile]);
}
}
});
</script>
<style lang="scss" scoped>
.mk-app {
$header-height: 60px;
$nav-width: 250px; // TODO: どこかに集約したい
$nav-icon-only-width: 80px; // TODO: どこかに集約したい
$main-width: 670px;
$ui-font-size: 1em; // TODO: どこかに集約したい
$nav-icon-only-threshold: 1279px; // TODO: どこかに集約したい
$nav-hide-threshold: 650px; // TODO: どこかに集約したい
$header-sub-hide-threshold: 1090px;
$left-widgets-hide-threshold: 1600px;
$right-widgets-hide-threshold: 1090px;
// ほんとは単に 100vh と書きたいところだが... https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
min-height: calc(var(--vh, 1vh) * 100);
box-sizing: border-box;
padding-top: $header-height;
&, > .header > .body {
display: flex;
margin: 0 auto;
}
> .header {
position: fixed;
z-index: 1000;
top: 0;
right: 0;
height: $header-height;
width: calc(100% - #{$nav-width});
//background-color: var(--panel);
-webkit-backdrop-filter: blur(32px);
backdrop-filter: blur(32px);
background-color: var(--header);
border-bottom: solid 1px var(--divider);
@media (max-width: $nav-icon-only-threshold) {
width: calc(100% - #{$nav-icon-only-width});
}
@media (max-width: $nav-hide-threshold) {
width: 100%;
}
> .title {
position: relative;
line-height: $header-height;
height: $header-height;
max-width: $main-width;
text-align: center;
> .back {
position: absolute;
z-index: 1;
top: 0;
left: 0;
height: $header-height;
width: $header-height;
}
> .body {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
height: $header-height;
> .default {
padding: 0 $header-height;
> .avatar {
$size: 32px;
display: inline-block;
width: $size;
height: $size;
vertical-align: bottom;
margin: (($header-height - $size) / 2) 8px (($header-height - $size) / 2) 0;
}
> .title {
display: inline-block;
font-size: $ui-font-size;
margin: 0;
line-height: $header-height;
> [data-icon] {
margin-right: 8px;
}
}
}
> .custom {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
}
}
}
> .sub {
$post-button-size: 42px;
$post-button-margin: (($header-height - $post-button-size) / 2);
display: flex;
align-items: center;
position: absolute;
top: 0;
right: 16px;
height: $header-height;
@media (max-width: $header-sub-hide-threshold) {
display: none;
}
> .edit {
padding: 16px;
&.active {
color: var(--accent);
}
}
> .search {
position: relative;
> input {
width: 220px;
box-sizing: border-box;
margin-right: 8px;
padding: 0 12px 0 42px;
font-size: 1rem;
line-height: 38px;
border: none;
border-radius: 38px;
color: var(--fg);
background: var(--bg);
-webkit-appearance: textfield;
&:focus {
outline: none;
}
}
> [data-icon] {
position: absolute;
top: 0;
left: 16px;
height: 100%;
pointer-events: none;
font-size: 16px;
}
}
> .post {
width: $post-button-size;
height: $post-button-size;
margin-left: $post-button-margin;
border-radius: 100%;
font-size: 16px;
}
> .clock {
margin-left: 8px;
}
}
}
> .contents {
display: flex;
margin: 0 auto;
min-width: 0;
&.wallpaper {
background: var(--wallpaperOverlay);
backdrop-filter: blur(4px);
}
> main {
width: $main-width;
min-width: 0;
> .content {
> * {
// ほんとは単に calc(100vh - #{$header-height}) と書きたいところだが... https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
min-height: calc((var(--vh, 1vh) * 100) - #{$header-height});
box-sizing: border-box;
padding: var(--margin);
&.full {
padding: 0 var(--margin);
}
}
}
> .powerd-by {
font-size: 14px;
text-align: center;
margin: 32px 0;
visibility: hidden;
&.visible {
visibility: visible;
}
&:not(.visible) {
@media (min-width: 850px) {
display: none;
}
}
@media (max-width: 500px) {
margin-top: 16px;
}
> small {
display: block;
margin-top: 8px;
opacity: 0.5;
@media (max-width: 500px) {
margin-top: 4px;
}
}
}
}
> .widgets {
padding: 0 var(--margin);
box-shadow: 1px 0 0 0 var(--divider), -1px 0 0 0 var(--divider);
&.fixed {
position: sticky;
overflow: auto;
// ほんとは単に calc(100vh - #{$header-height}) と書きたいところだが... https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
height: calc((var(--vh, 1vh) * 100) - #{$header-height});
top: $header-height;
}
&:first-of-type {
order: -1;
@media (max-width: $left-widgets-hide-threshold) {
display: none;
}
}
&.empty {
display: none;
}
@media (max-width: $right-widgets-hide-threshold) {
display: none;
}
> .container {
position: sticky;
height: min-content;
// ほんとは単に calc(100vh - #{$header-height}) と書きたいところだが... https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
min-height: calc((var(--vh, 1vh) * 100) - #{$header-height});
padding: var(--margin) 0;
box-sizing: border-box;
> * {
margin: var(--margin) 0;
width: 300px;
&:first-child {
margin-top: 0;
}
&:last-child {
margin-bottom: 0;
}
}
}
> .add {
margin: 0 auto;
}
.customize-container {
margin: 8px 0;
> header {
position: relative;
line-height: 32px;
> .handle {
padding: 0 8px;
cursor: move;
}
> .remove {
position: absolute;
top: 0;
right: 0;
padding: 0 8px;
line-height: 32px;
}
}
> div {
padding: 8px;
> * {
pointer-events: none;
}
}
}
}
}
> .post {
display: none;
position: fixed;
z-index: 1000;
bottom: 32px;
right: 32px;
width: 64px;
height: 64px;
border-radius: 100%;
box-shadow: 0 3px 5px -1px rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12);
font-size: 22px;
@media (min-width: ($nav-hide-threshold + 1px)) {
display: block;
}
@media (min-width: ($header-sub-hide-threshold + 1px)) {
display: none;
}
}
> .buttons {
position: fixed;
z-index: 1000;
bottom: 0;
padding: 0 32px 32px 32px;
display: flex;
width: 100%;
box-sizing: border-box;
background: linear-gradient(0deg, var(--bg), var(--X1));
@media (max-width: 500px) {
padding: 0 16px 16px 16px;
}
@media (min-width: ($nav-hide-threshold + 1px)) {
display: none;
}
> .button {
position: relative;
padding: 0;
margin: auto;
width: 64px;
height: 64px;
border-radius: 100%;
box-shadow: 0 3px 5px -1px rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12);
&:first-child {
margin-left: 0;
}
&:last-child {
margin-right: 0;
}
> * {
font-size: 22px;
}
&:disabled {
cursor: default;
> * {
opacity: 0.5;
}
}
&:not(.post) {
background: var(--panel);
color: var(--fg);
&:hover {
background: var(--X2);
}
> i {
position: absolute;
top: 0;
left: 0;
color: var(--indicator);
font-size: 16px;
animation: blink 1s infinite;
}
}
}
}
}
</style>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,34 @@
// 常にメモリにロードしておく必要がないような設定情報を保管するストレージ
const PREFIX = 'miux:';
export const defaultDeviceSettings = {
sound_masterVolume: 0.3,
sound_note: { type: 'syuilo/down', volume: 1 },
sound_noteMy: { type: 'syuilo/up', volume: 1 },
sound_notification: { type: 'syuilo/pope2', volume: 1 },
sound_chat: { type: 'syuilo/pope1', volume: 1 },
sound_chatBg: { type: 'syuilo/waon', volume: 1 },
sound_antenna: { type: 'syuilo/triple', volume: 1 },
sound_channel: { type: 'syuilo/square-pico', volume: 1 },
sound_reversiPutBlack: { type: 'syuilo/kick', volume: 0.3 },
sound_reversiPutWhite: { type: 'syuilo/snare', volume: 0.3 },
};
export const device = {
get<T extends keyof typeof defaultDeviceSettings>(key: T): typeof defaultDeviceSettings[T] {
// TODO: indexedDBにする
// ただしその際はnullチェックではなくキー存在チェックにしないとダメ
// (indexedDBはnullを保存できるため、ユーザーが意図してnullを格納した可能性がある)
const value = localStorage.getItem(PREFIX + key);
if (value == null) {
return defaultDeviceSettings[key];
} else {
return JSON.parse(value);
}
},
set(key: keyof typeof defaultDeviceSettings, value: any): any {
localStorage.setItem(PREFIX + key, JSON.stringify(value));
},
};

View File

@ -0,0 +1,85 @@
<template>
<XWindow ref="window" :initial-width="400" :initial-height="500" :can-resize="true" @closed="$emit('closed')">
<template #header>
<Fa :icon="faExclamationCircle" style="margin-right: 0.5em;"/>
<i18n-t keypath="reportAbuseOf" tag="span">
<template #name>
<b><MkAcct :user="user"/></b>
</template>
</i18n-t>
</template>
<div class="dpvffvvy">
<div class="_section">
<div class="_content">
<MkTextarea v-model:value="comment">
<span>{{ $t('details') }}</span>
<template #desc>{{ $t('fillAbuseReportDescription') }}</template>
</MkTextarea>
</div>
</div>
<div class="_section">
<div class="_content">
<MkButton @click="send" primary full :disabled="comment.length === 0">{{ $t('send') }}</MkButton>
</div>
</div>
</div>
</XWindow>
</template>
<script lang="ts">
import { defineComponent, markRaw } from 'vue';
import { faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
import XWindow from '@/components/ui/window.vue';
import MkTextarea from '@/components/ui/textarea.vue';
import MkButton from '@/components/ui/button.vue';
import * as os from '@/os';
export default defineComponent({
components: {
XWindow,
MkTextarea,
MkButton,
},
props: {
user: {
type: Object,
required: true,
},
initialComment: {
type: String,
required: false,
},
},
emits: ['closed'],
data() {
return {
comment: this.initialComment || '',
faExclamationCircle,
};
},
methods: {
send() {
os.apiWithDialog('users/report-abuse', {
userId: this.user.id,
comment: this.comment,
}, undefined, res => {
os.dialog({
type: 'success',
text: this.$t('abuseReported')
});
this.$refs.window.close();
});
}
},
});
</script>
<style lang="scss" scoped>
.dpvffvvy {
--section-padding: 16px;
}
</style>

View File

@ -6,11 +6,11 @@
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent } from 'vue';
import { toUnicode } from 'punycode';
import { host } from '../config';
import { host } from '@/config';
export default Vue.extend({
export default defineComponent({
props: ['user', 'detail'],
data() {
return {

View File

@ -34,10 +34,11 @@
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent } from 'vue';
import * as tinycolor from 'tinycolor2';
import * as os from '@/os';
export default Vue.extend({
export default defineComponent({
data() {
return {
now: new Date(),
@ -127,7 +128,7 @@ export default Vue.extend({
});
},
beforeDestroy() {
beforeUnmount() {
this.enabled = false;
},

View File

@ -1,12 +1,12 @@
<template>
<div class="swhvrteh" @contextmenu.prevent="() => {}">
<div class="swhvrteh _popup _shadow" @contextmenu.prevent="() => {}">
<ol class="users" ref="suggests" v-if="type === 'user'">
<li v-for="user in users" @click="complete(type, user)" @keydown="onKeydown" tabindex="-1" class="user">
<img class="avatar" :src="user.avatarUrl"/>
<span class="name">
<mk-user-name :user="user" :key="user.id"/>
<MkUserName :user="user" :key="user.id"/>
</span>
<span class="username">@{{ user | acct }}</span>
<span class="username">@{{ acct(user) }}</span>
</li>
<li @click="chooseUser()" @keydown="onKeydown" tabindex="-1" class="choose">{{ $t('selectUser') }}</li>
</ol>
@ -28,12 +28,13 @@
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent, markRaw } from 'vue';
import { emojilist } from '../../misc/emojilist';
import contains from '../scripts/contains';
import contains from '@/scripts/contains';
import { twemojiSvgBase } from '../../misc/twemoji-base';
import { getStaticImageUrl } from '../scripts/get-static-image-url';
import MkUserSelect from './user-select.vue';
import { getStaticImageUrl } from '@/scripts/get-static-image-url';
import { acct } from '@/filters/user';
import * as os from '@/os';
type EmojiDef = {
emoji: string;
@ -74,7 +75,7 @@ for (const x of lib) {
emjdb.sort((a, b) => a.name.length - b.name.length);
export default Vue.extend({
export default defineComponent({
props: {
type: {
type: String,
@ -91,11 +92,6 @@ export default Vue.extend({
required: true,
},
complete: {
type: Function,
required: true,
},
close: {
type: Function,
required: true,
@ -110,8 +106,15 @@ export default Vue.extend({
type: Number,
required: true,
},
showing: {
type: Boolean,
required: true
},
},
emits: ['done', 'closed'],
data() {
return {
getStaticImageUrl,
@ -119,24 +122,29 @@ export default Vue.extend({
users: [],
hashtags: [],
emojis: [],
items: [],
select: -1,
emojilist,
emojiDb: [] as EmojiDef[]
}
},
computed: {
items(): HTMLCollection {
return (this.$refs.suggests as Element).children;
},
useOsNativeEmojis(): boolean {
return this.$store.state.device.useOsNativeEmojis;
}
},
watch: {
showing() {
if (!this.showing) {
this.$emit('closed');
}
}
},
updated() {
this.setPosition();
this.items = (this.$refs.suggests as Element | undefined)?.children || [];
},
mounted() {
@ -169,7 +177,7 @@ export default Vue.extend({
emojiDefinitions.sort((a, b) => a.name.length - b.name.length);
this.emojiDb = emojiDefinitions.concat(emjdb);
this.emojiDb = markRaw(emojiDefinitions.concat(emjdb));
//#endregion
this.textarea.addEventListener('keydown', this.onKeydown);
@ -189,7 +197,7 @@ export default Vue.extend({
});
},
beforeDestroy() {
beforeUnmount() {
this.textarea.removeEventListener('keydown', this.onKeydown);
for (const el of Array.from(document.querySelectorAll('body *'))) {
@ -198,6 +206,11 @@ export default Vue.extend({
},
methods: {
complete(type, value) {
this.$emit('done', { type, value });
this.$emit('closed');
},
setPosition() {
if (this.x + this.$el.offsetWidth > window.innerWidth) {
this.$el.style.left = (window.innerWidth - this.$el.offsetWidth) + 'px';
@ -236,8 +249,8 @@ export default Vue.extend({
this.users = users;
this.fetching = false;
} else {
this.$root.api('users/search', {
query: this.q,
os.api('users/search-by-username-and-host', {
username: this.q,
limit: 10,
detail: false
}).then(users => {
@ -260,7 +273,7 @@ export default Vue.extend({
this.hashtags = hashtags;
this.fetching = false;
} else {
this.$root.api('hashtags/search', {
os.api('hashtags/search', {
query: this.q,
limit: 30
}).then(hashtags => {
@ -355,6 +368,7 @@ export default Vue.extend({
selectNext() {
if (++this.select >= this.items.length) this.select = 0;
if (this.items.length === 0) this.select = -1;
this.applySelect();
},
@ -368,20 +382,21 @@ export default Vue.extend({
el.removeAttribute('data-selected');
}
this.items[this.select].setAttribute('data-selected', 'true');
(this.items[this.select] as any).focus();
if (this.select !== -1) {
this.items[this.select].setAttribute('data-selected', 'true');
(this.items[this.select] as any).focus();
}
},
chooseUser() {
this.close();
const vm = this.$root.new(MkUserSelect, {});
vm.$once('selected', user => {
os.selectUser().then(user => {
this.complete('user', user);
});
vm.$once('closed', () => {
this.textarea.focus();
});
}
},
acct
}
});
</script>
@ -393,9 +408,6 @@ export default Vue.extend({
max-width: 100%;
margin-top: calc(1em + 8px);
overflow: hidden;
background: var(--panel);
border: solid 1px rgba(#000, 0.1);
border-radius: 4px;
transition: top 0.1s ease, left 0.1s ease;
> ol {

View File

@ -1,17 +1,19 @@
<template>
<span class="eiwwqkts" :class="{ cat }" :title="user | acct" 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"/>
</span>
<router-link class="eiwwqkts" :class="{ cat }" :to="user | userPage" :title="user | acct" :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"/>
</router-link>
</MkA>
</template>
<script lang="ts">
import Vue from 'vue';
import { getStaticImageUrl } from '../scripts/get-static-image-url';
import { defineComponent } from 'vue';
import { getStaticImageUrl } from '@/scripts/get-static-image-url';
import { extractAvgColorFromBlurhash } from '@/scripts/extract-avg-color-from-blurhash';
import { acct, userPage } from '../filters/user';
export default Vue.extend({
export default defineComponent({
props: {
user: {
type: Object,
@ -30,6 +32,7 @@ export default Vue.extend({
default: false
}
},
emits: ['click'],
computed: {
cat(): boolean {
return this.user.isCat;
@ -42,25 +45,19 @@ export default Vue.extend({
},
watch: {
'user.avatarBlurhash'() {
this.$el.style.color = this.getBlurhashAvgColor(this.user.avatarBlurhash);
if (this.$el == null) return;
this.$el.style.color = extractAvgColorFromBlurhash(this.user.avatarBlurhash);
}
},
mounted() {
this.$el.style.color = this.getBlurhashAvgColor(this.user.avatarBlurhash);
this.$el.style.color = extractAvgColorFromBlurhash(this.user.avatarBlurhash);
},
methods: {
getBlurhashAvgColor(s) {
return typeof s == 'string'
? '#' + [...s.slice(2, 6)]
.map(x => '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~'.indexOf(x))
.reduce((a, c) => a * 83 + c, 0)
.toString(16)
.padStart(6, '0')
: undefined;
},
onClick(e) {
this.$emit('click', e);
}
},
acct,
userPage
}
});
</script>

View File

@ -1,15 +1,16 @@
<template>
<div>
<div v-for="user in us" :key="user.id" style="display:inline-block;width:32px;height:32px;margin-right:8px;">
<mk-avatar :user="user" style="width:32px;height:32px;"/>
<MkAvatar :user="user" style="width:32px;height:32px;"/>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent } from 'vue';
import * as os from '@/os';
export default Vue.extend({
export default defineComponent({
props: {
userIds: {
required: true
@ -21,7 +22,7 @@ export default Vue.extend({
};
},
async created() {
this.us = await this.$root.api('users/show', {
this.us = await os.api('users/show', {
userIds: this.userIds
});
}

View File

@ -1,12 +1,12 @@
<template>
<div>
<span v-if="!available">{{ $t('waiting') }}<mk-ellipsis/></span>
<span v-if="!available">{{ $t('waiting') }}<MkEllipsis/></span>
<div ref="captcha"></div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent } from 'vue';
type Captcha = {
render(container: string | Node, options: {
@ -28,8 +28,9 @@ declare global {
interface Window extends CaptchaContainer {
}
}
import * as os from '@/os';
export default Vue.extend({
export default defineComponent({
props: {
provider: {
type: String,
@ -88,7 +89,7 @@ export default Vue.extend({
}
},
beforeDestroy() {
beforeUnmount() {
this.reset();
},
@ -110,7 +111,7 @@ export default Vue.extend({
}
},
callback(response?: string) {
this.$emit('input', typeof response == 'string' ? response : null);
this.$emit('update:value', typeof response == 'string' ? response : null);
},
},
});

View File

@ -0,0 +1,142 @@
<template>
<button class="hdcaacmi _button"
:class="{ wait, active: isFollowing, full }"
@click="onClick"
:disabled="wait"
>
<template v-if="!wait">
<template v-if="isFollowing">
<span v-if="full">{{ $t('unfollow') }}</span><Fa :icon="faMinus"/>
</template>
<template v-else>
<span v-if="full">{{ $t('follow') }}</span><Fa :icon="faPlus"/>
</template>
</template>
<template v-else>
<span v-if="full">{{ $t('processing') }}</span><Fa :icon="faSpinner" pulse fixed-width/>
</template>
</button>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { faSpinner, faPlus, faMinus, } from '@fortawesome/free-solid-svg-icons';
import * as os from '@/os';
export default defineComponent({
props: {
channel: {
type: Object,
required: true
},
full: {
type: Boolean,
required: false,
default: false,
},
},
data() {
return {
isFollowing: this.channel.isFollowing,
wait: false,
faSpinner, faPlus, faMinus,
};
},
methods: {
async onClick() {
this.wait = true;
try {
if (this.isFollowing) {
await os.api('channels/unfollow', {
channelId: this.channel.id
});
this.isFollowing = false;
} else {
await os.api('channels/follow', {
channelId: this.channel.id
});
this.isFollowing = true;
}
} catch (e) {
console.error(e);
} finally {
this.wait = false;
}
}
}
});
</script>
<style lang="scss" scoped>
.hdcaacmi {
position: relative;
display: inline-block;
font-weight: bold;
color: var(--accent);
background: transparent;
border: solid 1px var(--accent);
padding: 0;
height: 31px;
font-size: 16px;
border-radius: 32px;
background: #fff;
&.full {
padding: 0 8px 0 12px;
font-size: 14px;
}
&:not(.full) {
width: 31px;
}
&:focus {
&:after {
content: "";
pointer-events: none;
position: absolute;
top: -5px;
right: -5px;
bottom: -5px;
left: -5px;
border: 2px solid var(--focus);
border-radius: 32px;
}
}
&:hover {
//background: mix($primary, #fff, 20);
}
&:active {
//background: mix($primary, #fff, 40);
}
&.active {
color: #fff;
background: var(--accent);
&:hover {
background: var(--accentLighten);
border-color: var(--accentLighten);
}
&:active {
background: var(--accentDarken);
border-color: var(--accentDarken);
}
}
&.wait {
cursor: wait !important;
opacity: 0.7;
}
> span {
margin-right: 6px;
}
}
</style>

View File

@ -0,0 +1,167 @@
<template>
<MkA :to="`/channels/${channel.id}`" class="eftoefju _panel" tabindex="-1">
<div class="banner" :style="bannerStyle">
<div class="fade"></div>
<div class="name"><Fa :icon="faSatelliteDish"/> {{ channel.name }}</div>
<div class="status">
<div>
<Fa :icon="faUsers" fixed-width/>
<i18n-t keypath="_channel.usersCount" tag="span" style="margin-left: 4px;">
<template #n>
<b>{{ channel.usersCount }}</b>
</template>
</i18n-t>
</div>
<div>
<Fa :icon="faPencilAlt" fixed-width/>
<i18n-t keypath="_channel.notesCount" tag="span" style="margin-left: 4px;">
<template #n>
<b>{{ channel.notesCount }}</b>
</template>
</i18n-t>
</div>
</div>
</div>
<article v-if="channel.description">
<p :title="channel.description">{{ channel.description.length > 85 ? channel.description.slice(0, 85) + '…' : channel.description }}</p>
</article>
<footer>
<span v-if="channel.lastNotedAt">
{{ $t('updatedAt') }}: <MkTime :time="channel.lastNotedAt"/>
</span>
</footer>
</MkA>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { faSatelliteDish, faUsers, faPencilAlt } from '@fortawesome/free-solid-svg-icons';
export default defineComponent({
props: {
channel: {
type: Object,
required: true
},
},
computed: {
bannerStyle() {
if (this.channel.bannerUrl) {
return { backgroundImage: `url(${this.channel.bannerUrl})` };
} else {
return { backgroundColor: '#4c5e6d' };
}
}
},
data() {
return {
faSatelliteDish, faUsers, faPencilAlt,
};
},
});
</script>
<style lang="scss" scoped>
.eftoefju {
display: block;
overflow: hidden;
width: 100%;
&:hover {
text-decoration: none;
}
> .banner {
position: relative;
width: 100%;
height: 200px;
background-position: center;
background-size: cover;
> .fade {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 64px;
background: linear-gradient(0deg, var(--panel), var(--X15));
}
> .name {
position: absolute;
top: 16px;
left: 16px;
padding: 12px 16px;
background: rgba(0, 0, 0, 0.7);
color: #fff;
font-size: 1.2em;
}
> .status {
position: absolute;
z-index: 1;
bottom: 16px;
right: 16px;
padding: 8px 12px;
font-size: 80%;
background: rgba(0, 0, 0, 0.7);
border-radius: 6px;
color: #fff;
}
}
> article {
padding: 16px;
> p {
margin: 0;
font-size: 1em;
}
}
> footer {
padding: 12px 16px;
border-top: solid 1px var(--divider);
> span {
opacity: 0.7;
font-size: 0.9em;
}
}
@media (max-width: 550px) {
font-size: 0.9em;
> .banner {
height: 80px;
> .status {
display: none;
}
}
> article {
padding: 12px;
}
> footer {
display: none;
}
}
@media (max-width: 500px) {
font-size: 0.8em;
> .banner {
height: 70px;
}
> article {
padding: 8px;
}
}
}
</style>

View File

@ -1,16 +1,14 @@
<template>
<x-prism :inline="inline" :language="prismLang">{{ code }}</x-prism>
<code v-if="inline" v-html="html" :class="`language-${prismLang}`"></code>
<pre v-else :class="`language-${prismLang}`"><code v-html="html" :class="`language-${prismLang}`"></code></pre>
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent } from 'vue';
import 'prismjs';
import 'prismjs/themes/prism-okaidia.css';
import XPrism from 'vue-prism-component';
export default Vue.extend({
components: {
XPrism
},
export default defineComponent({
props: {
code: {
type: String,
@ -28,6 +26,9 @@ export default Vue.extend({
computed: {
prismLang() {
return Prism.languages[this.lang] ? this.lang : 'js';
},
html() {
return Prism.highlight(this.code, Prism.languages[this.prismLang], this.prismLang);
}
}
});

View File

@ -1,12 +1,13 @@
<template>
<x-code :code="code" :lang="lang" :inline="inline"/>
<XCode :code="code" :lang="lang" :inline="inline"/>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
import { defineComponent, defineAsyncComponent } from 'vue';
export default defineComponent({
components: {
XCode: () => import('./code-core.vue').then(m => m.default)
XCode: defineAsyncComponent(() => import('./code-core.vue'))
},
props: {
code: {

View File

@ -1,16 +1,16 @@
<template>
<button class="nrvgflfuaxwgkxoynpnumyookecqrrvh _button" @click="toggle">
<b>{{ value ? this.$t('_cw.hide') : this.$t('_cw.show') }}</b>
<span v-if="!value">{{ this.label }}</span>
<button class="nrvgflfu _button" @click="toggle">
<b>{{ value ? $t('_cw.hide') : $t('_cw.show') }}</b>
<span v-if="!value">{{ label }}</span>
</button>
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent } from 'vue';
import { length } from 'stringz';
import { concat } from '../../prelude/array';
export default Vue.extend({
export default defineComponent({
props: {
value: {
type: Boolean,
@ -36,14 +36,14 @@ export default Vue.extend({
length,
toggle() {
this.$emit('input', !this.value);
this.$emit('update:value', !this.value);
}
}
});
</script>
<style lang="scss" scoped>
.nrvgflfuaxwgkxoynpnumyookecqrrvh {
.nrvgflfu {
display: inline-block;
padding: 4px 8px;
font-size: 0.7em;

View File

@ -1,22 +1,22 @@
<template>
<component :is="$store.state.device.animation ? 'transition-group' : 'div'" class="sqadhkmv _list_" name="list" tag="div" :data-direction="direction" :data-reversed="reversed ? 'true' : 'false'">
<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>
<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>
</component>
</transition-group>
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent } from 'vue';
import { faAngleUp, faAngleDown } from '@fortawesome/free-solid-svg-icons';
export default Vue.extend({
export default defineComponent({
props: {
items: {
type: Array,
@ -82,14 +82,14 @@ export default Vue.extend({
}
&[data-direction="up"] {
> .list-enter {
> .list-enter-from {
opacity: 0;
transform: translateY(64px);
}
}
&[data-direction="down"] {
> .list-enter {
> .list-enter-from {
opacity: 0;
transform: translateY(-64px);
}

View File

@ -1,69 +0,0 @@
<template>
<x-column :column="column" :is-stacked="isStacked" :menu="menu">
<template #header><fa :icon="faBell" style="margin-right: 8px;"/>{{ column.name }}</template>
<x-notifications/>
</x-column>
</template>
<script lang="ts">
import Vue from 'vue';
import { faCog } from '@fortawesome/free-solid-svg-icons';
import { faBell } from '@fortawesome/free-regular-svg-icons';
import XColumn from './column.vue';
import XNotifications from '../notifications.vue';
export default Vue.extend({
components: {
XColumn,
XNotifications
},
props: {
column: {
type: Object,
required: true
},
isStacked: {
type: Boolean,
required: true
}
},
data() {
return {
menu: null,
faBell
}
},
created() {
if (this.column.notificationType == null) {
this.column.notificationType = 'all';
this.$store.commit('deviceUser/updateDeckColumn', this.column);
}
this.menu = [{
icon: faCog,
text: this.$t('notificationType'),
action: () => {
this.$root.dialog({
title: this.$t('notificationType'),
type: null,
select: {
items: ['all', 'follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest'].map(x => ({
value: x, text: this.$t(`_notification._types.${x}`)
}))
default: this.column.notificationType,
},
showCancelButton: true
}).then(({ canceled, result: type }) => {
if (canceled) return;
this.column.notificationType = type;
this.$store.commit('deviceUser/updateDeckColumn', this.column);
});
}
}];
},
});
</script>

View File

@ -1,69 +1,56 @@
<template>
<div class="mk-dialog" :class="{ iconOnly }">
<transition :name="$store.state.device.animation ? 'bg-fade' : ''" appear>
<div class="bg _modalBg" ref="bg" @click="onBgClick" v-if="show"></div>
</transition>
<transition :name="$store.state.device.animation ? 'dialog' : ''" appear @after-leave="() => { destroyDom(); }">
<div class="main" ref="main" v-if="show">
<template v-if="type == 'signin'">
<mk-signin/>
<MkModal ref="modal" @click="done(true)" @closed="$emit('closed')">
<div class="mk-dialog">
<div class="icon" v-if="icon">
<Fa :icon="icon"/>
</div>
<div class="icon" v-else-if="!input && !select" :class="type">
<Fa :icon="faCheck" v-if="type === 'success'"/>
<Fa :icon="faTimesCircle" v-if="type === 'error'"/>
<Fa :icon="faExclamationTriangle" v-if="type === 'warning'"/>
<Fa :icon="faInfoCircle" v-if="type === 'info'"/>
<Fa :icon="faQuestionCircle" v-if="type === 'question'"/>
<Fa :icon="faSpinner" pulse v-if="type === 'waiting'"/>
</div>
<header v-if="title"><Mfm :text="title"/></header>
<div class="body" v-if="text"><Mfm :text="text"/></div>
<MkInput v-if="input" v-model:value="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></MkInput>
<MkSelect v-if="select" v-model:value="selectedValue" autofocus>
<template v-if="select.items">
<option v-for="item in select.items" :value="item.value">{{ item.text }}</option>
</template>
<template v-else>
<div class="icon" v-if="icon">
<fa :icon="icon"/>
</div>
<div class="icon" v-else-if="!input && !select && !user" :class="type">
<fa :icon="faCheck" v-if="type === 'success'"/>
<fa :icon="faTimesCircle" v-if="type === 'error'"/>
<fa :icon="faExclamationTriangle" v-if="type === 'warning'"/>
<fa :icon="faInfoCircle" v-if="type === 'info'"/>
<fa :icon="faQuestionCircle" v-if="type === 'question'"/>
<fa :icon="faSpinner" pulse v-if="type === 'waiting'"/>
</div>
<header v-if="title" v-html="title"></header>
<header v-if="title == null && user">{{ $t('enterUsername') }}</header>
<div class="body" v-if="text" v-html="text"></div>
<mk-input v-if="input" v-model="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></mk-input>
<mk-input v-if="user" v-model="userInputValue" autofocus @keydown="onInputKeydown"><template #prefix>@</template></mk-input>
<mk-select v-if="select" v-model="selectedValue" autofocus>
<template v-if="select.items">
<option v-for="item in select.items" :value="item.value">{{ item.text }}</option>
</template>
<template v-else>
<optgroup v-for="groupedItem in select.groupedItems" :label="groupedItem.label">
<option v-for="item in groupedItem.items" :value="item.value">{{ item.text }}</option>
</optgroup>
</template>
</mk-select>
<div class="buttons" v-if="!iconOnly && (showOkButton || showCancelButton) && !actions">
<mk-button inline @click="ok" v-if="showOkButton" primary :autofocus="!input && !select && !user" :disabled="!canOk">{{ (showCancelButton || input || select || user) ? $t('ok') : $t('gotIt') }}</mk-button>
<mk-button inline @click="cancel" v-if="showCancelButton || input || select || user">{{ $t('cancel') }}</mk-button>
</div>
<div class="buttons" v-if="actions">
<mk-button v-for="action in actions" inline @click="() => { action.callback(); close(); }" :primary="action.primary" :key="action.text">{{ action.text }}</mk-button>
</div>
<optgroup v-for="groupedItem in select.groupedItems" :label="groupedItem.label">
<option v-for="item in groupedItem.items" :value="item.value">{{ item.text }}</option>
</optgroup>
</template>
</MkSelect>
<div class="buttons" v-if="(showOkButton || showCancelButton) && !actions">
<MkButton inline @click="ok" v-if="showOkButton" primary :autofocus="!input && !select">{{ (showCancelButton || input || select) ? $t('ok') : $t('gotIt') }}</MkButton>
<MkButton inline @click="cancel" v-if="showCancelButton || input || select">{{ $t('cancel') }}</MkButton>
</div>
</transition>
</div>
<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>
</div>
</div>
</MkModal>
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent } from 'vue';
import { faSpinner, faInfoCircle, faExclamationTriangle, faCheck } from '@fortawesome/free-solid-svg-icons';
import { faTimesCircle, faQuestionCircle } from '@fortawesome/free-regular-svg-icons';
import MkButton from './ui/button.vue';
import MkInput from './ui/input.vue';
import MkSelect from './ui/select.vue';
import MkSignin from './signin.vue';
import parseAcct from '../../misc/acct/parse';
import MkModal from '@/components/ui/modal.vue';
import MkButton from '@/components/ui/button.vue';
import MkInput from '@/components/ui/input.vue';
import MkSelect from '@/components/ui/select.vue';
export default Vue.extend({
export default defineComponent({
components: {
MkModal,
MkButton,
MkInput,
MkSelect,
MkSignin,
},
props: {
@ -86,9 +73,6 @@ export default Vue.extend({
select: {
required: false
},
user: {
required: false
},
icon: {
required: false
},
@ -107,87 +91,44 @@ export default Vue.extend({
type: Boolean,
default: true
},
iconOnly: {
type: Boolean,
default: false
},
autoClose: {
type: Boolean,
default: false
}
},
emits: ['done', 'closed'],
data() {
return {
show: true,
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,
canOk: true,
faTimesCircle, faQuestionCircle, faSpinner, faInfoCircle, faExclamationTriangle, faCheck
};
},
watch: {
userInputValue() {
if (this.user) {
this.$root.api('users/show', parseAcct(this.userInputValue)).then(u => {
this.canOk = u != null;
}).catch(() => {
this.canOk = false;
});
}
}
},
mounted() {
if (this.user) this.canOk = false;
if (this.autoClose) {
setTimeout(() => {
this.close();
}, 1000);
}
document.addEventListener('keydown', this.onKeydown);
},
beforeDestroy() {
beforeUnmount() {
document.removeEventListener('keydown', this.onKeydown);
},
methods: {
done(canceled, result?) {
this.$emit('done', { canceled, result });
this.$refs.modal.close();
},
async ok() {
if (!this.canOk) return;
if (!this.showOkButton) return;
if (this.user) {
const user = await this.$root.api('users/show', parseAcct(this.userInputValue));
if (user) {
this.$emit('ok', user);
this.close();
}
} else {
const result =
this.input ? this.inputValue :
this.select ? this.selectedValue :
true;
this.$emit('ok', result);
this.close();
}
const result =
this.input ? this.inputValue :
this.select ? this.selectedValue :
true;
this.done(false, result);
},
cancel() {
this.$emit('cancel');
this.close();
},
close() {
if (!this.show) return;
this.show = false;
this.$el.style.pointerEvents = 'none';
(this.$refs.bg as any).style.pointerEvents = 'none';
(this.$refs.main as any).style.pointerEvents = 'none';
this.done(true);
},
onBgClick() {
@ -214,95 +155,60 @@ export default Vue.extend({
</script>
<style lang="scss" scoped>
.dialog-enter-active, .dialog-leave-active {
transition: opacity 0.3s, transform 0.3s !important;
}
.dialog-enter, .dialog-leave-to {
opacity: 0;
transform: scale(0.9);
}
.bg-fade-enter-active, .bg-fade-leave-active {
transition: opacity 0.3s !important;
}
.bg-fade-enter, .bg-fade-leave-to {
opacity: 0;
}
.mk-dialog {
display: flex;
align-items: center;
justify-content: center;
position: fixed;
z-index: 30000;
top: 0;
left: 0;
width: 100%;
height: 100%;
position: relative;
padding: 32px;
min-width: 320px;
max-width: 480px;
box-sizing: border-box;
text-align: center;
background: var(--panel);
border-radius: var(--radius);
&.iconOnly > .main {
min-width: 0;
width: initial;
> .icon {
font-size: 32px;
&.success {
color: var(--success);
}
&.error {
color: var(--error);
}
&.warning {
color: var(--warn);
}
> * {
display: block;
margin: 0 auto;
}
& + header {
margin-top: 16px;
}
}
> .main {
display: block;
position: fixed;
margin: auto;
padding: 32px;
min-width: 320px;
max-width: 480px;
box-sizing: border-box;
width: calc(100% - 32px);
text-align: center;
background: var(--panel);
border-radius: var(--radius);
> header {
margin: 0 0 8px 0;
font-weight: bold;
font-size: 20px;
> .icon {
font-size: 32px;
&.success {
color: var(--accent);
}
&.error {
color: #ec4137;
}
&.warning {
color: #ecb637;
}
> * {
display: block;
margin: 0 auto;
}
& + header {
margin-top: 16px;
}
& + .body {
margin-top: 8px;
}
}
> header {
margin: 0 0 8px 0;
font-weight: bold;
font-size: 20px;
> .body {
margin: 16px 0 0 0;
}
& + .body {
margin-top: 8px;
}
}
> .buttons {
margin-top: 16px;
> .body {
margin: 16px 0 0 0;
}
> .buttons {
margin-top: 16px;
> * {
margin: 0 8px;
}
> * {
margin: 0 8px;
}
}
}

View File

@ -1,20 +1,20 @@
<template>
<div class="zdjebgpv" ref="thumbnail">
<img-with-blurhash v-if="isThumbnailAvailable" :hash="file.blurhash" :src="file.thumbnailUrl" :alt="file.name" :title="file.name" :style="`object-fit: ${ fit }`"/>
<fa :icon="faFileImage" class="icon" v-else-if="is === 'image'"/>
<fa :icon="faFileVideo" class="icon" v-else-if="is === 'video'"/>
<fa :icon="faMusic" class="icon" v-else-if="is === 'audio' || is === 'midi'"/>
<fa :icon="faFileCsv" class="icon" v-else-if="is === 'csv'"/>
<fa :icon="faFilePdf" class="icon" v-else-if="is === 'pdf'"/>
<fa :icon="faFileAlt" class="icon" v-else-if="is === 'textfile'"/>
<fa :icon="faFileArchive" class="icon" v-else-if="is === 'archive'"/>
<fa :icon="faFile" class="icon" v-else/>
<fa :icon="faFilm" class="icon-sub" v-if="isThumbnailAvailable && is === 'video'"/>
<ImgWithBlurhash v-if="isThumbnailAvailable" :hash="file.blurhash" :src="file.thumbnailUrl" :alt="file.name" :title="file.name" :style="`object-fit: ${ fit }`"/>
<Fa :icon="faFileImage" class="icon" v-else-if="is === 'image'"/>
<Fa :icon="faFileVideo" class="icon" v-else-if="is === 'video'"/>
<Fa :icon="faMusic" class="icon" v-else-if="is === 'audio' || is === 'midi'"/>
<Fa :icon="faFileCsv" class="icon" v-else-if="is === 'csv'"/>
<Fa :icon="faFilePdf" class="icon" v-else-if="is === 'pdf'"/>
<Fa :icon="faFileAlt" class="icon" v-else-if="is === 'textfile'"/>
<Fa :icon="faFileArchive" class="icon" v-else-if="is === 'archive'"/>
<Fa :icon="faFile" class="icon" v-else/>
<Fa :icon="faFilm" class="icon-sub" v-if="isThumbnailAvailable && is === 'video'"/>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent } from 'vue';
import {
faFile,
faFileAlt,
@ -28,7 +28,7 @@ import {
} from '@fortawesome/free-solid-svg-icons';
import ImgWithBlurhash from './img-with-blurhash.vue';
export default Vue.extend({
export default defineComponent({
components: {
ImgWithBlurhash
},

View 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') ? $t('selectFiles') : $t('selectFolders')) : ((type === 'file') ? $t('selectFile') : $t('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>

View File

@ -1,53 +1,44 @@
<template>
<x-window ref="window" :width="800" :height="500" @closed="() => { $emit('closed'); destroyDom(); }" :with-ok-button="true" :ok-button-disabled="(type === 'file') && (selected.length === 0)" @ok="ok()">
<XWindow ref="window"
:initial-width="800"
:initial-height="500"
:can-resize="true"
@closed="$emit('closed')"
>
<template #header>
{{ multiple ? ((type === 'file') ? $t('selectFiles') : $t('selectFolders')) : ((type === 'file') ? $t('selectFile') : $t('selectFolder')) }}
<span v-if="selected.length > 0" style="margin-left: 8px; opacity: 0.5;">({{ selected.length | number }})</span>
{{ $t('drive') }}
</template>
<div>
<x-drive :multiple="multiple" @change-selection="onChangeSelection" :select="type"/>
</div>
</x-window>
<XDrive :initial-folder="initialFolder"/>
</XWindow>
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent } from 'vue';
import XDrive from './drive.vue';
import XWindow from './window.vue';
import XWindow from '@/components/ui/window.vue';
export default Vue.extend({
export default defineComponent({
components: {
XDrive,
XWindow,
},
props: {
type: {
type: String,
required: false,
default: 'file'
initialFolder: {
type: Object,
required: false
},
multiple: {
type: Boolean,
default: false
}
},
emits: ['closed'],
data() {
return {
selected: []
};
},
methods: {
ok() {
this.$emit('selected', this.selected);
this.$refs.window.close();
},
onChangeSelection(xs) {
this.selected = xs;
}
}
});
</script>

View File

@ -1,7 +1,8 @@
<template>
<div class="ncvczrfv"
:data-is-selected="isSelected"
:class="{ isSelected }"
@click="onClick"
@contextmenu.stop="onContextmenu"
draggable="true"
@dragstart="onDragstart"
@dragend="onDragend"
@ -20,7 +21,7 @@
<p>{{ $t('nsfw') }}</p>
</div>
<x-file-thumbnail class="thumbnail" :file="file" fit="contain"/>
<MkDriveFileThumbnail class="thumbnail" :file="file" fit="contain"/>
<p class="name">
<span>{{ file.name.lastIndexOf('.') != -1 ? file.name.substr(0, file.name.lastIndexOf('.')) : file.name }}</span>
@ -30,17 +31,17 @@
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent } from 'vue';
import { faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
import copyToClipboard from '../scripts/copy-to-clipboard';
//import updateAvatar from '../api/update-avatar';
//import updateBanner from '../api/update-banner';
import XFileThumbnail from './drive-file-thumbnail.vue';
import { faDownload, faLink, faICursor, faTrashAlt } from '@fortawesome/free-solid-svg-icons';
import copyToClipboard from '@/scripts/copy-to-clipboard';
import MkDriveFileThumbnail from './drive-file-thumbnail.vue';
import bytes from '../filters/bytes';
import * as os from '@/os';
export default Vue.extend({
export default defineComponent({
components: {
XFileThumbnail
MkDriveFileThumbnail
},
props: {
@ -60,6 +61,8 @@ export default Vue.extend({
}
},
emits: ['chosen'],
data() {
return {
isDragging: false
@ -72,48 +75,54 @@ export default Vue.extend({
return this.$parent;
},
title(): string {
return `${this.file.name}\n${this.file.type} ${Vue.filter('bytes')(this.file.size)}`;
return `${this.file.name}\n${this.file.type} ${bytes(this.file.size)}`;
}
},
methods: {
getMenu() {
return [{
text: this.$t('rename'),
icon: faICursor,
action: this.rename
}, {
text: this.file.isSensitive ? this.$t('unmarkAsSensitive') : this.$t('markAsSensitive'),
icon: this.file.isSensitive ? faEye : faEyeSlash,
action: this.toggleSensitive
}, null, {
text: this.$t('copyUrl'),
icon: faLink,
action: this.copyUrl
}, {
type: 'a',
href: this.file.url,
target: '_blank',
text: this.$t('download'),
icon: faDownload,
download: this.file.name
}, null, {
text: this.$t('delete'),
icon: faTrashAlt,
danger: true,
action: this.deleteFile
}];
},
onClick(ev) {
if (this.selectMode) {
this.$emit('chosen', this.file);
} else {
this.$root.menu({
items: [{
text: this.$t('rename'),
icon: faICursor,
action: this.rename
}, {
text: this.file.isSensitive ? this.$t('unmarkAsSensitive') : this.$t('markAsSensitive'),
icon: this.file.isSensitive ? faEye : faEyeSlash,
action: this.toggleSensitive
}, null, {
text: this.$t('copyUrl'),
icon: faLink,
action: this.copyUrl
}, {
type: 'a',
href: this.file.url,
target: '_blank',
text: this.$t('download'),
icon: faDownload,
download: this.file.name
}, null, {
text: this.$t('delete'),
icon: faTrashAlt,
action: this.deleteFile
}],
source: ev.currentTarget || ev.target,
});
os.modalMenu(this.getMenu(), ev.currentTarget || ev.target);
}
},
onContextmenu(e) {
os.contextMenu(this.getMenu(), e);
},
onDragstart(e) {
e.dataTransfer.effectAllowed = 'move';
e.dataTransfer.setData('mk_drive_file', JSON.stringify(this.file));
e.dataTransfer.setData(_DATA_TRANSFER_DRIVE_FILE_, JSON.stringify(this.file));
this.isDragging = true;
// 親ブラウザに対して、ドラッグが開始されたフラグを立てる
@ -127,7 +136,7 @@ export default Vue.extend({
},
rename() {
this.$root.dialog({
os.dialog({
title: this.$t('renameFile'),
input: {
placeholder: this.$t('inputNewFileName'),
@ -136,7 +145,7 @@ export default Vue.extend({
}
}).then(({ canceled, result: name }) => {
if (canceled) return;
this.$root.api('drive/files/update', {
os.api('drive/files/update', {
fileId: this.file.id,
name: name
});
@ -144,7 +153,7 @@ export default Vue.extend({
},
toggleSensitive() {
this.$root.api('drive/files/update', {
os.api('drive/files/update', {
fileId: this.file.id,
isSensitive: !this.file.isSensitive
});
@ -152,18 +161,15 @@ export default Vue.extend({
copyUrl() {
copyToClipboard(this.file.url);
this.$root.dialog({
type: 'success',
iconOnly: true, autoClose: true
});
os.success();
},
setAsAvatar() {
updateAvatar(this.$root)(this.file);
os.updateAvatar(this.file);
},
setAsBanner() {
updateBanner(this.$root)(this.file);
os.updateBanner(this.file);
},
addApp() {
@ -171,17 +177,19 @@ export default Vue.extend({
},
async deleteFile() {
const { canceled } = await this.$root.dialog({
const { canceled } = await os.dialog({
type: 'warning',
text: this.$t('driveFileDeleteConfirm', { name: this.file.name }),
showCancelButton: true
});
if (canceled) return;
this.$root.api('drive/files/delete', {
os.api('drive/files/delete', {
fileId: this.file.id
});
}
},
bytes
}
});
</script>
@ -197,6 +205,10 @@ export default Vue.extend({
cursor: pointer;
}
> * {
pointer-events: none;
}
&:hover {
background: rgba(#000, 0.05);
@ -233,7 +245,7 @@ export default Vue.extend({
}
}
&[data-is-selected] {
&.isSelected {
background: var(--accent);
&:hover {

View File

@ -1,7 +1,8 @@
<template>
<div class="rghtznwe"
:data-draghover="draghover"
:class="{ draghover }"
@click="onClick"
@contextmenu.stop="onContextmenu"
@mouseover="onMouseover"
@mouseout="onMouseout"
@dragover.prevent.stop="onDragover"
@ -14,8 +15,8 @@
:title="title"
>
<p class="name">
<template v-if="hover"><fa :icon="faFolderOpen" fixed-width/></template>
<template v-if="!hover"><fa :icon="faFolder" fixed-width/></template>
<template v-if="hover"><Fa :icon="faFolderOpen" fixed-width/></template>
<template v-if="!hover"><Fa :icon="faFolder" fixed-width/></template>
{{ folder.name }}
</p>
<p class="upload" v-if="$store.state.settings.uploadFolder == folder.id">
@ -26,10 +27,12 @@
</template>
<script lang="ts">
import Vue from 'vue';
import { faFolder, faFolderOpen } from '@fortawesome/free-regular-svg-icons';
import { defineComponent } from 'vue';
import { faFolder, faFolderOpen, faTrashAlt, faWindowRestore } from '@fortawesome/free-regular-svg-icons';
import * as os from '@/os';
import { faICursor } from '@fortawesome/free-solid-svg-icons';
export default Vue.extend({
export default defineComponent({
props: {
folder: {
type: Object,
@ -47,6 +50,8 @@ export default Vue.extend({
}
},
emits: ['chosen'],
data() {
return {
hover: false,
@ -91,8 +96,8 @@ export default Vue.extend({
}
const isFile = e.dataTransfer.items[0].kind == 'file';
const isDriveFile = e.dataTransfer.types[0] == 'mk_drive_file';
const isDriveFolder = e.dataTransfer.types[0] == 'mk_drive_folder';
const isDriveFile = e.dataTransfer.types[0] == _DATA_TRANSFER_DRIVE_FILE_;
const isDriveFolder = e.dataTransfer.types[0] == _DATA_TRANSFER_DRIVE_FOLDER_;
if (isFile || isDriveFile || isDriveFolder) {
e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed == 'all' ? 'copy' : 'move';
@ -121,11 +126,11 @@ export default Vue.extend({
}
//#region ドライブのファイル
const driveFile = e.dataTransfer.getData('mk_drive_file');
const driveFile = e.dataTransfer.getData(_DATA_TRANSFER_DRIVE_FILE_);
if (driveFile != null && driveFile != '') {
const file = JSON.parse(driveFile);
this.browser.removeFile(file.id);
this.$root.api('drive/files/update', {
os.api('drive/files/update', {
fileId: file.id,
folderId: this.folder.id
});
@ -133,7 +138,7 @@ export default Vue.extend({
//#endregion
//#region ドライブのフォルダ
const driveFolder = e.dataTransfer.getData('mk_drive_folder');
const driveFolder = e.dataTransfer.getData(_DATA_TRANSFER_DRIVE_FOLDER_);
if (driveFolder != null && driveFolder != '') {
const folder = JSON.parse(driveFolder);
@ -141,7 +146,7 @@ export default Vue.extend({
if (folder.id == this.folder.id) return;
this.browser.removeFolder(folder.id);
this.$root.api('drive/folders/update', {
os.api('drive/folders/update', {
folderId: folder.id,
parentId: this.folder.id
}).then(() => {
@ -149,15 +154,15 @@ export default Vue.extend({
}).catch(err => {
switch (err) {
case 'detected-circular-definition':
this.$root.dialog({
os.dialog({
title: this.$t('unableToProcess'),
text: this.$t('circularReferenceFolder')
});
break;
default:
this.$root.dialog({
os.dialog({
type: 'error',
text: this.$t('error')
text: this.$t('somethingHappened')
});
}
});
@ -167,7 +172,7 @@ export default Vue.extend({
onDragstart(e) {
e.dataTransfer.effectAllowed = 'move';
e.dataTransfer.setData('mk_drive_folder', JSON.stringify(this.folder));
e.dataTransfer.setData(_DATA_TRANSFER_DRIVE_FOLDER_, JSON.stringify(this.folder));
this.isDragging = true;
// 親ブラウザに対して、ドラッグが開始されたフラグを立てる
@ -189,7 +194,7 @@ export default Vue.extend({
},
rename() {
this.$root.dialog({
os.dialog({
title: this.$t('renameFolder'),
input: {
placeholder: this.$t('inputNewFolderName'),
@ -197,7 +202,7 @@ export default Vue.extend({
}
}).then(({ canceled, result: name }) => {
if (canceled) return;
this.$root.api('drive/folders/update', {
os.api('drive/folders/update', {
folderId: this.folder.id,
name: name
});
@ -205,7 +210,7 @@ export default Vue.extend({
},
deleteFolder() {
this.$root.api('drive/folders/delete', {
os.api('drive/folders/delete', {
folderId: this.folder.id
}).then(() => {
if (this.$store.state.settings.uploadFolder === this.folder.id) {
@ -217,14 +222,14 @@ export default Vue.extend({
}).catch(err => {
switch(err.id) {
case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
this.$root.dialog({
os.dialog({
type: 'error',
title: this.$t('unableToDelete'),
text: this.$t('hasChildFilesOrFolders')
});
break;
default:
this.$root.dialog({
os.dialog({
type: 'error',
text: this.$t('unableToDelete')
});
@ -238,6 +243,28 @@ export default Vue.extend({
value: this.folder.id
});
},
onContextmenu(e) {
os.contextMenu([{
text: this.$t('openInWindow'),
icon: faWindowRestore,
action: () => {
os.popup(import('./drive-window.vue'), {
initialFolder: this.folder
}, {
}, 'closed');
}
}, null, {
text: this.$t('rename'),
icon: faICursor,
action: this.rename
}, null, {
text: this.$t('delete'),
icon: faTrashAlt,
danger: true,
action: this.deleteFolder
}], e);
},
}
});
</script>
@ -272,7 +299,7 @@ export default Vue.extend({
}
}
&[data-draghover] {
&.draghover {
&:after {
content: "";
pointer-events: none;

View File

@ -1,22 +1,23 @@
<template>
<div class="drylbebk"
:data-draghover="draghover"
:class="{ draghover }"
@click="onClick"
@dragover.prevent.stop="onDragover"
@dragenter="onDragenter"
@dragleave="onDragleave"
@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>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent } from 'vue';
import { faCloud } from '@fortawesome/free-solid-svg-icons';
import * as os from '@/os';
export default Vue.extend({
export default defineComponent({
props: {
folder: {
type: Object,
@ -58,8 +59,8 @@ export default Vue.extend({
}
const isFile = e.dataTransfer.items[0].kind == 'file';
const isDriveFile = e.dataTransfer.types[0] == 'mk_drive_file';
const isDriveFolder = e.dataTransfer.types[0] == 'mk_drive_folder';
const isDriveFile = e.dataTransfer.types[0] == _DATA_TRANSFER_DRIVE_FILE_;
const isDriveFolder = e.dataTransfer.types[0] == _DATA_TRANSFER_DRIVE_FOLDER_;
if (isFile || isDriveFile || isDriveFolder) {
e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed == 'all' ? 'copy' : 'move';
@ -90,11 +91,11 @@ export default Vue.extend({
}
//#region ドライブのファイル
const driveFile = e.dataTransfer.getData('mk_drive_file');
const driveFile = e.dataTransfer.getData(_DATA_TRANSFER_DRIVE_FILE_);
if (driveFile != null && driveFile != '') {
const file = JSON.parse(driveFile);
this.browser.removeFile(file.id);
this.$root.api('drive/files/update', {
os.api('drive/files/update', {
fileId: file.id,
folderId: this.folder ? this.folder.id : null
});
@ -102,13 +103,13 @@ export default Vue.extend({
//#endregion
//#region ドライブのフォルダ
const driveFolder = e.dataTransfer.getData('mk_drive_folder');
const driveFolder = e.dataTransfer.getData(_DATA_TRANSFER_DRIVE_FOLDER_);
if (driveFolder != null && driveFolder != '') {
const folder = JSON.parse(driveFolder);
// 移動先が自分自身ならreject
if (this.folder && folder.id == this.folder.id) return;
this.browser.removeFolder(folder.id);
this.$root.api('drive/folders/update', {
os.api('drive/folders/update', {
folderId: folder.id,
parentId: this.folder ? this.folder.id : null
});
@ -125,7 +126,7 @@ export default Vue.extend({
pointer-events: none;
}
&[data-draghover] {
&.draghover {
background: #eee;
}

View File

@ -2,34 +2,35 @@
<div class="yfudmmck">
<nav>
<div class="path" @contextmenu.prevent.stop="() => {}">
<x-nav-folder :class="{ current: folder == null }"/>
<XNavFolder :class="{ current: folder == null }"/>
<template v-for="f in hierarchyFolders">
<span class="separator" :key="f.id + ':separator'"><fa :icon="faAngleRight"/></span>
<x-nav-folder :folder="f" :key="f.id"/>
<span class="separator"><Fa :icon="faAngleRight"/></span>
<XNavFolder :folder="f"/>
</template>
<span class="separator" v-if="folder != null"><fa :icon="faAngleRight"/></span>
<span class="separator" v-if="folder != null"><Fa :icon="faAngleRight"/></span>
<span class="folder current" v-if="folder != null">{{ folder.name }}</span>
</div>
</nav>
<div class="main" :class="{ uploading: uploadings.length > 0, fetching }"
<div class="main _section" :class="{ uploading: uploadings.length > 0, fetching }"
ref="main"
@dragover.prevent.stop="onDragover"
@dragenter="onDragenter"
@dragleave="onDragleave"
@drop.prevent.stop="onDrop"
@contextmenu="onContextmenu"
>
<div class="contents" ref="contents">
<div class="folders" ref="foldersContainer" v-show="folders.length > 0">
<x-folder 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 -->
<div class="padding" v-for="(n, i) in 16" :key="i"></div>
<mk-button ref="moreFolders" v-if="moreFolders">{{ $t('loadMore') }}</mk-button>
<MkButton ref="moreFolders" v-if="moreFolders">{{ $t('loadMore') }}</MkButton>
</div>
<div class="files" ref="filesContainer" v-show="files.length > 0">
<x-file 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 -->
<div class="padding" v-for="(n, i) in 16" :key="i"></div>
<mk-button ref="loadMoreFiles" @click="fetchMoreFiles" v-show="moreFiles">{{ $t('loadMore') }}</mk-button>
<MkButton ref="loadMoreFiles" @click="fetchMoreFiles" v-show="moreFiles">{{ $t('loadMore') }}</MkButton>
</div>
<div class="empty" v-if="files.length == 0 && folders.length == 0 && !fetching">
<p v-if="draghover">{{ $t('empty-draghover') }}</p>
@ -37,34 +38,33 @@
<p v-if="!draghover && folder != null">{{ $t('emptyFolder') }}</p>
</div>
</div>
<mk-loading v-if="fetching"/>
<MkLoading v-if="fetching"/>
</div>
<div class="dropzone" v-if="draghover"></div>
<x-uploader ref="uploader" @change="onChangeUploaderUploads" @uploaded="onUploaderUploaded"/>
<input ref="fileInput" type="file" accept="*/*" multiple="multiple" tabindex="-1" @change="onChangeFileInput"/>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import { faAngleRight } from '@fortawesome/free-solid-svg-icons';
import { defineComponent } from 'vue';
import { faAngleRight, faFolderPlus, faICursor, faLink, faUpload } from '@fortawesome/free-solid-svg-icons';
import XNavFolder from './drive.nav-folder.vue';
import XFolder from './drive.folder.vue';
import XFile from './drive.file.vue';
import XUploader from './uploader.vue';
import MkButton from './ui/button.vue';
import * as os from '@/os';
import { faTrashAlt } from '@fortawesome/free-regular-svg-icons';
export default Vue.extend({
export default defineComponent({
components: {
XNavFolder,
XFolder,
XFile,
XUploader,
MkButton,
},
props: {
initFolder: {
initialFolder: {
type: Object,
required: false
},
@ -85,6 +85,8 @@ export default Vue.extend({
}
},
emits: ['selected', 'change-selection', 'move-root', 'cd', 'open-folder'],
data() {
return {
/**
@ -100,7 +102,7 @@ export default Vue.extend({
hierarchyFolders: [],
selectedFiles: [],
selectedFolders: [],
uploadings: [],
uploadings: os.uploads,
connection: null,
/**
@ -140,7 +142,7 @@ export default Vue.extend({
});
}
this.connection = this.$root.stream.useSharedConnection('drive');
this.connection = os.stream.useSharedConnection('drive');
this.connection.on('fileCreated', this.onStreamDriveFileCreated);
this.connection.on('fileUpdated', this.onStreamDriveFileUpdated);
@ -149,8 +151,8 @@ export default Vue.extend({
this.connection.on('folderUpdated', this.onStreamDriveFolderUpdated);
this.connection.on('folderDeleted', this.onStreamDriveFolderDeleted);
if (this.initFolder) {
this.move(this.initFolder);
if (this.initialFolder) {
this.move(this.initialFolder);
} else {
this.fetch();
}
@ -164,7 +166,7 @@ export default Vue.extend({
}
},
beforeDestroy() {
beforeUnmount() {
this.connection.dispose();
this.ilFilesObserver.disconnect();
},
@ -204,14 +206,6 @@ export default Vue.extend({
this.removeFolder(folderId);
},
onChangeUploaderUploads(uploads) {
this.uploadings = uploads;
},
onUploaderUploaded(file) {
this.addFile(file, true);
},
onDragover(e): any {
// ドラッグ元が自分自身の所有するアイテムだったら
if (this.isDragSource) {
@ -221,8 +215,8 @@ export default Vue.extend({
}
const isFile = e.dataTransfer.items[0].kind == 'file';
const isDriveFile = e.dataTransfer.types[0] == 'mk_drive_file';
const isDriveFolder = e.dataTransfer.types[0] == 'mk_drive_folder';
const isDriveFile = e.dataTransfer.types[0] == _DATA_TRANSFER_DRIVE_FILE_;
const isDriveFolder = e.dataTransfer.types[0] == _DATA_TRANSFER_DRIVE_FOLDER_;
if (isFile || isDriveFile || isDriveFolder) {
e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed == 'all' ? 'copy' : 'move';
@ -253,12 +247,12 @@ export default Vue.extend({
}
//#region ドライブのファイル
const driveFile = e.dataTransfer.getData('mk_drive_file');
const driveFile = e.dataTransfer.getData(_DATA_TRANSFER_DRIVE_FILE_);
if (driveFile != null && driveFile != '') {
const file = JSON.parse(driveFile);
if (this.files.some(f => f.id == file.id)) return;
this.removeFile(file.id);
this.$root.api('drive/files/update', {
os.api('drive/files/update', {
fileId: file.id,
folderId: this.folder ? this.folder.id : null
});
@ -266,7 +260,7 @@ export default Vue.extend({
//#endregion
//#region ドライブのフォルダ
const driveFolder = e.dataTransfer.getData('mk_drive_folder');
const driveFolder = e.dataTransfer.getData(_DATA_TRANSFER_DRIVE_FOLDER_);
if (driveFolder != null && driveFolder != '') {
const folder = JSON.parse(driveFolder);
@ -274,7 +268,7 @@ export default Vue.extend({
if (this.folder && folder.id == this.folder.id) return false;
if (this.folders.some(f => f.id == folder.id)) return false;
this.removeFolder(folder.id);
this.$root.api('drive/folders/update', {
os.api('drive/folders/update', {
folderId: folder.id,
parentId: this.folder ? this.folder.id : null
}).then(() => {
@ -282,15 +276,15 @@ export default Vue.extend({
}).catch(err => {
switch (err) {
case 'detected-circular-definition':
this.$root.dialog({
os.dialog({
title: this.$t('unableToProcess'),
text: this.$t('circularReferenceFolder')
});
break;
default:
this.$root.dialog({
os.dialog({
type: 'error',
text: this.$t('error')
text: this.$t('somethingHappened')
});
}
});
@ -303,19 +297,19 @@ export default Vue.extend({
},
urlUpload() {
this.$root.dialog({
os.dialog({
title: this.$t('uploadFromUrl'),
input: {
placeholder: this.$t('uploadFromUrlDescription')
}
}).then(({ canceled, result: url }) => {
if (canceled) return;
this.$root.api('drive/files/upload_from_url', {
os.api('drive/files/upload_from_url', {
url: url,
folderId: this.folder ? this.folder.id : undefined
});
this.$root.dialog({
os.dialog({
title: this.$t('uploadFromUrlRequested'),
text: this.$t('uploadFromUrlMayTakeTime')
});
@ -323,14 +317,14 @@ export default Vue.extend({
},
createFolder() {
this.$root.dialog({
os.dialog({
title: this.$t('createFolder'),
input: {
placeholder: this.$t('folderName')
}
}).then(({ canceled, result: name }) => {
if (canceled) return;
this.$root.api('drive/folders/create', {
os.api('drive/folders/create', {
name: name,
parentId: this.folder ? this.folder.id : undefined
}).then(folder => {
@ -340,7 +334,7 @@ export default Vue.extend({
},
renameFolder(folder) {
this.$root.dialog({
os.dialog({
title: this.$t('renameFolder'),
input: {
placeholder: this.$t('inputNewFolderName'),
@ -348,7 +342,7 @@ export default Vue.extend({
}
}).then(({ canceled, result: name }) => {
if (canceled) return;
this.$root.api('drive/folders/update', {
os.api('drive/folders/update', {
folderId: folder.id,
name: name
}).then(folder => {
@ -359,7 +353,7 @@ export default Vue.extend({
},
deleteFolder(folder) {
this.$root.api('drive/folders/delete', {
os.api('drive/folders/delete', {
folderId: folder.id
}).then(() => {
// 削除時に親フォルダに移動
@ -367,14 +361,14 @@ export default Vue.extend({
}).catch(err => {
switch(err.id) {
case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
this.$root.dialog({
os.dialog({
type: 'error',
title: this.$t('unableToDelete'),
text: this.$t('hasChildFilesOrFolders')
});
break;
default:
this.$root.dialog({
os.dialog({
type: 'error',
text: this.$t('unableToDelete')
});
@ -390,7 +384,9 @@ export default Vue.extend({
upload(file, folder) {
if (folder && typeof folder == 'object') folder = folder.id;
(this.$refs.uploader as any).upload(file, folder);
os.upload(file, folder).then(res => {
this.addFile(res, true);
});
},
chooseFile(file) {
@ -441,7 +437,7 @@ export default Vue.extend({
this.fetching = true;
this.$root.api('drive/folders/show', {
os.api('drive/folders/show', {
folderId: target
}).then(folder => {
this.folder = folder;
@ -465,7 +461,7 @@ export default Vue.extend({
if (this.folders.some(f => f.id == folder.id)) {
const exist = this.folders.map(f => f.id).indexOf(folder.id);
Vue.set(this.folders, exist, folder);
this.folders[exist] = folder;
return;
}
@ -482,7 +478,7 @@ export default Vue.extend({
if (this.files.some(f => f.id == file.id)) {
const exist = this.files.map(f => f.id).indexOf(file.id);
Vue.set(this.files, exist, file);
this.files[exist] = file;
return;
}
@ -543,7 +539,7 @@ export default Vue.extend({
const filesMax = 30;
// フォルダ一覧取得
this.$root.api('drive/folders', {
os.api('drive/folders', {
folderId: this.folder ? this.folder.id : null,
limit: foldersMax + 1
}).then(folders => {
@ -556,7 +552,7 @@ export default Vue.extend({
});
// ファイル一覧取得
this.$root.api('drive/files', {
os.api('drive/files', {
folderId: this.folder ? this.folder.id : null,
type: this.type,
limit: filesMax + 1
@ -587,7 +583,7 @@ export default Vue.extend({
const max = 30;
// ファイル一覧取得
this.$root.api('drive/files', {
os.api('drive/files', {
folderId: this.folder ? this.folder.id : null,
type: this.type,
untilId: this.files[this.files.length - 1].id,
@ -602,17 +598,57 @@ export default Vue.extend({
for (const x of files) this.appendFile(x);
this.fetching = false;
});
}
},
getMenu() {
return [{
text: this.$t('addFile'),
type: 'label'
}, {
text: this.$t('upload'),
icon: faUpload,
action: () => { this.selectLocalFile(); }
}, {
text: this.$t('fromUrl'),
icon: faLink,
action: () => { this.urlUpload(); }
}, null, {
text: this.folder ? this.folder.name : this.$t('drive'),
type: 'label'
}, this.folder ? {
text: this.$t('renameFolder'),
icon: faICursor,
action: () => { this.renameFolder(this.folder); }
} : undefined, this.folder ? {
text: this.$t('deleteFolder'),
icon: faTrashAlt,
action: () => { this.deleteFolder(this.folder); }
} : undefined, {
text: this.$t('createFolder'),
icon: faFolderPlus,
action: () => { this.createFolder(); }
}];
},
onContextmenu(e) {
os.contextMenu(this.getMenu(), e);
},
}
});
</script>
<style lang="scss" scoped>
.yfudmmck {
display: flex;
flex-direction: column;
height: 100%;
> nav {
display: block;
z-index: 2;
width: 100%;
padding: 0 8px;
box-sizing: border-box;
overflow: auto;
font-size: 0.9em;
box-shadow: 0 1px 0 var(--divider);
@ -666,7 +702,7 @@ export default Vue.extend({
}
> .main {
padding: 8px 0;
flex: 1;
overflow: auto;
&, * {
@ -734,11 +770,6 @@ export default Vue.extend({
pointer-events: none;
}
> .mk-uploader {
height: 100px;
padding: 16px;
}
> input {
display: none;
}

View File

@ -1,97 +1,142 @@
<template>
<x-popup :source="source" ref="popup" @closed="() => { $emit('closed'); destroyDom(); }">
<div class="omfetrab">
<header>
<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>
<MkModal ref="modal" :src="src" @click="$refs.modal.close()" @closed="$emit('closed')">
<div class="omfetrab _popup" :class="['w' + width, 'h' + height, { big }]">
<input ref="search" class="search" :class="{ filled: q != null && q != '' }" v-model.trim="q" :placeholder="$t('search')" @paste.stop="paste" @keyup.enter="done()">
<div class="emojis">
<template v-if="categories[0].isActive">
<header class="category"><fa :icon="faHistory" fixed-width/> {{ $t('recentUsed') }}</header>
<div class="list">
<button v-for="(emoji, i) in ($store.state.device.recentEmojis || [])"
<section class="result">
<div v-if="searchResultCustom.length > 0">
<button v-for="emoji in searchResultCustom"
class="_button"
:title="emoji.name"
@click="chosen(emoji)"
:key="i"
@click="chosen(emoji, $event)"
:key="emoji"
tabindex="0"
>
<mk-emoji 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"/>
</button>
</div>
<header class="category"><fa :icon="faAsterisk" fixed-width/> {{ $t('customEmojis') }}</header>
</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)"
<div v-if="searchResultUnicode.length > 0">
<button v-for="emoji in searchResultUnicode"
class="_button"
:title="emoji.name"
@click="chosen(emoji)"
@click="chosen(emoji, $event)"
:key="emoji.name"
tabindex="0"
>
<mk-emoji :emoji="emoji.char"/>
<MkEmoji :emoji="emoji.char"/>
</button>
</div>
</template>
<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]"
</section>
<div class="index">
<section v-if="showPinned">
<div>
<button v-for="emoji in pinned"
class="_button"
:title="emoji.name"
@click="chosen(emoji)"
:key="emoji.name"
@click="chosen(emoji, $event)"
tabindex="0"
>
<img :src="$store.state.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url"/>
<MkEmoji :emoji="emoji" :normal="true"/>
</button>
</div>
</section>
<section>
<header class="_acrylic"><Fa :icon="faClock" fixed-width/> {{ $t('recentUsed') }}</header>
<div>
<button v-for="emoji in $store.state.device.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 || $t('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.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url"/>
</button>
</div>
</template>
</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"
>
<MkEmoji :emoji="emoji.char"/>
</button>
</div>
</section>
</div>
</div>
</x-popup>
</MkModal>
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent, markRaw } from 'vue';
import { emojilist } from '../../misc/emojilist';
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 { getStaticImageUrl } from '@/scripts/get-static-image-url';
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 { groupByX } from '../../prelude/array';
import XPopup from './popup.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';
export default Vue.extend({
export default defineComponent({
components: {
XPopup,
MkModal,
},
props: {
source: {
required: true
src: {
required: false
},
showPinned: {
required: false,
default: true
},
asReactionPicker: {
required: false
},
},
emits: ['done', 'closed'],
data() {
return {
emojilist,
emojilist: markRaw(emojilist),
getStaticImageUrl,
customEmojis: {},
faGlobe, faHistory,
pinned: this.$store.state.settings.reactions,
width: this.asReactionPicker ? this.$store.state.device.reactionPickerWidth : 3,
height: this.asReactionPicker ? this.$store.state.device.reactionPickerHeight : 2,
big: this.asReactionPicker ? isDeviceTouch : false,
customEmojiCategories: this.$store.getters['instance/emojiCategories'],
customEmojis: this.$store.state.instance.meta.emojis,
visibleCategories: {},
q: null,
searchResultCustom: [],
searchResultUnicode: [],
faGlobe, faClock, faChevronDown,
categories: [{
icon: faAsterisk,
isActive: true
}, {
name: 'face',
icon: faLaugh,
isActive: false
@ -132,129 +177,356 @@ export default Vue.extend({
};
},
created() {
let local = this.$store.state.instance.meta.emojis;
local = groupByX(local, (x: any) => x.category || '');
this.customEmojis = local;
watch: {
q() {
if (this.q == null || this.q === '') {
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: {
go(category: any) {
this.goCategory(category.name);
getKey(emoji: any) {
return typeof emoji === 'string' ? emoji : (emoji.char || `:${emoji.name}:`);
},
goCategory(name: string) {
let matched = false;
for (const c of this.categories) {
c.isActive = c.name === name;
if (c.isActive) {
matched = true;
}
chosen(emoji: any, ev) {
if (ev) {
const el = ev.currentTarget || ev.target;
const rect = el.getBoundingClientRect();
const x = rect.left + (el.clientWidth / 2);
const y = rect.top + (el.clientHeight / 2);
os.popup(Particle, { x, y }, {}, 'end');
}
if (!matched) {
this.categories[0].isActive = true;
const key = this.getKey(emoji);
this.$emit('done', key);
this.$refs.modal.close();
// 最近使った絵文字更新
if (!this.pinned.includes(key)) {
let recents = this.$store.state.device.recentlyUsedEmojis;
recents = recents.filter((e: any) => e !== key);
recents.unshift(key);
this.$store.commit('device/set', { key: 'recentlyUsedEmojis', value: recents.splice(0, 16) });
}
},
chosen(emoji: any) {
const getKey = (emoji: any) => emoji.char || `:${emoji.name}:`;
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('chosen', getKey(emoji));
paste(event) {
const paste = (event.clipboardData || window.clipboardData).getData('text');
if (this.done(paste)) {
event.preventDefault();
}
},
close() {
this.$refs.popup.close();
}
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;
}
},
}
});
</script>
<style lang="scss" scoped>
.omfetrab {
width: 350px;
$pad: 8px;
--eachSize: 40px;
> header {
display: flex;
display: flex;
flex-direction: column;
contain: content;
> button {
flex: 1;
padding: 10px 0;
font-size: 16px;
transition: color 0.2s ease;
&.big {
--eachSize: 44px;
}
&:hover {
color: var(--textHighlighted);
transition: color 0s;
}
&.w1 {
width: calc((var(--eachSize) * 5) + (#{$pad} * 2));
}
&.active {
color: var(--accent);
transition: color 0s;
}
&.w2 {
width: calc((var(--eachSize) * 6) + (#{$pad} * 2));
}
&.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 {
height: 300px;
height: var(--height);
overflow-y: auto;
overflow-x: hidden;
> header.category {
position: sticky;
top: 0;
left: 0;
z-index: 1;
padding: 8px;
background: var(--panel);
font-size: 12px;
scrollbar-width: none;
&::-webkit-scrollbar {
display: none;
}
header.sub {
padding: 4px 8px;
font-size: 12px;
}
> .index {
min-height: var(--height);
position: relative;
border-bottom: solid 1px var(--divider);
div.list {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
gap: 4px;
padding: 8px;
> button {
position: relative;
padding: 0;
> .arrow {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
padding: 16px 0;
text-align: center;
opacity: 0.5;
pointer-events: none;
}
}
&:before {
content: '';
display: block;
width: 1px;
height: 0;
padding-bottom: 100%;
}
section {
> header {
position: sticky;
top: 0;
left: 0;
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);
transition: transform 0s;
font-size: 24px;
height: 1.25em;
vertical-align: -.25em;
pointer-events: none;
}
}
}
> * {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: contain;
font-size: 28px;
transition: transform 0.2s ease;
pointer-events: none;
&.result {
border-bottom: solid 1px var(--divider);
&:empty {
display: none;
}
}
&.unicode {
min-height: 384px;
}
&.custom {
min-height: 64px;
}
}
}
}

View File

@ -2,23 +2,19 @@
<img v-if="customEmoji" class="mk-emoji custom" :class="{ normal, noStyle }" :src="url" :alt="alt" :title="alt"/>
<img v-else-if="char && !useOsNativeEmojis" class="mk-emoji" :src="url" :alt="alt" :title="alt"/>
<span v-else-if="char && useOsNativeEmojis">{{ char }}</span>
<span v-else>:{{ name }}:</span>
<span v-else>{{ emoji }}</span>
</template>
<script lang="ts">
import Vue from 'vue';
import { getStaticImageUrl } from '../scripts/get-static-image-url';
import { defineComponent } from 'vue';
import { getStaticImageUrl } from '@/scripts/get-static-image-url';
import { twemojiSvgBase } from '../../misc/twemoji-base';
export default Vue.extend({
export default defineComponent({
props: {
name: {
type: String,
required: false
},
emoji: {
type: String,
required: false
required: true
},
normal: {
type: Boolean,
@ -49,6 +45,10 @@ export default Vue.extend({
},
computed: {
isCustom(): boolean {
return this.emoji.startsWith(':');
},
alt(): string {
return this.customEmoji ? `:${this.customEmoji.name}:` : this.char;
},
@ -68,8 +68,8 @@ export default Vue.extend({
watch: {
ce: {
handler() {
if (this.name) {
const customEmoji = this.ce.find(x => x.name == this.name);
if (this.isCustom) {
const customEmoji = this.ce.find(x => x.name === this.emoji.substr(1, this.emoji.length - 2));
if (customEmoji) {
this.customEmoji = customEmoji;
this.url = this.$store.state.device.disableShowingAnimatedImages
@ -83,7 +83,7 @@ export default Vue.extend({
},
created() {
if (!this.name) {
if (!this.isCustom) {
this.char = this.emoji;
}

View File

@ -1,19 +1,19 @@
<template>
<transition :name="$store.state.device.animation ? 'zoom' : ''" appear>
<div class="mjndxjcg _panel">
<div class="mjndxjcg">
<img src="https://xn--931a.moe/assets/error.jpg" class="_ghost"/>
<p><fa :icon="faExclamationTriangle"/> {{ $t('error') }}</p>
<mk-button @click="() => $emit('retry')" class="button">{{ $t('retry') }}</mk-button>
<p><Fa :icon="faExclamationTriangle"/> {{ $t('somethingHappened') }}</p>
<MkButton @click="() => $emit('retry')" class="button">{{ $t('retry') }}</MkButton>
</div>
</transition>
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent } from 'vue';
import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
import MkButton from './ui/button.vue';
export default Vue.extend({
export default defineComponent({
components: {
MkButton,
},

View File

@ -1,14 +1,15 @@
<template>
<span class="mk-file-type-icon">
<template v-if="kind == 'image'"><fa :icon="faFileImage"/></template>
<template v-if="kind == 'image'"><Fa :icon="faFileImage"/></template>
</span>
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent } from 'vue';
import { faFileImage } from '@fortawesome/free-solid-svg-icons';
import * as os from '@/os';
export default Vue.extend({
export default defineComponent({
props: {
type: {
type: String,

View File

@ -1,38 +1,38 @@
<template>
<button class="kpoogebi _button"
:class="{ wait, active: isFollowing || hasPendingFollowRequestFromYou, full }"
:class="{ wait, active: isFollowing || hasPendingFollowRequestFromYou, full, large }"
@click="onClick"
:disabled="wait"
v-if="isFollowing != null"
>
<template v-if="!wait">
<template v-if="hasPendingFollowRequestFromYou && user.isLocked">
<span v-if="full">{{ $t('followRequestPending') }}</span><fa :icon="faHourglassHalf"/>
<span v-if="full">{{ $t('followRequestPending') }}</span><Fa :icon="faHourglassHalf"/>
</template>
<template v-else-if="hasPendingFollowRequestFromYou && !user.isLocked"> <!-- つまりリモートフォローの場合 -->
<span v-if="full">{{ $t('processing') }}</span><fa :icon="faSpinner" pulse/>
<span v-if="full">{{ $t('processing') }}</span><Fa :icon="faSpinner" pulse/>
</template>
<template v-else-if="isFollowing">
<span v-if="full">{{ $t('unfollow') }}</span><fa :icon="faMinus"/>
<span v-if="full">{{ $t('unfollow') }}</span><Fa :icon="faMinus"/>
</template>
<template v-else-if="!isFollowing && user.isLocked">
<span v-if="full">{{ $t('followRequest') }}</span><fa :icon="faPlus"/>
<span v-if="full">{{ $t('followRequest') }}</span><Fa :icon="faPlus"/>
</template>
<template v-else-if="!isFollowing && !user.isLocked">
<span v-if="full">{{ $t('follow') }}</span><fa :icon="faPlus"/>
<span v-if="full">{{ $t('follow') }}</span><Fa :icon="faPlus"/>
</template>
</template>
<template v-else>
<span v-if="full">{{ $t('processing') }}</span><fa :icon="faSpinner" pulse fixed-width/>
<span v-if="full">{{ $t('processing') }}</span><Fa :icon="faSpinner" pulse fixed-width/>
</template>
</button>
</template>
<script lang="ts">
import Vue from 'vue';
import { defineComponent } from 'vue';
import { faSpinner, faPlus, faMinus, faHourglassHalf } from '@fortawesome/free-solid-svg-icons';
import * as os from '@/os';
export default Vue.extend({
export default defineComponent({
props: {
user: {
type: Object,
@ -43,6 +43,11 @@ export default Vue.extend({
required: false,
default: false,
},
large: {
type: Boolean,
required: false,
default: false,
},
},
data() {
@ -58,7 +63,7 @@ export default Vue.extend({
created() {
// 渡されたユーザー情報が不完全な場合
if (this.user.isFollowing == null) {
this.$root.api('users/show', {
os.api('users/show', {
userId: this.user.id
}).then(u => {
this.isFollowing = u.isFollowing;
@ -68,13 +73,13 @@ export default Vue.extend({
},
mounted() {
this.connection = this.$root.stream.useSharedConnection('main');
this.connection = os.stream.useSharedConnection('main');
this.connection.on('follow', this.onFollowChange);
this.connection.on('unfollow', this.onFollowChange);
},
beforeDestroy() {
beforeUnmount() {
this.connection.dispose();
},
@ -91,7 +96,7 @@ export default Vue.extend({
try {
if (this.isFollowing) {
const { canceled } = await this.$root.dialog({
const { canceled } = await os.dialog({
type: 'warning',
text: this.$t('unfollowConfirm', { name: this.user.name || this.user.username }),
showCancelButton: true
@ -99,21 +104,21 @@ export default Vue.extend({
if (canceled) return;
await this.$root.api('following/delete', {
await os.api('following/delete', {
userId: this.user.id
});
} else {
if (this.hasPendingFollowRequestFromYou) {
await this.$root.api('following/requests/cancel', {
await os.api('following/requests/cancel', {
userId: this.user.id
});
} else if (this.user.isLocked) {
await this.$root.api('following/create', {
await os.api('following/create', {
userId: this.user.id
});
this.hasPendingFollowRequestFromYou = true;
} else {
await this.$root.api('following/create', {
await os.api('following/create', {
userId: this.user.id
});
this.hasPendingFollowRequestFromYou = true;
@ -148,6 +153,12 @@ export default Vue.extend({
font-size: 14px;
}
&.large {
font-size: 16px;
height: 38px;
padding: 0 12px 0 16px;
}
&:not(.full) {
width: 31px;
}

View File

@ -0,0 +1,119 @@
<template>
<XModalWindow ref="dialog"
:width="450"
:can-close="false"
:with-ok-button="true"
:ok-button-disabled="false"
@click="cancel()"
@ok="ok()"
@close="cancel()"
@closed="$emit('closed')"
>
<template #header>
{{ title }}
</template>
<FormBase class="xkpnjxcv">
<template v-for="item in Object.keys(form).filter(item => !form[item].hidden)">
<FormInput v-if="form[item].type === 'number'" v-model:value="values[item]" type="number" :step="form[item].step || 1">
<span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $t('optional') }})</span>
<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"> ({{ $t('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"> ({{ $t('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>
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
</FormSwitch>
<FormSelect v-else-if="form[item].type === 'enum'" v-model:value="values[item]">
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $t('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"> ({{ $t('optional') }})</span></template>
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
</FormRange>
<FormButton v-else-if="form[item].type === 'button'" @click="form[item].action($event, values)">
<span v-text="form[item].content || item"></span>
</FormButton>
</template>
</FormBase>
</XModalWindow>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import XModalWindow from '@/components/ui/modal-window.vue';
import FormBase from './form/base.vue';
import FormInput from './form/input.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({
components: {
XModalWindow,
FormBase,
FormInput,
FormTextarea,
FormSwitch,
FormSelect,
FormRange,
FormButton,
},
props: {
title: {
type: String,
required: true,
},
form: {
type: Object,
required: true,
},
},
emits: ['done'],
data() {
return {
values: {}
};
},
created() {
for (const item in this.form) {
this.values[item] = this.form[item].hasOwnProperty('default') ? this.form[item].default : null;
}
},
methods: {
ok() {
this.$emit('done', {
result: this.values
});
this.$refs.dialog.close();
},
cancel() {
this.$emit('done', {
canceled: true
});
this.$refs.dialog.close();
}
}
});
</script>
<style lang="scss" scoped>
.xkpnjxcv {
}
</style>

Some files were not shown because too many files have changed in this diff Show More