Compare commits

...

156 Commits

Author SHA1 Message Date
syuilo
3d62bd8007 10.75.0 2019-01-12 13:27:14 +09:00
syuilo
7ad9560f53 Implement instance info page 2019-01-12 11:27:23 +09:00
syuilo
c135d02895 Update CHANGELOG.md 2019-01-12 09:42:49 +09:00
syuilo
0757f67bde [Client] specifiedのアイコンを戻した 2019-01-12 09:40:53 +09:00
syuilo
c5dc25cb9e Revert "[Client] Renote数の表示を廃止"
This reverts commit d7af18efbd.
2019-01-12 09:38:44 +09:00
syuilo
0fcf422dec [Client] Improve UI 2019-01-12 09:34:02 +09:00
syuilo
21e801a325 🎨 2019-01-12 09:17:23 +09:00
syuilo
183faf3b2a [Client] Resolve #3881 2019-01-12 09:13:35 +09:00
dependabot[bot]
9fc66a2d1e Update terser-webpack-plugin requirement from 1.1.0 to 1.2.1 (#3867)
Updates the requirements on [terser-webpack-plugin](https://github.com/webpack-contrib/terser-webpack-plugin) to permit the latest version.
- [Release notes](https://github.com/webpack-contrib/terser-webpack-plugin/releases)
- [Changelog](https://github.com/webpack-contrib/terser-webpack-plugin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/terser-webpack-plugin/commits/v1.2.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-11 19:58:16 +09:00
MeiMei
12cf598e6b Fix bug (for return) (#3878) 2019-01-11 17:53:53 +09:00
syuilo
dd6cd6332c Update CHANGELOG.md 2019-01-11 16:00:09 +09:00
MeiMei
20ee2118ee モデレーターを凍結できないようにする (#3877) 2019-01-11 08:12:10 +09:00
MeiMei
1546160f6a モデレーター登録を解除できるように (#3876) 2019-01-11 08:11:24 +09:00
MeiMei
dd77a6194e Hide NSFW in Photos (#3875) 2019-01-11 08:10:39 +09:00
MeiMei
203fba0216 管理画面でユーザーを状態でフィルタできるように (#3873) 2019-01-11 08:09:44 +09:00
MeiMei
826a2466b7 管理者がサインイン履歴を参照できるツール (#3870)
* 管理者がサインイン履歴を参照できるツール

* remove debug code
2019-01-11 08:07:09 +09:00
MeiMei
273bc6507a ダイレクトを非公開のように使えるようにする (#3869) 2019-01-11 08:06:05 +09:00
MeiMei
2b13969b26 Supports toggle password in SMTP settings (#3868) 2019-01-11 08:05:36 +09:00
Acid Chicken (硫酸鶏)
2f10ff1a2e Fix style 2019-01-10 19:23:22 +09:00
syuilo
1f52aea193 Update CHANGELOG.md 2019-01-10 17:53:56 +09:00
Stéphane Burdin
0a0e76679e Add manage and docker docs in french and correct mistake in english (#3863) 2019-01-10 10:24:04 +09:00
ibrokemypie
845f3436cc Change SMTP password field to have password type (#3861) 2019-01-10 10:23:13 +09:00
MeiMei
f6a8c8cf76 Toggle show/hide password (#3865)
* Toggle show/hide password

* hoverでアンダーラインが中途半端に出てダサいので出さないように

* Update signin.vue
2019-01-10 10:22:45 +09:00
syuilo
af61a7a17f 10.74.0 2019-01-09 15:32:36 +09:00
syuilo
667ad8fe96 Update CHANGELOG.md 2019-01-09 15:19:00 +09:00
MeiMei
e1cc2394fa Use cached and asynchronous DNS resolver for AP delivery (#3859) 2019-01-09 15:17:54 +09:00
MeiMei
04e1e48f17 Hide invisible notes from timeline (#3852) 2019-01-08 21:02:00 +09:00
syuilo
c417e2f4a1 🎨 2019-01-08 18:00:05 +09:00
syuilo
02a27a8b12 ドライブの管理画面でファイルのオリジナルURLを表示するように 2019-01-08 17:45:16 +09:00
syuilo
d775e19059 Update CHANGELOG.md 2019-01-08 13:33:50 +09:00
syuilo
35e7dca2bb Resolve #3847 (#3849)
* Update notifications.ts

* Update notifications.ts

* Update notifications.ts

* Update notifications.ts

* Add missing semicolon

* Improve readability

* Fix typo
2019-01-08 13:32:28 +09:00
syuilo
6c4ea5e087 Merge pull request #3842 from syuilo/l10n_develop
New Crowdin translations
2019-01-07 18:23:24 +09:00
syuilo
54a1e500e2 New translations ja-JP.yml (French) 2019-01-07 14:12:02 +09:00
syuilo
450ed2c471 New translations ja-JP.yml (English) 2019-01-07 07:02:09 +09:00
Acid Chicken (硫酸鶏)
bf97fcb2fd Update README.md [AUTOGEN] (#3845) 2019-01-07 06:53:25 +09:00
Acid Chicken (硫酸鶏)
4edeae07a0 Update README.md [AUTOGEN] (#3843) 2019-01-07 06:52:56 +09:00
syuilo
8e19e4d33b New translations ja-JP.yml (Korean) 2019-01-06 22:22:34 +09:00
Acid Chicken (硫酸鶏)
2a774c9414 Update update_readme_patreon.sh
Patreon API updates
2019-01-06 18:20:47 +09:00
syuilo
6f50ed327d New translations ja-JP.yml (Norwegian) 2019-01-06 17:52:52 +09:00
syuilo
a51d384f19 New translations ja-JP.yml (Dutch) 2019-01-06 17:52:48 +09:00
syuilo
e2b2e4633a New translations ja-JP.yml (Japanese, Kansai) 2019-01-06 17:52:43 +09:00
syuilo
46ec773128 New translations ja-JP.yml (Spanish) 2019-01-06 17:52:37 +09:00
syuilo
1827a65874 New translations ja-JP.yml (Russian) 2019-01-06 17:52:32 +09:00
syuilo
1b4dd64cbe New translations ja-JP.yml (Portuguese) 2019-01-06 17:52:28 +09:00
syuilo
95b7d84025 New translations ja-JP.yml (Polish) 2019-01-06 17:52:22 +09:00
syuilo
137b081b8a New translations ja-JP.yml (Korean) 2019-01-06 17:52:18 +09:00
syuilo
76af9bbda7 New translations ja-JP.yml (Italian) 2019-01-06 17:52:14 +09:00
syuilo
17ab07ae9c New translations ja-JP.yml (German) 2019-01-06 17:52:09 +09:00
syuilo
4c4d06e49b New translations ja-JP.yml (French) 2019-01-06 17:52:05 +09:00
syuilo
5d9ef68f14 New translations ja-JP.yml (English) 2019-01-06 17:51:59 +09:00
syuilo
4689cf5591 New translations ja-JP.yml (Chinese Simplified) 2019-01-06 17:51:54 +09:00
syuilo
58e7edf08a New translations ja-JP.yml (Catalan) 2019-01-06 17:51:50 +09:00
syuilo
9c6c281ac3 Update CHANGELOG.md 2019-01-06 17:47:05 +09:00
syuilo
2326d6208b Merge pull request #3811 from syuilo/l10n_develop
New Crowdin translations
2019-01-06 17:46:09 +09:00
MeiMei
cd4be4116b Fix sharedInbox recovery code (#3840) 2019-01-06 17:45:53 +09:00
Acid Chicken (硫酸鶏)
6697ca243c Update README.md [AUTOGEN] (#3841) 2019-01-06 17:45:34 +09:00
Aya Morisawa
15ce89a88d Resolve #3078 (#3838) 2019-01-06 17:45:14 +09:00
Acid Chicken (硫酸鶏)
4b13278a41 Update README.md [AUTOGEN] (#3834) 2019-01-06 17:44:36 +09:00
Aya Morisawa
e01167fcab Merge pull request #3816 from syuilo/dependabot/npm_and_yarn/nodemailer-5.0.0
Update nodemailer requirement from 4.7.0 to 5.0.0
2019-01-06 13:29:05 +09:00
Aya Morisawa
719ff26e79 Merge pull request #3830 from syuilo/dependabot/npm_and_yarn/moment-2.23.0
Update moment requirement from 2.22.2 to 2.23.0
2019-01-06 13:28:57 +09:00
Aya Morisawa
2657328ac1 Merge pull request #3831 from syuilo/dependabot/npm_and_yarn/vue-marquee-text-component-1.1.1
Update vue-marquee-text-component requirement from 1.1.0 to 1.1.1
2019-01-06 13:28:49 +09:00
Aya Morisawa
4b7cef239e Merge pull request #3817 from syuilo/dependabot/npm_and_yarn/@fortawesome/fontawesome-svg-core-1.2.12
Update @fortawesome/fontawesome-svg-core requirement from 1.2.8 to 1.2.12
2019-01-06 13:28:39 +09:00
Aya Morisawa
49d9e51f72 Merge branch 'develop' into dependabot/npm_and_yarn/@fortawesome/fontawesome-svg-core-1.2.12 2019-01-06 13:28:33 +09:00
Aya Morisawa
40a5f79d76 Merge pull request #3819 from syuilo/dependabot/npm_and_yarn/@fortawesome/free-brands-svg-icons-5.6.3
Update @fortawesome/free-brands-svg-icons requirement from 5.6.0 to 5.6.3
2019-01-06 13:27:56 +09:00
Aya Morisawa
9cfd0b7351 Merge pull request #3818 from syuilo/dependabot/npm_and_yarn/@types/elasticsearch-5.0.30
Update @types/elasticsearch requirement from 5.0.29 to 5.0.30
2019-01-06 13:27:44 +09:00
Aya Morisawa
2223ecf890 Merge pull request #3832 from syuilo/dependabot/npm_and_yarn/@types/koa-2.0.48
Update @types/koa requirement from 2.0.47 to 2.0.48
2019-01-06 13:27:36 +09:00
Aya Morisawa
06bad9c501 Merge pull request #3833 from syuilo/dependabot/npm_and_yarn/@types/redis-2.8.10
Update @types/redis requirement from 2.8.8 to 2.8.10
2019-01-06 13:27:25 +09:00
MeiMei
a479e65f3e Compact URL preview (#3835)
* Compact url-preview

* fix header

* increase limit

* better limit

* Revert "better limit"

This reverts commit ef396f7733.

ハードリミットかけるならサーバー上でかけたほうが良さそう

* Revert "increase limit"

This reverts commit 72c10a456b.
2019-01-06 12:56:13 +09:00
syuilo
a2e99e46b9 New translations ja-JP.yml (Polish) 2019-01-06 08:22:03 +09:00
syuilo
07a27cfb9a New translations ja-JP.yml (Polish) 2019-01-06 08:11:40 +09:00
syuilo
77f3a0d3a9 New translations ja-JP.yml (Polish) 2019-01-06 08:01:48 +09:00
MeiMei
f9065943c5 Fix #3827 (#3837) 2019-01-06 04:00:30 +09:00
MeiMei
d0aff4409d Locked mark (#3836) 2019-01-05 19:59:10 +09:00
Aya Morisawa
84ea1fbd4d Fix typo: not -> note
1344ffa67d (commitcomment-31817792)
2019-01-05 10:29:46 +09:00
syuilo
d1d92be09a New translations ja-JP.yml (English) 2019-01-05 02:11:58 +09:00
dependabot[bot]
52b23af97e Update @types/redis requirement from 2.8.8 to 2.8.10
Updates the requirements on [@types/redis](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>
2019-01-03 20:22:40 +00:00
dependabot[bot]
b76cd18dea Update @types/koa requirement from 2.0.47 to 2.0.48
Updates the requirements on [@types/koa](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>
2019-01-03 20:20:43 +00:00
dependabot[bot]
cd3b30bf5c Update vue-marquee-text-component requirement from 1.1.0 to 1.1.1
Updates the requirements on [vue-marquee-text-component](https://github.com/EvodiaAut/vue-marquee-text-component) to permit the latest version.
- [Release notes](https://github.com/EvodiaAut/vue-marquee-text-component/releases)
- [Commits](https://github.com/EvodiaAut/vue-marquee-text-component/commits/v1.1.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-03 20:18:49 +00:00
dependabot[bot]
b87ebc6f9d Update moment requirement from 2.22.2 to 2.23.0
Updates the requirements on [moment](https://github.com/moment/moment) to permit the latest version.
- [Release notes](https://github.com/moment/moment/releases)
- [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/commits/2.23.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-03 20:17:22 +00:00
syuilo
4d7d119524 Update CHANGELOG.md 2019-01-04 04:54:28 +09:00
syuilo
b4b6e9548d Rename 2019-01-04 03:52:50 +09:00
ibrokemypie
ebf9cd18c8 Make instance logo customisable (#3829) 2019-01-04 03:02:40 +09:00
syuilo
b1ccbb2deb New translations ja-JP.yml (English) 2019-01-04 00:43:55 +09:00
syuilo
562cd6ad0b Improve readability 2019-01-03 12:34:08 +09:00
dependabot[bot]
a832672b59 Update file-type requirement from 10.6.0 to 10.7.0 (#3815)
Updates the requirements on [file-type](https://github.com/sindresorhus/file-type) to permit the latest version.
- [Release notes](https://github.com/sindresorhus/file-type/releases)
- [Commits](https://github.com/sindresorhus/file-type/commits/v10.7.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-03 11:47:32 +09:00
dependabot[bot]
309058f209 Update webpack requirement from 4.26.1 to 4.28.3 (#3822)
Updates the requirements on [webpack](https://github.com/webpack/webpack) to permit the latest version.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/commits/v4.28.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-03 08:39:17 +09:00
Ch. (Chanhwi Choi)
2a344dfbd8 adds ko-KR な to にゃ (#3820)
* adds ko-KR な to にゃ
- this only take considers pre-composed "Hangul Syllables",
not composable area "Hangul Jamo" which are not used commonly
- 56 is '냐' - '나'

* replace magic number as suggested
2019-01-03 08:38:26 +09:00
dependabot[bot]
866d4cd59a Update vue-i18n requirement from 8.3.2 to 8.6.0 (#3821)
Updates the requirements on [vue-i18n](https://github.com/kazupon/vue-i18n) to permit the latest version.
- [Release notes](https://github.com/kazupon/vue-i18n/releases)
- [Changelog](https://github.com/kazupon/vue-i18n/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/kazupon/vue-i18n/commits/v8.6.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-03 08:37:44 +09:00
dependabot[bot]
165350cca6 Update apexcharts requirement from 2.4.2 to 2.5.1 (#3826)
Updates the requirements on [apexcharts](https://github.com/apexcharts/apexcharts.js) to permit the latest version.
- [Release notes](https://github.com/apexcharts/apexcharts.js/releases)
- [Changelog](https://github.com/apexcharts/apexcharts.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/apexcharts/apexcharts.js/commits/v2.5.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-03 08:36:00 +09:00
syuilo
8c21b8a9a6 Update CHANGELOG.md 2019-01-02 18:10:23 +09:00
MeiMei
41e3a9a004 Tune AP URL negotiating with Accept (#3824) 2019-01-02 18:07:32 +09:00
syuilo
4dc6ec5387 New translations ja-JP.yml (French) 2019-01-02 14:41:41 +09:00
MeiMei
96515c4544 Resolve #3813 (#3814) 2019-01-02 03:35:42 +09:00
syuilo
b3637b5e8a New translations ja-JP.yml (Korean) 2019-01-02 00:22:17 +09:00
dependabot[bot]
43bcdf397e Update @fortawesome/free-brands-svg-icons requirement
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.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-31 20:27:42 +00:00
dependabot[bot]
22c5db7121 Update @types/elasticsearch requirement from 5.0.29 to 5.0.30
Updates the requirements on [@types/elasticsearch](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-31 20:25:44 +00:00
dependabot[bot]
1c6a8f8691 Update @fortawesome/fontawesome-svg-core requirement
Updates the requirements on [@fortawesome/fontawesome-svg-core](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)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-31 20:21:31 +00:00
dependabot[bot]
31b5175bb0 Update nodemailer requirement from 4.7.0 to 5.0.0
Updates the requirements on [nodemailer](https://github.com/nodemailer/nodemailer) to permit the latest version.
- [Release notes](https://github.com/nodemailer/nodemailer/releases)
- [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodemailer/nodemailer/commits/v5.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-31 20:17:17 +00:00
syuilo
9add59aca9 2019 🎉 2019-01-01 00:11:07 +09:00
syuilo
16c65173c1 New translations ja-JP.yml (French) 2018-12-31 06:12:15 +09:00
syuilo
4f6ae4633f New translations ja-JP.yml (French) 2018-12-31 06:01:44 +09:00
syuilo
8aa1577713 New translations ja-JP.yml (French) 2018-12-31 05:52:42 +09:00
syuilo
5bd41704ae 10.73.0 2018-12-31 02:38:13 +09:00
syuilo
4d0b335748 [Client] Improve theme 🎨 2018-12-31 02:33:03 +09:00
syuilo
5692ae59a1 [Client] Improve theming 🎨 2018-12-31 01:15:32 +09:00
syuilo
84f1ce866b [Client] line thiknessの設定はデバイスに保存するように 2018-12-31 00:59:13 +09:00
syuilo
e68c6175ce Fix bug 2018-12-31 00:50:56 +09:00
syuilo
0de11c3636 🎨 2018-12-31 00:50:14 +09:00
syuilo
1f70657d4a Merge pull request #3798 from syuilo/l10n_develop
New Crowdin translations
2018-12-31 00:45:51 +09:00
syuilo
73646aac9b New translations ja-JP.yml (English) 2018-12-30 19:11:39 +09:00
syuilo
06e026b346 New translations ja-JP.yml (English) 2018-12-30 14:51:40 +09:00
syuilo
14d0a07b29 New translations ja-JP.yml (English) 2018-12-30 14:21:40 +09:00
syuilo
f81c10fe62 New translations ja-JP.yml (Norwegian) 2018-12-30 14:13:06 +09:00
syuilo
86a2aa42a4 New translations ja-JP.yml (Dutch) 2018-12-30 14:13:00 +09:00
syuilo
42f5c3fe22 New translations ja-JP.yml (Japanese, Kansai) 2018-12-30 14:12:54 +09:00
syuilo
975740464c New translations ja-JP.yml (Spanish) 2018-12-30 14:12:49 +09:00
syuilo
d92a2cdb55 New translations ja-JP.yml (Russian) 2018-12-30 14:12:43 +09:00
syuilo
5b91463233 New translations ja-JP.yml (Portuguese) 2018-12-30 14:12:38 +09:00
syuilo
39eed3378f New translations ja-JP.yml (Polish) 2018-12-30 14:12:33 +09:00
syuilo
cf98d40a44 New translations ja-JP.yml (Korean) 2018-12-30 14:12:28 +09:00
syuilo
7d6436c90e New translations ja-JP.yml (Italian) 2018-12-30 14:12:24 +09:00
syuilo
0acf3a8f6d New translations ja-JP.yml (German) 2018-12-30 14:12:19 +09:00
syuilo
8b7324c8d3 New translations ja-JP.yml (French) 2018-12-30 14:12:13 +09:00
syuilo
a0b0d5dff7 New translations ja-JP.yml (English) 2018-12-30 14:12:07 +09:00
syuilo
bef0e36665 New translations ja-JP.yml (Chinese Simplified) 2018-12-30 14:12:02 +09:00
syuilo
766e721ff3 New translations ja-JP.yml (Catalan) 2018-12-30 14:11:57 +09:00
syuilo
fcc4b2c704 New translations ja-JP.yml (English) 2018-12-30 13:21:45 +09:00
syuilo
193abfdbac New translations ja-JP.yml (Norwegian) 2018-12-30 13:13:01 +09:00
syuilo
0e13481eb4 New translations ja-JP.yml (Dutch) 2018-12-30 13:12:56 +09:00
syuilo
b713cac4f1 New translations ja-JP.yml (Japanese, Kansai) 2018-12-30 13:12:51 +09:00
syuilo
2137c894ef New translations ja-JP.yml (Spanish) 2018-12-30 13:12:47 +09:00
syuilo
f0d2ce4f19 New translations ja-JP.yml (Russian) 2018-12-30 13:12:42 +09:00
syuilo
e3a89d302f New translations ja-JP.yml (Portuguese) 2018-12-30 13:12:38 +09:00
syuilo
d01d2ef65e New translations ja-JP.yml (Polish) 2018-12-30 13:12:32 +09:00
syuilo
23c550acba New translations ja-JP.yml (Korean) 2018-12-30 13:12:26 +09:00
syuilo
b9db88f616 New translations ja-JP.yml (Italian) 2018-12-30 13:12:21 +09:00
syuilo
dee4a18d48 New translations ja-JP.yml (German) 2018-12-30 13:12:16 +09:00
syuilo
fa5073b042 New translations ja-JP.yml (French) 2018-12-30 13:12:11 +09:00
syuilo
9dda698dc8 New translations ja-JP.yml (English) 2018-12-30 13:12:06 +09:00
syuilo
99d0930fba New translations ja-JP.yml (Chinese Simplified) 2018-12-30 13:12:01 +09:00
syuilo
a599524b5f New translations ja-JP.yml (Catalan) 2018-12-30 13:11:57 +09:00
syuilo
fbe0d70661 New translations ja-JP.yml (English) 2018-12-30 08:41:38 +09:00
syuilo
b722431720 New translations ja-JP.yml (Norwegian) 2018-12-29 22:13:17 +09:00
syuilo
295563caad New translations ja-JP.yml (Dutch) 2018-12-29 22:13:13 +09:00
syuilo
26735815f1 New translations ja-JP.yml (Japanese, Kansai) 2018-12-29 22:13:08 +09:00
syuilo
c06a52c237 New translations ja-JP.yml (Spanish) 2018-12-29 22:13:04 +09:00
syuilo
5678adf3b5 New translations ja-JP.yml (Russian) 2018-12-29 22:12:58 +09:00
syuilo
ac772dd389 New translations ja-JP.yml (Portuguese) 2018-12-29 22:12:53 +09:00
syuilo
2c4de8475f New translations ja-JP.yml (Polish) 2018-12-29 22:12:49 +09:00
syuilo
46facaf176 New translations ja-JP.yml (Korean) 2018-12-29 22:12:45 +09:00
syuilo
eea1b7fc63 New translations ja-JP.yml (Italian) 2018-12-29 22:12:39 +09:00
syuilo
f0e9386cd0 New translations ja-JP.yml (German) 2018-12-29 22:12:34 +09:00
syuilo
e4a4238b57 New translations ja-JP.yml (French) 2018-12-29 22:12:28 +09:00
syuilo
55e126998a New translations ja-JP.yml (English) 2018-12-29 22:12:24 +09:00
syuilo
608a30d37b New translations ja-JP.yml (Chinese Simplified) 2018-12-29 22:12:19 +09:00
syuilo
7d22d6255d New translations ja-JP.yml (Catalan) 2018-12-29 22:12:14 +09:00
97 changed files with 1237 additions and 235 deletions

View File

@@ -35,7 +35,7 @@ while :
cat patreon.cache | \
awk -F'\t' '{print $2,$1}' | \
sed -e 's/ /\\" alt=\\"/' | \
xargs -I% echo '<td><img src="%"></td>' >> patreon.md.cache && \
xargs -I% echo '<td><img src="%" width="100"></td>' >> patreon.md.cache && \
echo '</tr><tr>' >> patreon.md.cache && \
cat patreon.cache | \
awk -F'\t' '{print $3,$1}' | \

View File

@@ -1,6 +1,35 @@
ChangeLog
=========
10.75.0
----------
* ダイレクトを非公開のように使えるように
* モデレーターを凍結できないように
* モデレーター登録を解除できるように
* NSFWなメディアをユーザーページなどで表示しないように
* 管理画面でユーザーを状態でフィルタできるように
* 管理者がサインイン履歴を参照できるツール
* Renote数を再度表示するように
* インスタンス情報ページの追加
* テーマの調整
* UIの改善
10.74.0
----------
* Pleromaとのフェデレーションを修正
* インスタンスのキャラクター画像を設定できるように
* Catモードの朝鮮語対応
* CWが付いた投稿に返信する際、そのCWを引き継ぐように
* 投稿のソースをクリップボードにコピーできるように
* i/notifications API で取得する通知の種別を配列で指定できるように
* パフォーマンスの改善
* バグ修正
10.73.0
-------
* テーマの強化
* line thiknessの設定はデバイスに保存するように
10.72.0
-------
* いくつかのテーマの追加

View File

@@ -73,16 +73,14 @@ Please see [Contribution guide](./CONTRIBUTING.md).
----------------------------------------------------------------
<!-- PATREON_START -->
<table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/1?token-time=2145916800&token-hash=Zeh1u6l_Vmgoy8A1eT1Sltea-_SZSq8t8uOWDRZRh94%3D" alt="weep"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13376668/71f3cf87ec6c4393a44b1b9df5ee3d12/1?token-time=2145916800&token-hash=7pSmWqgMfMSJHVIEcNsuuQoKeU3TRluew5p0EGTzWA4%3D" alt="Arctic"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/2?token-time=2145916800&token-hash=mgPdX9TqZxEg4TTPuc477dxhIgYk9246qafjWZEqZ7g%3D" alt="Melilot"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/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/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/1?token-time=2145916800&token-hash=WeuDzzz24cRXJogyIkU-mxARqkdyms-rcZKbO-GpGjw%3D" alt="weep" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=prtYqPOiSHBulhM7NU0VzMaWx39-9ntdq25b6kafDNA%3D" alt="negao" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/2?token-time=2145916800&token-hash=djaJ9cwy9uwTiF9UFtxYQdS8Nw7BhyfaREzZUbErN-0%3D" alt="Melilot" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/3?token-time=2145916800&token-hash=LtV2lRi3L2jOWMLwccr9qWYfPrFlzIo2jYZHKzHEb6k%3D" alt="Xeltica" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=Ch3iF81ZGP0LMo894Y9ajpLisgtE91SnxtZE7fxsgrM%3D" alt="べすれい" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=1FlxS9MEgmNGH_RHUVHbO5hIXB5I1z0lvA33CTvYvjA%3D" alt="gutfuckllc" width="100"></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>
<td><a href="https://www.patreon.com/negao">negao</a></td>
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
<td><a href="https://www.patreon.com/Xeltica">Xeltica</a></td>
@@ -90,13 +88,13 @@ Please see [Contribution guide](./CONTRIBUTING.md).
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</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/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1?token-time=2145916800&token-hash=0xgcpqvFDqRcV_YIEhcPNVH7gs9sLg_BBnTJXCkN4ao%3D" alt="mydarkstar" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/12718187" alt="Peter G." width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=2PsbFNw0tnubZzgSXD01R6hIgncfiElG7H7HX2Y3dyo%3D" alt="nemu" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3?token-time=2145916800&token-hash=9JtETp0X8gI280Ne1E8bxn6j4Lw5o2k4mJkICx97V_k%3D" alt="YUKIMOCHI" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/8241184/39e18850e87a449e9c9a71acb3310ebd/2?token-time=2145916800&token-hash=zrInDotuEIFslKphuSiCqr3M-r-rveTXjVKWr-VK6M0%3D" alt="Acid Chicken" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=5T8XcaAf9Zyzfg3QubR06s_kJZkArVEM2dwObrBVAU4%3D" alt="Hiratake" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/10789744/97175095d8f04c0f86225ff47cb98d40/1?token-time=2145916800&token-hash=ubVARikVOg3v7NW6LDhtG-ClE1LTU3I2TJ3js2-5xDs%3D" alt="Naoki Hirayama" width="100"></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>
@@ -107,10 +105,10 @@ Please see [Contribution guide](./CONTRIBUTING.md).
<td><a href="https://www.patreon.com/spinlock">Naoki Hirayama</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>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=Ksk_2l3gjPDbnzMUOCSW1E-hdPJsNs2tSR4_RAakRK8%3D" alt="dansup" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=CXe9AqlZy9AsYfiWd3OBYVOzvODoN47Litz0Tu4BFpU%3D" alt="Gargron" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1?token-time=2145916800&token-hash=xhR1n6NAAyEb-IUXLD6_dshkFa3mefU5ZZuk1L8qKTs%3D" alt="Nokotaro Takeda" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=uR-48MQ0A4j0irQSrCAQZJ-sJUSs_Fkihlg3-l59b7c%3D" alt="Takashi Shibuya" width="100"></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>
@@ -118,12 +116,12 @@ Please see [Contribution guide](./CONTRIBUTING.md).
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
</tr></table>
**Last updated:** Tue, 25 Dec 2018 04:58:06 UTC
**Last updated:** Sun, 06 Jan 2019 21:53:06 UTC
<!-- PATREON_END -->
:four_leaf_clover: Copyright
----------------------------------------------------------------
> Copyright (c) 2014-2018 syuilo
> Copyright (c) 2014-2019 syuilo
Misskey is an open-source software licensed under the [GNU AGPLv3](LICENSE).

View File

@@ -17,7 +17,7 @@ This guide describes how to install and setup Misskey with Docker.
----------------------------------------------------------------
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` Copy the `.config/mongo_initdb_example.js` and rename it to `mongo_initdb.js`.
2. Edit `default.yml` and `mongo_initdb.js`.
3. Edit `default.yml` and `mongo_initdb.js`.
*3.* Configure Docker
----------------------------------------------------------------

67
docs/docker.fr.md Normal file
View File

@@ -0,0 +1,67 @@
Guide Docker
================================================================
Ce guide explique comment installer et configurer Misskey avec Docker.
[Version japonaise également disponible - Japanese version also available - 日本語版もあります](./docker.ja.md)
[Version anglaise également disponible - English version also available - 英語版もあります](./docker.en.md)
----------------------------------------------------------------
*1.* Télécharger Misskey
----------------------------------------------------------------
1. `git clone -b master git://github.com/syuilo/misskey.git` Clone le dépôt de Misskey sur la branche master.
2. `cd misskey` Permet de se déplacer dans le dossier du dépôt.
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout sur le tag de la [dernière version](https://github.com/syuilo/misskey/releases/latest).
*2.* Configuration de Misskey
----------------------------------------------------------------
1. `cp .config/example.yml .config/default.yml` Copie le fichier `.config/example.yml` et le renommer en `default.yml`.
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` Copie le fichier `.config/mongo_initdb_example.js` et le renomme en `mongo_initdb.js`.
3. Editer `default.yml` et `mongo_initdb.js`.
*3.* Configurer Docker
----------------------------------------------------------------
Editez `docker-compose.yml`.
*4.* Contruire Misskey
----------------------------------------------------------------
Contruire l'image Docker avec:
`docker-compose build`
*5.* C'est tout !
----------------------------------------------------------------
Parfait, Vous avez un environnement prêt pour démarrer Misskey.
### Lancer normalement
Utilisez la commande `docker-compose up -d`. GLHF!
### How to update your Misskey server to the latest version
1. `git fetch`
2. `git stash`
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
4. `git stash pop`
5. `docker-compose build`
6. Consultez le [ChangeLog](../CHANGELOG.md) pour avoir les éventuelles informations de migration
7. `docker-compose stop && docker-compose up -d`
### Comment exécuter des [commandes](manage.fr.md)
`docker-compose run --rm web node cli/mark-admin @example`
### Configuration d'ElasticSearch (pour la fonction de recherche)
*1.* Préparation de l'environnement
----------------------------------------------------------------
1. `mkdir elasticsearch && chown 1000:1000 elasticsearch` Permet de créer le dossier d'accueil de la base ElasticSearch aves les bons droits
2. `sysctl -w vm.max_map_count=262144` Augmente la valeur max du paramètre map_count du système (valeur minimum pour pouvoir lancer ES)
*2.* Après lancement du docker-compose, initialisation de la base ElasticSearch
----------------------------------------------------------------
1. `docker-compose -it web /bin/sh` Connexion dans le conteneur web
2. `apk add curl` Ajout du paquet curl
3. `curl -X PUT "es:9200/misskey" -H 'Content-Type: application/json' -d'{ "settings" : { "index" : { } }}'` Création de la base ES
4. `exit`
----------------------------------------------------------------
Si vous avez des questions ou des problèmes, n'hésitez pas à nous contacter !

18
docs/manage.fr.md Normal file
View File

@@ -0,0 +1,18 @@
# Guide d'administration
## Vérifier le status de la file d'attente des taches
coming soon
## Marquer un utilisateur en tant que 'admin'
``` shell
node cli/mark-admin (ID utilisateur ou nom d'utilisateur)
```
Exemple :
``` shell
# Par id
node cli/mark-admin 57d01a501fdf2d07be417afe
# Par nom d'utilisateur
node cli/suspend @syuilo
```

View File

@@ -109,7 +109,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
@@ -120,6 +120,10 @@ common:
reduce-motion: "UIの動きを減らす"
this-setting-is-this-device-only: "このデバイスのみ"
use-os-default-emojis: "OS標準の絵文字を使用"
line-width: "線の太さ"
line-width-thin: "細い"
line-width-normal: "普通"
line-width-thick: "太い"
do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
user-suspended: "このユーザーは凍結されています。"
is-remote-user: "このユーザー情報はコピーです。"
@@ -260,6 +264,7 @@ common/views/components/media-banner.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
common/views/components/theme.vue:
theme: "テーマ"
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
@@ -276,6 +281,7 @@ common/views/components/theme.vue:
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Dark"
find-more-theme: "その他のテーマを入手"
theme-name: "テーマ名"
preview-created-theme: "プレビュー"
invalid-theme: "テーマが正しくありません。"
@@ -331,6 +337,7 @@ common/views/components/nav.vue:
common/views/components/note-menu.vue:
mention: "メンション"
detail: "詳細"
copy-content: "内容をコピー"
copy-link: "リンクをコピー"
favorite: "お気に入り"
unfavorite: "お気に入り解除"
@@ -849,6 +856,7 @@ desktop/views/components/settings.2fa.vue:
enter-password: "パスワードを入力してください"
authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
howtoinstall: "インストール方法はこちら"
token: "トークン"
scan: "次に、表示されているQRコードをスキャンします:"
done: "お使いのデバイスに表示されているトークンを入力して完了します:"
submit: "完了"
@@ -1432,7 +1440,6 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示"
notification-position-bottom: "下"
notification-position-top: "上"
theme: "テーマ"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
note-visibility: "投稿の公開範囲"

View File

@@ -109,7 +109,7 @@ common:
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
i-like-sushi: "Ich bevorzuge Sushi anstelle von Pudding"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
verified-user: "Verifizierter Benutzer"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
@@ -120,6 +120,10 @@ common:
reduce-motion: "Animationen der Benutzeroberfläche reduzieren"
this-setting-is-this-device-only: "Nur auf diesem Gerät"
use-os-default-emojis: "OS標準の絵文字を使用"
line-width: "線の太さ"
line-width-thin: "細い"
line-width-normal: "普通"
line-width-thick: "太い"
do-not-use-in-production: "Dies ist eine Entwicklungsversion. Nicht in einer Produktionsumgebung verwenden."
user-suspended: "このユーザーは凍結されています。"
is-remote-user: "このユーザー情報はコピーです。"
@@ -260,6 +264,7 @@ common/views/components/media-banner.vue:
sensitive: "Dieser Inhalt ist NSFW"
click-to-show: "Klicke zum den Inhalt anzusehen"
common/views/components/theme.vue:
theme: "テーマ"
light-theme: "Thema"
dark-theme: "Thema während des Nachtmodus"
light-themes: "Helles Thema"
@@ -276,6 +281,7 @@ common/views/components/theme.vue:
base-theme: "Basisthema"
base-theme-light: "Hell"
base-theme-dark: "Dunkel"
find-more-theme: "その他のテーマを入手"
theme-name: "Name des Themas"
preview-created-theme: "Vorschau"
invalid-theme: "Thema ist ungültig"
@@ -331,6 +337,7 @@ common/views/components/nav.vue:
common/views/components/note-menu.vue:
mention: "メンション"
detail: "詳細"
copy-content: "内容をコピー"
copy-link: "リンクをコピー"
favorite: "Diese Notiz favorisieren"
unfavorite: "Aus Favoriten entfernen"
@@ -849,6 +856,7 @@ desktop/views/components/settings.2fa.vue:
enter-password: "Bitte Passwort eingeben"
authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
howtoinstall: "インストール方法はこちら"
token: "トークン"
scan: "次に、表示されているQRコードをスキャンします:"
done: "お使いのデバイスに表示されているトークンを入力して完了します:"
submit: "完了"
@@ -1432,7 +1440,6 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示"
notification-position-bottom: "下"
notification-position-top: "上"
theme: "テーマ"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
note-visibility: "投稿の公開範囲"

View File

@@ -18,7 +18,7 @@ common:
ui-desc: "No UI fits for everyone. Therefore, Misskey has a highly customizable UI for your taste. Make your original home by editing, adjusting layouts of timeline and placing selectable widgets you can easily customize."
drive: "Drive"
drive-desc: "Wanna post a picture you have already uploaded? Wish to organize, name and create a folder for your uploaded files? Misskey Drive is the best solution for you. Very easy to share your files online."
outro: "Check further Misskey-unique features on your eyes! Feeling like this is not for you, try other instances as Misskey is a decentralized SNS so that you can easily find your mates. Then, GLHF!"
outro: "Check Misskey-unique features by seeing them with your own eyes! If you feel like this instance is not for you, try other instances, as Misskey is a decentralized SNS, so that you can easily find your mates. Then, GLHF!"
adblock:
detected: "Please disable ad blocker."
warning: "Some features may be unavailable or cause malfunctions if ad blocking features are enabled. <strong>Misskey is not running ads</strong>."
@@ -109,7 +109,7 @@ common:
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
i-like-sushi: "I prefer sushi rather than pudding"
show-reversi-board-labels: "Show row and column labels in Reversi"
use-white-black-reversi-stones: "Use white-black stone in reversi"
use-avatar-reversi-stones: "Use avatar as a stone in reversi"
verified-user: "Verified account"
disable-animated-mfm: "Disable animated texts in a post"
suggest-recent-hashtags: "Suggest recently used hashtags within the post composition area"
@@ -120,11 +120,15 @@ common:
reduce-motion: "Reduce motion in UI"
this-setting-is-this-device-only: "Only for this device"
use-os-default-emojis: "Use the OS default Emojis"
line-width: "Line thickness"
line-width-thin: "Thin"
line-width-normal: "Regular"
line-width-thick: "Thick"
do-not-use-in-production: "This is a development build. Do not use in production."
user-suspended: "This user has been suspended."
is-remote-user: "This user information is copied."
is-remote-post: "This post information is a copy."
view-on-remote: "View it on remote"
is-remote-user: "This user's information is mirrored."
is-remote-post: "These post contents are mirrored."
view-on-remote: "For completion, view it remotely."
renoted-by: "Renoted by {user}"
error:
title: "Something happened :("
@@ -260,6 +264,7 @@ common/views/components/media-banner.vue:
sensitive: "NSFW"
click-to-show: "Click to show"
common/views/components/theme.vue:
theme: "Theme"
light-theme: "Theme"
dark-theme: "Theme during dark mode"
light-themes: "Light theme"
@@ -276,6 +281,7 @@ common/views/components/theme.vue:
base-theme: "Base theme"
base-theme-light: "Light"
base-theme-dark: "Dark"
find-more-theme: "Find more themes"
theme-name: "Theme name"
preview-created-theme: "Preview"
invalid-theme: "Not valid theme"
@@ -329,8 +335,9 @@ common/views/components/nav.vue:
develop: "Developers"
feedback: "Feedback"
common/views/components/note-menu.vue:
mention: "Mentions"
mention: "Mention"
detail: "Details"
copy-content: "Copy the contents"
copy-link: "Copy link"
favorite: "Favorite this note"
unfavorite: "Unfavorite"
@@ -497,8 +504,8 @@ common/views/widgets/calendar.vue:
month: "{},"
day: "{}"
today: "Today: "
this-month: "This month: "
this-year: "This year: "
this-month: "Month:"
this-year: "Year:"
common/views/widgets/photo-stream.vue:
title: "Photo stream"
no-photos: "No photos"
@@ -849,6 +856,7 @@ desktop/views/components/settings.2fa.vue:
enter-password: "Enter the password"
authenticator: "First, you need to install Google Authenticator on your device:"
howtoinstall: "How to install"
token: "Token"
scan: "And then, scan the QR code:"
done: "Please enter the token displayed on your device:"
submit: "Submit"
@@ -985,6 +993,7 @@ admin/views/instance.vue:
instance-name: "Instance name"
instance-description: "Instance description"
host: "Host"
logo-url: "Logo image URL"
banner-url: "Banner image URL"
error-image-url: "Error image URL"
languages: "Language of this instance"
@@ -1058,7 +1067,7 @@ admin/views/charts.vue:
federation: "Federation"
notes: "Posts"
users: "Users"
drive: "Drive"
drive: "Media storage"
network: "Network"
charts:
federation-instances: "The number of instances: increase/decrease"
@@ -1432,7 +1441,6 @@ mobile/views/pages/settings.vue:
notification-position: "Notification style"
notification-position-bottom: "Bottom"
notification-position-top: "Top"
theme: "Theme"
behavior: "Behavior"
fetch-on-scroll: "Endless loading on scroll"
note-visibility: "Post visibility"
@@ -1525,7 +1533,7 @@ deck/deck.user-column.vue:
pinned-notes: "Pinned posts"
push-to-a-list: "Add to list"
docs:
edit-this-page-on-github: "Found a mistake or want to contribute for the documentation?"
edit-this-page-on-github: "Found an error, or do you want to contribute to the documentation?"
edit-this-page-on-github-link: "Edit this page at GitHub!"
api:
entities:

View File

@@ -109,7 +109,7 @@ common:
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
i-like-sushi: "Prefiero sushi a pudín"
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
verified-user: "Cuenta verificada"
disable-animated-mfm: "Desactivar texto animado en una publicación"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
@@ -120,6 +120,10 @@ common:
reduce-motion: "UIの動きを減らす"
this-setting-is-this-device-only: "このデバイスのみ"
use-os-default-emojis: "OS標準の絵文字を使用"
line-width: "線の太さ"
line-width-thin: "細い"
line-width-normal: "普通"
line-width-thick: "太い"
do-not-use-in-production: "Esto está en desarrollo, no usarlo para producción."
user-suspended: "このユーザーは凍結されています。"
is-remote-user: "このユーザー情報はコピーです。"
@@ -260,6 +264,7 @@ common/views/components/media-banner.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
common/views/components/theme.vue:
theme: "テーマ"
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
@@ -276,6 +281,7 @@ common/views/components/theme.vue:
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Dark"
find-more-theme: "その他のテーマを入手"
theme-name: "テーマ名"
preview-created-theme: "プレビュー"
invalid-theme: "テーマが正しくありません。"
@@ -331,6 +337,7 @@ common/views/components/nav.vue:
common/views/components/note-menu.vue:
mention: "メンション"
detail: "Detalles"
copy-content: "内容をコピー"
copy-link: "Copiar enlace"
favorite: "Me gusta esta nota"
unfavorite: "お気に入り解除"
@@ -849,6 +856,7 @@ desktop/views/components/settings.2fa.vue:
enter-password: "Escribe una contraseña"
authenticator: "Primero, necesitas instalar Google Authenticator en tu dispositivo:"
howtoinstall: "Cómo instalar"
token: "トークン"
scan: "Luego, escanea el código QR:"
done: "Por favor ingresa el token mostrado en tu dispositivo:"
submit: "Enviar"
@@ -1432,7 +1440,6 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示"
notification-position-bottom: "下"
notification-position-top: "上"
theme: "テーマ"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
note-visibility: "投稿の公開範囲"

View File

@@ -109,10 +109,10 @@ common:
my-token-regenerated: "Votre jeton vient dêtre généré, vous allez maintenant être déconnecté."
i-like-sushi: "Je préfère les sushis plutôt que le pudding"
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
use-white-black-reversi-stones: "Jouer avec des pions noirs et blancs sur Reversi"
use-avatar-reversi-stones: "Utiliser lavatar comme pion dans Reversi"
verified-user: "Compte vérifié"
disable-animated-mfm: "Désactiver les textes animés dans les publications"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
suggest-recent-hashtags: "Suggérer les hashtags récemment utilisés dans le champs de saisie"
always-show-nsfw: "Toujours afficher les contenus sensibles"
always-mark-nsfw: "Toujours marquer les notes ayant des attachements comme sensibles"
show-full-acct: "Afficher ladresse complète de lutilisateur"
@@ -120,8 +120,12 @@ common:
reduce-motion: "Réduire les animations dans linterface utilisateur"
this-setting-is-this-device-only: "Uniquement sur cet appareil"
use-os-default-emojis: "Utiliser les émojis standards du système"
line-width: "Epaisseur du trait"
line-width-thin: "Fine"
line-width-normal: "Normale"
line-width-thick: "Épaisse"
do-not-use-in-production: "Il sagit dune version de développement. Ne pas utiliser dans un environnement de production."
user-suspended: "このユーザーは凍結されています。"
user-suspended: "Cet·te utilisateur·trice a été suspendu·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"
@@ -260,6 +264,7 @@ common/views/components/media-banner.vue:
sensitive: "Contenu sensible"
click-to-show: "Cliquer pour afficher"
common/views/components/theme.vue:
theme: "Thème"
light-theme: "Thème en mode jour"
dark-theme: "Thème en mode nuit"
light-themes: "Thème clair"
@@ -276,6 +281,7 @@ common/views/components/theme.vue:
base-theme: "Thème de base"
base-theme-light: "Clair"
base-theme-dark: "Sombre"
find-more-theme: "Obtenir dautres thèmes"
theme-name: "Nom du Thème"
preview-created-theme: "Prévisualisation"
invalid-theme: "Thème nest pas valide."
@@ -299,7 +305,7 @@ common/views/components/cw-button.vue:
show: "Voir plus"
chars: "{count} caractères"
files: "{count} fichiers"
poll: "アンケート"
poll: "Sondage"
common/views/components/messaging.vue:
search-user: "Trouver un utilisateur"
you: "Vous"
@@ -329,8 +335,9 @@ common/views/components/nav.vue:
develop: "Développeurs"
feedback: "Suggestions"
common/views/components/note-menu.vue:
mention: "メンション"
mention: "Mention"
detail: "Détails"
copy-content: "Copier le contenu"
copy-link: "Copier le lien"
favorite: "Mettre cette note en favoris"
unfavorite: "Retirer des favoris"
@@ -406,10 +413,10 @@ common/views/components/stream-indicator.vue:
reconnecting: "Reconnexion en cours"
connected: "Connecté"
common/views/components/notification-settings.vue:
title: "通知"
mark-as-read-all-notifications: "すべての通知を既読にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
mark-as-read-all-talk-messages: "すべてのトークを既読にする"
title: "Notifications"
mark-as-read-all-notifications: "Marquer toutes les notifications comme lues"
mark-as-read-all-unread-notes: "Marquer toutes les notes comme lues"
mark-as-read-all-talk-messages: "Marquer toutes les conversations comme lues"
auto-watch: "投稿の自動ウォッチ"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
common/views/components/integration-settings.vue:
@@ -436,7 +443,7 @@ common/views/components/uploader.vue:
common/views/components/visibility-chooser.vue:
public: "Public"
home: "Accueil"
home-desc: "Publier sur le fil d'Accueil uniquement"
home-desc: "Publier sur le fil dAccueil uniquement"
followers: "Abonnés"
followers-desc: "Publier à vos abonnés uniquement"
specified: "Direct"
@@ -474,7 +481,7 @@ common/views/components/profile-editor.vue:
privacy: "Vie privée"
save: "Mettre à jour le profil"
saved: "Profil mis à jour avec succès"
uploading: "En cours d'envoi…"
uploading: "En cours denvoi …"
upload-failed: "Échec de l'envoi"
email: "Paramètres de messagerie"
email-address: "Adresse de courrier électronique"
@@ -540,7 +547,7 @@ common/views/widgets/tips.vue:
tips-line24: "Misskey est fonctionnel depuis 2014"
tips-line25: "Vous pouvez recevoir les notifications de Misskey dans un navigateur web compatible"
common/views/pages/not-found.vue:
page-not-found: "ページが見つかりませんでした"
page-not-found: "La page demandée est introuvable !"
common/views/pages/follow.vue:
signed-in-as: "Connecté en tant que {}"
following: "Suit"
@@ -676,12 +683,12 @@ desktop/views/components/note-detail.vue:
location: "Géolocalisation"
renote: "Republier"
add-reaction: "Ajouter votre reaction"
undo-reaction: "リアクション解除"
undo-reaction: "Inverser la réaction"
desktop/views/components/note.vue:
reply: "Répondre"
renote: "Partager"
add-reaction: "Ajouter votre réaction"
undo-reaction: "リアクション解除"
undo-reaction: "Inverser la réaction"
detail: "Détails"
private: "Cette publication est privée"
deleted: "Cette publication a été supprimée"
@@ -731,7 +738,7 @@ desktop/views/components/renote-form.vue:
quote: "Citer..."
cancel: "Annuler"
renote: "Republier"
renote-home: "Renote (Home)"
renote-home: "Renote (accueil)"
reposting: "Republication en cours…"
success: "Republié !"
failure: "La renote a échoué"
@@ -769,8 +776,8 @@ desktop/views/components/settings.vue:
advanced: "Paramètres avancés"
api-via-stream: "Requête API via le flux"
api-via-stream-desc: "Lorsque ce paramètre est activé, une demande d'API est effectuée via une connexion WebSocket (pour une meilleure performance). Lorsqu'il est désactivé, l'API de récupération native est utilisée. Ce paramètre n'est valide que sur cet appareil."
deck-nav: "デッキ内ナビゲーション"
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
deck-nav: "Deck sans tansitions"
deck-nav-desc: "Vous obtenez une colonne temporaire sans transitions dans la page pendant la navigation, lors de lutilisation du Deck."
deck-default: "Utiliser le Deck comme IU par défaut"
display: "Affichage et design"
customize: "Personnaliser l'Accueil"
@@ -849,6 +856,7 @@ desktop/views/components/settings.2fa.vue:
enter-password: "Entrez un mot de passe"
authenticator: "Vous devez au préalable installer Google Authenticator sur votre appareil:"
howtoinstall: "Comment installer"
token: "Jeton"
scan: "Ensuite, scannez le code QR affiché sur votre écran :"
done: "Veuillez entrer le token qui s'affiche sur votre appareil :"
submit: "Envoyer"
@@ -1050,7 +1058,7 @@ admin/views/instance.vue:
serviceworker-info: "Devrait être activé pour les notifications push."
vapid-publickey: "Clé Publique VAPID"
vapid-privatekey: "Clé privée VAPID"
vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
vapid-info: "Vous devez activer ServiceWorker pour pouvoir générer les clés VAPID. Vous devez lancer ceci en mode root :"
admin/views/charts.vue:
title: "Graphe"
per-day: "par jour"
@@ -1066,7 +1074,7 @@ admin/views/charts.vue:
notes: "Nombre de publications : augmentation/diminution (combinés)"
local-notes: "Nombre des publications : augmentation/diminution (Local)"
remote-notes: "Nombre de publications : augmentation/diminution (distants)"
notes-total: "Total des publications"
notes-total: "Total des notes"
users: "Nombre dutilisateurs : augmentation/diminution"
users-total: "Nombre total des utilisateurs"
drive: "Capacité utilisée comme stockage : augmentation/diminution"
@@ -1166,7 +1174,7 @@ desktop/views/pages/welcome.vue:
signup: "S'enregistrer"
signin-button: "Se connecter"
signup-button: "S'inscrire"
timeline: "Fil d'actualité"
timeline: "Fil dactualité"
announcements: "Notices"
photos: "Images récentes"
powered-by-misskey: "Propulsé par <b>Misskey</b>."
@@ -1223,7 +1231,7 @@ desktop/views/pages/user/user.header.vue:
posts: "Notes"
following: "Suit"
followers: "Abonnés"
mention: "メンション"
mention: "Mentions"
is-bot: "Ce compte est un Bot"
years-old: "{age} ans"
year: "/"
@@ -1347,7 +1355,7 @@ mobile/views/components/ui.header.vue:
welcome-back: "Content de vous revoir ! "
adjective: "M."
mobile/views/components/ui.nav.vue:
timeline: "Fil d'actualité"
timeline: "Fil dactualité"
notifications: "Notifications"
follow-requests: "Demandes dabonnement"
search: "Rechercher"
@@ -1361,7 +1369,7 @@ mobile/views/components/ui.nav.vue:
about: "À propos de Misskey"
mobile/views/components/user-timeline.vue:
no-notes: "Il semble que cet utilisateur na rien publié pour le moment."
no-notes-with-media: "Aucune notes avec des médias"
no-notes-with-media: "Aucune note comprenant des médias"
mobile/views/components/users-list.vue:
all: "Tout"
known: "Vous connaissez"
@@ -1421,18 +1429,17 @@ mobile/views/pages/settings.vue:
i-am-under-limited-internet: "J'ai un accès Internet limité"
circle-icons: "Utiliser des icônes circulaires"
contrasted-acct: "Nom dutilisateur contrasté"
timeline: "Fil d'actualité"
timeline: "Fil dactualité"
show-reply-target: "Afficher les réponses"
show-my-renotes: "Afficher mes partages"
show-renoted-my-notes: "Afficher mes publications partagées"
show-local-renotes: "Afficher les publications partagées localement"
show-renoted-my-notes: "Afficher mes notes partagées"
show-local-renotes: "Afficher les notes partagées localement"
post-style: "Style de la publication"
post-style-standard: "Standard"
post-style-smart: "Intelligent"
notification-position: "Style de notification"
notification-position-bottom: "en bas"
notification-position-top: "en haut"
theme: "Thème"
behavior: "Comportement"
fetch-on-scroll: "Chargement lors du défilement"
note-visibility: "Visibilité de la publication"
@@ -1463,7 +1470,7 @@ mobile/views/pages/user.vue:
followers: "Abonnés"
notes: "Notes"
overview: "Aperçu"
timeline: "Fil d'actualité"
timeline: "Fil dactualité"
media: "Média"
mute: "Mettre en sourdine"
unmute: "Enlever la sourdine"
@@ -1518,7 +1525,7 @@ deck/deck.user-column.vue:
posts: "Notes"
following: "Suit"
followers: "Abonnés"
mention: "メンション"
mention: "Mentions"
images: "Images"
activity: "Activité"
timeline: "Fil dactualité"

View File

@@ -109,7 +109,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
@@ -120,6 +120,10 @@ common:
reduce-motion: "UIの動きを減らす"
this-setting-is-this-device-only: "このデバイスのみ"
use-os-default-emojis: "OS標準の絵文字を使用"
line-width: "線の太さ"
line-width-thin: "細い"
line-width-normal: "普通"
line-width-thick: "太い"
do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
user-suspended: "このユーザーは凍結されています。"
is-remote-user: "このユーザー情報はコピーです。"
@@ -260,6 +264,7 @@ common/views/components/media-banner.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
common/views/components/theme.vue:
theme: "テーマ"
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
@@ -276,6 +281,7 @@ common/views/components/theme.vue:
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Dark"
find-more-theme: "その他のテーマを入手"
theme-name: "テーマ名"
preview-created-theme: "プレビュー"
invalid-theme: "テーマが正しくありません。"
@@ -331,6 +337,7 @@ common/views/components/nav.vue:
common/views/components/note-menu.vue:
mention: "メンション"
detail: "詳細"
copy-content: "内容をコピー"
copy-link: "リンクをコピー"
favorite: "お気に入り"
unfavorite: "お気に入り解除"
@@ -849,6 +856,7 @@ desktop/views/components/settings.2fa.vue:
enter-password: "パスワードを入力してください"
authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
howtoinstall: "インストール方法はこちら"
token: "トークン"
scan: "次に、表示されているQRコードをスキャンします:"
done: "お使いのデバイスに表示されているトークンを入力して完了します:"
submit: "完了"
@@ -1432,7 +1440,6 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示"
notification-position-bottom: "下"
notification-position-top: "上"
theme: "テーマ"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
note-visibility: "投稿の公開範囲"

View File

@@ -132,6 +132,8 @@ common:
line-width-thin: "細い"
line-width-normal: "普通"
line-width-thick: "太い"
hide-password: "パスワードを隠す"
show-password: "パスワードを表示する"
do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
user-suspended: "このユーザーは凍結されています。"
@@ -367,6 +369,7 @@ common/views/components/nav.vue:
common/views/components/note-menu.vue:
mention: "メンション"
detail: "詳細"
copy-content: "内容をコピー"
copy-link: "リンクをコピー"
favorite: "お気に入り"
unfavorite: "お気に入り解除"
@@ -1252,6 +1255,14 @@ admin/views/users.vue:
createdAtDesc: "登録日時が新しい順"
updatedAtAsc: "更新日時が古い順"
updatedAtDesc: "更新日時が新しい順"
state:
title: "状態"
all: "すべて"
admin: "管理者"
moderator: "モデレーター"
adminOrModerator: "管理者+モデレーター"
verified: "公式アカウント"
suspended: "凍結済み"
origin:
title: "オリジン"
combined: "ローカル+リモート"
@@ -1265,6 +1276,8 @@ admin/views/moderators.vue:
title: "モデレーターの登録"
add: "登録"
added: "モデレーターを登録しました"
remove: "解除"
removed: "モデレーター登録を解除しました"
admin/views/emoji.vue:
add-emoji:

View File

@@ -109,7 +109,7 @@ common:
my-token-regenerated: "あんさんのトークンが更新されたらしいわ。すまんがとりあえずサインアウトすんで。"
i-like-sushi: "寿司(のほうがプリンよりむしろ)ウマい、タコ焼きはあらへんけど。"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示や!"
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
verified-user: "アメちゃん付きアカウント"
disable-animated-mfm: "投稿内のちょろちょろ動いてんのを止める"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
@@ -120,6 +120,10 @@ common:
reduce-motion: "UI、動き過ぎや、静かにしてや"
this-setting-is-this-device-only: "このデバイスのみ"
use-os-default-emojis: "OSにもとから入っとる絵文字使う"
line-width: "線の太さ"
line-width-thin: "細い"
line-width-normal: "普通"
line-width-thick: "太い"
do-not-use-in-production: "開発ビルドや。本番環境で使わんといて!知らんで!"
user-suspended: "このユーザーは凍結されています。"
is-remote-user: "このユーザー情報はコピーです。"
@@ -260,6 +264,7 @@ common/views/components/media-banner.vue:
sensitive: "見せたらあかん"
click-to-show: "押してみ、見せたるわ"
common/views/components/theme.vue:
theme: "テーマ"
light-theme: "ナイトゲームちゃう時のテーマどないする?"
dark-theme: "ナイトゲームの時のテーマどないする?"
light-themes: "デイゲーム"
@@ -276,6 +281,7 @@ common/views/components/theme.vue:
base-theme: "この色が背景や!"
base-theme-light: "Light"
base-theme-dark: "Dark"
find-more-theme: "その他のテーマを入手"
theme-name: "テーマ名"
preview-created-theme: "試してみる"
invalid-theme: "このテーマあかんわ、なんか間違うとる"
@@ -331,6 +337,7 @@ common/views/components/nav.vue:
common/views/components/note-menu.vue:
mention: "メンション"
detail: "もっと"
copy-content: "内容をコピー"
copy-link: "リンクをコピー"
favorite: "お気に入り"
unfavorite: "お気に入りやめる"
@@ -849,6 +856,7 @@ desktop/views/components/settings.2fa.vue:
enter-password: "パスワードを入れてや"
authenticator: "まず、Google Authenticatorとかのをつこてるデバイスにインストールしてや:"
howtoinstall: "インストール方法はここやで"
token: "トークン"
scan: "んで、ここに出とるQRコードをスキャンしてな:"
done: "最後にデバイスに表示されとるトークンを入力してな:"
submit: "送信"
@@ -1432,7 +1440,6 @@ mobile/views/pages/settings.vue:
notification-position: "通知どこ見せる?"
notification-position-bottom: "ミナミの方"
notification-position-top: "キタの方"
theme: "テーマ"
behavior: "動き"
fetch-on-scroll: "スクロールしたらもっと見せてや"
note-visibility: "投稿の公開範囲"

View File

@@ -109,7 +109,7 @@ common:
my-token-regenerated: "당신의 토큰이 업데이트되었으므로 로그아웃합니다."
i-like-sushi: "저는 (푸딩보다 차라리) 초밥이 좋아요"
show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
use-white-black-reversi-stones: "리버시에 흑백 돌을 사용"
use-avatar-reversi-stones: "리버시의 돌로 아바타를 사용"
verified-user: "공식 계정"
disable-animated-mfm: "글의 문자 애니메이션을 비활성화"
suggest-recent-hashtags: "최근 해시태그를 글 작성란에 표시"
@@ -120,6 +120,10 @@ common:
reduce-motion: "UI의 애니메이션 줄이기"
this-setting-is-this-device-only: "이 장치만"
use-os-default-emojis: "운영체제의 기본 이모지 사용"
line-width: "선 두께"
line-width-thin: "얇음"
line-width-normal: "보통"
line-width-thick: "두꺼움"
do-not-use-in-production: "이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오."
user-suspended: "이 사용자는 정지된 상태입니다."
is-remote-user: "이 유저 정보는 복사본입니다."
@@ -260,6 +264,7 @@ common/views/components/media-banner.vue:
sensitive: "열람주의"
click-to-show: "클릭하여 표시"
common/views/components/theme.vue:
theme: "테마"
light-theme: "다크 모드가 아닐 때 사용하는 테마"
dark-theme: "다크 모드일 때 사용하는 테마"
light-themes: "밝은 테마"
@@ -276,6 +281,7 @@ common/views/components/theme.vue:
base-theme: "기본 테마"
base-theme-light: "밝음"
base-theme-dark: "어두움"
find-more-theme: "그 외 테마 찾아보기"
theme-name: "테마명"
preview-created-theme: "미리보기"
invalid-theme: "테마가 올바르지 않습니다."
@@ -331,6 +337,7 @@ common/views/components/nav.vue:
common/views/components/note-menu.vue:
mention: "멘션"
detail: "상세"
copy-content: "내용 복사"
copy-link: "링크 복사"
favorite: "이 노트 즐겨찾기"
unfavorite: "즐겨찾기에서 제거"
@@ -469,7 +476,7 @@ common/views/components/profile-editor.vue:
is-bot: "이 계정은 Bot입니다"
is-locked: "팔로우를 수동으로 승인"
careful-bot: "Bot의 팔로우만 수동으로 승인"
auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
auto-accept-followed: "팔로우중인 사용자로부터의 팔로우를 자동으로 승인"
advanced: "기타"
privacy: "프라이버시"
save: "저장"
@@ -849,6 +856,7 @@ desktop/views/components/settings.2fa.vue:
enter-password: "비밀번호를 입력하여 주십시오"
authenticator: "먼저, 가지고 계신 장치에 Google Authenticator를 설치해야 합니다:"
howtoinstall: "설치 방법은 여기에 있습니다"
token: "토큰"
scan: "다음으로 표시되어 있는 QR 코드를 스캔합니다:"
done: "사용중이신 장치에 표시된 토큰을 입력해주시면 마무리됩니다:"
submit: "완료"
@@ -1432,7 +1440,6 @@ mobile/views/pages/settings.vue:
notification-position: "알림 표시"
notification-position-bottom: "아래"
notification-position-top: "위"
theme: "테마"
behavior: "동작"
fetch-on-scroll: "스크롤하여 자동으로 불러오기"
note-visibility: "게시물의 공개 범위"

View File

@@ -109,7 +109,7 @@ common:
my-token-regenerated: "Je sleutel is gegenereerd; je wordt nu uitgelogd."
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
@@ -120,6 +120,10 @@ common:
reduce-motion: "UIの動きを減らす"
this-setting-is-this-device-only: "このデバイスのみ"
use-os-default-emojis: "OS標準の絵文字を使用"
line-width: "線の太さ"
line-width-thin: "細い"
line-width-normal: "普通"
line-width-thick: "太い"
do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
user-suspended: "このユーザーは凍結されています。"
is-remote-user: "このユーザー情報はコピーです。"
@@ -260,6 +264,7 @@ common/views/components/media-banner.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
common/views/components/theme.vue:
theme: "テーマ"
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
@@ -276,6 +281,7 @@ common/views/components/theme.vue:
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Dark"
find-more-theme: "その他のテーマを入手"
theme-name: "テーマ名"
preview-created-theme: "プレビュー"
invalid-theme: "テーマが正しくありません。"
@@ -331,6 +337,7 @@ common/views/components/nav.vue:
common/views/components/note-menu.vue:
mention: "メンション"
detail: "詳細"
copy-content: "内容をコピー"
copy-link: "リンクをコピー"
favorite: "Deze notitie toevoegen aan favorieten"
unfavorite: "お気に入り解除"
@@ -849,6 +856,7 @@ desktop/views/components/settings.2fa.vue:
enter-password: "Voer het wachtwoord in"
authenticator: "Installeer eerst Google Authenticator op je apparaat:"
howtoinstall: "Hoe installeer ik dit?"
token: "トークン"
scan: "Scan daarna de QR-code:"
done: "Voer de op je apparaat getoonde sleutel in:"
submit: "Versturen"
@@ -1432,7 +1440,6 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示"
notification-position-bottom: "下"
notification-position-top: "上"
theme: "テーマ"
behavior: "Gedrag"
fetch-on-scroll: "Ophalen bij scrollen"
note-visibility: "投稿の公開範囲"

View File

@@ -109,7 +109,7 @@ common:
my-token-regenerated: "Ditt synbol har blitt generert. Du vil nå bli utlogget."
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
@@ -120,6 +120,10 @@ common:
reduce-motion: "UIの動きを減らす"
this-setting-is-this-device-only: "このデバイスのみ"
use-os-default-emojis: "OS標準の絵文字を使用"
line-width: "線の太さ"
line-width-thin: "細い"
line-width-normal: "普通"
line-width-thick: "太い"
do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
user-suspended: "このユーザーは凍結されています。"
is-remote-user: "このユーザー情報はコピーです。"
@@ -260,6 +264,7 @@ common/views/components/media-banner.vue:
sensitive: "Sensitivt innhold"
click-to-show: "クリックして表示"
common/views/components/theme.vue:
theme: "テーマ"
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
@@ -276,6 +281,7 @@ common/views/components/theme.vue:
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Mørk"
find-more-theme: "その他のテーマを入手"
theme-name: "Tema navn"
preview-created-theme: "プレビュー"
invalid-theme: "テーマが正しくありません。"
@@ -331,6 +337,7 @@ common/views/components/nav.vue:
common/views/components/note-menu.vue:
mention: "メンション"
detail: "Detaljer"
copy-content: "内容をコピー"
copy-link: "リンクをコピー"
favorite: "Merket som favoritt"
unfavorite: "お気に入り解除"
@@ -849,6 +856,7 @@ desktop/views/components/settings.2fa.vue:
enter-password: "パスワードを入力してください"
authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
howtoinstall: "インストール方法はこちら"
token: "トークン"
scan: "次に、表示されているQRコードをスキャンします:"
done: "お使いのデバイスに表示されているトークンを入力して完了します:"
submit: "Send"
@@ -1432,7 +1440,6 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示"
notification-position-bottom: "Bunn"
notification-position-top: "Topp"
theme: "Utseende"
behavior: "Oppførsel"
fetch-on-scroll: "スクロールで自動読み込み"
note-visibility: "投稿の公開範囲"

View File

@@ -109,7 +109,7 @@ common:
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
i-like-sushi: "Wolę sushi od puddingu"
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
verified-user: "Zweryfikowane konto"
disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
@@ -120,11 +120,15 @@ common:
reduce-motion: "Zredukuj ruch w UI"
this-setting-is-this-device-only: "このデバイスのみ"
use-os-default-emojis: "Użyj domyślnych Emoji systemowych"
line-width: "線の太さ"
line-width-thin: "細い"
line-width-normal: "普通"
line-width-thick: "太い"
do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
user-suspended: "このユーザーは凍結されています。"
is-remote-user: "Informacje o użytkowniku są kopiowane."
is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "正確な情報を見る"
view-on-remote: "Dla dopełnienia, zobacz to zdalnie."
renoted-by: "{user} udostępnił(a)"
error:
title: "Coś poszło nie tak"
@@ -257,10 +261,11 @@ common/views/components/connect-failed.troubleshooter.vue:
flush: "Wyczyść pamięć podręczną"
set-version: "Określ wersję"
common/views/components/media-banner.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
sensitive: "NSFW"
click-to-show: "Naciśnij aby wyświetlić"
common/views/components/theme.vue:
light-theme: "非ダークモード時に使用するテーマ"
theme: "Motyw"
light-theme: "Motyw"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "Jasny Motyw"
dark-themes: "Ciemny motyw"
@@ -276,21 +281,22 @@ common/views/components/theme.vue:
base-theme: "Podstawowy motyw"
base-theme-light: "Jasny"
base-theme-dark: "Ciemny"
find-more-theme: "Odkryj więcej motywów"
theme-name: "Nazwa motywu"
preview-created-theme: "Pokaż podgląd"
invalid-theme: "テーマが正しくありません。"
invalid-theme: "Nieprawidłowy motyw"
already-installed: "Ten motyw jest już zainstalowany"
saved: "Zapisano"
manage-themes: "Zarządzanie motywami"
builtin-themes: "Standardowe motywy"
my-themes: "Moje motywy"
installed-themes: "Zainstalowane motywy"
select-theme: "テーマを選択してください"
select-theme: "Wybierz motyw"
uninstall: "Odinstaluj"
uninstalled: "\"{}\" został odinstalowany"
author: "Author"
desc: "Opis"
export: "エクスポート"
export: "Eksportuj"
import: "Importuj"
import-by-code: "lub wklej kod"
theme-name-required: "Nazwa motywu jest obowiązkowa."
@@ -299,7 +305,7 @@ common/views/components/cw-button.vue:
show: "Pokaż więcej"
chars: "{count} znaków"
files: "{count} plików"
poll: "アンケート"
poll: "Ankieta"
common/views/components/messaging.vue:
search-user: "Znajdź użytkownika"
you: "Ty"
@@ -329,8 +335,9 @@ common/views/components/nav.vue:
develop: "Autorzy"
feedback: "Podziel się opinią"
common/views/components/note-menu.vue:
mention: "メンション"
mention: "Wspomnij"
detail: "Szczegóły"
copy-content: "内容をコピー"
copy-link: "Skopiuj adres"
favorite: "Dodaj do ulubionych"
unfavorite: "Usuń z ulubionych"
@@ -406,7 +413,7 @@ common/views/components/stream-indicator.vue:
reconnecting: "Ponowne łączenie"
connected: "Połączono"
common/views/components/notification-settings.vue:
title: "通知"
title: "Powiadomienia"
mark-as-read-all-notifications: "すべての通知を既読にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
mark-as-read-all-talk-messages: "すべてのトークを既読にする"
@@ -415,7 +422,7 @@ common/views/components/notification-settings.vue:
common/views/components/integration-settings.vue:
title: "サービス連携"
connect: "Połącz"
disconnect: "切断する"
disconnect: "Rozłącz"
connected-to: "次のアカウントに接続されています"
common/views/components/github-setting.vue:
description: "お使いのGitHubアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでGitHubアカウント情報が表示されるようになったり、GitHubを用いた便利なサインインを利用できるようになります。"
@@ -546,7 +553,7 @@ common/views/pages/follow.vue:
following: "Śledzisz"
follow: "Śledź"
request-pending: "Oczekiwanie na pozwolenie"
follow-processing: "フォロー処理中"
follow-processing: "Przetwarzanie śledzenia"
follow-request: "Poproś o śledzenie"
desktop:
banner-crop-title: "バナーとして表示する部分を選択"
@@ -849,6 +856,7 @@ desktop/views/components/settings.2fa.vue:
enter-password: "Wprowadź hasło"
authenticator: "Na początek musisz zainstalować Google Authenticator na swoim urządzeniu:"
howtoinstall: "Jak zainstalować"
token: "トークン"
scan: "Później, zeskanuje ten kod QR:"
done: "Wprowadź token wyświetlony na Twoim urządzeniu:"
submit: "Wyślij"
@@ -901,7 +909,7 @@ desktop/views/components/sub-note-content.vue:
poll: "Ankieta"
desktop/views/components/settings.tags.vue:
title: "Tagi"
query: "クエリ (省略可)"
query: "Zapytanie (opcjonalne)"
add: "Dodaj"
save: "Zapisz"
desktop/views/components/taskmanager.vue:
@@ -1223,7 +1231,7 @@ desktop/views/pages/user/user.header.vue:
posts: "Wpisy"
following: "Śledzeni"
followers: "Śledzący"
mention: "メンション"
mention: "Wspomnij"
is-bot: "To konto jest botem"
years-old: "{age} lat"
year: "/"
@@ -1233,7 +1241,7 @@ desktop/views/pages/user/user.timeline.vue:
default: "Wpisy"
with-replies: "Wpisy i odpowiedzi"
with-media: "Multimedia"
my-posts: "私の投稿"
my-posts: "Moje wpisy"
empty: "Ten użytkownik nie umieścił jeszcze niczego."
desktop/views/widgets/messaging.vue:
title: "Wiadomości"
@@ -1297,7 +1305,7 @@ common/views/components/follow-button.vue:
following: "フォロー中"
follow: "Śledź"
request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-processing: "Przetwarzanie"
follow-request: "Poproś o śledzenie"
mobile/views/components/friends-maker.vue:
title: "Zacznij śledzić ludzi takich jak Ty"
@@ -1432,7 +1440,6 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示"
notification-position-bottom: "Dół"
notification-position-top: "Góra"
theme: "Motyw"
behavior: "Zachowanie"
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
note-visibility: "Widoczność wpisów"
@@ -1518,7 +1525,7 @@ deck/deck.user-column.vue:
posts: "Wpisy"
following: "Śledzeni"
followers: "Śledzący"
mention: "メンション"
mention: "Wspomnij"
images: "Zdjęcia"
activity: "Aktywność"
timeline: "Oś czasu"

View File

@@ -109,7 +109,7 @@ common:
my-token-regenerated: "Seu token foi recriado, portanto você foi deslogado."
i-like-sushi: "Eu prefiro sushi a pudim"
show-reversi-board-labels: "Mostrar etiquetas de colunas e linhas no Reversi"
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
verified-user: "Conta verificada"
disable-animated-mfm: "Desativar texto animado nas publicações"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
@@ -120,6 +120,10 @@ common:
reduce-motion: "UIの動きを減らす"
this-setting-is-this-device-only: "このデバイスのみ"
use-os-default-emojis: "OS標準の絵文字を使用"
line-width: "線の太さ"
line-width-thin: "細い"
line-width-normal: "普通"
line-width-thick: "太い"
do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
user-suspended: "このユーザーは凍結されています。"
is-remote-user: "このユーザー情報はコピーです。"
@@ -260,6 +264,7 @@ common/views/components/media-banner.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
common/views/components/theme.vue:
theme: "テーマ"
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
@@ -276,6 +281,7 @@ common/views/components/theme.vue:
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Dark"
find-more-theme: "その他のテーマを入手"
theme-name: "テーマ名"
preview-created-theme: "プレビュー"
invalid-theme: "テーマが正しくありません。"
@@ -331,6 +337,7 @@ common/views/components/nav.vue:
common/views/components/note-menu.vue:
mention: "メンション"
detail: "詳細"
copy-content: "内容をコピー"
copy-link: "リンクをコピー"
favorite: "お気に入り"
unfavorite: "お気に入り解除"
@@ -849,6 +856,7 @@ desktop/views/components/settings.2fa.vue:
enter-password: "パスワードを入力してください"
authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
howtoinstall: "インストール方法はこちら"
token: "トークン"
scan: "次に、表示されているQRコードをスキャンします:"
done: "お使いのデバイスに表示されているトークンを入力して完了します:"
submit: "完了"
@@ -1432,7 +1440,6 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示"
notification-position-bottom: "下"
notification-position-top: "上"
theme: "テーマ"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
note-visibility: "投稿の公開範囲"

View File

@@ -109,7 +109,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
verified-user: "公式アカウント"
disable-animated-mfm: "Отключить анимированный текст в постах"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
@@ -120,6 +120,10 @@ common:
reduce-motion: "Уменьшить движение в интерфейсе"
this-setting-is-this-device-only: "Только для этого устройства"
use-os-default-emojis: "Использовать стандартные Emoji из ОС"
line-width: "線の太さ"
line-width-thin: "細い"
line-width-normal: "普通"
line-width-thick: "太い"
do-not-use-in-production: "Эта сборка для разработчиков. Не используйте в продакшне."
user-suspended: "このユーザーは凍結されています。"
is-remote-user: "このユーザー情報はコピーです。"
@@ -260,6 +264,7 @@ common/views/components/media-banner.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
common/views/components/theme.vue:
theme: "テーマ"
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
@@ -276,6 +281,7 @@ common/views/components/theme.vue:
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Dark"
find-more-theme: "その他のテーマを入手"
theme-name: "テーマ名"
preview-created-theme: "プレビュー"
invalid-theme: "テーマが正しくありません。"
@@ -331,6 +337,7 @@ common/views/components/nav.vue:
common/views/components/note-menu.vue:
mention: "メンション"
detail: "詳細"
copy-content: "内容をコピー"
copy-link: "リンクをコピー"
favorite: "お気に入り"
unfavorite: "お気に入り解除"
@@ -849,6 +856,7 @@ desktop/views/components/settings.2fa.vue:
enter-password: "パスワードを入力してください"
authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
howtoinstall: "インストール方法はこちら"
token: "トークン"
scan: "次に、表示されているQRコードをスキャンします:"
done: "お使いのデバイスに表示されているトークンを入力して完了します:"
submit: "完了"
@@ -1432,7 +1440,6 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示"
notification-position-bottom: "下"
notification-position-top: "上"
theme: "テーマ"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
note-visibility: "投稿の公開範囲"

View File

@@ -109,7 +109,7 @@ common:
my-token-regenerated: "您的 Token 已被重置, 您将自动登出。"
i-like-sushi: "相比于布丁来说, 我更喜欢寿司。"
show-reversi-board-labels: "在 Reversi 中显示行和列表签"
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
verified-user: "认证用户"
disable-animated-mfm: "在帖子中禁用动画文本"
suggest-recent-hashtags: "在帖子表单上显示最近流行的主题标签"
@@ -120,6 +120,10 @@ common:
reduce-motion: "减弱UI中的动画效果"
this-setting-is-this-device-only: "设置仅在本设备中生效"
use-os-default-emojis: "使用设备系统默认的 emojis"
line-width: "線の太さ"
line-width-thin: "細い"
line-width-normal: "普通"
line-width-thick: "太い"
do-not-use-in-production: "这是一个开发者测试版. 请勿在生产环境中使用."
user-suspended: "このユーザーは凍結されています。"
is-remote-user: "该用户的信息已被复制."
@@ -260,6 +264,7 @@ common/views/components/media-banner.vue:
sensitive: "阅读注意"
click-to-show: "点击以显示"
common/views/components/theme.vue:
theme: "テーマ"
light-theme: "主题"
dark-theme: "黑暗模式主题"
light-themes: "明亮主题"
@@ -276,6 +281,7 @@ common/views/components/theme.vue:
base-theme: "基础主题"
base-theme-light: "亮"
base-theme-dark: "暗"
find-more-theme: "その他のテーマを入手"
theme-name: "主题名称"
preview-created-theme: "预览"
invalid-theme: "无效主题"
@@ -331,6 +337,7 @@ common/views/components/nav.vue:
common/views/components/note-menu.vue:
mention: "メンション"
detail: "详细信息"
copy-content: "内容をコピー"
copy-link: "复制链接"
favorite: "收藏这个投稿"
unfavorite: "取消收藏"
@@ -849,6 +856,7 @@ desktop/views/components/settings.2fa.vue:
enter-password: "请输入您的密码"
authenticator: "首先,您需要在设备上安装 Google Authenticator"
howtoinstall: "怎样安装"
token: "トークン"
scan: "然后,扫描二维码:"
done: "请输入显示在您设备上的密钥:"
submit: "提交"
@@ -1432,7 +1440,6 @@ mobile/views/pages/settings.vue:
notification-position: "通知形式"
notification-position-bottom: "底部"
notification-position-top: "顶部"
theme: "主题"
behavior: "动作"
fetch-on-scroll: "滚动无限加载"
note-visibility: "帖子可见性"

View File

@@ -1,8 +1,8 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "10.72.0",
"clientVersion": "2.0.13212",
"version": "10.75.0",
"clientVersion": "2.0.13368",
"codename": "nighthike",
"main": "./built/index.js",
"private": true,
@@ -20,8 +20,8 @@
"format": "gulp format"
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "1.2.8",
"@fortawesome/free-brands-svg-icons": "5.6.0",
"@fortawesome/fontawesome-svg-core": "1.2.12",
"@fortawesome/free-brands-svg-icons": "5.6.3",
"@fortawesome/free-regular-svg-icons": "5.5.0",
"@fortawesome/free-solid-svg-icons": "5.6.3",
"@fortawesome/vue-fontawesome": "0.1.2",
@@ -34,7 +34,7 @@
"@types/debug": "0.0.31",
"@types/deep-equal": "1.0.1",
"@types/double-ended-queue": "2.1.0",
"@types/elasticsearch": "5.0.29",
"@types/elasticsearch": "5.0.30",
"@types/file-type": "10.6.0",
"@types/gulp": "3.8.36",
"@types/gulp-mocha": "0.0.32",
@@ -46,7 +46,7 @@
"@types/is-url": "1.2.28",
"@types/js-yaml": "3.11.4",
"@types/katex": "0.5.0",
"@types/koa": "2.0.47",
"@types/koa": "2.0.48",
"@types/koa-bodyparser": "5.0.2",
"@types/koa-compress": "2.0.8",
"@types/koa-favicon": "2.0.19",
@@ -62,7 +62,7 @@
"@types/mocha": "5.2.5",
"@types/mongodb": "3.1.14",
"@types/ms": "0.7.30",
"@types/node": "10.12.10",
"@types/node": "10.12.18",
"@types/nodemailer": "4.6.5",
"@types/oauth": "0.9.1",
"@types/parsimmon": "1.10.0",
@@ -70,7 +70,7 @@
"@types/pug": "2.0.4",
"@types/qrcode": "1.3.0",
"@types/ratelimiter": "2.1.28",
"@types/redis": "2.8.8",
"@types/redis": "2.8.10",
"@types/request": "2.48.1",
"@types/request-promise-native": "1.0.15",
"@types/rimraf": "2.0.2",
@@ -87,7 +87,7 @@
"@types/websocket": "0.0.40",
"@types/ws": "6.0.1",
"animejs": "2.2.0",
"apexcharts": "2.4.2",
"apexcharts": "2.5.1",
"autobind-decorator": "2.4.0",
"autosize": "4.0.2",
"autwh": "0.1.0",
@@ -116,7 +116,7 @@
"eventemitter3": "3.1.0",
"feed": "2.0.2",
"file-loader": "2.0.0",
"file-type": "10.6.0",
"file-type": "10.7.0",
"fuckadblock": "3.2.1",
"gulp": "3.9.1",
"gulp-cssnano": "2.1.3",
@@ -156,17 +156,18 @@
"koa-views": "6.1.4",
"langmap": "0.0.16",
"loader-utils": "1.2.3",
"lookup-dns-cache": "2.1.0",
"minio": "7.0.2",
"mkdirp": "0.5.1",
"mocha": "5.2.0",
"moji": "0.5.1",
"moment": "2.22.2",
"moment": "2.23.0",
"mongodb": "3.1.10",
"monk": "6.0.6",
"ms": "2.1.1",
"nan": "2.12.1",
"nested-property": "0.0.7",
"nodemailer": "4.7.0",
"nodemailer": "5.0.0",
"nprogress": "0.2.0",
"object-assign-deep": "0.4.0",
"on-build-webpack": "0.1.0",
@@ -176,6 +177,7 @@
"portscanner": "2.2.0",
"postcss-loader": "3.0.0",
"progress-bar-webpack-plugin": "1.11.0",
"promise-any": "0.2.0",
"promise-limit": "2.7.0",
"promise-sequential": "1.1.1",
"pug": "2.0.3",
@@ -204,7 +206,7 @@
"summaly": "2.2.0",
"systeminformation": "3.52.2",
"syuilo-password-strength": "0.0.1",
"terser-webpack-plugin": "1.1.0",
"terser-webpack-plugin": "1.2.1",
"textarea-caret": "3.1.0",
"tinycolor2": "1.4.1",
"tmp": "0.0.33",
@@ -222,10 +224,10 @@
"vue-color": "2.7.0",
"vue-content-loading": "1.5.3",
"vue-cropperjs": "3.0.0",
"vue-i18n": "8.3.2",
"vue-i18n": "8.6.0",
"vue-js-modal": "1.3.28",
"vue-loader": "15.4.2",
"vue-marquee-text-component": "1.1.0",
"vue-marquee-text-component": "1.1.1",
"vue-router": "3.0.2",
"vue-sequential-entrance": "1.1.3",
"vue-style-loader": "4.1.2",
@@ -237,7 +239,7 @@
"vuex-persistedstate": "2.5.4",
"web-push": "3.3.3",
"webfinger.js": "2.7.0",
"webpack": "4.26.1",
"webpack": "4.28.3",
"webpack-cli": "3.1.2",
"websocket": "1.0.28",
"ws": "6.1.2",

View File

@@ -39,6 +39,7 @@
</div>
</div>
<div v-show="file._open">
<ui-input readonly :value="file.url"></ui-input>
<ui-horizon-group>
<ui-button @click="toggleSensitive(file)" v-if="file.isSensitive"><fa :icon="faEye"/> {{ $t('unmark-as-sensitive') }}</ui-button>
<ui-button @click="toggleSensitive(file)" v-else><fa :icon="faEyeSlash"/> {{ $t('mark-as-sensitive') }}</ui-button>

View File

@@ -6,6 +6,7 @@
<ui-input :value="host" readonly>{{ $t('host') }}</ui-input>
<ui-input v-model="name">{{ $t('instance-name') }}</ui-input>
<ui-textarea v-model="description">{{ $t('instance-description') }}</ui-textarea>
<ui-input v-model="mascotImageUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('logo-url') }}</ui-input>
<ui-input v-model="bannerUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('banner-url') }}</ui-input>
<ui-input v-model="errorImageUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('error-image-url') }}</ui-input>
<ui-input v-model="languages"><i slot="icon"><fa icon="language"/></i>{{ $t('languages') }}<span slot="desc">{{ $t('languages-desc') }}</span></ui-input>
@@ -53,7 +54,7 @@
</ui-horizon-group>
<ui-horizon-group inputs>
<ui-input v-model="smtpUser" :disabled="!enableEmail">{{ $t('smtp-user') }}</ui-input>
<ui-input v-model="smtpPass" :disabled="!enableEmail">{{ $t('smtp-pass') }}</ui-input>
<ui-input v-model="smtpPass" type="password" :withPasswordToggle="true" :disabled="!enableEmail">{{ $t('smtp-pass') }}</ui-input>
</ui-horizon-group>
<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<span slot="desc">{{ $t('smtp-secure-info') }}</span></ui-switch>
</section>
@@ -149,6 +150,7 @@ export default Vue.extend({
maintainerEmail: null,
disableRegistration: false,
disableLocalTimeline: false,
mascotImageUrl: null,
bannerUrl: null,
errorImageUrl: null,
name: null,
@@ -196,6 +198,7 @@ export default Vue.extend({
this.maintainerEmail = meta.maintainer.email;
this.disableRegistration = meta.disableRegistration;
this.disableLocalTimeline = meta.disableLocalTimeline;
this.mascotImageUrl = meta.mascotImageUrl;
this.bannerUrl = meta.bannerUrl;
this.errorImageUrl = meta.errorImageUrl;
this.name = meta.name;
@@ -253,6 +256,7 @@ export default Vue.extend({
maintainerEmail: this.maintainerEmail,
disableRegistration: this.disableRegistration,
disableLocalTimeline: this.disableLocalTimeline,
mascotImageUrl: this.mascotImageUrl,
bannerUrl: this.bannerUrl,
errorImageUrl: this.errorImageUrl,
name: this.name,

View File

@@ -6,7 +6,8 @@
<ui-input v-model="username" type="text">
<span slot="prefix">@</span>
</ui-input>
<ui-button @click="add" :disabled="adding">{{ $t('add-moderator.add') }}</ui-button>
<ui-button @click="add" :disabled="changing">{{ $t('add-moderator.add') }}</ui-button>
<ui-button @click="remove" :disabled="changing">{{ $t('add-moderator.remove') }}</ui-button>
</section>
</ui-card>
</div>
@@ -23,13 +24,13 @@ export default Vue.extend({
data() {
return {
username: '',
adding: false
changing: false
};
},
methods: {
async add() {
this.adding = true;
this.changing = true;
const process = async () => {
const user = await this.$root.api('users/show', parseAcct(this.username));
@@ -47,7 +48,29 @@ export default Vue.extend({
});
});
this.adding = false;
this.changing = false;
},
async remove() {
this.changing = true;
const process = async () => {
const user = await this.$root.api('users/show', parseAcct(this.username));
await this.$root.api('admin/moderators/remove', { userId: user.id });
this.$root.dialog({
type: 'success',
text: this.$t('add-moderator.removed')
});
};
await process().catch(e => {
this.$root.dialog({
type: 'error',
text: e.toString()
});
});
this.changing = false;
},
}
});

View File

@@ -31,6 +31,14 @@
<option value="-updatedAt">{{ $t('users.sort.updatedAtAsc') }}</option>
<option value="+updatedAt">{{ $t('users.sort.updatedAtDesc') }}</option>
</ui-select>
<ui-select v-model="state">
<span slot="label">{{ $t('users.state.title') }}</span>
<option value="all">{{ $t('users.state.all') }}</option>
<option value="admin">{{ $t('users.state.admin') }}</option>
<option value="moderator">{{ $t('users.state.moderator') }}</option>
<option value="verified">{{ $t('users.state.verified') }}</option>
<option value="suspended">{{ $t('users.state.suspended') }}</option>
</ui-select>
<ui-select v-model="origin">
<span slot="label">{{ $t('users.origin.title') }}</span>
<option value="combined">{{ $t('users.origin.combined') }}</option>
@@ -39,7 +47,7 @@
</ui-select>
</ui-horizon-group>
<sequential-entrance animation="entranceFromTop" delay="25">
<div class="kofvwchc" v-for="user in users">
<div class="kofvwchc" v-for="user in users" :key="user.id">
<div>
<a :href="user | userPage(null, true)">
<mk-avatar class="avatar" :user="user" :disable-link="true"/>
@@ -49,6 +57,10 @@
<header>
<b><mk-user-name :user="user"/></b>
<span class="username">@{{ user | acct }}</span>
<span class="is-admin" v-if="user.isAdmin">admin</span>
<span class="is-moderator" v-if="user.isModerator">moderator</span>
<span class="is-verified" v-if="user.isVerified" :title="$t('@.verified-user')"><fa icon="star"/></span>
<span class="is-suspended" v-if="user.isSuspended" :title="$t('@.suspended-user')"><fa :icon="faSnowflake"/></span>
</header>
<div>
<span>{{ $t('users.updatedAt') }}: <mk-time :time="user.updatedAt" mode="detail"/></span>
@@ -84,6 +96,7 @@ export default Vue.extend({
suspending: false,
unsuspending: false,
sort: '+createdAt',
state: 'all',
origin: 'combined',
limit: 10,
offset: 0,
@@ -100,6 +113,12 @@ export default Vue.extend({
this.fetchUsers();
},
state() {
this.users = [];
this.offset = 0;
this.fetchUsers();
},
origin() {
this.users = [];
this.offset = 0;
@@ -236,7 +255,8 @@ export default Vue.extend({
},
fetchUsers() {
this.$root.api('users', {
this.$root.api('admin/show-users', {
state: this.state,
origin: this.origin,
sort: this.sort,
offset: this.offset,
@@ -284,4 +304,19 @@ export default Vue.extend({
margin-left 8px
opacity 0.7
> .is-admin
> .is-moderator
flex-shrink 0
align-self center
margin 0 0 0 .5em
padding 1px 6px
font-size 80%
border-radius 3px
background var(--noteHeaderAdminBg)
color var(--noteHeaderAdminFg)
> .is-verified
> .is-suspended
margin 0 0 0 .5em
color #4dabf7
</style>

View File

@@ -2,6 +2,7 @@
<span class="mk-acct">
<span class="name">@{{ user.username }}</span>
<span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="user.host || detail || $store.state.settings.showFullAcct">@{{ user.host || host }}</span>
<fa v-if="user.isLocked == true" class="locked" icon="lock" fixed-width/>
</span>
</template>
@@ -23,4 +24,8 @@ export default Vue.extend({
.mk-acct
> .host.fade
opacity 0.5
> .locked
opacity 0.8
margin-left 0.5em
</style>

View File

@@ -18,7 +18,7 @@
<span class="visibility" v-if="note.visibility != 'public'">
<fa v-if="note.visibility == 'home'" icon="home"/>
<fa v-if="note.visibility == 'followers'" icon="unlock"/>
<fa v-if="note.visibility == 'specified'" icon="lock"/>
<fa v-if="note.visibility == 'specified'" icon="envelope"/>
</span>
<span class="localOnly" v-if="note.localOnly == true"><fa icon="heart"/></span>
</div>

View File

@@ -29,6 +29,10 @@ export default Vue.extend({
icon: 'info-circle',
text: this.$t('detail'),
action: this.detail
}], [{
icon: 'align-left',
text: this.$t('copy-content'),
action: this.copyContent
}], [{
icon: 'link',
text: this.$t('copy-link'),
@@ -81,6 +85,10 @@ export default Vue.extend({
this.$router.push(`/notes/${this.note.id}`);
},
copyContent() {
copyToClipboard(this.note.text);
},
copyLink() {
copyToClipboard(`${url}/notes/${this.note.id}`);
},

View File

@@ -13,7 +13,7 @@
<span class="visibility" v-if="note.visibility != 'public'">
<fa v-if="note.visibility == 'home'" icon="home"/>
<fa v-if="note.visibility == 'followers'" icon="unlock"/>
<fa v-if="note.visibility == 'specified'" icon="lock"/>
<fa v-if="note.visibility == 'specified'" icon="envelope"/>
</span>
<span class="localOnly" v-if="note.localOnly == true"><fa icon="heart"/></span>
</div>

View File

@@ -6,7 +6,7 @@
<span slot="prefix">@</span>
<span slot="suffix">@{{ host }}</span>
</ui-input>
<ui-input v-model="password" type="password" required styl="fill">
<ui-input v-model="password" type="password" :with-password-toggle="true" required styl="fill">
<span>{{ $t('password') }}</span>
<span slot="prefix"><fa icon="lock"/></span>
</ui-input>

View File

@@ -1,5 +1,5 @@
<template>
<div class="vnxwkwuf" :class="{ inputs, noGrow }">
<div class="vnxwkwuf" :class="{ inputs, noGrow }" :data-children-count="children">
<slot></slot>
</div>
</template>
@@ -21,6 +21,16 @@ export default Vue.extend({
required: false,
default: false
}
},
data() {
return {
children: 0
};
},
mounted() {
this.$nextTick(() => {
this.children = this.$slots.default.length;
});
}
});
</script>
@@ -48,4 +58,19 @@ export default Vue.extend({
> *:not(:last-child)
margin-right 16px !important
&[data-children-count="3"]
@media (max-width 600px)
display block
> *
display block
width 100% !important
margin 16px 0 !important
&:first-child
margin-top 0 !important
&:last-child
margin-bottom 0 !important
</style>

View File

@@ -39,6 +39,12 @@
</template>
<div class="suffix" ref="suffix"><slot name="suffix"></slot></div>
</div>
<div class="toggle" v-if="withPasswordToggle">
<a @click='togglePassword'>
<span v-if="type == 'password'"><fa :icon="['fa', 'eye']"/> {{ $t('@.show-password') }}</span>
<span v-if="type != 'password'"><fa :icon="['far', 'eye-slash']"/> {{ $t('@.hide-password') }}</span>
</a>
</div>
<div class="desc"><slot name="desc"></slot></div>
</div>
</template>
@@ -97,6 +103,11 @@ export default Vue.extend({
required: false,
default: false
},
withPasswordToggle: {
type: Boolean,
required: false,
default: false
},
inline: {
type: Boolean,
required: false,
@@ -178,6 +189,13 @@ export default Vue.extend({
focus() {
this.$refs.input.focus();
},
togglePassword() {
if (this.type == 'password') {
this.type = 'text'
} else {
this.type = 'password'
}
},
chooseFile() {
this.$refs.file.click();
},
@@ -356,6 +374,17 @@ root(fill)
if fill
padding-right 12px
> .toggle
cursor pointer
padding-left 0.5em
font-size 0.7em
opacity 0.7
text-align left
> a
color var(--inputLabel)
text-decoration none
> .desc
margin 6px 0
font-size 13px

View File

@@ -25,7 +25,6 @@ export default Vue.extend({
},
props: {
model: {
type: String,
required: false
},
value: {
@@ -65,10 +64,10 @@ export default Vue.extend({
&.checked
> .button
border-color var(--primary)
border-color var(--radioActive)
&:after
background-color var(--primary)
background-color var(--radioActive)
transform scale(1)
opacity 1

View File

@@ -77,11 +77,11 @@ export default Vue.extend({
&.checked
> .button
background-color var(--primaryAlpha04)
border-color var(--primaryAlpha04)
background-color var(--switchActiveTrack)
border-color var(--switchActiveTrack)
> *
background-color var(--primary)
background-color var(--switchActive)
transform translateX(14px)
> input

View File

@@ -8,16 +8,16 @@
</blockquote>
</div>
<div v-else class="mk-url-preview">
<a :class="{ mini }" :href="url" target="_blank" :title="url" v-if="!fetching">
<a :class="{ mini, compact }" :href="url" target="_blank" :title="url" v-if="!fetching">
<div class="thumbnail" v-if="thumbnail" :style="`background-image: url(${thumbnail})`"></div>
<article>
<header>
<h1>{{ title }}</h1>
<h1 :title="title">{{ title }}</h1>
</header>
<p v-if="description">{{ description.length > 85 ? description.slice(0, 85) + '…' : description }}</p>
<p v-if="description" :title="description">{{ description.length > 85 ? description.slice(0, 85) + '…' : description }}</p>
<footer>
<img class="icon" v-if="icon" :src="icon"/>
<p>{{ sitename }}</p>
<p :title="sitename">{{ sitename }}</p>
</footer>
</article>
</a>
@@ -120,6 +120,12 @@ export default Vue.extend({
default: false
},
compact: {
type: Boolean,
required: false,
default: false
},
mini: {
type: Boolean,
required: false,
@@ -302,6 +308,23 @@ export default Vue.extend({
width 12px
height 12px
&.compact
> .thumbnail
position: absolute
width 56px
height 100%
> article
left 56px
width calc(100% - 56px)
padding 4px
> header
margin-bottom 2px
> footer
margin-top 2px
&.mini
font-size 10px
@@ -325,4 +348,27 @@ export default Vue.extend({
width 12px
height 12px
&.compact
> .thumbnail
position: absolute
width 56px
height 100%
> article
left 56px
width calc(100% - 56px)
padding 4px
> header
margin-bottom 2px
> footer
margin-top 2px
&.compact
> article
> header h1, p, footer
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
</style>

View File

@@ -23,7 +23,7 @@
</div>
</div>
<div @click="choose('specified')" :class="{ active: v == 'specified' }">
<div><fa icon="lock"/></div>
<div><fa icon="envelope"/></div>
<div>
<span>{{ $t('specified') }}</span>
<span>{{ $t('specified-desc') }}</span>

View File

@@ -32,7 +32,7 @@
<span class="visibility" v-if="appearNote.visibility != 'public'">
<fa v-if="appearNote.visibility == 'home'" icon="home"/>
<fa v-if="appearNote.visibility == 'followers'" icon="unlock"/>
<fa v-if="appearNote.visibility == 'specified'" icon="lock"/>
<fa v-if="appearNote.visibility == 'specified'" icon="envelope"/>
</span>
<span class="localOnly" v-if="appearNote.localOnly == true"><fa icon="heart"/></span>
</div>
@@ -70,7 +70,7 @@
<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"/>
<fa icon="retweet"/><p class="count" v-if="appearNote.renoteCount > 0">{{ appearNote.renoteCount }}</p>
</button>
<button v-else class="inhibitedButton">
<fa icon="ban"/>

View File

@@ -36,7 +36,7 @@
<mk-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/>
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> 位置情報</a>
<div class="renote" v-if="appearNote.renote"><mk-note-preview :note="appearNote.renote" :mini="mini"/></div>
<mk-url-preview v-for="url in urls" :url="url" :key="url" :mini="mini"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url" :mini="mini" :compact="compact"/>
</div>
</div>
<footer v-if="appearNote.deletedAt == null">
@@ -48,7 +48,7 @@
<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"/>
<fa icon="retweet"/><p class="count" v-if="appearNote.renoteCount > 0">{{ appearNote.renoteCount }}</p>
</button>
<button v-else class="inhibitedButton">
<fa icon="ban"/>
@@ -102,6 +102,11 @@ export default Vue.extend({
required: false,
default: false
},
compact: {
type: Boolean,
required: false,
default: false
},
mini: {
type: Boolean,
required: false,

View File

@@ -15,7 +15,7 @@
<!-- トランジションを有効にするとなぜかメモリリークする -->
<component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notes" class="notes transition" tag="div" ref="notes">
<template v-for="(note, i) in _notes">
<x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)" ref="note"/>
<x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)" :compact="true" ref="note"/>
<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
<span><fa icon="angle-up"/>{{ note._datetext }}</span>
<span><fa icon="angle-down"/>{{ _notes[i + 1]._datetext }}</span>

View File

@@ -50,7 +50,7 @@
<span v-if="visibility === 'public'"><fa icon="globe"/></span>
<span v-if="visibility === 'home'"><fa icon="home"/></span>
<span v-if="visibility === 'followers'"><fa icon="unlock"/></span>
<span v-if="visibility === 'specified'"><fa icon="lock"/></span>
<span v-if="visibility === 'specified'"><fa icon="envelope"/></span>
</button>
<p class="text-count" :class="{ over: trimmedLength(text) > maxNoteTextLength }">{{ maxNoteTextLength - trimmedLength(text) }}</p>
<ui-button primary :wait="posting" class="submit" :disabled="!canPost" @click="post">
@@ -77,6 +77,7 @@ import extractMentions from '../../../../../misc/extract-mentions';
export default Vue.extend({
i18n: i18n('desktop/views/components/post-form.vue'),
components: {
XDraggable,
MkVisibilityChooser
@@ -197,11 +198,11 @@ export default Vue.extend({
const mention = x.host ? `@${x.username}@${toASCII(x.host)}` : `@${x.username}`;
// 自分は除外
if (this.$store.state.i.username == x.username && x.host == null) return;
if (this.$store.state.i.username == x.username && x.host == host) return;
if (this.$store.state.i.username == x.username && x.host == null) continue;
if (this.$store.state.i.username == x.username && x.host == host) continue;
// 重複は除外
if (this.text.indexOf(`${mention} `) != -1) return;
if (this.text.indexOf(`${mention} `) != -1) continue;
this.text += `${mention} `;
}
@@ -221,6 +222,12 @@ export default Vue.extend({
});
}
// keep cw when reply
if (this.reply && this.reply.cw != null) {
this.useCw = true;
this.cw = this.reply.cw;
}
this.$nextTick(() => {
// 書きかけの投稿を復元
if (!this.instant && !this.mention) {

View File

@@ -21,7 +21,14 @@ import i18n from '../../../i18n';
export default Vue.extend({
i18n: i18n('desktop/views/components/renote-form.vue'),
props: ['note'],
props: {
note: {
type: Object,
required: true
}
},
data() {
return {
wait: false,
@@ -29,6 +36,7 @@ export default Vue.extend({
visibility: this.$store.state.settings.defaultNoteVisibility
};
},
methods: {
ok(v: string) {
this.wait = true;
@@ -44,9 +52,11 @@ export default Vue.extend({
this.wait = false;
});
},
cancel() {
this.$emit('canceled');
},
onQuote() {
this.quote = true;
@@ -54,6 +64,7 @@ export default Vue.extend({
(this.$refs.form as any).focus();
});
},
onChildFormPosted() {
this.$emit('posted');
}

View File

@@ -414,8 +414,8 @@ export default Vue.extend({
},
lineWidth: {
get() { return this.$store.state.settings.lineWidth; },
set(value) { this.$store.dispatch('settings/set', { key: 'lineWidth', value }); }
get() { return this.$store.state.device.lineWidth; },
set(value) { this.$store.commit('device/set', { key: 'lineWidth', value }); }
},
fetchOnScroll: {

View File

@@ -207,7 +207,7 @@ export default Vue.extend({
top -4px
right 4px
font-size 10px
color var(--primary)
color var(--notificationIndicator)
&:hover
color var(--faceTextButtonHover)

View File

@@ -147,7 +147,7 @@ export default Vue.extend({
> [data-icon]:last-child
margin-left 5px
font-size 10px
color var(--primary)
color var(--notificationIndicator)
@media (max-width 1100px)
margin-left -5px

View File

@@ -90,7 +90,7 @@ export default Vue.extend({
margin-left -5px
vertical-align super
font-size 10px
color var(--primary)
color var(--notificationIndicator)
> .pop
$bgcolor = var(--face)

View File

@@ -7,7 +7,8 @@
<router-link :to="user | userPage" class="name">
<mk-user-name :user="user"/>
</router-link>
<span class="username">@{{ user | acct }}</span>
<span class="username">@{{ user | acct }} <fa v-if="user.isLocked == true" class="locked" icon="lock" fixed-width/></span>
<div class="description">
<misskey-flavored-markdown v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
</div>
@@ -75,6 +76,9 @@ export default Vue.extend({
display block
opacity 0.7
> .locked
opacity 0.8
> .description
margin 8px 0 16px 0

View File

@@ -18,6 +18,7 @@
:key="note.id"
@update:note="onNoteUpdated(i, $event)"
:media-view="mediaView"
:compact="true"
:mini="true"/>
<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
<span><fa icon="angle-up"/>{{ note._datetext }}</span>

View File

@@ -19,7 +19,7 @@
<span class="name">
<mk-user-name :user="user"/>
</span>
<span class="acct">@{{ user | acct }}</span>
<span class="acct">@{{ user | acct }} <fa v-if="user.isLocked == true" class="locked" icon="lock" fixed-width/></span>
</div>
</header>
<div class="info">
@@ -169,6 +169,7 @@ export default Vue.extend({
this.$root.api('users/notes', {
userId: this.user.id,
fileType: image,
excludeNsfw: !this.$store.state.device.alwaysShowNsfw,
limit: 9,
untilDate: new Date().getTime() + 1000 * 86400 * 365
}).then(notes => {
@@ -411,6 +412,9 @@ export default Vue.extend({
opacity 0.7
text-shadow 0 0 8px #000
> .locked
opacity 0.8
> .info
padding 16px
font-size 12px

View File

@@ -29,9 +29,11 @@ export default Vue.extend({
'image/png',
'image/gif'
];
this.$root.api('users/notes', {
userId: this.user.id,
fileType: image,
excludeNsfw: !this.$store.state.device.alwaysShowNsfw,
limit: 9,
untilDate: new Date().getTime() + 1000 * 86400 * 365
}).then(notes => {

View File

@@ -35,7 +35,7 @@
<span class="signin" @click="signin">{{ $t('signin') }}</span>
</p>
<img src="/assets/ai.png" alt="" title="藍" class="char">
<img :src="meta.mascotImageUrl" alt="" title="藍" class="char">
</div>
</div>

View File

@@ -124,6 +124,7 @@ import {
faMapMarker,
faRobot,
faHourglassHalf,
faAlignLeft
} from '@fortawesome/free-solid-svg-icons';
import {
@@ -255,6 +256,7 @@ library.add(
faMapMarker,
faRobot,
faHourglassHalf,
faAlignLeft,
farBell,
farEnvelope,
@@ -414,11 +416,11 @@ export default (callback: (launch: (router: VueRouter) => [Vue, MiOS]) => void,
//#endregion
//#region line width
document.documentElement.style.setProperty('--lineWidth', `${os.store.state.settings.lineWidth}px`);
document.documentElement.style.setProperty('--lineWidth', `${os.store.state.device.lineWidth}px`);
os.store.watch(s => {
return s.settings.lineWidth;
return s.device.lineWidth;
}, v => {
document.documentElement.style.setProperty('--lineWidth', `${os.store.state.settings.lineWidth}px`);
document.documentElement.style.setProperty('--lineWidth', `${os.store.state.device.lineWidth}px`);
});
//#endregion

View File

@@ -37,6 +37,7 @@
</div>
<div class="menu">
<div>
<ui-input readonly :value="file.url">URL</ui-input>
<ui-button link :href="`${file.url}?download`" :download="file.name"><fa icon="download"/> {{ $t('download') }}</ui-button>
<ui-button @click="rename"><fa icon="pencil-alt"/> {{ $t('rename') }}</ui-button>
<ui-button @click="move"><fa :icon="['far', 'folder-open']"/> {{ $t('move') }}</ui-button>
@@ -200,7 +201,7 @@ export default Vue.extend({
color #bf4633
> .menu
padding 14px
padding 0 14px 14px 14px
border-top solid 1px var(--faceDivider)
> div

View File

@@ -54,7 +54,7 @@
<span class="visibility" v-if="appearNote.visibility != 'public'">
<fa v-if="appearNote.visibility == 'home'" icon="home"/>
<fa v-if="appearNote.visibility == 'followers'" icon="unlock"/>
<fa v-if="appearNote.visibility == 'specified'" icon="lock"/>
<fa v-if="appearNote.visibility == 'specified'" icon="envelope"/>
</span>
<span class="localOnly" v-if="appearNote.localOnly == true"><fa icon="heart"/></span>
</div>
@@ -66,7 +66,7 @@
<p class="count" v-if="appearNote.repliesCount > 0">{{ appearNote.repliesCount }}</p>
</button>
<button v-if="['public', 'home'].includes(appearNote.visibility)" @click="renote()" title="Renote">
<fa icon="retweet"/>
<fa icon="retweet"/><p class="count" v-if="appearNote.renoteCount > 0">{{ appearNote.renoteCount }}</p>
</button>
<button v-else>
<fa icon="ban"/>

View File

@@ -30,7 +30,7 @@
<mk-media-list :media-list="appearNote.files"/>
</div>
<mk-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url" :compact="compact"/>
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a>
<div class="renote" v-if="appearNote.renote"><mk-note-preview :note="appearNote.renote"/></div>
</div>
@@ -44,7 +44,7 @@
<p class="count" v-if="appearNote.repliesCount > 0">{{ appearNote.repliesCount }}</p>
</button>
<button v-if="['public', 'home'].includes(appearNote.visibility)" @click="renote()" title="Renote">
<fa icon="retweet"/>
<fa icon="retweet"/><p class="count" v-if="appearNote.renoteCount > 0">{{ appearNote.renoteCount }}</p>
</button>
<button v-else>
<fa icon="ban"/>
@@ -90,6 +90,11 @@ export default Vue.extend({
note: {
type: Object,
required: true
},
compact: {
type: Boolean,
required: false,
default: false
}
}
});

View File

@@ -15,7 +15,7 @@
<!-- トランジションを有効にするとなぜかメモリリークする -->
<component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notes" class="transition" tag="div">
<template v-for="(note, i) in _notes">
<mk-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/>
<mk-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)" :compact="true"/>
<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
<span><fa icon="angle-up"/>{{ note._datetext }}</span>
<span><fa icon="angle-down"/>{{ _notes[i + 1]._datetext }}</span>

View File

@@ -41,7 +41,7 @@
<span v-if="visibility === 'public'"><fa icon="globe"/></span>
<span v-if="visibility === 'home'"><fa icon="home"/></span>
<span v-if="visibility === 'followers'"><fa icon="unlock"/></span>
<span v-if="visibility === 'specified'"><fa icon="lock"/></span>
<span v-if="visibility === 'specified'"><fa icon="envelope"/></span>
</button>
</footer>
<input ref="file" class="file" type="file" multiple="multiple" @change="onChangeFile"/>
@@ -187,11 +187,11 @@ export default Vue.extend({
const mention = x.host ? `@${x.username}@${toASCII(x.host)}` : `@${x.username}`;
// 自分は除外
if (this.$store.state.i.username == x.username && x.host == null) return;
if (this.$store.state.i.username == x.username && x.host == host) return;
if (this.$store.state.i.username == x.username && x.host == null) continue;
if (this.$store.state.i.username == x.username && x.host == host) continue;
// 重複は除外
if (this.text.indexOf(`${mention} `) != -1) return;
if (this.text.indexOf(`${mention} `) != -1) continue;
this.text += `${mention} `;
}
@@ -211,6 +211,12 @@ export default Vue.extend({
});
}
// keep cw when reply
if (this.reply && this.reply.cw != null) {
this.useCw = true;
this.cw = this.reply.cw;
}
this.focus();
this.$nextTick(() => {

View File

@@ -159,7 +159,7 @@ export default Vue.extend({
left 8px
pointer-events none
font-size 10px
color var(--primary)
color var(--notificationIndicator)
> button:last-child
display block

View File

@@ -238,7 +238,7 @@ export default Vue.extend({
> i.circle
margin-left 6px
font-size 10px
color var(--primary)
color var(--notificationIndicator)
> i:last-child
position absolute

View File

@@ -225,7 +225,7 @@ main
> .badge
margin-left 6px
font-size 10px
color var(--primary)
color var(--notificationIndicator)
> .tl
max-width 680px
@@ -248,7 +248,7 @@ main
.badge
margin-left 6px
font-size 10px
color var(--primary)
color var(--notificationIndicator)
vertical-align middle
</style>

View File

@@ -267,8 +267,8 @@ export default Vue.extend({
},
lineWidth: {
get() { return this.$store.state.settings.lineWidth; },
set(value) { this.$store.dispatch('settings/set', { key: 'lineWidth', value }); }
get() { return this.$store.state.device.lineWidth; },
set(value) { this.$store.commit('device/set', { key: 'lineWidth', value }); }
},
contrastedAcct: {

View File

@@ -34,6 +34,7 @@ export default Vue.extend({
this.$root.api('users/notes', {
userId: this.user.id,
fileType: image,
excludeNsfw: !this.$store.state.device.alwaysShowNsfw,
limit: 9,
untilDate: new Date().getTime() + 1000 * 86400 * 365
}).then(notes => {

View File

@@ -21,7 +21,6 @@ const defaultSettings = {
showClockOnHeader: true,
useShadow: true,
roundedCorners: false,
lineWidth: 1,
circleIcons: true,
contrastedAcct: true,
showFullAcct: false,
@@ -53,6 +52,7 @@ const defaultDeviceSettings = {
darkmode: false,
darkTheme: 'dark',
lightTheme: 'light',
lineWidth: 1,
themes: [],
enableSounds: true,
soundVolume: 0.5,

View File

@@ -20,8 +20,9 @@ export const japaneseSushiSetTheme: Theme = require('../theme/japanese-sushi-set
export const gruvboxDarkTheme: Theme = require('../theme/gruvbox-dark.json5');
export const monokaiTheme: Theme = require('../theme/monokai.json5');
export const colorfulTheme: Theme = require('../theme/colorful.json5');
export const naturalTheme: Theme = require('../theme/natural.json5');
export const rainyTheme: Theme = require('../theme/rainy.json5');
export const mauveTheme: Theme = require('../theme/mauve.json5');
export const grayTheme: Theme = require('../theme/gray.json5');
export const builtinThemes = [
lightTheme,
@@ -34,8 +35,9 @@ export const builtinThemes = [
gruvboxDarkTheme,
monokaiTheme,
colorfulTheme,
naturalTheme,
rainyTheme,
mauveTheme,
grayTheme,
];
export function applyTheme(theme: Theme, persisted = true) {

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

View File

@@ -22,7 +22,7 @@ html, body
a
text-decoration none
color var(--primary)
color var(--link)
cursor pointer
&:hover
@@ -33,7 +33,7 @@ a
@css {
a {
tap-highlight-color: var(--primaryAlpha07) !important;
-webkit-tap-highlight-color: var(--primaryAlpha07) !important;
tap-highlight-color: var(--linkTapHighlight) !important;
-webkit-tap-highlight-color: var(--linkTapHighlight) !important;
}
}

View File

@@ -16,5 +16,6 @@
renoteGradient: '#ffe1c7',
renoteText: '$primary',
quoteBorder: '$primary',
mfmMention: '#56907b',
},
}

View File

@@ -24,6 +24,15 @@
scrollbarHandle: ':lighten<5<$secondary',
scrollbarHandleHover: ':lighten<10<$secondary',
link: '$primary',
linkTapHighlight: ':alpha<0.7<@link',
notificationIndicator: '$primary',
switchActive: '$primary',
switchActiveTrack: ':alpha<0.4<@switchActive',
radioActive: '$primary',
face: '$secondary',
faceText: '#fff',
faceHeader: ':lighten<5<$secondary',

View File

@@ -0,0 +1,21 @@
{
id: '56ff14eb-1e6d-4c0c-9e84-71eb156234e5',
name: 'Gray',
author: 'syuilo',
base: 'light',
vars: {
primary: '#C03233',
secondary: 'rgb(213, 213, 213)',
text: 'rgb(102, 102, 102)',
},
props: {
renoteGradient: '#bdbdbd',
renoteText: '$primary',
quoteBorder: '$primary',
desktopPostFormBg: '#ececec',
},
}

View File

@@ -20,6 +20,10 @@
mfmMentionForeground: '#fff',
mfmUrl: 'rgb(69, 133, 136)',
mfmLink: 'rgb(104, 157, 106)',
mfmHashtag: 'rgb(204, 36, 29)'
mfmHashtag: 'rgb(251, 73, 52)',
notificationIndicator: 'rgb(184, 187, 38)',
switchActive: 'rgb(254, 128, 25)',
radioActive: 'rgb(131, 165, 152)',
link: 'rgb(104, 157, 106)',
},
}

View File

@@ -24,6 +24,15 @@
scrollbarHandle: '#00000033',
scrollbarHandleHover: '#00000066',
link: '$primary',
linkTapHighlight: ':alpha<0.7<@link',
notificationIndicator: '$primary',
switchActive: '$primary',
switchActiveTrack: ':alpha<0.4<@switchActive',
radioActive: '$primary',
face: '$secondary',
faceText: '$text',
faceHeader: ':lighten<5<$secondary',

View File

@@ -20,6 +20,10 @@
mfmMentionForeground: '#fff',
mfmUrl: '#66d9ef',
mfmLink: '#e6db74',
mfmHashtag: '#fd971f'
mfmHashtag: '#fd971f',
notificationIndicator: '#66d9ef',
switchActive: 'rgb(166, 226, 46)',
radioActive: '#fd971f',
link: '#e6db74',
},
}

View File

@@ -1,23 +0,0 @@
{
id: 'b4b7d5fc-08d0-4915-b1cf-4090771e1a84',
name: 'Natural',
author: 'syuilo',
base: 'light',
vars: {
primary: 'rgb(0, 179, 104)',
secondary: '#fef8ec',
text: 'rgb(136, 132, 119)',
},
props: {
bg: 'rgb(248, 239, 221)',
mfmMention: 'rgb(238, 150, 43)',
mfmMentionForeground: '#fff',
mfmUrl: 'rgb(0, 189, 214)',
mfmLink: 'rgb(255, 87, 146)',
mfmHashtag: 'rgb(179, 134, 0)'
},
}

View File

@@ -0,0 +1,20 @@
{
id: '2058b33e-5127-4e63-ae67-a900f3a11723',
name: 'Rainy',
author: 'syuilo',
base: 'light',
vars: {
primary: 'rgb(100, 184, 193)',
secondary: 'rgb(228, 234, 234)',
text: 'rgb(85, 94, 92)',
},
props: {
renoteGradient: '#bcd0d0',
renoteText: '$primary',
quoteBorder: '$primary',
},
}

View File

@@ -1,3 +1,3 @@
{
"copyright": "Copyright (c) 2014-2018 syuilo"
"copyright": "Copyright (c) 2014-2019 syuilo"
}

View File

@@ -19,6 +19,7 @@ const defaultMeta: any = {
enableExternalUserRecommendation: false,
externalUserRecommendationEngine: 'https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}',
externalUserRecommendationTimeout: 300000,
mascotImageUrl: '/assets/ai.png',
errorImageUrl: 'https://ai.misskey.xyz/aiart/yubitun.png',
enableServiceWorker: false
};

View File

@@ -185,6 +185,7 @@ export type IMeta = {
disableRegistration?: boolean;
disableLocalTimeline?: boolean;
hidedTags?: string[];
mascotImageUrl?: string;
bannerUrl?: string;
errorImageUrl?: string;

View File

@@ -372,7 +372,14 @@ export const pack = async (
//#endregion
if (_note.user.isCat && _note.text) {
_note.text = _note.text.replace(/な/g, 'にゃ').replace(/ナ/g, 'ニャ').replace(/ナ/g, 'ニャ');
_note.text = (_note.text
// ja-JP
.replace(/な/g, 'にゃ').replace(/ナ/g, 'ニャ').replace(/ナ/g, 'ニャ')
// ko-KR
.replace(/[나-낳]/g, (match: string) => String.fromCharCode(
match.codePointAt(0) + '냐'.charCodeAt(0) - '나'.charCodeAt(0)
))
);
}
if (!opts.skipHide) {

View File

@@ -376,6 +376,8 @@ export async function updatePerson(uri: string, resolver?: Resolver, hint?: obje
$set: {
'_follower.sharedInbox': person.sharedInbox || (person.endpoints ? person.endpoints.sharedInbox : undefined)
}
}, {
multi: true
});
await updateFeatured(exist._id).catch(err => console.log(err));

View File

@@ -3,6 +3,8 @@ const { sign } = require('http-signature');
import { URL } from 'url';
import * as debug from 'debug';
const crypto = require('crypto');
const { lookup } = require('lookup-dns-cache');
const promiseAny = require('promise-any');
import config from '../../config';
import { ILocalUser } from '../../models/user';
@@ -10,12 +12,12 @@ import { publishApLogStream } from '../../stream';
const log = debug('misskey:activitypub:deliver');
export default (user: ILocalUser, url: string, object: any) => new Promise((resolve, reject) => {
export default (user: ILocalUser, url: string, object: any) => new Promise(async (resolve, reject) => {
log(`--> ${url}`);
const timeout = 10 * 1000;
const { protocol, hostname, port, pathname, search } = new URL(url);
const { protocol, host, hostname, port, pathname, search } = new URL(url);
const data = JSON.stringify(object);
@@ -23,14 +25,19 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso
sha256.update(data);
const hash = sha256.digest('base64');
const addr = await resolveAddr(hostname).catch(e => reject(e));
if (!addr) return;
const req = request({
protocol,
hostname,
hostname: addr,
setHost: false,
port,
method: 'POST',
path: pathname + search,
timeout,
headers: {
'Host': host,
'User-Agent': config.user_agent,
'Content-Type': 'application/activity+json',
'Digest': `SHA-256=${hash}`
@@ -75,3 +82,23 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso
});
//#endregion
});
/**
* Resolve host (with cached, asynchrony)
*/
async function resolveAddr(domain: string) {
// v4/v6で先に取得できた方を採用する
return await promiseAny([
resolveAddrInner(domain, { ipv6: false }),
resolveAddrInner(domain, { ipv6: true })
]);
}
function resolveAddrInner(domain: string, options = { }): Promise<string> {
return new Promise((res, rej) => {
lookup(domain, options, (error: any, address: string) => {
if (error) return rej(error);
return res(address);
});
});
}

View File

@@ -83,7 +83,7 @@ router.get('/notes/:note', async (ctx, next) => {
}
ctx.body = pack(await renderNote(note, false));
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
ctx.set('Cache-Control', 'public, max-age=180');
setResponseType(ctx);
});
@@ -162,7 +162,9 @@ async function userInfo(ctx: Router.IRouterContext, user: IUser) {
setResponseType(ctx);
}
router.get('/users/:user', async ctx => {
router.get('/users/:user', async (ctx, next) => {
if (!isActivityPubReq(ctx)) return await next();
if (!ObjectID.isValid(ctx.params.user)) {
ctx.status = 404;
return;

View File

@@ -77,5 +77,5 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
skip: ps.offset
});
res(await packMany(files, { detail: true, withUser: true }));
res(await packMany(files, { detail: true, withUser: true, self: true }));
}));

View File

@@ -0,0 +1,123 @@
import $ from 'cafy';
import User, { pack } from '../../../../models/user';
import define from '../../define';
export const meta = {
requireCredential: true,
requireModerator: true,
params: {
limit: {
validator: $.num.optional.range(1, 100),
default: 10
},
offset: {
validator: $.num.optional.min(0),
default: 0
},
sort: {
validator: $.str.optional.or([
'+follower',
'-follower',
'+createdAt',
'-createdAt',
'+updatedAt',
'-updatedAt',
]),
},
state: {
validator: $.str.optional.or([
'all',
'admin',
'moderator',
'adminOrModerator',
'verified',
'suspended',
]),
default: 'all'
},
origin: {
validator: $.str.optional.or([
'combined',
'local',
'remote',
]),
default: 'local'
}
}
};
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
let _sort;
if (ps.sort) {
if (ps.sort == '+follower') {
_sort = {
followersCount: -1
};
} else if (ps.sort == '-follower') {
_sort = {
followersCount: 1
};
} else if (ps.sort == '+createdAt') {
_sort = {
createdAt: -1
};
} else if (ps.sort == '+updatedAt') {
_sort = {
updatedAt: -1
};
} else if (ps.sort == '-createdAt') {
_sort = {
createdAt: 1
};
} else if (ps.sort == '-updatedAt') {
_sort = {
updatedAt: 1
};
}
} else {
_sort = {
_id: -1
};
}
const q = {
$and: []
} as any;
// state
q.$and.push(
ps.state == 'admin' ? { isAdmin: true } :
ps.state == 'moderator' ? { isModerator: true } :
ps.state == 'adminOrModerator' ? {
$or: [{
isAdmin: true
}, {
isModerator: true
}]
} :
ps.state == 'verified' ? { isVerified: true } :
ps.state == 'suspended' ? { isSuspended: true } :
{}
);
// origin
q.$and.push(
ps.origin == 'local' ? { host: null } :
ps.origin == 'remote' ? { host: { $ne: null } } :
{}
);
const users = await User
.find(q, {
limit: ps.limit,
sort: _sort,
skip: ps.offset
});
res(await Promise.all(users.map(user => pack(user, me, { detail: true }))));
}));

View File

@@ -37,6 +37,10 @@ export default define(meta, (ps) => new Promise(async (res, rej) => {
return rej('cannot suspend admin');
}
if (user.isModerator) {
return rej('cannot suspend moderator');
}
await User.findOneAndUpdate({
_id: user._id
}, {

View File

@@ -39,6 +39,13 @@ export const meta = {
}
},
mascotImageUrl: {
validator: $.str.optional.nullable,
desc: {
'ja-JP': 'インスタンスキャラクター画像のURL'
}
},
bannerUrl: {
validator: $.str.optional.nullable,
desc: {
@@ -328,6 +335,10 @@ export default define(meta, (ps) => new Promise(async (res, rej) => {
set.hidedTags = ps.hidedTags;
}
if (ps.mascotImageUrl !== undefined) {
set.mascotImageUrl = ps.mascotImageUrl;
}
if (ps.bannerUrl !== undefined) {
set.bannerUrl = ps.bannerUrl;
}

View File

@@ -40,6 +40,16 @@ export const meta = {
markAsRead: {
validator: $.bool.optional,
default: true
},
includeTypes: {
validator: $.arr($.str.or(['follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'poll_vote', 'receiveFollowRequest'])).optional,
default: [] as string[]
},
excludeTypes: {
validator: $.arr($.str.or(['follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'poll_vote', 'receiveFollowRequest'])).optional,
default: [] as string[]
}
}
};
@@ -89,6 +99,16 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
};
}
if (ps.includeTypes.length > 0) {
query.type = {
$in: ps.includeTypes
};
} else if (ps.excludeTypes.length > 0) {
query.type = {
$nin: ps.excludeTypes
};
}
const notifications = await Notification
.find(query, {
limit: ps.limit,

View File

@@ -65,6 +65,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
enableRecaptcha: instance.enableRecaptcha,
recaptchaSiteKey: instance.recaptchaSiteKey,
swPublickey: instance.swPublicKey,
mascotImageUrl: instance.mascotImageUrl,
bannerUrl: instance.bannerUrl,
errorImageUrl: instance.errorImageUrl,
maxNoteTextLength: instance.maxNoteTextLength,

View File

@@ -135,13 +135,30 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
}]
});
const visibleQuery = user == null ? [{
visibility: { $in: [ 'public', 'home' ] }
}] : [{
visibility: { $in: [ 'public', 'home' ] }
}, {
// myself (for specified/private)
userId: user._id
}, {
// to me (for specified)
visibleUserIds: { $in: [ user._id ] }
}];
const query = {
$and: [{
deletedAt: null,
$or: [{
// フォローしている人の投稿
$or: followQuery
$and: [{
// フォローしている人の投稿
$or: followQuery
}, {
// visible for me
$or: visibleQuery
}]
}, {
// public only
visibility: 'public',

View File

@@ -45,7 +45,7 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
}
if (note.deletedAt != null) {
return rej('this not is already deleted');
return rej('this note is already deleted');
}
try {

View File

@@ -103,6 +103,18 @@ export const meta = {
};
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
const visibleQuery = me == null ? [{
visibility: { $in: [ 'public', 'home' ] }
}] : [{
visibility: { $in: [ 'public', 'home' ] }
}, {
// myself (for specified/private)
userId: me._id
}, {
// to me (for specified)
visibleUserIds: { $in: [ me._id ] }
}];
const q: any = {
$and: [ps.tag ? {
tagsLower: ps.tag.toLowerCase()
@@ -113,7 +125,8 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
}))
}))
}],
deletedAt: { $exists: false }
deletedAt: { $exists: false },
$or: visibleQuery
};
const push = (x: any) => q.$and.push(x);

View File

@@ -139,12 +139,29 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
}]
});
const visibleQuery = user == null ? [{
visibility: { $in: [ 'public', 'home' ] }
}] : [{
visibility: { $in: [ 'public', 'home' ] }
}, {
// myself (for specified/private)
userId: user._id
}, {
// to me (for specified)
visibleUserIds: { $in: [ user._id ] }
}];
const query = {
$and: [{
deletedAt: null,
// フォローしている人の投稿
$or: followQuery,
$and: [{
// フォローしている人の投稿
$or: followQuery
}, {
// visible for me
$or: visibleQuery
}],
// mute
userId: {

View File

@@ -146,12 +146,29 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
}]
}));
const visibleQuery = user == null ? [{
visibility: { $in: [ 'public', 'home' ] }
}] : [{
visibility: { $in: [ 'public', 'home' ] }
}, {
// myself (for specified/private)
userId: user._id
}, {
// to me (for specified)
visibleUserIds: { $in: [ user._id ] }
}];
const query = {
$and: [{
deletedAt: null,
// リストに入っている人のタイムラインへの投稿
$or: listQuery,
$and: [{
// リストに入っている人のタイムラインへの投稿
$or: listQuery
}, {
// visible for me
$or: visibleQuery
}],
// mute
userId: {

View File

@@ -124,6 +124,14 @@ export const meta = {
'ja-JP': '指定された種類のファイルが添付された投稿のみを取得します'
}
},
excludeNsfw: {
validator: $.bool.optional,
default: false,
desc: {
'ja-JP': 'true にすると、NSFW指定されたファイルを除外します(fileTypeが指定されている場合のみ有効)'
}
},
}
};
@@ -155,10 +163,23 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
//#region Construct query
const sort = { } as any;
const visibleQuery = me == null ? [{
visibility: { $in: [ 'public', 'home' ] }
}] : [{
visibility: { $in: [ 'public', 'home' ] }
}, {
// myself (for specified/private)
userId: me._id
}, {
// to me (for specified)
visibleUserIds: { $in: [ me._id ] }
}];
const query = {
$and: [ {} ],
deletedAt: null,
userId: user._id
userId: user._id,
$or: visibleQuery
} as any;
if (ps.sinceId) {
@@ -220,6 +241,12 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
query['_files.contentType'] = {
$in: ps.fileType
};
if (ps.excludeNsfw) {
query['_files.metadata.isSensitive'] = {
$ne: true
};
}
}
//#endregion

View File

@@ -2,6 +2,7 @@
* Web Client Server
*/
import * as os from 'os';
import ms = require('ms');
import * as Koa from 'koa';
import * as Router from 'koa-router';
@@ -18,6 +19,8 @@ import config from '../../config';
import Note, { pack as packNote } from '../../models/note';
import getNoteSummary from '../../misc/get-note-summary';
import fetchMeta from '../../misc/fetch-meta';
import Emoji from '../../models/emoji';
const pkg = require('../../../package.json');
const client = `${__dirname}/../../client/`;
@@ -148,6 +151,27 @@ router.get('/@:user', async (ctx, next) => {
}
});
router.get('/users/:user', async ctx => {
if (!ObjectID.isValid(ctx.params.user)) {
ctx.status = 404;
return;
}
const userId = new ObjectID(ctx.params.user);
const user = await User.findOne({
_id: userId,
host: null
});
if (user === null) {
ctx.status = 404;
return;
}
ctx.redirect(`/@${user.username}${ user.host == null ? '' : '@' + user.host}`);
});
// Note
router.get('/notes/:note', async ctx => {
if (ObjectID.isValid(ctx.params.note)) {
@@ -159,7 +183,12 @@ router.get('/notes/:note', async ctx => {
note: _note,
summary: getNoteSummary(_note)
});
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
if (['public', 'home'].includes(note.visibility)) {
ctx.set('Cache-Control', 'public, max-age=180');
} else {
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
}
return;
}
@@ -169,6 +198,27 @@ router.get('/notes/:note', async ctx => {
});
//#endregion
router.get('/info', async ctx => {
const meta = await fetchMeta();
const emojis = await Emoji.find({ host: null }, {
fields: {
_id: false
}
});
await ctx.render('info', {
version: pkg.version,
machine: os.hostname(),
os: os.platform(),
node: process.version,
cpu: {
model: os.cpus()[0].model,
cores: os.cpus().length
},
emojis: emojis,
meta: meta
});
});
// Render base html for all requests
router.get('*', async ctx => {
const meta = await fetchMeta();

View File

@@ -0,0 +1,113 @@
doctype html
html
head
meta(charset='utf-8')
meta(name='application-name' content='Misskey')
title Misskey
style.
html {
font-family: sans-serif;
}
main {
max-width: 934px;
margin: 0 auto;
}
header {
padding: 5px;
background: rgb(153, 153, 204);
border: 1px solid #000;
}
header:after {
content: '';
display: block;
clear: both;
}
header > h1 {
float: left;
font-size: 2em;
}
header > img {
float: right;
width: 220px;
}
table {
margin: 1em 0;
width: 100%;
border-collapse: collapse;
}
table tr th {
background-color: #ccf;
border: 1px solid #000;
width: 300px;
font-weight: bold;
padding: 4px 5px;
text-align: left;
}
table tr td {
background-color: #ddd;
border: 1px solid #000;
padding: 4px 5px;
}
body
main
header
h1 Misskey Version #{version}
img(src='/assets/misskey-php-like-logo.png' alt='')
table
tr
th Instance
td= meta.name
tr
th Maintainer
td
= meta.maintainer.name
| &lt;#{meta.maintainer.email}&gt;
tr
th System
td= os
tr
th Node version
td= node
tr
th Machine
td= machine
tr
th CPU
td= cpu.model
tr
th Registration
td= !meta.disableRegistration ? 'yes' : 'no'
tr
th reCAPTCHA enabled
td= meta.enableRecaptcha ? 'yes' : 'no'
tr
th Cache remote files
td= meta.cacheRemoteFiles ? 'yes' : 'no'
tr
th Drive capacity per local user
td
= meta.localDriveCapacityMb
| MB
tr
th Drive capacity per remote user
td
= meta.remoteDriveCapacityMb
| MB
tr
th Max text length
td= meta.maxNoteTextLength
tr
th Emojis
td
each emoji in emojis
| :#{emoji.name}:
= ' '

View File

@@ -183,11 +183,6 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
data.visibleUsers.push(u);
}
}
// ダイレクト投稿でユーザーが指定されていなかったらreject
if (data.visibleUsers.length === 0) {
return rej('Target user is not specified');
}
}
const note = await insertNote(user, data, tags, emojis, mentionedUsers);
@@ -546,7 +541,7 @@ async function publishToFollowers(note: INote, user: IUser, noteActivity: any) {
if (!following.stalk) {
// この投稿が返信ならスキップ
if (note.replyId && !note._reply.userId.equals(following.followerId) && !note._reply.userId.equals(note.userId))
return;
continue;
}
// Publish event to followers stream

View File

@@ -0,0 +1,57 @@
// node built/tools/show-signin-history username
// => {Success} {Date} {IPAddrsss}
// node built/tools/show-signin-history username user-agent,x-forwarded-for
// with user-agent and x-forwarded-for
// node built/tools/show-signin-history username all
// with full request headers
import User from '../models/user';
import Signin from '../models/signin';
async function main(username: string, headers: string[]) {
const user = await User.findOne({
host: null,
usernameLower: username.toLowerCase(),
});
if (user === null) throw 'User not found';
const history = await Signin.find({
userId: user._id
});
for (const signin of history) {
console.log(`${signin.success ? 'OK' : 'NG'} ${signin.createdAt ? signin.createdAt.toISOString() : 'Unknown'} ${signin.ip}`);
// headers
if (headers != null) {
for (const key of Object.keys(signin.headers)) {
if (headers.includes('all') || headers.includes(key)) {
console.log(` ${key}: ${signin.headers[key]}`);
}
}
}
}
}
// get args
const args = process.argv.slice(2);
let username = args[0];
let headers: string[];
if (args[1] != null) {
headers = args[1].split(/,/).map(header => header.toLowerCase());
}
// normalize args
username = username.replace(/^@/, '');
main(username, headers).then(() => {
process.exit(0);
}).catch(e => {
console.warn(e);
process.exit(1);
});