Compare commits

..

183 Commits

Author SHA1 Message Date
64277b7157 10.34.0 2018-10-29 21:55:33 +09:00
4a72543f65 Merge pull request #3019 from syuilo/l10n_develop
New Crowdin translations
2018-10-29 21:53:58 +09:00
5b84d29807 Better indexes 2018-10-29 21:53:40 +09:00
a11061ec2b New translations ja-JP.yml (English) 2018-10-29 21:51:37 +09:00
24cfb93b2e Update .circleci/config.yml 2018-10-29 21:48:35 +09:00
502b42d63a New translations ja-JP.yml (Norwegian) 2018-10-29 21:43:46 +09:00
612672b79c New translations ja-JP.yml (Dutch) 2018-10-29 21:43:42 +09:00
abc670e1b1 New translations ja-JP.yml (Japanese, Kansai) 2018-10-29 21:43:38 +09:00
d589ccdd01 New translations ja-JP.yml (Spanish) 2018-10-29 21:43:34 +09:00
acb07d9f7d New translations ja-JP.yml (Russian) 2018-10-29 21:43:29 +09:00
f4d2186719 New translations ja-JP.yml (Portuguese) 2018-10-29 21:43:25 +09:00
d0ede5c665 New translations ja-JP.yml (Polish) 2018-10-29 21:43:20 +09:00
554cbb5e9b New translations ja-JP.yml (Korean) 2018-10-29 21:43:16 +09:00
dbd32a56bf New translations ja-JP.yml (Italian) 2018-10-29 21:43:10 +09:00
7f500235c6 New translations ja-JP.yml (German) 2018-10-29 21:43:05 +09:00
39a58084c8 New translations ja-JP.yml (French) 2018-10-29 21:43:01 +09:00
cde0fde836 New translations ja-JP.yml (English) 2018-10-29 21:42:56 +09:00
e70cca0fda New translations ja-JP.yml (Chinese Simplified) 2018-10-29 21:42:52 +09:00
919bd7eb82 New translations ja-JP.yml (Catalan) 2018-10-29 21:42:45 +09:00
312cff3d6f Fix 2018-10-29 21:39:35 +09:00
0d86eef3d7 Format 2018-10-29 21:38:09 +09:00
13acf570e7 Improve performance 2018-10-29 21:35:46 +09:00
fa17623fa8 モバイル版からブロックできるように 2018-10-29 21:32:38 +09:00
06fd525950 Refactor 2018-10-29 21:32:21 +09:00
4805b5115a 🎨 2018-10-29 21:09:32 +09:00
108dcb3e61 物理削除系の処理を削除
これらの処理はパフォーマンス的に現実的でないし、すべてのモデルの関係を把握している必要があり保守が困難
論理削除でなんとかする
2018-10-29 21:06:23 +09:00
780d272535 New translations ja-JP.yml (Norwegian) 2018-10-29 20:44:27 +09:00
02ea4b81a5 New translations ja-JP.yml (Dutch) 2018-10-29 20:44:22 +09:00
7c1bdc6d36 New translations ja-JP.yml (Japanese, Kansai) 2018-10-29 20:44:15 +09:00
78c7b8b836 New translations ja-JP.yml (Spanish) 2018-10-29 20:44:10 +09:00
227da30acb New translations ja-JP.yml (Russian) 2018-10-29 20:44:03 +09:00
610805026f New translations ja-JP.yml (Portuguese) 2018-10-29 20:43:57 +09:00
c02399c3d2 New translations ja-JP.yml (Polish) 2018-10-29 20:43:51 +09:00
e0799d4153 New translations ja-JP.yml (Korean) 2018-10-29 20:43:45 +09:00
6df83f1aa9 New translations ja-JP.yml (Italian) 2018-10-29 20:43:41 +09:00
efb5ad1d9b New translations ja-JP.yml (German) 2018-10-29 20:43:35 +09:00
716976f016 New translations ja-JP.yml (French) 2018-10-29 20:43:31 +09:00
7892f41b84 New translations ja-JP.yml (English) 2018-10-29 20:43:26 +09:00
d549e03b3f New translations ja-JP.yml (Chinese Simplified) 2018-10-29 20:43:22 +09:00
c511ef21ff New translations ja-JP.yml (Catalan) 2018-10-29 20:43:18 +09:00
d64dc45899 User blocking (Following part) (#3035)
* block wip

* UndoBlock

* UnBlock

* wip

* follow

* UI

* fix
2018-10-29 20:32:42 +09:00
bcb0588409 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-10-29 19:33:00 +09:00
0975959eb9 Clean up 2018-10-29 19:32:20 +09:00
e985a6d9d3 Update config.yml 2018-10-29 19:27:47 +09:00
b893305974 Delete appveyor.yml 2018-10-29 19:19:41 +09:00
724fdd44e4 Clean up 2018-10-29 19:13:16 +09:00
b480ef669c Fix doc 2018-10-29 19:11:01 +09:00
4b145da046 Fix MFM parsing 2018-10-29 19:09:24 +09:00
83d168ece3 Fix API definition 2018-10-29 19:04:58 +09:00
ae44fe7818 Refactor 2018-10-29 15:09:03 +09:00
f8981b3acb Update src/server/api/endpoints/notes/reactions.ts 2018-10-29 15:07:50 +09:00
050b324885 ? 2018-10-29 10:52:42 +09:00
e74c0df6c6 Fix #3034 2018-10-29 10:52:36 +09:00
22d0d11895 Update note-reaction.ts 2018-10-28 21:41:39 +09:00
80d0c0cf74 Bump eslint from 5.7.0 to 5.8.0 (#3030)
Bumps [eslint](https://github.com/eslint/eslint) from 5.7.0 to 5.8.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/v5.7.0...v5.8.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-28 21:38:27 +09:00
518646b925 Fix: Unexpected remote user is selected (#3032) 2018-10-28 07:49:58 +09:00
479d7e0087 Merge pull request #3031 from syuilo/patch-autogen 2018-10-27 13:37:02 +09:00
8ea1a555f4 Update README.md [AUTOGEN] 2018-10-27 13:36:06 +09:00
04024dc37c Update README.md [AUTOGEN] (#3024) 2018-10-27 03:47:04 +09:00
060ff9288f Build assets in CircleCI. (#3021) 2018-10-27 03:46:48 +09:00
197116ee78 New translations ja-JP.yml (Japanese, Kansai) 2018-10-26 22:12:16 +09:00
a1e0015257 New translations ja-JP.yml (Japanese, Kansai) 2018-10-26 22:01:37 +09:00
7e701ef9e0 10.33.0 2018-10-26 15:23:10 +09:00
3d6fb661bb Update src/client/app/desktop/views/components/settings.2fa.vue 2018-10-26 15:17:50 +09:00
fc372496da Client: Make drive folder deletable 2018-10-26 15:06:55 +09:00
ad7258fe9c Fix bug 2018-10-26 15:06:27 +09:00
bd707cb2a8 🎨 2018-10-26 14:51:57 +09:00
1839b5f205 Improve usability 2018-10-26 14:47:30 +09:00
02b47f963c API: Better error response 2018-10-26 14:38:34 +09:00
f8a7f9378a Improve usability 2018-10-26 14:38:22 +09:00
65cb253be4 Update src/client/app/common/views/components/ui/textarea.vue 2018-10-26 14:38:03 +09:00
a12356b24b Merge pull request #3010 from syuilo/l10n_develop
New Crowdin translations
2018-10-26 08:55:11 +09:00
6a67ad7f93 New translations ja-JP.yml (English) 2018-10-26 08:51:31 +09:00
140a7f0b1c New translations ja-JP.yml (Norwegian) 2018-10-26 08:42:29 +09:00
00159bc6b5 New translations ja-JP.yml (Dutch) 2018-10-26 08:42:24 +09:00
9542260103 New translations ja-JP.yml (Japanese, Kansai) 2018-10-26 08:42:20 +09:00
72074578df New translations ja-JP.yml (Spanish) 2018-10-26 08:42:15 +09:00
3b4750a988 New translations ja-JP.yml (Russian) 2018-10-26 08:42:11 +09:00
aeec5f0163 New translations ja-JP.yml (Portuguese) 2018-10-26 08:42:05 +09:00
9c94d8c8d6 New translations ja-JP.yml (Polish) 2018-10-26 08:41:59 +09:00
581712a2c8 New translations ja-JP.yml (Korean) 2018-10-26 08:41:54 +09:00
b25b51aaca New translations ja-JP.yml (Italian) 2018-10-26 08:41:50 +09:00
fb97e13a61 New translations ja-JP.yml (German) 2018-10-26 08:41:44 +09:00
36e154fdb2 New translations ja-JP.yml (French) 2018-10-26 08:41:40 +09:00
ca273a24b4 New translations ja-JP.yml (English) 2018-10-26 08:41:36 +09:00
d828bf2889 New translations ja-JP.yml (Chinese Simplified) 2018-10-26 08:41:32 +09:00
87efccef18 New translations ja-JP.yml (Catalan) 2018-10-26 08:41:28 +09:00
e0bf522e7f Client: Improve API settings 2018-10-26 08:37:30 +09:00
5b1cd3bd3c Fix bug 2018-10-26 08:36:50 +09:00
f00489196d Bump @types/mocha from 5.2.3 to 5.2.5 (#3006)
Bumps [@types/mocha](https://github.com/DefinitelyTyped/DefinitelyTyped) from 5.2.3 to 5.2.5.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-26 06:40:31 +09:00
dd53bf7e51 Bump html-minifier from 3.5.20 to 3.5.21 (#3015)
Bumps [html-minifier](https://github.com/kangax/html-minifier) from 3.5.20 to 3.5.21.
- [Release notes](https://github.com/kangax/html-minifier/releases)
- [Commits](https://github.com/kangax/html-minifier/compare/v3.5.20...v3.5.21)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-26 06:40:01 +09:00
35a6da26d2 Bump apexcharts from 2.1.5 to 2.1.6 (#3013)
Bumps [apexcharts](https://github.com/apexcharts/apexcharts.js) from 2.1.5 to 2.1.6.
- [Release notes](https://github.com/apexcharts/apexcharts.js/releases)
- [Changelog](https://github.com/apexcharts/apexcharts.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/apexcharts/apexcharts.js/compare/v2.1.5...v2.1.6)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-26 06:39:48 +09:00
c8c8748a0b Bump webpack from 4.23.0 to 4.23.1 (#3011)
Bumps [webpack](https://github.com/webpack/webpack) from 4.23.0 to 4.23.1.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.23.0...v4.23.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-26 06:38:08 +09:00
46d0065a90 New translations ja-JP.yml (Japanese, Kansai) 2018-10-26 01:01:40 +09:00
990b0180a8 New translations ja-JP.yml (Japanese, Kansai) 2018-10-26 00:51:35 +09:00
f3bfb72251 New translations ja-JP.yml (Japanese, Kansai) 2018-10-26 00:42:19 +09:00
0358a7edc6 10.32.0 2018-10-25 17:31:13 +09:00
37f99fca04 Update appveyor.yml 2018-10-25 17:25:35 +09:00
50dfc8ab82 Disable ElasticSearch in CI enviroment 2018-10-25 17:16:39 +09:00
c70c739b0c Remove some unused packages 2018-10-25 16:15:33 +09:00
5918285326 Bug fix and some refactoring 2018-10-25 16:10:48 +09:00
b1dead1186 Merge pull request #2995 from syuilo/l10n_develop
New Crowdin translations
2018-10-25 11:51:43 +09:00
3e36e132c3 New translations ja-JP.yml (English) 2018-10-25 11:51:05 +09:00
fa8d1809e7 New translations ja-JP.yml (Norwegian) 2018-10-25 11:42:18 +09:00
e12b668d04 New translations ja-JP.yml (Dutch) 2018-10-25 11:42:15 +09:00
e5506f7d8c New translations ja-JP.yml (Japanese, Kansai) 2018-10-25 11:42:11 +09:00
b1ac7e5cb3 New translations ja-JP.yml (Spanish) 2018-10-25 11:42:05 +09:00
ffd164a5f3 New translations ja-JP.yml (Russian) 2018-10-25 11:41:59 +09:00
cb27414026 New translations ja-JP.yml (Portuguese) 2018-10-25 11:41:55 +09:00
e320912f33 New translations ja-JP.yml (Polish) 2018-10-25 11:41:51 +09:00
d23aaae698 New translations ja-JP.yml (Korean) 2018-10-25 11:41:45 +09:00
120c0fe848 New translations ja-JP.yml (Italian) 2018-10-25 11:41:41 +09:00
34857b9520 New translations ja-JP.yml (German) 2018-10-25 11:41:37 +09:00
a87dcece4c New translations ja-JP.yml (French) 2018-10-25 11:41:33 +09:00
01e2479004 New translations ja-JP.yml (English) 2018-10-25 11:41:28 +09:00
0fd63fe091 New translations ja-JP.yml (Chinese Simplified) 2018-10-25 11:41:24 +09:00
cc98801c67 New translations ja-JP.yml (Catalan) 2018-10-25 11:41:15 +09:00
2724d74108 Better text 2018-10-25 11:35:55 +09:00
6d0c0d3a5f New translations ja-JP.yml (Norwegian) 2018-10-25 11:32:30 +09:00
15f8f63317 New translations ja-JP.yml (Dutch) 2018-10-25 11:32:24 +09:00
d970d65968 New translations ja-JP.yml (Japanese, Kansai) 2018-10-25 11:32:20 +09:00
04d359691b New translations ja-JP.yml (Spanish) 2018-10-25 11:32:14 +09:00
bfc519944a New translations ja-JP.yml (Russian) 2018-10-25 11:32:08 +09:00
9f69fd14a2 New translations ja-JP.yml (Portuguese) 2018-10-25 11:32:04 +09:00
85058787b2 New translations ja-JP.yml (Polish) 2018-10-25 11:31:58 +09:00
ec851623e0 New translations ja-JP.yml (Korean) 2018-10-25 11:31:52 +09:00
e05429a3ec New translations ja-JP.yml (Italian) 2018-10-25 11:31:47 +09:00
f651c41816 New translations ja-JP.yml (German) 2018-10-25 11:31:43 +09:00
6b88d99ae2 New translations ja-JP.yml (French) 2018-10-25 11:31:38 +09:00
814469cdca New translations ja-JP.yml (English) 2018-10-25 11:31:34 +09:00
536bf8f141 New translations ja-JP.yml (Chinese Simplified) 2018-10-25 11:31:28 +09:00
6a27290815 New translations ja-JP.yml (Catalan) 2018-10-25 11:31:22 +09:00
7dde3465e2 Improve drive information 2018-10-25 11:30:30 +09:00
0206a4ac83 Clean up 2018-10-25 08:42:07 +09:00
380f5a972c Implement featured note API 2018-10-25 07:04:15 +09:00
407467a236 Update Node.js to v11 2018-10-25 06:16:49 +09:00
bcfa9e18bf Update src/client/app/desktop/views/pages/deck/deck.notes.vue 2018-10-25 06:14:31 +09:00
69b730e91a Clean up 2018-10-25 06:04:06 +09:00
6c6c003d68 Bump webpack from 4.22.0 to 4.23.0 (#3007)
Bumps [webpack](https://github.com/webpack/webpack) from 4.22.0 to 4.23.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.22.0...v4.23.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-25 05:43:25 +09:00
fd652b70d6 Fix: Remove unused import 2018-10-25 05:33:40 +09:00
804a5ab6a8 Bump eslint from 5.0.1 to 5.7.0 (#3002)
Bumps [eslint](https://github.com/eslint/eslint) from 5.0.1 to 5.7.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/v5.0.1...v5.7.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-24 19:03:33 +09:00
d984a1aa19 Bump highlight.js from 9.12.0 to 9.13.1 (#3000)
Bumps [highlight.js](https://github.com/highlightjs/highlight.js) from 9.12.0 to 9.13.1.
- [Release notes](https://github.com/highlightjs/highlight.js/releases)
- [Changelog](https://github.com/highlightjs/highlight.js/blob/master/CHANGES.md)
- [Commits](https://github.com/highlightjs/highlight.js/compare/9.12.0...9.13.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-24 19:02:55 +09:00
e05b5a6ab8 Bump ts-loader from 4.4.1 to 5.2.2 (#3001)
Bumps [ts-loader](https://github.com/TypeStrong/ts-loader) from 4.4.1 to 5.2.2.
- [Release notes](https://github.com/TypeStrong/ts-loader/releases)
- [Changelog](https://github.com/TypeStrong/ts-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/TypeStrong/ts-loader/compare/v4.4.1...v5.2.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-24 19:02:22 +09:00
3ff84db421 Bump typescript from 2.9.2 to 3.1.3 (#2999)
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 2.9.2 to 3.1.3.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v2.9.2...v3.1.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-24 19:00:26 +09:00
74ca73ecb4 Bump koa from 2.5.1 to 2.6.1 (#2998)
Bumps [koa](https://github.com/koajs/koa) from 2.5.1 to 2.6.1.
- [Release notes](https://github.com/koajs/koa/releases)
- [Changelog](https://github.com/koajs/koa/blob/master/History.md)
- [Commits](https://github.com/koajs/koa/compare/2.5.1...2.6.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-24 19:00:01 +09:00
37032f68ae Update README.md 2018-10-24 18:56:15 +09:00
21d3605737 Update appveyor.yml 2018-10-24 18:51:08 +09:00
0a7c1caf43 Update appveyor.yml 2018-10-24 18:49:56 +09:00
24b57335fa Use package-lock 2018-10-24 18:43:55 +09:00
9f981d875a Implement drive/folders/delete 2018-10-24 18:37:58 +09:00
6dcc3800e0 Improve some API definitions 2018-10-24 18:32:19 +09:00
44e9be5a1c Better default theme 🎨 2018-10-24 15:48:27 +09:00
6a8c560d21 Docker関連の修正 (#2997)
* Modify Dockerfile and docker-compose.yml

* Fix MongoDB connection error
* Use alpine-3.8 instead of alpine-edge as base image
* Modify install packages
* Modify Mongodb image tag name

* Update Docker documents

* Add 'Download misskey' paragraph

* Make redis optional for Docker
2018-10-24 14:36:42 +09:00
0afe8c6b34 New translations ja-JP.yml (English) 2018-10-24 11:31:23 +09:00
0f5d7f52a0 New translations ja-JP.yml (Norwegian) 2018-10-24 08:02:23 +09:00
aaaefa0ee2 New translations ja-JP.yml (Dutch) 2018-10-24 08:02:18 +09:00
276929bc7e New translations ja-JP.yml (Japanese, Kansai) 2018-10-24 08:02:14 +09:00
32882f1397 New translations ja-JP.yml (Spanish) 2018-10-24 08:02:10 +09:00
7dc380c485 New translations ja-JP.yml (Russian) 2018-10-24 08:02:06 +09:00
49aaa9a5d3 New translations ja-JP.yml (Portuguese) 2018-10-24 08:02:01 +09:00
84462eb3f2 New translations ja-JP.yml (Polish) 2018-10-24 08:01:57 +09:00
91709ca979 New translations ja-JP.yml (Korean) 2018-10-24 08:01:52 +09:00
9ece71e652 New translations ja-JP.yml (Italian) 2018-10-24 08:01:46 +09:00
4e93f6c6ff New translations ja-JP.yml (German) 2018-10-24 08:01:42 +09:00
ad9f1fb7c7 New translations ja-JP.yml (French) 2018-10-24 08:01:37 +09:00
abaeea6d8b New translations ja-JP.yml (English) 2018-10-24 08:01:31 +09:00
8efbcc4c6b New translations ja-JP.yml (Chinese Simplified) 2018-10-24 08:01:26 +09:00
8ef31cab8c New translations ja-JP.yml (Catalan) 2018-10-24 08:01:19 +09:00
37ae53e55c Update locales/ja-JP.yml 2018-10-24 07:52:57 +09:00
d01f06bdf4 New translations ja-JP.yml (Norwegian) 2018-10-24 06:56:47 +09:00
0d4a8d118a New translations ja-JP.yml (Dutch) 2018-10-24 06:56:42 +09:00
7e6ec83b1f New translations ja-JP.yml (Japanese, Kansai) 2018-10-24 06:56:37 +09:00
9eb515cfae New translations ja-JP.yml (Spanish) 2018-10-24 06:56:33 +09:00
d0da019a21 New translations ja-JP.yml (Russian) 2018-10-24 06:56:27 +09:00
57a13c9ad3 New translations ja-JP.yml (Portuguese) 2018-10-24 06:56:23 +09:00
7f39100634 New translations ja-JP.yml (Polish) 2018-10-24 06:56:17 +09:00
9ab96ef39a New translations ja-JP.yml (Korean) 2018-10-24 06:56:13 +09:00
ed21d797a6 New translations ja-JP.yml (Italian) 2018-10-24 06:56:08 +09:00
15960746bb New translations ja-JP.yml (German) 2018-10-24 06:56:02 +09:00
e0f1e3ca71 New translations ja-JP.yml (French) 2018-10-24 06:55:57 +09:00
51d0524182 New translations ja-JP.yml (English) 2018-10-24 06:55:53 +09:00
16801aa5c4 New translations ja-JP.yml (Chinese Simplified) 2018-10-24 06:55:49 +09:00
cd23f66834 New translations ja-JP.yml (Catalan) 2018-10-24 06:55:42 +09:00
125 changed files with 19178 additions and 1536 deletions

60
.circleci/config.yml Normal file
View File

@ -0,0 +1,60 @@
version: 2
general:
branches:
ignore:
- l10n_develop
jobs:
webpack-build:
working_directory: /misskey
docker:
- image: yukimochi/misskey-builder:latest
steps:
- checkout
- run:
name: Setup Dependencies
command: |
yarn install
yarn global add web-push
- run:
name: Import default.yml
command: |
echo ${IMPORT_DEFAULT_YML} | base64 -d | gzip -d > .config/default.yml
- run:
name: Build Webpack
command: |
yarn run build
- run:
name: Compress clients
command: |
find ./built/client -name "*.js" -or -name "*.js.map" -or -name "*.css" -or -name "*.svg" -or -name "*.html" -or -name "*.json" | xargs -t gzip -k -9
find ./built/client -name "*.js" -or -name "*.js.map" -or -name "*.css" -or -name "*.svg" -or -name "*.html" -or -name "*.json" | xargs -t brotli -q 10
tar cfz ~/built-${CIRCLE_SHA1}.tar.gz built
- run:
name: Send built s3
command: |
mc config host add ykmc ${s3_endpoint} ${s3_accesskey} ${s3_secretkey}
mc cp ~/built-${CIRCLE_SHA1}.tar.gz ${backet}/${CIRCLE_BRANCH}/
docker-build:
docker:
- image: docker:17-git
steps:
- checkout
- setup_remote_docker
- run:
name: build docker image
command: |
docker build -t misskey:latest .
- run:
name: upload image to docker hub.
command: |
docker login --username=${DOCKER_USER} --password=${DOCKER_PASS}
docker push ${DOCKER_USER}/misskey:latest
workflows:
version: 2
build:
jobs:
- webpack-build
- docker-build

1
.npmrc
View File

@ -1,2 +1 @@
save-exact = true save-exact = true
package-lock = false

View File

@ -11,7 +11,7 @@ branches:
language: node_js language: node_js
node_js: node_js:
- 10.1.0 - 11.0.0
env: env:
- CXX=g++-4.8 NODE_ENV=production - CXX=g++-4.8 NODE_ENV=production

View File

@ -13,7 +13,3 @@ redis:
host: localhost host: localhost
port: 6379 port: 6379
pass: '' pass: ''
elasticsearch:
host: localhost
port: 9200
pass: ''

View File

@ -13,7 +13,3 @@ redis:
host: localhost host: localhost
port: 6379 port: 6379
pass: '' pass: ''
elasticsearch:
host: localhost
port: 9200
pass: ''

View File

@ -1,16 +1,26 @@
FROM alpine:edge AS base FROM alpine:3.8 AS base
ENV NODE_ENV=production ENV NODE_ENV=production
RUN apk add --no-cache nodejs nodejs-npm RUN apk add --no-cache nodejs nodejs-npm zlib
RUN apk add vips fftw --update-cache --repository https://dl-3.alpinelinux.org/alpine/edge/testing/
WORKDIR /misskey WORKDIR /misskey
COPY . ./ COPY . ./
FROM base AS builder FROM base AS builder
RUN apk add --no-cache gcc g++ python autoconf automake file make nasm RUN apk add --no-cache \
RUN apk add vips-dev fftw-dev --update-cache --repository https://dl-3.alpinelinux.org/alpine/edge/testing/ gcc \
g++ \
libc-dev \
python \
autoconf \
automake \
file \
make \
nasm \
pkgconfig \
libtool \
zlib-dev
RUN npm install \ RUN npm install \
&& npm install -g node-gyp \ && npm install -g node-gyp \
&& node-gyp configure \ && node-gyp configure \

View File

@ -5,7 +5,7 @@
[![][travis-badge]][travis-link] [![][travis-badge]][travis-link]
[![][dependencies-badge]][dependencies-link] [![][dependencies-badge]][dependencies-link]
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![Greenkeeper badge](https://badges.greenkeeper.io/syuilo/misskey.svg)](https://greenkeeper.io/) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
**Sophisticated microblogging platform, evolving forever.** **Sophisticated microblogging platform, evolving forever.**
@ -71,39 +71,46 @@ Please see [Contribution guide](./CONTRIBUTING.md).
---------------------------------------------------------------- ----------------------------------------------------------------
<!-- PATREON_START --> <!-- PATREON_START -->
<table><tr> <table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=CXe9AqlZy9AsYfiWd3OBYVOzvODoN47Litz0Tu4BFpU%3D" alt="Gargron"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1?token-time=2145916800&token-hash=d6P5MWHHsCMxUuBAEPAoVc5wLUR19mIhqAq7Ma9h9rI%3D" alt="ne_moni"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/2?token-time=2145916800&token-hash=mgPdX9TqZxEg4TTPuc477dxhIgYk9246qafjWZEqZ7g%3D" alt="Melilot"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/2?token-time=2145916800&token-hash=mgPdX9TqZxEg4TTPuc477dxhIgYk9246qafjWZEqZ7g%3D" alt="Melilot"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/2?token-time=2145916800&token-hash=rwZ8qvbm_kpA4ib3kc07tVKupXeySpY5ATQFGxfL9v0%3D" alt="Xeltica"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1?token-time=2145916800&token-hash=I8lJVM8LeW6TSo5W6uIIRZ42cw83zp1wK_FsbzY0mcQ%3D" alt="mydarkstar"></td>
<td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td> <td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=zwSu01tOtn5xTUucDZHuPsCxF2HBEMVs9ROJKTlEV_o%3D" alt="nemu"></td>
</tr><tr> </tr><tr>
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
<td><a href="https://www.patreon.com/negao">negao</a></td> <td><a href="https://www.patreon.com/negao">negao</a></td>
<td><a href="https://www.patreon.com/user?u=13099460">ne_moni</a></td>
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td> <td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
<td><a href="https://www.patreon.com/AxellaMC">Xeltica</a></td>
<td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td> <td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td>
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td> <td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td> <td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
</tr></table> </tr></table>
<table><tr> <table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=zwSu01tOtn5xTUucDZHuPsCxF2HBEMVs9ROJKTlEV_o%3D" alt="nemu"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D" alt="Naoki Kosaka"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D" alt="Naoki Kosaka"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/8241184/39e18850e87a449e9c9a71acb3310ebd/2?token-time=2145916800&token-hash=iUXOQzRyJDv3PJxwS7Mjwg1459dzh2trOq6NFtXu_OM%3D" alt="Acid Chicken"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=UERBN4OyP7Nh5XwwdDg0N0IE5cD6_qUQMO81Z5Wizso%3D" alt="Hiratake"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=UERBN4OyP7Nh5XwwdDg0N0IE5cD6_qUQMO81Z5Wizso%3D" alt="Hiratake"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/10789744/97175095d8f04c0f86225ff47cb98d40/1?token-time=2145916800&token-hash=P4BIzCX2I1CkEP66ottfhsC8Wr6BUSamjA-vq3pLqFI%3D" alt="Naoki Hirayama"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=tB1e_r8RlZ5sFL0KV_e8dugapxatNBRK1Z3h67TO1g8%3D" alt="Gargron"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1?token-time=2145916800&token-hash=VZUtwrjQa8Jml4twCjHYQQZ64wHEY4oIlGl7Kc-VYUQ%3D" alt="Nokotaro Takeda"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td>
</tr><tr> </tr><tr>
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
<td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td> <td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td>
<td><a href="https://www.patreon.com/acid_chicken">Acid Chicken</a></td>
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td> <td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
<td><a href="https://www.patreon.com/spinlock">Naoki Hirayama</a></td>
<td><a href="https://www.patreon.com/dansup">dansup</a></td> <td><a href="https://www.patreon.com/dansup">dansup</a></td>
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td> <td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
</tr></table> </tr></table>
<table><tr>
</tr><tr>
</tr></table>
**Last updated:** Tue, 02 Oct 2018 09:25:07 UTC **Last updated:** Sat, 27 Oct 2018 04:36:06 UTC
<!-- PATREON_END --> <!-- PATREON_END -->
:four_leaf_clover: Copyright :four_leaf_clover: Copyright

View File

@ -1,13 +0,0 @@
const deleteUser = require('../built/models/user').deleteUser;
const args = process.argv.slice(2);
const userId = args[0];
console.log(`deleting ${userId}...`);
deleteUser(userId).then(() => {
console.log('done');
}, e => {
console.error(e);
});

View File

@ -1,23 +0,0 @@
const mongo = require('mongodb');
const User = require('../built/models/user').default;
const args = process.argv.slice(2);
const user = args[0];
const q = user.startsWith('@') ? {
username: user.split('@')[1],
host: user.split('@')[2] || null
} : { _id: new mongo.ObjectID(user) };
console.log(`Mark as verfied ${user}...`);
User.update(q, {
$set: {
isVerified: true
}
}).then(() => {
console.log(`Done ${user}`);
}, e => {
console.error(e);
});

View File

@ -1,42 +0,0 @@
const { default: Note } = require('../built/models/note');
const { default: Meta } = require('../built/models/meta');
const { default: User } = require('../built/models/user');
async function main() {
const meta = await Meta.findOne({});
const notesCount = await Note.count();
const usersCount = await User.count();
const originalNotesCount = await Note.count({
'_user.host': null
});
const originalUsersCount = await User.count({
host: null
});
const stats = {
notesCount,
usersCount,
originalNotesCount,
originalUsersCount
};
if (meta) {
await Meta.update({}, {
$set: {
stats
}
});
} else {
await Meta.insert({
stats
});
}
}
main().then(() => {
console.log('done');
}).catch(console.error);

View File

@ -6,7 +6,7 @@ services:
restart: always restart: always
links: links:
- mongo - mongo
- redis # - redis
# - es # - es
ports: ports:
- "127.0.0.1:3000:3000" - "127.0.0.1:3000:3000"
@ -14,18 +14,18 @@ services:
- internal_network - internal_network
- external_network - external_network
redis: # redis:
restart: always # restart: always
image: redis:4.0-alpine # image: redis:4.0-alpine
networks: # networks:
- internal_network # - internal_network
### Uncomment to enable Redis persistance ### Uncomment to enable Redis persistance
# volumes: ## volumes:
# - ./redis:/data ## - ./redis:/data
mongo: mongo:
restart: always restart: always
image: mongo:4.1-bionic image: mongo:4.1
networks: networks:
- internal_network - internal_network
environment: environment:

View File

@ -7,23 +7,29 @@ This guide describes how to install and setup Misskey with Docker.
---------------------------------------------------------------- ----------------------------------------------------------------
*1.* Make configuration files *1.* Download Misskey
----------------------------------------------------------------
1. `git clone -b master git://github.com/syuilo/misskey.git` Clone Misskey repository's master branch.
2. `cd misskey` Move to misskey directory.
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) tag.
*2.* Make configuration files
---------------------------------------------------------------- ----------------------------------------------------------------
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`. 1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` Copy the `.config/mongo_initdb_example.js` and rename it to `mongo_initdb.js`. 2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` Copy the `.config/mongo_initdb_example.js` and rename it to `mongo_initdb.js`.
2. Edit `default.yml` and `mongo_initdb.js`. 2. Edit `default.yml` and `mongo_initdb.js`.
*2.* Configure Docker *3.* Configure Docker
---------------------------------------------------------------- ----------------------------------------------------------------
Edit `docker-compose.yml`. Edit `docker-compose.yml`.
*3.* Build Misskey *4.* Build Misskey
---------------------------------------------------------------- ----------------------------------------------------------------
Build misskey with the following: Build misskey with the following:
`docker-compose build` `docker-compose build`
*4.* That is it. *5.* That is it.
---------------------------------------------------------------- ----------------------------------------------------------------
Well done! Now, you have an environment that run to Misskey. Well done! Now, you have an environment that run to Misskey.

View File

@ -7,23 +7,29 @@ Dockerを使ったMisskey構築方法
---------------------------------------------------------------- ----------------------------------------------------------------
*1.* 設定ファイルを作成する *1.* Misskeyのダウンロード
----------------------------------------------------------------
1. `git clone -b master git://github.com/syuilo/misskey.git` masterブランチからMisskeyレポジトリをクローン
2. `cd misskey` misskeyディレクトリに移動
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
*2.* 設定ファイルを作成する
---------------------------------------------------------------- ----------------------------------------------------------------
1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする 1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` `.config/mongo_initdb_example.js`をコピーし名前を`mongo_initdb.js`にする 2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` `.config/mongo_initdb_example.js`をコピーし名前を`mongo_initdb.js`にする
3. `default.yml``mongo_initdb.js`を編集する 3. `default.yml``mongo_initdb.js`を編集する
*2.* Dockerの設定 *3.* Dockerの設定
---------------------------------------------------------------- ----------------------------------------------------------------
`docker-compose.yml`を編集してください。 `docker-compose.yml`を編集してください。
*3.* Misskeyのビルド *4.* Misskeyのビルド
---------------------------------------------------------------- ----------------------------------------------------------------
次のコマンドでMisskeyをビルドしてください: 次のコマンドでMisskeyをビルドしてください:
`docker-compose build` `docker-compose build`
*4.* 以上です! *5.* 以上です!
---------------------------------------------------------------- ----------------------------------------------------------------
お疲れ様でした。これでMisskeyを動かす準備は整いました。 お疲れ様でした。これでMisskeyを動かす準備は整いました。

View File

@ -62,6 +62,7 @@ common:
years_ago: "{}年前" years_ago: "{}年前"
month-and-day: "{month}月 {day}日" month-and-day: "{month}月 {day}日"
trash: "ゴミ箱" trash: "ゴミ箱"
drive: "ドライブ"
weekday-short: weekday-short:
sunday: "日" sunday: "日"
monday: "月" monday: "月"
@ -541,11 +542,14 @@ desktop/views/components/charts.vue:
title: "チャート" title: "チャート"
per-day: "1日ごと" per-day: "1日ごと"
per-hour: "1時間ごと" per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿" notes: "投稿"
users: "ユーザー" users: "ユーザー"
drive: "ドライブ" drive: "ドライブ"
network: "ネットワーク" network: "ネットワーク"
charts: charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
@ -575,7 +579,6 @@ desktop/views/components/crop-window.vue:
ok: "決定" ok: "決定"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "使用中"
drive: "ドライブ"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
@ -605,8 +608,6 @@ desktop/views/components/drive.folder.vue:
rename: "名前を変更" rename: "名前を変更"
rename-folder: "フォルダ名の変更" rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください" input-new-folder-name: "新しいフォルダ名を入力してください"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "検索" search: "検索"
load-more: "もっと読み込む" load-more: "もっと読み込む"
@ -741,7 +742,6 @@ desktop/views/components/settings.vue:
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
@ -847,18 +847,26 @@ desktop/views/components/settings.2fa.vue:
success: "設定が完了しました!" success: "設定が完了しました!"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。" failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。" info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
desktop/views/components/settings.api.vue: common/views/components/api-settings.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。" regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
console:
title: 'APIコンソール'
endpoint: 'エンドポイント'
parameter: 'パラメータ'
send: '送信'
sending: '応答待ち'
response: '結果'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@ -892,7 +900,6 @@ desktop/views/components/ui.header.vue:
adjective: "さん" adjective: "さん"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "プロフィール" profile: "プロフィール"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
@ -936,7 +943,6 @@ desktop/views/components/window.vue:
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
drive: "ドライブ"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@ -1049,6 +1055,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1089,7 +1098,6 @@ desktop/views/widgets/users.vue:
refresh: "他を見る" refresh: "他を見る"
no-one: "いません!" no-one: "いません!"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中" used: "使用中"
folder-count: "フォルダ" folder-count: "フォルダ"
count-separator: "、" count-separator: "、"
@ -1193,7 +1201,6 @@ mobile/views/components/ui.nav.vue:
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
user-lists: "リスト" user-lists: "リスト"
widgets: "ウィジェット" widgets: "ウィジェット"
@ -1216,7 +1223,6 @@ mobile/views/pages/user-lists.vue:
title: "リスト" title: "リスト"
enter-list-name: "リスト名を入力してください" enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る" more: "もっと見る"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう" lets-start: "📦 始めましょう"
@ -1326,6 +1332,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"
images: "画像" images: "画像"

View File

@ -62,6 +62,7 @@ common:
years_ago: "vor {} Jahr{0:en}" years_ago: "vor {} Jahr{0:en}"
month-and-day: "{day}/{month}" month-and-day: "{day}/{month}"
trash: "Papierkorb" trash: "Papierkorb"
drive: "ドライブ"
weekday-short: weekday-short:
sunday: "So" sunday: "So"
monday: "Mo" monday: "Mo"
@ -541,11 +542,14 @@ desktop/views/components/charts.vue:
title: "チャート" title: "チャート"
per-day: "1日ごと" per-day: "1日ごと"
per-hour: "1時間ごと" per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿" notes: "投稿"
users: "ユーザー" users: "ユーザー"
drive: "ドライブ" drive: "ドライブ"
network: "Netzwerk" network: "Netzwerk"
charts: charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
@ -575,7 +579,6 @@ desktop/views/components/crop-window.vue:
ok: "OK" ok: "OK"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "benutzt" used: "benutzt"
drive: "Speicher"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "Avatar" avatar: "Avatar"
banner: "Banner" banner: "Banner"
@ -605,8 +608,6 @@ desktop/views/components/drive.folder.vue:
rename: "Umbenennen" rename: "Umbenennen"
rename-folder: "Ordner umbenennen" rename-folder: "Ordner umbenennen"
input-new-folder-name: "Namen für neuen Ordner eingeben" input-new-folder-name: "Namen für neuen Ordner eingeben"
desktop/views/components/drive.nav-folder.vue:
drive: "Laufwerk"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "Suchen" search: "Suchen"
load-more: "Mehr laden" load-more: "Mehr laden"
@ -741,7 +742,6 @@ desktop/views/components/settings.vue:
notification: "Mitteilungen" notification: "Mitteilungen"
apps: "In App öffnen" apps: "In App öffnen"
mute: "Stummschalten" mute: "Stummschalten"
drive: "Dateien vom Drive anfügen"
security: "Sicherheit" security: "Sicherheit"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "Passwort" password: "Passwort"
@ -847,18 +847,26 @@ desktop/views/components/settings.2fa.vue:
success: "設定が完了しました!" success: "設定が完了しました!"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。" failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。" info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
desktop/views/components/settings.api.vue: common/views/components/api-settings.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。" regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "Bitte Passwort eingeben" enter-password: "パスワードを入力してください"
console:
title: 'APIコンソール'
endpoint: 'エンドポイント'
parameter: 'パラメータ'
send: '送信'
sending: '応答待ち'
response: '結果'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@ -892,7 +900,6 @@ desktop/views/components/ui.header.vue:
adjective: "さん" adjective: "さん"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "Dein Profil" profile: "Dein Profil"
drive: "Speicher"
favorites: "Favoriten" favorites: "Favoriten"
lists: "Listen" lists: "Listen"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
@ -936,7 +943,6 @@ desktop/views/components/window.vue:
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
drive: "ドライブ"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@ -1049,6 +1055,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1089,7 +1098,6 @@ desktop/views/widgets/users.vue:
refresh: "他を見る" refresh: "他を見る"
no-one: "いません!" no-one: "いません!"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中" used: "使用中"
folder-count: "フォルダ" folder-count: "フォルダ"
count-separator: "、" count-separator: "、"
@ -1193,7 +1201,6 @@ mobile/views/components/ui.nav.vue:
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
user-lists: "リスト" user-lists: "リスト"
widgets: "ウィジェット" widgets: "ウィジェット"
@ -1216,7 +1223,6 @@ mobile/views/pages/user-lists.vue:
title: "リスト" title: "リスト"
enter-list-name: "リスト名を入力してください" enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "Mehr laden" more: "Mehr laden"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう" lets-start: "📦 始めましょう"
@ -1326,6 +1332,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"
images: "画像" images: "画像"

View File

@ -62,6 +62,7 @@ common:
years_ago: "{}year(s) ago" years_ago: "{}year(s) ago"
month-and-day: "{month}/{day}" month-and-day: "{month}/{day}"
trash: "Trash" trash: "Trash"
drive: "Drive"
weekday-short: weekday-short:
sunday: "S" sunday: "S"
monday: "M" monday: "M"
@ -541,11 +542,14 @@ desktop/views/components/charts.vue:
title: "Charts" title: "Charts"
per-day: "per Day" per-day: "per Day"
per-hour: "per Hour" per-hour: "per Hour"
federation: "Federation"
notes: "Posts" notes: "Posts"
users: "Users" users: "Users"
drive: "Drive" drive: "Drive"
network: "Network" network: "Network"
charts: charts:
federation-instances: "The number of instances: increase/decrease"
federation-instances-total: "Total number of instances"
notes: "The number of posts: increase/decrease (Combined)" notes: "The number of posts: increase/decrease (Combined)"
local-notes: "The number of posts: increase/decrease (Local)" local-notes: "The number of posts: increase/decrease (Local)"
remote-notes: "The number of posts: increase/decrease (Remote)" remote-notes: "The number of posts: increase/decrease (Remote)"
@ -575,7 +579,6 @@ desktop/views/components/crop-window.vue:
ok: "OK" ok: "OK"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "used" used: "used"
drive: "Media storage"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "Avatar" avatar: "Avatar"
banner: "Banner" banner: "Banner"
@ -605,8 +608,6 @@ desktop/views/components/drive.folder.vue:
rename: "Rename" rename: "Rename"
rename-folder: "Rename folder" rename-folder: "Rename folder"
input-new-folder-name: "Enter new name" input-new-folder-name: "Enter new name"
desktop/views/components/drive.nav-folder.vue:
drive: "Media storage"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "Search" search: "Search"
load-more: "Load more" load-more: "Load more"
@ -741,7 +742,6 @@ desktop/views/components/settings.vue:
notification: "Notification" notification: "Notification"
apps: "Apps" apps: "Apps"
mute: "Mute" mute: "Mute"
drive: "Drive"
security: "Security" security: "Security"
signin: "Sign in history" signin: "Sign in history"
password: "Password" password: "Password"
@ -847,18 +847,26 @@ desktop/views/components/settings.2fa.vue:
success: "Settings saved!" success: "Settings saved!"
failed: "Failed to setup. Please ensure that the token is correct." failed: "Failed to setup. Please ensure that the token is correct."
info: "From the next time you sign in to Misskey, the token displayed on your device will be necessary too, as well as the password." info: "From the next time you sign in to Misskey, the token displayed on your device will be necessary too, as well as the password."
desktop/views/components/settings.api.vue: common/views/components/api-settings.vue:
intro: "To access the API, set this token as the key 'i' of request parameters." intro: "To access the API, set this token as the key 'i' of request parameters."
caution: "Do not enter this token to any apps nor tell this token to others otherwise your account may get compromised." caution: "Do not enter this token to any apps nor tell this token to others otherwise your account may get compromised."
regeneration-of-token: "If your token gets leaked, you can regenerate it." regeneration-of-token: "If your token gets leaked, you can regenerate it."
regenerate-token: "Regenerate the token" regenerate-token: "Regenerate the token"
token: "Token:" token: "Token:"
enter-password: "Please enter the password" enter-password: "Enter the password"
console:
title: 'API console'
endpoint: 'Endpoint'
parameter: 'Parameters'
send: 'Send'
sending: 'Sending'
response: 'Result'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "No linked applications" no-apps: "No linked applications"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "Max" max: "Max"
in-use: "In use" in-use: "In use"
stats: "Statistics"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "No muted users" no-users: "No muted users"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@ -892,7 +900,6 @@ desktop/views/components/ui.header.vue:
adjective: "-san" adjective: "-san"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "Your profile" profile: "Your profile"
drive: "Media storage"
favorites: "Favorites" favorites: "Favorites"
lists: "Lists" lists: "Lists"
follow-requests: "Follow requests" follow-requests: "Follow requests"
@ -936,7 +943,6 @@ desktop/views/components/window.vue:
close: "Close" close: "Close"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "Dashboard" dashboard: "Dashboard"
drive: "Drive"
users: "Users" users: "Users"
update: "Updates" update: "Updates"
announcements: "Announcements" announcements: "Announcements"
@ -1049,6 +1055,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "Mute" mute: "Mute"
muted: "Muting" muted: "Muting"
unmute: "Unmute" unmute: "Unmute"
block: "Block"
unblock: "Unblock"
block-confirm: "Are you sure block this user?"
push-to-a-list: "Add to list" push-to-a-list: "Add to list"
list-pushed: "Successfully added {user} to {list}." list-pushed: "Successfully added {user} to {list}."
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1089,7 +1098,6 @@ desktop/views/widgets/users.vue:
refresh: "refresh" refresh: "refresh"
no-one: "Anyone!" no-one: "Anyone!"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "Media storage"
used: "used" used: "used"
folder-count: "Folder(s)" folder-count: "Folder(s)"
count-separator: ", " count-separator: ", "
@ -1193,7 +1201,6 @@ mobile/views/components/ui.nav.vue:
messaging: "Messages" messaging: "Messages"
follow-requests: "Follow requests" follow-requests: "Follow requests"
search: "Search" search: "Search"
drive: "Drive"
favorites: "Favorites" favorites: "Favorites"
user-lists: "Lists" user-lists: "Lists"
widgets: "Widgets" widgets: "Widgets"
@ -1216,7 +1223,6 @@ mobile/views/pages/user-lists.vue:
title: "Lists" title: "Lists"
enter-list-name: "Enter a name of the list to make" enter-list-name: "Enter a name of the list to make"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "Drive"
more: "Load more" more: "Load more"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "Your account is now ready! 📦" lets-start: "Your account is now ready! 📦"
@ -1326,6 +1332,10 @@ mobile/views/pages/user.vue:
timeline: "Timeline" timeline: "Timeline"
media: "Media" media: "Media"
is-suspended: "This account has been suspended." is-suspended: "This account has been suspended."
mute: "Mute"
unmute: "Unmute"
block: "Block"
unblock: "Unblock"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "Recent notes" recent-notes: "Recent notes"
images: "Images" images: "Images"

View File

@ -62,6 +62,7 @@ common:
years_ago: "Hace {} año(s)" years_ago: "Hace {} año(s)"
month-and-day: "{day} de {month}" month-and-day: "{day} de {month}"
trash: "Papelera" trash: "Papelera"
drive: "ドライブ"
weekday-short: weekday-short:
sunday: "domingo" sunday: "domingo"
monday: "lunes" monday: "lunes"
@ -541,11 +542,14 @@ desktop/views/components/charts.vue:
title: "Gráficos" title: "Gráficos"
per-day: "por día" per-day: "por día"
per-hour: "por hora" per-hour: "por hora"
federation: "フェデレーション"
notes: "Publicaciones" notes: "Publicaciones"
users: "Usuarios" users: "Usuarios"
drive: "Unidad" drive: "Unidad"
network: "ネットワーク" network: "ネットワーク"
charts: charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "Número de publicaciones: aumentar/disminuir (Combinado)" notes: "Número de publicaciones: aumentar/disminuir (Combinado)"
local-notes: "Número de publicaciones: aumentar/disminuir (Local)" local-notes: "Número de publicaciones: aumentar/disminuir (Local)"
remote-notes: "Número de publicaciones: aumentar/disminuir (Remoto)" remote-notes: "Número de publicaciones: aumentar/disminuir (Remoto)"
@ -575,7 +579,6 @@ desktop/views/components/crop-window.vue:
ok: "OK" ok: "OK"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "usado" used: "usado"
drive: "Disco"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "Avatar" avatar: "Avatar"
banner: "Banner" banner: "Banner"
@ -605,8 +608,6 @@ desktop/views/components/drive.folder.vue:
rename: "Renombrar" rename: "Renombrar"
rename-folder: "Renombrar carpeta" rename-folder: "Renombrar carpeta"
input-new-folder-name: "Escribe el nombre nuevo" input-new-folder-name: "Escribe el nombre nuevo"
desktop/views/components/drive.nav-folder.vue:
drive: "Disco"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "Buscar" search: "Buscar"
load-more: "Cargar más" load-more: "Cargar más"
@ -741,7 +742,6 @@ desktop/views/components/settings.vue:
notification: "Notificación" notification: "Notificación"
apps: "Aplicaciones" apps: "Aplicaciones"
mute: "Silenciar" mute: "Silenciar"
drive: "Disco"
security: "Seguridad" security: "Seguridad"
signin: "Historial de inicios de sesión" signin: "Historial de inicios de sesión"
password: "Contraseña" password: "Contraseña"
@ -847,18 +847,26 @@ desktop/views/components/settings.2fa.vue:
success: "¡Configuraciones guardadas!" success: "¡Configuraciones guardadas!"
failed: "Error al configurar. Por favor asegúrate de que el token es correcto." failed: "Error al configurar. Por favor asegúrate de que el token es correcto."
info: "Desde ahora, ingresa el token que se muestra en tu dispositivo adicionalmente a tu contraseña cuando inicies sesión en Misskey" info: "Desde ahora, ingresa el token que se muestra en tu dispositivo adicionalmente a tu contraseña cuando inicies sesión en Misskey"
desktop/views/components/settings.api.vue: common/views/components/api-settings.vue:
intro: "Para acceder al API, configura este token como la letra \"i\" de los parámetros requeridos." intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "Por favor no muestres este token a otros (no lo ingreses en otro lugar que no sea aquí). De otra forma, tu cuenta puede llegar a ser comprometida." caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "En el caso no deseado de que este token lo tenga otra persona, puedes regenerarlo." regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "Regenerar el token" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "Por favor ingresa tu contraseña" enter-password: "パスワードを入力してください"
console:
title: 'APIコンソール'
endpoint: 'エンドポイント'
parameter: 'パラメータ'
send: '送信'
sending: '応答待ち'
response: '結果'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "No hay aplicaciones asociadas" no-apps: "No hay aplicaciones asociadas"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "Max" max: "容量"
in-use: "en uso." in-use: "使用中"
stats: "統計"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "No hay usuarios silenciados" no-users: "No hay usuarios silenciados"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@ -892,7 +900,6 @@ desktop/views/components/ui.header.vue:
adjective: "-san" adjective: "-san"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "Tu perfil" profile: "Tu perfil"
drive: "Unidad"
favorites: "Favoritos" favorites: "Favoritos"
lists: "Listas" lists: "Listas"
follow-requests: "Solicitudes de seguimiento" follow-requests: "Solicitudes de seguimiento"
@ -936,7 +943,6 @@ desktop/views/components/window.vue:
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
drive: "ドライブ"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@ -1049,6 +1055,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1089,7 +1098,6 @@ desktop/views/widgets/users.vue:
refresh: "他を見る" refresh: "他を見る"
no-one: "いません!" no-one: "いません!"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中" used: "使用中"
folder-count: "フォルダ" folder-count: "フォルダ"
count-separator: "、" count-separator: "、"
@ -1193,7 +1201,6 @@ mobile/views/components/ui.nav.vue:
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
user-lists: "リスト" user-lists: "リスト"
widgets: "ウィジェット" widgets: "ウィジェット"
@ -1216,7 +1223,6 @@ mobile/views/pages/user-lists.vue:
title: "リスト" title: "リスト"
enter-list-name: "リスト名を入力してください" enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る" more: "もっと見る"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう" lets-start: "📦 始めましょう"
@ -1326,6 +1332,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"
images: "画像" images: "画像"

View File

@ -62,6 +62,7 @@ common:
years_ago: "Il y a {} an·s" years_ago: "Il y a {} an·s"
month-and-day: "{month} mois/{day} jour" month-and-day: "{month} mois/{day} jour"
trash: "Corbeille" trash: "Corbeille"
drive: "ドライブ"
weekday-short: weekday-short:
sunday: "D" sunday: "D"
monday: "L" monday: "L"
@ -541,11 +542,14 @@ desktop/views/components/charts.vue:
title: "Graphiques" title: "Graphiques"
per-day: "par jour" per-day: "par jour"
per-hour: "par heure" per-hour: "par heure"
federation: "フェデレーション"
notes: "Publications" notes: "Publications"
users: "Utilisateurs" users: "Utilisateurs"
drive: "Drive" drive: "Drive"
network: "Réseau" network: "Réseau"
charts: charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
@ -575,7 +579,6 @@ desktop/views/components/crop-window.vue:
ok: "OK" ok: "OK"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "utilisé" used: "utilisé"
drive: "Drive"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "Avatar" avatar: "Avatar"
banner: "Bannière" banner: "Bannière"
@ -605,8 +608,6 @@ desktop/views/components/drive.folder.vue:
rename: "Renommer" rename: "Renommer"
rename-folder: "Renommer le dossier" rename-folder: "Renommer le dossier"
input-new-folder-name: "Entrer un nouveau nom" input-new-folder-name: "Entrer un nouveau nom"
desktop/views/components/drive.nav-folder.vue:
drive: "Drive"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "Rechercher" search: "Rechercher"
load-more: "Afficher plus" load-more: "Afficher plus"
@ -741,7 +742,6 @@ desktop/views/components/settings.vue:
notification: "Notification" notification: "Notification"
apps: "Applications" apps: "Applications"
mute: "Mettre en sourdine" mute: "Mettre en sourdine"
drive: "Drive"
security: "Sécurité" security: "Sécurité"
signin: "Historique de connexion" signin: "Historique de connexion"
password: "Mot de Passe" password: "Mot de Passe"
@ -847,18 +847,26 @@ desktop/views/components/settings.2fa.vue:
success: "L'operation a été complétée avec succès!" success: "L'operation a été complétée avec succès!"
failed: "L'operation a échoué. Veuillez vous assurer que le token a été entrer correctement." failed: "L'operation a échoué. Veuillez vous assurer que le token a été entrer correctement."
info: "À partir de maintenant, à chaque fois que vous vous connecter entrez votre mot de passe ainsi que le token généré sur votre appareil." info: "À partir de maintenant, à chaque fois que vous vous connecter entrez votre mot de passe ainsi que le token généré sur votre appareil."
desktop/views/components/settings.api.vue: common/views/components/api-settings.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "Si votre jeton est compromis, vous pouvez le régénérer." regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "Regenerer le token" regenerate-token: "トークンを再生成"
token: "Jeton :" token: "Token:"
enter-password: "Veuillez entrer le mot de passe" enter-password: "パスワードを入力してください"
console:
title: 'APIコンソール'
endpoint: 'エンドポイント'
parameter: 'パラメータ'
send: '送信'
sending: '応答待ち'
response: '結果'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "Aucune application autorisée" no-apps: "Aucune application autorisée"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "Maximum" max: "容量"
in-use: "en cours dutilisation" in-use: "使用中"
stats: "統計"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "Aucun utilisateurs mis en sourdine" no-users: "Aucun utilisateurs mis en sourdine"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@ -892,7 +900,6 @@ desktop/views/components/ui.header.vue:
adjective: "M." adjective: "M."
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "Votre profil" profile: "Votre profil"
drive: "Drive"
favorites: "Favorites" favorites: "Favorites"
lists: "Listes" lists: "Listes"
follow-requests: "Demandes de suivi" follow-requests: "Demandes de suivi"
@ -936,7 +943,6 @@ desktop/views/components/window.vue:
close: "Fermer" close: "Fermer"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "Tableau de bord" dashboard: "Tableau de bord"
drive: "Drive"
users: "Utilisateur·rice·s" users: "Utilisateur·rice·s"
update: "Mises à jour" update: "Mises à jour"
announcements: "お知らせ" announcements: "お知らせ"
@ -1049,6 +1055,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "Mettre en sourdine" mute: "Mettre en sourdine"
muted: "Muting" muted: "Muting"
unmute: "Enlever la sourdine" unmute: "Enlever la sourdine"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "Ajouter à la liste" push-to-a-list: "Ajouter à la liste"
list-pushed: "Vous avez ajouté {user} à la liste {list}." list-pushed: "Vous avez ajouté {user} à la liste {list}."
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1089,7 +1098,6 @@ desktop/views/widgets/users.vue:
refresh: "Afficher d'autres" refresh: "Afficher d'autres"
no-one: "Personne" no-one: "Personne"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "Drive"
used: "utilisé" used: "utilisé"
folder-count: "Dossier(s)" folder-count: "Dossier(s)"
count-separator: ", " count-separator: ", "
@ -1193,7 +1201,6 @@ mobile/views/components/ui.nav.vue:
messaging: "Messages" messaging: "Messages"
follow-requests: "Demandes d'abonnement" follow-requests: "Demandes d'abonnement"
search: "Rechercher" search: "Rechercher"
drive: "Drive"
favorites: "Favoris" favorites: "Favoris"
user-lists: "Listes" user-lists: "Listes"
widgets: "Modules" widgets: "Modules"
@ -1216,7 +1223,6 @@ mobile/views/pages/user-lists.vue:
title: "Listes" title: "Listes"
enter-list-name: "Nom de la liste" enter-list-name: "Nom de la liste"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "Drive"
more: "Afficher plus ..." more: "Afficher plus ..."
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "Votre compte est prêt ! 📦" lets-start: "Votre compte est prêt ! 📦"
@ -1326,6 +1332,10 @@ mobile/views/pages/user.vue:
timeline: "Fil d'actualité" timeline: "Fil d'actualité"
media: "Media" media: "Media"
is-suspended: "This account has been suspended." is-suspended: "This account has been suspended."
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "Notes récentes" recent-notes: "Notes récentes"
images: "Images" images: "Images"

View File

@ -62,6 +62,7 @@ common:
years_ago: "{}年前" years_ago: "{}年前"
month-and-day: "{month}月 {day}日" month-and-day: "{month}月 {day}日"
trash: "ゴミ箱" trash: "ゴミ箱"
drive: "ドライブ"
weekday-short: weekday-short:
sunday: "日" sunday: "日"
monday: "月" monday: "月"
@ -541,11 +542,14 @@ desktop/views/components/charts.vue:
title: "チャート" title: "チャート"
per-day: "1日ごと" per-day: "1日ごと"
per-hour: "1時間ごと" per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿" notes: "投稿"
users: "ユーザー" users: "ユーザー"
drive: "ドライブ" drive: "ドライブ"
network: "ネットワーク" network: "ネットワーク"
charts: charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
@ -575,7 +579,6 @@ desktop/views/components/crop-window.vue:
ok: "決定" ok: "決定"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "使用中"
drive: "ドライブ"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
@ -605,8 +608,6 @@ desktop/views/components/drive.folder.vue:
rename: "名前を変更" rename: "名前を変更"
rename-folder: "フォルダ名の変更" rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください" input-new-folder-name: "新しいフォルダ名を入力してください"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "検索" search: "検索"
load-more: "もっと読み込む" load-more: "もっと読み込む"
@ -741,7 +742,6 @@ desktop/views/components/settings.vue:
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
@ -847,18 +847,26 @@ desktop/views/components/settings.2fa.vue:
success: "設定が完了しました!" success: "設定が完了しました!"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。" failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。" info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
desktop/views/components/settings.api.vue: common/views/components/api-settings.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。" regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
console:
title: 'APIコンソール'
endpoint: 'エンドポイント'
parameter: 'パラメータ'
send: '送信'
sending: '応答待ち'
response: '結果'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@ -892,7 +900,6 @@ desktop/views/components/ui.header.vue:
adjective: "さん" adjective: "さん"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "プロフィール" profile: "プロフィール"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
@ -936,7 +943,6 @@ desktop/views/components/window.vue:
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
drive: "ドライブ"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@ -1049,6 +1055,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1089,7 +1098,6 @@ desktop/views/widgets/users.vue:
refresh: "他を見る" refresh: "他を見る"
no-one: "いません!" no-one: "いません!"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中" used: "使用中"
folder-count: "フォルダ" folder-count: "フォルダ"
count-separator: "、" count-separator: "、"
@ -1193,7 +1201,6 @@ mobile/views/components/ui.nav.vue:
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
user-lists: "リスト" user-lists: "リスト"
widgets: "ウィジェット" widgets: "ウィジェット"
@ -1216,7 +1223,6 @@ mobile/views/pages/user-lists.vue:
title: "リスト" title: "リスト"
enter-list-name: "リスト名を入力してください" enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る" more: "もっと見る"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう" lets-start: "📦 始めましょう"
@ -1326,6 +1332,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"
images: "画像" images: "画像"

View File

@ -64,6 +64,7 @@ common:
month-and-day: "{month}月 {day}日" month-and-day: "{month}月 {day}日"
trash: "ゴミ箱" trash: "ゴミ箱"
drive: "ドライブ"
weekday-short: weekday-short:
sunday: "日" sunday: "日"
@ -601,12 +602,12 @@ desktop/views/components/charts.vue:
title: "チャート" title: "チャート"
per-day: "1日ごと" per-day: "1日ごと"
per-hour: "1時間ごと" per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿" notes: "投稿"
users: "ユーザー" users: "ユーザー"
drive: "ドライブ" drive: "ドライブ"
network: "ネットワーク" network: "ネットワーク"
charts: charts:
federation: "フェデレーション"
federation-instances: "インスタンスの増減" federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算" federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
@ -642,7 +643,6 @@ desktop/views/components/crop-window.vue:
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "使用中"
drive: "ドライブ"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "アイコン" avatar: "アイコン"
@ -675,9 +675,6 @@ desktop/views/components/drive.folder.vue:
rename-folder: "フォルダ名の変更" rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください" input-new-folder-name: "新しいフォルダ名を入力してください"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "検索" search: "検索"
load-more: "もっと読み込む" load-more: "もっと読み込む"
@ -836,7 +833,6 @@ desktop/views/components/settings.vue:
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
@ -954,20 +950,28 @@ desktop/views/components/settings.2fa.vue:
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。" failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。" info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
desktop/views/components/settings.api.vue: common/views/components/api-settings.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。" regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
console:
title: 'APIコンソール'
endpoint: 'エンドポイント'
parameter: 'パラメータ'
send: '送信'
sending: '応答待ち'
response: '結果'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
@ -1008,7 +1012,6 @@ desktop/views/components/ui.header.vue:
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "プロフィール" profile: "プロフィール"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
@ -1063,7 +1066,6 @@ desktop/views/components/window.vue:
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
drive: "ドライブ"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@ -1201,6 +1203,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
@ -1251,7 +1256,6 @@ desktop/views/widgets/users.vue:
no-one: "いません!" no-one: "いません!"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中" used: "使用中"
folder-count: "フォルダ" folder-count: "フォルダ"
count-separator: "、" count-separator: "、"
@ -1375,7 +1379,6 @@ mobile/views/components/ui.nav.vue:
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
user-lists: "リスト" user-lists: "リスト"
widgets: "ウィジェット" widgets: "ウィジェット"
@ -1403,7 +1406,6 @@ mobile/views/pages/user-lists.vue:
enter-list-name: "リスト名を入力してください" enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る" more: "もっと見る"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
@ -1532,6 +1534,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"

View File

@ -62,6 +62,7 @@ common:
years_ago: "{}年前" years_ago: "{}年前"
month-and-day: "{month}月 {day}日" month-and-day: "{month}月 {day}日"
trash: "ゴミ箱" trash: "ゴミ箱"
drive: "ドライブ"
weekday-short: weekday-short:
sunday: "日" sunday: "日"
monday: "月" monday: "月"
@ -541,11 +542,14 @@ desktop/views/components/charts.vue:
title: "チャート" title: "チャート"
per-day: "1日ごと" per-day: "1日ごと"
per-hour: "1時間ごと" per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿" notes: "投稿"
users: "ユーザー" users: "ユーザー"
drive: "ドライブ" drive: "ドライブ"
network: "ネットワーク" network: "ネットワーク"
charts: charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減(統合)" notes: "投稿の増減(統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
@ -575,7 +579,6 @@ desktop/views/components/crop-window.vue:
ok: "そうする" ok: "そうする"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使うとる" used: "使うとる"
drive: "ドライブ"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
@ -605,8 +608,6 @@ desktop/views/components/drive.folder.vue:
rename: "名前を変えるで" rename: "名前を変えるで"
rename-folder: "フォルダ名を変えるで" rename-folder: "フォルダ名を変えるで"
input-new-folder-name: "新しいフォルダ名を入力してや" input-new-folder-name: "新しいフォルダ名を入力してや"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "検索" search: "検索"
load-more: "もっとあらへんのか!" load-more: "もっとあらへんのか!"
@ -741,7 +742,6 @@ desktop/views/components/settings.vue:
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute: "ミュート"
drive: "ドライブ"
security: "守護神セキュリティ" security: "守護神セキュリティ"
signin: "こんな感じでサインインしたらしいで" signin: "こんな感じでサインインしたらしいで"
password: "パスワード" password: "パスワード"
@ -847,18 +847,26 @@ desktop/views/components/settings.2fa.vue:
success: "設定が完了したで!" success: "設定が完了したで!"
failed: "なんか設定に失敗したで。トークンを間違えとらんか確認してや。" failed: "なんか設定に失敗したで。トークンを間違えとらんか確認してや。"
info: "次のサインインからは、パスワードに加えてデバイスに出とるトークンを入力してな。" info: "次のサインインからは、パスワードに加えてデバイスに出とるトークンを入力してな。"
desktop/views/components/settings.api.vue: common/views/components/api-settings.vue:
intro: "APIを利用するには、上記のトークンを「i」っちゅうキーでパラメータに付加してリクエストしてや。" intro: "API使うんやったらこのトークンを「i」っちゅうパラメータにくっつけてリクエストできるで。"
caution: "アカウントを不正利用されるかも知れんから、このトークンは第三者に教えたらあかんで(アプリなどにも入力しんといてな)。" caution: "アカウント勝手にいじられるかも知れんから、このトークンは教えたらあかんし、アプリにも書いたらあかんで(これはフリちゃうで)"
regeneration-of-token: "万が一このトークン漏れたとかその可能性があったらトークンを再生成できるで。" regeneration-of-token: "トークン漏れてもうたんやったらもっかい生成できるで。"
regenerate-token: "トークンを再生成" regenerate-token: "トークンもっかい生成"
token: "トークン:" token: "Token:"
enter-password: "パスワードを入力してや" enter-password: "パスワードを入てや"
console:
title: 'APIコンソール'
endpoint: 'エンドポイント'
parameter: 'パラメータ'
send: '送る'
sending: '応答待っとる'
response: 'こんなん返ってきたわ'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはあらへんで" no-apps: "連携しているアプリケーションはあらへんで"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "" max: "容量"
in-use: "使用中" in-use: "使うとる"
stats: "統計"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはおらんで" no-users: "ミュートしているユーザーはおらんで"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@ -892,7 +900,6 @@ desktop/views/components/ui.header.vue:
adjective: "はん" adjective: "はん"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "プロフィール" profile: "プロフィール"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー許してくれや!言うてみる" follow-requests: "フォロー許してくれや!言うてみる"
@ -936,10 +943,9 @@ desktop/views/components/window.vue:
close: "さいなら" close: "さいなら"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
drive: "ドライブ"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "知っといてや"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
desktop/views/pages/admin/admin.dashboard.vue: desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
@ -968,7 +974,7 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify: "公式アカウントにはさせへんで" unverify: "公式アカウントにはさせへんで"
unverified: "公式アカウントを解除したで" unverified: "公式アカウントを解除したで"
desktop/views/pages/admin/admin.announcements.vue: desktop/views/pages/admin/admin.announcements.vue:
announcements: "お知らせ" announcements: "知っといてや"
desktop/views/pages/admin/admin.hashtags.vue: desktop/views/pages/admin/admin.hashtags.vue:
hided-tags: "Hidden Tags" hided-tags: "Hidden Tags"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
@ -980,10 +986,10 @@ desktop/views/pages/deck/deck.user-column.vue:
following: "フォロー" following: "フォロー"
followers: "フォロワー" followers: "フォロワー"
images: "画像" images: "画像"
activity: "アクティビティ" activity: "やっとること"
timeline: "タイムライン" timeline: "タイムライン"
pinned-notes: "ピン留めされた投稿" pinned-notes: "ピン留めしはった投稿"
push-to-a-list: "リストに追加" push-to-a-list: "リストに入れたる"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "ここの人らだけ" original-users: "ここの人らだけ"
@ -1036,7 +1042,7 @@ desktop/views/pages/user/user.friends.vue:
no-users: "よう話すツレは居らん" no-users: "よう話すツレは居らん"
desktop/views/pages/user/user.vue: desktop/views/pages/user/user.vue:
is-suspended: "このユーザーはあかんわ。凍結されとる。" is-suspended: "このユーザーはあかんわ。凍結されとる。"
last-used-at: "最終アクセス" last-used-at: "最後いつ来はった?"
desktop/views/pages/user/user.photos.vue: desktop/views/pages/user/user.photos.vue:
title: "写真" title: "写真"
loading: "読み込んどります" loading: "読み込んどります"
@ -1049,6 +1055,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしとるで" muted: "ミュートしとるで"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加したで。" list-pushed: "{user}を{list}に追加したで。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1089,7 +1098,6 @@ desktop/views/widgets/users.vue:
refresh: "他を見る" refresh: "他を見る"
no-one: "おらん!" no-one: "おらん!"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使うとる" used: "使うとる"
folder-count: "フォルダ" folder-count: "フォルダ"
count-separator: "、" count-separator: "、"
@ -1119,8 +1127,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ(md5)" hash: "ハッシュ(md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "ちょっと見せられへんわ" nsfw: "ちょっと見せられへんわ"
mark-as-sensitive: "閲覧注意に設定" mark-as-sensitive: "見たらあかん感じにしとく"
unmark-as-sensitive: "閲覧注意を解除" unmark-as-sensitive: "やっぱ見せたるわ"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "見たらあかんで" sensitive: "見たらあかんで"
click-to-show: "押してみ、見せたるわ" click-to-show: "押してみ、見せたるわ"
@ -1193,7 +1201,6 @@ mobile/views/components/ui.nav.vue:
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー許してくれや!言うてみる" follow-requests: "フォロー許してくれや!言うてみる"
search: "検索" search: "検索"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
user-lists: "リスト" user-lists: "リスト"
widgets: "ウィジェット" widgets: "ウィジェット"
@ -1216,7 +1223,6 @@ mobile/views/pages/user-lists.vue:
title: "リスト" title: "リスト"
enter-list-name: "リスト名を入力してや" enter-list-name: "リスト名を入力してや"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっとあるやろ!" more: "もっとあるやろ!"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "📦 始めようや" lets-start: "📦 始めようや"
@ -1316,7 +1322,7 @@ mobile/views/pages/settings.vue:
signout: "さいなら" signout: "さいなら"
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンド鳴らす" enable-sounds: "サウンド鳴らす"
mark-as-read-all-unread-notes: "すべての投稿を既読にする" mark-as-read-all-unread-notes: "全部もう読んだわ"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされとるで" follows-you: "フォローされとるで"
following: "フォロー" following: "フォロー"
@ -1326,6 +1332,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーはあかんわ。凍結されとる。" is-suspended: "このユーザーはあかんわ。凍結されとる。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近儲かりまっか?" recent-notes: "最近儲かりまっか?"
images: "画像" images: "画像"
@ -1373,27 +1383,27 @@ dev/views/index.vue:
manage-apps: "アプリの管理" manage-apps: "アプリの管理"
dev/views/apps.vue: dev/views/apps.vue:
manage-apps: "アプリを管理" manage-apps: "アプリを管理"
create-app: "アプリ作" create-app: "アプリ作"
app-missing: "アプリなし" app-missing: "アプリあらへん"
dev/views/new-app.vue: dev/views/new-app.vue:
create-app: "アプリケーションの作成" create-app: "アプリケーション作る"
app-name: "アプリケーション" app-name: "アプリケーションの名前"
app-name-desc: "あたのアプリの名。" app-name-desc: "あたのアプリの名。"
app-name-ex: "ex) Misskey for iOS" app-name-ex: "ex) 関西ミスキー保安協会"
app-overview: "アプリの概要" app-overview: "このアプリどんなん?"
app-desc: "あたのアプリの簡単な説明や紹介。" app-desc: "あたのアプリどんなんか教えて"
app-desc-ex: "ex) Misskey iOSクライアント。" app-desc-ex: "ex) 関西人なら誰でも口ずさめるこのCMがついにMisskeyへ。"
callback-url: "コールバックURL (オプション)" callback-url: "コールバックURL (無くてもええで)"
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。" callback-url-desc: "ユーザーが認証フォームで認証した後どこに連れてくかを設定できるで"
authority: "権限" authority: "権限"
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。" authority-desc: "ここにチェックした機能しかAPIからアクセスできひんから気ぃつけてな"
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。" authority-warning: "アプリ作った後でも変えれるけど、新しいやつ追加したらそん時関連付いてるユーザーキーは全部ほかされるで。"
account-read: "アカウントの情報を見る。" account-read: "アカウントの情報見せて"
account-write: "アカウントの情報を操作する。" account-write: "アカウントの情報いじらせて"
note-write: "投稿する。" note-write: "投稿させて"
reaction-write: "リアクションしたりリアクションをキャンセルする。" reaction-write: "リアクションしたりそれをキャンセルさせて"
following-write: "フォローしたりフォロー解除する。" following-write: "フォローとかフォロー解除させて"
drive-read: "ドライブを見る。" drive-read: "ドライブ見せて"
drive-write: "ドライブを操作する。" drive-write: "ドライブいじらせて"
notification-read: "通知を見る。" notification-read: "通知見せて"
notification-write: "通知を操作する。" notification-write: "通知いじらせて"

View File

@ -62,6 +62,7 @@ common:
years_ago: "{}년전" years_ago: "{}년전"
month-and-day: "{month}월 {day}일" month-and-day: "{month}월 {day}일"
trash: "휴지통" trash: "휴지통"
drive: "ドライブ"
weekday-short: weekday-short:
sunday: "일" sunday: "일"
monday: "월" monday: "월"
@ -541,11 +542,14 @@ desktop/views/components/charts.vue:
title: "チャート" title: "チャート"
per-day: "1日ごと" per-day: "1日ごと"
per-hour: "1時間ごと" per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿" notes: "投稿"
users: "ユーザー" users: "ユーザー"
drive: "ドライブ" drive: "ドライブ"
network: "ネットワーク" network: "ネットワーク"
charts: charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
@ -575,7 +579,6 @@ desktop/views/components/crop-window.vue:
ok: "決定" ok: "決定"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "使用中"
drive: "ドライブ"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
@ -605,8 +608,6 @@ desktop/views/components/drive.folder.vue:
rename: "名前を変更" rename: "名前を変更"
rename-folder: "フォルダ名の変更" rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください" input-new-folder-name: "新しいフォルダ名を入力してください"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "検索" search: "検索"
load-more: "もっと読み込む" load-more: "もっと読み込む"
@ -741,7 +742,6 @@ desktop/views/components/settings.vue:
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
@ -847,18 +847,26 @@ desktop/views/components/settings.2fa.vue:
success: "設定が完了しました!" success: "設定が完了しました!"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。" failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。" info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
desktop/views/components/settings.api.vue: common/views/components/api-settings.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。" regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
console:
title: 'APIコンソール'
endpoint: 'エンドポイント'
parameter: 'パラメータ'
send: '送信'
sending: '応答待ち'
response: '結果'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@ -892,7 +900,6 @@ desktop/views/components/ui.header.vue:
adjective: "さん" adjective: "さん"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "プロフィール" profile: "プロフィール"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
@ -936,7 +943,6 @@ desktop/views/components/window.vue:
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
drive: "ドライブ"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@ -1049,6 +1055,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1089,7 +1098,6 @@ desktop/views/widgets/users.vue:
refresh: "他を見る" refresh: "他を見る"
no-one: "いません!" no-one: "いません!"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中" used: "使用中"
folder-count: "フォルダ" folder-count: "フォルダ"
count-separator: "、" count-separator: "、"
@ -1193,7 +1201,6 @@ mobile/views/components/ui.nav.vue:
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
user-lists: "リスト" user-lists: "リスト"
widgets: "ウィジェット" widgets: "ウィジェット"
@ -1216,7 +1223,6 @@ mobile/views/pages/user-lists.vue:
title: "リスト" title: "リスト"
enter-list-name: "リスト名を入力してください" enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る" more: "もっと見る"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう" lets-start: "📦 始めましょう"
@ -1326,6 +1332,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"
images: "画像" images: "画像"

View File

@ -62,6 +62,7 @@ common:
years_ago: "{}jaar geleden" years_ago: "{}jaar geleden"
month-and-day: "{month}月 {day}日" month-and-day: "{month}月 {day}日"
trash: "ゴミ箱" trash: "ゴミ箱"
drive: "ドライブ"
weekday-short: weekday-short:
sunday: "Z" sunday: "Z"
monday: "M" monday: "M"
@ -541,11 +542,14 @@ desktop/views/components/charts.vue:
title: "チャート" title: "チャート"
per-day: "1日ごと" per-day: "1日ごと"
per-hour: "1時間ごと" per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿" notes: "投稿"
users: "ユーザー" users: "ユーザー"
drive: "ドライブ" drive: "ドライブ"
network: "ネットワーク" network: "ネットワーク"
charts: charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
@ -575,7 +579,6 @@ desktop/views/components/crop-window.vue:
ok: "Oké" ok: "Oké"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "gebruikt" used: "gebruikt"
drive: "Drive"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "Gebruikersafbeelding" avatar: "Gebruikersafbeelding"
banner: "Omslagfoto" banner: "Omslagfoto"
@ -605,8 +608,6 @@ desktop/views/components/drive.folder.vue:
rename: "Naam wijzigen" rename: "Naam wijzigen"
rename-folder: "Mapnaam wijzigen" rename-folder: "Mapnaam wijzigen"
input-new-folder-name: "Voer een nieuwe naam in" input-new-folder-name: "Voer een nieuwe naam in"
desktop/views/components/drive.nav-folder.vue:
drive: "Drive"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "Zoeken" search: "Zoeken"
load-more: "Meer laden" load-more: "Meer laden"
@ -741,7 +742,6 @@ desktop/views/components/settings.vue:
notification: "Melding" notification: "Melding"
apps: "Apps" apps: "Apps"
mute: "Dempen" mute: "Dempen"
drive: "Drive"
security: "Beveiliging" security: "Beveiliging"
signin: "Inloggeschiedenis" signin: "Inloggeschiedenis"
password: "Wachtwoord" password: "Wachtwoord"
@ -847,18 +847,26 @@ desktop/views/components/settings.2fa.vue:
success: "Instellen voltooid!" success: "Instellen voltooid!"
failed: "Instellen mislukt. Zorg ervoor dat de sleutel juist is." failed: "Instellen mislukt. Zorg ervoor dat de sleutel juist is."
info: "Vanaf nu moet je ook de op je apparaat getoonde sleutel tonen bij het inloggen op Misskey." info: "Vanaf nu moet je ook de op je apparaat getoonde sleutel tonen bij het inloggen op Misskey."
desktop/views/components/settings.api.vue: common/views/components/api-settings.vue:
intro: "Als je toegang wilt tot de API, stel deze sleutel dan in als 'i' bij de verzoekparameters." intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "Laat deze sleutel niet zien aan derde partijen (en voer hem nergens anders in dan hier), anders kan je account gehackt worden." caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "Mocht deze sleutel tóch uitlekken, dan kun je hem opnieuw genereren." regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "Sleutel opnieuw genereren" regenerate-token: "トークンを再生成"
token: "Sleutel:" token: "Token:"
enter-password: "Voer je wachtwoord in" enter-password: "パスワードを入力してください"
console:
title: 'APIコンソール'
endpoint: 'エンドポイント'
parameter: 'パラメータ'
send: '送信'
sending: '応答待ち'
response: '結果'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "Geen gedempte gebruikers" no-users: "Geen gedempte gebruikers"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@ -892,7 +900,6 @@ desktop/views/components/ui.header.vue:
adjective: "さん" adjective: "さん"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "Je profiel" profile: "Je profiel"
drive: "Drive"
favorites: "Favorieten" favorites: "Favorieten"
lists: "Lijsten" lists: "Lijsten"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
@ -936,7 +943,6 @@ desktop/views/components/window.vue:
close: "Sluiten" close: "Sluiten"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
drive: "ドライブ"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@ -1049,6 +1055,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "Dempen" mute: "Dempen"
muted: "Dempend" muted: "Dempend"
unmute: "Ontdempen" unmute: "Ontdempen"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1089,7 +1098,6 @@ desktop/views/widgets/users.vue:
refresh: "Anderen tonen" refresh: "Anderen tonen"
no-one: "Niemand" no-one: "Niemand"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "Drive"
used: "gebruikt" used: "gebruikt"
folder-count: "Map(pen)" folder-count: "Map(pen)"
count-separator: ", " count-separator: ", "
@ -1193,7 +1201,6 @@ mobile/views/components/ui.nav.vue:
messaging: "Gesprekken" messaging: "Gesprekken"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
search: "Zoeken" search: "Zoeken"
drive: "Drive"
favorites: "お気に入り" favorites: "お気に入り"
user-lists: "リスト" user-lists: "リスト"
widgets: "ウィジェット" widgets: "ウィジェット"
@ -1216,7 +1223,6 @@ mobile/views/pages/user-lists.vue:
title: "リスト" title: "リスト"
enter-list-name: "リスト名を入力してください" enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "Drive"
more: "もっと見る" more: "もっと見る"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう" lets-start: "📦 始めましょう"
@ -1326,6 +1332,10 @@ mobile/views/pages/user.vue:
timeline: "Tijdlijn" timeline: "Tijdlijn"
media: "Media" media: "Media"
is-suspended: "Dit account is geschorst." is-suspended: "Dit account is geschorst."
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "Recente notities" recent-notes: "Recente notities"
images: "Afbeeldingen" images: "Afbeeldingen"

View File

@ -62,6 +62,7 @@ common:
years_ago: "{} år siden" years_ago: "{} år siden"
month-and-day: "{day}/{month}" month-and-day: "{day}/{month}"
trash: "Papirkurv" trash: "Papirkurv"
drive: "ドライブ"
weekday-short: weekday-short:
sunday: "S" sunday: "S"
monday: "M" monday: "M"
@ -541,11 +542,14 @@ desktop/views/components/charts.vue:
title: "Diagrammer" title: "Diagrammer"
per-day: "per dag" per-day: "per dag"
per-hour: "1時間ごと" per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "Innlegg" notes: "Innlegg"
users: "Brukere" users: "Brukere"
drive: "Disk" drive: "Disk"
network: "ネットワーク" network: "ネットワーク"
charts: charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
@ -575,7 +579,6 @@ desktop/views/components/crop-window.vue:
ok: "Ok" ok: "Ok"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "brukt" used: "brukt"
drive: "Disk"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "Avatar" avatar: "Avatar"
banner: "Banner" banner: "Banner"
@ -605,8 +608,6 @@ desktop/views/components/drive.folder.vue:
rename: "Endre navn" rename: "Endre navn"
rename-folder: "フォルダ名の変更" rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください" input-new-folder-name: "新しいフォルダ名を入力してください"
desktop/views/components/drive.nav-folder.vue:
drive: "Disk"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "Søk" search: "Søk"
load-more: "もっと読み込む" load-more: "もっと読み込む"
@ -741,7 +742,6 @@ desktop/views/components/settings.vue:
notification: "Notifikasjon" notification: "Notifikasjon"
apps: "Apper" apps: "Apper"
mute: "Demp" mute: "Demp"
drive: "Disk"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "Passord" password: "Passord"
@ -847,18 +847,26 @@ desktop/views/components/settings.2fa.vue:
success: "設定が完了しました!" success: "設定が完了しました!"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。" failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。" info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
desktop/views/components/settings.api.vue: common/views/components/api-settings.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。" regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
console:
title: 'APIコンソール'
endpoint: 'エンドポイント'
parameter: 'パラメータ'
send: '送信'
sending: '応答待ち'
response: '結果'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "Maks" max: "容量"
in-use: "I bruk" in-use: "使用中"
stats: "統計"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@ -892,7 +900,6 @@ desktop/views/components/ui.header.vue:
adjective: "-san" adjective: "-san"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "プロフィール" profile: "プロフィール"
drive: "Disk"
favorites: "Favoritter" favorites: "Favoritter"
lists: "Lister" lists: "Lister"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
@ -936,7 +943,6 @@ desktop/views/components/window.vue:
close: "Lukk" close: "Lukk"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
drive: "Disk"
users: "Brukere" users: "Brukere"
update: "Oppdater" update: "Oppdater"
announcements: "お知らせ" announcements: "お知らせ"
@ -1049,6 +1055,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1089,7 +1098,6 @@ desktop/views/widgets/users.vue:
refresh: "Oppdater" refresh: "Oppdater"
no-one: "Ingen" no-one: "Ingen"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "Disk"
used: "brukt" used: "brukt"
folder-count: "Mappe(r)" folder-count: "Mappe(r)"
count-separator: "," count-separator: ","
@ -1193,7 +1201,6 @@ mobile/views/components/ui.nav.vue:
messaging: "Meldinger" messaging: "Meldinger"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
search: "Søk" search: "Søk"
drive: "Disk"
favorites: "Favoritter" favorites: "Favoritter"
user-lists: "Lister" user-lists: "Lister"
widgets: "ウィジェット" widgets: "ウィジェット"
@ -1216,7 +1223,6 @@ mobile/views/pages/user-lists.vue:
title: "Lister" title: "Lister"
enter-list-name: "リスト名を入力してください" enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "Disk"
more: "Vis mer" more: "Vis mer"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう" lets-start: "📦 始めましょう"
@ -1326,6 +1332,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "Media" media: "Media"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "Nylige innlegg" recent-notes: "Nylige innlegg"
images: "Bilder" images: "Bilder"

View File

@ -62,6 +62,7 @@ common:
years_ago: "{} lat temu" years_ago: "{} lat temu"
month-and-day: "{month}-{day}" month-and-day: "{month}-{day}"
trash: "Kosz" trash: "Kosz"
drive: "ドライブ"
weekday-short: weekday-short:
sunday: "N" sunday: "N"
monday: "Pn" monday: "Pn"
@ -541,11 +542,14 @@ desktop/views/components/charts.vue:
title: "チャート" title: "チャート"
per-day: "1日ごと" per-day: "1日ごと"
per-hour: "1時間ごと" per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿" notes: "投稿"
users: "ユーザー" users: "ユーザー"
drive: "ドライブ" drive: "ドライブ"
network: "ネットワーク" network: "ネットワーク"
charts: charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
@ -575,7 +579,6 @@ desktop/views/components/crop-window.vue:
ok: "OK" ok: "OK"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "wykorzystane" used: "wykorzystane"
drive: "Dysk"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "Awatar" avatar: "Awatar"
banner: "Baner" banner: "Baner"
@ -605,8 +608,6 @@ desktop/views/components/drive.folder.vue:
rename: "Zmień nazwę" rename: "Zmień nazwę"
rename-folder: "Zmień nazwę katalogu" rename-folder: "Zmień nazwę katalogu"
input-new-folder-name: "Wprowadź nową nazwę" input-new-folder-name: "Wprowadź nową nazwę"
desktop/views/components/drive.nav-folder.vue:
drive: "Dysk"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "Szukaj" search: "Szukaj"
load-more: "Załaduj więcej" load-more: "Załaduj więcej"
@ -741,7 +742,6 @@ desktop/views/components/settings.vue:
notification: "Powiadomienia" notification: "Powiadomienia"
apps: "Aplikacje" apps: "Aplikacje"
mute: "Wyciszanie" mute: "Wyciszanie"
drive: "Dysk"
security: "Bezpieczeństwo" security: "Bezpieczeństwo"
signin: "Historia logowań" signin: "Historia logowań"
password: "Hasło" password: "Hasło"
@ -847,18 +847,26 @@ desktop/views/components/settings.2fa.vue:
success: "Pomyślnie ukończono konfigurację!" success: "Pomyślnie ukończono konfigurację!"
failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token." failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token."
info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey." info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey."
desktop/views/components/settings.api.vue: common/views/components/api-settings.vue:
intro: "Aby uzyskać dostęp do API, ustaw ten token jako klucz 'i' parametrów żądań." intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "Nie pokazuj tego tokenu osobom trzecim (nie wprowadzaj go nigdzie indziej), aby konto nie trafiło w niepowołane ręce." caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "W przypadku wycieku tokenu, możesz wygenerować nowy." regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "Wygeneruj nowy token" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "Wprowadź hasło" enter-password: "パスワードを入力してください"
console:
title: 'APIコンソール'
endpoint: 'エンドポイント'
parameter: 'パラメータ'
send: '送信'
sending: '応答待ち'
response: '結果'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "Brak zautoryzowanych aplikacji" no-apps: "Brak zautoryzowanych aplikacji"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "Maksymalnie" max: "容量"
in-use: " w użyciu." in-use: "使用中"
stats: "統計"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "Brak wyciszonych użytkowników" no-users: "Brak wyciszonych użytkowników"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@ -892,7 +900,6 @@ desktop/views/components/ui.header.vue:
adjective: "さん" adjective: "さん"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "Twój profil" profile: "Twój profil"
drive: "Dysk"
favorites: "Ulubione" favorites: "Ulubione"
lists: "Listy" lists: "Listy"
follow-requests: "Prośby o śledzenie" follow-requests: "Prośby o śledzenie"
@ -936,7 +943,6 @@ desktop/views/components/window.vue:
close: "Zamknij" close: "Zamknij"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
drive: "ドライブ"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@ -1049,6 +1055,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "Wycisz" mute: "Wycisz"
muted: "Wyciszyłeś" muted: "Wyciszyłeś"
unmute: "Cofnij wyciszenie" unmute: "Cofnij wyciszenie"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "Dodaj do listy" push-to-a-list: "Dodaj do listy"
list-pushed: "Dodałeś(-aś) {user} do {list}." list-pushed: "Dodałeś(-aś) {user} do {list}."
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1089,7 +1098,6 @@ desktop/views/widgets/users.vue:
refresh: "Pokaż innych" refresh: "Pokaż innych"
no-one: "Pusto" no-one: "Pusto"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "Dysk"
used: "użyto" used: "użyto"
folder-count: "Katalog(i)" folder-count: "Katalog(i)"
count-separator: ", " count-separator: ", "
@ -1193,7 +1201,6 @@ mobile/views/components/ui.nav.vue:
messaging: "Wiadomości" messaging: "Wiadomości"
follow-requests: "Prośby o śledzenie" follow-requests: "Prośby o śledzenie"
search: "Szukaj" search: "Szukaj"
drive: "Dysk"
favorites: "Ulubione" favorites: "Ulubione"
user-lists: "Listy" user-lists: "Listy"
widgets: "Widżety" widgets: "Widżety"
@ -1216,7 +1223,6 @@ mobile/views/pages/user-lists.vue:
title: "Listy" title: "Listy"
enter-list-name: "Wprowadź nazwę listy" enter-list-name: "Wprowadź nazwę listy"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "Dysk"
more: "Załaduj więcej" more: "Załaduj więcej"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "Rozpocznijmy! 📦" lets-start: "Rozpocznijmy! 📦"
@ -1326,6 +1332,10 @@ mobile/views/pages/user.vue:
timeline: "Oś czasu" timeline: "Oś czasu"
media: "Multimedia" media: "Multimedia"
is-suspended: "To konto zostało zablokowane" is-suspended: "To konto zostało zablokowane"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "Ostatnie wpisy" recent-notes: "Ostatnie wpisy"
images: "Zdjęcia" images: "Zdjęcia"

View File

@ -62,6 +62,7 @@ common:
years_ago: "{} ano(s) atrás" years_ago: "{} ano(s) atrás"
month-and-day: "{day}/{month}" month-and-day: "{day}/{month}"
trash: "Lixo" trash: "Lixo"
drive: "ドライブ"
weekday-short: weekday-short:
sunday: "Dom" sunday: "Dom"
monday: "Seg" monday: "Seg"
@ -541,11 +542,14 @@ desktop/views/components/charts.vue:
title: "チャート" title: "チャート"
per-day: "1日ごと" per-day: "1日ごと"
per-hour: "1時間ごと" per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿" notes: "投稿"
users: "ユーザー" users: "ユーザー"
drive: "ドライブ" drive: "ドライブ"
network: "ネットワーク" network: "ネットワーク"
charts: charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
@ -575,7 +579,6 @@ desktop/views/components/crop-window.vue:
ok: "決定" ok: "決定"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "使用中"
drive: "ドライブ"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
@ -605,8 +608,6 @@ desktop/views/components/drive.folder.vue:
rename: "名前を変更" rename: "名前を変更"
rename-folder: "フォルダ名の変更" rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください" input-new-folder-name: "新しいフォルダ名を入力してください"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "検索" search: "検索"
load-more: "もっと読み込む" load-more: "もっと読み込む"
@ -741,7 +742,6 @@ desktop/views/components/settings.vue:
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
@ -847,18 +847,26 @@ desktop/views/components/settings.2fa.vue:
success: "設定が完了しました!" success: "設定が完了しました!"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。" failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。" info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
desktop/views/components/settings.api.vue: common/views/components/api-settings.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。" regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
console:
title: 'APIコンソール'
endpoint: 'エンドポイント'
parameter: 'パラメータ'
send: '送信'
sending: '応答待ち'
response: '結果'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@ -892,7 +900,6 @@ desktop/views/components/ui.header.vue:
adjective: "さん" adjective: "さん"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "プロフィール" profile: "プロフィール"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
@ -936,7 +943,6 @@ desktop/views/components/window.vue:
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
drive: "ドライブ"
users: "Usuários" users: "Usuários"
update: "Actualizações" update: "Actualizações"
announcements: "お知らせ" announcements: "お知らせ"
@ -1049,6 +1055,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1089,7 +1098,6 @@ desktop/views/widgets/users.vue:
refresh: "他を見る" refresh: "他を見る"
no-one: "いません!" no-one: "いません!"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中" used: "使用中"
folder-count: "フォルダ" folder-count: "フォルダ"
count-separator: "、" count-separator: "、"
@ -1193,7 +1201,6 @@ mobile/views/components/ui.nav.vue:
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
user-lists: "リスト" user-lists: "リスト"
widgets: "ウィジェット" widgets: "ウィジェット"
@ -1216,7 +1223,6 @@ mobile/views/pages/user-lists.vue:
title: "リスト" title: "リスト"
enter-list-name: "リスト名を入力してください" enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る" more: "もっと見る"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう" lets-start: "📦 始めましょう"
@ -1326,6 +1332,10 @@ mobile/views/pages/user.vue:
timeline: "Linha do tempo" timeline: "Linha do tempo"
media: "Mídia" media: "Mídia"
is-suspended: "Esta conta foi suspensa" is-suspended: "Esta conta foi suspensa"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "Notas recentes" recent-notes: "Notas recentes"
images: "Imagens" images: "Imagens"

View File

@ -62,6 +62,7 @@ common:
years_ago: "{}年前" years_ago: "{}年前"
month-and-day: "{month}月 {day}日" month-and-day: "{month}月 {day}日"
trash: "ゴミ箱" trash: "ゴミ箱"
drive: "ドライブ"
weekday-short: weekday-short:
sunday: "日" sunday: "日"
monday: "月" monday: "月"
@ -541,11 +542,14 @@ desktop/views/components/charts.vue:
title: "チャート" title: "チャート"
per-day: "1日ごと" per-day: "1日ごと"
per-hour: "1時間ごと" per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿" notes: "投稿"
users: "ユーザー" users: "ユーザー"
drive: "ドライブ" drive: "ドライブ"
network: "ネットワーク" network: "ネットワーク"
charts: charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
@ -575,7 +579,6 @@ desktop/views/components/crop-window.vue:
ok: "決定" ok: "決定"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "使用中"
drive: "ドライブ"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
@ -605,8 +608,6 @@ desktop/views/components/drive.folder.vue:
rename: "名前を変更" rename: "名前を変更"
rename-folder: "フォルダ名の変更" rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください" input-new-folder-name: "新しいフォルダ名を入力してください"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "検索" search: "検索"
load-more: "もっと読み込む" load-more: "もっと読み込む"
@ -741,7 +742,6 @@ desktop/views/components/settings.vue:
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
@ -847,18 +847,26 @@ desktop/views/components/settings.2fa.vue:
success: "設定が完了しました!" success: "設定が完了しました!"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。" failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。" info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
desktop/views/components/settings.api.vue: common/views/components/api-settings.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。" regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
console:
title: 'APIコンソール'
endpoint: 'エンドポイント'
parameter: 'パラメータ'
send: '送信'
sending: '応答待ち'
response: '結果'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@ -892,7 +900,6 @@ desktop/views/components/ui.header.vue:
adjective: "さん" adjective: "さん"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "プロフィール" profile: "プロフィール"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
@ -936,7 +943,6 @@ desktop/views/components/window.vue:
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
drive: "ドライブ"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@ -1049,6 +1055,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1089,7 +1098,6 @@ desktop/views/widgets/users.vue:
refresh: "他を見る" refresh: "他を見る"
no-one: "いません!" no-one: "いません!"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中" used: "使用中"
folder-count: "フォルダ" folder-count: "フォルダ"
count-separator: "、" count-separator: "、"
@ -1193,7 +1201,6 @@ mobile/views/components/ui.nav.vue:
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
user-lists: "リスト" user-lists: "リスト"
widgets: "ウィジェット" widgets: "ウィジェット"
@ -1216,7 +1223,6 @@ mobile/views/pages/user-lists.vue:
title: "リスト" title: "リスト"
enter-list-name: "リスト名を入力してください" enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る" more: "もっと見る"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう" lets-start: "📦 始めましょう"
@ -1326,6 +1332,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"
images: "画像" images: "画像"

View File

@ -62,6 +62,7 @@ common:
years_ago: "{}年前" years_ago: "{}年前"
month-and-day: "{month}月 {day}日" month-and-day: "{month}月 {day}日"
trash: "ゴミ箱" trash: "ゴミ箱"
drive: "ドライブ"
weekday-short: weekday-short:
sunday: "日" sunday: "日"
monday: "月" monday: "月"
@ -541,11 +542,14 @@ desktop/views/components/charts.vue:
title: "チャート" title: "チャート"
per-day: "1日ごと" per-day: "1日ごと"
per-hour: "1時間ごと" per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿" notes: "投稿"
users: "ユーザー" users: "ユーザー"
drive: "ドライブ" drive: "ドライブ"
network: "ネットワーク" network: "ネットワーク"
charts: charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
@ -575,7 +579,6 @@ desktop/views/components/crop-window.vue:
ok: "決定" ok: "決定"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "使用中"
drive: "ドライブ"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
@ -605,8 +608,6 @@ desktop/views/components/drive.folder.vue:
rename: "名前を変更" rename: "名前を変更"
rename-folder: "フォルダ名の変更" rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください" input-new-folder-name: "新しいフォルダ名を入力してください"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "検索" search: "検索"
load-more: "もっと読み込む" load-more: "もっと読み込む"
@ -741,7 +742,6 @@ desktop/views/components/settings.vue:
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
@ -847,18 +847,26 @@ desktop/views/components/settings.2fa.vue:
success: "設定が完了しました!" success: "設定が完了しました!"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。" failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。" info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
desktop/views/components/settings.api.vue: common/views/components/api-settings.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。" regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
console:
title: 'APIコンソール'
endpoint: 'エンドポイント'
parameter: 'パラメータ'
send: '送信'
sending: '応答待ち'
response: '結果'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@ -892,7 +900,6 @@ desktop/views/components/ui.header.vue:
adjective: "さん" adjective: "さん"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "プロフィール" profile: "プロフィール"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
@ -936,7 +943,6 @@ desktop/views/components/window.vue:
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
drive: "ドライブ"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@ -1049,6 +1055,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1089,7 +1098,6 @@ desktop/views/widgets/users.vue:
refresh: "他を見る" refresh: "他を見る"
no-one: "いません!" no-one: "いません!"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中" used: "使用中"
folder-count: "フォルダ" folder-count: "フォルダ"
count-separator: "、" count-separator: "、"
@ -1193,7 +1201,6 @@ mobile/views/components/ui.nav.vue:
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
user-lists: "リスト" user-lists: "リスト"
widgets: "ウィジェット" widgets: "ウィジェット"
@ -1216,7 +1223,6 @@ mobile/views/pages/user-lists.vue:
title: "リスト" title: "リスト"
enter-list-name: "リスト名を入力してください" enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る" more: "もっと見る"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう" lets-start: "📦 始めましょう"
@ -1326,6 +1332,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"
images: "画像" images: "画像"

17352
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "10.31.0", "version": "10.34.0",
"clientVersion": "1.0.11051", "clientVersion": "1.0.11234",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,
@ -58,7 +58,7 @@
"@types/koa__cors": "2.2.3", "@types/koa__cors": "2.2.3",
"@types/minio": "7.0.0", "@types/minio": "7.0.0",
"@types/mkdirp": "0.5.2", "@types/mkdirp": "0.5.2",
"@types/mocha": "5.2.3", "@types/mocha": "5.2.5",
"@types/mongodb": "3.1.12", "@types/mongodb": "3.1.12",
"@types/ms": "0.7.30", "@types/ms": "0.7.30",
"@types/node": "10.12.0", "@types/node": "10.12.0",
@ -84,7 +84,7 @@
"@types/websocket": "0.0.40", "@types/websocket": "0.0.40",
"@types/ws": "6.0.1", "@types/ws": "6.0.1",
"animejs": "2.2.0", "animejs": "2.2.0",
"apexcharts": "2.1.5", "apexcharts": "2.1.6",
"autobind-decorator": "2.1.0", "autobind-decorator": "2.1.0",
"autosize": "4.0.2", "autosize": "4.0.2",
"autwh": "0.1.0", "autwh": "0.1.0",
@ -104,15 +104,13 @@
"deep-equal": "1.0.1", "deep-equal": "1.0.1",
"deepcopy": "0.6.3", "deepcopy": "0.6.3",
"diskusage": "0.2.5", "diskusage": "0.2.5",
"dompurify": "1.0.5",
"double-ended-queue": "2.1.0-0", "double-ended-queue": "2.1.0-0",
"elasticsearch": "15.1.1", "elasticsearch": "15.1.1",
"emojilib": "2.3.0", "emojilib": "2.3.0",
"escape-regexp": "0.0.1", "escape-regexp": "0.0.1",
"eslint": "5.0.1", "eslint": "5.8.0",
"eslint-plugin-vue": "4.7.1", "eslint-plugin-vue": "4.7.1",
"eventemitter3": "3.1.0", "eventemitter3": "3.1.0",
"exif-js": "2.3.0",
"file-loader": "2.0.0", "file-loader": "2.0.0",
"file-type": "10.1.0", "file-type": "10.1.0",
"fuckadblock": "3.2.1", "fuckadblock": "3.2.1",
@ -131,8 +129,7 @@
"gulp-uglify": "3.0.1", "gulp-uglify": "3.0.1",
"gulp-util": "3.0.8", "gulp-util": "3.0.8",
"hard-source-webpack-plugin": "0.12.0", "hard-source-webpack-plugin": "0.12.0",
"highlight.js": "9.12.0", "html-minifier": "3.5.21",
"html-minifier": "3.5.20",
"http-signature": "1.2.0", "http-signature": "1.2.0",
"insert-text-at-cursor": "0.1.1", "insert-text-at-cursor": "0.1.1",
"is-root": "2.0.0", "is-root": "2.0.0",
@ -141,7 +138,7 @@
"jsdom": "12.2.0", "jsdom": "12.2.0",
"json5": "2.1.0", "json5": "2.1.0",
"json5-loader": "1.0.1", "json5-loader": "1.0.1",
"koa": "2.5.1", "koa": "2.6.1",
"koa-bodyparser": "4.2.1", "koa-bodyparser": "4.2.1",
"koa-compress": "3.0.0", "koa-compress": "3.0.0",
"koa-favicon": "2.0.1", "koa-favicon": "2.0.1",
@ -154,7 +151,6 @@
"koa-slow": "2.1.0", "koa-slow": "2.1.0",
"koa-views": "6.1.4", "koa-views": "6.1.4",
"loader-utils": "1.1.0", "loader-utils": "1.1.0",
"lodash.assign": "4.2.0",
"mecab-async": "0.1.2", "mecab-async": "0.1.2",
"merge-options": "1.0.1", "merge-options": "1.0.1",
"minio": "7.0.1", "minio": "7.0.1",
@ -205,10 +201,10 @@
"textarea-caret": "3.1.0", "textarea-caret": "3.1.0",
"tinycolor2": "1.4.1", "tinycolor2": "1.4.1",
"tmp": "0.0.33", "tmp": "0.0.33",
"ts-loader": "4.4.1", "ts-loader": "5.2.2",
"ts-node": "7.0.1", "ts-node": "7.0.1",
"tslint": "5.10.0", "tslint": "5.10.0",
"typescript": "2.9.2", "typescript": "3.1.3",
"typescript-eslint-parser": "20.0.0", "typescript-eslint-parser": "20.0.0",
"uglify-es": "3.3.9", "uglify-es": "3.3.9",
"url-loader": "1.1.2", "url-loader": "1.1.2",
@ -233,17 +229,10 @@
"vuex-persistedstate": "2.5.4", "vuex-persistedstate": "2.5.4",
"web-push": "3.3.3", "web-push": "3.3.3",
"webfinger.js": "2.6.6", "webfinger.js": "2.6.6",
"webpack": "4.22.0", "webpack": "4.23.1",
"webpack-cli": "3.1.2", "webpack-cli": "3.1.2",
"websocket": "1.0.28", "websocket": "1.0.28",
"ws": "6.1.0", "ws": "6.1.0",
"xev": "2.0.1" "xev": "2.0.1"
},
"greenkeeper": {
"ignore": [
"deepcopy",
"cafy",
"@types/gulp"
]
} }
} }

View File

@ -20,7 +20,6 @@ type ArrayValue<T> = {
type Span = 'day' | 'hour'; type Span = 'day' | 'hour';
//#region Chart Core
type Log<T extends Obj> = { type Log<T extends Obj> = {
_id: mongo.ObjectID; _id: mongo.ObjectID;
@ -87,13 +86,33 @@ export default abstract class Chart<T> {
} }
@autobind @autobind
private async getCurrentLog(span: Span, group?: any): Promise<Log<T>> { private getCurrentDate(): [number, number, number, number] {
const now = new Date(); const now = new Date();
const y = now.getFullYear(); const y = now.getFullYear();
const m = now.getMonth(); const m = now.getMonth();
const d = now.getDate(); const d = now.getDate();
const h = now.getHours(); const h = now.getHours();
return [y, m, d, h];
}
@autobind
private getLatestLog(span: Span, group?: any): Promise<Log<T>> {
return this.collection.findOne({
group: group,
span: span
}, {
sort: {
date: -1
}
});
}
@autobind
private async getCurrentLog(span: Span, group?: any): Promise<Log<T>> {
const [y, m, d, h] = this.getCurrentDate();
const current = const current =
span == 'day' ? new Date(y, m, d) : span == 'day' ? new Date(y, m, d) :
span == 'hour' ? new Date(y, m, d, h) : span == 'hour' ? new Date(y, m, d, h) :
@ -106,54 +125,56 @@ export default abstract class Chart<T> {
date: current date: current
}); });
if (currentLog) { // ログがあればそれを返して終了
if (currentLog != null) {
return currentLog; return currentLog;
} }
let log: Log<T>;
let data: T;
// 集計期間が変わってから、初めてのチャート更新なら // 集計期間が変わってから、初めてのチャート更新なら
// 最も最近のログを持ってくる // 最も最近のログを持ってくる
// * 例えば集計期間が「日」である場合で考えると、 // * 例えば集計期間が「日」である場合で考えると、
// * 昨日何もチャートを更新するような出来事がなかった場合は、 // * 昨日何もチャートを更新するような出来事がなかった場合は、
// * ログがそもそも作られずドキュメントが存在しないということがあり得るため、 // * ログがそもそも作られずドキュメントが存在しないということがあり得るため、
// * 「昨日の」と決め打ちせずに「もっとも最近の」とします // * 「昨日の」と決め打ちせずに「もっとも最近の」とします
const latest = await this.collection.findOne({ const latest = await this.getLatestLog(span, group);
group: group,
span: span
}, {
sort: {
date: -1
}
});
if (latest) { if (latest != null) {
// 現在のログを初期挿入 // 空ログデータを作成
const data = await this.getTemplate(false, latest.data); data = await this.getTemplate(false, latest.data);
const log = await this.collection.insert({
group: group,
span: span,
date: current,
data: data
});
return log;
} else { } else {
// ログが存在しなかったら // ログが存在しなかったら
// * Misskeyインスタンスを建てて初めてのチャート更新時など // (Misskeyインスタンスを建てて初めてのチャート更新時など
// または何らかの理由でチャートコレクションを抹消した場合)
// 空のログを作成 // 初期ログデータを作成
const data = await this.getTemplate(true, null, group); data = await this.getTemplate(true, null, group);
}
const log = await this.collection.insert({ try {
// 新規ログ挿入
log = await this.collection.insert({
group: group, group: group,
span: span, span: span,
date: current, date: current,
data: data data: data
}); });
} catch (e) {
// 11000 is duplicate key error
// 並列動作している他のチャートエンジンプロセスと処理が重なる場合がある
// その場合は再度最も新しいログを持ってくる
if (e.code === 11000) {
log = await this.getLatestLog(span, group);
} else {
console.error(e);
throw e;
}
}
return log; return log;
} }
}
@autobind @autobind
protected commit(query: Obj, group?: any, uniqueKey?: string, uniqueValue?: string): void { protected commit(query: Obj, group?: any, uniqueKey?: string, uniqueValue?: string): void {
@ -173,6 +194,7 @@ export default abstract class Chart<T> {
}; };
} }
// ログ更新
this.collection.update({ this.collection.update({
_id: log._id _id: log._id
}, query); }, query);
@ -200,16 +222,14 @@ export default abstract class Chart<T> {
public async getChart(span: Span, range: number, group?: any): Promise<ArrayValue<T>> { public async getChart(span: Span, range: number, group?: any): Promise<ArrayValue<T>> {
const promisedChart: Promise<T>[] = []; const promisedChart: Promise<T>[] = [];
const now = new Date(); const [y, m, d, h] = this.getCurrentDate();
const y = now.getFullYear();
const m = now.getMonth();
const d = now.getDate();
const h = now.getHours();
const gt = const gt =
span == 'day' ? new Date(y, m, d - range) : span == 'day' ? new Date(y, m, d - range) :
span == 'hour' ? new Date(y, m, d, h - range) : null; span == 'hour' ? new Date(y, m, d, h - range) :
null;
// ログ取得
const logs = await this.collection.find({ const logs = await this.collection.find({
group: group, group: group,
span: span, span: span,
@ -225,6 +245,7 @@ export default abstract class Chart<T> {
} }
}); });
// 整形
for (let i = (range - 1); i >= 0; i--) { for (let i = (range - 1); i >= 0; i--) {
const current = const current =
span == 'day' ? new Date(y, m, d - i) : span == 'day' ? new Date(y, m, d - i) :
@ -235,7 +256,8 @@ export default abstract class Chart<T> {
if (log) { if (log) {
promisedChart.unshift(Promise.resolve(log.data)); promisedChart.unshift(Promise.resolve(log.data));
} else { // 隙間埋め } else {
// 隙間埋め
const latest = logs.find(l => l.date.getTime() < current.getTime()); const latest = logs.find(l => l.date.getTime() < current.getTime());
promisedChart.unshift(this.getTemplate(false, latest ? latest.data : null)); promisedChart.unshift(this.getTemplate(false, latest ? latest.data : null));
} }
@ -282,4 +304,3 @@ export default abstract class Chart<T> {
return res; return res;
} }
} }
//#endregion

View File

@ -0,0 +1,72 @@
<template>
<ui-card>
<div slot="title">%fa:key% API</div>
<section class="fit-top">
<ui-input :value="$store.state.i.token" readonly>
<span>%i18n:@token%</span>
</ui-input>
<p>%i18n:@intro%</p>
<ui-info warn>%i18n:@caution%</ui-info>
<p>%i18n:@regeneration-of-token%</p>
<ui-button @click="regenerateToken">%fa:sync-alt% %i18n:@regenerate-token%</ui-button>
</section>
<section>
<header>%fa:terminal% %i18n:@console.title%</header>
<ui-input v-model="endpoint">
<span>%i18n:@console.endpoint%</span>
</ui-input>
<ui-textarea v-model="body">
<span>%i18n:@console.parameter% (JSON or JSON5)</span>
</ui-textarea>
<ui-button @click="send" :disabled="sending">
<template v-if="sending">%i18n:@console.sending%</template>
<template v-else>%fa:paper-plane% %i18n:@console.send%</template>
</ui-button>
<ui-textarea v-if="res" v-model="res" readonly tall>
<span>%i18n:@console.response%</span>
</ui-textarea>
</section>
</ui-card>
</template>
<script lang="ts">
import Vue from 'vue';
import * as JSON5 from 'json5';
export default Vue.extend({
data() {
return {
endpoint: '',
body: '{}',
res: null,
sending: false
};
},
methods: {
regenerateToken() {
(this as any).apis.input({
title: '%i18n:@enter-password%',
type: 'password'
}).then(password => {
(this as any).api('i/regenerate_token', {
password: password
});
});
},
send() {
this.sending = true;
(this as any).api(this.endpoint, JSON5.parse(this.body)).then(res => {
this.sending = false;
this.res = JSON5.stringify(res, null, 2);
}, err => {
this.sending = false;
this.res = JSON5.stringify(err, null, 2);
});
}
}
});
</script>

View File

@ -0,0 +1,171 @@
<template>
<ui-card>
<div slot="title">%fa:cloud% %i18n:common.drive%</div>
<section v-if="!fetching" class="juakhbxthdewydyreaphkepoxgxvfogn">
<div class="meter"><div :style="meterStyle"></div></div>
<p>%i18n:@max%: <b>{{ capacity | bytes }}</b> %i18n:@in-use%: <b>{{ usage | bytes }}</b></p>
</section>
<section>
<header>%i18n:@stats%</header>
<div ref="chart" style="margin-bottom: -16px; color: #000;"></div>
</section>
</ui-card>
</template>
<script lang="ts">
import Vue from 'vue';
import * as tinycolor from 'tinycolor2';
import * as ApexCharts from 'apexcharts';
export default Vue.extend({
data() {
return {
fetching: true,
usage: null,
capacity: null
};
},
computed: {
meterStyle(): any {
return {
width: `${this.usage / this.capacity * 100}%`,
background: tinycolor({
h: 180 - (this.usage / this.capacity * 180),
s: 0.7,
l: 0.5
})
};
}
},
mounted() {
(this as any).api('drive').then(info => {
this.capacity = info.capacity;
this.usage = info.usage;
this.fetching = false;
this.$nextTick(() => {
this.renderChart();
});
});
},
methods: {
renderChart() {
(this as any).api('charts/user/drive', {
userId: this.$store.state.i.id,
span: 'day',
limit: 21
}).then(stats => {
const addition = [];
const deletion = [];
const now = new Date();
const y = now.getFullYear();
const m = now.getMonth();
const d = now.getDate();
for (let i = 0; i < 21; i++) {
const x = new Date(y, m, d - i);
addition.push([
x,
stats.incSize[i]
]);
deletion.push([
x,
-stats.decSize[i]
]);
}
const chart = new ApexCharts(this.$refs.chart, {
chart: {
type: 'bar',
stacked: true,
height: 150,
zoom: {
enabled: false
}
},
plotOptions: {
bar: {
columnWidth: '90%',
endingShape: 'rounded'
}
},
grid: {
clipMarkers: false,
borderColor: 'rgba(0, 0, 0, 0.1)'
},
tooltip: {
shared: true,
intersect: false
},
dataLabels: {
enabled: false
},
legend: {
show: false
},
series: [{
name: 'Additions',
data: addition
}, {
name: 'Deletions',
data: deletion
}],
xaxis: {
type: 'datetime',
labels: {
style: {
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
}
},
axisBorder: {
color: 'rgba(0, 0, 0, 0.1)'
},
axisTicks: {
color: 'rgba(0, 0, 0, 0.1)'
},
crosshairs: {
width: 1,
opacity: 1
}
},
yaxis: {
labels: {
formatter: v => Vue.filter('bytes')(v, 0),
style: {
color: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
}
}
}
});
chart.render();
});
}
}
});
</script>
<style lang="stylus" scoped>
.juakhbxthdewydyreaphkepoxgxvfogn
> .meter
$size = 12px
margin-bottom 16px
background rgba(0, 0, 0, 0.1)
border-radius ($size / 2)
overflow hidden
> div
height $size
border-radius ($size / 2)
> p
margin 0
</style>

View File

@ -1,5 +1,7 @@
import Vue from 'vue'; import Vue from 'vue';
import apiSettings from './api-settings.vue';
import driveSettings from './drive-settings.vue';
import profileEditor from './profile-editor.vue'; import profileEditor from './profile-editor.vue';
import noteSkeleton from './note-skeleton.vue'; import noteSkeleton from './note-skeleton.vue';
import theme from './theme.vue'; import theme from './theme.vue';
@ -43,9 +45,12 @@ import uiTextarea from './ui/textarea.vue';
import uiSwitch from './ui/switch.vue'; import uiSwitch from './ui/switch.vue';
import uiRadio from './ui/radio.vue'; import uiRadio from './ui/radio.vue';
import uiSelect from './ui/select.vue'; import uiSelect from './ui/select.vue';
import uiInfo from './ui/info.vue';
import formButton from './ui/form/button.vue'; import formButton from './ui/form/button.vue';
import formRadio from './ui/form/radio.vue'; import formRadio from './ui/form/radio.vue';
Vue.component('mk-api-settings', apiSettings);
Vue.component('mk-drive-settings', driveSettings);
Vue.component('mk-profile-editor', profileEditor); Vue.component('mk-profile-editor', profileEditor);
Vue.component('mk-note-skeleton', noteSkeleton); Vue.component('mk-note-skeleton', noteSkeleton);
Vue.component('mk-theme', theme); Vue.component('mk-theme', theme);
@ -89,5 +94,6 @@ Vue.component('ui-textarea', uiTextarea);
Vue.component('ui-switch', uiSwitch); Vue.component('ui-switch', uiSwitch);
Vue.component('ui-radio', uiRadio); Vue.component('ui-radio', uiRadio);
Vue.component('ui-select', uiSelect); Vue.component('ui-select', uiSelect);
Vue.component('ui-info', uiInfo);
Vue.component('form-button', formButton); Vue.component('form-button', formButton);
Vue.component('form-radio', formRadio); Vue.component('form-radio', formRadio);

View File

@ -0,0 +1,33 @@
<template>
<div class="ymxyweixqwsxauxldgpvecjepnwxbylu" :class="{ warn }">
<i v-if="warn">%fa:exclamation-triangle%</i>
<slot></slot>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: {
warn: {
type: Boolean,
required: false,
default: false
},
},
});
</script>
<style lang="stylus" scoped>
.ymxyweixqwsxauxldgpvecjepnwxbylu
margin 16px 0
padding 16px
font-size 90%
> i
margin-right 4px
&.warn
background var(--infoWarnBg)
color var(--infoWarnFg)
</style>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="ui-textarea" :class="{ focused, filled }"> <div class="ui-textarea" :class="{ focused, filled, tall }">
<div class="input"> <div class="input">
<span class="label" ref="label"><slot></slot></span> <span class="label" ref="label"><slot></slot></span>
<textarea ref="input" <textarea ref="input"
@ -10,8 +10,8 @@
:autocomplete="autocomplete" :autocomplete="autocomplete"
@input="$emit('input', $event.target.value)" @input="$emit('input', $event.target.value)"
@focus="focused = true" @focus="focused = true"
@blur="focused = false"> @blur="focused = false"
</textarea> ></textarea>
</div> </div>
<div class="text"><slot name="text"></slot></div> <div class="text"><slot name="text"></slot></div>
</div> </div>
@ -41,7 +41,12 @@ export default Vue.extend({
autocomplete: { autocomplete: {
type: String, type: String,
required: false required: false
} },
tall: {
type: Boolean,
required: false,
default: false
},
}, },
data() { data() {
return { return {
@ -66,6 +71,9 @@ export default Vue.extend({
root(fill) root(fill)
margin 42px 0 32px 0 margin 42px 0 32px 0
&:last-child
margin-bottom 0
> .input > .input
padding 12px padding 12px
@ -157,6 +165,11 @@ root(fill)
left 0 !important left 0 !important
transform scale(0.75) transform scale(0.75)
&.tall
> .input
> textarea
min-height 200px
.ui-textarea.fill .ui-textarea.fill
root(true) root(true)

View File

@ -2,7 +2,7 @@
<mk-window ref="window" @closed="destroyDom" width="800px" height="500px" :popout-url="popout"> <mk-window ref="window" @closed="destroyDom" width="800px" height="500px" :popout-url="popout">
<template slot="header"> <template slot="header">
<p v-if="usage" :class="$style.info"><b>{{ usage.toFixed(1) }}%</b> %i18n:@used%</p> <p v-if="usage" :class="$style.info"><b>{{ usage.toFixed(1) }}%</b> %i18n:@used%</p>
<span :class="$style.title">%fa:cloud%%i18n:@drive%</span> <span :class="$style.title">%fa:cloud%%i18n:common.drive%</span>
</template> </template>
<mk-drive :class="$style.browser" multiple :init-folder="folder" ref="browser"/> <mk-drive :class="$style.browser" multiple :init-folder="folder" ref="browser"/>
</mk-window> </mk-window>

View File

@ -67,12 +67,12 @@ export default Vue.extend({
text: '%i18n:@contextmenu.rename%', text: '%i18n:@contextmenu.rename%',
icon: '%fa:i-cursor%', icon: '%fa:i-cursor%',
action: this.rename action: this.rename
}/*, null, { }, null, {
type: 'item', type: 'item',
text: '%i18n:common.delete%', text: '%i18n:common.delete%',
icon: '%fa:R trash-alt%', icon: '%fa:R trash-alt%',
action: this.deleteFolder action: this.deleteFolder
}*/], { }], {
closed: () => { closed: () => {
this.isContextmenuShowing = false; this.isContextmenuShowing = false;
} }
@ -207,7 +207,9 @@ export default Vue.extend({
}, },
deleteFolder() { deleteFolder() {
alert('not implemented yet'); (this as any).api('drive/folders/delete', {
folderId: this.folder.id
});
} }
} }
}); });

View File

@ -8,7 +8,7 @@
@drop.stop="onDrop" @drop.stop="onDrop"
> >
<template v-if="folder == null">%fa:cloud%</template> <template v-if="folder == null">%fa:cloud%</template>
<span>{{ folder == null ? '%i18n:@drive%' : folder.name }}</span> <span>{{ folder == null ? '%i18n:common.drive%' : folder.name }}</span>
</div> </div>
</template> </template>

View File

@ -98,7 +98,7 @@ export default Vue.extend({
hierarchyFolders: [], hierarchyFolders: [],
selectedFiles: [], selectedFiles: [],
uploadings: [], uploadings: [],
connection: null connection: null,
/** /**
* ドロップされようとしているか * ドロップされようとしているか
@ -122,6 +122,7 @@ export default Vue.extend({
this.connection.on('fileDeleted', this.onStreamDriveFileDeleted); this.connection.on('fileDeleted', this.onStreamDriveFileDeleted);
this.connection.on('folderCreated', this.onStreamDriveFolderCreated); this.connection.on('folderCreated', this.onStreamDriveFolderCreated);
this.connection.on('folderUpdated', this.onStreamDriveFolderUpdated); this.connection.on('folderUpdated', this.onStreamDriveFolderUpdated);
this.connection.on('folderDeleted', this.onStreamDriveFolderDeleted);
if (this.initFolder) { if (this.initFolder) {
this.move(this.initFolder); this.move(this.initFolder);
@ -182,6 +183,10 @@ export default Vue.extend({
} }
}, },
onStreamDriveFolderDeleted(folderId) {
this.removeFolder(folderId);
},
onChangeUploaderUploads(uploads) { onChangeUploaderUploads(uploads) {
this.uploadings = uploads; this.uploadings = uploads;
}, },

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="2fa"> <div class="2fa">
<p>%i18n:@intro%<a href="%i18n:@url%" target="_blank">%i18n:@detail%</a></p> <p style="margin-top:0;">%i18n:@intro%<a href="%i18n:@url%" target="_blank">%i18n:@detail%</a></p>
<div class="ui info warn"><p>%fa:exclamation-triangle%%i18n:@caution%</p></div> <ui-info warn>%i18n:@caution%</ui-info>
<p v-if="!data && !$store.state.i.twoFactorEnabled"><ui-button @click="register">%i18n:@register%</ui-button></p> <p v-if="!data && !$store.state.i.twoFactorEnabled"><ui-button @click="register">%i18n:@register%</ui-button></p>
<template v-if="$store.state.i.twoFactorEnabled"> <template v-if="$store.state.i.twoFactorEnabled">
<p>%i18n:@already-registered%</p> <p>%i18n:@already-registered%</p>
@ -72,9 +72,3 @@ export default Vue.extend({
} }
}); });
</script> </script>
<style lang="stylus" scoped>
.2fa
color #4a535a
</style>

View File

@ -1,40 +0,0 @@
<template>
<div class="root api">
<ui-input :value="$store.state.i.token" readonly>
<span>%i18n:@token%</span>
</ui-input>
<p>%i18n:@intro%</p>
<div class="ui info warn"><p>%fa:exclamation-triangle%%i18n:@caution%</p></div>
<p>%i18n:@regeneration-of-token%</p>
<ui-button @click="regenerateToken">%i18n:@regenerate-token%</ui-button>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
methods: {
regenerateToken() {
(this as any).apis.input({
title: '%i18n:@enter-password%',
type: 'password'
}).then(password => {
(this as any).api('i/regenerate_token', {
password: password
});
});
}
}
});
</script>
<style lang="stylus" scoped>
.root.api
code
display inline-block
padding 4px 6px
color #555
background #eee
border-radius 2px
</style>

View File

@ -1,34 +0,0 @@
<template>
<div class="root">
<template v-if="!fetching">
<p><b>{{ capacity | bytes }}</b>%i18n:@max%<b>{{ usage | bytes }}</b>%i18n:@in-use%</p>
</template>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
data() {
return {
fetching: true,
usage: null,
capacity: null
};
},
mounted() {
(this as any).api('drive').then(info => {
this.capacity = info.capacity;
this.usage = info.usage;
this.fetching = false;
});
}
});
</script>
<style lang="stylus" scoped>
.root
> p
> b
margin 0 8px
</style>

View File

@ -5,7 +5,7 @@
<p :class="{ active: page == 'theme' }" @mousedown="page = 'theme'">%fa:palette .fw%%i18n:@theme%</p> <p :class="{ active: page == 'theme' }" @mousedown="page = 'theme'">%fa:palette .fw%%i18n:@theme%</p>
<p :class="{ active: page == 'web' }" @mousedown="page = 'web'">%fa:desktop .fw%Web</p> <p :class="{ active: page == 'web' }" @mousedown="page = 'web'">%fa:desktop .fw%Web</p>
<p :class="{ active: page == 'notification' }" @mousedown="page = 'notification'">%fa:R bell .fw%%i18n:@notification%</p> <p :class="{ active: page == 'notification' }" @mousedown="page = 'notification'">%fa:R bell .fw%%i18n:@notification%</p>
<p :class="{ active: page == 'drive' }" @mousedown="page = 'drive'">%fa:cloud .fw%%i18n:@drive%</p> <p :class="{ active: page == 'drive' }" @mousedown="page = 'drive'">%fa:cloud .fw%%i18n:common.drive%</p>
<p :class="{ active: page == 'hashtags' }" @mousedown="page = 'hashtags'">%fa:hashtag .fw%%i18n:@tags%</p> <p :class="{ active: page == 'hashtags' }" @mousedown="page = 'hashtags'">%fa:hashtag .fw%%i18n:@tags%</p>
<p :class="{ active: page == 'mute' }" @mousedown="page = 'mute'">%fa:ban .fw%%i18n:@mute%</p> <p :class="{ active: page == 'mute' }" @mousedown="page = 'mute'">%fa:ban .fw%%i18n:@mute%</p>
<p :class="{ active: page == 'apps' }" @mousedown="page = 'apps'">%fa:puzzle-piece .fw%%i18n:@apps%</p> <p :class="{ active: page == 'apps' }" @mousedown="page = 'apps'">%fa:puzzle-piece .fw%%i18n:@apps%</p>
@ -189,12 +189,9 @@
</section> </section>
</ui-card> </ui-card>
<ui-card class="drive" v-show="page == 'drive'"> <div class="drive" v-if="page == 'drive'">
<div slot="title">%fa:cloud% %i18n:@drive%</div> <mk-drive-settings/>
<section> </div>
<x-drive/>
</section>
</ui-card>
<ui-card class="hashtags" v-show="page == 'hashtags'"> <ui-card class="hashtags" v-show="page == 'hashtags'">
<div slot="title">%fa:hashtag% %i18n:@tags%</div> <div slot="title">%fa:hashtag% %i18n:@tags%</div>
@ -238,12 +235,9 @@
</section> </section>
</ui-card> </ui-card>
<ui-card class="api" v-show="page == 'api'"> <div class="api" v-show="page == 'api'">
<div slot="title">%fa:key% API</div> <mk-api-settings/>
<section class="fit-top"> </div>
<x-api/>
</section>
</ui-card>
<ui-card class="other" v-show="page == 'other'"> <ui-card class="other" v-show="page == 'other'">
<div slot="title">%fa:info-circle% %i18n:@about%</div> <div slot="title">%fa:info-circle% %i18n:@about%</div>
@ -298,10 +292,8 @@ import Vue from 'vue';
import XMute from './settings.mute.vue'; import XMute from './settings.mute.vue';
import XPassword from './settings.password.vue'; import XPassword from './settings.password.vue';
import X2fa from './settings.2fa.vue'; import X2fa from './settings.2fa.vue';
import XApi from './settings.api.vue';
import XApps from './settings.apps.vue'; import XApps from './settings.apps.vue';
import XSignins from './settings.signins.vue'; import XSignins from './settings.signins.vue';
import XDrive from './settings.drive.vue';
import XTags from './settings.tags.vue'; import XTags from './settings.tags.vue';
import { url, langs, version } from '../../../config'; import { url, langs, version } from '../../../config';
import checkForUpdate from '../../../common/scripts/check-for-update'; import checkForUpdate from '../../../common/scripts/check-for-update';
@ -311,10 +303,8 @@ export default Vue.extend({
XMute, XMute,
XPassword, XPassword,
X2fa, X2fa,
XApi,
XApps, XApps,
XSignins, XSignins,
XDrive,
XTags XTags
}, },
props: { props: {

View File

@ -11,7 +11,7 @@
<router-link :to="`/@${ $store.state.i.username }`">%fa:user%<span>%i18n:@profile%</span>%fa:angle-right%</router-link> <router-link :to="`/@${ $store.state.i.username }`">%fa:user%<span>%i18n:@profile%</span>%fa:angle-right%</router-link>
</li> </li>
<li @click="drive"> <li @click="drive">
<p>%fa:cloud%<span>%i18n:@drive%</span>%fa:angle-right%</p> <p>%fa:cloud%<span>%i18n:common.drive%</span>%fa:angle-right%</p>
</li> </li>
<li> <li>
<router-link to="/i/favorites">%fa:star%<span>%i18n:@favorites%</span>%fa:angle-right%</router-link> <router-link to="/i/favorites">%fa:star%<span>%i18n:@favorites%</span>%fa:angle-right%</router-link>

View File

@ -13,7 +13,7 @@
<li v-if="this.$store.state.i && this.$store.state.i.isAdmin" <li v-if="this.$store.state.i && this.$store.state.i.isAdmin"
@click="nav('hashtags')" :class="{ active: page == 'hashtags' }">%fa:hashtag .fw%%i18n:@hashtags%</li> @click="nav('hashtags')" :class="{ active: page == 'hashtags' }">%fa:hashtag .fw%%i18n:@hashtags%</li>
<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:@drive%</li> --> <!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:common.drive%</li> -->
<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> --> <!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> -->
</ul> </ul>
</nav> </nav>

View File

@ -159,8 +159,8 @@ export default Vue.extend({
} }
//#endregion //#endregion
// タブが非表示またはスクロール位置が最上部ではないならタイトルで通知 // タブが非表示ならタイトルで通知
if (document.hidden || !this.isScrollTop()) { if (document.hidden) {
this.$store.commit('pushBehindNote', note); this.$store.commit('pushBehindNote', note);
} }

View File

@ -11,7 +11,11 @@
<div class="action-form"> <div class="action-form">
<ui-button @click="user.isMuted ? unmute() : mute()" v-if="$store.state.i.id != user.id"> <ui-button @click="user.isMuted ? unmute() : mute()" v-if="$store.state.i.id != user.id">
<span v-if="user.isMuted">%fa:eye% %i18n:@unmute%</span> <span v-if="user.isMuted">%fa:eye% %i18n:@unmute%</span>
<span v-if="!user.isMuted">%fa:eye-slash% %i18n:@mute%</span> <span v-else>%fa:eye-slash% %i18n:@mute%</span>
</ui-button>
<ui-button @click="user.isBlocking ? unblock() : block()" v-if="$store.state.i.id != user.id">
<span v-if="user.isBlocking">%fa:user% %i18n:@unblock%</span>
<span v-else>%fa:user-slash% %i18n:@block%</span>
</ui-button> </ui-button>
<ui-button @click="list">%fa:list% %i18n:@push-to-a-list%</ui-button> <ui-button @click="list">%fa:list% %i18n:@push-to-a-list%</ui-button>
</div> </div>
@ -66,6 +70,27 @@ export default Vue.extend({
}); });
}, },
block() {
if (!window.confirm('%i18n:@block-confirm%')) return;
(this as any).api('blocking/create', {
userId: this.user.id
}).then(() => {
this.user.isBlocking = true;
}, () => {
alert('error');
});
},
unblock() {
(this as any).api('blocking/delete', {
userId: this.user.id
}).then(() => {
this.user.isBlocking = false;
}, () => {
alert('error');
});
},
list() { list() {
const w = (this as any).os.new(MkUserListsWindow); const w = (this as any).os.new(MkUserListsWindow);
w.$once('choosen', async list => { w.$once('choosen', async list => {
@ -114,7 +139,6 @@ export default Vue.extend({
> .action-form > .action-form
padding 16px padding 16px
text-align center text-align center
border-bottom solid 1px var(--faceDivider)
> * > *
width 100% width 100%

View File

@ -5,7 +5,6 @@
:src="file.url" :src="file.url"
:alt="file.name" :alt="file.name"
:title="file.name" :title="file.name"
@load="onImageLoaded"
:style="style"> :style="style">
<template v-if="kind != 'image'">%fa:file%</template> <template v-if="kind != 'image'">%fa:file%</template>
<footer v-if="kind == 'image' && file.properties && file.properties.width && file.properties.height"> <footer v-if="kind == 'image' && file.properties && file.properties.width && file.properties.height">
@ -46,14 +45,6 @@
<ui-button @click="del">%fa:trash-alt R% %i18n:@delete%</ui-button> <ui-button @click="del">%fa:trash-alt R% %i18n:@delete%</ui-button>
</div> </div>
</div> </div>
<div class="exif" v-show="exif">
<div>
<p>
%fa:camera%%i18n:@exif%
</p>
<pre ref="exif" class="json">{{ exif ? JSON.stringify(exif, null, 2) : '' }}</pre>
</div>
</div>
<div class="hash"> <div class="hash">
<div> <div>
<p> <p>
@ -67,8 +58,6 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import * as EXIF from 'exif-js';
import * as hljs from 'highlight.js';
import { gcd } from '../../../../../prelude/math'; import { gcd } from '../../../../../prelude/math';
export default Vue.extend({ export default Vue.extend({
@ -139,15 +128,6 @@ export default Vue.extend({
showCreatedAt() { showCreatedAt() {
alert(new Date(this.file.createdAt).toLocaleString()); alert(new Date(this.file.createdAt).toLocaleString());
},
onImageLoaded() {
const self = this;
EXIF.getData(this.$refs.img, function(this: any) {
const allMetaData = EXIF.getAllTags(this);
self.exif = allMetaData;
hljs.highlightBlock(self.$refs.exif);
});
} }
} }
}); });
@ -256,34 +236,4 @@ export default Vue.extend({
border-radius 2px border-radius 2px
background #f5f5f5 background #f5f5f5
> .exif
padding 14px
border-top solid 1px var(--faceDivider)
> div
max-width 500px
margin 0 auto
> p
display block
margin 0
padding 0
color var(--text)
font-size 0.9em
> [data-fa]
margin-right 4px
> pre
display block
width 100%
margin 6px 0 0 0
padding 8px
height 128px
overflow auto
font-size 0.9em
border solid 1px #dfdfdf
border-radius 2px
background #f5f5f5
</style> </style>

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="kmmwchoexgckptowjmjgfsygeltxfeqs"> <div class="kmmwchoexgckptowjmjgfsygeltxfeqs">
<nav ref="nav"> <nav ref="nav">
<a @click.prevent="goRoot()" href="/i/drive">%fa:cloud%%i18n:@drive%</a> <a @click.prevent="goRoot()" href="/i/drive">%fa:cloud%%i18n:common.drive%</a>
<template v-for="folder in hierarchyFolders"> <template v-for="folder in hierarchyFolders">
<span :key="folder.id + '>'">%fa:angle-right%</span> <span :key="folder.id + '>'">%fa:angle-right%</span>
<a :key="folder.id" @click.prevent="cd(folder)" :href="`/i/drive/folder/${folder.id}`">{{ folder.name }}</a> <a :key="folder.id" @click.prevent="cd(folder)" :href="`/i/drive/folder/${folder.id}`">{{ folder.name }}</a>

View File

@ -12,7 +12,6 @@ import noteCard from './note-card.vue';
import userCard from './user-card.vue'; import userCard from './user-card.vue';
import noteDetail from './note-detail.vue'; import noteDetail from './note-detail.vue';
import followButton from './follow-button.vue'; import followButton from './follow-button.vue';
import muteButton from './mute-button.vue';
import friendsMaker from './friends-maker.vue'; import friendsMaker from './friends-maker.vue';
import notification from './notification.vue'; import notification from './notification.vue';
import notifications from './notifications.vue'; import notifications from './notifications.vue';
@ -37,7 +36,6 @@ Vue.component('mk-note-card', noteCard);
Vue.component('mk-user-card', userCard); Vue.component('mk-user-card', userCard);
Vue.component('mk-note-detail', noteDetail); Vue.component('mk-note-detail', noteDetail);
Vue.component('mk-follow-button', followButton); Vue.component('mk-follow-button', followButton);
Vue.component('mk-mute-button', muteButton);
Vue.component('mk-friends-maker', friendsMaker); Vue.component('mk-friends-maker', friendsMaker);
Vue.component('mk-notification', notification); Vue.component('mk-notification', notification);
Vue.component('mk-notifications', notifications); Vue.component('mk-notifications', notifications);

View File

@ -1,79 +0,0 @@
<template>
<button
class="mk-mute-button"
:class="{ active: user.isMuted }"
@click="onClick">
<span v-if="!user.isMuted">%fa:eye-slash% %i18n:@mute%</span>
<span v-else>%fa:eye% %i18n:@unmute%</span>
</button>
</template>
<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
props: {
user: {
type: Object,
required: true
}
},
methods: {
onClick() {
if (!this.user.isMuted) {
this.mute();
} else {
this.unmute();
}
},
mute() {
(this as any).api('mute/create', { userId: this.user.id})
.then(() => { this.user.isMuted = true })
.catch(() => { alert('error')})
},
unmute() {
(this as any).api('mute/delete', { userId: this.user.id })
.then(() => { this.user.isMuted = false })
.catch(() => { alert('error') })
}
},
})
</script>
<style lang="stylus" scoped>
.mk-mute-button
display block
user-select none
cursor pointer
padding 0 16px
margin 0
min-width 100px
line-height 36px
font-size 14px
font-weight bold
color var(--primary)
background transparent
outline none
border solid 1px var(--primary)
border-radius 36px
&:hover
background var(--primaryAlpha01)
&:active
background var(--primaryAlpha02)
&.active
color var(--primaryForeground)
background var(--primary)
&:hover
background var(--primaryLighten10)
border-color var(--primaryLighten10)
&:active
background var(--primaryDarken10)
border-color var(--primaryDarken10)
</style>

View File

@ -25,7 +25,7 @@
<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:R calendar-alt%%i18n:@widgets%%fa:angle-right%</router-link></li> <li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:R calendar-alt%%i18n:@widgets%%fa:angle-right%</router-link></li>
<li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'">%fa:star%%i18n:@favorites%%fa:angle-right%</router-link></li> <li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'">%fa:star%%i18n:@favorites%%fa:angle-right%</router-link></li>
<li><router-link to="/i/lists" :data-active="$route.name == 'user-lists'">%fa:list%%i18n:@user-lists%%fa:angle-right%</router-link></li> <li><router-link to="/i/lists" :data-active="$route.name == 'user-lists'">%fa:list%%i18n:@user-lists%%fa:angle-right%</router-link></li>
<li><router-link to="/i/drive" :data-active="$route.name == 'drive'">%fa:cloud%%i18n:@drive%%fa:angle-right%</router-link></li> <li><router-link to="/i/drive" :data-active="$route.name == 'drive'">%fa:cloud%%i18n:common.drive%%fa:angle-right%</router-link></li>
</ul> </ul>
<ul> <ul>
<li><a @click="search">%fa:search%%i18n:@search%%fa:angle-right%</a></li> <li><a @click="search">%fa:search%%i18n:@search%%fa:angle-right%</a></li>

View File

@ -3,7 +3,7 @@
<span slot="header"> <span slot="header">
<template v-if="folder"><span style="margin-right:4px;">%fa:R folder-open%</span>{{ folder.name }}</template> <template v-if="folder"><span style="margin-right:4px;">%fa:R folder-open%</span>{{ folder.name }}</template>
<template v-if="file"><mk-file-type-icon data-icon :type="file.type" style="margin-right:4px;"/>{{ file.name }}</template> <template v-if="file"><mk-file-type-icon data-icon :type="file.type" style="margin-right:4px;"/>{{ file.name }}</template>
<template v-if="!folder && !file"><span style="margin-right:4px;">%fa:cloud%</span>%i18n:@drive%</template> <template v-if="!folder && !file"><span style="margin-right:4px;">%fa:cloud%</span>%i18n:common.drive%</template>
</span> </span>
<template slot="func"><button @click="fn">%fa:ellipsis-h%</button></template> <template slot="func"><button @click="fn">%fa:ellipsis-h%</button></template>
<mk-drive <mk-drive

View File

@ -26,6 +26,9 @@
<ui-switch v-model="iLikeSushi">%i18n:common.i-like-sushi%</ui-switch> <ui-switch v-model="iLikeSushi">%i18n:common.i-like-sushi%</ui-switch>
<ui-switch v-model="disableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch> <ui-switch v-model="disableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch>
<ui-switch v-model="alwaysShowNsfw">%i18n:common.always-show-nsfw% (%i18n:common.this-setting-is-this-device-only%)</ui-switch> <ui-switch v-model="alwaysShowNsfw">%i18n:common.always-show-nsfw% (%i18n:common.this-setting-is-this-device-only%)</ui-switch>
</section>
<section>
<ui-switch v-model="games_reversi_showBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch> <ui-switch v-model="games_reversi_showBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch>
<ui-switch v-model="games_reversi_useContrastStones">%i18n:common.use-contrast-reversi-stones%</ui-switch> <ui-switch v-model="games_reversi_useContrastStones">%i18n:common.use-contrast-reversi-stones%</ui-switch>
</section> </section>
@ -80,6 +83,8 @@
</section> </section>
</ui-card> </ui-card>
<mk-drive-settings/>
<ui-card> <ui-card>
<div slot="title">%fa:volume-up% %i18n:@sound%</div> <div slot="title">%fa:volume-up% %i18n:@sound%</div>
@ -118,6 +123,8 @@
</section> </section>
</ui-card> </ui-card>
<mk-api-settings />
<ui-card> <ui-card>
<div slot="title">%fa:sync-alt% %i18n:@update%</div> <div slot="title">%fa:sync-alt% %i18n:@update%</div>

View File

@ -11,7 +11,7 @@
<a class="avatar"> <a class="avatar">
<img :src="user.avatarUrl" alt="avatar"/> <img :src="user.avatarUrl" alt="avatar"/>
</a> </a>
<mk-mute-button v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/> <button class="menu" ref="menu" @click="menu">%fa:ellipsis-h%</button>
<mk-follow-button v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/> <mk-follow-button v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/>
</div> </div>
<div class="title"> <div class="title">
@ -67,6 +67,7 @@ import Vue from 'vue';
import * as age from 's-age'; import * as age from 's-age';
import parseAcct from '../../../../../misc/acct/parse'; import parseAcct from '../../../../../misc/acct/parse';
import Progress from '../../../common/scripts/loading'; import Progress from '../../../common/scripts/loading';
import Menu from '../../../common/views/components/menu.vue';
import XHome from './user/home.vue'; import XHome from './user/home.vue';
export default Vue.extend({ export default Vue.extend({
@ -109,8 +110,62 @@ export default Vue.extend({
Progress.done(); Progress.done();
document.title = `${Vue.filter('userName')(this.user)} | ${(this as any).os.instanceName}`; document.title = `${Vue.filter('userName')(this.user)} | ${(this as any).os.instanceName}`;
}); });
},
menu() {
let menu = [{
icon: this.user.isMuted ? '%fa:eye%' : '%fa:eye-slash%',
text: this.user.isMuted ? '%i18n:@unmute%' : '%i18n:@mute%',
action: () => {
if (this.user.isMuted) {
(this as any).api('mute/delete', {
userId: this.user.id
}).then(() => {
this.user.isMuted = false;
}, () => {
alert('error');
});
} else {
(this as any).api('mute/create', {
userId: this.user.id
}).then(() => {
this.user.isMuted = true;
}, () => {
alert('error');
});
} }
} }
}, {
icon: this.user.isBlocking ? '%fa:user%' : '%fa:user-slash%',
text: this.user.isBlocking ? '%i18n:@unblock%' : '%i18n:@block%',
action: () => {
if (this.user.isBlocking) {
(this as any).api('blocking/delete', {
userId: this.user.id
}).then(() => {
this.user.isBlocking = false;
}, () => {
alert('error');
});
} else {
(this as any).api('blocking/create', {
userId: this.user.id
}).then(() => {
this.user.isBlocking = true;
}, () => {
alert('error');
});
}
}
}];
this.os.new(Menu, {
source: this.$refs.menu,
compact: true,
items: menu
});
},
}
}); });
</script> </script>
@ -156,14 +211,10 @@ main
max-width 600px max-width 600px
> .top > .top
&:after display flex
content ''
display block
clear both
> .avatar > .avatar
display block display block
float left
width 25% width 25%
height 40px height 40px
@ -183,11 +234,15 @@ main
border 4px solid $bg border 4px solid $bg
border-radius 12px border-radius 12px
> .mk-mute-button > .menu
float right margin 0 0 0 auto
padding 8px
margin-right 8px
font-size 18px
color var(--text)
> .mk-follow-button > .mk-follow-button
float right margin 0
> .title > .title
margin 8px 0 margin 8px 0

View File

@ -34,7 +34,7 @@
faceClearButtonHover: 'rgba(0, 0, 0, 0.1)', faceClearButtonHover: 'rgba(0, 0, 0, 0.1)',
faceClearButtonActive: 'rgba(0, 0, 0, 0.2)', faceClearButtonActive: 'rgba(0, 0, 0, 0.2)',
popupBg: ':lighten<5<$secondary', popupBg: ':lighten<5<$secondary',
popupFg: '#d6dce2', popupFg: '$text',
subNoteBg: 'rgba(0, 0, 0, 0.18)', subNoteBg: 'rgba(0, 0, 0, 0.18)',
subNoteText: ':alpha<0.7<$text', subNoteText: ':alpha<0.7<$text',
@ -131,6 +131,9 @@
remoteInfoBg: '#42321c', remoteInfoBg: '#42321c',
remoteInfoFg: '#ffbd3e', remoteInfoFg: '#ffbd3e',
infoWarnBg: '#42321c',
infoWarnFg: '#ffbd3e',
messagingRoomBg: '@bg', messagingRoomBg: '@bg',
messagingRoomInfo: '#fff', messagingRoomInfo: '#fff',
messagingRoomDateDividerLine: 'rgba(255, 255, 255, 0.1)', messagingRoomDateDividerLine: 'rgba(255, 255, 255, 0.1)',

View File

@ -34,7 +34,7 @@
faceClearButtonHover: 'rgba(0, 0, 0, 0.025)', faceClearButtonHover: 'rgba(0, 0, 0, 0.025)',
faceClearButtonActive: 'rgba(0, 0, 0, 0.05)', faceClearButtonActive: 'rgba(0, 0, 0, 0.05)',
popupBg: ':lighten<5<$secondary', popupBg: ':lighten<5<$secondary',
popupFg: '#586069', popupFg: '$text',
subNoteBg: 'rgba(0, 0, 0, 0.01)', subNoteBg: 'rgba(0, 0, 0, 0.01)',
subNoteText: ':alpha<0.7<$text', subNoteText: ':alpha<0.7<$text',
@ -131,6 +131,9 @@
remoteInfoBg: '#fff0db', remoteInfoBg: '#fff0db',
remoteInfoFg: '#573c08', remoteInfoFg: '#573c08',
infoWarnBg: '#fff0db',
infoWarnFg: '#573c08',
messagingRoomBg: '#fff', messagingRoomBg: '#fff',
messagingRoomInfo: '#000', messagingRoomInfo: '#000',
messagingRoomDateDividerLine: 'rgba(0, 0, 0, 0.1)', messagingRoomDateDividerLine: 'rgba(0, 0, 0, 0.1)',

View File

@ -8,7 +8,7 @@
以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例: 以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
``` ```
%URL%/streaming?i=xxxxxxxxxxxxxxx %WS_URL%/streaming?i=xxxxxxxxxxxxxxx
``` ```
認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
@ -22,7 +22,7 @@
認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: 認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
``` ```
%URL%/streaming %WS_URL%/streaming
``` ```
--- ---

View File

@ -17,7 +17,8 @@ export default function(text: string, index: number) {
const quote = match[1] const quote = match[1]
.split('\n') .split('\n')
.map(line => line.replace(/^>+/g, '').trim()) .map(line => line.replace(/^>+/g, '').trim())
.join('\n'); .join('\n')
.trim();
return { return {
type: 'quote', type: 'quote',

View File

@ -1,6 +1,5 @@
import * as mongo from 'mongodb'; import * as mongo from 'mongodb';
import db from '../db/mongodb'; import db from '../db/mongodb';
import isObjectId from '../misc/is-objectid';
const AccessToken = db.get<IAccessToken>('accessTokens'); const AccessToken = db.get<IAccessToken>('accessTokens');
AccessToken.createIndex('token'); AccessToken.createIndex('token');
@ -15,30 +14,3 @@ export type IAccessToken = {
token: string; token: string;
hash: string; hash: string;
}; };
/**
* AccessTokenを物理削除します
*/
export async function deleteAccessToken(accessToken: string | mongo.ObjectID | IAccessToken) {
let a: IAccessToken;
// Populate
if (isObjectId(accessToken)) {
a = await AccessToken.findOne({
_id: accessToken
});
} else if (typeof accessToken === 'string') {
a = await AccessToken.findOne({
_id: new mongo.ObjectID(accessToken)
});
} else {
a = accessToken as IAccessToken;
}
if (a == null) return;
// このAccessTokenを削除
await AccessToken.remove({
_id: a._id
});
}

13
src/models/blocking.ts Normal file
View File

@ -0,0 +1,13 @@
import * as mongo from 'mongodb';
import db from '../db/mongodb';
const Blocking = db.get<IBlocking>('blocking');
Blocking.createIndex(['blockerId', 'blockeeId'], { unique: true });
export default Blocking;
export type IBlocking = {
_id: mongo.ObjectID;
createdAt: Date;
blockeeId: mongo.ObjectID;
blockerId: mongo.ObjectID;
};

View File

@ -1,6 +1,5 @@
import * as mongo from 'mongodb'; import * as mongo from 'mongodb';
import monkDb, { nativeDbConn } from '../db/mongodb'; import monkDb, { nativeDbConn } from '../db/mongodb';
import isObjectId from '../misc/is-objectid';
const DriveFileThumbnail = monkDb.get<IDriveFileThumbnail>('driveFileThumbnails.files'); const DriveFileThumbnail = monkDb.get<IDriveFileThumbnail>('driveFileThumbnails.files');
DriveFileThumbnail.createIndex('metadata.originalId', { sparse: true, unique: true }); DriveFileThumbnail.createIndex('metadata.originalId', { sparse: true, unique: true });
@ -28,35 +27,3 @@ export type IDriveFileThumbnail = {
contentType: string; contentType: string;
metadata: IMetadata; metadata: IMetadata;
}; };
/**
* DriveFileThumbnailを物理削除します
*/
export async function deleteDriveFileThumbnail(driveFile: string | mongo.ObjectID | IDriveFileThumbnail) {
let d: IDriveFileThumbnail;
// Populate
if (isObjectId(driveFile)) {
d = await DriveFileThumbnail.findOne({
_id: driveFile
});
} else if (typeof driveFile === 'string') {
d = await DriveFileThumbnail.findOne({
_id: new mongo.ObjectID(driveFile)
});
} else {
d = driveFile as IDriveFileThumbnail;
}
if (d == null) return;
// このDriveFileThumbnailのチャンクをすべて削除
await DriveFileThumbnailChunk.remove({
files_id: d._id
});
// このDriveFileThumbnailを削除
await DriveFileThumbnail.remove({
_id: d._id
});
}

View File

@ -4,10 +4,6 @@ import { pack as packFolder } from './drive-folder';
import config from '../config'; import config from '../config';
import monkDb, { nativeDbConn } from '../db/mongodb'; import monkDb, { nativeDbConn } from '../db/mongodb';
import isObjectId from '../misc/is-objectid'; import isObjectId from '../misc/is-objectid';
import Note, { deleteNote } from './note';
import MessagingMessage, { deleteMessagingMessage } from './messaging-message';
import User from './user';
import DriveFileThumbnail, { deleteDriveFileThumbnail } from './drive-file-thumbnail';
const DriveFile = monkDb.get<IDriveFile>('driveFiles.files'); const DriveFile = monkDb.get<IDriveFile>('driveFiles.files');
DriveFile.createIndex('md5'); DriveFile.createIndex('md5');
@ -77,64 +73,6 @@ export function validateFileName(name: string): boolean {
); );
} }
/**
* DriveFileを物理削除します
*/
export async function deleteDriveFile(driveFile: string | mongo.ObjectID | IDriveFile) {
let d: IDriveFile;
// Populate
if (isObjectId(driveFile)) {
d = await DriveFile.findOne({
_id: driveFile
});
} else if (typeof driveFile === 'string') {
d = await DriveFile.findOne({
_id: new mongo.ObjectID(driveFile)
});
} else {
d = driveFile as IDriveFile;
}
if (d == null) return;
// このDriveFileを添付しているNoteをすべて削除
await Promise.all((
await Note.find({ fileIds: d._id })
).map(x => deleteNote(x)));
// このDriveFileを添付しているMessagingMessageをすべて削除
await Promise.all((
await MessagingMessage.find({ fileId: d._id })
).map(x => deleteMessagingMessage(x)));
// このDriveFileがアバターやバナーに使われていたらそれらのプロパティをnullにする
const u = await User.findOne({ _id: d.metadata.userId });
if (u) {
if (u.avatarId && u.avatarId.equals(d._id)) {
await User.update({ _id: u._id }, { $set: { avatarId: null } });
}
if (u.bannerId && u.bannerId.equals(d._id)) {
await User.update({ _id: u._id }, { $set: { bannerId: null } });
}
}
// このDriveFileのDriveFileThumbnailをすべて削除
await Promise.all((
await DriveFileThumbnail.find({ 'metadata.originalId': d._id })
).map(x => deleteDriveFileThumbnail(x)));
// このDriveFileのチャンクをすべて削除
await DriveFileChunk.remove({
files_id: d._id
});
// このDriveFileを削除
await DriveFile.remove({
_id: d._id
});
}
export const packMany = async ( export const packMany = async (
files: any[], files: any[],
options?: { options?: {

View File

@ -23,51 +23,6 @@ export function isValidFolderName(name: string): boolean {
); );
} }
/**
* DriveFolderを物理削除します
*/
export async function deleteDriveFolder(driveFolder: string | mongo.ObjectID | IDriveFolder) {
let d: IDriveFolder;
// Populate
if (isObjectId(driveFolder)) {
d = await DriveFolder.findOne({
_id: driveFolder
});
} else if (typeof driveFolder === 'string') {
d = await DriveFolder.findOne({
_id: new mongo.ObjectID(driveFolder)
});
} else {
d = driveFolder as IDriveFolder;
}
if (d == null) return;
// このDriveFolderに格納されているDriveFileがあればすべてルートに移動
await DriveFile.update({
'metadata.folderId': d._id
}, {
$set: {
'metadata.folderId': null
}
});
// このDriveFolderに格納されているDriveFolderがあればすべてルートに移動
await DriveFolder.update({
parentId: d._id
}, {
$set: {
parentId: null
}
});
// このDriveFolderを削除
await DriveFolder.remove({
_id: d._id
});
}
/** /**
* Pack a drive folder for API response * Pack a drive folder for API response
*/ */

View File

@ -5,6 +5,7 @@ import isObjectId from '../misc/is-objectid';
import { pack as packNote } from './note'; import { pack as packNote } from './note';
const Favorite = db.get<IFavorite>('favorites'); const Favorite = db.get<IFavorite>('favorites');
Favorite.createIndex('userId');
Favorite.createIndex(['userId', 'noteId'], { unique: true }); Favorite.createIndex(['userId', 'noteId'], { unique: true });
export default Favorite; export default Favorite;
@ -15,33 +16,6 @@ export type IFavorite = {
noteId: mongo.ObjectID; noteId: mongo.ObjectID;
}; };
/**
* Favoriteを物理削除します
*/
export async function deleteFavorite(favorite: string | mongo.ObjectID | IFavorite) {
let f: IFavorite;
// Populate
if (isObjectId(favorite)) {
f = await Favorite.findOne({
_id: favorite
});
} else if (typeof favorite === 'string') {
f = await Favorite.findOne({
_id: new mongo.ObjectID(favorite)
});
} else {
f = favorite as IFavorite;
}
if (f == null) return;
// このFavoriteを削除
await Favorite.remove({
_id: f._id
});
}
export const packMany = async ( export const packMany = async (
favorites: any[], favorites: any[],
me: any me: any

View File

@ -5,6 +5,8 @@ import isObjectId from '../misc/is-objectid';
import { pack as packUser } from './user'; import { pack as packUser } from './user';
const FollowRequest = db.get<IFollowRequest>('followRequests'); const FollowRequest = db.get<IFollowRequest>('followRequests');
FollowRequest.createIndex('followerId');
FollowRequest.createIndex('followeeId');
FollowRequest.createIndex(['followerId', 'followeeId'], { unique: true }); FollowRequest.createIndex(['followerId', 'followeeId'], { unique: true });
export default FollowRequest; export default FollowRequest;
@ -28,33 +30,6 @@ export type IFollowRequest = {
} }
}; };
/**
* FollowRequestを物理削除します
*/
export async function deleteFollowRequest(followRequest: string | mongo.ObjectID | IFollowRequest) {
let f: IFollowRequest;
// Populate
if (isObjectId(followRequest)) {
f = await FollowRequest.findOne({
_id: followRequest
});
} else if (typeof followRequest === 'string') {
f = await FollowRequest.findOne({
_id: new mongo.ObjectID(followRequest)
});
} else {
f = followRequest as IFollowRequest;
}
if (f == null) return;
// このFollowingを削除
await FollowRequest.remove({
_id: f._id
});
}
/** /**
* Pack a request for API response * Pack a request for API response
*/ */

View File

@ -1,8 +1,9 @@
import * as mongo from 'mongodb'; import * as mongo from 'mongodb';
import db from '../db/mongodb'; import db from '../db/mongodb';
import isObjectId from '../misc/is-objectid';
const Following = db.get<IFollowing>('following'); const Following = db.get<IFollowing>('following');
Following.createIndex('followerId');
Following.createIndex('followeeId');
Following.createIndex(['followerId', 'followeeId'], { unique: true }); Following.createIndex(['followerId', 'followeeId'], { unique: true });
export default Following; export default Following;
@ -25,30 +26,3 @@ export type IFollowing = {
sharedInbox?: string; sharedInbox?: string;
} }
}; };
/**
* Followingを物理削除します
*/
export async function deleteFollowing(following: string | mongo.ObjectID | IFollowing) {
let f: IFollowing;
// Populate
if (isObjectId(following)) {
f = await Following.findOne({
_id: following
});
} else if (typeof following === 'string') {
f = await Following.findOne({
_id: new mongo.ObjectID(following)
});
} else {
f = following as IFollowing;
}
if (f == null) return;
// このFollowingを削除
await Following.remove({
_id: f._id
});
}

View File

@ -1,6 +1,5 @@
import * as mongo from 'mongodb'; import * as mongo from 'mongodb';
import db from '../db/mongodb'; import db from '../db/mongodb';
import isObjectId from '../misc/is-objectid';
const MessagingHistory = db.get<IMessagingHistory>('messagingHistories'); const MessagingHistory = db.get<IMessagingHistory>('messagingHistories');
export default MessagingHistory; export default MessagingHistory;
@ -12,30 +11,3 @@ export type IMessagingHistory = {
partnerId: mongo.ObjectID; partnerId: mongo.ObjectID;
messageId: mongo.ObjectID; messageId: mongo.ObjectID;
}; };
/**
* MessagingHistoryを物理削除します
*/
export async function deleteMessagingHistory(messagingHistory: string | mongo.ObjectID | IMessagingHistory) {
let m: IMessagingHistory;
// Populate
if (isObjectId(messagingHistory)) {
m = await MessagingHistory.findOne({
_id: messagingHistory
});
} else if (typeof messagingHistory === 'string') {
m = await MessagingHistory.findOne({
_id: new mongo.ObjectID(messagingHistory)
});
} else {
m = messagingHistory as IMessagingHistory;
}
if (m == null) return;
// このMessagingHistoryを削除
await MessagingHistory.remove({
_id: m._id
});
}

View File

@ -4,7 +4,6 @@ import { pack as packUser } from './user';
import { pack as packFile } from './drive-file'; import { pack as packFile } from './drive-file';
import db from '../db/mongodb'; import db from '../db/mongodb';
import isObjectId from '../misc/is-objectid'; import isObjectId from '../misc/is-objectid';
import MessagingHistory, { deleteMessagingHistory } from './messaging-history';
import { length } from 'stringz'; import { length } from 'stringz';
const MessagingMessage = db.get<IMessagingMessage>('messagingMessages'); const MessagingMessage = db.get<IMessagingMessage>('messagingMessages');
@ -24,38 +23,6 @@ export function isValidText(text: string): boolean {
return length(text.trim()) <= 1000 && text.trim() != ''; return length(text.trim()) <= 1000 && text.trim() != '';
} }
/**
* MessagingMessageを物理削除します
*/
export async function deleteMessagingMessage(messagingMessage: string | mongo.ObjectID | IMessagingMessage) {
let m: IMessagingMessage;
// Populate
if (isObjectId(messagingMessage)) {
m = await MessagingMessage.findOne({
_id: messagingMessage
});
} else if (typeof messagingMessage === 'string') {
m = await MessagingMessage.findOne({
_id: new mongo.ObjectID(messagingMessage)
});
} else {
m = messagingMessage as IMessagingMessage;
}
if (m == null) return;
// このMessagingMessageを指すMessagingHistoryをすべて削除
await Promise.all((
await MessagingHistory.find({ messageId: m._id })
).map(x => deleteMessagingHistory(x)));
// このMessagingMessageを削除
await MessagingMessage.remove({
_id: m._id
});
}
/** /**
* Pack a messaging message for API response * Pack a messaging message for API response
*/ */

View File

@ -1,6 +1,5 @@
import * as mongo from 'mongodb'; import * as mongo from 'mongodb';
import db from '../db/mongodb'; import db from '../db/mongodb';
import isObjectId from '../misc/is-objectid';
const Mute = db.get<IMute>('mute'); const Mute = db.get<IMute>('mute');
Mute.createIndex(['muterId', 'muteeId'], { unique: true }); Mute.createIndex(['muterId', 'muteeId'], { unique: true });
@ -12,30 +11,3 @@ export interface IMute {
muterId: mongo.ObjectID; muterId: mongo.ObjectID;
muteeId: mongo.ObjectID; muteeId: mongo.ObjectID;
} }
/**
* Muteを物理削除します
*/
export async function deleteMute(mute: string | mongo.ObjectID | IMute) {
let m: IMute;
// Populate
if (isObjectId(mute)) {
m = await Mute.findOne({
_id: mute
});
} else if (typeof mute === 'string') {
m = await Mute.findOne({
_id: new mongo.ObjectID(mute)
});
} else {
m = mute as IMute;
}
if (m == null) return;
// このMuteを削除
await Mute.remove({
_id: m._id
});
}

View File

@ -7,6 +7,8 @@ import Reaction from './note-reaction';
import { pack as packUser } from './user'; import { pack as packUser } from './user';
const NoteReaction = db.get<INoteReaction>('noteReactions'); const NoteReaction = db.get<INoteReaction>('noteReactions');
NoteReaction.createIndex('noteId');
NoteReaction.createIndex('userId');
NoteReaction.createIndex(['userId', 'noteId'], { unique: true }); NoteReaction.createIndex(['userId', 'noteId'], { unique: true });
export default NoteReaction; export default NoteReaction;
@ -31,33 +33,6 @@ export const validateReaction = $.str.or([
'pudding' 'pudding'
]); ]);
/**
* NoteReactionを物理削除します
*/
export async function deleteNoteReaction(noteReaction: string | mongo.ObjectID | INoteReaction) {
let n: INoteReaction;
// Populate
if (isObjectId(noteReaction)) {
n = await NoteReaction.findOne({
_id: noteReaction
});
} else if (typeof noteReaction === 'string') {
n = await NoteReaction.findOne({
_id: new mongo.ObjectID(noteReaction)
});
} else {
n = noteReaction as INoteReaction;
}
if (n == null) return;
// このNoteReactionを削除
await NoteReaction.remove({
_id: n._id
});
}
/** /**
* Pack a reaction for API response * Pack a reaction for API response
*/ */

View File

@ -2,6 +2,8 @@ import * as mongo from 'mongodb';
import db from '../db/mongodb'; import db from '../db/mongodb';
const NoteUnread = db.get<INoteUnread>('noteUnreads'); const NoteUnread = db.get<INoteUnread>('noteUnreads');
NoteUnread.createIndex('userId');
NoteUnread.createIndex('noteId');
NoteUnread.createIndex(['userId', 'noteId'], { unique: true }); NoteUnread.createIndex(['userId', 'noteId'], { unique: true });
export default NoteUnread; export default NoteUnread;

View File

@ -1,8 +1,9 @@
import * as mongo from 'mongodb'; import * as mongo from 'mongodb';
import db from '../db/mongodb'; import db from '../db/mongodb';
import isObjectId from '../misc/is-objectid';
const NoteWatching = db.get<INoteWatching>('noteWatching'); const NoteWatching = db.get<INoteWatching>('noteWatching');
NoteWatching.createIndex('userId');
NoteWatching.createIndex('noteId');
NoteWatching.createIndex(['userId', 'noteId'], { unique: true }); NoteWatching.createIndex(['userId', 'noteId'], { unique: true });
export default NoteWatching; export default NoteWatching;
@ -12,30 +13,3 @@ export interface INoteWatching {
userId: mongo.ObjectID; userId: mongo.ObjectID;
noteId: mongo.ObjectID; noteId: mongo.ObjectID;
} }
/**
* NoteWatchingを物理削除します
*/
export async function deleteNoteWatching(noteWatching: string | mongo.ObjectID | INoteWatching) {
let n: INoteWatching;
// Populate
if (isObjectId(noteWatching)) {
n = await NoteWatching.findOne({
_id: noteWatching
});
} else if (typeof noteWatching === 'string') {
n = await NoteWatching.findOne({
_id: new mongo.ObjectID(noteWatching)
});
} else {
n = noteWatching as INoteWatching;
}
if (n == null) return;
// このNoteWatchingを削除
await NoteWatching.remove({
_id: n._id
});
}

View File

@ -6,13 +6,10 @@ import isObjectId from '../misc/is-objectid';
import { length } from 'stringz'; import { length } from 'stringz';
import { IUser, pack as packUser } from './user'; import { IUser, pack as packUser } from './user';
import { pack as packApp } from './app'; import { pack as packApp } from './app';
import PollVote, { deletePollVote } from './poll-vote'; import PollVote from './poll-vote';
import Reaction, { deleteNoteReaction } from './note-reaction'; import Reaction from './note-reaction';
import { packMany as packFileMany, IDriveFile } from './drive-file'; import { packMany as packFileMany, IDriveFile } from './drive-file';
import NoteWatching, { deleteNoteWatching } from './note-watching'; import Favorite from './favorite';
import NoteReaction from './note-reaction';
import Favorite, { deleteFavorite } from './favorite';
import Notification, { deleteNotification } from './notification';
import Following from './following'; import Following from './following';
import config from '../config'; import config from '../config';
@ -22,11 +19,11 @@ Note.createIndex('userId');
Note.createIndex('mentions'); Note.createIndex('mentions');
Note.createIndex('visibleUserIds'); Note.createIndex('visibleUserIds');
Note.createIndex('tagsLower'); Note.createIndex('tagsLower');
Note.createIndex('_user.host');
Note.createIndex('_files._id'); Note.createIndex('_files._id');
Note.createIndex('_files.contentType'); Note.createIndex('_files.contentType');
Note.createIndex({ Note.createIndex({ createdAt: -1 });
createdAt: -1 Note.createIndex({ score: -1 }, { sparse: true });
});
export default Note; export default Note;
export function isValidText(text: string): boolean { export function isValidText(text: string): boolean {
@ -85,8 +82,14 @@ export type INote = {
heading: number; heading: number;
speed: number; speed: number;
}; };
uri: string; uri: string;
/**
* 人気の投稿度合いを表すスコア
*/
score: number;
// 非正規化 // 非正規化
_reply?: { _reply?: {
userId: mongo.ObjectID; userId: mongo.ObjectID;
@ -102,72 +105,6 @@ export type INote = {
_files?: IDriveFile[]; _files?: IDriveFile[];
}; };
/**
* Noteを物理削除します
*/
export async function deleteNote(note: string | mongo.ObjectID | INote) {
let n: INote;
// Populate
if (isObjectId(note)) {
n = await Note.findOne({
_id: note
});
} else if (typeof note === 'string') {
n = await Note.findOne({
_id: new mongo.ObjectID(note)
});
} else {
n = note as INote;
}
console.log(n == null ? `Note: delete skipped ${note}` : `Note: deleting ${n._id}`);
if (n == null) return;
// このNoteへの返信をすべて削除
await Promise.all((
await Note.find({ replyId: n._id })
).map(x => deleteNote(x)));
// このNoteのRenoteをすべて削除
await Promise.all((
await Note.find({ renoteId: n._id })
).map(x => deleteNote(x)));
// この投稿に対するNoteWatchingをすべて削除
await Promise.all((
await NoteWatching.find({ noteId: n._id })
).map(x => deleteNoteWatching(x)));
// この投稿に対するNoteReactionをすべて削除
await Promise.all((
await NoteReaction.find({ noteId: n._id })
).map(x => deleteNoteReaction(x)));
// この投稿に対するPollVoteをすべて削除
await Promise.all((
await PollVote.find({ noteId: n._id })
).map(x => deletePollVote(x)));
// この投稿に対するFavoriteをすべて削除
await Promise.all((
await Favorite.find({ noteId: n._id })
).map(x => deleteFavorite(x)));
// この投稿に対するNotificationをすべて削除
await Promise.all((
await Notification.find({ noteId: n._id })
).map(x => deleteNotification(x)));
// このNoteを削除
await Note.remove({
_id: n._id
});
console.log(`Note: deleted ${n._id}`);
}
export const hideNote = async (packedNote: any, meId: mongo.ObjectID) => { export const hideNote = async (packedNote: any, meId: mongo.ObjectID) => {
let hide = false; let hide = false;
@ -298,6 +235,7 @@ export const pack = async (
delete _note.prev; delete _note.prev;
delete _note.next; delete _note.next;
delete _note.tagsLower; delete _note.tagsLower;
delete _note.score;
delete _note._user; delete _note._user;
delete _note._reply; delete _note._reply;
delete _note._renote; delete _note._renote;

View File

@ -51,33 +51,6 @@ export interface INotification {
isRead: Boolean; isRead: Boolean;
} }
/**
* Notificationを物理削除します
*/
export async function deleteNotification(notification: string | mongo.ObjectID | INotification) {
let n: INotification;
// Populate
if (isObjectId(notification)) {
n = await Notification.findOne({
_id: notification
});
} else if (typeof notification === 'string') {
n = await Notification.findOne({
_id: new mongo.ObjectID(notification)
});
} else {
n = notification as INotification;
}
if (n == null) return;
// このNotificationを削除
await Notification.remove({
_id: n._id
});
}
export const packMany = async ( export const packMany = async (
notifications: any[] notifications: any[]
) => { ) => {

View File

@ -1,6 +1,5 @@
import * as mongo from 'mongodb'; import * as mongo from 'mongodb';
import db from '../db/mongodb'; import db from '../db/mongodb';
import isObjectId from '../misc/is-objectid';
const PollVote = db.get<IPollVote>('pollVotes'); const PollVote = db.get<IPollVote>('pollVotes');
export default PollVote; export default PollVote;
@ -12,30 +11,3 @@ export interface IPollVote {
noteId: mongo.ObjectID; noteId: mongo.ObjectID;
choice: number; choice: number;
} }
/**
* PollVoteを物理削除します
*/
export async function deletePollVote(pollVote: string | mongo.ObjectID | IPollVote) {
let p: IPollVote;
// Populate
if (isObjectId(pollVote)) {
p = await PollVote.findOne({
_id: pollVote
});
} else if (typeof pollVote === 'string') {
p = await PollVote.findOne({
_id: new mongo.ObjectID(pollVote)
});
} else {
p = pollVote as IPollVote;
}
if (p == null) return;
// このPollVoteを削除
await PollVote.remove({
_id: p._id
});
}

View File

@ -1,6 +1,5 @@
import * as mongo from 'mongodb'; import * as mongo from 'mongodb';
import db from '../db/mongodb'; import db from '../db/mongodb';
import isObjectId from '../misc/is-objectid';
const SwSubscription = db.get<ISwSubscription>('swSubscriptions'); const SwSubscription = db.get<ISwSubscription>('swSubscriptions');
export default SwSubscription; export default SwSubscription;
@ -12,30 +11,3 @@ export interface ISwSubscription {
auth: string; auth: string;
publickey: string; publickey: string;
} }
/**
* SwSubscriptionを物理削除します
*/
export async function deleteSwSubscription(swSubscription: string | mongo.ObjectID | ISwSubscription) {
let s: ISwSubscription;
// Populate
if (isObjectId(swSubscription)) {
s = await SwSubscription.findOne({
_id: swSubscription
});
} else if (typeof swSubscription === 'string') {
s = await SwSubscription.findOne({
_id: new mongo.ObjectID(swSubscription)
});
} else {
s = swSubscription as ISwSubscription;
}
if (s == null) return;
// このSwSubscriptionを削除
await SwSubscription.remove({
_id: s._id
});
}

View File

@ -14,33 +14,6 @@ export interface IUserList {
userIds: mongo.ObjectID[]; userIds: mongo.ObjectID[];
} }
/**
* UserListを物理削除します
*/
export async function deleteUserList(userList: string | mongo.ObjectID | IUserList) {
let u: IUserList;
// Populate
if (isObjectId(userList)) {
u = await UserList.findOne({
_id: userList
});
} else if (typeof userList === 'string') {
u = await UserList.findOne({
_id: new mongo.ObjectID(userList)
});
} else {
u = userList as IUserList;
}
if (u == null) return;
// このUserListを削除
await UserList.remove({
_id: u._id
});
}
export const pack = ( export const pack = (
userList: string | mongo.ObjectID | IUserList userList: string | mongo.ObjectID | IUserList
) => new Promise<any>(async (resolve, reject) => { ) => new Promise<any>(async (resolve, reject) => {

View File

@ -1,27 +1,15 @@
import * as mongo from 'mongodb'; import * as mongo from 'mongodb';
const deepcopy = require('deepcopy'); const deepcopy = require('deepcopy');
const sequential = require('promise-sequential');
import rap from '@prezzemolo/rap'; import rap from '@prezzemolo/rap';
import db from '../db/mongodb'; import db from '../db/mongodb';
import isObjectId from '../misc/is-objectid'; import isObjectId from '../misc/is-objectid';
import Note, { packMany as packNoteMany, deleteNote } from './note'; import { packMany as packNoteMany } from './note';
import Following, { deleteFollowing } from './following'; import Following from './following';
import Mute, { deleteMute } from './mute'; import Blocking from './blocking';
import Mute from './mute';
import { getFriendIds } from '../server/api/common/get-friends'; import { getFriendIds } from '../server/api/common/get-friends';
import config from '../config'; import config from '../config';
import AccessToken, { deleteAccessToken } from './access-token'; import FollowRequest from './follow-request';
import NoteWatching, { deleteNoteWatching } from './note-watching';
import Favorite, { deleteFavorite } from './favorite';
import NoteReaction, { deleteNoteReaction } from './note-reaction';
import MessagingMessage, { deleteMessagingMessage } from './messaging-message';
import MessagingHistory, { deleteMessagingHistory } from './messaging-history';
import DriveFile, { deleteDriveFile } from './drive-file';
import DriveFolder, { deleteDriveFolder } from './drive-folder';
import PollVote, { deletePollVote } from './poll-vote';
import SwSubscription, { deleteSwSubscription } from './sw-subscription';
import Notification, { deleteNotification } from './notification';
import UserList, { deleteUserList } from './user-list';
import FollowRequest, { deleteFollowRequest } from './follow-request';
const User = db.get<IUser>('users'); const User = db.get<IUser>('users');
@ -167,151 +155,6 @@ export function isValidBirthday(birthday: string): boolean {
} }
//#endregion //#endregion
/**
* Userを物理削除します
*/
export async function deleteUser(user: string | mongo.ObjectID | IUser) {
let u: IUser;
// Populate
if (isObjectId(user)) {
u = await User.findOne({
_id: user
});
} else if (typeof user === 'string') {
u = await User.findOne({
_id: new mongo.ObjectID(user)
});
} else {
u = user as IUser;
}
console.log(u == null ? `User: delete skipped ${user}` : `User: deleting ${u._id}`);
if (u == null) return;
// このユーザーのAccessTokenをすべて削除
await Promise.all((
await AccessToken.find({ userId: u._id })
).map(x => deleteAccessToken(x)));
// このユーザーのNoteをすべて削除
await sequential((
await Note.find({ userId: u._id })
).map(x => () => deleteNote(x)));
// このユーザーのNoteReactionをすべて削除
await Promise.all((
await NoteReaction.find({ userId: u._id })
).map(x => deleteNoteReaction(x)));
// このユーザーのNoteWatchingをすべて削除
await Promise.all((
await NoteWatching.find({ userId: u._id })
).map(x => deleteNoteWatching(x)));
// このユーザーのPollVoteをすべて削除
await Promise.all((
await PollVote.find({ userId: u._id })
).map(x => deletePollVote(x)));
// このユーザーのFavoriteをすべて削除
await Promise.all((
await Favorite.find({ userId: u._id })
).map(x => deleteFavorite(x)));
// このユーザーのMessageをすべて削除
await Promise.all((
await MessagingMessage.find({ userId: u._id })
).map(x => deleteMessagingMessage(x)));
// このユーザーへのMessageをすべて削除
await Promise.all((
await MessagingMessage.find({ recipientId: u._id })
).map(x => deleteMessagingMessage(x)));
// このユーザーの関わるMessagingHistoryをすべて削除
await Promise.all((
await MessagingHistory.find({ $or: [{ partnerId: u._id }, { userId: u._id }] })
).map(x => deleteMessagingHistory(x)));
// このユーザーのDriveFileをすべて削除
await Promise.all((
await DriveFile.find({ 'metadata.userId': u._id })
).map(x => deleteDriveFile(x)));
// このユーザーのDriveFolderをすべて削除
await Promise.all((
await DriveFolder.find({ userId: u._id })
).map(x => deleteDriveFolder(x)));
// このユーザーのMuteをすべて削除
await Promise.all((
await Mute.find({ muterId: u._id })
).map(x => deleteMute(x)));
// このユーザーへのMuteをすべて削除
await Promise.all((
await Mute.find({ muteeId: u._id })
).map(x => deleteMute(x)));
// このユーザーのFollowingをすべて削除
await Promise.all((
await Following.find({ followerId: u._id })
).map(x => deleteFollowing(x)));
// このユーザーへのFollowingをすべて削除
await Promise.all((
await Following.find({ followeeId: u._id })
).map(x => deleteFollowing(x)));
// このユーザーのFollowRequestをすべて削除
await Promise.all((
await FollowRequest.find({ followerId: u._id })
).map(x => deleteFollowRequest(x)));
// このユーザーへのFollowRequestをすべて削除
await Promise.all((
await FollowRequest.find({ followeeId: u._id })
).map(x => deleteFollowRequest(x)));
// このユーザーのSwSubscriptionをすべて削除
await Promise.all((
await SwSubscription.find({ userId: u._id })
).map(x => deleteSwSubscription(x)));
// このユーザーのNotificationをすべて削除
await Promise.all((
await Notification.find({ notifieeId: u._id })
).map(x => deleteNotification(x)));
// このユーザーが原因となったNotificationをすべて削除
await Promise.all((
await Notification.find({ notifierId: u._id })
).map(x => deleteNotification(x)));
// このユーザーのUserListをすべて削除
await Promise.all((
await UserList.find({ userId: u._id })
).map(x => deleteUserList(x)));
// このユーザーが入っているすべてのUserListからこのユーザーを削除
await Promise.all((
await UserList.find({ userIds: u._id })
).map(x =>
UserList.update({ _id: x._id }, {
$pull: { userIds: u._id }
})
));
// このユーザーを削除
await User.remove({
_id: u._id
});
console.log(`User: deleted ${u._id}`);
}
/** /**
* Pack a user for API response * Pack a user for API response
* *
@ -426,8 +269,8 @@ export const pack = (
delete _user.hasUnreadNotification; delete _user.hasUnreadNotification;
} }
if (meId && !meId.equals(_user.id)) { if (meId && !meId.equals(_user.id) && opts.detail) {
const [following1, following2, followReq1, followReq2, mute] = await Promise.all([ const [following1, following2, followReq1, followReq2, toBlocking, fromBlocked, mute] = await Promise.all([
Following.findOne({ Following.findOne({
followerId: meId, followerId: meId,
followeeId: _user.id followeeId: _user.id
@ -444,6 +287,14 @@ export const pack = (
followerId: _user.id, followerId: _user.id,
followeeId: meId followeeId: meId
}), }),
Blocking.findOne({
blockerId: meId,
blockeeId: _user.id
}),
Blocking.findOne({
blockerId: _user.id,
blockeeId: meId
}),
Mute.findOne({ Mute.findOne({
muterId: meId, muterId: meId,
muteeId: _user.id muteeId: _user.id
@ -460,6 +311,12 @@ export const pack = (
// Whether the user is followed // Whether the user is followed
_user.isFollowed = following2 !== null; _user.isFollowed = following2 !== null;
// Whether the user is blocking
_user.isBlocking = toBlocking !== null;
// Whether the user is blocked
_user.isBlocked = fromBlocked !== null;
// Whether the user is muted // Whether the user is muted
_user.isMuted = mute !== null; _user.isMuted = mute !== null;
} }

View File

@ -0,0 +1,34 @@
import * as mongo from 'mongodb';
import User, { IRemoteUser } from '../../../../models/user';
import config from '../../../../config';
import * as debug from 'debug';
import { IBlock } from '../../type';
import block from '../../../../services/blocking/create';
const log = debug('misskey:activitypub');
export default async (actor: IRemoteUser, activity: IBlock): Promise<void> => {
const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
const uri = activity.id || activity;
log(`Block: ${uri}`);
if (!id.startsWith(config.url + '/')) {
return null;
}
const blockee = await User.findOne({
_id: new mongo.ObjectID(id.split('/').pop())
});
if (blockee === null) {
throw new Error('blockee not found');
}
if (blockee.host != null) {
throw new Error('ブロックしようとしているユーザーはローカルユーザーではありません');
}
block(actor, blockee);
};

View File

@ -10,6 +10,7 @@ import accept from './accept';
import reject from './reject'; import reject from './reject';
import add from './add'; import add from './add';
import remove from './remove'; import remove from './remove';
import block from './block';
const self = async (actor: IRemoteUser, activity: Object): Promise<void> => { const self = async (actor: IRemoteUser, activity: Object): Promise<void> => {
switch (activity.type) { switch (activity.type) {
@ -53,6 +54,10 @@ const self = async (actor: IRemoteUser, activity: Object): Promise<void> => {
await undo(actor, activity); await undo(actor, activity);
break; break;
case 'Block':
await block(actor, activity);
break;
case 'Collection': case 'Collection':
case 'OrderedCollection': case 'OrderedCollection':
// TODO // TODO

View File

@ -0,0 +1,34 @@
import * as mongo from 'mongodb';
import User, { IRemoteUser } from '../../../../models/user';
import config from '../../../../config';
import * as debug from 'debug';
import { IBlock } from '../../type';
import unblock from '../../../../services/blocking/delete';
const log = debug('misskey:activitypub');
export default async (actor: IRemoteUser, activity: IBlock): Promise<void> => {
const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
const uri = activity.id || activity;
log(`UnBlock: ${uri}`);
if (!id.startsWith(config.url + '/')) {
return null;
}
const blockee = await User.findOne({
_id: new mongo.ObjectID(id.split('/').pop())
});
if (blockee === null) {
throw new Error('blockee not found');
}
if (blockee.host != null) {
throw new Error('ブロック解除しようとしているユーザーはローカルユーザーではありません');
}
unblock(actor, blockee);
};

View File

@ -1,8 +1,9 @@
import * as debug from 'debug'; import * as debug from 'debug';
import { IRemoteUser } from '../../../../models/user'; import { IRemoteUser } from '../../../../models/user';
import { IUndo, IFollow } from '../../type'; import { IUndo, IFollow, IBlock } from '../../type';
import unfollow from './follow'; import unfollow from './follow';
import unblock from './block';
import Resolver from '../../resolver'; import Resolver from '../../resolver';
const log = debug('misskey:activitypub'); const log = debug('misskey:activitypub');
@ -31,6 +32,9 @@ export default async (actor: IRemoteUser, activity: IUndo): Promise<void> => {
case 'Follow': case 'Follow':
unfollow(actor, object as IFollow); unfollow(actor, object as IFollow);
break; break;
case 'Block':
unblock(actor, object as IBlock);
break;
} }
return null; return null;

View File

@ -0,0 +1,8 @@
import config from '../../../config';
import { ILocalUser, IRemoteUser } from "../../../models/user";
export default (blocker?: ILocalUser, blockee?: IRemoteUser) => ({
type: 'Block',
actor: `${config.url}/users/${blocker._id}`,
object: blockee.uri
});

View File

@ -108,6 +108,10 @@ export interface IAnnounce extends IActivity {
type: 'Announce'; type: 'Announce';
} }
export interface IBlock extends IActivity {
type: 'Block';
}
export type Object = export type Object =
ICollection | ICollection |
IOrderedCollection | IOrderedCollection |
@ -120,4 +124,5 @@ export type Object =
IAdd | IAdd |
IRemove | IRemove |
ILike | ILike |
IAnnounce; IAnnounce |
IBlock;

View File

@ -8,7 +8,7 @@ export default async (username: string, _host: string, option?: any): Promise<IU
const usernameLower = username.toLowerCase(); const usernameLower = username.toLowerCase();
if (_host == null) { if (_host == null) {
return await User.findOne({ usernameLower }); return await User.findOne({ usernameLower, host: null });
} }
const hostAscii = toASCII(_host).toLowerCase(); const hostAscii = toASCII(_host).toLowerCase();

View File

@ -62,7 +62,15 @@ export default (endpoint: string, user: IUser, app: IApp, data: any, file?: any)
console.warn(`SLOW API CALL DETECTED: ${ep.name} (${time}ms)`); console.warn(`SLOW API CALL DETECTED: ${ep.name} (${time}ms)`);
} }
} catch (e) { } catch (e) {
if (e.name == 'INVALID_PARAM') {
rej({
code: e.name,
param: e.param,
reason: e.message
});
} else {
rej(e); rej(e);
}
return; return;
} }

View File

@ -41,7 +41,7 @@ async function fetchAny(uri: string) {
// URIがこのサーバーを指しているなら、ローカルユーザーIDとしてDBからフェッチ // URIがこのサーバーを指しているなら、ローカルユーザーIDとしてDBからフェッチ
if (uri.startsWith(config.url + '/')) { if (uri.startsWith(config.url + '/')) {
const id = new mongo.ObjectID(uri.split('/').pop()); const id = new mongo.ObjectID(uri.split('/').pop());
const [ user, note ] = await Promise.all([ const [user, note] = await Promise.all([
User.findOne({ _id: id }), User.findOne({ _id: id }),
Note.findOne({ _id: id }) Note.findOne({ _id: id })
]); ]);
@ -52,7 +52,7 @@ async function fetchAny(uri: string) {
// URI(AP Object id)としてDB検索 // URI(AP Object id)としてDB検索
{ {
const [ user, note ] = await Promise.all([ const [user, note] = await Promise.all([
User.findOne({ uri: uri }), User.findOne({ uri: uri }),
Note.findOne({ uri: uri }) Note.findOne({ uri: uri })
]); ]);
@ -68,7 +68,7 @@ async function fetchAny(uri: string) {
// /@user のような正規id以外で取得できるURIが指定されていた場合、ここで初めて正規URIが確定する // /@user のような正規id以外で取得できるURIが指定されていた場合、ここで初めて正規URIが確定する
// これはDBに存在する可能性があるため再度DB検索 // これはDBに存在する可能性があるため再度DB検索
if (uri !== object.id) { if (uri !== object.id) {
const [ user, note ] = await Promise.all([ const [user, note] = await Promise.all([
User.findOne({ uri: object.id }), User.findOne({ uri: object.id }),
Note.findOne({ uri: object.id }) Note.findOne({ uri: object.id })
]); ]);

View File

@ -0,0 +1,75 @@
import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
const ms = require('ms');
import User, { pack, ILocalUser } from '../../../../models/user';
import Blocking from '../../../../models/blocking';
import create from '../../../../services/blocking/create';
import getParams from '../../get-params';
export const meta = {
stability: 'stable',
desc: {
'ja-JP': '指定したユーザーをブロックします。',
'en-US': 'Block a user.'
},
limit: {
duration: ms('1hour'),
max: 100
},
requireCredential: true,
kind: 'following-write',
params: {
userId: $.type(ID).note({
desc: {
'ja-JP': '対象のユーザーのID',
'en-US': 'Target user ID'
}
})
}
};
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
const [ps, psErr] = getParams(meta, params);
if (psErr) return rej(psErr);
const blocker = user;
// 自分自身
if (user._id.equals(ps.userId)) {
return rej('blockee is yourself');
}
// Get blockee
const blockee = await User.findOne({
_id: ps.userId
}, {
fields: {
data: false,
profile: false
}
});
if (blockee === null) {
return rej('user not found');
}
// Check if already blocking
const exist = await Blocking.findOne({
blockerId: blocker._id,
blockeeId: blockee._id
});
if (exist !== null) {
return rej('already blocking');
}
// Create blocking
await create(blocker, blockee);
// Send response
res(await pack(blockee._id, user));
});

View File

@ -0,0 +1,75 @@
import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
const ms = require('ms');
import User, { pack, ILocalUser } from '../../../../models/user';
import Blocking from '../../../../models/blocking';
import deleteBlocking from '../../../../services/blocking/delete';
import getParams from '../../get-params';
export const meta = {
stability: 'stable',
desc: {
'ja-JP': '指定したユーザーのブロックを解除します。',
'en-US': 'Unblock a user.'
},
limit: {
duration: ms('1hour'),
max: 100
},
requireCredential: true,
kind: 'following-write',
params: {
userId: $.type(ID).note({
desc: {
'ja-JP': '対象のユーザーのID',
'en-US': 'Target user ID'
}
})
}
};
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
const [ps, psErr] = getParams(meta, params);
if (psErr) return rej(psErr);
const blocker = user;
// Check if the blockee is yourself
if (user._id.equals(ps.userId)) {
return rej('blockee is yourself');
}
// Get blockee
const blockee = await User.findOne({
_id: ps.userId
}, {
fields: {
data: false,
'profile': false
}
});
if (blockee === null) {
return rej('user not found');
}
// Check not blocking
const exist = await Blocking.findOne({
blockerId: blocker._id,
blockeeId: blockee._id
});
if (exist === null) {
return rej('already not blocking');
}
// Delete blocking
await deleteBlocking(blocker, blockee);
// Send response
res(await pack(blockee._id, user));
});

View File

@ -25,7 +25,7 @@ export const meta = {
export default (params: any) => new Promise(async (res, rej) => { export default (params: any) => new Promise(async (res, rej) => {
const [ps, psErr] = getParams(meta, params); const [ps, psErr] = getParams(meta, params);
if (psErr) throw psErr; if (psErr) return rej(psErr);
const stats = await driveChart.getChart(ps.span as any, ps.limit); const stats = await driveChart.getChart(ps.span as any, ps.limit);

View File

@ -25,7 +25,7 @@ export const meta = {
export default (params: any) => new Promise(async (res, rej) => { export default (params: any) => new Promise(async (res, rej) => {
const [ps, psErr] = getParams(meta, params); const [ps, psErr] = getParams(meta, params);
if (psErr) throw psErr; if (psErr) return rej(psErr);
const stats = await federationChart.getChart(ps.span as any, ps.limit); const stats = await federationChart.getChart(ps.span as any, ps.limit);

View File

@ -31,7 +31,7 @@ export const meta = {
export default (params: any) => new Promise(async (res, rej) => { export default (params: any) => new Promise(async (res, rej) => {
const [ps, psErr] = getParams(meta, params); const [ps, psErr] = getParams(meta, params);
if (psErr) throw psErr; if (psErr) return rej(psErr);
const stats = await hashtagChart.getChart(ps.span as any, ps.limit, ps.tag); const stats = await hashtagChart.getChart(ps.span as any, ps.limit, ps.tag);

View File

@ -25,7 +25,7 @@ export const meta = {
export default (params: any) => new Promise(async (res, rej) => { export default (params: any) => new Promise(async (res, rej) => {
const [ps, psErr] = getParams(meta, params); const [ps, psErr] = getParams(meta, params);
if (psErr) throw psErr; if (psErr) return rej(psErr);
const stats = await networkChart.getChart(ps.span as any, ps.limit); const stats = await networkChart.getChart(ps.span as any, ps.limit);

View File

@ -25,7 +25,7 @@ export const meta = {
export default (params: any) => new Promise(async (res, rej) => { export default (params: any) => new Promise(async (res, rej) => {
const [ps, psErr] = getParams(meta, params); const [ps, psErr] = getParams(meta, params);
if (psErr) throw psErr; if (psErr) return rej(psErr);
const stats = await notesChart.getChart(ps.span as any, ps.limit); const stats = await notesChart.getChart(ps.span as any, ps.limit);

View File

@ -33,7 +33,7 @@ export const meta = {
export default (params: any) => new Promise(async (res, rej) => { export default (params: any) => new Promise(async (res, rej) => {
const [ps, psErr] = getParams(meta, params); const [ps, psErr] = getParams(meta, params);
if (psErr) throw psErr; if (psErr) return rej(psErr);
const stats = await perUserDriveChart.getChart(ps.span as any, ps.limit, ps.userId); const stats = await perUserDriveChart.getChart(ps.span as any, ps.limit, ps.userId);

View File

@ -33,7 +33,7 @@ export const meta = {
export default (params: any) => new Promise(async (res, rej) => { export default (params: any) => new Promise(async (res, rej) => {
const [ps, psErr] = getParams(meta, params); const [ps, psErr] = getParams(meta, params);
if (psErr) throw psErr; if (psErr) return rej(psErr);
const stats = await perUserFollowingChart.getChart(ps.span as any, ps.limit, ps.userId); const stats = await perUserFollowingChart.getChart(ps.span as any, ps.limit, ps.userId);

View File

@ -33,7 +33,7 @@ export const meta = {
export default (params: any) => new Promise(async (res, rej) => { export default (params: any) => new Promise(async (res, rej) => {
const [ps, psErr] = getParams(meta, params); const [ps, psErr] = getParams(meta, params);
if (psErr) throw psErr; if (psErr) return rej(psErr);
const stats = await perUserNotesChart.getChart(ps.span as any, ps.limit, ps.userId); const stats = await perUserNotesChart.getChart(ps.span as any, ps.limit, ps.userId);

View File

@ -33,7 +33,7 @@ export const meta = {
export default (params: any) => new Promise(async (res, rej) => { export default (params: any) => new Promise(async (res, rej) => {
const [ps, psErr] = getParams(meta, params); const [ps, psErr] = getParams(meta, params);
if (psErr) throw psErr; if (psErr) return rej(psErr);
const stats = await perUserReactionsChart.getChart(ps.span as any, ps.limit, ps.userId); const stats = await perUserReactionsChart.getChart(ps.span as any, ps.limit, ps.userId);

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