Compare commits

..

133 Commits

Author SHA1 Message Date
syuilo
eead9fad03 10.69.0 2018-12-28 05:16:24 +09:00
syuilo
b498072f9d 🎨 2018-12-28 05:14:04 +09:00
syuilo
cce3e52642 通知の管理を強化
Resolve #3772
2018-12-28 05:06:25 +09:00
syuilo
8c762e7b8e 🎵 2018-12-28 04:36:24 +09:00
syuilo
f0dafa04a5 🎨 2018-12-28 04:30:37 +09:00
syuilo
81f39b3b36 🎨 2018-12-28 04:28:16 +09:00
syuilo
b162471d3e 🎨 2018-12-28 04:26:32 +09:00
MeiMei
1029bff5ff Undo reaction with clicking minus (#3773)
* Undo reaction with clicking minus

* fix isMyNote
2018-12-28 01:01:58 +09:00
syuilo
6c1893f869 10.68.0 2018-12-27 23:38:53 +09:00
MeiMei
fdd42fc2d7 user mention (#3771) 2018-12-27 23:14:30 +09:00
Aya Morisawa
8573e258f8 Set cursor default on hover the own reaction
Co-authored-by: syuilo <syuilotan@yahoo.co.jp>
2018-12-27 23:02:32 +09:00
Aya Morisawa
6943c7d2d8 Resolve #3770
Co-authored-by: syuilo <syuilotan@yahoo.co.jp>
2018-12-27 22:54:50 +09:00
Aya Morisawa
19f327701d Fix kao 2018-12-27 21:10:40 +09:00
Aya Morisawa
6b30e371a2 Remove needless code 2018-12-27 21:09:03 +09:00
Aya Morisawa
98fd6de5a1 Resolve #3524 2018-12-27 21:07:44 +09:00
Aya Morisawa
0f5c737c1a Use double quotation 2018-12-27 21:00:08 +09:00
Aya Morisawa
cb9960b0ac Fix i18n: is-suspended
Co-authored-by: syuilo <syuilotan@yahoo.co.jp>
2018-12-27 20:59:49 +09:00
Aya Morisawa
1404539895 Resolve #3287, resolve #3107
Co-authored-by: syuilo <syuilotan@yahoo.co.jp>
2018-12-27 20:46:23 +09:00
syuilo
2f901da58c [Client] Fix bug 2018-12-27 20:34:30 +09:00
syuilo
cb8663873d Rename: 404 --> not-found 2018-12-27 20:22:54 +09:00
Aya Morisawa
0f204eebe1 Remove unused code 2018-12-27 20:10:29 +09:00
Aya Morisawa
ba05606074 Show on the CW button that there is a poll (#3769) 2018-12-27 19:58:57 +09:00
dependabot[bot]
4587c5a512 Update @fortawesome/free-solid-svg-icons requirement from 5.6.1 to 5.6.3 (#3754)
Updates the requirements on [@fortawesome/free-solid-svg-icons](https://github.com/FortAwesome/Font-Awesome) to permit the latest version.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/master/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/commits/5.6.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-27 18:50:19 +09:00
dependabot[bot]
96646e584b Update vue-svg-inline-loader requirement from 1.2.4 to 1.2.7 (#3764)
Updates the requirements on [vue-svg-inline-loader](https://github.com/oliverfindl/vue-svg-inline-loader) to permit the latest version.
- [Release notes](https://github.com/oliverfindl/vue-svg-inline-loader/releases)
- [Commits](https://github.com/oliverfindl/vue-svg-inline-loader/commits/v1.2.7)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-27 18:50:01 +09:00
dependabot[bot]
fb2879df9c Update @types/js-yaml requirement from 3.11.2 to 3.11.4 (#3763)
Updates the requirements on [@types/js-yaml](https://github.com/DefinitelyTyped/DefinitelyTyped) to permit the latest version.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-27 18:49:51 +09:00
dependabot[bot]
26ea338e8e Update vue-js-modal requirement from 1.3.27 to 1.3.28 (#3766)
Updates the requirements on [vue-js-modal](https://github.com/euvl/vue-js-modal) to permit the latest version.
- [Release notes](https://github.com/euvl/vue-js-modal/releases)
- [Commits](https://github.com/euvl/vue-js-modal/commits/1.3.28)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-27 18:49:44 +09:00
dependabot[bot]
1fad5ed6f3 Update nan requirement from 2.11.1 to 2.12.1 (#3767)
Updates the requirements on [nan](https://github.com/nodejs/nan) to permit the latest version.
- [Release notes](https://github.com/nodejs/nan/releases)
- [Changelog](https://github.com/nodejs/nan/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodejs/nan/commits/v2.12.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-27 18:49:33 +09:00
syuilo
35273e53bc 10.67.0 2018-12-27 07:49:48 +09:00
syuilo
bfc458e935 Resolve #3758 2018-12-27 07:07:26 +09:00
dependabot[bot]
bb819d42f1 Update mongodb requirement from 3.1.9 to 3.1.10 (#3762)
Updates the requirements on [mongodb](https://github.com/mongodb/node-mongodb-native) to permit the latest version.
- [Release notes](https://github.com/mongodb/node-mongodb-native/releases)
- [Changelog](https://github.com/mongodb/node-mongodb-native/blob/master/HISTORY.md)
- [Commits](https://github.com/mongodb/node-mongodb-native/commits/v3.1.10)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-27 05:46:42 +09:00
dependabot[bot]
5d76439224 Update sharp requirement from 0.21.0 to 0.21.1 (#3761)
Updates the requirements on [sharp](https://github.com/lovell/sharp) to permit the latest version.
- [Release notes](https://github.com/lovell/sharp/releases)
- [Changelog](https://github.com/lovell/sharp/blob/master/docs/changelog.md)
- [Commits](https://github.com/lovell/sharp/commits/v0.21.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-27 05:46:00 +09:00
ibrokemypie
3d0b704af8 Add URI parameter to /api/meta (#3748)
* Add URI parameter to /api/meta
closes #3747

* Update fetch-meta.ts

* Update meta.ts
2018-12-27 04:50:35 +09:00
Acid Chicken (硫酸鶏)
05539ffc7b Update README.md [AUTOGEN] (#3743) 2018-12-27 01:33:19 +09:00
Aya Morisawa
c86deab69c Introduce SonarTS (#3756) 2018-12-27 01:32:31 +09:00
Aya Morisawa
21f8dbf2de Resolve #3248
Co-authored-by: syuilo <syuilotan@yahoo.co.jp>
2018-12-27 01:26:03 +09:00
MeiMei
5174e16f7b Feature to show only my posts in the user page (#3753)
* Fix #3681

* Feature to show only my posts in the user page
2018-12-26 23:11:50 +09:00
Aya Morisawa
9b746f3eb5 Make reactions removable
Co-authored-by: syuilo <syuilotan@yahoo.co.jp>

Resolve #367, resolve #2260, close #3503
2018-12-26 23:05:47 +09:00
Aya Morisawa
dfc6ef4be6 Remove trailing whitespaces 2018-12-26 19:58:04 +09:00
Aya Morisawa
c8b45f4f42 Fix #3346
Co-authored-by: syuilo <syuilotan@yahoo.co.jp>
2018-12-26 19:39:51 +09:00
Aya Morisawa
09c57e6d03 Fix #3345
Co-authored-by: syuilo <syuilotan@yahoo.co.jp>
2018-12-26 19:24:38 +09:00
dependabot[bot]
5edb1da097 Update gulp-typescript requirement from 4.0.2 to 5.0.0 (#3496)
Updates the requirements on [gulp-typescript](https://github.com/ivogabe/gulp-typescript) to permit the latest version.
- [Release notes](https://github.com/ivogabe/gulp-typescript/releases)
- [Commits](https://github.com/ivogabe/gulp-typescript/commits/v5.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-26 18:34:28 +09:00
dependabot[bot]
b3ad3a6535 Update jsdom requirement from 13.0.0 to 13.1.0 (#3649)
Updates the requirements on [jsdom](https://github.com/jsdom/jsdom) to permit the latest version.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/commits/13.1.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-26 18:33:50 +09:00
dependabot[bot]
3709bb23bc Update systeminformation requirement from 3.51.3 to 3.52.2 (#3669)
Updates the requirements on [systeminformation](https://github.com/sebhildebrandt/systeminformation) to permit the latest version.
- [Release notes](https://github.com/sebhildebrandt/systeminformation/releases)
- [Changelog](https://github.com/sebhildebrandt/systeminformation/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sebhildebrandt/systeminformation/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-26 18:33:42 +09:00
dependabot[bot]
28be5c0b81 Update tslint requirement from 5.10.0 to 5.12.0 (#3670)
Updates the requirements on [tslint](https://github.com/palantir/tslint) to permit the latest version.
- [Release notes](https://github.com/palantir/tslint/releases)
- [Changelog](https://github.com/palantir/tslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/palantir/tslint/commits/5.12.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-26 18:33:34 +09:00
dependabot[bot]
60ef74047a Update @types/file-type requirement from 5.2.2 to 10.6.0 (#3671)
Updates the requirements on [@types/file-type](https://github.com/DefinitelyTyped/DefinitelyTyped) to permit the latest version.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-26 18:33:28 +09:00
dependabot[bot]
f81596c8d5 Update @types/webpack requirement from 4.4.20 to 4.4.21 (#3650)
Updates the requirements on [@types/webpack](https://github.com/DefinitelyTyped/DefinitelyTyped) to permit the latest version.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-26 18:33:20 +09:00
dependabot[bot]
075b7e3060 Update vue-cropperjs requirement from 2.2.2 to 3.0.0 (#3617)
Updates the requirements on [vue-cropperjs](https://github.com/Agontuk/vue-cropperjs) to permit the latest version.
- [Release notes](https://github.com/Agontuk/vue-cropperjs/releases)
- [Changelog](https://github.com/Agontuk/vue-cropperjs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Agontuk/vue-cropperjs/commits/v3.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-26 18:33:08 +09:00
dependabot[bot]
cc7d6198ec Update hard-source-webpack-plugin requirement from 0.12.0 to 0.13.1 (#3611)
Updates the requirements on [hard-source-webpack-plugin](https://github.com/mzgoddard/hard-source-webpack-plugin) to permit the latest version.
- [Release notes](https://github.com/mzgoddard/hard-source-webpack-plugin/releases)
- [Changelog](https://github.com/mzgoddard/hard-source-webpack-plugin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mzgoddard/hard-source-webpack-plugin/commits/v0.13.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-26 18:32:58 +09:00
dependabot[bot]
5766c2ce1b Update @fortawesome/free-solid-svg-icons requirement from 5.5.0 to 5.6.1 (#3610)
Updates the requirements on [@fortawesome/free-solid-svg-icons](https://github.com/FortAwesome/Font-Awesome) to permit the latest version.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/master/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/commits/5.6.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-26 18:32:50 +09:00
dependabot[bot]
03fed08c03 Update @fortawesome/free-brands-svg-icons requirement (#3598)
Updates the requirements on [@fortawesome/free-brands-svg-icons](https://github.com/FortAwesome/Font-Awesome) to permit the latest version.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/master/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/commits/5.6.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-26 18:32:43 +09:00
Acid Chicken (硫酸鶏)
4662641feb Fix #3745 (#3746) 2018-12-26 18:32:16 +09:00
MeiMei
00e2ce9489 Fix #3715 (#3752) 2018-12-26 06:21:09 +09:00
MeiMei
c81eb49f9e Supports emoji in notifications (#3751) 2018-12-26 05:15:02 +09:00
Acid Chicken (硫酸鶏)
fa03c172f2 Fix typo 2018-12-25 20:02:37 +09:00
Acid Chicken (硫酸鶏)
89ac15b4de Fix typo
split は不規則動詞
2018-12-25 16:49:35 +09:00
Acid Chicken (硫酸鶏)
10d3b81251 Fix build fails 2018-12-25 13:39:55 +09:00
syuilo
71dceca225 Merge pull request #3648 from syuilo/l10n_develop
New Crowdin translations
2018-12-25 12:24:26 +09:00
syuilo
40de631d95 New translations ja-JP.yml (English) 2018-12-25 12:22:01 +09:00
ibrokemypie
6985c39874 Make activity view in admin scrollable (#3741)
I can't think of any reason why this isnt currently the case as the extra lines are still there, just not displayed, meaning theres no difference in performance/memory usage
Also means that sometimes entries are cut off which is weird
Also, sometimes there is reason to wish to view older entries that may have scrolled off the page/keep reading something which was pushed too far down.
2018-12-25 12:13:50 +09:00
Aya Morisawa
0938ea3964 Use join instead of reduce 2018-12-24 17:02:15 +09:00
syuilo
4b4c19b242 New translations ja-JP.yml (Korean) 2018-12-24 08:11:46 +09:00
syuilo
7db799a0ac New translations ja-JP.yml (Norwegian) 2018-12-24 01:33:08 +09:00
syuilo
1ab776c867 New translations ja-JP.yml (Dutch) 2018-12-24 01:33:04 +09:00
syuilo
f4c9f63548 New translations ja-JP.yml (Japanese, Kansai) 2018-12-24 01:32:57 +09:00
syuilo
08da9d70cd New translations ja-JP.yml (Spanish) 2018-12-24 01:32:53 +09:00
syuilo
96173e5c0b New translations ja-JP.yml (Russian) 2018-12-24 01:32:48 +09:00
syuilo
b37cc70742 New translations ja-JP.yml (Portuguese) 2018-12-24 01:32:43 +09:00
syuilo
96ee4299c7 New translations ja-JP.yml (Polish) 2018-12-24 01:32:38 +09:00
syuilo
6072b02f12 New translations ja-JP.yml (Korean) 2018-12-24 01:32:33 +09:00
syuilo
6ccbca0741 New translations ja-JP.yml (Italian) 2018-12-24 01:32:29 +09:00
syuilo
360394fd5c New translations ja-JP.yml (German) 2018-12-24 01:32:24 +09:00
syuilo
dcb45aa953 New translations ja-JP.yml (French) 2018-12-24 01:32:20 +09:00
syuilo
a8fcc1aad9 New translations ja-JP.yml (English) 2018-12-24 01:32:15 +09:00
syuilo
4d69cd86f1 New translations ja-JP.yml (Chinese Simplified) 2018-12-24 01:32:11 +09:00
syuilo
6e14e58b89 New translations ja-JP.yml (Catalan) 2018-12-24 01:32:06 +09:00
syuilo
70d2d61b9a New translations ja-JP.yml (French) 2018-12-23 18:11:51 +09:00
syuilo
9abaf80f6b New translations ja-JP.yml (Chinese Simplified) 2018-12-23 17:51:56 +09:00
syuilo
25948fc3c9 New translations ja-JP.yml (Chinese Simplified) 2018-12-23 17:42:42 +09:00
syuilo
747a5694f8 New translations ja-JP.yml (French) 2018-12-22 13:02:00 +09:00
syuilo
479a0a2deb New translations ja-JP.yml (French) 2018-12-22 12:52:26 +09:00
syuilo
14aef6ec89 New translations ja-JP.yml (English) 2018-12-22 01:16:40 +09:00
syuilo
f0d2b3f449 New translations ja-JP.yml (English) 2018-12-22 01:02:28 +09:00
syuilo
abf2c89931 New translations ja-JP.yml (Korean) 2018-12-20 07:51:43 +09:00
syuilo
288bf195e9 New translations ja-JP.yml (English) 2018-12-20 04:22:50 +09:00
syuilo
7e3cc11cc4 New translations ja-JP.yml (Norwegian) 2018-12-20 04:13:09 +09:00
syuilo
4e07e94af0 New translations ja-JP.yml (Dutch) 2018-12-20 04:13:03 +09:00
syuilo
9cb49c9204 New translations ja-JP.yml (Japanese, Kansai) 2018-12-20 04:12:59 +09:00
syuilo
580dd729e5 New translations ja-JP.yml (Spanish) 2018-12-20 04:12:54 +09:00
syuilo
49ab77c86e New translations ja-JP.yml (Russian) 2018-12-20 04:12:49 +09:00
syuilo
f98914b9f1 New translations ja-JP.yml (Portuguese) 2018-12-20 04:12:43 +09:00
syuilo
f3f3599b28 New translations ja-JP.yml (Polish) 2018-12-20 04:12:38 +09:00
syuilo
f67b1beee4 New translations ja-JP.yml (Korean) 2018-12-20 04:12:32 +09:00
syuilo
8395d0f1ba New translations ja-JP.yml (Italian) 2018-12-20 04:12:27 +09:00
syuilo
af203bee93 New translations ja-JP.yml (German) 2018-12-20 04:12:23 +09:00
syuilo
760fb79dad New translations ja-JP.yml (French) 2018-12-20 04:12:18 +09:00
syuilo
ee9d4119c2 New translations ja-JP.yml (English) 2018-12-20 04:12:13 +09:00
syuilo
90027efcbf New translations ja-JP.yml (Chinese Simplified) 2018-12-20 04:12:07 +09:00
syuilo
1848de1dc4 New translations ja-JP.yml (Catalan) 2018-12-20 04:11:58 +09:00
syuilo
ba407c3eb0 New translations ja-JP.yml (French) 2018-12-20 01:03:08 +09:00
syuilo
014edce1b9 New translations ja-JP.yml (Korean) 2018-12-19 08:52:01 +09:00
syuilo
ac1f3de4c6 New translations ja-JP.yml (Norwegian) 2018-12-19 07:33:01 +09:00
syuilo
dced228cb0 New translations ja-JP.yml (Dutch) 2018-12-19 07:32:55 +09:00
syuilo
a92244cc12 New translations ja-JP.yml (Japanese, Kansai) 2018-12-19 07:32:50 +09:00
syuilo
0717688933 New translations ja-JP.yml (Spanish) 2018-12-19 07:32:43 +09:00
syuilo
87d54b7d40 New translations ja-JP.yml (Russian) 2018-12-19 07:32:36 +09:00
syuilo
ed51f5c7de New translations ja-JP.yml (Portuguese) 2018-12-19 07:32:31 +09:00
syuilo
66e2db0d52 New translations ja-JP.yml (Polish) 2018-12-19 07:32:26 +09:00
syuilo
03be4826df New translations ja-JP.yml (Korean) 2018-12-19 07:32:22 +09:00
syuilo
c9d5aef04f New translations ja-JP.yml (Italian) 2018-12-19 07:32:18 +09:00
syuilo
106cb3fe3e New translations ja-JP.yml (German) 2018-12-19 07:32:12 +09:00
syuilo
48320f8536 New translations ja-JP.yml (French) 2018-12-19 07:32:08 +09:00
syuilo
1a0845dc0a New translations ja-JP.yml (English) 2018-12-19 07:32:04 +09:00
syuilo
185d09f3ed New translations ja-JP.yml (Chinese Simplified) 2018-12-19 07:32:00 +09:00
syuilo
8e25fb6cb7 New translations ja-JP.yml (Catalan) 2018-12-19 07:31:55 +09:00
syuilo
936bb1bcd0 New translations ja-JP.yml (Norwegian) 2018-12-19 01:04:21 +09:00
syuilo
d5241d9a3e New translations ja-JP.yml (Dutch) 2018-12-19 01:04:15 +09:00
syuilo
05b4430c92 New translations ja-JP.yml (Japanese, Kansai) 2018-12-19 01:04:09 +09:00
syuilo
292e911de2 New translations ja-JP.yml (Spanish) 2018-12-19 01:04:04 +09:00
syuilo
1c4ba2c037 New translations ja-JP.yml (Russian) 2018-12-19 01:03:59 +09:00
syuilo
452db13d0c New translations ja-JP.yml (Portuguese) 2018-12-19 01:03:54 +09:00
syuilo
c3f64b395b New translations ja-JP.yml (Polish) 2018-12-19 01:03:49 +09:00
syuilo
3fa6bf93a4 New translations ja-JP.yml (Korean) 2018-12-19 01:03:44 +09:00
syuilo
a13d76bec5 New translations ja-JP.yml (Italian) 2018-12-19 01:03:39 +09:00
syuilo
05cee078d0 New translations ja-JP.yml (German) 2018-12-19 01:03:33 +09:00
syuilo
706d3f3f95 New translations ja-JP.yml (French) 2018-12-19 01:03:27 +09:00
syuilo
c5cf034b5d New translations ja-JP.yml (English) 2018-12-19 01:03:22 +09:00
syuilo
3a04aa93f9 New translations ja-JP.yml (Chinese Simplified) 2018-12-19 01:03:16 +09:00
syuilo
838cdbedbd New translations ja-JP.yml (Catalan) 2018-12-19 01:03:09 +09:00
syuilo
5229bbd55d New translations ja-JP.yml (Korean) 2018-12-18 07:55:13 +09:00
syuilo
28311b9a2b New translations ja-JP.yml (French) 2018-12-17 23:02:47 +09:00
syuilo
663d17a485 New translations ja-JP.yml (French) 2018-12-17 22:54:39 +09:00
syuilo
08d005dfd9 New translations ja-JP.yml (French) 2018-12-17 22:44:05 +09:00
syuilo
02edbc131b New translations ja-JP.yml (French) 2018-12-17 22:33:42 +09:00
83 changed files with 931 additions and 308 deletions

View File

@@ -1,6 +1,31 @@
ChangeLog
=========
10.69.0
-------
* 通知の管理を強化
* ユーザビリティの強化
* デザインの調整
10.68.0
-------
* 特定ユーザーにメンション付きで新規投稿ができるボタンを追加
* 自分の投稿にリアクションできないように
* 数式に文法エラーがあるとき、数式のソースをそのまま表示するように
* CWボタンにアンケートの有無を表記するように
* デスクトップ版で設定を新しいタブで開くように
* モバイル版で検索ができない問題を修正
* i18nの修正
10.67.0
-------
* トークのメッセージを削除できるように
* リアクションを取り消せるように
* Misskey以外のソフトウェアからの「Like」アクティビティをプリンではなく「いいね」として扱うように
* i18nの修正
* バグ修正
* など
10.66.2
-------
* i18nの修正

View File

@@ -80,7 +80,6 @@ Please see [Contribution guide](./CONTRIBUTING.md).
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/3?token-time=2145916800&token-hash=ybYtxfpte1b-rGg6Zecpys2ZdZDtwR_UNJHQjt-3eoU%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/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>
</tr><tr>
<td><a href="https://www.patreon.com/weepjp">weep</a></td>
<td><a href="https://www.patreon.com/user?u=13376668">Arctic</a></td>
@@ -89,36 +88,37 @@ Please see [Contribution guide](./CONTRIBUTING.md).
<td><a href="https://www.patreon.com/Xeltica">Xeltica</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/mydarkstar">mydarkstar</a></td>
</tr></table>
<table><tr>
<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://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/3?token-time=2145916800&token-hash=qsdn0-e6yLaLI6hUX9JAkyTR6a5UdnSp7T1foniBvGQ%3D" alt="YUKIMOCHI"></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/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>
</tr><tr>
<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=13039004">nemu</a></td>
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</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/spinlock">Naoki Hirayama</a></td>
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
</tr></table>
<table><tr>
<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>
</tr><tr>
<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>
</tr></table>
**Last updated:** Sun, 16 Dec 2018 18:32:06 UTC
**Last updated:** Tue, 25 Dec 2018 04:58:06 UTC
<!-- PATREON_END -->
:four_leaf_clover: Copyright

View File

@@ -471,6 +471,13 @@ common/views/components/profile-editor.vue:
email-address: "メールアドレス"
email-verified: "メールアドレスが確認されました"
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
delete: "リストを削除"
remove-user: "このリストから削除"
delete-are-you-sure: "リスト「$1」を削除しますか"
deleted: "削除しました"
common/views/widgets/broadcast.vue:
fetching: "確認中"
no-broadcasts: "お知らせはありません"
@@ -737,6 +744,7 @@ desktop/views/components/settings.vue:
2fa: "二段階認証"
other: "その他"
license: "ライセンス"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
theme: "テーマ"
behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
@@ -1029,6 +1037,12 @@ admin/views/instance.vue:
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
smtp-pass: "SMTPパスワード"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "ServiceWorkerを有効にする"
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
vapid-publickey: "VAPID公開鍵"
vapid-privatekey: "VAPID秘密鍵"
vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
@@ -1068,6 +1082,8 @@ admin/views/drive.vue:
remote: "リモート"
delete: "削除"
deleted: "削除しました"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
admin/views/users.vue:
operation: "操作"
username-or-userid: "ユーザー名またはユーザーID"
@@ -1430,7 +1446,6 @@ mobile/views/pages/settings.vue:
signout: "サインアウト"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue:
follows-you: "フォローされています"

View File

@@ -471,6 +471,13 @@ common/views/components/profile-editor.vue:
email-address: "メールアドレス"
email-verified: "メールアドレスが確認されました"
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
delete: "リストを削除"
remove-user: "このリストから削除"
delete-are-you-sure: "リスト「$1」を削除しますか"
deleted: "削除しました"
common/views/widgets/broadcast.vue:
fetching: "Laden"
no-broadcasts: "Keine Broadcasts"
@@ -737,6 +744,7 @@ desktop/views/components/settings.vue:
2fa: "Zwei-Faktor-Authentifizierung"
other: "Anderes"
license: "Lizenz"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
theme: "テーマ"
behaviour: "Verhalten"
fetch-on-scroll: "Aktualisieren beim scrollen"
@@ -1029,6 +1037,12 @@ admin/views/instance.vue:
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
smtp-pass: "SMTPパスワード"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "ServiceWorkerを有効にする"
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
vapid-publickey: "VAPID公開鍵"
vapid-privatekey: "VAPID秘密鍵"
vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
@@ -1068,6 +1082,8 @@ admin/views/drive.vue:
remote: "リモート"
delete: "削除"
deleted: "削除しました"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
admin/views/users.vue:
operation: "操作"
username-or-userid: "ユーザー名またはユーザーID"
@@ -1430,7 +1446,6 @@ mobile/views/pages/settings.vue:
signout: "サインアウト"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue:
follows-you: "フォローされています"

View File

@@ -8,7 +8,7 @@ common:
about: "Thank you for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within the Fediverse (a universe where various social media platforms are organized), it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?"
intro:
title: "What is Misskey?"
about: "Misskey is a open-source <b>decentralized microblogging service</b>. Sophisticated fully customizable Ui, varieties of reaction for posts, free file storage providing integrated management system and other advancing functions are available. Also, network system called “Fediverse” enables us to communicate with users on other SNSs. Like, if you post something, then your posts will sent not only to Misskey but also mastodon. Just imagine that the planet is sending a microwave to other planet to communication."
about: "Misskey is an open-source <b>decentralized microblogging service</b>. Sophisticated fully customizable UI, varieties of reactions for posts, free file storage providing an integrated management system and other advanced functions are available. In addition, Misskey connects to a network system called the “Fediverse” enables us to communicate with users on other SNSs. For example, when you post something it will be sent not only to Misskey but also Mastodon and Pleroma. Just imagine that the planet is sending a radio transmission to other planet to communicate."
features: "Features"
rich-contents: "Post"
rich-contents-desc: "Just post your idea, hot topics and anything you want to share. You may want to decorate your words, attach your favorite pictures, send files including movies and create a poll - those are the things you can do on Misskey!"
@@ -335,7 +335,7 @@ common/views/components/note-menu.vue:
pin: "Pin to your profile"
unpin: "Unpin"
delete: "Delete"
delete-confirm: "Delete this post?"
delete-confirm: "Are you sure you want to delete this post?"
remote: "Show original note"
common/views/components/poll.vue:
vote-to: "Vote for '{}'"
@@ -471,6 +471,13 @@ common/views/components/profile-editor.vue:
email-address: "Email Address"
email-verified: "Your email has been verified."
email-not-verified: "Email address is not confirmed. Please check your inbox."
common/views/components/user-list-editor.vue:
users: "User"
rename: "Rename list"
delete: "Delete list"
remove-user: "Remove from this list"
delete-are-you-sure: "Delete list \"$1\"?"
deleted: "Deleted successfully"
common/views/widgets/broadcast.vue:
fetching: "Checking"
no-broadcasts: "No announcements"
@@ -737,6 +744,7 @@ desktop/views/components/settings.vue:
2fa: "Two-factor authentication"
other: "Other"
license: "License"
mark-as-read-all-unread-notes: "Mark all posts as read"
theme: "Theme"
behaviour: "Behavior"
fetch-on-scroll: "Endless loading on scroll"
@@ -805,7 +813,6 @@ desktop/views/components/settings.vue:
update-settings: "Advanced settings"
prevent-update: "Postpone updates (not recommended)"
prevent-update-desc: "Even if you turn this setting on, updates may apply. This setting is enabled only for this device."
mark-as-read-all-unread-notes: "Mark all posts as read"
no-updates: "No updates available"
no-updates-desc: "Your Misskey is up to date."
update-available: "A new version is available"
@@ -1015,7 +1022,7 @@ admin/views/instance.vue:
save: "Save"
saved: "Saved"
user-recommendation-config: "Recommended users"
enable-external-user-recommendation: "Enable to external user recommendation"
enable-external-user-recommendation: "Enable external user recommendations"
external-user-recommendation-engine: "Engine"
external-user-recommendation-engine-desc: "Example: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
external-user-recommendation-timeout: "Timeout"
@@ -1030,6 +1037,12 @@ admin/views/instance.vue:
smtp-port: "SMTP Port"
smtp-user: "SMTP User"
smtp-pass: "SMTP Password"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "Enable ServiceWorker"
serviceworker-info: "Must be enabled for push notifications."
vapid-publickey: "VAPID public key"
vapid-privatekey: "VAPID private key"
vapid-info: "If you want to enable ServiceWorker, you need to generate VAPID keys. Unless you have set your global node_modules location elsewhere, you need to run this as root:"
admin/views/charts.vue:
title: "Chart"
per-day: "per Day"
@@ -1058,10 +1071,10 @@ admin/views/charts.vue:
admin/views/drive.vue:
sort:
title: "Sort"
createdAtAsc: "アップロード日時が古い順"
createdAtDesc: "アップロード日時が新しい順"
sizeAsc: "サイズが小さい順"
sizeDesc: "サイズが大きい順"
createdAtAsc: "Age - Oldest First"
createdAtDesc: "Age - Newest First"
sizeAsc: "Size - Smallest First"
sizeDesc: "Size - Largest First"
origin:
title: "Origin"
combined: "Local + Remote"
@@ -1069,6 +1082,8 @@ admin/views/drive.vue:
remote: "Remote"
delete: "Delete"
deleted: "Deleted successfully"
mark-as-sensitive: "Mark as 'sensitive'"
unmark-as-sensitive: "Unmark as 'sensitive'"
admin/views/users.vue:
operation: "Operations"
username-or-userid: "Username or user ID"

View File

@@ -471,6 +471,13 @@ common/views/components/profile-editor.vue:
email-address: "メールアドレス"
email-verified: "メールアドレスが確認されました"
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
delete: "リストを削除"
remove-user: "このリストから削除"
delete-are-you-sure: "リスト「$1」を削除しますか"
deleted: "削除しました"
common/views/widgets/broadcast.vue:
fetching: "Recuperando"
no-broadcasts: "Sin emisión"
@@ -737,6 +744,7 @@ desktop/views/components/settings.vue:
2fa: "Autenticación de Doble-Factor"
other: "Otros"
license: "Licencia"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
theme: "テーマ"
behaviour: "Acciones"
fetch-on-scroll: "Desplazamiento infinito"
@@ -1029,6 +1037,12 @@ admin/views/instance.vue:
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
smtp-pass: "SMTPパスワード"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "ServiceWorkerを有効にする"
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
vapid-publickey: "VAPID公開鍵"
vapid-privatekey: "VAPID秘密鍵"
vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
@@ -1068,6 +1082,8 @@ admin/views/drive.vue:
remote: "リモート"
delete: "削除"
deleted: "削除しました"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
admin/views/users.vue:
operation: "操作"
username-or-userid: "ユーザー名またはユーザーID"
@@ -1430,7 +1446,6 @@ mobile/views/pages/settings.vue:
signout: "サインアウト"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue:
follows-you: "フォローされています"

View File

@@ -18,13 +18,13 @@ common:
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
drive: "Drive"
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんかもしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんかMisskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
outro: "Découvrez vous-même les fonctionnalités de Misskey. Étant donné que Misskey est un réseaux social fédéré, vous pouvez essayer dautres instances afin de trouver vos ami·e·s si la présente instance ne vous correspond pas. Bonne chance et amusez-vous bien!"
outro: "Découvrez vous-même les fonctionnalités de Misskey. Étant donné que Misskey est un réseau social fédéré, vous pouvez essayer dautres instances afin de trouver vos amis si la présente instance ne vous correspond pas. Bonne chance et amusez-vous bien!"
adblock:
detected: "Veuillez désactiver votre bloqueur de publicités"
warning: "<strong>Misskey nutilise pas de publicités</strong>, mais quelques options peuvent être non disponibles ou fonctionneraient mal si un bloqueur de publicités est activé."
application-authorization: "Autorisations de lapplication"
close: "Fermer"
do-not-copy-paste: "Veuillez ne pas entrer ou coller le code ici. Le compte peut être compromis."
do-not-copy-paste: "Veuillez ne pas entrer ou coller le code ici. Le compte pourrait être compromis."
load-more: "Charger plus"
enter-password: "Veuillez entrer le mot de passe"
got-it: "Jai compris !"
@@ -39,18 +39,18 @@ common:
reversi-invited-by: "Invité par {} :"
notified-by: "Notifié par {} :"
reply-from: "Réponse de {} :"
quoted-by: "Cité·e par {} :"
quoted-by: "Cité par {} :"
time:
unknown: "inconnu"
future: "à linstant"
just_now: "à l'instant"
seconds_ago: "Il y a {} seconde·s"
seconds_ago: "Il y a {} seconde(s)"
minutes_ago: "Il y a {} min"
hours_ago: "Il y a {} h"
days_ago: "Il y a {} j"
weeks_ago: "Il y a {} semaines"
months_ago: "Il y a {} mois"
years_ago: "Il y a {} an·s"
years_ago: "Il y a {} an(s)"
month-and-day: "{day}-{month}"
trash: "Corbeille"
drive: "Drive"
@@ -86,10 +86,10 @@ common:
public: "Public"
home: "Principal"
home-desc: "Publier sur le fil principal uniquement"
followers: "Abonné·e·s"
followers-desc: "Publier à vos abonné·e·s uniquement"
followers: "Abonnés"
followers-desc: "Publier à vos abonnés uniquement"
specified: "Direct"
specified-desc: "Publier uniquement aux utilisateurs·rices mentionnés·es"
specified-desc: "Publier uniquement aux utilisateurs mentionnés"
private: "Privé"
local-public: "Local (Public)"
local-home: "Accueil (local uniquement)"
@@ -122,7 +122,7 @@ common:
this-setting-is-this-device-only: "Uniquement sur cet appareil"
use-os-default-emojis: "Utiliser les émojis standards du système"
do-not-use-in-production: 'Il sagit dune version de développement. Ne pas utiliser dans un environnement de production.'
is-remote-user: "Ces informations appartiennent à un·e utilisateur·rice distant·e."
is-remote-user: "Ces informations appartiennent à un utilisateur distant."
is-remote-post: "Ceci est une publication distante."
view-on-remote: " Consulter le profil complet"
renoted-by: "Renoté par {user}"
@@ -155,10 +155,10 @@ common:
version: "Version"
broadcast: "Diffusion"
notifications: "Notifications"
users: "Utilisateur·rice·s"
users: "Utilisateurs recommandés"
polls: "Sondages"
post-form: "Champs de publication"
server: "Info sur le serveur"
server: "Infos sur le serveur"
nav: "Navigation"
tips: "Conseils"
hashtags: "Hashtags"
@@ -201,12 +201,12 @@ common/views/components/games/reversi/reversi.game.vue:
can-put-everywhere: "Peut poser partout"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "Jouer à Reversi avec vos ami·e·s !"
sub-title: "Jouer à Reversi avec vos amis !"
invite: "Inviter"
rule: "Comment jouer ?"
rule-desc: "Reversi est un jeu qui se joue sur un tablier et dans lequel les joueurs placent des pions sur ce dernier, à tour de rôle avec l'adversaire. Le but du jeu est d'avoir plus de pions de sa couleur que l'adversaire à la fin de la partie, celle-ci s'achevant lorsque aucun des deux joueurs ne peut plus jouer de coup légal, généralement lorsque les 64 cases sont occupées."
mode-invite: "Inviter"
mode-invite-desc: "Inviter un·e joueur·se."
mode-invite-desc: "Inviter un joueur."
invitations: "Vous avez reçu une invitation !"
my-games: "Mes jeux"
all-games: "Tous les jeux"
@@ -471,6 +471,13 @@ common/views/components/profile-editor.vue:
email-address: "Adresse de courrier électronique"
email-verified: "Ladresse du courrier électronique a été vérifiée."
email-not-verified: "Adresse de courriel nest pas confirmée. Veuillez vérifier votre boite de réception."
common/views/components/user-list-editor.vue:
users: "Utilisateur"
rename: "Renommer la liste"
delete: "Supprimer la liste"
remove-user: "Retirer de cette liste"
delete-are-you-sure: "Voulez-vous vraiment supprimer la liste « $1 » ?"
deleted: "Supprimé"
common/views/widgets/broadcast.vue:
fetching: "Récupération"
no-broadcasts: "Aucune annonce"
@@ -504,7 +511,7 @@ common/views/widgets/slideshow.vue:
no-image: "Il n'y a aucune image dans ce dossier"
common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line2: "Ouvre la fenêtre de publication en appuyant sur <kbd>p</kbd> ou <kbd>n</kbd>."
tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note"
tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note"
tips-line5: "Vous pouvez téléverser des fichiers sur le Drive en faisant un glisser-déposer"
@@ -737,6 +744,7 @@ desktop/views/components/settings.vue:
2fa: "Vérification en deux étapes"
other: "Autres"
license: "Licence"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
theme: "Thèmes"
behaviour: "Comportement"
fetch-on-scroll: "Chargement lors du défilement"
@@ -988,17 +996,17 @@ admin/views/instance.vue:
recaptcha-site-key: "Clé reCAPTCHA du site"
recaptcha-secret-key: "Clé secrète reCAPTCHA"
twitter-integration-config: "Paramètres de connexion à Twitter"
twitter-integration-info: "コールバックURLは {url} に設定します。"
twitter-integration-info: "L'URL de callback est {url}."
enable-twitter-integration: "Activer la connection à Twitter"
twitter-integration-consumer-key: "Clé du consommateur"
twitter-integration-consumer-secret: "Secret du consommateur"
github-integration-config: "Paramètres dauthentification GitHub"
github-integration-info: "コールバックURLは {url} に設定します。"
github-integration-info: "L'URL de callback est {url}."
enable-github-integration: "Activer lauthentification avec Github"
github-integration-client-id: "ID client"
github-integration-client-secret: "Secret client"
discord-integration-config: "Paramètres dauthentification Discord"
discord-integration-info: "コールバックURLは {url} に設定します。"
discord-integration-info: "L'URL de callback est {url}."
enable-discord-integration: "Activer lauthentification avec Discord"
discord-integration-client-id: "ID client"
discord-integration-client-secret: "Secret client"
@@ -1029,6 +1037,12 @@ admin/views/instance.vue:
smtp-port: "Port SMTP"
smtp-user: "Utilisateur SMTP"
smtp-pass: "Mot de passe SMTP"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "Activer ServiceWorker"
serviceworker-info: "Devrait être activé pour les notifications push."
vapid-publickey: "Clé Publique VAPID"
vapid-privatekey: "Clé privée VAPID"
vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
admin/views/charts.vue:
title: "Graph"
per-day: "par jour"
@@ -1057,8 +1071,8 @@ admin/views/charts.vue:
admin/views/drive.vue:
sort:
title: "Tri"
createdAtAsc: "アップロード日時が古い順"
createdAtDesc: "アップロード日時が新しい順"
createdAtAsc: "Âge - Du plus ancien"
createdAtDesc: "Âge - Du plus récent"
sizeAsc: "Taille - Ascendant"
sizeDesc: "Taille - Volumineux en premier"
origin:
@@ -1068,6 +1082,8 @@ admin/views/drive.vue:
remote: "Distant"
delete: "Supprimer"
deleted: "Supprimé"
mark-as-sensitive: "Marquer comme sensible"
unmark-as-sensitive: "Ne pas marquer comme sensible"
admin/views/users.vue:
operation: "Actions"
username-or-userid: "Nom dutilisateur·rice ou ID utilisateur"
@@ -1430,7 +1446,6 @@ mobile/views/pages/settings.vue:
signout: "Déconnexion"
sound: "Sons"
enable-sounds: "Activer les sons"
mark-as-read-all-unread-notes: "Marquer toutes les publications comme lues"
password: "Mot de Passe"
mobile/views/pages/user.vue:
follows-you: "Vous suit"
@@ -1512,7 +1527,7 @@ docs:
require-credential: "Ce point de communication nécessite une authentification."
require-permission: "Ce point de communication nécessite la permission {permission}."
has-limit: "Il ya un taux limite."
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
duration-limit: "Si vous avez envoyé plus de {max} requêtes en {duration} millisecondes, vous ne serez pas en mesure d'envoyer d'autres requêtes."
min-interval-limit: "Vous ne pourrez pas effectuer une nouvelle requête si {interval} millisecondes ne se sont pas écoulées depuis la dernière demande."
show-src: "Vous pouvez voir le code source ce point de communication."
show-src-link: "Consulter le code sur GitHub"

View File

@@ -471,6 +471,13 @@ common/views/components/profile-editor.vue:
email-address: "メールアドレス"
email-verified: "メールアドレスが確認されました"
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
delete: "リストを削除"
remove-user: "このリストから削除"
delete-are-you-sure: "リスト「$1」を削除しますか"
deleted: "削除しました"
common/views/widgets/broadcast.vue:
fetching: "確認中"
no-broadcasts: "お知らせはありません"
@@ -737,6 +744,7 @@ desktop/views/components/settings.vue:
2fa: "二段階認証"
other: "その他"
license: "ライセンス"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
theme: "テーマ"
behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
@@ -1029,6 +1037,12 @@ admin/views/instance.vue:
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
smtp-pass: "SMTPパスワード"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "ServiceWorkerを有効にする"
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
vapid-publickey: "VAPID公開鍵"
vapid-privatekey: "VAPID秘密鍵"
vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
@@ -1068,6 +1082,8 @@ admin/views/drive.vue:
remote: "リモート"
delete: "削除"
deleted: "削除しました"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
admin/views/users.vue:
operation: "操作"
username-or-userid: "ユーザー名またはユーザーID"
@@ -1430,7 +1446,6 @@ mobile/views/pages/settings.vue:
signout: "サインアウト"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue:
follows-you: "フォローされています"

View File

@@ -130,16 +130,16 @@ common:
this-setting-is-this-device-only: "このデバイスのみ"
use-os-default-emojis: "OS標準の絵文字を使用"
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
user-suspended: "このユーザーは凍結されています。"
is-remote-user: "このユーザー情報はコピーです。"
is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "正確な情報を見る"
renoted-by: "{user}がRenote"
error:
title: '問題が発生しました'
retry: 'やり直す'
title: "問題が発生しました"
retry: "やり直す"
reversi:
drawn: "引き分け"
@@ -324,6 +324,7 @@ common/views/components/cw-button.vue:
show: "もっと見る"
chars: "{count}文字"
files: "{count}ファイル"
poll: "アンケート"
common/views/components/messaging.vue:
search-user: "ユーザーを探す"
@@ -359,6 +360,7 @@ common/views/components/nav.vue:
feedback: "フィードバック"
common/views/components/note-menu.vue:
mention: "メンション"
detail: "詳細"
copy-link: "リンクをコピー"
favorite: "お気に入り"
@@ -443,6 +445,14 @@ common/views/components/stream-indicator.vue:
reconnecting: "再接続中"
connected: "接続完了"
common/views/components/notification-settings.vue:
title: "通知"
mark-as-read-all-notifications: "すべての通知を既読にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
mark-as-read-all-talk-messages: "すべてのトークを既読にする"
auto-watch: "投稿の自動ウォッチ"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
common/views/components/integration-settings.vue:
title: "サービス連携"
connect: "接続する"
@@ -584,11 +594,11 @@ common/views/widgets/tips.vue:
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます"
tips-line23: "まゆかわいいよまゆ"
tips-line23: "かわいいよ"
tips-line24: "Misskeyは2014年にサービスを開始しました"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/404.vue:
common/views/pages/not-found.vue:
page-not-found: "ページが見つかりませんでした"
common/views/pages/follow.vue:
@@ -750,11 +760,13 @@ desktop/views/components/note-detail.vue:
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
undo-reaction: "リアクション解除"
desktop/views/components/note.vue:
reply: "返信"
renote: "Renote"
add-reaction: "リアクション"
undo-reaction: "リアクション解除"
detail: "詳細"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
@@ -838,7 +850,6 @@ desktop/views/components/settings.vue:
2fa: "二段階認証"
other: "その他"
license: "ライセンス"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
theme: "テーマ"
behaviour: "動作"
@@ -900,9 +911,6 @@ desktop/views/components/settings.vue:
cache-cleared: "キャッシュを削除しました"
cache-cleared-desc: "ページを再度読み込みしてください。"
auto-watch: "投稿の自動ウォッチ"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
about: "Misskeyについて"
operator: "このサーバーの運営者"
@@ -960,13 +968,13 @@ common/views/components/api-settings.vue:
token: "Token:"
enter-password: "パスワードを入力してください"
console:
title: 'APIコンソール'
endpoint: 'エンドポイント'
parameter: 'パラメータ'
title: "APIコンソール"
endpoint: "エンドポイント"
parameter: "パラメータ"
credential-info: "「i」パラメータは自動で付与されます。"
send: '送信'
sending: '応答待ち'
response: '結果'
send: "送信"
sending: "応答待ち"
response: "結果"
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
@@ -1364,6 +1372,7 @@ desktop/views/pages/user/user.header.vue:
posts: "投稿"
following: "フォロー"
followers: "フォロワー"
mention: "メンション"
is-bot: "このアカウントはBotです"
years-old: "{age}歳"
year: "年"
@@ -1374,6 +1383,7 @@ desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"
with-media: "メディア"
my-posts: "私の投稿"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue:
@@ -1652,7 +1662,6 @@ mobile/views/pages/user.vue:
overview: "概要"
timeline: "タイムライン"
media: "メディア"
is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
@@ -1714,6 +1723,7 @@ deck/deck.user-column.vue:
posts: "投稿"
following: "フォロー"
followers: "フォロワー"
mention: "メンション"
images: "画像"
activity: "アクティビティ"
timeline: "タイムライン"

View File

@@ -471,6 +471,13 @@ common/views/components/profile-editor.vue:
email-address: "メールアドレス"
email-verified: "このメールアドレスOKや"
email-not-verified: "メールアドレスが確認されとらん。メールボックスもっぺん見てくれへん?"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
delete: "リストを削除"
remove-user: "このリストから削除"
delete-are-you-sure: "リスト「$1」を削除しますか"
deleted: "削除しました"
common/views/widgets/broadcast.vue:
fetching: "見てみるわ…"
no-broadcasts: "お知らせはあらへんで"
@@ -737,6 +744,7 @@ desktop/views/components/settings.vue:
2fa: "二段階認証"
other: "その他"
license: "ライセンス"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
theme: "テーマ"
behaviour: "動き"
fetch-on-scroll: "スクロールしたらもっと見せてや"
@@ -1029,6 +1037,12 @@ admin/views/instance.vue:
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
smtp-pass: "SMTPパスワード"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "ServiceWorkerを有効にする"
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
vapid-publickey: "VAPID公開鍵"
vapid-privatekey: "VAPID秘密鍵"
vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
@@ -1068,6 +1082,8 @@ admin/views/drive.vue:
remote: "リモート"
delete: "削除"
deleted: "削除しました"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
admin/views/users.vue:
operation: "操作"
username-or-userid: "ユーザー名またはユーザーID"
@@ -1430,7 +1446,6 @@ mobile/views/pages/settings.vue:
signout: "さいなら"
sound: "サウンド"
enable-sounds: "サウンド鳴らす"
mark-as-read-all-unread-notes: "全部もう読んだわ"
password: "パスワード"
mobile/views/pages/user.vue:
follows-you: "フォローされとるで"

View File

@@ -354,7 +354,7 @@ common/views/components/reaction-picker.vue:
choose-reaction: "반응 선택"
common/views/components/emoji-picker.vue:
custom-emoji: "커스텀 이모지"
people: ""
people: "사람들"
animals-and-nature: "동물 & 자연"
food-and-drink: "음식 & 음료"
activity: "활동"
@@ -471,6 +471,13 @@ common/views/components/profile-editor.vue:
email-address: "메일 주소"
email-verified: "매일 주소가 확인되었습니다"
email-not-verified: "메일 주소가 확인되지 않았습니다. 받은 편지함을 확인하여 주시기 바랍니다."
common/views/components/user-list-editor.vue:
users: "사용자"
rename: "리스트 이름 바꾸기"
delete: "리스트 삭제"
remove-user: "이 리스트에서 제거"
delete-are-you-sure: "리스트 \"$1\"을 삭제하시겠습니까?"
deleted: "삭제하였습니다"
common/views/widgets/broadcast.vue:
fetching: "확인중"
no-broadcasts: "공지사항이 없습니다"
@@ -737,6 +744,7 @@ desktop/views/components/settings.vue:
2fa: "2단계 인증"
other: "기타"
license: "라이선스"
mark-as-read-all-unread-notes: "모든 글을 읽은 상태로 표시"
theme: "테마"
behaviour: "동작"
fetch-on-scroll: "스크롤하여 자동으로 불러오기"
@@ -1029,6 +1037,12 @@ admin/views/instance.vue:
smtp-port: "SMTP 포트"
smtp-user: "SMTP 사용자"
smtp-pass: "SMTP 비밀번호"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "ServiceWorker 사용"
serviceworker-info: "푸시알림을 수행하려면 사용해야 합니다."
vapid-publickey: "VAPID 공개키"
vapid-privatekey: "VAPID 개인키"
vapid-info: "ServiceWorker를 사용하는 경우 VAPID 키 쌍을 생성해야 합니다. 셸에서 다음과 같이 합니다:"
admin/views/charts.vue:
title: "차트"
per-day: "1일마다"
@@ -1068,6 +1082,8 @@ admin/views/drive.vue:
remote: "리모트"
delete: "삭제"
deleted: "삭제하였습니다"
mark-as-sensitive: "열람주의로 설정"
unmark-as-sensitive: "열람주의 해제"
admin/views/users.vue:
operation: "작업"
username-or-userid: "사용자명 혹은 사용자 ID"
@@ -1430,7 +1446,6 @@ mobile/views/pages/settings.vue:
signout: "로그아웃"
sound: "소리"
enable-sounds: "소리 사용"
mark-as-read-all-unread-notes: "모든 글을 읽은 상태로 표시"
password: "비밀번호"
mobile/views/pages/user.vue:
follows-you: "당신을 팔로우합니다"

View File

@@ -471,6 +471,13 @@ common/views/components/profile-editor.vue:
email-address: "メールアドレス"
email-verified: "メールアドレスが確認されました"
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
delete: "リストを削除"
remove-user: "このリストから削除"
delete-are-you-sure: "リスト「$1」を削除しますか"
deleted: "削除しました"
common/views/widgets/broadcast.vue:
fetching: "Bezig met ophalen"
no-broadcasts: "Geen uitzendingen"
@@ -737,6 +744,7 @@ desktop/views/components/settings.vue:
2fa: "Authenticatie in twee stappen"
other: "Overig"
license: "Licentie"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
theme: "テーマ"
behaviour: "Gedrag"
fetch-on-scroll: "Ophalen bij scrollen"
@@ -1029,6 +1037,12 @@ admin/views/instance.vue:
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
smtp-pass: "SMTPパスワード"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "ServiceWorkerを有効にする"
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
vapid-publickey: "VAPID公開鍵"
vapid-privatekey: "VAPID秘密鍵"
vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
@@ -1068,6 +1082,8 @@ admin/views/drive.vue:
remote: "リモート"
delete: "削除"
deleted: "削除しました"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
admin/views/users.vue:
operation: "操作"
username-or-userid: "ユーザー名またはユーザーID"
@@ -1430,7 +1446,6 @@ mobile/views/pages/settings.vue:
signout: "Uitloggen"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue:
follows-you: "Volgt jou"

View File

@@ -471,6 +471,13 @@ common/views/components/profile-editor.vue:
email-address: "メールアドレス"
email-verified: "メールアドレスが確認されました"
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
delete: "リストを削除"
remove-user: "このリストから削除"
delete-are-you-sure: "リスト「$1」を削除しますか"
deleted: "削除しました"
common/views/widgets/broadcast.vue:
fetching: "Henter"
no-broadcasts: "お知らせはありません"
@@ -737,6 +744,7 @@ desktop/views/components/settings.vue:
2fa: "To-faktor autentisering"
other: "Annet"
license: "Lisens"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
theme: "Utseende"
behaviour: "Oppførsel"
fetch-on-scroll: "スクロールで自動読み込み"
@@ -1029,6 +1037,12 @@ admin/views/instance.vue:
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
smtp-pass: "SMTPパスワード"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "ServiceWorkerを有効にする"
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
vapid-publickey: "VAPID公開鍵"
vapid-privatekey: "VAPID秘密鍵"
vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
@@ -1068,6 +1082,8 @@ admin/views/drive.vue:
remote: "リモート"
delete: "削除"
deleted: "削除しました"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
admin/views/users.vue:
operation: "操作"
username-or-userid: "ユーザー名またはユーザーID"
@@ -1430,7 +1446,6 @@ mobile/views/pages/settings.vue:
signout: "サインアウト"
sound: "Lyder"
enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue:
follows-you: "フォローされています"

View File

@@ -471,6 +471,13 @@ common/views/components/profile-editor.vue:
email-address: "Adres e-mail"
email-verified: "メールアドレスが確認されました"
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
delete: "リストを削除"
remove-user: "このリストから削除"
delete-are-you-sure: "リスト「$1」を削除しますか"
deleted: "削除しました"
common/views/widgets/broadcast.vue:
fetching: "Sprawdzanie"
no-broadcasts: "Brak transmisji"
@@ -737,6 +744,7 @@ desktop/views/components/settings.vue:
2fa: "Uwierzytelnianie dwuetapowe"
other: "Inne"
license: "Licencja"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
theme: "Motyw"
behaviour: "Zachowanie"
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
@@ -1029,6 +1037,12 @@ admin/views/instance.vue:
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
smtp-pass: "SMTPパスワード"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "ServiceWorkerを有効にする"
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
vapid-publickey: "VAPID公開鍵"
vapid-privatekey: "VAPID秘密鍵"
vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
@@ -1068,6 +1082,8 @@ admin/views/drive.vue:
remote: "リモート"
delete: "Usuń"
deleted: "削除しました"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
admin/views/users.vue:
operation: "操作"
username-or-userid: "ユーザー名またはユーザーID"
@@ -1430,7 +1446,6 @@ mobile/views/pages/settings.vue:
signout: "Wyloguj"
sound: "Dźwięk"
enable-sounds: "Włącz dźwięk"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "Hasło"
mobile/views/pages/user.vue:
follows-you: "Śledzi Cię"

View File

@@ -471,6 +471,13 @@ common/views/components/profile-editor.vue:
email-address: "メールアドレス"
email-verified: "メールアドレスが確認されました"
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
delete: "リストを削除"
remove-user: "このリストから削除"
delete-are-you-sure: "リスト「$1」を削除しますか"
deleted: "削除しました"
common/views/widgets/broadcast.vue:
fetching: "確認中"
no-broadcasts: "お知らせはありません"
@@ -737,6 +744,7 @@ desktop/views/components/settings.vue:
2fa: "二段階認証"
other: "その他"
license: "ライセンス"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
theme: "テーマ"
behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
@@ -1029,6 +1037,12 @@ admin/views/instance.vue:
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
smtp-pass: "SMTPパスワード"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "ServiceWorkerを有効にする"
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
vapid-publickey: "VAPID公開鍵"
vapid-privatekey: "VAPID秘密鍵"
vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
@@ -1068,6 +1082,8 @@ admin/views/drive.vue:
remote: "リモート"
delete: "削除"
deleted: "削除しました"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
admin/views/users.vue:
operation: "操作"
username-or-userid: "ユーザー名またはユーザーID"
@@ -1430,7 +1446,6 @@ mobile/views/pages/settings.vue:
signout: "Sair"
sound: "Sons"
enable-sounds: "Ativar sons"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue:
follows-you: "Te segue"

View File

@@ -471,6 +471,13 @@ common/views/components/profile-editor.vue:
email-address: "メールアドレス"
email-verified: "メールアドレスが確認されました"
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
delete: "リストを削除"
remove-user: "このリストから削除"
delete-are-you-sure: "リスト「$1」を削除しますか"
deleted: "削除しました"
common/views/widgets/broadcast.vue:
fetching: "確認中"
no-broadcasts: "お知らせはありません"
@@ -737,6 +744,7 @@ desktop/views/components/settings.vue:
2fa: "二段階認証"
other: "その他"
license: "ライセンス"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
theme: "テーマ"
behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
@@ -1029,6 +1037,12 @@ admin/views/instance.vue:
smtp-port: "SMTPポート"
smtp-user: "SMTPユーザー"
smtp-pass: "SMTPパスワード"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "ServiceWorkerを有効にする"
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
vapid-publickey: "VAPID公開鍵"
vapid-privatekey: "VAPID秘密鍵"
vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
@@ -1068,6 +1082,8 @@ admin/views/drive.vue:
remote: "リモート"
delete: "削除"
deleted: "削除しました"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
admin/views/users.vue:
operation: "操作"
username-or-userid: "ユーザー名またはユーザーID"
@@ -1430,7 +1446,6 @@ mobile/views/pages/settings.vue:
signout: "サインアウト"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue:
follows-you: "フォローされています"

View File

@@ -113,7 +113,7 @@ common:
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
verified-user: "认证用户"
disable-animated-mfm: "在帖子中禁用动画文本"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
suggest-recent-hashtags: "在帖子表单上显示最近流行的主题标签"
always-show-nsfw: "总是显示 NSFW 的内容"
always-mark-nsfw: "总是用 NSFW 来标记附件"
show-full-acct: "不要从用户名中忽略主机名"
@@ -164,7 +164,7 @@ common:
hashtags: "标签"
dev: "构建应用程序失败,请再试一次。"
ai-chan-kawaii: "Ai-chan kawaii!"
you: "あなた"
you: ""
auth/views/form.vue:
share-access: "您要允许<i>{name}</i>来访问您的账户吗?"
permission-ask: "这个应用程序需要以下权限:"
@@ -298,7 +298,7 @@ common/views/components/cw-button.vue:
hide: "隐藏"
show: "查看更多"
chars: "{count}文字"
files: "{count}ファイル"
files: "{count} 个文件"
common/views/components/messaging.vue:
search-user: "查找用户"
you: "您"
@@ -405,8 +405,8 @@ common/views/components/stream-indicator.vue:
connected: "已连接"
common/views/components/integration-settings.vue:
title: "サービス連携"
connect: "接続する"
disconnect: "切断する"
connect: "接"
disconnect: "未连接"
connected-to: "次のアカウントに接続されています"
common/views/components/github-setting.vue:
description: "当您用GitHub连接Misskey账户后您将能够看到有关您自己的信息并且您将能够使用GitHub登录。"
@@ -453,7 +453,7 @@ common/views/components/profile-editor.vue:
account: "账户"
location: "位置"
description: "关于我"
language: "言"
language: "言"
birthday: "生日"
avatar: "头像"
banner: "背景"
@@ -471,6 +471,13 @@ common/views/components/profile-editor.vue:
email-address: "电子邮件地址"
email-verified: "电子邮件地址已验证"
email-not-verified: "电子邮件地址还没有验证哦, 请检查一下收信箱吧~"
common/views/components/user-list-editor.vue:
users: "用户"
rename: "重命名列表"
delete: "删除列表"
remove-user: "从此列表中删除"
delete-are-you-sure: "删除列表 \"$1\""
deleted: "已删除"
common/views/widgets/broadcast.vue:
fetching: "确认中"
no-broadcasts: "没有公告"
@@ -524,7 +531,7 @@ common/views/widgets/tips.vue:
tips-line24: "Misskey自2014年开始运营。"
tips-line25: "在与通知功能兼容的浏览器中您可以在Misskey未打开的情况下接收通知"
common/views/pages/404.vue:
page-not-found: "ページが見つかりませんでした"
page-not-found: "您要找的网页不存在。"
common/views/pages/follow.vue:
signed-in-as: "用 {}登录"
following: "正在关注"
@@ -737,6 +744,7 @@ desktop/views/components/settings.vue:
2fa: "两步验证"
other: "其他"
license: "许可证"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
theme: "主题"
behaviour: "行为"
fetch-on-scroll: "向下滚动时自动加载"
@@ -780,7 +788,7 @@ desktop/views/components/settings.vue:
deck-column-width: "デッキのカラムの幅"
deck-column-width-narrow: "狭"
deck-column-width-narrower: "やや狭"
deck-column-width-normal: "普通"
deck-column-width-normal: "正常"
deck-column-width-wider: "やや広"
deck-column-width-wide: "広"
sound: "声音"
@@ -877,16 +885,16 @@ common/views/components/password-settings.vue:
enter-new-password-again: "请再次输入新密码"
not-match: "新密码不匹配"
changed: "密码已更改"
failed: "パスワード変更に失敗しました"
failed: "更改密码失败"
desktop/views/components/sub-note-content.vue:
private: "这个帖子是私密的"
deleted: "帖子已删除"
media-count: "附加{}媒体"
poll: "投票"
desktop/views/components/settings.tags.vue:
title: "タグ"
query: "クエリ (省略可)"
add: "加"
title: "标签"
query: "查询 (可选)"
add: "加"
save: "保存"
desktop/views/components/taskmanager.vue:
title: "任务管理器"
@@ -970,7 +978,7 @@ admin/views/instance.vue:
instance-description: "实例介绍"
host: "主机名"
banner-url: "背景图片地址"
error-image-url: "エラー画像URL"
error-image-url: "无效的图像URL"
languages: "实例语言"
languages-desc: "您可以添加多个,以空格分隔。"
maintainer-config: "管理员信息"
@@ -1029,6 +1037,12 @@ admin/views/instance.vue:
smtp-port: "SMTP 端口"
smtp-user: "SMTP 用户名"
smtp-pass: "SMTP 密码"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "启用ServiceWorker"
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
vapid-publickey: "VAPID公钥"
vapid-privatekey: "VAPID私钥"
vapid-info: "如果您想要启用ServiceWorker那么您需要生成VAPID秘钥。除非您已经在其他地方设置了全局node_modules位置否则您需要将其作为root用户运行"
admin/views/charts.vue:
title: "历史记录"
per-day: "每天"
@@ -1056,18 +1070,20 @@ admin/views/charts.vue:
network-usage: "网络流量"
admin/views/drive.vue:
sort:
title: "ソート"
title: "排序"
createdAtAsc: "アップロード日時が古い順"
createdAtDesc: "アップロード日時が新しい順"
sizeAsc: "サイズが小さい順"
sizeDesc: "サイズが大きい順"
origin:
title: "オリジン"
combined: "ローカル+リモート"
local: "ローカル"
remote: "リモート"
delete: "除"
deleted: "削除しました"
title: "源自"
combined: "本地+远程"
local: "本地"
remote: "远程"
delete: "除"
deleted: "已删除"
mark-as-sensitive: "标记为“敏感”"
unmark-as-sensitive: "取消标记为“敏感”"
admin/views/users.vue:
operation: "操作"
username-or-userid: "用户名或用户ID"
@@ -1430,7 +1446,6 @@ mobile/views/pages/settings.vue:
signout: "注销"
sound: "声音"
enable-sounds: "开启声音"
mark-as-read-all-unread-notes: "将所有帖子标记为已读"
password: "密码"
mobile/views/pages/user.vue:
follows-you: "关注您"

View File

@@ -1,8 +1,8 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "10.66.2",
"clientVersion": "2.0.12873",
"version": "10.69.0",
"clientVersion": "2.0.13006",
"codename": "nighthike",
"main": "./built/index.js",
"private": true,
@@ -21,9 +21,9 @@
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "1.2.8",
"@fortawesome/free-brands-svg-icons": "5.5.0",
"@fortawesome/free-brands-svg-icons": "5.6.0",
"@fortawesome/free-regular-svg-icons": "5.5.0",
"@fortawesome/free-solid-svg-icons": "5.5.0",
"@fortawesome/free-solid-svg-icons": "5.6.3",
"@fortawesome/vue-fontawesome": "0.1.2",
"@koa/cors": "2.2.2",
"@prezzemolo/rap": "0.1.2",
@@ -35,7 +35,7 @@
"@types/deep-equal": "1.0.1",
"@types/double-ended-queue": "2.1.0",
"@types/elasticsearch": "5.0.29",
"@types/file-type": "5.2.2",
"@types/file-type": "10.6.0",
"@types/gulp": "3.8.36",
"@types/gulp-mocha": "0.0.32",
"@types/gulp-rename": "0.0.33",
@@ -44,7 +44,7 @@
"@types/gulp-util": "3.0.34",
"@types/is-root": "1.0.0",
"@types/is-url": "1.2.28",
"@types/js-yaml": "3.11.2",
"@types/js-yaml": "3.11.4",
"@types/katex": "0.5.0",
"@types/koa": "2.0.47",
"@types/koa-bodyparser": "5.0.2",
@@ -82,7 +82,7 @@
"@types/tinycolor2": "1.4.1",
"@types/tmp": "0.0.33",
"@types/uuid": "3.4.4",
"@types/webpack": "4.4.20",
"@types/webpack": "4.4.21",
"@types/webpack-stream": "3.2.10",
"@types/websocket": "0.0.40",
"@types/ws": "6.0.1",
@@ -127,18 +127,18 @@
"gulp-sourcemaps": "2.6.4",
"gulp-stylus": "2.7.0",
"gulp-tslint": "8.1.3",
"gulp-typescript": "4.0.2",
"gulp-typescript": "5.0.0",
"gulp-uglify": "3.0.1",
"gulp-util": "3.0.8",
"gulp-yaml": "2.0.2",
"hard-source-webpack-plugin": "0.12.0",
"hard-source-webpack-plugin": "0.13.1",
"html-minifier": "3.5.21",
"http-signature": "1.2.0",
"insert-text-at-cursor": "0.1.1",
"is-root": "2.0.0",
"is-url": "1.2.4",
"js-yaml": "3.12.0",
"jsdom": "13.0.0",
"jsdom": "13.1.0",
"json5": "2.1.0",
"json5-loader": "1.0.1",
"katex": "0.10.0",
@@ -161,10 +161,10 @@
"mocha": "5.2.0",
"moji": "0.5.1",
"moment": "2.22.2",
"mongodb": "3.1.9",
"mongodb": "3.1.10",
"monk": "6.0.6",
"ms": "2.1.1",
"nan": "2.11.1",
"nan": "2.12.1",
"nested-property": "0.0.7",
"nodemailer": "4.7.0",
"nprogress": "0.2.0",
@@ -193,7 +193,7 @@
"rndstr": "1.0.0",
"s-age": "1.1.2",
"seedrandom": "2.4.4",
"sharp": "0.21.0",
"sharp": "0.21.1",
"showdown": "1.9.0",
"showdown-highlightjs-extension": "0.1.2",
"speakeasy": "2.0.0",
@@ -202,7 +202,7 @@
"stylus": "0.54.5",
"stylus-loader": "3.0.2",
"summaly": "2.2.0",
"systeminformation": "3.51.3",
"systeminformation": "3.52.2",
"syuilo-password-strength": "0.0.1",
"terser-webpack-plugin": "1.1.0",
"textarea-caret": "3.1.0",
@@ -210,7 +210,8 @@
"tmp": "0.0.33",
"ts-loader": "5.3.1",
"ts-node": "7.0.1",
"tslint": "5.10.0",
"tslint": "5.12.0",
"tslint-sonarts": "1.8.0",
"typescript": "3.2.2",
"typescript-eslint-parser": "21.0.2",
"uglify-es": "3.3.9",
@@ -220,15 +221,15 @@
"vue": "2.5.17",
"vue-color": "2.7.0",
"vue-content-loading": "1.5.3",
"vue-cropperjs": "2.2.2",
"vue-cropperjs": "3.0.0",
"vue-i18n": "8.3.2",
"vue-js-modal": "1.3.27",
"vue-js-modal": "1.3.28",
"vue-loader": "15.4.2",
"vue-marquee-text-component": "1.1.0",
"vue-router": "3.0.2",
"vue-sequential-entrance": "1.1.3",
"vue-style-loader": "4.1.2",
"vue-svg-inline-loader": "1.2.4",
"vue-svg-inline-loader": "1.2.7",
"vue-template-compiler": "2.5.17",
"vuedraggable": "2.17.0",
"vuewordcloud": "18.7.11",

View File

@@ -9,7 +9,7 @@ import './style.styl';
import init from '../init';
import Index from './views/index.vue';
import NotFound from '../common/views/pages/404.vue';
import NotFound from '../common/views/pages/not-found.vue';
init(launch => {
document.title = 'Admin';

View File

@@ -69,7 +69,7 @@ export default Vue.extend({
display block
padding 12px 16px 16px 16px
height 250px
overflow hidden
overflow auto
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
background var(--adminDashboardCardBg)
border-radius 8px

View File

@@ -9,7 +9,7 @@ import './style.styl';
import init from '../init';
import Index from './views/index.vue';
import NotFound from '../common/views/pages/404.vue';
import NotFound from '../common/views/pages/not-found.vue';
/**
* init

View File

@@ -1,11 +0,0 @@
/**
* 中央値を求めます
* @param samples サンプル
*/
export default function(samples) {
if (!samples.length) return 0;
const numbers = samples.slice(0).sort((a, b) => a - b);
const middle = Math.floor(numbers.length / 2);
const isEven = numbers.length % 2 === 0;
return isEven ? (numbers[middle] + numbers[middle - 1]) / 2 : numbers[middle];
}

View File

@@ -65,6 +65,10 @@ export default (opts: Opts = {}) => ({
return this.isRenote ? this.note.renote : this.note;
},
isMyNote(): boolean {
return this.$store.getters.isSignedIn && (this.$store.state.i.id === this.appearNote.userId);
},
reactionsCount(): number {
return this.appearNote.reactionCounts
? sum(Object.values(this.appearNote.reactionCounts))
@@ -138,6 +142,14 @@ export default (opts: Opts = {}) => ({
});
},
undoReact(note) {
const oldReaction = note.myReaction;
if (!oldReaction) return;
this.$root.api('notes/reactions/delete', {
noteId: note.id
});
},
favorite() {
this.$root.api('notes/favorites/create', {
noteId: this.appearNote.id

View File

@@ -95,6 +95,7 @@ export default prop => ({
Vue.set(this.$_ns_target.reactionCounts, reaction, 0);
}
// Increment the count
this.$_ns_target.reactionCounts[reaction]++;
if (body.userId == this.$store.state.i.id) {
@@ -103,6 +104,26 @@ export default prop => ({
break;
}
case 'unreacted': {
const reaction = body.reaction;
if (this.$_ns_target.reactionCounts == null) {
return;
}
if (this.$_ns_target.reactionCounts[reaction] == null) {
return;
}
// Decrement the count
if (this.$_ns_target.reactionCounts[reaction] > 0) this.$_ns_target.reactionCounts[reaction]--;
if (body.userId == this.$store.state.i.id) {
Vue.set(this.$_ns_target, 'myReaction', null);
}
break;
}
case 'pollVoted': {
if (body.userId == this.$store.state.i.id) return;
const choice = body.choice;

View File

@@ -1,11 +1,7 @@
<template>
<button class="nrvgflfuaxwgkxoynpnumyookecqrrvh" @click="toggle">
<b>{{ value ? this.$t('hide') : this.$t('show') }}</b>
<span v-if="!value">
<span v-if="note.text">{{ this.$t('chars', { count: length(note.text) }) | number }}</span>
<span v-if="note.text && note.files && note.files.length > 0"> / </span>
<span v-if="note.files && note.files.length > 0">{{ this.$t('files', { count: note.files.length }) }}</span>
</span>
<span v-if="!value">{{ this.label }}</span>
</button>
</template>
@@ -13,6 +9,7 @@
import Vue from 'vue';
import i18n from '../../../i18n';
import { length } from 'stringz';
import { concat } from '../../../../../prelude/array';
export default Vue.extend({
i18n: i18n('common/views/components/cw-button.vue'),
@@ -28,6 +25,16 @@ export default Vue.extend({
}
},
computed: {
label(): string {
return concat([
this.note.text ? [this.$t('chars', { count: length(this.note.text) })] : [],
this.note.files && this.note.files.length !== 0 ? [this.$t('files', { count: this.note.files.length }) ] : [],
this.note.poll != null ? [this.$t('poll')] : []
] as string[][]).join(' / ');
}
},
methods: {
length,

View File

@@ -15,7 +15,9 @@ export default Vue.extend({
},
computed: {
compiledFormula(): any {
return katex.renderToString(this.formula);
return katex.renderToString(this.formula, {
throwOnError: false
} as any);
}
}
});

View File

@@ -3,9 +3,9 @@
<mk-avatar class="avatar" :user="message.user" target="_blank"/>
<div class="content">
<div class="balloon" :data-no-text="message.text == null">
<!-- <button class="delete-button" v-if="isMe" :title="$t('@.delete')">
<img src="/assets/desktop/messaging/delete.png" alt="Delete"/>
</button> -->
<button class="delete-button" v-if="isMe" :title="$t('@.delete')" @click="del">
<img src="/assets/desktop/remove.png" alt="Delete"/>
</button>
<div class="content" v-if="!message.isDeleted">
<misskey-flavored-markdown class="text" v-if="message.text" ref="text" :text="message.text" :i="$store.state.i"/>
<div class="file" v-if="message.file">
@@ -16,7 +16,7 @@
</a>
</div>
</div>
<div class="content" v-if="message.isDeleted">
<div class="content" v-else>
<p class="is-deleted">{{ $t('deleted') }}</p>
</div>
</div>
@@ -58,6 +58,13 @@ export default Vue.extend({
return null;
}
}
},
methods: {
del() {
this.$root.api('messaging/messages/delete', {
messageId: this.message.id
});
}
}
});
</script>

View File

@@ -79,6 +79,7 @@ export default Vue.extend({
this.connection.on('message', this.onMessage);
this.connection.on('read', this.onRead);
this.connection.on('deleted', this.onDeleted);
if (this.isNaked) {
window.addEventListener('scroll', this.onScroll, { passive: true });
@@ -204,6 +205,13 @@ export default Vue.extend({
}
},
onDeleted(id) {
const msg = this.messages.find(m => m.id === id);
if (msg) {
this.messages = this.messages.filter(m => m.id !== msg.id);
}
},
isBottom() {
const asobi = 64;
const current = this.isNaked

View File

@@ -17,6 +17,13 @@ export default Vue.extend({
computed: {
items(): any[] {
return concat(intersperse([null], [
[
[{
icon: 'at',
text: this.$t('mention'),
action: this.mention
}]
],
[
[{
icon: 'info-circle',
@@ -66,6 +73,10 @@ export default Vue.extend({
},
methods: {
mention() {
this.$post({ mention: this.note.user });
},
detail() {
this.$router.push(`/notes/${this.note.id}`);
},

View File

@@ -0,0 +1,44 @@
<template>
<ui-card>
<div slot="title"><fa :icon="['far', 'bell']"/> {{ $t('notification') }}</div>
<section>
<ui-switch v-model="$store.state.i.settings.autoWatch" @change="onChangeAutoWatch">
{{ $t('auto-watch') }}<span slot="desc">{{ $t('auto-watch-desc') }}</span>
</ui-switch>
<section>
<ui-button @click="readAllNotifications">{{ $t('mark-as-read-all-notifications') }}</ui-button>
<ui-button @click="readAllUnreadNotes">{{ $t('mark-as-read-all-unread-notes') }}</ui-button>
<ui-button @click="readAllMessagingMessages">{{ $t('mark-as-read-all-talk-messages') }}</ui-button>
</section>
</section>
</ui-card>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
export default Vue.extend({
i18n: i18n('common/views/components/notification-settings.vue'),
methods: {
onChangeAutoWatch(v) {
this.$root.api('i/update', {
autoWatch: v
});
},
readAllUnreadNotes() {
this.$root.api('i/read_all_unread_notes');
},
readAllMessagingMessages() {
this.$root.api('i/read_all_messaging_messages');
},
readAllNotifications() {
this.$root.api('notifications/mark_all_as_read');
}
}
});
</script>

View File

@@ -1,16 +1,16 @@
<template>
<div class="mk-reactions-viewer">
<div class="mk-reactions-viewer" :class="{ isMe }">
<template v-if="reactions">
<span :class="{ reacted: note.myReaction == 'like' }" @click="react('like')" v-if="reactions.like" v-particle><mk-reaction-icon reaction="like" ref="like"/><span>{{ reactions.like }}</span></span>
<span :class="{ reacted: note.myReaction == 'love' }" @click="react('love')" v-if="reactions.love" v-particle><mk-reaction-icon reaction="love" ref="love"/><span>{{ reactions.love }}</span></span>
<span :class="{ reacted: note.myReaction == 'laugh' }" @click="react('laugh')" v-if="reactions.laugh" v-particle><mk-reaction-icon reaction="laugh" ref="laugh"/><span>{{ reactions.laugh }}</span></span>
<span :class="{ reacted: note.myReaction == 'hmm' }" @click="react('hmm')" v-if="reactions.hmm" v-particle><mk-reaction-icon reaction="hmm" ref="hmm"/><span>{{ reactions.hmm }}</span></span>
<span :class="{ reacted: note.myReaction == 'surprise' }" @click="react('surprise')" v-if="reactions.surprise" v-particle><mk-reaction-icon reaction="surprise" ref="surprise"/><span>{{ reactions.surprise }}</span></span>
<span :class="{ reacted: note.myReaction == 'congrats' }" @click="react('congrats')" v-if="reactions.congrats" v-particle><mk-reaction-icon reaction="congrats" ref="congrats"/><span>{{ reactions.congrats }}</span></span>
<span :class="{ reacted: note.myReaction == 'angry' }" @click="react('angry')" v-if="reactions.angry" v-particle><mk-reaction-icon reaction="angry" ref="angry"/><span>{{ reactions.angry }}</span></span>
<span :class="{ reacted: note.myReaction == 'confused' }" @click="react('confused')" v-if="reactions.confused" v-particle><mk-reaction-icon reaction="confused" ref="confused"/><span>{{ reactions.confused }}</span></span>
<span :class="{ reacted: note.myReaction == 'rip' }" @click="react('rip')" v-if="reactions.rip" v-particle><mk-reaction-icon reaction="rip" ref="rip"/><span>{{ reactions.rip }}</span></span>
<span :class="{ reacted: note.myReaction == 'pudding' }" @click="react('pudding')" v-if="reactions.pudding" v-particle><mk-reaction-icon reaction="pudding" ref="pudding"/><span>{{ reactions.pudding }}</span></span>
<span :class="{ reacted: note.myReaction == 'like' }" @click="toggleReaction('like')" v-if="reactions.like" v-particle="!isMe"><mk-reaction-icon reaction="like" ref="like"/><span>{{ reactions.like }}</span></span>
<span :class="{ reacted: note.myReaction == 'love' }" @click="toggleReaction('love')" v-if="reactions.love" v-particle="!isMe"><mk-reaction-icon reaction="love" ref="love"/><span>{{ reactions.love }}</span></span>
<span :class="{ reacted: note.myReaction == 'laugh' }" @click="toggleReaction('laugh')" v-if="reactions.laugh" v-particle="!isMe"><mk-reaction-icon reaction="laugh" ref="laugh"/><span>{{ reactions.laugh }}</span></span>
<span :class="{ reacted: note.myReaction == 'hmm' }" @click="toggleReaction('hmm')" v-if="reactions.hmm" v-particle="!isMe"><mk-reaction-icon reaction="hmm" ref="hmm"/><span>{{ reactions.hmm }}</span></span>
<span :class="{ reacted: note.myReaction == 'surprise' }" @click="toggleReaction('surprise')" v-if="reactions.surprise" v-particle="!isMe"><mk-reaction-icon reaction="surprise" ref="surprise"/><span>{{ reactions.surprise }}</span></span>
<span :class="{ reacted: note.myReaction == 'congrats' }" @click="toggleReaction('congrats')" v-if="reactions.congrats" v-particle="!isMe"><mk-reaction-icon reaction="congrats" ref="congrats"/><span>{{ reactions.congrats }}</span></span>
<span :class="{ reacted: note.myReaction == 'angry' }" @click="toggleReaction('angry')" v-if="reactions.angry" v-particle="!isMe"><mk-reaction-icon reaction="angry" ref="angry"/><span>{{ reactions.angry }}</span></span>
<span :class="{ reacted: note.myReaction == 'confused' }" @click="toggleReaction('confused')" v-if="reactions.confused" v-particle="!isMe"><mk-reaction-icon reaction="confused" ref="confused"/><span>{{ reactions.confused }}</span></span>
<span :class="{ reacted: note.myReaction == 'rip' }" @click="toggleReaction('rip')" v-if="reactions.rip" v-particle="!isMe"><mk-reaction-icon reaction="rip" ref="rip"/><span>{{ reactions.rip }}</span></span>
<span :class="{ reacted: note.myReaction == 'pudding' }" @click="toggleReaction('pudding')" v-if="reactions.pudding" v-particle="!isMe"><mk-reaction-icon reaction="pudding" ref="pudding"/><span>{{ reactions.pudding }}</span></span>
</template>
</div>
</template>
@@ -21,10 +21,18 @@ import Icon from './reaction-icon.vue';
import * as anime from 'animejs';
export default Vue.extend({
props: ['note'],
props: {
note: {
type: Object,
required: true
}
},
computed: {
reactions(): any {
return this.note.reactionCounts;
},
isMe(): boolean {
return this.$store.getters.isSignedIn && (this.$store.state.i.id === this.note.userId);
}
},
watch: {
@@ -60,11 +68,27 @@ export default Vue.extend({
}
},
methods: {
react(reaction: string) {
this.$root.api('notes/reactions/create', {
noteId: this.note.id,
reaction: reaction
});
toggleReaction(reaction: string) {
if (this.isMe) return;
const oldReaction = this.note.myReaction;
if (oldReaction) {
this.$root.api('notes/reactions/delete', {
noteId: this.note.id
}).then(() => {
if (oldReaction !== reaction) {
this.$root.api('notes/reactions/create', {
noteId: this.note.id,
reaction: reaction
});
}
});
} else {
this.$root.api('notes/reactions/create', {
noteId: this.note.id,
reaction: reaction
});
}
},
anime(reaction: string) {
if (this.$store.state.device.reduceMotion) return;
@@ -114,12 +138,20 @@ export default Vue.extend({
&:empty
display none
&.isMe
> span
cursor default !important
&:hover
background var(--reactionViewerButtonBg) !important
> span
display inline-block
height 32px
margin-right 6px
padding 0 6px
border-radius 4px
cursor pointer
*
user-select none
@@ -132,7 +164,6 @@ export default Vue.extend({
color var(--primaryForeground)
&:not(.reacted)
cursor pointer
background var(--reactionViewerButtonBg)
&:hover

View File

@@ -14,7 +14,7 @@
<header>
<h1>{{ title }}</h1>
</header>
<p>{{ description.length > 85 ? description.slice(0, 85) + '…' : description }}</p>
<p v-if="description">{{ description.length > 85 ? description.slice(0, 85) + '…' : description }}</p>
<footer>
<img class="icon" v-if="icon" :src="icon"/>
<p>{{ sitename }}</p>

View File

@@ -5,6 +5,8 @@ export default {
if (vn.context.$store.state.device.reduceMotion) return;
el.addEventListener('click', () => {
if (binding.value === false) return;
const rect = el.getBoundingClientRect();
const x = rect.left + (el.clientWidth / 2);

View File

@@ -13,7 +13,7 @@ import Vue from 'vue'
import i18n from '../../../i18n';
export default Vue.extend({
i18n: i18n('common/views/pages/404.vue'),
i18n: i18n('common/views/pages/not-found.vue'),
data() {
return {
src: ''

View File

@@ -22,5 +22,5 @@ export default Vue.extend({
> p
margin 0
font-size 12px
color #505050
color var(--text)
</style>

View File

@@ -40,7 +40,7 @@ export default Vue.extend({
> p
margin 0
font-size 12px
color #505050
color var(--text)
&:first-child
font-weight bold

View File

@@ -1,4 +1,4 @@
import { apiUrl } from '../../config';
import { apiUrl, locale } from '../../config';
import CropWindow from '../views/components/crop-window.vue';
import ProgressDialog from '../views/components/progress-dialog.vue';
@@ -9,7 +9,7 @@ export default ($root: any) => {
const regex = RegExp('\.(jpg|jpeg|png|gif|webp|bmp|tiff)$');
if (!regex.test(file.name) ) {
$root.dialog({
title: '%fa:info-circle% %i18n:desktop.invalid-filetype%',
title: locale['desktop']['invalid-filetype'],
text: null
});
return reject('invalid-filetype');
@@ -17,7 +17,7 @@ export default ($root: any) => {
const w = $root.new(CropWindow, {
image: file,
title: '%i18n:desktop.avatar-crop-title%',
title: locale['desktop']['avatar-crop-title'],
aspectRatio: 1 / 1
});
@@ -27,11 +27,11 @@ export default ($root: any) => {
data.append('file', blob, file.name + '.cropped.png');
$root.api('drive/folders/find', {
name: '%i18n:desktop.avatar%'
name: locale['desktop']['avatar']
}).then(avatarFolder => {
if (avatarFolder.length === 0) {
$root.api('drive/folders/create', {
name: '%i18n:desktop.avatar%'
name: locale['desktop']['avatar']
}).then(iconFolder => {
resolve(upload(data, iconFolder));
});
@@ -52,7 +52,7 @@ export default ($root: any) => {
const upload = (data, folder) => new Promise((resolve, reject) => {
const dialog = $root.new(ProgressDialog, {
title: '%i18n:desktop.uploading-avatar%'
title: locale['desktop']['uploading-avatar']
});
document.body.appendChild(dialog.$el);
@@ -88,7 +88,7 @@ export default ($root: any) => {
});
$root.dialog({
title: '%fa:info-circle% %i18n:desktop.avatar-updated%',
title: locale['desktop']['avatar-updated'],
text: null
});
@@ -101,7 +101,7 @@ export default ($root: any) => {
? Promise.resolve(file)
: $root.$chooseDriveFile({
multiple: false,
title: '%fa:image% %i18n:desktop.choose-avatar%'
title: locale['desktop']['choose-avatar']
});
return selectedFile

View File

@@ -1,4 +1,4 @@
import { apiUrl } from '../../config';
import { apiUrl, locale } from '../../config';
import CropWindow from '../views/components/crop-window.vue';
import ProgressDialog from '../views/components/progress-dialog.vue';
@@ -9,7 +9,7 @@ export default ($root: any) => {
const regex = RegExp('\.(jpg|jpeg|png|gif|webp|bmp|tiff)$');
if (!regex.test(file.name) ) {
$root.dialog({
title: '%fa:info-circle% %i18n:desktop.invalid-filetype%',
title: locale['desktop']['invalid-filetype'],
text: null
});
return reject('invalid-filetype');
@@ -17,7 +17,7 @@ export default ($root: any) => {
const w = $root.new(CropWindow, {
image: file,
title: '%i18n:desktop.banner-crop-title%',
title: locale['desktop']['banner-crop-title'],
aspectRatio: 16 / 9
});
@@ -27,11 +27,11 @@ export default ($root: any) => {
data.append('file', blob, file.name + '.cropped.png');
$root.api('drive/folders/find', {
name: '%i18n:desktop.banner%'
name: locale['desktop']['banner']
}).then(bannerFolder => {
if (bannerFolder.length === 0) {
$root.api('drive/folders/create', {
name: '%i18n:desktop.banner%'
name: locale['desktop']['banner']
}).then(iconFolder => {
resolve(upload(data, iconFolder));
});
@@ -52,7 +52,7 @@ export default ($root: any) => {
const upload = (data, folder) => new Promise((resolve, reject) => {
const dialog = $root.new(ProgressDialog, {
title: '%i18n:desktop.uploading-banner%'
title: locale['desktop']['uploading-banner']
});
document.body.appendChild(dialog.$el);
@@ -88,7 +88,7 @@ export default ($root: any) => {
});
$root.dialog({
title: '%fa:info-circle% %i18n:desktop.banner-updated%',
title: locale['desktop']['banner-updated'],
text: null
});
@@ -101,7 +101,7 @@ export default ($root: any) => {
? Promise.resolve(file)
: $root.$chooseDriveFile({
multiple: false,
title: '%fa:image% %i18n:desktop.choose-banner%'
title: locale['desktop']['choose-banner']
});
return selectedFile

View File

@@ -28,7 +28,8 @@ import MkTag from './views/pages/tag.vue';
import MkReversi from './views/pages/games/reversi.vue';
import MkShare from './views/pages/share.vue';
import MkFollow from '../common/views/pages/follow.vue';
import MkNotFound from '../common/views/pages/404.vue';
import MkNotFound from '../common/views/pages/not-found.vue';
import MkSettings from './views/pages/settings.vue';
import Ctx from './views/components/context-menu.vue';
import PostFormWindow from './views/components/post-form-window.vue';
@@ -69,6 +70,7 @@ init(async (launch) => {
} else {
const vm = this.$root.new(PostFormWindow, {
reply: o.reply,
mention: o.mention,
animation: o.animation == null ? true : o.animation
});
if (o.cb) vm.$once('closed', o.cb);
@@ -140,6 +142,7 @@ init(async (launch) => {
{ path: '/i/messaging/:user', component: MkMessagingRoom },
{ path: '/i/drive', component: MkDrive },
{ path: '/i/drive/folder/:folder', component: MkDrive },
{ path: '/i/settings', component: MkSettings },
{ path: '/selectdrive', component: MkSelectDrive },
{ path: '/search', component: MkSearch },
{ path: '/tags/:tag', name: 'tag', component: MkTag },

View File

@@ -70,14 +70,17 @@
<template v-else><fa icon="reply"/></template>
<p class="count" v-if="appearNote.repliesCount > 0">{{ appearNote.repliesCount }}</p>
</button>
<button v-if="['public', 'home'].includes(appearNote.visibility)" class="renoteButton" @click="renote()" :title="$t('renote')">
<fa icon="retweet"/><p class="count" v-if="appearNote.renoteCount > 0">{{ appearNote.renoteCount }}</p>
</button>
<button v-else class="inhibitedButton">
<fa icon="ban"/>
</button>
<button class="reactionButton" :class="{ reacted: appearNote.myReaction != null }" @click="react()" ref="reactButton" :title="$t('add-reaction')">
<fa icon="plus"/><p class="count" v-if="appearNote.reactions_count > 0">{{ appearNote.reactions_count }}</p>
<button v-if="['public', 'home'].includes(appearNote.visibility)" class="renoteButton" @click="renote()" :title="$t('renote')">
<fa icon="retweet"/><p class="count" v-if="appearNote.renoteCount > 0">{{ appearNote.renoteCount }}</p>
</button>
<button v-else class="inhibitedButton">
<fa icon="ban"/>
</button>
<button v-if="!isMyNote && appearNote.myReaction == null" class="reactionButton" @click="react()" ref="reactButton" :title="$t('add-reaction')">
<fa icon="plus"/>
</button>
<button v-if="!isMyNote && appearNote.myReaction != null" class="reactionButton reacted" @click="undoReact(appearNote)" ref="reactButton" :title="$t('undo-reaction')">
<fa icon="minus"/>
</button>
<button @click="menu()" ref="menuButton">
<fa icon="ellipsis-h"/>
@@ -335,7 +338,8 @@ export default Vue.extend({
> .count
display inline
margin 0 0 0 8px
color #999
color var(--text)
opacity 0.7
&.reacted, &.reacted:hover
color var(--noteActionsReactionHover)

View File

@@ -53,8 +53,11 @@
<button v-else class="inhibitedButton">
<fa icon="ban"/>
</button>
<button class="reactionButton" :class="{ reacted: appearNote.myReaction != null }" @click="react()" ref="reactButton" :title="$t('add-reaction')">
<fa icon="plus"/><p class="count" v-if="appearNote.reactions_count > 0">{{ appearNote.reactions_count }}</p>
<button v-if="!isMyNote && appearNote.myReaction == null" class="reactionButton" @click="react()" ref="reactButton" :title="$t('add-reaction')">
<fa icon="plus"/>
</button>
<button v-if="!isMyNote && appearNote.myReaction != null" class="reactionButton reacted" @click="undoReact(appearNote)" ref="reactButton" :title="$t('undo-reaction')">
<fa icon="minus"/>
</button>
<button @click="menu()" ref="menuButton">
<fa icon="ellipsis-h"/>
@@ -300,7 +303,8 @@ export default Vue.extend({
> .count
display inline
margin 0 0 0 8px
color #999
color var(--text)
opacity 0.7
&.reacted, &.reacted:hover
color var(--noteActionsReactionHover)

View File

@@ -23,7 +23,9 @@
</router-link>
</p>
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note) }}<fa icon="quote-right"/>
<fa icon="quote-left"/>
<misskey-flavored-markdown :text="getNoteSummary(notification.note)" :should-break="false" :plain-text="true" :custom-emojis="notification.note.emojis"/>
<fa icon="quote-right"/>
</router-link>
</div>
</template>
@@ -37,7 +39,9 @@
</router-link>
</p>
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note.renote)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note.renote) }}<fa icon="quote-right"/>
<fa icon="quote-left"/>
<misskey-flavored-markdown :text="getNoteSummary(notification.note.renote)" :should-break="false" :plain-text="true" :custom-emojis="notification.note.renote.emojis"/>
<fa icon="quote-right"/>
</router-link>
</div>
</template>
@@ -50,7 +54,9 @@
<mk-user-name :user="notification.note.user"/>
</router-link>
</p>
<router-link class="note-preview" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">{{ getNoteSummary(notification.note) }}</router-link>
<router-link class="note-preview" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
<misskey-flavored-markdown :text="getNoteSummary(notification.note)" :should-break="false" :plain-text="true" :custom-emojis="notification.note.emojis"/>
</router-link>
</div>
</template>
@@ -84,7 +90,9 @@
<mk-user-name :user="notification.note.user"/>
</router-link>
</p>
<router-link class="note-preview" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">{{ getNoteSummary(notification.note) }}</router-link>
<router-link class="note-preview" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
<misskey-flavored-markdown :text="getNoteSummary(notification.note)" :should-break="false" :plain-text="true" :custom-emojis="notification.note.emojis"/>
</router-link>
</div>
</template>
@@ -96,7 +104,9 @@
<mk-user-name :user="notification.note.user"/>
</router-link>
</p>
<a class="note-preview" :href="notification.note | notePage" :title="getNoteSummary(notification.note)">{{ getNoteSummary(notification.note) }}</a>
<a class="note-preview" :href="notification.note | notePage" :title="getNoteSummary(notification.note)">
<misskey-flavored-markdown :text="getNoteSummary(notification.note)" :should-break="false" :plain-text="true" :custom-emojis="notification.note.emojis"/>
</a>
</div>
</template>
@@ -107,7 +117,9 @@
<mk-user-name :user="notification.user"/>
</a></p>
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note) }}<fa icon="quote-right"/>
<fa icon="quote-left"/>
<misskey-flavored-markdown :text="getNoteSummary(notification.note)" :should-break="false" :plain-text="true" :custom-emojis="notification.note.emojis"/>
<fa icon="quote-right"/>
</router-link>
</div>
</template>

View File

@@ -12,6 +12,7 @@
<mk-note-preview v-if="reply" class="notePreview" :note="reply"/>
<mk-post-form ref="form"
:reply="reply"
:mention="mention"
@posted="onPosted"
@change-uploadings="onChangeUploadings"
@change-attached-files="onChangeFiles"
@@ -32,6 +33,10 @@ export default Vue.extend({
type: Object,
required: false
},
mention: {
type: Object,
required: false
},
animation: {
type: Boolean,

View File

@@ -92,6 +92,10 @@ export default Vue.extend({
type: Object,
required: false
},
mention: {
type: Object,
required: false
},
initialText: {
type: String,
required: false
@@ -178,6 +182,11 @@ export default Vue.extend({
this.text = this.initialText;
}
if (this.mention) {
this.text = this.mention.host ? `@${this.mention.username}@${toASCII(this.mention.host)}` : `@${this.mention.username}`;
this.text += ' ';
}
if (this.reply && this.reply.user.host != null) {
this.text = `@${this.reply.user.username}@${toASCII(this.reply.user.host)} `;
}
@@ -215,7 +224,7 @@ export default Vue.extend({
this.$nextTick(() => {
// 書きかけの投稿を復元
if (!this.instant) {
if (!this.instant && !this.mention) {
const draft = JSON.parse(localStorage.getItem('drafts') || '{}')[this.draftId];
if (draft) {
this.text = draft.data.text;

View File

@@ -1,6 +1,6 @@
<template>
<div class="mk-settings">
<div class="nav">
<div class="nav" :class="{ inWindow }">
<p :class="{ active: page == 'profile' }" @mousedown="page = 'profile'"><fa icon="user" fixed-width/>{{ $t('profile') }}</p>
<p :class="{ active: page == 'theme' }" @mousedown="page = 'theme'"><fa icon="palette" fixed-width/>{{ $t('theme') }}</p>
<p :class="{ active: page == 'web' }" @mousedown="page = 'web'"><fa icon="desktop" fixed-width/>Web</p>
@@ -170,17 +170,7 @@
</section>
</ui-card>
<ui-card class="notification" v-show="page == 'notification'">
<div slot="title"><fa :icon="['far', 'bell']"/> {{ $t('notification') }}</div>
<section>
<ui-switch v-model="$store.state.i.settings.autoWatch" @change="onChangeAutoWatch">
{{ $t('auto-watch') }}<span slot="desc">{{ $t('auto-watch-desc') }}</span>
</ui-switch>
<section>
<ui-button @click="readAllUnreadNotes">{{ $t('mark-as-read-all-unread-notes') }}</ui-button>
</section>
</section>
</ui-card>
<x-notification-settings v-show="page == 'notification'"/>
<div class="drive" v-if="page == 'drive'">
<x-drive-settings/>
@@ -289,6 +279,7 @@ import XPasswordSettings from '../../../common/views/components/password-setting
import XProfileEditor from '../../../common/views/components/profile-editor.vue';
import XApiSettings from '../../../common/views/components/api-settings.vue';
import XLanguageSettings from '../../../common/views/components/language-settings.vue';
import XNotificationSettings from '../../../common/views/components/notification-settings.vue';
import { url, clientVersion as version } from '../../../config';
import checkForUpdate from '../../../common/scripts/check-for-update';
@@ -308,11 +299,17 @@ export default Vue.extend({
XProfileEditor,
XApiSettings,
XLanguageSettings,
XNotificationSettings,
},
props: {
initialPage: {
type: String,
required: false
},
inWindow: {
type: Boolean,
required: false,
default: true
}
},
data() {
@@ -526,9 +523,6 @@ export default Vue.extend({
});
},
methods: {
readAllUnreadNotes() {
this.$root.api('i/read_all_unread_notes');
},
customizeHome() {
this.$router.push('/i/customize-home');
this.$emit('done');
@@ -547,11 +541,6 @@ export default Vue.extend({
wallpaperId: null
});
},
onChangeAutoWatch(v) {
this.$root.api('i/update', {
autoWatch: v
});
},
checkForUpdate() {
this.checkingForUpdate = true;
checkForUpdate(this.$root, true, true).then(newer => {
@@ -598,9 +587,11 @@ export default Vue.extend({
height 100%
padding 16px 0 0 0
overflow auto
box-shadow var(--shadowRight)
z-index 1
&.inWindow
box-shadow var(--shadowRight)
> p
display block
padding 10px 16px

View File

@@ -51,12 +51,12 @@
<i><fa icon="angle-right"/></i>
</router-link>
</li>
<li @click="settings">
<p>
<li>
<router-link to="/i/settings">
<i><fa icon="cog"/></i>
<span>{{ $t('settings') }}</span>
<i><fa icon="angle-right"/></i>
</p>
</router-link>
</li>
<li v-if="$store.state.i.isAdmin || $store.state.i.isModerator">
<a href="/admin">
@@ -153,10 +153,6 @@ export default Vue.extend({
this.close();
this.$root.new(MkFollowRequestsWindow);
},
settings() {
this.close();
this.$root.new(MkSettingsWindow);
},
signout() {
this.$root.signout();
},

View File

@@ -11,7 +11,8 @@
<mk-time :time="notification.createdAt"/>
</header>
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note) }}
<fa icon="quote-left"/>
<misskey-flavored-markdown :text="getNoteSummary(notification.note)" :should-break="false" :plain-text="true" :custom-emojis="notification.note.emojis"/>
<fa icon="quote-right"/>
</router-link>
</div>
@@ -28,7 +29,9 @@
<mk-time :time="notification.createdAt"/>
</header>
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note.renote)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note.renote) }}<fa icon="quote-right"/>
<fa icon="quote-left"/>
<misskey-flavored-markdown :text="getNoteSummary(notification.note.renote)" :should-break="false" :plain-text="true" :custom-emojis="notification.note.renote.emojis"/>
<fa icon="quote-right"/>
</router-link>
</div>
</div>
@@ -70,7 +73,9 @@
<mk-time :time="notification.createdAt"/>
</header>
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note) }}<fa icon="quote-right"/>
<fa icon="quote-left"/>
<misskey-flavored-markdown :text="getNoteSummary(notification.note)" :should-break="false" :plain-text="true" :custom-emojis="notification.note.emojis"/>
<fa icon="quote-right"/>
</router-link>
</div>
</div>

View File

@@ -49,6 +49,9 @@
<b>{{ user.followersCount | number }}</b>
<span>{{ $t('followers') }}</span>
</div>
<div class="mention">
<button @click="mention" :title="$t('mention')"><fa icon="at"/></button>
</div>
</div>
</div>
<div class="pinned" v-if="user.pinnedNotes && user.pinnedNotes.length > 0">
@@ -307,6 +310,10 @@ export default Vue.extend({
return promise;
},
mention() {
this.$post({ mention: this.user });
},
menu() {
let menu = [{
icon: 'list',
@@ -454,7 +461,7 @@ export default Vue.extend({
> .counts
display grid
grid-template-columns 1fr 1fr 1fr
grid-template-columns 2fr 2fr 2fr 1fr
margin-top 8px
border-top solid 1px var(--faceDivider)
@@ -471,6 +478,9 @@ export default Vue.extend({
font-size 80%
opacity 0.7
> .mention
display flex
> *
> p.caption
margin 0

View File

@@ -0,0 +1,24 @@
<template>
<mk-ui>
<main>
<x-settings :in-window="false"/>
</main>
</mk-ui>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
components: {
XSettings: () => import('../components/settings.vue').then(m => m.default)
},
});
</script>
<style lang="stylus" scoped>
main
margin 0 auto
max-width 900px
</style>

View File

@@ -36,6 +36,7 @@
<span class="notes-count"><b>{{ user.notesCount | number }}</b>{{ $t('posts') }}</span>
<router-link :to="user | userPage('following')" class="following clickable"><b>{{ user.followingCount | number }}</b>{{ $t('following') }}</router-link>
<router-link :to="user | userPage('followers')" class="followers clickable"><b>{{ user.followersCount | number }}</b>{{ $t('followers') }}</router-link>
<button @click="mention" :title="$t('mention')"><fa icon="at"/></button>
</div>
</div>
</div>
@@ -77,6 +78,9 @@ export default Vue.extend({
}
},
methods: {
mention() {
this.$post({ mention: this.user });
},
onScroll() {
const banner = this.$refs.banner as any;

View File

@@ -4,6 +4,7 @@
<span :data-active="mode == 'default'" @click="mode = 'default'"><fa :icon="['far', 'comment-alt']"/> {{ $t('default') }}</span>
<span :data-active="mode == 'with-replies'" @click="mode = 'with-replies'"><fa icon="comments"/> {{ $t('with-replies') }}</span>
<span :data-active="mode == 'with-media'" @click="mode = 'with-media'"><fa :icon="['far', 'images']"/> {{ $t('with-media') }}</span>
<span :data-active="mode == 'my-posts'" @click="mode = 'my-posts'"><fa icon="user"/> {{ $t('my-posts') }}</span>
</header>
<mk-notes ref="timeline" :more="existMore ? more : null">
<p class="empty" slot="empty"><fa :icon="['far', 'comments']"/>{{ $t('empty') }}</p>
@@ -65,6 +66,7 @@ export default Vue.extend({
limit: fetchLimit + 1,
untilDate: this.date ? this.date.getTime() : new Date().getTime() + 1000 * 86400 * 365,
includeReplies: this.mode == 'with-replies',
includeMyRenotes: this.mode != 'my-posts',
withFiles: this.mode == 'with-media'
}).then(notes => {
if (notes.length == fetchLimit + 1) {
@@ -85,6 +87,7 @@ export default Vue.extend({
userId: this.user.id,
limit: fetchLimit + 1,
includeReplies: this.mode == 'with-replies',
includeMyRenotes: this.mode != 'my-posts',
withFiles: this.mode == 'with-media',
untilDate: new Date((this.$refs.timeline as any).tail().createdAt).getTime()
});

View File

@@ -1,7 +1,7 @@
<template>
<mk-ui>
<div class="xygkxeaeontfaokvqmiblezmhvhostak" v-if="!fetching">
<div class="is-suspended" v-if="user.isSuspended"><fa icon="exclamation-triangle"/> {{ $t('@.is-suspended') }}</div>
<div class="is-suspended" v-if="user.isSuspended"><fa icon="exclamation-triangle"/> {{ $t('@.user-suspended') }}</div>
<div class="is-remote" v-if="user.host != null"><fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}<a :href="user.url || user.uri" target="_blank">{{ $t('@.view-on-remote') }}</a></div>
<main>
<div class="main">

View File

@@ -18,7 +18,7 @@ import Apps from './views/apps.vue';
import AppNew from './views/new-app.vue';
import App from './views/app.vue';
import ui from './views/ui.vue';
import NotFound from '../common/views/pages/404.vue';
import NotFound from '../common/views/pages/not-found.vue';
Vue.use(BootstrapVue);

View File

@@ -14,7 +14,7 @@ import VueHotkey from './common/hotkey';
import App from './app.vue';
import checkForUpdate from './common/scripts/check-for-update';
import MiOS from './mios';
import { clientVersion as version, codename, lang } from './config';
import { clientVersion as version, codename, lang, locale } from './config';
import { builtinThemes, lightTheme, applyTheme } from './theme';
import Dialog from './common/views/components/dialog.vue';
@@ -322,7 +322,7 @@ Vue.mixin({
console.info(`Misskey v${version} (${codename})`);
console.info(
'%c%i18n:common.do-not-copy-paste%',
`%c${locale['common']['do-not-copy-paste']}`,
'color: red; background: yellow; font-size: 16px; font-weight: bold;');
// BootTimer解除

View File

@@ -31,7 +31,7 @@ import MkReversi from './views/pages/games/reversi.vue';
import MkTag from './views/pages/tag.vue';
import MkShare from './views/pages/share.vue';
import MkFollow from '../common/views/pages/follow.vue';
import MkNotFound from '../common/views/pages/404.vue';
import MkNotFound from '../common/views/pages/not-found.vue';
import PostForm from './views/components/post-form-dialog.vue';
import FileChooser from './views/components/drive-file-chooser.vue';
@@ -60,6 +60,7 @@ init((launch) => {
const vm = this.$root.new(PostForm, {
reply: o.reply,
mention: o.mention,
renote: o.renote
});

View File

@@ -72,8 +72,11 @@
<button v-else>
<fa icon="ban"/>
</button>
<button :class="{ reacted: appearNote.myReaction != null }" @click="react()" ref="reactButton" :title="$t('title')">
<fa icon="plus"/><p class="count" v-if="appearNote.reactions_count > 0">{{ appearNote.reactions_count }}</p>
<button v-if="!isMyNote && appearNote.myReaction == null" class="reactionButton" @click="react()" ref="reactButton">
<fa icon="plus"/>
</button>
<button v-if="!isMyNote && appearNote.myReaction != null" class="reactionButton reacted" @click="undoReact(appearNote)" ref="reactButton">
<fa icon="minus"/>
</button>
<button @click="menu()" ref="menuButton">
<fa icon="ellipsis-h"/>
@@ -328,7 +331,8 @@ export default Vue.extend({
> .count
display inline
margin 0 0 0 8px
color #999
color var(--text)
opacity 0.7
&.reacted
color var(--primary)

View File

@@ -49,8 +49,11 @@
<button v-else>
<fa icon="ban"/>
</button>
<button :class="{ reacted: appearNote.myReaction != null }" @click="react()" ref="reactButton">
<fa icon="plus"/><p class="count" v-if="appearNote.reactions_count > 0">{{ appearNote.reactions_count }}</p>
<button v-if="!isMyNote && appearNote.myReaction == null" class="reactionButton" @click="react()" ref="reactButton">
<fa icon="plus"/>
</button>
<button v-if="!isMyNote && appearNote.myReaction != null" class="reactionButton reacted" @click="undoReact(appearNote)" ref="reactButton">
<fa icon="minus"/>
</button>
<button class="menu" @click="menu()" ref="menuButton">
<fa icon="ellipsis-h"/>
@@ -255,7 +258,8 @@ export default Vue.extend({
> .count
display inline
margin 0 0 0 8px
color #999
color var(--text)
opacity 0.7
&.reacted
color var(--primary)

View File

@@ -9,7 +9,8 @@
<mk-time :time="notification.createdAt"/>
</header>
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note) }}
<fa icon="quote-left"/>
<misskey-flavored-markdown :text="getNoteSummary(notification.note)" :should-break="false" :plain-text="true" :custom-emojis="notification.note.emojis"/>
<fa icon="quote-right"/>
</router-link>
</div>
@@ -24,7 +25,9 @@
<mk-time :time="notification.createdAt"/>
</header>
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note.renote)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note.renote) }}<fa icon="quote-right"/>
<fa icon="quote-left"/>
<misskey-flavored-markdown :text="getNoteSummary(notification.note.renote)" :should-break="false" :plain-text="true" :custom-emojis="notification.note.renote.emojis"/>
<fa icon="quote-right"/>
</router-link>
</div>
</div>
@@ -60,7 +63,9 @@
<mk-time :time="notification.createdAt"/>
</header>
<router-link class="note-ref" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
<fa icon="quote-left"/>{{ getNoteSummary(notification.note) }}<fa icon="quote-right"/>
<fa icon="quote-left"/>
<misskey-flavored-markdown :text="getNoteSummary(notification.note)" :should-break="false" :plain-text="true" :custom-emojis="notification.note.emojis"/>
<fa icon="quote-right"/>
</router-link>
</div>
</div>

View File

@@ -5,6 +5,7 @@
<mk-post-form ref="form"
:reply="reply"
:renote="renote"
:mention="mention"
:initial-text="initialText"
:instant="instant"
@posted="onPosted"
@@ -27,6 +28,10 @@ export default Vue.extend({
type: Object,
required: false
},
mention: {
type: Object,
required: false
},
initialText: {
type: String,
required: false

View File

@@ -84,6 +84,10 @@ export default Vue.extend({
type: Object,
required: false
},
mention: {
type: Object,
required: false
},
initialText: {
type: String,
required: false
@@ -172,6 +176,11 @@ export default Vue.extend({
this.text = `@${this.reply.user.username}@${toASCII(this.reply.user.host)} `;
}
if (this.mention) {
this.text = this.mention.host ? `@${this.mention.username}@${toASCII(this.mention.host)}` : `@${this.mention.username}`;
this.text += ' ';
}
if (this.reply && this.reply.text != null) {
const ast = parse(this.reply.text);

View File

@@ -79,8 +79,10 @@ export default Vue.extend({
position fixed
top 0
left -8px
z-index 1024
width 100%
width calc(100% + 16px)
padding 0 8px
box-shadow 0 0px 8px rgba(0, 0, 0, 0.25)
&, *

View File

@@ -104,7 +104,7 @@ export default Vue.extend({
}).then(async ({ canceled, result: query }) => {
if (canceled) return;
const q = this.q.trim();
const q = query.trim();
if (q.startsWith('@')) {
this.$router.push(`/${q}`);
} else if (q.startsWith('#')) {

View File

@@ -41,8 +41,6 @@ export default Vue.extend({
</script>
<style lang="stylus" scoped>
main
width 100%
max-width 680px

View File

@@ -94,6 +94,8 @@
</section>
</ui-card>
<x-notification-settings/>
<x-drive-settings/>
<x-mute-and-block/>
@@ -157,6 +159,7 @@ import XProfileEditor from '../../../common/views/components/profile-editor.vue'
import XApiSettings from '../../../common/views/components/api-settings.vue';
import XLanguageSettings from '../../../common/views/components/language-settings.vue';
import XIntegrationSettings from '../../../common/views/components/integration-settings.vue';
import XNotificationSettings from '../../../common/views/components/notification-settings.vue';
export default Vue.extend({
i18n: i18n('mobile/views/pages/settings.vue'),
@@ -170,6 +173,7 @@ export default Vue.extend({
XApiSettings,
XLanguageSettings,
XIntegrationSettings,
XNotificationSettings,
},
data() {

View File

@@ -4,7 +4,7 @@
<mk-user-name :user="user"/>
</template>
<main v-if="!fetching">
<div class="is-suspended" v-if="user.isSuspended"><p><fa icon="exclamation-triangle"/> {{ $t('is-suspended') }}</p></div>
<div class="is-suspended" v-if="user.isSuspended"><p><fa icon="exclamation-triangle"/> {{ $t('@.user-suspended') }}</p></div>
<div class="is-remote" v-if="user.host != null"><p><fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}<a :href="user.url || user.uri" target="_blank">{{ $t('@.view-on-remote') }}</a></p></div>
<header>
<div class="banner" :style="style"></div>
@@ -55,6 +55,7 @@
<b>{{ user.followersCount | number }}</b>
<i>{{ $t('followers') }}</i>
</a>
<button @click="mention"><fa icon="at"/></button>
</div>
</div>
</header>
@@ -126,6 +127,10 @@ export default Vue.extend({
});
},
mention() {
this.$post({ mention: this.user });
},
menu() {
let menu = [{
icon: ['fas', 'list'],
@@ -365,6 +370,9 @@ main
> i
font-size 14px
> button
color var(--text)
> nav
position -webkit-sticky
position sticky

View File

@@ -5,7 +5,7 @@ import './style.styl';
import init from '../init';
import Index from './views/index.vue';
import NotFound from '../common/views/pages/404.vue';
import NotFound from '../common/views/pages/not-found.vue';
init(launch => {
document.title = 'Misskey';

View File

@@ -212,7 +212,7 @@
reversiGameHeaderLine: '#c4cdd4',
reversiGameEmptyCell: 'rgba(0, 0, 0, 0.06)',
reversiGameEmptyCellMyTurn: 'rgba(0, 0, 0, 0.12)',
reversiGameEmptyCellCanPut: 'rgba(0, 0, 0, 0.9)',
reversiGameEmptyCellCanPut: 'rgba(0, 0, 0, 0.09)',
adminDashboardHeaderFg: ':alpha<0.9<$text',
adminDashboardHeaderBorder: 'rgba(0, 0, 0, 0.1)',

View File

@@ -1,5 +1,5 @@
export default (acct: string) => {
if (acct.startsWith('@')) acct = acct.substr(1);
const splitted = acct.split('@', 2);
return { username: splitted[0], host: splitted[1] || null };
const split = acct.split('@', 2);
return { username: split[0], host: split[1] || null };
};

View File

@@ -1,13 +0,0 @@
import * as mongo from 'mongodb';
import db from '../db/mongodb';
const MessagingHistory = db.get<IMessagingHistory>('messagingHistories');
export default MessagingHistory;
export type IMessagingHistory = {
_id: mongo.ObjectID;
updatedAt: Date;
userId: mongo.ObjectID;
partnerId: mongo.ObjectID;
messageId: mongo.ObjectID;
};

View File

@@ -7,6 +7,8 @@ import isObjectId from '../misc/is-objectid';
import { length } from 'stringz';
const MessagingMessage = db.get<IMessagingMessage>('messagingMessages');
MessagingMessage.createIndex('userId');
MessagingMessage.createIndex('recipientId');
export default MessagingMessage;
export interface IMessagingMessage {

View File

@@ -1,5 +1,5 @@
export function concat(xs: string[]): string {
return xs.reduce((a, b) => a + b, '');
return xs.join('');
}
export function capitalize(s: string): string {

View File

@@ -18,7 +18,7 @@ export default async (actor: IRemoteUser, activity: ILike) => {
throw new Error();
}
let reaction = 'pudding';
let reaction = 'like';
// 他のMisskeyインスタンスからのリアクション
if (activity._misskey_reaction && validateReaction.ok(activity._misskey_reaction)) {

View File

@@ -1,5 +1,5 @@
import { performance } from 'perf_hooks';
import limitter from './limitter';
import limiter from './limiter';
import { IUser } from '../../models/user';
import { IApp } from '../../models/app';
import endpoints from './endpoints';
@@ -39,7 +39,7 @@ export default (endpoint: string, user: IUser, app: IApp, data: any, file?: any)
if (ep.meta.requireCredential && ep.meta.limit) {
try {
await limitter(ep, user); // Rate limit
await limiter(ep, user); // Rate limit
} catch (e) {
// drop request if limit exceeded
return rej('RATE_LIMIT_EXCEEDED');

View File

@@ -0,0 +1,42 @@
import User from '../../../../models/user';
import { publishMainStream } from '../../../../stream';
import Message from '../../../../models/messaging-message';
import define from '../../define';
export const meta = {
desc: {
'ja-JP': 'トークメッセージをすべて既読にします。',
'en-US': 'Mark all talk messages as read.'
},
requireCredential: true,
kind: 'account-write',
params: {
}
};
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
// Update documents
await Message.update({
recipientId: user._id,
isRead: false
}, {
$set: {
isRead: true
}
}, {
multi: true
});
User.update({ _id: user._id }, {
$set: {
hasUnreadMessagingMessage: false
}
});
publishMainStream(user._id, 'readAllMessagingMessages');
res();
}));

View File

@@ -1,7 +1,6 @@
import $ from 'cafy';
import History from '../../../../models/messaging-history';
import Mute from '../../../../models/mute';
import { pack } from '../../../../models/messaging-message';
import Message, { pack, IMessagingMessage } from '../../../../models/messaging-message';
import define from '../../define';
export const meta = {
@@ -28,19 +27,36 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
deletedAt: { $exists: false }
});
// Get history
const history = await History
.find({
userId: user._id,
partnerId: {
$nin: mute.map(m => m.muteeId)
}
const history: IMessagingMessage[] = [];
for (let i = 0; i < ps.limit; i++) {
const found = history.map(m => m.userId.equals(user._id) ? m.recipientId : m.userId);
const message = await Message.findOne({
$or: [{
userId: user._id
}, {
recipientId: user._id
}],
$and: [{
userId: { $nin: found },
recipientId: { $nin: found }
}, {
userId: { $nin: mute.map(m => m.muteeId) },
recipientId: { $nin: mute.map(m => m.muteeId) }
}]
}, {
limit: ps.limit,
sort: {
updatedAt: -1
createdAt: -1
}
});
res(await Promise.all(history.map(h => pack(h.messageId, user))));
if (message) {
history.push(message);
} else {
break;
}
}
res(await Promise.all(history.map(h => pack(h._id, user))));
}));

View File

@@ -1,7 +1,6 @@
import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
import Message from '../../../../../models/messaging-message';
import { isValidText } from '../../../../../models/messaging-message';
import History from '../../../../../models/messaging-history';
import User from '../../../../../models/user';
import Mute from '../../../../../models/mute';
import DriveFile from '../../../../../models/drive-file';
@@ -114,6 +113,7 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
// 2秒経っても(今回作成した)メッセージが既読にならなかったら「未読のメッセージがありますよ」イベントを発行する
setTimeout(async () => {
const freshMessage = await Message.findOne({ _id: message._id }, { isRead: true });
if (freshMessage == null) return; // メッセージが削除されている場合もある
if (!freshMessage.isRead) {
//#region ただしミュートされているなら発行しない
const mute = await Mute.find({
@@ -130,30 +130,4 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
pushSw(message.recipientId, 'unreadMessagingMessage', messageObj);
}
}, 2000);
// 履歴作成(自分)
History.update({
userId: user._id,
partnerId: recipient._id
}, {
updatedAt: new Date(),
userId: user._id,
partnerId: recipient._id,
messageId: message._id
}, {
upsert: true
});
// 履歴作成(相手)
History.update({
userId: recipient._id,
partnerId: user._id
}, {
updatedAt: new Date(),
userId: recipient._id,
partnerId: user._id,
messageId: message._id
}, {
upsert: true
});
}));

View File

@@ -0,0 +1,54 @@
import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
import Message from '../../../../../models/messaging-message';
import define from '../../../define';
import { publishMessagingStream } from '../../../../../stream';
const ms = require('ms');
export const meta = {
stability: 'stable',
desc: {
'ja-JP': '指定したメッセージを削除します。',
'en-US': 'Delete a message.'
},
requireCredential: true,
kind: 'messaging-write',
limit: {
duration: ms('1hour'),
max: 300,
minInterval: ms('1sec')
},
params: {
messageId: {
validator: $.type(ID),
transform: transform,
desc: {
'ja-JP': '対象のメッセージのID',
'en-US': 'Target message ID.'
}
}
}
};
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
const message = await Message.findOne({
_id: ps.messageId,
userId: user._id
});
if (message === null) {
return rej('message not found');
}
await Message.remove({ _id: message._id });
publishMessagingStream(message.userId, message.recipientId, 'deleted', message._id);
publishMessagingStream(message.recipientId, message.userId, 'deleted', message._id);
res();
}));

View File

@@ -42,6 +42,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
clientVersion: client.version,
name: instance.name,
uri: config.url,
description: instance.description,
langs: instance.langs,

View File

@@ -2,6 +2,8 @@ import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id
import Reaction from '../../../../../models/note-reaction';
import Note from '../../../../../models/note';
import define from '../../../define';
import { publishNoteStream } from '../../../../../stream';
const ms = require('ms');
export const meta = {
desc: {
@@ -13,6 +15,12 @@ export const meta = {
kind: 'reaction-write',
limit: {
duration: ms('1hour'),
max: 5,
minInterval: ms('3sec')
},
params: {
noteId: {
validator: $.type(ID),
@@ -60,4 +68,9 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
Note.update({ _id: note._id }, {
$inc: dec
});
publishNoteStream(note._id, 'unreacted', {
reaction: exist.reaction,
userId: user._id
});
}));

View File

@@ -156,6 +156,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
const sort = { } as any;
const query = {
$and: [ {} ],
deletedAt: null,
userId: user._id
} as any;
@@ -188,6 +189,22 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
query.replyId = null;
}
if (ps.includeMyRenotes === false) {
query.$and.push({
$or: [{
userId: { $ne: user._id }
}, {
renoteId: null
}, {
text: { $ne: null }
}, {
fileIds: { $ne: [] }
}, {
poll: { $ne: null }
}]
});
}
const withFiles = ps.withFiles != null ? ps.withFiles : ps.mediaOnly;
if (withFiles) {

View File

@@ -5,7 +5,7 @@ import { IEndpoint } from './endpoints';
import getAcct from '../../misc/acct/render';
import { IUser } from '../../models/user';
const log = debug('misskey:limitter');
const log = debug('misskey:limiter');
export default (endpoint: IEndpoint, user: IUser) => new Promise((ok, reject) => {
// Redisがインストールされてない場合は常に許可

View File

@@ -8,6 +8,7 @@ import * as Router from 'koa-router';
import * as send from 'koa-send';
import * as favicon from 'koa-favicon';
import * as views from 'koa-views';
import { ObjectID } from 'mongodb';
import docs from './docs';
import packFeed from './feed';
@@ -149,18 +150,22 @@ router.get('/@:user', async (ctx, next) => {
// Note
router.get('/notes/:note', async ctx => {
const note = await Note.findOne({ _id: ctx.params.note });
if (ObjectID.isValid(ctx.params.note)) {
const note = await Note.findOne({ _id: ctx.params.note });
if (note != null) {
const _note = await packNote(note);
await ctx.render('note', {
note: _note,
summary: getNoteSummary(_note)
});
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
} else {
ctx.status = 404;
if (note) {
const _note = await packNote(note);
await ctx.render('note', {
note: _note,
summary: getNoteSummary(_note)
});
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
return;
}
}
ctx.status = 404;
});
//#endregion

View File

@@ -1,7 +1,8 @@
{
"defaultSeverity": "error",
"extends": [
"tslint:recommended"
"tslint:recommended",
"tslint-sonarts"
],
"jsRules": {},
"rules": {
@@ -35,7 +36,28 @@
"ban": [
true,
{"name": ["*", "forEach"], "message": "Use for-of loop instead."}
]
],
"no-duplicate-string": false,
"no-commented-code": false,
"cognitive-complexity": false,
"no-nested-template-literals": false,
"no-identical-functions": false,
"max-union-size": false,
"no-big-function": false,
"no-statements-same-line": false,
"no-small-switch": false,
"no-identical-expressions": false,
"no-invalid-await": false,
"prefer-immediate-return": false,
"no-use-of-empty-return-value": false,
"no-collapsible-if": false,
"no-ignored-return": false,
"no-redundant-boolean": false,
"prefer-promise-shorthand": false,
"parameters-max-number": false,
"no-duplicated-branches": false,
"no-identical-conditions": false,
"no-useless-cast": false
},
"rulesDirectory": []
}