Compare commits

..

161 Commits

Author SHA1 Message Date
syuilo
cb0874f15a 10.54.0 2018-11-16 23:19:34 +09:00
Aya Morisawa
9239e37b45 Fix #3273 (#3277) 2018-11-16 23:14:11 +09:00
Aya Morisawa
57d80932a4 Add an optional setting to remain deleted note (#3271)
Co-authored-by: Aya Morisawa <AyaMorisawa4869@gmail.com>
Co-authored-by: syuilo <syuilotan@yahoo.co.jp>
2018-11-16 23:13:37 +09:00
syuilo
8569970fbe Update github-bot.ts 2018-11-16 23:10:48 +09:00
syuilo
713e9ad5f4 Resolve #3274 2018-11-16 23:09:33 +09:00
syuilo
59e229d962 Update github-bot.ts 2018-11-16 23:02:01 +09:00
syuilo
3c5f09cda2 Clean up 2018-11-16 23:01:14 +09:00
syuilo
e42aa2530d Update github-bot.ts
follow dvelop instead master
2018-11-16 23:00:34 +09:00
Zero King
1fd298ac9c Update docker.en.md (#3272) 2018-11-16 22:47:10 +09:00
syuilo
1a73f52541 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-11-16 22:32:17 +09:00
syuilo
27e458f884 Do not use camelCase in html 2018-11-16 22:32:06 +09:00
Zero King
ba3e2a9371 Update setup.en.md (#3270)
* [doc] run as root

* [doc] update setup guide headings
2018-11-16 22:31:53 +09:00
syuilo
831e8f8583 Refactoring 2018-11-16 22:31:28 +09:00
syuilo
0ff390ed80 [MFM] Improve various parsing
Resolve #2779
Resolve #3053
2018-11-16 21:57:19 +09:00
syuilo
e3b8495431 [MFM] Better URL parsing 2018-11-16 21:30:01 +09:00
syuilo
da10ba3fea [Client] Add missing icon
Resolve #3267
2018-11-16 18:34:52 +09:00
syuilo
cc7de853b4 [Client] Wrap formula component to split code 2018-11-16 18:31:25 +09:00
syuilo
23d8235197 Revert "[Client] Load katex async to reduce bundle size"
This reverts commit 37e3d60ade.
2018-11-16 18:26:19 +09:00
syuilo
37e3d60ade [Client] Load katex async to reduce bundle size 2018-11-16 18:22:44 +09:00
syuilo
83a3426dd5 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-11-16 17:56:08 +09:00
syuilo
a2549192ca Update misskey-flavored-markdown.ts 2018-11-16 17:55:48 +09:00
Aya Morisawa
9d3a1cab6e Fix #3224 (#3265) 2018-11-16 17:41:52 +09:00
Aya Morisawa
06f8d8f0a3 Show server version on server.info.vue (#3264) 2018-11-16 17:24:03 +09:00
MeiMei
fa66b79e2d Update the locale when version or language changed (#3263) 2018-11-16 17:13:22 +09:00
Aya Morisawa
81312f5a93 Remove a trailing whitespace (#3261) 2018-11-16 17:04:28 +09:00
Aya Morisawa
ad84901f39 Support math rendering on MFM (#3260) 2018-11-16 17:03:52 +09:00
MeiMei
d2385a0e52 Do not show duplicate url-preview (#3259) 2018-11-16 16:35:13 +09:00
syuilo
39285fc2d0 10.53.0 2018-11-16 05:56:58 +09:00
syuilo
6e491c1466 Refactoring 2018-11-16 05:53:17 +09:00
dependabot[bot]
84152aa663 Update typescript-eslint-parser requirement from 20.1.1 to 21.0.0 (#3237)
Updates the requirements on [typescript-eslint-parser](https://github.com/eslint/typescript-eslint-parser) to permit the latest version.
- [Release notes](https://github.com/eslint/typescript-eslint-parser/releases)
- [Changelog](https://github.com/eslint/typescript-eslint-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/typescript-eslint-parser/commits/v21.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-16 05:49:21 +09:00
dependabot[bot]
600fc65c2f Update showdown requirement from 1.8.7 to 1.9.0 (#3252)
Updates the requirements on [showdown](https://github.com/showdownjs/showdown) to permit the latest version.
- [Release notes](https://github.com/showdownjs/showdown/releases)
- [Changelog](https://github.com/showdownjs/showdown/blob/master/CHANGELOG.md)
- [Commits](https://github.com/showdownjs/showdown/commits/1.9.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-16 05:49:07 +09:00
dependabot[bot]
40e2733424 Update mongodb requirement from 3.1.8 to 3.1.9 (#3253)
Updates the requirements on [mongodb](https://github.com/mongodb/node-mongodb-native) to permit the latest version.
- [Release notes](https://github.com/mongodb/node-mongodb-native/releases)
- [Changelog](https://github.com/mongodb/node-mongodb-native/blob/master/HISTORY.md)
- [Commits](https://github.com/mongodb/node-mongodb-native/commits/v3.1.9)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-16 05:48:39 +09:00
MeiMei
bceb02d760 local only visibility (#3254)
* local only visibility

* fix UI
2018-11-16 05:47:29 +09:00
syuilo
aaaaf2681a [Client] Add missing icon 2018-11-16 05:38:16 +09:00
syuilo
3c3ef9bba0 [Client] ✌️ 2018-11-16 05:36:52 +09:00
syuilo
338f3a981f Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-11-16 05:26:48 +09:00
syuilo
a86ae9fa50 Better UX 2018-11-16 05:26:36 +09:00
syuilo
a3c4e8a1bc [Client] Improve admin dashboard 2018-11-16 05:21:52 +09:00
syuilo
6a7c18e8db Merge pull request #3250 from syuilo/l10n_develop
New Crowdin translations
2018-11-16 05:10:41 +09:00
syuilo
672b7a4c3d 🎨 2018-11-16 05:07:59 +09:00
MeiMei
bf3fee4481 Check the port is configured (#3251) 2018-11-16 03:25:35 +09:00
syuilo
a3c8d1d732 New translations ja-JP.yml (Chinese Simplified) 2018-11-16 00:15:45 +09:00
syuilo
bb03d8c49a New translations ja-JP.yml (Chinese Simplified) 2018-11-15 23:59:41 +09:00
syuilo
fbd5abe3b6 New translations ja-JP.yml (Chinese Simplified) 2018-11-15 23:43:21 +09:00
syuilo
5ac390abe9 New translations ja-JP.yml (Chinese Simplified) 2018-11-15 23:38:10 +09:00
Aya Morisawa
766cae2299 Check Node.js version (#3245)
* Check Node.js version

* Fix bug
2018-11-15 22:17:06 +09:00
syuilo
d9828fdc6a 10.52.0 2018-11-15 22:04:57 +09:00
syuilo
4114ce4a04 [Client] Split some components to improve performance 2018-11-15 22:04:12 +09:00
syuilo
6090630260 Merge pull request #3236 from syuilo/l10n_develop
New Crowdin translations
2018-11-15 21:44:39 +09:00
Acid Chicken (硫酸鶏)
259cfeae17 Use Node.js official Docker image (#3241)
* Update Dockerfile

* Update Dockerfile
2018-11-15 21:43:02 +09:00
syuilo
ebe15c4711 New translations ja-JP.yml (English) 2018-11-15 21:03:36 +09:00
syuilo
75a740a110 New translations ja-JP.yml (English) 2018-11-15 20:53:18 +09:00
syuilo
0c085c4f74 New translations ja-JP.yml (English) 2018-11-15 20:44:10 +09:00
syuilo
1d819e79db New translations ja-JP.yml (Norwegian) 2018-11-15 19:24:47 +09:00
syuilo
515b79dcf0 New translations ja-JP.yml (Dutch) 2018-11-15 19:24:41 +09:00
syuilo
269e12abb4 New translations ja-JP.yml (Japanese, Kansai) 2018-11-15 19:24:36 +09:00
syuilo
cf5be6ff5a New translations ja-JP.yml (Spanish) 2018-11-15 19:24:32 +09:00
syuilo
f140adbc9d New translations ja-JP.yml (Russian) 2018-11-15 19:24:25 +09:00
syuilo
6c31406bb0 New translations ja-JP.yml (Portuguese) 2018-11-15 19:24:19 +09:00
syuilo
b6e8626908 New translations ja-JP.yml (Polish) 2018-11-15 19:24:15 +09:00
syuilo
64a3a4915a New translations ja-JP.yml (Korean) 2018-11-15 19:24:11 +09:00
syuilo
fd71f24d46 New translations ja-JP.yml (Italian) 2018-11-15 19:24:05 +09:00
syuilo
65b5c6753f New translations ja-JP.yml (German) 2018-11-15 19:23:59 +09:00
syuilo
7408bbce37 New translations ja-JP.yml (French) 2018-11-15 19:23:54 +09:00
syuilo
0f58978c9f New translations ja-JP.yml (English) 2018-11-15 19:23:47 +09:00
syuilo
01ca3fd6b2 New translations ja-JP.yml (Chinese Simplified) 2018-11-15 19:23:43 +09:00
syuilo
26c366156b New translations ja-JP.yml (Catalan) 2018-11-15 19:23:37 +09:00
Acid Chicken (硫酸鶏)
9d8f7b081d WIP: Add Discord auth (#3239)
* Add Discord auth

* Apply review 175263424
2018-11-15 19:15:04 +09:00
syuilo
9d8ebb795d New translations ja-JP.yml (French) 2018-11-15 18:11:46 +09:00
syuilo
8be98e4cb8 New translations ja-JP.yml (French) 2018-11-15 17:32:46 +09:00
syuilo
3c229c9950 New translations ja-JP.yml (Chinese Simplified) 2018-11-15 13:51:55 +09:00
syuilo
f2263faf7d New translations ja-JP.yml (Chinese Simplified) 2018-11-15 13:44:35 +09:00
syuilo
39c7cf3e66 New translations ja-JP.yml (Chinese Simplified) 2018-11-15 13:32:36 +09:00
syuilo
5ee24e5c09 New translations ja-JP.yml (French) 2018-11-15 07:21:58 +09:00
syuilo
a34fdc2068 10.51.2 2018-11-15 07:04:25 +09:00
syuilo
2c2cd893b8 🎨 2018-11-15 07:03:46 +09:00
syuilo
a43b0548ed 10.51.1 2018-11-15 06:40:09 +09:00
syuilo
93e95f56f4 Update src/client/app/admin/views/index.vue 2018-11-15 06:39:59 +09:00
syuilo
cb0673b1ec 10.51.0 2018-11-15 06:26:15 +09:00
syuilo
cd018db945 Update src/client/app/admin/views/index.vue 2018-11-15 06:23:40 +09:00
syuilo
50fe67b99b [Client] Improve admin panel 2018-11-15 06:21:31 +09:00
syuilo
1dba82aae5 [API] Add /instances 2018-11-15 06:21:13 +09:00
syuilo
17c6d64750 [Client] Prevent cache locale file 2018-11-15 05:20:25 +09:00
syuilo
b4c04efa23 Improve usability 2018-11-15 05:00:30 +09:00
syuilo
152dd74abf 10.50.0 2018-11-15 04:26:33 +09:00
syuilo
0985f7f609 [Client] Fix bugs 2018-11-15 04:24:40 +09:00
syuilo
aecf9329bd New translations ja-JP.yml (Norwegian) 2018-11-15 04:24:24 +09:00
syuilo
b2384605e7 New translations ja-JP.yml (Dutch) 2018-11-15 04:24:20 +09:00
syuilo
57ab5ab604 New translations ja-JP.yml (Japanese, Kansai) 2018-11-15 04:24:15 +09:00
syuilo
e493a20301 New translations ja-JP.yml (Spanish) 2018-11-15 04:24:09 +09:00
syuilo
0bd5ed937c New translations ja-JP.yml (Russian) 2018-11-15 04:24:03 +09:00
syuilo
6a9b3bc64e New translations ja-JP.yml (Portuguese) 2018-11-15 04:23:58 +09:00
syuilo
4c1ef3e6a5 New translations ja-JP.yml (Polish) 2018-11-15 04:23:54 +09:00
syuilo
2ea250f954 New translations ja-JP.yml (Korean) 2018-11-15 04:23:49 +09:00
syuilo
5d810980f8 New translations ja-JP.yml (Italian) 2018-11-15 04:23:43 +09:00
syuilo
d51b4e27cc New translations ja-JP.yml (German) 2018-11-15 04:23:37 +09:00
syuilo
c01c555309 New translations ja-JP.yml (French) 2018-11-15 04:23:33 +09:00
syuilo
ce2e66d9b0 New translations ja-JP.yml (English) 2018-11-15 04:23:27 +09:00
syuilo
9550acd61e New translations ja-JP.yml (Chinese Simplified) 2018-11-15 04:23:23 +09:00
syuilo
d95b5daa6d New translations ja-JP.yml (Catalan) 2018-11-15 04:23:18 +09:00
syuilo
56d571c0f0 Moderator system
Closes #2357
2018-11-15 04:15:42 +09:00
syuilo
dc9a19b9c7 [Client] Add missing icon 2018-11-15 03:17:48 +09:00
syuilo
88a2c7715a [Client] Add missing icon 2018-11-15 03:14:52 +09:00
syuilo
2fa8cb1b73 10.49.7 2018-11-15 01:46:01 +09:00
syuilo
5f8a66fdb9 🎨 2018-11-15 01:45:13 +09:00
syuilo
57320a94f9 [Client] Add missing icon 2018-11-15 01:43:26 +09:00
syuilo
89f045d624 🎨 2018-11-15 01:43:06 +09:00
syuilo
1a77dea7ed [Client] Fix icon 2018-11-15 01:09:50 +09:00
syuilo
532a7b90f3 New translations ja-JP.yml (Chinese Simplified) 2018-11-15 00:55:47 +09:00
syuilo
4e8c200349 New translations ja-JP.yml (Chinese Simplified) 2018-11-15 00:43:37 +09:00
syuilo
d063d59a91 [Client] Improve UI 2018-11-15 00:01:49 +09:00
syuilo
90429b787c 10.49.6 2018-11-14 20:40:21 +09:00
syuilo
7a2ef04ec3 [Client] Improve UI 2018-11-14 20:36:15 +09:00
syuilo
76a9ea8d3d 10.49.5 2018-11-14 20:27:12 +09:00
syuilo
0a05a2d060 🎨 2018-11-14 20:23:51 +09:00
syuilo
a7e2ee3b0c Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-11-14 20:21:45 +09:00
syuilo
40efa90dd5 🎨 2018-11-14 20:21:35 +09:00
MeiMei
4ca0a22bfc Fix: default order of users/notes (#3234) 2018-11-14 20:18:47 +09:00
syuilo
20a943b193 🎨 2018-11-14 20:17:12 +09:00
syuilo
552df8737d [Client] Add missing icon 2018-11-14 18:07:38 +09:00
syuilo
860f622d79 10.49.4 2018-11-14 18:04:30 +09:00
syuilo
e76bf5707a [Client] Fix icons 2018-11-14 18:03:38 +09:00
syuilo
bf37a72f59 🎨 2018-11-14 18:00:23 +09:00
syuilo
840ad75830 [Client] Better thumbnail generation 2018-11-14 18:00:15 +09:00
syuilo
4c7dd7228f 10.49.3 2018-11-14 16:39:27 +09:00
syuilo
46a51addad ServiceWorkerはメンテナンスされていないのでとりあえず無効化 2018-11-14 16:39:04 +09:00
syuilo
0a5fe37025 New Crowdin translations (#3205)
* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Catalan)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Catalan)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Catalan)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Catalan)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Catalan)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Catalan)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Catalan)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Catalan)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Catalan)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Catalan)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Catalan)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Catalan)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Catalan)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Catalan)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Catalan)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)
2018-11-14 16:35:55 +09:00
Acid Chicken (硫酸鶏)
00bb403497 Fix #3228 (#3230)
* Update index.ts

* fix sw.js path

* Revert "Update index.ts"

This reverts commit e0b1d4239f.
2018-11-14 16:35:00 +09:00
syuilo
11afa8140c [Client] Improve alert component 2018-11-14 16:30:58 +09:00
syuilo
850396e9da [Client] Add missing icons 2018-11-14 14:57:59 +09:00
syuilo
5ee75be49e 🎨 2018-11-14 14:47:18 +09:00
dependabot[bot]
879116a20c Update vue-sweetalert2 requirement from 1.5.7 to 1.5.9 (#3229)
Updates the requirements on [vue-sweetalert2](https://github.com/avil13/vue-sweetalert2) to permit the latest version.
- [Release notes](https://github.com/avil13/vue-sweetalert2/releases)
- [Commits](https://github.com/avil13/vue-sweetalert2/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-14 13:27:37 +09:00
syuilo
e509b1f488 Update github-bot.ts 2018-11-14 05:33:48 +09:00
syuilo
468ff7037f 10.49.2 2018-11-14 03:07:55 +09:00
syuilo
df23504ccf [Client] Fix #3227 2018-11-14 03:05:13 +09:00
syuilo
66e3cb8eda Update src/client/app/init.ts 2018-11-14 02:04:24 +09:00
syuilo
6ddd2389dc [Client] Add missing icons 2018-11-14 01:45:15 +09:00
syuilo
402efb8c50 [Client] Fix imports 2018-11-14 01:40:29 +09:00
syuilo
7b6eae0ce4 Fix error 2018-11-14 01:32:38 +09:00
syuilo
26ce9725ce [Client] Fix #3009 2018-11-14 01:31:36 +09:00
ButterflyOfFire
ebfaa18f12 Create setup.fr.md (#3225) 2018-11-14 00:15:33 +09:00
syuilo
cc81d41a05 [Client] Some optimizations 2018-11-13 23:33:30 +09:00
syuilo
212176ee5c Use terser instead of uglifyjs 2018-11-13 23:10:51 +09:00
syuilo
a63ec05e41 [Client] Some optimizations 2018-11-13 23:06:31 +09:00
syuilo
0dcb527bf3 [Client] Fix bug 2018-11-13 22:45:28 +09:00
syuilo
54710f17fc [Client] Some performance optimizations 2018-11-13 22:43:09 +09:00
syuilo
e58a6593c0 [Client] Fix bug 2018-11-13 22:42:31 +09:00
syuilo
62132570e1 [Client] Split components to reduce bundle size 2018-11-13 20:21:52 +09:00
MeiMei
9f0b8ba2f8 Fix: notes/create hangs when rejected (#3221) 2018-11-13 19:34:09 +09:00
syuilo
adbe0fbcd1 10.49.1 2018-11-13 16:33:21 +09:00
syuilo
7896242f57 [Client] Fix #3213 2018-11-13 16:19:46 +09:00
syuilo
4a6722b9e9 Merge branch 'master' into develop 2018-11-13 15:01:52 +09:00
syuilo
7c9fb5228b Improve usability 2018-11-13 15:01:05 +09:00
MeiMei
81805b01cc sort user timeline by date (#3210) 2018-11-13 01:17:59 +09:00
syuilo
50824a7245 10.49.0 2018-11-13 01:12:27 +09:00
syuilo
6f2953f3a7 [Client] Clear cached locale data when shouldFlush is true 2018-11-13 01:11:36 +09:00
syuilo
dd3f007582 [Client] Improve post-form widget 2018-11-13 01:04:15 +09:00
syuilo
a4b2b093fc 🎨 2018-11-13 00:21:49 +09:00
syuilo
0fbf56219f [Client] Emoji picker
Closes #3130
2018-11-13 00:12:55 +09:00
syuilo
0acacf7a8e 10.48.1 2018-11-12 06:12:45 +09:00
syuilo
c84500d914 Clean up 2018-11-12 06:12:22 +09:00
187 changed files with 3825 additions and 1943 deletions

View File

@@ -1,8 +1,7 @@
FROM alpine:3.8 AS base FROM node:11-alpine AS base
ENV NODE_ENV=production ENV NODE_ENV=production
RUN apk add --no-cache nodejs nodejs-npm zlib
RUN npm i -g npm@latest RUN npm i -g npm@latest
WORKDIR /misskey WORKDIR /misskey

View File

@@ -13,7 +13,7 @@ This guide describes how to install and setup Misskey with Docker.
2. `cd misskey` Move to misskey directory. 2. `cd misskey` Move to misskey directory.
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) tag. 3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) tag.
*2.* Make configuration files *2.* Configure Misskey
---------------------------------------------------------------- ----------------------------------------------------------------
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`. 1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` Copy the `.config/mongo_initdb_example.js` and rename it to `mongo_initdb.js`. 2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` Copy the `.config/mongo_initdb_example.js` and rename it to `mongo_initdb.js`.
@@ -31,12 +31,12 @@ Build misskey with the following:
*5.* That is it. *5.* That is it.
---------------------------------------------------------------- ----------------------------------------------------------------
Well done! Now, you have an environment that run to Misskey. Well done! Now you have an environment to run Misskey.
### Launch normally ### Launch normally
Just `docker-compose up -d`. GLHF! Just `docker-compose up -d`. GLHF!
### Way to Update to latest version of your Misskey ### How to update your Misskey server to the latest version
1. `git fetch` 1. `git fetch`
2. `git stash` 2. `git stash`
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` 3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
@@ -45,9 +45,9 @@ Just `docker-compose up -d`. GLHF!
6. Check [ChangeLog](../CHANGELOG.md) for migration information 6. Check [ChangeLog](../CHANGELOG.md) for migration information
7. `docker-compose stop && docker-compose up -d` 7. `docker-compose stop && docker-compose up -d`
### Way to execute cli command: ### How to execute [cli commands](manage.en.md):
`docker-compose run --rm web node cli/mark-admin @example` `docker-compose run --rm web node cli/mark-admin @example`
---------------------------------------------------------------- ----------------------------------------------------------------
If you have any questions or troubles, feel free to contact us! If you have any questions or trouble, feel free to contact us!

View File

@@ -10,7 +10,7 @@ This guide describes how to install and setup Misskey.
*1.* Create Misskey user *1.* Create Misskey user
---------------------------------------------------------------- ----------------------------------------------------------------
Running misskey on root is not a good idea so we create a user for that. Running misskey as root is not a good idea so we create a user for that.
In debian for exemple : In debian for exemple :
``` ```
@@ -32,7 +32,7 @@ Please install and setup these softwares:
*3.* Setup MongoDB *3.* Setup MongoDB
---------------------------------------------------------------- ----------------------------------------------------------------
In root : As root:
1. `mongo` Go to the mongo shell 1. `mongo` Go to the mongo shell
2. `use misskey` Use the misskey database 2. `use misskey` Use the misskey database
3. `db.users.save( {dummy:"dummy"} )` Write dummy data to initialize the db. 3. `db.users.save( {dummy:"dummy"} )` Write dummy data to initialize the db.
@@ -47,17 +47,17 @@ In root :
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) 4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest)
5. `npm install` Install misskey dependencies. 5. `npm install` Install misskey dependencies.
*(optional)* Generating VAPID keys *(optional)* Generate VAPID keys
---------------------------------------------------------------- ----------------------------------------------------------------
If you want to enable ServiceWorker, you need to generate VAPID keys: If you want to enable ServiceWorker, you need to generate VAPID keys:
Unless you have set your global node_modules location elsewhere, you need to run this in root. Unless you have set your global node_modules location elsewhere, you need to run this as root.
``` shell ``` shell
npm install web-push -g npm install web-push -g
web-push generate-vapid-keys web-push generate-vapid-keys
``` ```
*5.* Make configuration file *5.* Configure Misskey
---------------------------------------------------------------- ----------------------------------------------------------------
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`. 1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
2. Edit `default.yml` 2. Edit `default.yml`
@@ -114,7 +114,7 @@ WantedBy=multi-user.target
You can check if the service is running with `systemctl status misskey`. You can check if the service is running with `systemctl status misskey`.
### Way to Update to latest version of your Misskey ### How to update your Misskey server to the latest version
1. `git fetch` 1. `git fetch`
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` 2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
3. `npm install` 3. `npm install`

126
docs/setup.fr.md Normal file
View File

@@ -0,0 +1,126 @@
Guide d'installation et de configuration de Misskey
================================================================
Nous vous remerçions de l'intrêt que vous manifestez pour l'installation de votre propre instance Misskey !
Ce guide décrit les étapes à suivre afin d'installer et de configurer une instance Misskey.
[La version en japonnais est également disponible sur - 日本語版もあります](./setup.ja.md)
----------------------------------------------------------------
*1.* Création de l'utilisateur Misskey
----------------------------------------------------------------
Lancer misskey en tant qu'utilisateur est une mauvaise idée, nous avons besoin de créer un utilisateur dédié.
Sur Debian, à titre d'exemple :
```
adduser --disabled-password --disabled-login misskey
```
*2.* Installation des dépendances
----------------------------------------------------------------
Installez les paquets suivants :
#### Dépendences :package:
* **[Node.js](https://nodejs.org/en/)** >= 10.0.0
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
##### Optionnels
* [Redis](https://redis.io/)
* Redis est optionnel mais nous vous recommandons vivement de l'installer
* [Elasticsearch](https://www.elastic.co/) - requis pour pouvoir activer la fonctionnalité de recherche
*3.* Paramètrage de MongoDB
----------------------------------------------------------------
En mode root :
1. `mongo` Accédez au shell de mango
2. `use misskey` Utilisez la base de données misskey
3. `db.users.save( {dummy:"dummy"} )` Write dummy data to initialize the db.
4. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` Créez l'utilisateur misskey.
5. `exit` Vous avez terminé !
*4.* Installation de Misskey
----------------------------------------------------------------
1. `su - misskey` Basculez vers l'utilisateur misskey.
2. `git clone -b master git://github.com/syuilo/misskey.git` Clonez la branche master du dépôt misskey.
3. `cd misskey` Accédez au dossier misskey.
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Télécharge la [version la plus récente](https://github.com/syuilo/misskey/releases/latest)
5. `npm install` Installez les dépendances de misskey.
*(optionnel)* Génération des clés VAPID
----------------------------------------------------------------
Si vous désirez activer ServiceWorker, vous devez générer les clés VAPID :
Unless you have set your global node_modules location elsewhere, vous devez lancer ceci en mode root.
``` shell
npm install web-push -g
web-push generate-vapid-keys
```
*5.* Création du fichier de configuration
----------------------------------------------------------------
1. `cp .config/example.yml .config/default.yml` Copiez le fichier `.config/example.yml` et renommez-le `default.yml`.
2. Editez le fichier `default.yml`
*6.* Construction de Misskey
----------------------------------------------------------------
Construisez Misskey comme ceci :
`npm run build`
Si vous êtes sous Debian, vous serez amené à installer les paquets `build-essential`, `python`.
Si vous rencontrez des erreurs concernant certains modules, utilisez node-gyp:
1. `npm install -g node-gyp`
2. `node-gyp configure`
3. `node-gyp build`
4. `npm run build`
*7.* C'est tout.
----------------------------------------------------------------
Excellent ! Maintenant, vous avez un environnement prêt pour lancer Misskey
### Lancement conventionnel
Lancez tout simplement `npm start`. Bonne chance et amusez-vous bien !
### Démarrage avec systemd
1. Créez une service systemd sur : `/etc/systemd/system/misskey.service`
2. Editez-le puis copiez et coller ceci dans le fichier :
```
[Unit]
Description=Misskey daemon
[Service]
Type=simple
User=misskey
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/misskey
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always
[Install]
WantedBy=multi-user.target
```
3. `systemctl daemon-reload ; systemctl enable misskey` Redémarre systemd et active le service misskey.
4. `systemctl start misskey` Démarre le service misskey.
Vous pouvez vérifier si le service a démarré en utilisant la commande `systemctl status misskey`.
### Méthode de mise à jour vers la plus récente version de Misskey
1. `git fetch`
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
3. `npm install`
4. `npm run build`
5. Consultez [ChangeLog](../CHANGELOG.md) pour les information de migration.
----------------------------------------------------------------
Si vous rencontrez des difficultés ou avez d'autres questions, n'hésitez pas à nous contacter !

View File

@@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
destroy: "アンケートを破棄" destroy: "アンケートを破棄"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択" choose-reaction: "リアクションを選択"
common/views/components/emoji-picker.vue:
custom-emoji: "カスタム絵文字"
people: "人"
animals-and-nature: "動物&自然"
food-and-drink: "食べ物&飲み物"
activity: "アクティビティ"
travel-and-places: "場所"
objects: "物"
symbols: "記号"
flags: "旗"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "ユーザー名" username: "ユーザー名"
password: "パスワード" password: "パスワード"
@@ -353,6 +363,7 @@ common/views/components/signin.vue:
or: "または" or: "または"
signin-with-twitter: "Twitterでログイン" signin-with-twitter: "Twitterでログイン"
signin-with-github: "GitHubでログイン" signin-with-github: "GitHubでログイン"
signin-with-discord: "Discordでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "招待コード" invitation-code: "招待コード"
@@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
reconnect: "再接続する" reconnect: "再接続する"
connect: "GitHubと接続する" connect: "GitHubと接続する"
disconnect: "切断する" disconnect: "切断する"
common/views/components/discord-setting.vue:
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
connected-to: "次のDiscordアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Discordと接続する"
disconnect: "切断する"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "待機中" waiting: "待機中"
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
@@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
block: "ブロック" block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません" no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません" no-blocked-users: "ブロックしているユーザーはいません"
word-mute: "ワードミュート"
muted-words: "ミュートされたキーワード"
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
save: "保存"
common/views/components/password-settings.vue: common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
@@ -903,6 +919,7 @@ admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス" instance: "インスタンス"
emoji: "カスタム絵文字" emoji: "カスタム絵文字"
moderators: "モデレーター"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@@ -947,7 +964,12 @@ admin/views/instance.vue:
github-integration-info: "コールバックURLは /api/gh/cb に設定します。" github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
enable-github-integration: "GitHub連携を有効にする" enable-github-integration: "GitHub連携を有効にする"
github-integration-client-id: "Client ID" github-integration-client-id: "Client ID"
github-integration-client-secret: "Client secret" github-integration-client-secret: "Client Secret"
discord-integration-config: "Discord連携の設定"
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
enable-discord-integration: "Discord連携を有効にする"
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "プロキシアカウントの設定" proxy-account-config: "プロキシアカウントの設定"
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。" proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
proxy-account-username: "プロキシアカウントのユーザー名" proxy-account-username: "プロキシアカウントのユーザー名"
@@ -997,6 +1019,11 @@ admin/views/users.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
admin/views/moderators.vue:
add-moderator:
title: "モデレーターの登録"
add: "登録"
added: "モデレーターを登録しました"
admin/views/emoji.vue: admin/views/emoji.vue:
add-emoji: add-emoji:
title: "絵文字の登録" title: "絵文字の登録"
@@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
mobile/views/components/media-video.vue: mobile/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue: common/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
@@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
github-connect: "GitHubアカウントに接続する" github-connect: "GitHubアカウントに接続する"
github-reconnect: "再接続する" github-reconnect: "再接続する"
github-disconnect: "切断する" github-disconnect: "切断する"
discord: "Discord連携"
discord-connect: "Discordアカウントに接続する"
discord-reconnect: "再接続する"
discord-disconnect: "切断する"
update: "Misskey Update" update: "Misskey Update"
version: "バージョン:" version: "バージョン:"
latest-version: "最新のバージョン:" latest-version: "最新のバージョン:"

View File

@@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
destroy: "Diese Abstimmung löschen" destroy: "Diese Abstimmung löschen"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "Wähle eine Reaktion aus" choose-reaction: "Wähle eine Reaktion aus"
common/views/components/emoji-picker.vue:
custom-emoji: "カスタム絵文字"
people: "人"
animals-and-nature: "動物&自然"
food-and-drink: "食べ物&飲み物"
activity: "アクティビティ"
travel-and-places: "場所"
objects: "物"
symbols: "記号"
flags: "旗"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "Benutzername" username: "Benutzername"
password: "Passwort" password: "Passwort"
@@ -353,6 +363,7 @@ common/views/components/signin.vue:
or: "Oder" or: "Oder"
signin-with-twitter: "Twitterでログイン" signin-with-twitter: "Twitterでログイン"
signin-with-github: "GitHubでログイン" signin-with-github: "GitHubでログイン"
signin-with-discord: "Discordでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "招待コード" invitation-code: "招待コード"
@@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
reconnect: "再接続する" reconnect: "再接続する"
connect: "GitHubと接続する" connect: "GitHubと接続する"
disconnect: "切断する" disconnect: "切断する"
common/views/components/discord-setting.vue:
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
connected-to: "次のDiscordアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Discordと接続する"
disconnect: "切断する"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "Warten" waiting: "Warten"
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
@@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "Folge ich"
follow: "Folgen"
request-pending: "Ausstehend"
follow-processing: "フォロー処理中"
follow-request: "Follower-Anfragen"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
block: "ブロック" block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません" no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません" no-blocked-users: "ブロックしているユーザーはいません"
word-mute: "ワードミュート"
muted-words: "ミュートされたキーワード"
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
save: "保存"
common/views/components/password-settings.vue: common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
@@ -903,6 +919,7 @@ admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス" instance: "インスタンス"
emoji: "カスタム絵文字" emoji: "カスタム絵文字"
moderators: "モデレーター"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@@ -947,7 +964,12 @@ admin/views/instance.vue:
github-integration-info: "コールバックURLは /api/gh/cb に設定します。" github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
enable-github-integration: "GitHub連携を有効にする" enable-github-integration: "GitHub連携を有効にする"
github-integration-client-id: "Client ID" github-integration-client-id: "Client ID"
github-integration-client-secret: "Client secret" github-integration-client-secret: "Client Secret"
discord-integration-config: "Discord連携の設定"
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
enable-discord-integration: "Discord連携を有効にする"
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "プロキシアカウントの設定" proxy-account-config: "プロキシアカウントの設定"
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。" proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
proxy-account-username: "プロキシアカウントのユーザー名" proxy-account-username: "プロキシアカウントのユーザー名"
@@ -997,6 +1019,11 @@ admin/views/users.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
admin/views/moderators.vue:
add-moderator:
title: "モデレーターの登録"
add: "登録"
added: "モデレーターを登録しました"
admin/views/emoji.vue: admin/views/emoji.vue:
add-emoji: add-emoji:
title: "絵文字の登録" title: "絵文字の登録"
@@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
mobile/views/components/media-video.vue: mobile/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue: common/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
@@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
github-connect: "GitHubアカウントに接続する" github-connect: "GitHubアカウントに接続する"
github-reconnect: "再接続する" github-reconnect: "再接続する"
github-disconnect: "切断する" github-disconnect: "切断する"
discord: "Discord連携"
discord-connect: "Discordアカウントに接続する"
discord-reconnect: "再接続する"
discord-disconnect: "切断する"
update: "Misskey Update" update: "Misskey Update"
version: "バージョン:" version: "バージョン:"
latest-version: "Neuste Version:" latest-version: "Neuste Version:"

View File

@@ -16,7 +16,7 @@ common:
reaction-desc: "Easiest way to tell your emotions. Misskey allows you to add various type of reactions to others post. The emotional experience on Misskey will never be on other SNSs which only able to push “likes”." reaction-desc: "Easiest way to tell your emotions. Misskey allows you to add various type of reactions to others post. The emotional experience on Misskey will never be on other SNSs which only able to push “likes”."
ui: "Interface" ui: "Interface"
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." 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: "Misskey Drive" 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." 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 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!"
adblock: adblock:
@@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
destroy: "Discard the poll" destroy: "Discard the poll"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "Send a reaction" choose-reaction: "Send a reaction"
common/views/components/emoji-picker.vue:
custom-emoji: "Custom Emoji"
people: "People"
animals-and-nature: "Animals & Nature"
food-and-drink: "Food & drink"
activity: "Activity"
travel-and-places: "Travel & Places"
objects: "Objects"
symbols: "Symbols"
flags: "Flags"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "Username" username: "Username"
password: "Password" password: "Password"
@@ -353,6 +363,7 @@ common/views/components/signin.vue:
or: "Or" or: "Or"
signin-with-twitter: "Log in with Twitter" signin-with-twitter: "Log in with Twitter"
signin-with-github: "Log in with GitHub" signin-with-github: "Log in with GitHub"
signin-with-discord: "Login with Discord"
login-failed: "Log in failed. Make sure you have entered your correct username and password." login-failed: "Log in failed. Make sure you have entered your correct username and password."
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "Invitation code" invitation-code: "Invitation code"
@@ -396,7 +407,14 @@ common/views/components/github-setting.vue:
connected-to: "You are connected to this GitHub account" connected-to: "You are connected to this GitHub account"
detail: "More..." detail: "More..."
reconnect: "Reconnect" reconnect: "Reconnect"
connect: "Connect to GitHub" connect: "Link your GitHub account"
disconnect: "Disconnect"
common/views/components/discord-setting.vue:
description: "Once you connect your Discord account to your Misskey account, you will be able to see information about your Discord account on your profile, and you will be able to sign-in using Discord."
connected-to: "You are connected to this Discord account"
detail: "Details…"
reconnect: "Reconnect"
connect: "Link your Discord account"
disconnect: "Disconnect" disconnect: "Disconnect"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "Waiting" waiting: "Waiting"
@@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "The content is NSFW" sensitive: "The content is NSFW"
click-to-show: "Click to show" click-to-show: "Click to show"
desktop/views/components/follow-button.vue:
following: "Following"
follow: "Follow"
request-pending: "Pending follow request"
follow-processing: "Processing follow"
follow-request: "Follow request"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{}'s followers" followers: "{}'s followers"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
block: "Blocking" block: "Blocking"
no-muted-users: "No muted users" no-muted-users: "No muted users"
no-blocked-users: "No blocked users" no-blocked-users: "No blocked users"
word-mute: "Word mute"
muted-words: "Muted keywords"
muted-words-description: "Separating with spaces results in AND specifications, and delimiting with line breaks results in OR specifications"
save: "Save"
common/views/components/password-settings.vue: common/views/components/password-settings.vue:
reset: "Change password" reset: "Change password"
enter-current-password: "Enter the current password" enter-current-password: "Enter the current password"
@@ -903,6 +919,7 @@ admin/views/index.vue:
dashboard: "Dashboard" dashboard: "Dashboard"
instance: "Instance" instance: "Instance"
emoji: "Emoji" emoji: "Emoji"
moderators: "Moderator"
users: "Users" users: "Users"
update: "Update" update: "Update"
announcements: "Announcements" announcements: "Announcements"
@@ -947,7 +964,12 @@ admin/views/instance.vue:
github-integration-info: "The callback URL is set on /api/gh/cb." github-integration-info: "The callback URL is set on /api/gh/cb."
enable-github-integration: "Enable connection to GitHub" enable-github-integration: "Enable connection to GitHub"
github-integration-client-id: "Client ID" github-integration-client-id: "Client ID"
github-integration-client-secret: "Client secret" github-integration-client-secret: "Client Secret"
discord-integration-config: "Setting of Discord Integration"
discord-integration-info: "The callback URL is set on /api/dc/cb."
enable-discord-integration: "Enable Discord connection"
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "Proxy account" proxy-account-config: "Proxy account"
proxy-account-info: "Proxy account can follow a remote user to deliver activities if no one in this instance follow him or her. When you add a remote user who is followed by nobody in this instance to your list, in order to get his or her data, proxy account follow him or her instead of your following." proxy-account-info: "Proxy account can follow a remote user to deliver activities if no one in this instance follow him or her. When you add a remote user who is followed by nobody in this instance to your list, in order to get his or her data, proxy account follow him or her instead of your following."
proxy-account-username: "Proxy account user name" proxy-account-username: "Proxy account user name"
@@ -997,6 +1019,11 @@ admin/views/users.vue:
unverify-user: "User account unverification settings" unverify-user: "User account unverification settings"
unverify: "Unverify account" unverify: "Unverify account"
unverified: "The account is now being unverified" unverified: "The account is now being unverified"
admin/views/moderators.vue:
add-moderator:
title: "Register Moderator"
add: "Register"
added: "Registered a Moderator."
admin/views/emoji.vue: admin/views/emoji.vue:
add-emoji: add-emoji:
title: "Add emoji" title: "Add emoji"
@@ -1161,11 +1188,11 @@ mobile/views/components/media-image.vue:
mobile/views/components/media-video.vue: mobile/views/components/media-video.vue:
sensitive: "The content is NSFW" sensitive: "The content is NSFW"
click-to-show: "Click to show" click-to-show: "Click to show"
mobile/views/components/follow-button.vue: common/views/components/follow-button.vue:
following: "Following" following: "Following"
follow: "Follow" follow: "Follow"
request-pending: "Pending follow request" request-pending: "Pending"
follow-processing: "Processing follow" follow-processing: "Processing"
follow-request: "Follow request" follow-request: "Follow request"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "Let's follow them" title: "Let's follow them"
@@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
github-connect: "Connect to your GitHub account" github-connect: "Connect to your GitHub account"
github-reconnect: "Reconnect" github-reconnect: "Reconnect"
github-disconnect: "Disconnect" github-disconnect: "Disconnect"
discord: "Discord Integration"
discord-connect: "Connect to your Discord account"
discord-reconnect: "Reconnect"
discord-disconnect: "Disconnect"
update: "Misskey Update" update: "Misskey Update"
version: "Current version:" version: "Current version:"
latest-version: "Latest version:" latest-version: "Latest version:"

View File

@@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
destroy: "Cancelar la encuesta" destroy: "Cancelar la encuesta"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "Escoge una reacción" choose-reaction: "Escoge una reacción"
common/views/components/emoji-picker.vue:
custom-emoji: "カスタム絵文字"
people: "人"
animals-and-nature: "動物&自然"
food-and-drink: "食べ物&飲み物"
activity: "アクティビティ"
travel-and-places: "場所"
objects: "物"
symbols: "記号"
flags: "旗"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "Usuario" username: "Usuario"
password: "Contraseña" password: "Contraseña"
@@ -353,6 +363,7 @@ common/views/components/signin.vue:
or: "O" or: "O"
signin-with-twitter: "Ingresar con Twitter" signin-with-twitter: "Ingresar con Twitter"
signin-with-github: "GitHubでログイン" signin-with-github: "GitHubでログイン"
signin-with-discord: "Discordでログイン"
login-failed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario y contraseña correctos." login-failed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario y contraseña correctos."
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "Código de invitación" invitation-code: "Código de invitación"
@@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
reconnect: "再接続する" reconnect: "再接続する"
connect: "GitHubと接続する" connect: "GitHubと接続する"
disconnect: "切断する" disconnect: "切断する"
common/views/components/discord-setting.vue:
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
connected-to: "次のDiscordアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Discordと接続する"
disconnect: "切断する"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "Un momento" waiting: "Un momento"
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
@@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "Este contenido no es apropiado para ver en el trabajo" sensitive: "Este contenido no es apropiado para ver en el trabajo"
click-to-show: "Click para mostrar" click-to-show: "Click para mostrar"
desktop/views/components/follow-button.vue:
following: "Siguiendo"
follow: "Sigue"
request-pending: "Pendiente de aprobación"
follow-processing: "フォロー処理中"
follow-request: "Solicitud de seguir"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} seguidores" followers: "{} seguidores"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
block: "ブロック" block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません" no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません" no-blocked-users: "ブロックしているユーザーはいません"
word-mute: "ワードミュート"
muted-words: "ミュートされたキーワード"
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
save: "保存"
common/views/components/password-settings.vue: common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
@@ -903,6 +919,7 @@ admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス" instance: "インスタンス"
emoji: "カスタム絵文字" emoji: "カスタム絵文字"
moderators: "モデレーター"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@@ -947,7 +964,12 @@ admin/views/instance.vue:
github-integration-info: "コールバックURLは /api/gh/cb に設定します。" github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
enable-github-integration: "GitHub連携を有効にする" enable-github-integration: "GitHub連携を有効にする"
github-integration-client-id: "Client ID" github-integration-client-id: "Client ID"
github-integration-client-secret: "Client secret" github-integration-client-secret: "Client Secret"
discord-integration-config: "Discord連携の設定"
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
enable-discord-integration: "Discord連携を有効にする"
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "プロキシアカウントの設定" proxy-account-config: "プロキシアカウントの設定"
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。" proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
proxy-account-username: "プロキシアカウントのユーザー名" proxy-account-username: "プロキシアカウントのユーザー名"
@@ -997,6 +1019,11 @@ admin/views/users.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
admin/views/moderators.vue:
add-moderator:
title: "モデレーターの登録"
add: "登録"
added: "モデレーターを登録しました"
admin/views/emoji.vue: admin/views/emoji.vue:
add-emoji: add-emoji:
title: "絵文字の登録" title: "絵文字の登録"
@@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
mobile/views/components/media-video.vue: mobile/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue: common/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
@@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
github-connect: "GitHubアカウントに接続する" github-connect: "GitHubアカウントに接続する"
github-reconnect: "再接続する" github-reconnect: "再接続する"
github-disconnect: "切断する" github-disconnect: "切断する"
discord: "Discord連携"
discord-connect: "Discordアカウントに接続する"
discord-reconnect: "再接続する"
discord-disconnect: "切断する"
update: "Misskey Update" update: "Misskey Update"
version: "バージョン:" version: "バージョン:"
latest-version: "最新のバージョン:" latest-version: "最新のバージョン:"

View File

@@ -71,7 +71,7 @@ common:
friday: "Vendredi" friday: "Vendredi"
saturday: "Samedi" saturday: "Samedi"
reactions: reactions:
like: "J'aime" like: "Bien"
love: "Adore" love: "Adore"
laugh: "Rire" laugh: "Rire"
hmm: "Hmm … ?" hmm: "Hmm … ?"
@@ -85,8 +85,8 @@ common:
public: "Public" public: "Public"
home: "Principal" home: "Principal"
home-desc: "Publier sur le fil principal uniquement" home-desc: "Publier sur le fil principal uniquement"
followers: "Abonnés·es" followers: "Abonné·e·s"
followers-desc: "Publier à vos abonnés·es uniquement" followers-desc: "Publier à vos abonné·e·s uniquement"
specified: "Direct" specified: "Direct"
specified-desc: "Publier uniquement aux utilisateurs·rices mentionnés·es" specified-desc: "Publier uniquement aux utilisateurs·rices mentionnés·es"
private: "Privé" private: "Privé"
@@ -99,7 +99,7 @@ common:
f: "En attente de vos écrits" f: "En attente de vos écrits"
search: "Recherche" search: "Recherche"
delete: "Supprimer" delete: "Supprimer"
loading: "Chargement" loading: "Chargement en cours"
ok: "OK" ok: "OK"
update-available-title: "Mise à jour disponible" update-available-title: "Mise à jour disponible"
update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour." update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour."
@@ -117,8 +117,8 @@ common:
this-setting-is-this-device-only: "Uniquement sur cet appareil" this-setting-is-this-device-only: "Uniquement sur cet appareil"
use-os-default-emojis: "Utiliser les émojis standards du système" use-os-default-emojis: "Utiliser les émojis standards du système"
do-not-use-in-production: 'Il sagit dune version de développement. Ne pas utiliser dans un environnement de production.' do-not-use-in-production: 'Il sagit dune version de développement. Ne pas utiliser dans un environnement de production.'
is-remote-user: "Ces informations utilisateur ont été copiées." is-remote-user: "Ces informations appartiennent à un·e utilisateur·rice distant·e."
is-remote-post: "Ceci est une publication distante" is-remote-post: "Ceci est une publication distante."
view-on-remote: "Consulter le profil complet" view-on-remote: "Consulter le profil complet"
error: error:
title: 'Une erreur est survenue' title: 'Une erreur est survenue'
@@ -151,7 +151,7 @@ common:
notifications: "Notifications" notifications: "Notifications"
users: "Utilisateur·rice·s" users: "Utilisateur·rice·s"
polls: "Sondages" polls: "Sondages"
post-form: "Formulaire de publication" post-form: "Champs de publication"
server: "Info sur le serveur" server: "Info sur le serveur"
donation: "Dons" donation: "Dons"
nav: "Navigation" nav: "Navigation"
@@ -166,7 +166,7 @@ auth/views/form.vue:
account-write: "Modifications des informations du compte :" account-write: "Modifications des informations du compte :"
note-write: "Publier." note-write: "Publier."
like-write: "Réagir aux publications." like-write: "Réagir aux publications."
following-write: "S'abonner et se désabonner." following-write: "Sabonner et se désabonner."
drive-read: "Lire votre Drive" drive-read: "Lire votre Drive"
drive-write: "Téléverser/supprimer des fichiers dans votre Drive." drive-write: "Téléverser/supprimer des fichiers dans votre Drive."
notification-read: "Lire vos notifications." notification-read: "Lire vos notifications."
@@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
destroy: "Annuler ce sondage" destroy: "Annuler ce sondage"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "Choisissez votre réaction" choose-reaction: "Choisissez votre réaction"
common/views/components/emoji-picker.vue:
custom-emoji: "Émoji personnalisé"
people: "Personnes"
animals-and-nature: "Animaux et nature"
food-and-drink: "Nourriture et boisson"
activity: "Activités"
travel-and-places: "Lieux et voyages"
objects: "Objets"
symbols: "Symboles"
flags: "Drapeaux"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "Nom d'utilisateur·rice" username: "Nom d'utilisateur·rice"
password: "Mot de passe" password: "Mot de passe"
@@ -353,6 +363,7 @@ common/views/components/signin.vue:
or: "Ou" or: "Ou"
signin-with-twitter: "Se connecter via Twitter" signin-with-twitter: "Se connecter via Twitter"
signin-with-github: "Se connecter avec GitHub" signin-with-github: "Se connecter avec GitHub"
signin-with-discord: "Discordでログイン"
login-failed: "Échec d'authentification. Veuillez vérifier que votre nom d'utilisateur et mot de passe sont corrects." login-failed: "Échec d'authentification. Veuillez vérifier que votre nom d'utilisateur et mot de passe sont corrects."
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "Code dinvitation" invitation-code: "Code dinvitation"
@@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
reconnect: "Reconnecter" reconnect: "Reconnecter"
connect: "Se connecter avec GitHub" connect: "Se connecter avec GitHub"
disconnect: "Déconnecter" disconnect: "Déconnecter"
common/views/components/discord-setting.vue:
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
connected-to: "次のDiscordアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Discordと接続する"
disconnect: "切断する"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "Veuillez patienter" waiting: "Veuillez patienter"
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
@@ -490,9 +508,9 @@ common/views/pages/follow.vue:
signed-in-as: "Connecté·e en tant que {}" signed-in-as: "Connecté·e en tant que {}"
following: "Suit" following: "Suit"
follow: "Suivre" follow: "Suivre"
request-pending: "Demande d'abonnement en attente" request-pending: "Demande dabonnement en attente"
follow-processing: "En cours dabonnement" follow-processing: "Demande en attente"
follow-request: "Demande d'abonnement" follow-request: "Demande dabonnement"
desktop: desktop:
banner-crop-title: "Découpez la partie qui apparaitra comme bannière" banner-crop-title: "Découpez la partie qui apparaitra comme bannière"
banner: "Bannière" banner: "Bannière"
@@ -588,16 +606,10 @@ desktop/views/components/media-image.vue:
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "Le contenu est NSFW" sensitive: "Le contenu est NSFW"
click-to-show: "Cliquer pour afficher" click-to-show: "Cliquer pour afficher"
desktop/views/components/follow-button.vue:
following: "Abonné·e"
follow: "Suivre"
request-pending: "En attente d'approbation"
follow-processing: "Continuer labonnement"
follow-request: "Demande d'abonnement"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} abonné·e·s" followers: "{} abonné·e·s"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
empty: "Il semble que vous n'avez pas encore d'abonné·e·s." empty: "Il semble que vous navez pas encore dabonné·e·s."
desktop/views/components/following-window.vue: desktop/views/components/following-window.vue:
following: "Suit {}" following: "Suit {}"
desktop/views/components/following.vue: desktop/views/components/following.vue:
@@ -640,7 +652,7 @@ desktop/views/components/notes.vue:
error: "Échec du chargement." error: "Échec du chargement."
retry: "Réessayer" retry: "Réessayer"
desktop/views/components/notifications.vue: desktop/views/components/notifications.vue:
empty: "Pas de notifications" empty: "Aucune de notification !"
desktop/views/components/post-form.vue: desktop/views/components/post-form.vue:
add-visible-user: "+Ajouter un utilisateur" add-visible-user: "+Ajouter un utilisateur"
attach-location-information: "Attacher des informations de localisation" attach-location-information: "Attacher des informations de localisation"
@@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
block: "En cours blocage" block: "En cours blocage"
no-muted-users: "Aucun utilisateur·rice nest mis·e en sourdine" no-muted-users: "Aucun utilisateur·rice nest mis·e en sourdine"
no-blocked-users: "Aucun utilisateur·rice nest bloqué·e" no-blocked-users: "Aucun utilisateur·rice nest bloqué·e"
word-mute: "Filtre de mots"
muted-words: "Mots masqués"
muted-words-description: "Description des mots mis en sourdine"
save: "Enregistrer"
common/views/components/password-settings.vue: common/views/components/password-settings.vue:
reset: "Modifier le mot de passe" reset: "Modifier le mot de passe"
enter-current-password: "Entrez votre mot de passe actuel" enter-current-password: "Entrez votre mot de passe actuel"
@@ -880,7 +896,7 @@ desktop/views/components/ui.header.search.vue:
placeholder: "Chercher" placeholder: "Chercher"
desktop/views/components/received-follow-requests-window.vue: desktop/views/components/received-follow-requests-window.vue:
title: "Demandes de suivi" title: "Demandes de suivi"
accept: "Approuver" accept: "Accepter"
reject: "Refuser" reject: "Refuser"
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "Listes de l'utilisateur" title: "Listes de l'utilisateur"
@@ -903,6 +919,7 @@ admin/views/index.vue:
dashboard: "Tableau de bord" dashboard: "Tableau de bord"
instance: "Instance" instance: "Instance"
emoji: "Emoji" emoji: "Emoji"
moderators: "モデレーター"
users: "Utilisateur·rice·s" users: "Utilisateur·rice·s"
update: "Mise à jour" update: "Mise à jour"
announcements: "Annonces" announcements: "Annonces"
@@ -947,7 +964,12 @@ admin/views/instance.vue:
github-integration-info: "LURL callback est définit sur /api/gh/cb" github-integration-info: "LURL callback est définit sur /api/gh/cb"
enable-github-integration: "Activer lauthentification avec Github" enable-github-integration: "Activer lauthentification avec Github"
github-integration-client-id: "ID client" github-integration-client-id: "ID client"
github-integration-client-secret: "Secret client" github-integration-client-secret: "Client Secret"
discord-integration-config: "Discord連携の設定"
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
enable-discord-integration: "Discord連携を有効にする"
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "Compte proxy" proxy-account-config: "Compte proxy"
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。" proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
proxy-account-username: "Nom dutilisateur du compte proxy" proxy-account-username: "Nom dutilisateur du compte proxy"
@@ -997,6 +1019,11 @@ admin/views/users.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "Ôter la vérification du compte" unverify: "Ôter la vérification du compte"
unverified: "Ce compte n'est plus vérifié" unverified: "Ce compte n'est plus vérifié"
admin/views/moderators.vue:
add-moderator:
title: "モデレーターの登録"
add: "登録"
added: "モデレーターを登録しました"
admin/views/emoji.vue: admin/views/emoji.vue:
add-emoji: add-emoji:
title: "Ajouter un émoji" title: "Ajouter un émoji"
@@ -1067,7 +1094,7 @@ desktop/views/pages/user-list.users.vue:
desktop/views/pages/user/user.followers-you-know.vue: desktop/views/pages/user/user.followers-you-know.vue:
title: "Abonné·e·s que vous connaissez" title: "Abonné·e·s que vous connaissez"
loading: "Chargement en cours" loading: "Chargement en cours"
no-users: "Pas d'utilisateurs" no-users: "Aucun abonné connu"
desktop/views/pages/user/user.friends.vue: desktop/views/pages/user/user.friends.vue:
title: "Mentions fréquentes" title: "Mentions fréquentes"
loading: "Chargement en cours" loading: "Chargement en cours"
@@ -1079,8 +1106,8 @@ desktop/views/pages/user/user.photos.vue:
desktop/views/pages/user/user.profile.vue: desktop/views/pages/user/user.profile.vue:
follows-you: "Vous suit" follows-you: "Vous suit"
stalk: "Traquer" stalk: "Traquer"
stalking: "ストーキングしています" stalking: "Entrain de poursuivre"
unstalk: "ストーク解除" unstalk: "Cesser la poursuite"
mute: "Mettre en sourdine" mute: "Mettre en sourdine"
muted: "Muting" muted: "Muting"
unmute: "Enlever la sourdine" unmute: "Enlever la sourdine"
@@ -1161,12 +1188,12 @@ mobile/views/components/media-image.vue:
mobile/views/components/media-video.vue: mobile/views/components/media-video.vue:
sensitive: "Le contenu est NSFW" sensitive: "Le contenu est NSFW"
click-to-show: "Cliquer pour afficher" click-to-show: "Cliquer pour afficher"
mobile/views/components/follow-button.vue: common/views/components/follow-button.vue:
following: "Abonné·e" following: "Abonné·e"
follow: " Suivre" follow: " Suivre"
request-pending: "En attente d'approbation" request-pending: "Demande en attente"
follow-processing: "En cours dabonnement" follow-processing: "En cours dabonnement"
follow-request: "Demande d'abonnement" follow-request: "Demande dabonnement"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "Abonnez-vous aux utilisateurs" title: "Abonnez-vous aux utilisateurs"
empty: "Impossible de trouver des utilisateurs·trices à recommander." empty: "Impossible de trouver des utilisateurs·trices à recommander."
@@ -1194,7 +1221,7 @@ mobile/views/components/note-sub.vue:
bot: "bot" bot: "bot"
cat: "chat" cat: "chat"
mobile/views/components/notifications.vue: mobile/views/components/notifications.vue:
empty: "Pas de notifications" empty: "Aucune de notification !"
mobile/views/components/post-form.vue: mobile/views/components/post-form.vue:
add-visible-user: "Ajouter un utilisateur" add-visible-user: "Ajouter un utilisateur"
submit: "Publier" submit: "Publier"
@@ -1219,7 +1246,7 @@ mobile/views/components/ui.header.vue:
mobile/views/components/ui.nav.vue: mobile/views/components/ui.nav.vue:
timeline: "Fil d'actualité" timeline: "Fil d'actualité"
notifications: "Notifications" notifications: "Notifications"
follow-requests: "Demandes d'abonnement" follow-requests: "Demandes dabonnement"
search: "Rechercher" search: "Rechercher"
favorites: "Favoris" favorites: "Favoris"
user-lists: "Listes" user-lists: "Listes"
@@ -1267,8 +1294,8 @@ mobile/views/pages/widgets/activity.vue:
mobile/views/pages/share.vue: mobile/views/pages/share.vue:
share-with: "Partager avec {name}" share-with: "Partager avec {name}"
mobile/views/pages/received-follow-requests.vue: mobile/views/pages/received-follow-requests.vue:
title: "Demandes d'abonnement" title: "Demandes dabonnement"
accept: "Approuver" accept: "Accepter"
reject: "Refuser" reject: "Refuser"
mobile/views/pages/note.vue: mobile/views/pages/note.vue:
title: "Post" title: "Post"
@@ -1276,7 +1303,7 @@ mobile/views/pages/note.vue:
next: "Note suivante" next: "Note suivante"
mobile/views/pages/notifications.vue: mobile/views/pages/notifications.vue:
notifications: "Notifications" notifications: "Notifications"
read-all: "Êtes vous sûr de vouloir marqués toutes les notifications non-lus en tant que lus?" read-all: "Êtes-vous sûr de vouloir marquer lensemble des notifications comme étant lues ?"
mobile/views/pages/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "Reversi" reversi: "Reversi"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
@@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
github-connect: "Se connecter à votre compte GitHub" github-connect: "Se connecter à votre compte GitHub"
github-reconnect: "Reconnecter" github-reconnect: "Reconnecter"
github-disconnect: "Déconnecter" github-disconnect: "Déconnecter"
discord: "Discord連携"
discord-connect: "Discordアカウントに接続する"
discord-reconnect: "再接続する"
discord-disconnect: "切断する"
update: "Mise à jour de Misskey" update: "Mise à jour de Misskey"
version: "Version :" version: "Version :"
latest-version: "Dernière version :" latest-version: "Dernière version :"
@@ -1363,7 +1394,7 @@ mobile/views/pages/user/home.vue:
followers-you-know: "Abonné·e·s que vous connaissez" followers-you-know: "Abonné·e·s que vous connaissez"
last-used-at: "Dernière connexion il y a" last-used-at: "Dernière connexion il y a"
mobile/views/pages/user/home.followers-you-know.vue: mobile/views/pages/user/home.followers-you-know.vue:
no-users: "Pas d'utilisateurs" no-users: "Aucun utilisateur·rice connu·e"
mobile/views/pages/user/home.friends.vue: mobile/views/pages/user/home.friends.vue:
no-users: "Pass d'utilisateurs" no-users: "Pass d'utilisateurs"
mobile/views/pages/user/home.notes.vue: mobile/views/pages/user/home.notes.vue:

View File

@@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
destroy: "アンケートを破棄" destroy: "アンケートを破棄"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択" choose-reaction: "リアクションを選択"
common/views/components/emoji-picker.vue:
custom-emoji: "カスタム絵文字"
people: "人"
animals-and-nature: "動物&自然"
food-and-drink: "食べ物&飲み物"
activity: "アクティビティ"
travel-and-places: "場所"
objects: "物"
symbols: "記号"
flags: "旗"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "ユーザー名" username: "ユーザー名"
password: "パスワード" password: "パスワード"
@@ -353,6 +363,7 @@ common/views/components/signin.vue:
or: "または" or: "または"
signin-with-twitter: "Twitterでログイン" signin-with-twitter: "Twitterでログイン"
signin-with-github: "GitHubでログイン" signin-with-github: "GitHubでログイン"
signin-with-discord: "Discordでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "招待コード" invitation-code: "招待コード"
@@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
reconnect: "再接続する" reconnect: "再接続する"
connect: "GitHubと接続する" connect: "GitHubと接続する"
disconnect: "切断する" disconnect: "切断する"
common/views/components/discord-setting.vue:
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
connected-to: "次のDiscordアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Discordと接続する"
disconnect: "切断する"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "待機中" waiting: "待機中"
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
@@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
block: "ブロック" block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません" no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません" no-blocked-users: "ブロックしているユーザーはいません"
word-mute: "ワードミュート"
muted-words: "ミュートされたキーワード"
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
save: "保存"
common/views/components/password-settings.vue: common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
@@ -903,6 +919,7 @@ admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス" instance: "インスタンス"
emoji: "カスタム絵文字" emoji: "カスタム絵文字"
moderators: "モデレーター"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@@ -947,7 +964,12 @@ admin/views/instance.vue:
github-integration-info: "コールバックURLは /api/gh/cb に設定します。" github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
enable-github-integration: "GitHub連携を有効にする" enable-github-integration: "GitHub連携を有効にする"
github-integration-client-id: "Client ID" github-integration-client-id: "Client ID"
github-integration-client-secret: "Client secret" github-integration-client-secret: "Client Secret"
discord-integration-config: "Discord連携の設定"
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
enable-discord-integration: "Discord連携を有効にする"
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "プロキシアカウントの設定" proxy-account-config: "プロキシアカウントの設定"
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。" proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
proxy-account-username: "プロキシアカウントのユーザー名" proxy-account-username: "プロキシアカウントのユーザー名"
@@ -997,6 +1019,11 @@ admin/views/users.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
admin/views/moderators.vue:
add-moderator:
title: "モデレーターの登録"
add: "登録"
added: "モデレーターを登録しました"
admin/views/emoji.vue: admin/views/emoji.vue:
add-emoji: add-emoji:
title: "絵文字の登録" title: "絵文字の登録"
@@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
mobile/views/components/media-video.vue: mobile/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue: common/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
@@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
github-connect: "GitHubアカウントに接続する" github-connect: "GitHubアカウントに接続する"
github-reconnect: "再接続する" github-reconnect: "再接続する"
github-disconnect: "切断する" github-disconnect: "切断する"
discord: "Discord連携"
discord-connect: "Discordアカウントに接続する"
discord-reconnect: "再接続する"
discord-disconnect: "切断する"
update: "Misskey Update" update: "Misskey Update"
version: "バージョン:" version: "バージョン:"
latest-version: "最新のバージョン:" latest-version: "最新のバージョン:"

View File

@@ -96,6 +96,9 @@ common:
specified: "ダイレクト" specified: "ダイレクト"
specified-desc: "指定したユーザーにのみ公開" specified-desc: "指定したユーザーにのみ公開"
private: "非公開" private: "非公開"
local-public: "公開(ローカルのみ)"
local-home: "ホーム(ローカルのみ)"
local-followers: "フォロワー(ローカルのみ)"
note-placeholders: note-placeholders:
a: "今どうしてる?" a: "今どうしてる?"
@@ -379,6 +382,17 @@ common/views/components/poll-editor.vue:
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択" choose-reaction: "リアクションを選択"
common/views/components/emoji-picker.vue:
custom-emoji: "カスタム絵文字"
people: "人"
animals-and-nature: "動物&自然"
food-and-drink: "食べ物&飲み物"
activity: "アクティビティ"
travel-and-places: "場所"
objects: "物"
symbols: "記号"
flags: "旗"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "ユーザー名" username: "ユーザー名"
password: "パスワード" password: "パスワード"
@@ -388,6 +402,7 @@ common/views/components/signin.vue:
or: "または" or: "または"
signin-with-twitter: "Twitterでログイン" signin-with-twitter: "Twitterでログイン"
signin-with-github: "GitHubでログイン" signin-with-github: "GitHubでログイン"
signin-with-discord: "Discordでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue: common/views/components/signup.vue:
@@ -439,6 +454,14 @@ common/views/components/github-setting.vue:
connect: "GitHubと接続する" connect: "GitHubと接続する"
disconnect: "切断する" disconnect: "切断する"
common/views/components/discord-setting.vue:
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
connected-to: "次のDiscordアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Discordと接続する"
disconnect: "切断する"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "待機中" waiting: "待機中"
@@ -451,6 +474,9 @@ common/views/components/visibility-chooser.vue:
specified: "ダイレクト" specified: "ダイレクト"
specified-desc: "指定したユーザーにのみ公開" specified-desc: "指定したユーザーにのみ公開"
private: "非公開" private: "非公開"
local-public: "公開(ローカルのみ)"
local-home: "ホーム(ローカルのみ)"
local-followers: "フォロワー(ローカルのみ)"
common/views/components/trends.vue: common/views/components/trends.vue:
count: "{}人が投稿" count: "{}人が投稿"
@@ -657,13 +683,6 @@ desktop/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
@@ -748,6 +767,7 @@ desktop/views/components/post-form.vue:
create-poll: "アンケートを作成" create-poll: "アンケートを作成"
text-remain: "残り{}文字" text-remain: "残り{}文字"
recent-tags: "最近" recent-tags: "最近"
local-only-message: "この投稿はローカルにのみ公開されます"
click-to-tagging: "クリックでタグ付け" click-to-tagging: "クリックでタグ付け"
visibility: "公開範囲" visibility: "公開範囲"
geolocation-alert: "お使いの端末は位置情報に対応していません" geolocation-alert: "お使いの端末は位置情報に対応していません"
@@ -786,6 +806,7 @@ desktop/views/components/settings.vue:
profile: "プロフィール" profile: "プロフィール"
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
tags: "ハッシュタグ"
mute-and-block: "ミュート/ブロック" mute-and-block: "ミュート/ブロック"
blocking: "ブロック" blocking: "ブロック"
security: "セキュリティ" security: "セキュリティ"
@@ -830,6 +851,7 @@ desktop/views/components/settings.vue:
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する" show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開" show-maps: "マップの自動展開"
remain-deleted-note: "削除された投稿を表示し続ける"
deck-column-align: "デッキのカラムの位置" deck-column-align: "デッキのカラムの位置"
deck-column-align-center: "中央" deck-column-align-center: "中央"
deck-column-align-left: "左" deck-column-align-left: "左"
@@ -1030,8 +1052,9 @@ admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス" instance: "インスタンス"
emoji: "カスタム絵文字" emoji: "カスタム絵文字"
moderators: "モデレーター"
users: "ユーザー" users: "ユーザー"
update: "更新" federation: "連合"
announcements: "お知らせ" announcements: "お知らせ"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
back-to-misskey: "Misskeyに戻る" back-to-misskey: "Misskeyに戻る"
@@ -1076,7 +1099,12 @@ admin/views/instance.vue:
github-integration-info: "コールバックURLは /api/gh/cb に設定します。" github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
enable-github-integration: "GitHub連携を有効にする" enable-github-integration: "GitHub連携を有効にする"
github-integration-client-id: "Client ID" github-integration-client-id: "Client ID"
github-integration-client-secret: "Client secret" github-integration-client-secret: "Client Secret"
discord-integration-config: "Discord連携の設定"
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
enable-discord-integration: "Discord連携を有効にする"
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "プロキシアカウントの設定" proxy-account-config: "プロキシアカウントの設定"
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。" proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
proxy-account-username: "プロキシアカウントのユーザー名" proxy-account-username: "プロキシアカウントのユーザー名"
@@ -1129,6 +1157,12 @@ admin/views/users.vue:
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
admin/views/moderators.vue:
add-moderator:
title: "モデレーターの登録"
add: "登録"
added: "モデレーターを登録しました"
admin/views/emoji.vue: admin/views/emoji.vue:
add-emoji: add-emoji:
title: "絵文字の登録" title: "絵文字の登録"
@@ -1325,7 +1359,7 @@ mobile/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue: common/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
@@ -1519,6 +1553,10 @@ mobile/views/pages/settings.vue:
github-connect: "GitHubアカウントに接続する" github-connect: "GitHubアカウントに接続する"
github-reconnect: "再接続する" github-reconnect: "再接続する"
github-disconnect: "切断する" github-disconnect: "切断する"
discord: "Discord連携"
discord-connect: "Discordアカウントに接続する"
discord-reconnect: "再接続する"
discord-disconnect: "切断する"
update: "Misskey Update" update: "Misskey Update"
version: "バージョン:" version: "バージョン:"
latest-version: "最新のバージョン:" latest-version: "最新のバージョン:"

View File

@@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
destroy: "アンケートをほかそ" destroy: "アンケートをほかそ"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "リアクション、どれにするんや?" choose-reaction: "リアクション、どれにするんや?"
common/views/components/emoji-picker.vue:
custom-emoji: "カスタム絵文字"
people: "人"
animals-and-nature: "動物&自然"
food-and-drink: "食べ物&飲み物"
activity: "アクティビティ"
travel-and-places: "場所"
objects: "物"
symbols: "記号"
flags: "旗"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "ユーザー名" username: "ユーザー名"
password: "パスワード" password: "パスワード"
@@ -353,6 +363,7 @@ common/views/components/signin.vue:
or: "それか" or: "それか"
signin-with-twitter: "Twitterでサインイン" signin-with-twitter: "Twitterでサインイン"
signin-with-github: "GitHubでログイン" signin-with-github: "GitHubでログイン"
signin-with-discord: "Discordでログイン"
login-failed: "なんかログインできんかったわ。ユーザー名とパスワードとかを確認してや。" login-failed: "なんかログインできんかったわ。ユーザー名とパスワードとかを確認してや。"
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "招待コード" invitation-code: "招待コード"
@@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
reconnect: "再接続する" reconnect: "再接続する"
connect: "GitHubと接続する" connect: "GitHubと接続する"
disconnect: "切断する" disconnect: "切断する"
common/views/components/discord-setting.vue:
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
connected-to: "次のDiscordアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Discordと接続する"
disconnect: "切断する"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "待っとる" waiting: "待っとる"
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
@@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "ちょっと見せられへんわ" sensitive: "ちょっと見せられへんわ"
click-to-show: "クリックして見せるで" click-to-show: "クリックして見せるで"
desktop/views/components/follow-button.vue:
following: "フォローしとる"
follow: "フォロー"
request-pending: "フォローの許し待っとる"
follow-processing: "今フォロー処理やっとる‥"
follow-request: "フォロー許してくれや!言うてみる"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
block: "ブロック" block: "ブロック"
no-muted-users: "ミュートしとるユーザーはおらんで" no-muted-users: "ミュートしとるユーザーはおらんで"
no-blocked-users: "ブロックしとるユーザーはおらんで" no-blocked-users: "ブロックしとるユーザーはおらんで"
word-mute: "ワードミュート"
muted-words: "ミュートされたキーワード"
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
save: "保存"
common/views/components/password-settings.vue: common/views/components/password-settings.vue:
reset: "パスワード変える" reset: "パスワード変える"
enter-current-password: "今のパスワードを入れてや" enter-current-password: "今のパスワードを入れてや"
@@ -903,6 +919,7 @@ admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス" instance: "インスタンス"
emoji: "カスタム絵文字" emoji: "カスタム絵文字"
moderators: "モデレーター"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "知っといてや" announcements: "知っといてや"
@@ -947,7 +964,12 @@ admin/views/instance.vue:
github-integration-info: "コールバックURLは /api/gh/cb に設定します。" github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
enable-github-integration: "GitHub連携を有効にする" enable-github-integration: "GitHub連携を有効にする"
github-integration-client-id: "Client ID" github-integration-client-id: "Client ID"
github-integration-client-secret: "Client secret" github-integration-client-secret: "Client Secret"
discord-integration-config: "Discord連携の設定"
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
enable-discord-integration: "Discord連携を有効にする"
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "プロキシアカウントの設定" proxy-account-config: "プロキシアカウントの設定"
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。" proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
proxy-account-username: "プロキシアカウントのユーザー名" proxy-account-username: "プロキシアカウントのユーザー名"
@@ -997,6 +1019,11 @@ admin/views/users.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
admin/views/moderators.vue:
add-moderator:
title: "モデレーターの登録"
add: "登録"
added: "モデレーターを登録しました"
admin/views/emoji.vue: admin/views/emoji.vue:
add-emoji: add-emoji:
title: "絵文字の登録" title: "絵文字の登録"
@@ -1161,12 +1188,12 @@ mobile/views/components/media-image.vue:
mobile/views/components/media-video.vue: mobile/views/components/media-video.vue:
sensitive: "ちょっと見せられへんわ" sensitive: "ちょっと見せられへんわ"
click-to-show: "押してみ、見せたるわ" click-to-show: "押してみ、見せたるわ"
mobile/views/components/follow-button.vue: common/views/components/follow-button.vue:
following: "フォローしとる" following: "フォロー"
follow: "フォロー" follow: "フォロー"
request-pending: "フォローの許し待っとる" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理やっとる‥" follow-processing: "フォロー処理"
follow-request: "フォロー許してくれや!言うてみる" follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "おもろそうやな" title: "おもろそうやな"
empty: "おすすめのユーザーはおらん。" empty: "おすすめのユーザーはおらん。"
@@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
github-connect: "GitHubアカウントに接続する" github-connect: "GitHubアカウントに接続する"
github-reconnect: "再接続する" github-reconnect: "再接続する"
github-disconnect: "切断する" github-disconnect: "切断する"
discord: "Discord連携"
discord-connect: "Discordアカウントに接続する"
discord-reconnect: "再接続する"
discord-disconnect: "切断する"
update: "あんたのMisskeyいつのや" update: "あんたのMisskeyいつのや"
version: "バージョン:" version: "バージョン:"
latest-version: "いっちゃん新しいやつ:" latest-version: "いっちゃん新しいやつ:"

View File

@@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
destroy: "アンケートを破棄" destroy: "アンケートを破棄"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択" choose-reaction: "リアクションを選択"
common/views/components/emoji-picker.vue:
custom-emoji: "カスタム絵文字"
people: "人"
animals-and-nature: "動物&自然"
food-and-drink: "食べ物&飲み物"
activity: "アクティビティ"
travel-and-places: "場所"
objects: "物"
symbols: "記号"
flags: "旗"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "ユーザー名" username: "ユーザー名"
password: "パスワード" password: "パスワード"
@@ -353,6 +363,7 @@ common/views/components/signin.vue:
or: "または" or: "または"
signin-with-twitter: "Twitterでログイン" signin-with-twitter: "Twitterでログイン"
signin-with-github: "GitHubでログイン" signin-with-github: "GitHubでログイン"
signin-with-discord: "Discordでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "招待コード" invitation-code: "招待コード"
@@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
reconnect: "再接続する" reconnect: "再接続する"
connect: "GitHubと接続する" connect: "GitHubと接続する"
disconnect: "切断する" disconnect: "切断する"
common/views/components/discord-setting.vue:
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
connected-to: "次のDiscordアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Discordと接続する"
disconnect: "切断する"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "待機中" waiting: "待機中"
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
@@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
block: "ブロック" block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません" no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません" no-blocked-users: "ブロックしているユーザーはいません"
word-mute: "ワードミュート"
muted-words: "ミュートされたキーワード"
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
save: "保存"
common/views/components/password-settings.vue: common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
@@ -903,6 +919,7 @@ admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス" instance: "インスタンス"
emoji: "カスタム絵文字" emoji: "カスタム絵文字"
moderators: "モデレーター"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@@ -947,7 +964,12 @@ admin/views/instance.vue:
github-integration-info: "コールバックURLは /api/gh/cb に設定します。" github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
enable-github-integration: "GitHub連携を有効にする" enable-github-integration: "GitHub連携を有効にする"
github-integration-client-id: "Client ID" github-integration-client-id: "Client ID"
github-integration-client-secret: "Client secret" github-integration-client-secret: "Client Secret"
discord-integration-config: "Discord連携の設定"
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
enable-discord-integration: "Discord連携を有効にする"
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "プロキシアカウントの設定" proxy-account-config: "プロキシアカウントの設定"
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。" proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
proxy-account-username: "プロキシアカウントのユーザー名" proxy-account-username: "プロキシアカウントのユーザー名"
@@ -997,6 +1019,11 @@ admin/views/users.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
admin/views/moderators.vue:
add-moderator:
title: "モデレーターの登録"
add: "登録"
added: "モデレーターを登録しました"
admin/views/emoji.vue: admin/views/emoji.vue:
add-emoji: add-emoji:
title: "絵文字の登録" title: "絵文字の登録"
@@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
mobile/views/components/media-video.vue: mobile/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue: common/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
@@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
github-connect: "GitHubアカウントに接続する" github-connect: "GitHubアカウントに接続する"
github-reconnect: "再接続する" github-reconnect: "再接続する"
github-disconnect: "切断する" github-disconnect: "切断する"
discord: "Discord連携"
discord-connect: "Discordアカウントに接続する"
discord-reconnect: "再接続する"
discord-disconnect: "切断する"
update: "Misskey Update" update: "Misskey Update"
version: "バージョン:" version: "バージョン:"
latest-version: "最新のバージョン:" latest-version: "最新のバージョン:"

View File

@@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
destroy: "Deze peiling vernietigen" destroy: "Deze peiling vernietigen"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "Kies een reactie" choose-reaction: "Kies een reactie"
common/views/components/emoji-picker.vue:
custom-emoji: "カスタム絵文字"
people: "人"
animals-and-nature: "動物&自然"
food-and-drink: "食べ物&飲み物"
activity: "アクティビティ"
travel-and-places: "場所"
objects: "物"
symbols: "記号"
flags: "旗"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "Gebruikersnaam" username: "Gebruikersnaam"
password: "Wachtwoord" password: "Wachtwoord"
@@ -353,6 +363,7 @@ common/views/components/signin.vue:
or: "または" or: "または"
signin-with-twitter: "Twitterでログイン" signin-with-twitter: "Twitterでログイン"
signin-with-github: "GitHubでログイン" signin-with-github: "GitHubでログイン"
signin-with-discord: "Discordでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "招待コード" invitation-code: "招待コード"
@@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
reconnect: "再接続する" reconnect: "再接続する"
connect: "GitHubと接続する" connect: "GitHubと接続する"
disconnect: "切断する" disconnect: "切断する"
common/views/components/discord-setting.vue:
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
connected-to: "次のDiscordアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Discordと接続する"
disconnect: "切断する"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "Bezig met wachten" waiting: "Bezig met wachten"
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
@@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "フォロー中"
follow: "Volgen"
request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "Volgers van {}" followers: "Volgers van {}"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
block: "ブロック" block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません" no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません" no-blocked-users: "ブロックしているユーザーはいません"
word-mute: "ワードミュート"
muted-words: "ミュートされたキーワード"
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
save: "保存"
common/views/components/password-settings.vue: common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
@@ -903,6 +919,7 @@ admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス" instance: "インスタンス"
emoji: "カスタム絵文字" emoji: "カスタム絵文字"
moderators: "モデレーター"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@@ -947,7 +964,12 @@ admin/views/instance.vue:
github-integration-info: "コールバックURLは /api/gh/cb に設定します。" github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
enable-github-integration: "GitHub連携を有効にする" enable-github-integration: "GitHub連携を有効にする"
github-integration-client-id: "Client ID" github-integration-client-id: "Client ID"
github-integration-client-secret: "Client secret" github-integration-client-secret: "Client Secret"
discord-integration-config: "Discord連携の設定"
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
enable-discord-integration: "Discord連携を有効にする"
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "プロキシアカウントの設定" proxy-account-config: "プロキシアカウントの設定"
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。" proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
proxy-account-username: "プロキシアカウントのユーザー名" proxy-account-username: "プロキシアカウントのユーザー名"
@@ -997,6 +1019,11 @@ admin/views/users.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
admin/views/moderators.vue:
add-moderator:
title: "モデレーターの登録"
add: "登録"
added: "モデレーターを登録しました"
admin/views/emoji.vue: admin/views/emoji.vue:
add-emoji: add-emoji:
title: "絵文字の登録" title: "絵文字の登録"
@@ -1161,9 +1188,9 @@ mobile/views/components/media-image.vue:
mobile/views/components/media-video.vue: mobile/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue: common/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "Volgen" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中" follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
@@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
github-connect: "GitHubアカウントに接続する" github-connect: "GitHubアカウントに接続する"
github-reconnect: "再接続する" github-reconnect: "再接続する"
github-disconnect: "切断する" github-disconnect: "切断する"
discord: "Discord連携"
discord-connect: "Discordアカウントに接続する"
discord-reconnect: "再接続する"
discord-disconnect: "切断する"
update: "Misskey-update" update: "Misskey-update"
version: "Huidige versie:" version: "Huidige versie:"
latest-version: "Nieuwste versie:" latest-version: "Nieuwste versie:"

View File

@@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
destroy: "アンケートを破棄" destroy: "アンケートを破棄"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択" choose-reaction: "リアクションを選択"
common/views/components/emoji-picker.vue:
custom-emoji: "カスタム絵文字"
people: "人"
animals-and-nature: "動物&自然"
food-and-drink: "食べ物&飲み物"
activity: "アクティビティ"
travel-and-places: "場所"
objects: "物"
symbols: "記号"
flags: "旗"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "Brukernavn" username: "Brukernavn"
password: "Passord" password: "Passord"
@@ -353,6 +363,7 @@ common/views/components/signin.vue:
or: "Eller" or: "Eller"
signin-with-twitter: "Twitterでログイン" signin-with-twitter: "Twitterでログイン"
signin-with-github: "GitHubでログイン" signin-with-github: "GitHubでログイン"
signin-with-discord: "Discordでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "招待コード" invitation-code: "招待コード"
@@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
reconnect: "再接続する" reconnect: "再接続する"
connect: "GitHubと接続する" connect: "GitHubと接続する"
disconnect: "切断する" disconnect: "切断する"
common/views/components/discord-setting.vue:
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
connected-to: "次のDiscordアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Discordと接続する"
disconnect: "切断する"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "Venter" waiting: "Venter"
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
@@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "Innholdet er NSFW" sensitive: "Innholdet er NSFW"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "Følger"
follow: "Følg"
request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
block: "ブロック" block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません" no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません" no-blocked-users: "ブロックしているユーザーはいません"
word-mute: "ワードミュート"
muted-words: "ミュートされたキーワード"
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
save: "保存"
common/views/components/password-settings.vue: common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
@@ -903,6 +919,7 @@ admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス" instance: "インスタンス"
emoji: "カスタム絵文字" emoji: "カスタム絵文字"
moderators: "モデレーター"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@@ -947,7 +964,12 @@ admin/views/instance.vue:
github-integration-info: "コールバックURLは /api/gh/cb に設定します。" github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
enable-github-integration: "GitHub連携を有効にする" enable-github-integration: "GitHub連携を有効にする"
github-integration-client-id: "Client ID" github-integration-client-id: "Client ID"
github-integration-client-secret: "Client secret" github-integration-client-secret: "Client Secret"
discord-integration-config: "Discord連携の設定"
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
enable-discord-integration: "Discord連携を有効にする"
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "プロキシアカウントの設定" proxy-account-config: "プロキシアカウントの設定"
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。" proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
proxy-account-username: "プロキシアカウントのユーザー名" proxy-account-username: "プロキシアカウントのユーザー名"
@@ -997,6 +1019,11 @@ admin/views/users.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
admin/views/moderators.vue:
add-moderator:
title: "モデレーターの登録"
add: "登録"
added: "モデレーターを登録しました"
admin/views/emoji.vue: admin/views/emoji.vue:
add-emoji: add-emoji:
title: "絵文字の登録" title: "絵文字の登録"
@@ -1161,9 +1188,9 @@ mobile/views/components/media-image.vue:
mobile/views/components/media-video.vue: mobile/views/components/media-video.vue:
sensitive: "Innholdet er NSFW" sensitive: "Innholdet er NSFW"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue: common/views/components/follow-button.vue:
following: "Følger" following: "フォロー中"
follow: "Følg" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中" follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
@@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
github-connect: "GitHubアカウントに接続する" github-connect: "GitHubアカウントに接続する"
github-reconnect: "再接続する" github-reconnect: "再接続する"
github-disconnect: "切断する" github-disconnect: "切断する"
discord: "Discord連携"
discord-connect: "Discordアカウントに接続する"
discord-reconnect: "再接続する"
discord-disconnect: "切断する"
update: "Misskey Update" update: "Misskey Update"
version: "バージョン:" version: "バージョン:"
latest-version: "最新のバージョン:" latest-version: "最新のバージョン:"

View File

@@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
destroy: "Usuń tę ankietę" destroy: "Usuń tę ankietę"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "Wybierz reakcję" choose-reaction: "Wybierz reakcję"
common/views/components/emoji-picker.vue:
custom-emoji: "カスタム絵文字"
people: "人"
animals-and-nature: "動物&自然"
food-and-drink: "食べ物&飲み物"
activity: "アクティビティ"
travel-and-places: "場所"
objects: "物"
symbols: "記号"
flags: "旗"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "Nazwa użytkownika" username: "Nazwa użytkownika"
password: "Hasło" password: "Hasło"
@@ -353,6 +363,7 @@ common/views/components/signin.vue:
or: "または" or: "または"
signin-with-twitter: "Zaloguj się za pomocą Twittera" signin-with-twitter: "Zaloguj się za pomocą Twittera"
signin-with-github: "GitHubでログイン" signin-with-github: "GitHubでログイン"
signin-with-discord: "Discordでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "招待コード" invitation-code: "招待コード"
@@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
reconnect: "再接続する" reconnect: "再接続する"
connect: "GitHubと接続する" connect: "GitHubと接続する"
disconnect: "切断する" disconnect: "切断する"
common/views/components/discord-setting.vue:
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
connected-to: "次のDiscordアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Discordと接続する"
disconnect: "切断する"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "Oczekiwanie" waiting: "Oczekiwanie"
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
@@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "To jest zawartość NSFW" sensitive: "To jest zawartość NSFW"
click-to-show: "Naciśnij aby wyświetlić" click-to-show: "Naciśnij aby wyświetlić"
desktop/views/components/follow-button.vue:
following: "Śledzisz"
follow: "Śledź"
request-pending: "Oczekiwanie na pozwolenie"
follow-processing: "フォロー処理中"
follow-request: "Poproś o śledzenie"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "Śledzący" followers: "Śledzący"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
block: "ブロック" block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません" no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません" no-blocked-users: "ブロックしているユーザーはいません"
word-mute: "ワードミュート"
muted-words: "ミュートされたキーワード"
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
save: "保存"
common/views/components/password-settings.vue: common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
@@ -903,6 +919,7 @@ admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス" instance: "インスタンス"
emoji: "カスタム絵文字" emoji: "カスタム絵文字"
moderators: "モデレーター"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@@ -947,7 +964,12 @@ admin/views/instance.vue:
github-integration-info: "コールバックURLは /api/gh/cb に設定します。" github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
enable-github-integration: "GitHub連携を有効にする" enable-github-integration: "GitHub連携を有効にする"
github-integration-client-id: "Client ID" github-integration-client-id: "Client ID"
github-integration-client-secret: "Client secret" github-integration-client-secret: "Client Secret"
discord-integration-config: "Discord連携の設定"
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
enable-discord-integration: "Discord連携を有効にする"
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "プロキシアカウントの設定" proxy-account-config: "プロキシアカウントの設定"
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。" proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
proxy-account-username: "プロキシアカウントのユーザー名" proxy-account-username: "プロキシアカウントのユーザー名"
@@ -997,6 +1019,11 @@ admin/views/users.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
admin/views/moderators.vue:
add-moderator:
title: "モデレーターの登録"
add: "登録"
added: "モデレーターを登録しました"
admin/views/emoji.vue: admin/views/emoji.vue:
add-emoji: add-emoji:
title: "絵文字の登録" title: "絵文字の登録"
@@ -1161,12 +1188,12 @@ mobile/views/components/media-image.vue:
mobile/views/components/media-video.vue: mobile/views/components/media-video.vue:
sensitive: "To jest zawartość NSFW" sensitive: "To jest zawartość NSFW"
click-to-show: "Naciśnij aby wyświetlić" click-to-show: "Naciśnij aby wyświetlić"
mobile/views/components/follow-button.vue: common/views/components/follow-button.vue:
following: "Śledzisz" following: "フォロー中"
follow: "Śledź" follow: "フォロー"
request-pending: "Oczekiwanie na pozwolenie" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中" follow-processing: "フォロー処理中"
follow-request: "Poproś o śledzenie" follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "Zacznij śledzić ludzi takich jak Ty" title: "Zacznij śledzić ludzi takich jak Ty"
empty: "Nie znaleziono podobnych użytkowników." empty: "Nie znaleziono podobnych użytkowników."
@@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
github-connect: "GitHubアカウントに接続する" github-connect: "GitHubアカウントに接続する"
github-reconnect: "再接続する" github-reconnect: "再接続する"
github-disconnect: "切断する" github-disconnect: "切断する"
discord: "Discord連携"
discord-connect: "Discordアカウントに接続する"
discord-reconnect: "再接続する"
discord-disconnect: "切断する"
update: "Aktualizacja Misskey" update: "Aktualizacja Misskey"
version: "Wersja:" version: "Wersja:"
latest-version: "Najnowsza wersja:" latest-version: "Najnowsza wersja:"

View File

@@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
destroy: "アンケートを破棄" destroy: "アンケートを破棄"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択" choose-reaction: "リアクションを選択"
common/views/components/emoji-picker.vue:
custom-emoji: "カスタム絵文字"
people: "人"
animals-and-nature: "動物&自然"
food-and-drink: "食べ物&飲み物"
activity: "アクティビティ"
travel-and-places: "場所"
objects: "物"
symbols: "記号"
flags: "旗"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "ユーザー名" username: "ユーザー名"
password: "パスワード" password: "パスワード"
@@ -353,6 +363,7 @@ common/views/components/signin.vue:
or: "または" or: "または"
signin-with-twitter: "Twitterでログイン" signin-with-twitter: "Twitterでログイン"
signin-with-github: "GitHubでログイン" signin-with-github: "GitHubでログイン"
signin-with-discord: "Discordでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "招待コード" invitation-code: "招待コード"
@@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
reconnect: "再接続する" reconnect: "再接続する"
connect: "GitHubと接続する" connect: "GitHubと接続する"
disconnect: "切断する" disconnect: "切断する"
common/views/components/discord-setting.vue:
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
connected-to: "次のDiscordアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Discordと接続する"
disconnect: "切断する"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "待機中" waiting: "待機中"
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
@@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
block: "ブロック" block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません" no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません" no-blocked-users: "ブロックしているユーザーはいません"
word-mute: "ワードミュート"
muted-words: "ミュートされたキーワード"
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
save: "保存"
common/views/components/password-settings.vue: common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
@@ -903,6 +919,7 @@ admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス" instance: "インスタンス"
emoji: "カスタム絵文字" emoji: "カスタム絵文字"
moderators: "モデレーター"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@@ -947,7 +964,12 @@ admin/views/instance.vue:
github-integration-info: "コールバックURLは /api/gh/cb に設定します。" github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
enable-github-integration: "GitHub連携を有効にする" enable-github-integration: "GitHub連携を有効にする"
github-integration-client-id: "Client ID" github-integration-client-id: "Client ID"
github-integration-client-secret: "Client secret" github-integration-client-secret: "Client Secret"
discord-integration-config: "Discord連携の設定"
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
enable-discord-integration: "Discord連携を有効にする"
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "プロキシアカウントの設定" proxy-account-config: "プロキシアカウントの設定"
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。" proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
proxy-account-username: "プロキシアカウントのユーザー名" proxy-account-username: "プロキシアカウントのユーザー名"
@@ -997,6 +1019,11 @@ admin/views/users.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
admin/views/moderators.vue:
add-moderator:
title: "モデレーターの登録"
add: "登録"
added: "モデレーターを登録しました"
admin/views/emoji.vue: admin/views/emoji.vue:
add-emoji: add-emoji:
title: "絵文字の登録" title: "絵文字の登録"
@@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
mobile/views/components/media-video.vue: mobile/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue: common/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
@@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
github-connect: "GitHubアカウントに接続する" github-connect: "GitHubアカウントに接続する"
github-reconnect: "再接続する" github-reconnect: "再接続する"
github-disconnect: "切断する" github-disconnect: "切断する"
discord: "Discord連携"
discord-connect: "Discordアカウントに接続する"
discord-reconnect: "再接続する"
discord-disconnect: "切断する"
update: "Atualizar Misskey" update: "Atualizar Misskey"
version: "Versão atual;" version: "Versão atual;"
latest-version: "Última versão:" latest-version: "Última versão:"

View File

@@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
destroy: "アンケートを破棄" destroy: "アンケートを破棄"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択" choose-reaction: "リアクションを選択"
common/views/components/emoji-picker.vue:
custom-emoji: "カスタム絵文字"
people: "人"
animals-and-nature: "動物&自然"
food-and-drink: "食べ物&飲み物"
activity: "アクティビティ"
travel-and-places: "場所"
objects: "物"
symbols: "記号"
flags: "旗"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "ユーザー名" username: "ユーザー名"
password: "パスワード" password: "パスワード"
@@ -353,6 +363,7 @@ common/views/components/signin.vue:
or: "または" or: "または"
signin-with-twitter: "Twitterでログイン" signin-with-twitter: "Twitterでログイン"
signin-with-github: "GitHubでログイン" signin-with-github: "GitHubでログイン"
signin-with-discord: "Discordでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "招待コード" invitation-code: "招待コード"
@@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
reconnect: "再接続する" reconnect: "再接続する"
connect: "GitHubと接続する" connect: "GitHubと接続する"
disconnect: "切断する" disconnect: "切断する"
common/views/components/discord-setting.vue:
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
connected-to: "次のDiscordアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Discordと接続する"
disconnect: "切断する"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "待機中" waiting: "待機中"
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
@@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
block: "ブロック" block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません" no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません" no-blocked-users: "ブロックしているユーザーはいません"
word-mute: "ワードミュート"
muted-words: "ミュートされたキーワード"
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
save: "保存"
common/views/components/password-settings.vue: common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
@@ -903,6 +919,7 @@ admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス" instance: "インスタンス"
emoji: "カスタム絵文字" emoji: "カスタム絵文字"
moderators: "モデレーター"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@@ -947,7 +964,12 @@ admin/views/instance.vue:
github-integration-info: "コールバックURLは /api/gh/cb に設定します。" github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
enable-github-integration: "GitHub連携を有効にする" enable-github-integration: "GitHub連携を有効にする"
github-integration-client-id: "Client ID" github-integration-client-id: "Client ID"
github-integration-client-secret: "Client secret" github-integration-client-secret: "Client Secret"
discord-integration-config: "Discord連携の設定"
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
enable-discord-integration: "Discord連携を有効にする"
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "プロキシアカウントの設定" proxy-account-config: "プロキシアカウントの設定"
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。" proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
proxy-account-username: "プロキシアカウントのユーザー名" proxy-account-username: "プロキシアカウントのユーザー名"
@@ -997,6 +1019,11 @@ admin/views/users.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
admin/views/moderators.vue:
add-moderator:
title: "モデレーターの登録"
add: "登録"
added: "モデレーターを登録しました"
admin/views/emoji.vue: admin/views/emoji.vue:
add-emoji: add-emoji:
title: "絵文字の登録" title: "絵文字の登録"
@@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
mobile/views/components/media-video.vue: mobile/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue: common/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
@@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
github-connect: "GitHubアカウントに接続する" github-connect: "GitHubアカウントに接続する"
github-reconnect: "再接続する" github-reconnect: "再接続する"
github-disconnect: "切断する" github-disconnect: "切断する"
discord: "Discord連携"
discord-connect: "Discordアカウントに接続する"
discord-reconnect: "再接続する"
discord-disconnect: "切断する"
update: "Misskey Update" update: "Misskey Update"
version: "バージョン:" version: "バージョン:"
latest-version: "最新のバージョン:" latest-version: "最新のバージョン:"

View File

@@ -5,143 +5,143 @@ meta:
common: common:
misskey: "A ⭐ of fediverse" misskey: "A ⭐ of fediverse"
about-title: "A ⭐ of fediverse." about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。" about: "Misskey 是一个开源的程序 <b>decentralized microblogging service</b>. 我懒得翻译了... Sophisticated fully customizable Ui, varieties of reaction for posts, free file storage providing integrated management system and other advancing functions are available. Also, network system called “Fediverse” enables us to communicate with users on other Snss. Like, if you post something, then your posts will sent not only to Misskey but also mastodon. Just imagine that the planet is sending a microwave to other planet to communication."
intro: intro:
title: "Misskeyって?" title: "什么是 Misskey 呢?"
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。" about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
features: "特" features: "特"
rich-contents: "投稿" rich-contents: "发布"
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。" rich-contents-desc: "您只需要发布您的想法, 热门话题或者任何您想分享的好东西. 你可以装饰你的文字, 加上你最喜欢的图片, 发送文件或者电影, 甚至创造一个投票. 这些事情您都可以在 Misskey 上做。"
reaction: "リアクション" reaction: "情绪"
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。" reaction-desc: "一个最简单的方式去告诉别人你的情绪. Misskey 允许您在别人的帖子中加入各种的情绪反应类型, 就像 Facebook 一样. 在 Misskey 上的情感体验永远不会出现在其他只能点赞的SNSs上。"
ui: "インターフェース" ui: "交互界面"
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。" ui-desc: "世界上没有一个UI可以适合每一个人. 所以, Misskey 提供一个可以高度定制的UI交互界面. 您可以通过编辑, 调整布局, 放置可选择的小部件来轻松定制您的专属UI界面。"
drive: "ドライブ" drive: "Misskey 云盘"
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんかもしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんかMisskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。" drive-desc: "想要发布一张您已经上传过的照片吗? 想要组织,命名和为上传的文件创建文件夹吗? Misskey 云盘是一个最好的解决方案. "
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!" outro: "进一步深挖 Misskey 的更多功能, 如果您感觉这个功能不适合我, 试试其他例子. 因为 Misskey 是一个分散的 SNS, 这样您就可以很容易找到适合自己的一部分."
adblock: adblock:
detected: "広告ブロッカーを無効にしてください" detected: "请关闭广告拦截器"
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。" warning: "<strong>Misskey 不是广告网站</strong>如果您启用广告拦截器, 可能会导致某些功能无法正常使用。"
application-authorization: "アプリの連携" application-authorization: "应用程序授权"
close: "閉じる" close: "关闭"
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。" do-not-copy-paste: "请不要在这里输入或粘贴代码。您帐户可能会受到损害。"
load-more: "もっと読み込む" load-more: "加载更多"
got-it: "わかった" got-it: "没问题"
customization-tips: customization-tips:
title: "カスタマイズのヒント" title: "客制化提示"
paragraph: "<p>ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。</p><p>一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。</p><p>ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。</p><p>カスタマイズを終了するには、右上の「完了」をクリックします。</p>" paragraph: "<p>主页定制允许您添加或删除, 拖放和重新排列小组件.</p></p>您可以通过<strong><strong>右</strong>点击</strong>某些小部件来更改显示</p><p>若要删除小部件, 请将其拖到标头为<strong>「垃圾箱」</strong>的区域</p><p>如果您完成了定制过程,单击右上角的「完成」</p>"
gotit: "Got it!" gotit: "没问题!"
notification: notification:
file-uploaded: "ファイルがアップロードされました" file-uploaded: "文件已上传"
message-from: "{}さんからメッセージ:" message-from: "信息来源 {}:"
reversi-invited: "対局への招待があります" reversi-invited: "您已被邀请加入一场游戏"
reversi-invited-by: "{}さんから" reversi-invited-by: "被邀请 {}:"
notified-by: "{}さんから" notified-by: "通知 {}:"
reply-from: "{}さんから返信:" reply-from: "回复 {}:"
quoted-by: "{}さんが引用:" quoted-by: "引用 {}:"
time: time:
unknown: "なぞのじかん" unknown: "这是个啥??? 不知道哎"
future: "未来" future: "未来"
just_now: "たった今" just_now: "现在"
seconds_ago: "{}秒前" seconds_ago: "{}秒前"
minutes_ago: "{}分前" minutes_ago: "{}分前"
hours_ago: "{}時間前" hours_ago: "{}小时前"
days_ago: "{}前" days_ago: "{}前"
weeks_ago: "{}週間前" weeks_ago: "{}前"
months_ago: "{}月前" months_ago: "{}月前"
years_ago: "{}年前" years_ago: "{}年前"
month-and-day: "{month}月 {day}日" month-and-day: "{month}月 {day}日"
trash: "ゴミ箱" trash: "垃圾箱"
drive: "ドライブ" drive: "Misskey 云盘"
messaging: "トーク" messaging: "聊天"
weekday-short: weekday-short:
sunday: "日" sunday: "日"
monday: "" monday: ""
tuesday: "" tuesday: ""
wednesday: "" wednesday: ""
thursday: "" thursday: ""
friday: "" friday: ""
saturday: "" saturday: ""
weekday: weekday:
sunday: "日曜日" sunday: "星期日"
monday: "月曜日" monday: "星期一"
tuesday: "火曜日" tuesday: "星期二 "
wednesday: "水曜日" wednesday: "星期三"
thursday: "木曜日" thursday: "星期四"
friday: "金曜日" friday: "星期五"
saturday: "土曜日" saturday: "星期六"
reactions: reactions:
like: "いいね" like: ""
love: "しゅき" love: "喜爱"
laugh: "笑" laugh: "笑"
hmm: "ふぅ~む" hmm: "emmm...?"
surprise: "わお" surprise: "哇! "
congrats: "おめでとう" congrats: "恭喜"
angry: "おこ" angry: "生气"
confused: "こまこまのこまり" confused: "困惑"
rip: "RIP" rip: "RIP"
pudding: "Pudding" pudding: "布丁"
note-visibility: note-visibility:
public: "公" public: "公"
home: "ホーム" home: "首页"
home-desc: "ホームタイムラインにのみ公開" home-desc: "仅发送至首页的时间线"
followers: "フォロワー" followers: "关注者"
followers-desc: "自分のフォロワーにのみ公開" followers-desc: "仅发送至粉丝"
specified: "ダイレクト" specified: "指定用户"
specified-desc: "指定したユーザーにのみ公開" specified-desc: "仅发送至指定用户"
private: "非公開" private: "私密"
note-placeholders: note-placeholders:
a: "今どうしてる" a: "你在干什么?"
b: "何かありましたか" b: "发生了什么"
c: "何をお考えですか" c: "你有什么想法"
d: "言いたいことは" d: "你想要发布些什么吗"
e: "ここに書いてください" e: "写下来吧"
f: "あなたが書くのを待っています..." f: "等待你的书写..."
search: "索" search: "索"
delete: "除" delete: "除"
loading: "読み込み中" loading: "正在加载, 等着就好啦"
ok: "わかった" ok: "没问题"
update-available-title: "更新があります" update-available-title: "有可用更新"
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。" update-available: "新的 Misskey 版本现已发布({newer}。目前版本{current}). 刷新页面以应用更新。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "您的 Token 已被重置, 您将自动登出。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "相比于布丁来说, 我更喜欢寿司。"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "在 Reversi 中显示行和列表签"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" use-contrast-reversi-stones: "Make the stone color clear in Reversi"
verified-user: "公式アカウント" verified-user: "认证用户"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" disable-animated-mfm: "在帖子中禁用动画文本"
always-show-nsfw: "常に閲覧注意のメディアを表示する" always-show-nsfw: "总是显示 NSFW 的内容"
always-mark-nsfw: "常にメディアを閲覧注意として投稿" always-mark-nsfw: "总是用 NSFW 来标记附件"
show-full-acct: "ユーザー名のホストを省略しない" show-full-acct: "不要从用户名中忽略主机名"
show-via: "viaを表示する" show-via: "显示..."
reduce-motion: "UIの動きを減らす" reduce-motion: "减弱UI中的动画效果"
this-setting-is-this-device-only: "このデバイスのみ" this-setting-is-this-device-only: "设置仅在本设备中生效"
use-os-default-emojis: "OS標準の絵文字を使用" use-os-default-emojis: "使用设备系统默认的 emojis"
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' do-not-use-in-production: '这是一个开发者测试版. 请勿在生产环境中使用.'
is-remote-user: "このユーザー情報はコピーです。" is-remote-user: "该用户的信息已被复制."
is-remote-post: "この投稿情報はコピーです。" is-remote-post: "该投稿已被复制."
view-on-remote: "正確な情報を見る" view-on-remote: "查看准确的信息"
error: error:
title: '問題が発生しました' title: '哦不, 发生了一些问题! :('
retry: 'やり直す' retry: '重试'
reversi: reversi:
drawn: "引き分け" drawn: "平局"
my-turn: "あなたのターンです" my-turn: "轮到你了"
opponent-turn: "相手のターンです" opponent-turn: "轮到对手了"
turn-of: "{name}のターンです" turn-of: "{name}转折点"
past-turn-of: "{name}のターン" past-turn-of: "轮到{name}的回合了"
won: "{name}の勝ち" won: "{name}获胜"
black: "" black: ""
white: "白" white: "白"
total: "合" total: "合"
this-turn: "{count}ターン目" this-turn: "Turn {count}"
widgets: widgets:
analog-clock: "アナログ時計" analog-clock: "指针时钟"
profile: "プロフィール" profile: "简介"
calendar: "カレンダー" calendar: "日历"
timemachine: "カレンダー(タイムマシン)" timemachine: "时光机"
activity: "アクティビティ" activity: "动态"
rss: "RSSリーダー" rss: "RSS 订阅"
memo: "付箋" memo: "便签"
trends: "トレンド" trends: "トレンド"
photo-stream: "フォトストリーム" photo-stream: "フォトストリーム"
posts-monitor: "投稿チャート" posts-monitor: "投稿チャート"
@@ -195,60 +195,60 @@ common/views/components/games/reversi/reversi.game.vue:
can-put-everywhere: "どこでも置けるモード" can-put-everywhere: "どこでも置けるモード"
common/views/components/games/reversi/reversi.index.vue: common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi" title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう" sub-title: "和你的朋友一起玩 Reversi!"
invite: "招待" invite: "邀请"
rule: "遊び方" rule: "游戏说明"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。" rule-desc: "Reversi是与对方交替地把石头放在板上把对方的石头夹在自己的颜色上最终留下的石头多的人获胜。"
mode-invite: "招待" mode-invite: "邀请"
mode-invite-desc: "指定したユーザーと対戦するモードです。" mode-invite-desc: "邀请指定用户参加游戏"
invitations: "対局の招待があります!" invitations: "您收到了一则邀请!"
my-games: "自分の対局" my-games: "我的游戏"
all-games: "みんなの対局" all-games: "所有游戏"
enter-username: "ユーザー名を入力してください" enter-username: "输入用户名"
game-state: game-state:
ended: "終了" ended: "完成"
playing: "行中" playing: "行中"
common/views/components/games/reversi/reversi.room.vue: common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定" settings-of-the-game: "游戏设置"
choose-map: "マップを選択" choose-map: "选择一个地图"
random: "ランダム" random: "随机"
black-or-white: "先手/後手" black-or-white: "黑/白"
black-is: "{}が黒" black-is: "{}是黑"
rules: "ルール" rules: "规则"
is-llotheo: "石の少ない方が勝ち(ロセオ)" is-llotheo: "较少一方获胜"
looped-map: "ループマップ" looped-map: "环状地图"
can-put-everywhere: "どこでも置けるモード" can-put-everywhere: "可以随意放置"
settings-of-the-bot: "Botの設定" settings-of-the-bot: "机器人设定"
this-game-is-started-soon: "ゲームは数秒後に開始されます" this-game-is-started-soon: "游戏即将在数秒后开始"
waiting-for-other: "相手の準備が完了するのを待っています" waiting-for-other: "等待对手准备"
waiting-for-me: "あなたの準備が完了するのを待っています" waiting-for-me: "等待您的准备"
waiting-for-both: "準備中" waiting-for-both: "准备中"
cancel: "キャンセル" cancel: "取消"
ready: "準備完了" ready: "准备好啦"
cancel-ready: "準備続行" cancel-ready: "取消准备"
common/views/components/connect-failed.vue: common/views/components/connect-failed.vue:
title: "サーバーに接続できません" title: "无法连接至服务器"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。" description: "您的网络连接可能出现了问题, 或是远程服务器暂时不可用. 请稍后{重试}."
thanks: "いつもMisskeyをご利用いただきありがとうございます。" thanks: "感谢您使用 Misskey"
troubleshoot: "トラブルシュート" troubleshoot: "故障排除"
common/views/components/connect-failed.troubleshooter.vue: common/views/components/connect-failed.troubleshooter.vue:
title: "トラブルシューティング" title: "正在排除故障"
network: "ネットワーク接続" network: "网络已连接"
checking-network: "ネットワーク接続を確認中" checking-network: "正在检查网络连接"
internet: "インターネット接続" internet: "网络连接"
checking-internet: "インターネット接続を確認中" checking-internet: "正在检查网络连接"
server: "サーバー接続" server: "已连接至服务器"
checking-server: "サーバー接続を確認中" checking-server: "正在检查与服务器的连接"
finding: "問題を調べています" finding: "搜索问题"
no-network: "ネットワークに接続されていません" no-network: "无网络连接"
no-network-desc: "お使いのPCのネットワーク接続が正常か確認してください。" no-network-desc: "请确保您已连接至互联网"
no-internet: "インターネットに接続されていません" no-internet: "无网络连接"
no-internet-desc: "ネットワークには接続されていますが、インターネットには接続されていないようです。お使いのPCのインターネット接続が正常か確認してください。" no-internet-desc: "请确保您已连接至互联网"
no-server: "Misskeyのサーバーに接続できません" no-server: "无法连接到 Misskey 服务器"
no-server-desc: "お使いのPCのインターネット接続は正常ですが、Misskeyのサーバーには接続できませんでした。サーバーがダウンまたはメンテナンスしている可能性があるので、しばらくしてから再度御アクセスください。" no-server-desc: "您设备与互联网的网络连接正常, 但是无法连接至 Misskey 服务器. 这可能是服务器暂时不可用或正在维护. 请稍后再试."
success: "Misskeyのサーバーに接続できました" success: "成功连接至 Misskey 服务器"
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。" success-desc: "看起来我们连接正常. 请刷新网页."
flush: "キャッシュの削除" flush: "清除缓存"
set-version: "バージョン指定" set-version: "バージョン指定"
common/views/components/media-banner.vue: common/views/components/media-banner.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
@@ -305,36 +305,36 @@ common/views/components/messaging-room.form.vue:
input-message-here: "ここにメッセージを入力" input-message-here: "ここにメッセージを入力"
send: "送信" send: "送信"
attach-from-local: "PCからファイルを添付する" attach-from-local: "PCからファイルを添付する"
attach-from-drive: "ドライブからファイルを添付する" attach-from-drive: "从云盘中添加文件"
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです" only-one-file-attached: "在信息中只允许添加一个附件"
common/views/components/messaging-room.message.vue: common/views/components/messaging-room.message.vue:
is-read: "既読" is-read: "已阅"
deleted: "このメッセージは削除されました" deleted: "这条信息已被删除"
common/views/components/nav.vue: common/views/components/nav.vue:
about: "Misskeyについて" about: "关于"
stats: "統計" stats: "统计"
status: "ステータス" status: "状态"
wiki: "Wiki" wiki: "百科 (Wiki)"
donors: "ドナー" donors: "捐赠者"
repository: "リポジトリ" repository: ""
develop: "開発者" develop: "开发者"
feedback: "フィードバック" feedback: "反馈"
common/views/components/note-menu.vue: common/views/components/note-menu.vue:
detail: "詳細" detail: "详细信息"
copy-link: "リンクをコピー" copy-link: "复制链接"
favorite: "お気に入り" favorite: "收藏这个投稿"
unfavorite: "お気に入り解除" unfavorite: "取消收藏"
pin: "ピン留め" pin: "固定个人资料"
unpin: "ピン留め解除" unpin: "解除固定"
delete: "除" delete: "除"
delete-confirm: "この投稿を削除しますか?" delete-confirm: "确定删除这个投稿吗?"
remote: "投稿元で見る" remote: "显示原始投稿"
common/views/components/poll.vue: common/views/components/poll.vue:
vote-to: "「{}」に投票する" vote-to: "为\"{}\"投票"
vote-count: "{}票" vote-count: "{}票"
total-users: "{}人投票" total-users: "{} 人投票"
vote: "投票する" vote: "投票"
show-result: "結果を見る" show-result: "显示结果"
voted: "投票済み" voted: "投票済み"
common/views/components/poll-editor.vue: common/views/components/poll-editor.vue:
no-only-one-choice: "アンケートには、選択肢が最低2つ必要です" no-only-one-choice: "アンケートには、選択肢が最低2つ必要です"
@@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
destroy: "アンケートを破棄" destroy: "アンケートを破棄"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択" choose-reaction: "リアクションを選択"
common/views/components/emoji-picker.vue:
custom-emoji: "カスタム絵文字"
people: "人"
animals-and-nature: "動物&自然"
food-and-drink: "食べ物&飲み物"
activity: "アクティビティ"
travel-and-places: "場所"
objects: "物"
symbols: "記号"
flags: "旗"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "ユーザー名" username: "ユーザー名"
password: "パスワード" password: "パスワード"
@@ -353,6 +363,7 @@ common/views/components/signin.vue:
or: "または" or: "または"
signin-with-twitter: "Twitterでログイン" signin-with-twitter: "Twitterでログイン"
signin-with-github: "GitHubでログイン" signin-with-github: "GitHubでログイン"
signin-with-discord: "Discordでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "招待コード" invitation-code: "招待コード"
@@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
reconnect: "再接続する" reconnect: "再接続する"
connect: "GitHubと接続する" connect: "GitHubと接続する"
disconnect: "切断する" disconnect: "切断する"
common/views/components/discord-setting.vue:
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
connected-to: "次のDiscordアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Discordと接続する"
disconnect: "切断する"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "待機中" waiting: "待機中"
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
@@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
block: "ブロック" block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません" no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません" no-blocked-users: "ブロックしているユーザーはいません"
word-mute: "ワードミュート"
muted-words: "ミュートされたキーワード"
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
save: "保存"
common/views/components/password-settings.vue: common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
@@ -903,6 +919,7 @@ admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス" instance: "インスタンス"
emoji: "カスタム絵文字" emoji: "カスタム絵文字"
moderators: "モデレーター"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@@ -947,7 +964,12 @@ admin/views/instance.vue:
github-integration-info: "コールバックURLは /api/gh/cb に設定します。" github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
enable-github-integration: "GitHub連携を有効にする" enable-github-integration: "GitHub連携を有効にする"
github-integration-client-id: "Client ID" github-integration-client-id: "Client ID"
github-integration-client-secret: "Client secret" github-integration-client-secret: "Client Secret"
discord-integration-config: "Discord連携の設定"
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
enable-discord-integration: "Discord連携を有効にする"
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "プロキシアカウントの設定" proxy-account-config: "プロキシアカウントの設定"
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。" proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
proxy-account-username: "プロキシアカウントのユーザー名" proxy-account-username: "プロキシアカウントのユーザー名"
@@ -997,6 +1019,11 @@ admin/views/users.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
admin/views/moderators.vue:
add-moderator:
title: "モデレーターの登録"
add: "登録"
added: "モデレーターを登録しました"
admin/views/emoji.vue: admin/views/emoji.vue:
add-emoji: add-emoji:
title: "絵文字の登録" title: "絵文字の登録"
@@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
mobile/views/components/media-video.vue: mobile/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue: common/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
@@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
github-connect: "GitHubアカウントに接続する" github-connect: "GitHubアカウントに接続する"
github-reconnect: "再接続する" github-reconnect: "再接続する"
github-disconnect: "切断する" github-disconnect: "切断する"
discord: "Discord連携"
discord-connect: "Discordアカウントに接続する"
discord-reconnect: "再接続する"
discord-disconnect: "切断する"
update: "Misskey Update" update: "Misskey Update"
version: "バージョン:" version: "バージョン:"
latest-version: "最新のバージョン:" latest-version: "最新のバージョン:"

View File

@@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "10.48.0", "version": "10.54.0",
"clientVersion": "2.0.11733", "clientVersion": "2.0.11894",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,
@@ -46,6 +46,7 @@
"@types/is-root": "1.0.0", "@types/is-root": "1.0.0",
"@types/is-url": "1.2.28", "@types/is-url": "1.2.28",
"@types/js-yaml": "3.11.2", "@types/js-yaml": "3.11.2",
"@types/katex": "0.5.0",
"@types/koa": "2.0.46", "@types/koa": "2.0.46",
"@types/koa-bodyparser": "5.0.1", "@types/koa-bodyparser": "5.0.1",
"@types/koa-compress": "2.0.8", "@types/koa-compress": "2.0.8",
@@ -140,6 +141,7 @@
"jsdom": "13.0.0", "jsdom": "13.0.0",
"json5": "2.1.0", "json5": "2.1.0",
"json5-loader": "1.0.1", "json5-loader": "1.0.1",
"katex": "0.10.0",
"koa": "2.6.1", "koa": "2.6.1",
"koa-bodyparser": "4.2.1", "koa-bodyparser": "4.2.1",
"koa-compress": "3.0.0", "koa-compress": "3.0.0",
@@ -158,7 +160,7 @@
"mocha": "5.2.0", "mocha": "5.2.0",
"moji": "0.5.1", "moji": "0.5.1",
"moment": "2.22.2", "moment": "2.22.2",
"mongodb": "3.1.8", "mongodb": "3.1.9",
"monk": "6.0.6", "monk": "6.0.6",
"ms": "2.1.1", "ms": "2.1.1",
"nan": "2.11.1", "nan": "2.11.1",
@@ -176,6 +178,7 @@
"pug": "2.0.3", "pug": "2.0.3",
"punycode": "2.1.1", "punycode": "2.1.1",
"qrcode": "1.3.2", "qrcode": "1.3.2",
"randomcolor": "0.5.3",
"ratelimiter": "3.2.0", "ratelimiter": "3.2.0",
"recaptcha-promise": "0.1.3", "recaptcha-promise": "0.1.3",
"reconnecting-websocket": "4.1.10", "reconnecting-websocket": "4.1.10",
@@ -188,7 +191,7 @@
"s-age": "1.1.2", "s-age": "1.1.2",
"seedrandom": "2.4.4", "seedrandom": "2.4.4",
"sharp": "0.21.0", "sharp": "0.21.0",
"showdown": "1.8.7", "showdown": "1.9.0",
"showdown-highlightjs-extension": "0.1.2", "showdown-highlightjs-extension": "0.1.2",
"speakeasy": "2.0.0", "speakeasy": "2.0.0",
"stringz": "1.0.0", "stringz": "1.0.0",
@@ -198,6 +201,7 @@
"summaly": "2.2.0", "summaly": "2.2.0",
"systeminformation": "3.47.0", "systeminformation": "3.47.0",
"syuilo-password-strength": "0.0.1", "syuilo-password-strength": "0.0.1",
"terser-webpack-plugin": "1.1.0",
"textarea-caret": "3.1.0", "textarea-caret": "3.1.0",
"tinycolor2": "1.4.1", "tinycolor2": "1.4.1",
"tmp": "0.0.33", "tmp": "0.0.33",
@@ -205,7 +209,7 @@
"ts-node": "7.0.1", "ts-node": "7.0.1",
"tslint": "5.10.0", "tslint": "5.10.0",
"typescript": "3.1.6", "typescript": "3.1.6",
"typescript-eslint-parser": "20.1.1", "typescript-eslint-parser": "21.0.0",
"uglify-es": "3.3.9", "uglify-es": "3.3.9",
"url-loader": "1.1.2", "url-loader": "1.1.2",
"uuid": "3.3.2", "uuid": "3.3.2",
@@ -217,10 +221,10 @@
"vue-i18n": "8.3.1", "vue-i18n": "8.3.1",
"vue-js-modal": "1.3.26", "vue-js-modal": "1.3.26",
"vue-loader": "15.4.2", "vue-loader": "15.4.2",
"vue-marquee-text-component": "1.1.0",
"vue-router": "3.0.1", "vue-router": "3.0.1",
"vue-style-loader": "4.1.2", "vue-style-loader": "4.1.2",
"vue-svg-inline-loader": "1.2.1", "vue-svg-inline-loader": "1.2.1",
"vue-sweetalert2": "1.5.7",
"vue-template-compiler": "2.5.17", "vue-template-compiler": "2.5.17",
"vuedraggable": "2.16.0", "vuedraggable": "2.16.0",
"vuewordcloud": "18.7.11", "vuewordcloud": "18.7.11",

View File

@@ -66,19 +66,6 @@ export default abstract class Chart<T> {
} else { } else {
this.collection.createIndex({ span: -1, date: -1 }, { unique: true }); this.collection.createIndex({ span: -1, date: -1 }, { unique: true });
} }
//#region 後方互換性のため
this.collection.find({ span: 'day' }, { fields: { _id: true, date: true } }).then(logs => {
logs.forEach(log => {
this.collection.update({ _id: log._id }, { $set: { date: utc(log.date).hour(0).toDate() } });
});
});
this.collection.find({ span: 'hour' }, { fields: { _id: true, date: true } }).then(logs => {
logs.forEach(log => {
this.collection.update({ _id: log._id }, { $set: { date: utc(log.date).toDate() } });
});
});
//#endregion
} }
@autobind @autobind

View File

@@ -41,22 +41,22 @@ export default Vue.extend({
methods: { methods: {
add() { add() {
this.announcements.push({ this.announcements.unshift({
title: '', title: '',
text: '' text: ''
}); });
}, },
remove(i) { remove(i) {
this.$swal({ this.$root.alert({
type: 'warning', type: 'warning',
text: this.$t('_remove.are-you-sure').replace('$1', this.announcements.find((_, j) => j == i).title), text: this.$t('_remove.are-you-sure').replace('$1', this.announcements.find((_, j) => j == i).title),
showCancelButton: true showCancelButton: true
}).then(res => { }).then(res => {
if (!res.value) return; if (!res) return;
this.announcements = this.announcements.filter((_, j) => j !== i); this.announcements = this.announcements.filter((_, j) => j !== i);
this.save(true); this.save(true);
this.$swal({ this.$root.alert({
type: 'success', type: 'success',
text: this.$t('_remove.removed') text: this.$t('_remove.removed')
}); });
@@ -68,13 +68,13 @@ export default Vue.extend({
broadcasts: this.announcements broadcasts: this.announcements
}).then(() => { }).then(() => {
if (!silent) { if (!silent) {
this.$swal({ this.$root.alert({
type: 'success', type: 'success',
text: this.$t('saved') text: this.$t('saved')
}); });
} }
}).catch(e => { }).catch(e => {
this.$swal({ this.$root.alert({
type: 'error', type: 'error',
text: e text: e
}); });

View File

@@ -3,17 +3,17 @@
<table> <table>
<thead> <thead>
<tr> <tr>
<th><fa icon="exchange-alt"/> In/Out</th> <th><fa :icon="faExchangeAlt"/> In/Out</th>
<th><fa :icon="faBolt"/> Activity</th>
<th><fa icon="server"/> Host</th> <th><fa icon="server"/> Host</th>
<th><fa icon="bolt"/> Activity</th>
<th><fa icon="user"/> Actor</th> <th><fa icon="user"/> Actor</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr v-for="log in logs" :key="log.id"> <tr v-for="log in logs" :key="log.id">
<td :class="log.direction">{{ log.direction == 'in' ? '<' : '>' }} {{ log.direction }}</td> <td :class="log.direction">{{ log.direction == 'in' ? '<' : '>' }} {{ log.direction }}</td>
<td>{{ log.host }}</td>
<td>{{ log.activity }}</td> <td>{{ log.activity }}</td>
<td>{{ log.host }}</td>
<td>@{{ log.actor }}</td> <td>@{{ log.actor }}</td>
</tr> </tr>
</tbody> </tbody>
@@ -23,12 +23,14 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { faBolt, faExchangeAlt } from '@fortawesome/free-solid-svg-icons';
export default Vue.extend({ export default Vue.extend({
data() { data() {
return { return {
logs: [], logs: [],
connection: null connection: null,
faBolt, faExchangeAlt
}; };
}, },

View File

@@ -8,13 +8,19 @@
<p>{{ $t('@.ai-chan-kawaii') }}</p> <p>{{ $t('@.ai-chan-kawaii') }}</p>
</header> </header>
<marquee-text v-if="instances.length > 0" class="instances" :repeat="10" :duration="60">
<span v-for="instance in instances" class="instance">
<b :style="{ background: instance.bg }">{{ instance.host }}</b>{{ instance.notesCount | number }} / {{ instance.usersCount | number }}
</span>
</marquee-text>
<div v-if="stats" class="stats"> <div v-if="stats" class="stats">
<div> <div>
<div> <div>
<div><fa icon="user"/></div> <div><fa icon="user"/></div>
<div> <div>
<span>{{ $t('accounts') }}</span> <span>{{ $t('accounts') }}</span>
<b class="primary">{{ stats.originalUsersCount | number }}</b> <b>{{ stats.originalUsersCount | number }}</b>
</div> </div>
</div> </div>
<div> <div>
@@ -27,7 +33,7 @@
<div><fa icon="pencil-alt"/></div> <div><fa icon="pencil-alt"/></div>
<div> <div>
<span>{{ $t('notes') }}</span> <span>{{ $t('notes') }}</span>
<b class="primary">{{ stats.originalNotesCount | number }}</b> <b>{{ stats.originalNotesCount | number }}</b>
</div> </div>
</div> </div>
<div> <div>
@@ -37,7 +43,7 @@
</div> </div>
<div> <div>
<div> <div>
<div><fa icon="database"/></div> <div><fa :icon="faDatabase"/></div>
<div> <div>
<span>{{ $t('drive') }}</span> <span>{{ $t('drive') }}</span>
<b>{{ stats.driveUsageLocal | bytes }}</b> <b>{{ stats.driveUsageLocal | bytes }}</b>
@@ -83,42 +89,68 @@ import i18n from '../../i18n';
import XCpuMemory from "./cpu-memory.vue"; import XCpuMemory from "./cpu-memory.vue";
import XCharts from "./charts.vue"; import XCharts from "./charts.vue";
import XApLog from "./ap-log.vue"; import XApLog from "./ap-log.vue";
import { faDatabase } from '@fortawesome/free-solid-svg-icons';
import MarqueeText from 'vue-marquee-text-component';
import randomColor from 'randomcolor';
export default Vue.extend({ export default Vue.extend({
i18n: i18n('admin/views/dashboard.vue'), i18n: i18n('admin/views/dashboard.vue'),
components: { components: {
XCpuMemory, XCpuMemory,
XCharts, XCharts,
XApLog XApLog,
MarqueeText
}, },
data() { data() {
return { return {
stats: null, stats: null,
connection: null, connection: null,
meta: null meta: null,
instances: [],
clock: null,
faDatabase
}; };
}, },
created() { created() {
this.connection = this.$root.stream.useSharedConnection('serverStats'); this.connection = this.$root.stream.useSharedConnection('serverStats');
this.updateStats();
this.clock = setInterval(this.updateStats, 1000);
this.$root.getMeta().then(meta => { this.$root.getMeta().then(meta => {
this.meta = meta; this.meta = meta;
}); });
this.$root.api('stats').then(stats => { this.$root.api('instances', {
this.stats = stats; sort: '+notes'
}).then(instances => {
instances.forEach(i => {
i.bg = randomColor({
seed: i.host,
luminosity: 'dark'
});
});
this.instances = instances;
}); });
}, },
beforeDestroy() { beforeDestroy() {
this.connection.dispose(); this.connection.dispose();
clearInterval(this.clock);
}, },
methods: { methods: {
setChartSrc(src) { setChartSrc(src) {
this.$refs.charts.setSrc(src); this.$refs.charts.setSrc(src);
},
updateStats() {
this.$root.api('stats', {}, false, true).then(stats => {
this.stats = stats;
});
} }
} }
}); });
@@ -133,7 +165,6 @@ export default Vue.extend({
> header > header
display flex display flex
margin-bottom 16px
padding-bottom 16px padding-bottom 16px
border-bottom solid 1px var(--adminDashboardHeaderBorder) border-bottom solid 1px var(--adminDashboardHeaderBorder)
color var(--adminDashboardHeaderFg) color var(--adminDashboardHeaderFg)
@@ -158,6 +189,20 @@ export default Vue.extend({
margin-left auto margin-left auto
margin-right 0 margin-right 0
> .instances
padding 16px
color var(--adminDashboardHeaderFg)
font-size 13px
>>> .instance
margin 0 10px
> b
padding 2px 6px
margin-right 4px
border-radius 4px
color #fff
> .stats > .stats
display flex display flex
justify-content space-between justify-content space-between
@@ -198,9 +243,6 @@ export default Vue.extend({
> b > b
display block display block
&.primary
color var(--primary)
> div:last-child > div:last-child
display flex display flex
padding 6px 16px padding 6px 16px

View File

@@ -23,7 +23,7 @@
</ui-card> </ui-card>
<ui-card> <ui-card>
<div slot="title"><fa :icon="['far', 'grin']"/> {{ $t('emojis.title') }}</div> <div slot="title"><fa :icon="faGrin"/> {{ $t('emojis.title') }}</div>
<section v-for="emoji in emojis"> <section v-for="emoji in emojis">
<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/> <img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/>
<ui-horizon-group inputs> <ui-horizon-group inputs>
@@ -50,6 +50,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import i18n from '../../i18n'; import i18n from '../../i18n';
import { faGrin } from '@fortawesome/free-regular-svg-icons';
export default Vue.extend({ export default Vue.extend({
i18n: i18n('admin/views/emoji.vue'), i18n: i18n('admin/views/emoji.vue'),
@@ -58,7 +59,8 @@ export default Vue.extend({
name: '', name: '',
url: '', url: '',
aliases: '', aliases: '',
emojis: [] emojis: [],
faGrin
}; };
}, },
@@ -73,13 +75,13 @@ export default Vue.extend({
url: this.url, url: this.url,
aliases: this.aliases.split(' ').filter(x => x.length > 0) aliases: this.aliases.split(' ').filter(x => x.length > 0)
}).then(() => { }).then(() => {
this.$swal({ this.$root.alert({
type: 'success', type: 'success',
text: this.$t('add-emoji.added') text: this.$t('add-emoji.added')
}); });
this.fetchEmojis(); this.fetchEmojis();
}).catch(e => { }).catch(e => {
this.$swal({ this.$root.alert({
type: 'error', type: 'error',
text: e text: e
}); });
@@ -101,12 +103,12 @@ export default Vue.extend({
url: emoji.url, url: emoji.url,
aliases: emoji.aliases.split(' ').filter(x => x.length > 0) aliases: emoji.aliases.split(' ').filter(x => x.length > 0)
}).then(() => { }).then(() => {
this.$swal({ this.$root.alert({
type: 'success', type: 'success',
text: this.$t('updated') text: this.$t('updated')
}); });
}).catch(e => { }).catch(e => {
this.$swal({ this.$root.alert({
type: 'error', type: 'error',
text: e text: e
}); });
@@ -114,23 +116,23 @@ export default Vue.extend({
}, },
removeEmoji(emoji) { removeEmoji(emoji) {
this.$swal({ this.$root.alert({
type: 'warning', type: 'warning',
text: this.$t('remove-emoji.are-you-sure').replace('$1', emoji.name), text: this.$t('remove-emoji.are-you-sure').replace('$1', emoji.name),
showCancelButton: true showCancelButton: true
}).then(res => { }).then(res => {
if (!res.value) return; if (!res) return;
this.$root.api('admin/emoji/remove', { this.$root.api('admin/emoji/remove', {
id: emoji.id id: emoji.id
}).then(() => { }).then(() => {
this.$swal({ this.$root.alert({
type: 'success', type: 'success',
text: this.$t('remove-emoji.removed') text: this.$t('remove-emoji.removed')
}); });
this.fetchEmojis(); this.fetchEmojis();
}).catch(e => { }).catch(e => {
this.$swal({ this.$root.alert({
type: 'error', type: 'error',
text: e text: e
}); });

View File

@@ -20,30 +20,34 @@
<ul> <ul>
<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }"><fa icon="home" fixed-width/>{{ $t('dashboard') }}</li> <li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }"><fa icon="home" fixed-width/>{{ $t('dashboard') }}</li>
<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>{{ $t('instance') }}</li> <li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>{{ $t('instance') }}</li>
<li @click="nav('moderators')" :class="{ active: page == 'moderators' }"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</li>
<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>{{ $t('users') }}</li> <li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>{{ $t('users') }}</li>
<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="['far', 'grin']" fixed-width/>{{ $t('emoji') }}</li> <!-- <li @click="nav('federation')" :class="{ active: page == 'federation' }"><fa :icon="faShareAlt" fixed-width/>{{ $t('federation') }}</li> -->
<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="faGrin" fixed-width/>{{ $t('emoji') }}</li>
<li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>{{ $t('announcements') }}</li> <li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>{{ $t('announcements') }}</li>
<li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }"><fa icon="hashtag" fixed-width/>{{ $t('hashtags') }}</li> <li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }"><fa icon="hashtag" fixed-width/>{{ $t('hashtags') }}</li>
<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</li> --> <!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</li> -->
<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">{{ $t('update') }}</li> -->
</ul> </ul>
<div class="back-to-misskey"> <div class="back-to-misskey">
<a href="/"><fa icon="arrow-left"/> {{ $t('back-to-misskey') }}</a> <a href="/"><fa :icon="faArrowLeft"/> {{ $t('back-to-misskey') }}</a>
</div> </div>
<div class="version"> <div class="version">
<small>Misskey {{ version }}</small> <small>Misskey {{ version }}</small>
</div> </div>
</nav> </nav>
<main> <main>
<div class="page">
<div v-if="page == 'dashboard'"><x-dashboard/></div> <div v-if="page == 'dashboard'"><x-dashboard/></div>
<div v-if="page == 'instance'"><x-instance/></div> <div v-if="page == 'instance'"><x-instance/></div>
<div v-if="page == 'moderators'"><x-moderators/></div>
<div v-if="page == 'users'"><x-users/></div> <div v-if="page == 'users'"><x-users/></div>
<div v-if="page == 'emoji'"><x-emoji/></div> <div v-if="page == 'emoji'"><x-emoji/></div>
<div v-if="page == 'announcements'"><x-announcements/></div> <div v-if="page == 'announcements'"><x-announcements/></div>
<div v-if="page == 'hashtags'"><x-hashtags/></div> <div v-if="page == 'hashtags'"><x-hashtags/></div>
<div v-if="page == 'drive'"></div> <div v-if="page == 'drive'"></div>
<div v-if="page == 'update'"></div> <div v-if="page == 'update'"></div>
</div>
</main> </main>
</div> </div>
</template> </template>
@@ -54,10 +58,13 @@ import i18n from '../../i18n';
import { version } from '../../config'; import { version } from '../../config';
import XDashboard from "./dashboard.vue"; import XDashboard from "./dashboard.vue";
import XInstance from "./instance.vue"; import XInstance from "./instance.vue";
import XModerators from "./moderators.vue";
import XEmoji from "./emoji.vue"; import XEmoji from "./emoji.vue";
import XAnnouncements from "./announcements.vue"; import XAnnouncements from "./announcements.vue";
import XHashtags from "./hashtags.vue"; import XHashtags from "./hashtags.vue";
import XUsers from "./users.vue"; import XUsers from "./users.vue";
import { faHeadset, faArrowLeft, faShareAlt } from '@fortawesome/free-solid-svg-icons';
import { faGrin } from '@fortawesome/free-regular-svg-icons';
// Detect the user agent // Detect the user agent
const ua = navigator.userAgent.toLowerCase(); const ua = navigator.userAgent.toLowerCase();
@@ -68,6 +75,7 @@ export default Vue.extend({
components: { components: {
XDashboard, XDashboard,
XInstance, XInstance,
XModerators,
XEmoji, XEmoji,
XAnnouncements, XAnnouncements,
XHashtags, XHashtags,
@@ -81,7 +89,11 @@ export default Vue.extend({
page: 'dashboard', page: 'dashboard',
version, version,
isMobile, isMobile,
navOpend: !isMobile navOpend: !isMobile,
faGrin,
faArrowLeft,
faHeadset,
faShareAlt
}; };
}, },
methods: { methods: {
@@ -92,7 +104,7 @@ export default Vue.extend({
}); });
</script> </script>
<style lang="stylus"> <style lang="stylus" scoped>
.mk-admin .mk-admin
$headerHeight = 48px $headerHeight = 48px
@@ -253,7 +265,9 @@ export default Vue.extend({
> main > main
width 100% width 100%
padding 0 0 0 250px padding 0 0 0 250px
max-width 1300px
> .page
max-width 1150px
&.isMobile &.isMobile
> main > main

View File

@@ -10,7 +10,7 @@
<ui-input v-model="languages"><i slot="icon"><fa icon="language"/></i>{{ $t('languages') }}<span slot="desc">{{ $t('languages-desc') }}</span></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>
</section> </section>
<section class="fit-bottom"> <section class="fit-bottom">
<header><fa icon="headset"/> {{ $t('maintainer-config') }}</header> <header><fa :icon="faHeadset"/> {{ $t('maintainer-config') }}</header>
<ui-input v-model="maintainerName">{{ $t('maintainer-name') }}</ui-input> <ui-input v-model="maintainerName">{{ $t('maintainer-name') }}</ui-input>
<ui-input v-model="maintainerEmail" type="email"><i slot="icon"><fa :icon="['far', 'envelope']"/></i>{{ $t('maintainer-email') }}</ui-input> <ui-input v-model="maintainerEmail" type="email"><i slot="icon"><fa :icon="['far', 'envelope']"/></i>{{ $t('maintainer-email') }}</ui-input>
</section> </section>
@@ -24,14 +24,14 @@
<ui-input v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles">{{ $t('remote-drive-capacity-mb') }}<span slot="suffix">MB</span><span slot="desc">{{ $t('mb') }}</span></ui-input> <ui-input v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles">{{ $t('remote-drive-capacity-mb') }}<span slot="suffix">MB</span><span slot="desc">{{ $t('mb') }}</span></ui-input>
</section> </section>
<section class="fit-bottom"> <section class="fit-bottom">
<header><fa icon="shield-alt"/> {{ $t('recaptcha-config') }}</header> <header><fa :icon="faShieldAlt"/> {{ $t('recaptcha-config') }}</header>
<ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch> <ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch>
<ui-info>{{ $t('recaptcha-info') }}</ui-info> <ui-info>{{ $t('recaptcha-info') }}</ui-info>
<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-site-key') }}</ui-input> <ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-site-key') }}</ui-input>
<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-secret-key') }}</ui-input> <ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-secret-key') }}</ui-input>
</section> </section>
<section> <section>
<header><fa icon="ghost"/> {{ $t('proxy-account-config') }}</header> <header><fa :icon="faGhost"/> {{ $t('proxy-account-config') }}</header>
<ui-info>{{ $t('proxy-account-info') }}</ui-info> <ui-info>{{ $t('proxy-account-info') }}</ui-info>
<ui-input v-model="proxyAccount"><span slot="prefix">@</span>{{ $t('proxy-account-username') }}<span slot="desc">{{ $t('proxy-account-username-desc') }}</span></ui-input> <ui-input v-model="proxyAccount"><span slot="prefix">@</span>{{ $t('proxy-account-username') }}<span slot="desc">{{ $t('proxy-account-username-desc') }}</span></ui-input>
<ui-info warn>{{ $t('proxy-account-warn') }}</ui-info> <ui-info warn>{{ $t('proxy-account-warn') }}</ui-info>
@@ -76,6 +76,17 @@
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button> <ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
</section> </section>
</ui-card> </ui-card>
<ui-card>
<div slot="title"><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</div>
<section>
<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
<ui-info>{{ $t('discord-integration-info') }}</ui-info>
<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-id') }}</ui-input>
<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-secret') }}</ui-input>
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
</section>
</ui-card>
</div> </div>
</template> </template>
@@ -84,9 +95,11 @@ import Vue from 'vue';
import i18n from '../../i18n'; import i18n from '../../i18n';
import { host } from '../../config'; import { host } from '../../config';
import { toUnicode } from 'punycode'; import { toUnicode } from 'punycode';
import { faHeadset, faShieldAlt, faGhost } from '@fortawesome/free-solid-svg-icons';
export default Vue.extend({ export default Vue.extend({
i18n: i18n('admin/views/instance.vue'), i18n: i18n('admin/views/instance.vue'),
data() { data() {
return { return {
host: toUnicode(host), host: toUnicode(host),
@@ -111,8 +124,12 @@ export default Vue.extend({
enableGithubIntegration: false, enableGithubIntegration: false,
githubClientId: null, githubClientId: null,
githubClientSecret: null, githubClientSecret: null,
enableDiscordIntegration: false,
discordClientId: null,
discordClientSecret: null,
proxyAccount: null, proxyAccount: null,
inviteCode: null, inviteCode: null,
faHeadset, faShieldAlt, faGhost
}; };
}, },
@@ -138,6 +155,9 @@ export default Vue.extend({
this.enableGithubIntegration = meta.enableGithubIntegration; this.enableGithubIntegration = meta.enableGithubIntegration;
this.githubClientId = meta.githubClientId; this.githubClientId = meta.githubClientId;
this.githubClientSecret = meta.githubClientSecret; this.githubClientSecret = meta.githubClientSecret;
this.enableDiscordIntegration = meta.enableDiscordIntegration;
this.discordClientId = meta.discordClientId;
this.discordClientSecret = meta.discordClientSecret;
}); });
}, },
@@ -146,7 +166,7 @@ export default Vue.extend({
this.$root.api('admin/invite').then(x => { this.$root.api('admin/invite').then(x => {
this.inviteCode = x.code; this.inviteCode = x.code;
}).catch(e => { }).catch(e => {
this.$swal({ this.$root.alert({
type: 'error', type: 'error',
text: e text: e
}); });
@@ -177,13 +197,16 @@ export default Vue.extend({
enableGithubIntegration: this.enableGithubIntegration, enableGithubIntegration: this.enableGithubIntegration,
githubClientId: this.githubClientId, githubClientId: this.githubClientId,
githubClientSecret: this.githubClientSecret, githubClientSecret: this.githubClientSecret,
enableDiscordIntegration: this.enableDiscordIntegration,
discordClientId: this.discordClientId,
discordClientSecret: this.discordClientSecret
}).then(() => { }).then(() => {
this.$swal({ this.$root.alert({
type: 'success', type: 'success',
text: this.$t('saved') text: this.$t('saved')
}); });
}).catch(e => { }).catch(e => {
this.$swal({ this.$root.alert({
type: 'error', type: 'error',
text: e text: e
}); });

View File

@@ -0,0 +1,61 @@
<template>
<div class="jnhmugbb">
<ui-card>
<div slot="title"><fa icon="plus"/> {{ $t('add-moderator.title') }}</div>
<section class="fit-top">
<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>
</section>
</ui-card>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../i18n';
import parseAcct from "../../../../misc/acct/parse";
export default Vue.extend({
i18n: i18n('admin/views/moderators.vue'),
data() {
return {
username: '',
adding: false
};
},
methods: {
async add() {
this.adding = true;
const process = async () => {
const user = await this.$root.api('users/show', parseAcct(this.username));
await this.$root.api('admin/moderators/add', { userId: user.id });
this.$root.alert({
type: 'success',
text: this.$t('add-moderator.added')
});
};
await process().catch(e => {
this.$root.alert({
type: 'error',
text: e.toString()
});
});
this.adding = false;
},
}
});
</script>
<style lang="stylus" scoped>
.jnhmugbb
@media (min-width 500px)
padding 16px
</style>

View File

@@ -49,6 +49,7 @@ import parseAcct from "../../../../misc/acct/parse";
export default Vue.extend({ export default Vue.extend({
i18n: i18n('admin/views/users.vue'), i18n: i18n('admin/views/users.vue'),
data() { data() {
return { return {
verifyUsername: null, verifyUsername: null,
@@ -67,13 +68,19 @@ export default Vue.extend({
this.verifying = true; this.verifying = true;
const process = async () => { const process = async () => {
const user = await this.$root.os.api('users/show', parseAcct(this.verifyUsername)); const user = await this.$root.api('users/show', parseAcct(this.verifyUsername));
await this.$root.os.api('admin/verify-user', { userId: user.id }); await this.$root.api('admin/verify-user', { userId: user.id });
//this.$root.os.apis.dialog({ text: this.$t('verified') }); this.$root.alert({
type: 'success',
text: this.$t('verified')
});
}; };
await process().catch(e => { await process().catch(e => {
//this.$root.os.apis.dialog({ text: `Failed: ${e}` }); this.$root.alert({
type: 'error',
text: e.toString()
});
}); });
this.verifying = false; this.verifying = false;
@@ -83,13 +90,19 @@ export default Vue.extend({
this.unverifying = true; this.unverifying = true;
const process = async () => { const process = async () => {
const user = await this.$root.os.api('users/show', parseAcct(this.unverifyUsername)); const user = await this.$root.api('users/show', parseAcct(this.unverifyUsername));
await this.$root.os.api('admin/unverify-user', { userId: user.id }); await this.$root.api('admin/unverify-user', { userId: user.id });
//this.$root.os.apis.dialog({ text: this.$t('unverified') }); this.$root.alert({
type: 'success',
text: this.$t('unverified')
});
}; };
await process().catch(e => { await process().catch(e => {
//this.$root.os.apis.dialog({ text: `Failed: ${e}` }); this.$root.alert({
type: 'error',
text: e.toString()
});
}); });
this.unverifying = false; this.unverifying = false;
@@ -99,13 +112,19 @@ export default Vue.extend({
this.suspending = true; this.suspending = true;
const process = async () => { const process = async () => {
const user = await this.$root.os.api('users/show', parseAcct(this.suspendUsername)); const user = await this.$root.api('users/show', parseAcct(this.suspendUsername));
await this.$root.os.api('admin/suspend-user', { userId: user.id }); await this.$root.api('admin/suspend-user', { userId: user.id });
//this.$root.os.apis.dialog({ text: this.$t('suspended') }); this.$root.alert({
type: 'success',
text: this.$t('suspended')
});
}; };
await process().catch(e => { await process().catch(e => {
//this.$root.os.apis.dialog({ text: `Failed: ${e}` }); this.$root.alert({
type: 'error',
text: e.toString()
});
}); });
this.suspending = false; this.suspending = false;
@@ -115,13 +134,19 @@ export default Vue.extend({
this.unsuspending = true; this.unsuspending = true;
const process = async () => { const process = async () => {
const user = await this.$root.os.api('users/show', parseAcct(this.unsuspendUsername)); const user = await this.$root.api('users/show', parseAcct(this.unsuspendUsername));
await this.$root.os.api('admin/unsuspend-user', { userId: user.id }); await this.$root.api('admin/unsuspend-user', { userId: user.id });
//this.$root.os.apis.dialog({ text: this.$t('unsuspended') }); this.$root.alert({
type: 'success',
text: this.$t('unsuspended')
});
}; };
await process().catch(e => { await process().catch(e => {
//this.$root.os.apis.dialog({ text: `Failed: ${e}` }); this.$root.alert({
type: 'error',
text: e.toString()
});
}); });
this.unsuspending = false; this.unsuspending = false;

View File

@@ -123,29 +123,3 @@ pre
[data-icon] [data-icon]
display inline-block display inline-block
.swal2-container
z-index 10000 !important
&.swal2-shown
background-color rgba(0, 0, 0, 0.5) !important
.swal2-popup
background var(--face) !important
.swal2-content
color var(--text) !important
.swal2-confirm
background-color var(--primary) !important
border-left-color var(--primary) !important
border-right-color var(--primary) !important
color var(--primaryForeground) !important
&:hover
background-image none !important
background-color var(--primaryDarken5) !important
&:active
background-image none !important
background-color var(--primaryDarken5) !important

View File

@@ -9,14 +9,11 @@ import './style.styl';
import init from '../init'; import init from '../init';
import Index from './views/index.vue'; import Index from './views/index.vue';
import * as config from '../config';
/** /**
* init * init
*/ */
init(launch => { init(launch => {
document.title = `${config.name} | %i18n:common.application-authorization%`;
// Init router // Init router
const router = new VueRouter({ const router = new VueRouter({
mode: 'history', mode: 'history',

View File

@@ -43,6 +43,9 @@
if (`${url.pathname}/`.startsWith('/admin/')) app = 'admin'; if (`${url.pathname}/`.startsWith('/admin/')) app = 'admin';
//#endregion //#endregion
// Script version
const ver = localStorage.getItem('v') || VERSION;
//#region Detect the user language //#region Detect the user language
let lang = null; let lang = null;
@@ -66,11 +69,14 @@
//#endregion //#endregion
let locale = localStorage.getItem('locale'); let locale = localStorage.getItem('locale');
if (locale == null) { const localeKey = localStorage.getItem('localeKey');
const locale = await fetch(`/assets/locales/${lang}.json`)
if (locale == null || localeKey != `${ver}.${lang}`) {
const locale = await fetch(`/assets/locales/${lang}.json?ver=${ver}`)
.then(response => response.json()); .then(response => response.json());
localStorage.setItem('locale', JSON.stringify(locale)); localStorage.setItem('locale', JSON.stringify(locale));
localStorage.setItem('localeKey', `${ver}.${lang}`);
} }
// Detect the user agent // Detect the user agent
@@ -98,9 +104,6 @@
app = isMobile ? 'mobile' : 'desktop'; app = isMobile ? 'mobile' : 'desktop';
} }
// Script version
const ver = localStorage.getItem('v') || VERSION;
// Get salt query // Get salt query
const salt = localStorage.getItem('salt') const salt = localStorage.getItem('salt')
? `?salt=${localStorage.getItem('salt')}` ? `?salt=${localStorage.getItem('salt')}`
@@ -146,6 +149,8 @@
function refresh() { function refresh() {
localStorage.setItem('shouldFlush', 'false'); localStorage.setItem('shouldFlush', 'false');
localStorage.removeItem('locale');
// Random // Random
localStorage.setItem('salt', Math.random().toString().substr(2, 8)); localStorage.setItem('salt', Math.random().toString().substr(2, 8));

View File

@@ -66,7 +66,7 @@ export default function<T extends object>(data: {
this.bakeProps(); this.bakeProps();
(this as any).api('i/update_widget', { this.$root.api('i/update_widget', {
id: this.id, id: this.id,
data: this.props data: this.props
}); });

View File

@@ -22,7 +22,7 @@ export default async function($root: any, force = false, silent = false) {
} }
if (!silent) { if (!silent) {
$root.$dialog({ $root.alert({
title: $root.$t('@.update-available-title'), title: $root.$t('@.update-available-title'),
text: $root.$t('@.update-available', { newer, current }) text: $root.$t('@.update-available', { newer, current })
}); });

View File

@@ -4,12 +4,9 @@ export default ($root: any) => {
require('fuckadblock'); require('fuckadblock');
function adBlockDetected() { function adBlockDetected() {
$root.$dialog({ $root.alert({
title: $root.$t('@.adblock.detected'), title: $root.$t('@.adblock.detected'),
text: $root.$t('@.adblock.warning'), text: $root.$t('@.adblock.warning')
actins: [{
text: 'OK'
}]
}); });
} }

View File

@@ -1,9 +1,8 @@
import parse from '../../../../mfm/parse'; import parse from '../../../../mfm/parse';
import { sum } from '../../../../prelude/array'; import { sum, unique } from '../../../../prelude/array';
import shouldMuteNote from './should-mute-note'; import shouldMuteNote from './should-mute-note';
import MkNoteMenu from '../views/components/note-menu.vue'; import MkNoteMenu from '../views/components/note-menu.vue';
import MkReactionPicker from '../views/components/reaction-picker.vue'; import MkReactionPicker from '../views/components/reaction-picker.vue';
import Ok from '../views/components/ok.vue';
function focus(el, fn) { function focus(el, fn) {
const target = fn(el); const target = fn(el);
@@ -79,9 +78,9 @@ export default (opts: Opts = {}) => ({
urls(): string[] { urls(): string[] {
if (this.appearNote.text) { if (this.appearNote.text) {
const ast = parse(this.appearNote.text); const ast = parse(this.appearNote.text);
return ast return unique(ast
.filter(t => (t.type == 'url' || t.type == 'link') && !t.silent) .filter(t => (t.type == 'url' || t.type == 'link') && !t.silent)
.map(t => t.url); .map(t => t.url));
} else { } else {
return null; return null;
} }
@@ -142,7 +141,10 @@ export default (opts: Opts = {}) => ({
this.$root.api('notes/favorites/create', { this.$root.api('notes/favorites/create', {
noteId: this.appearNote.id noteId: this.appearNote.id
}).then(() => { }).then(() => {
this.$root.new(Ok); this.$root.alert({
type: 'success',
splash: true
});
}); });
}, },

View File

@@ -0,0 +1,197 @@
<template>
<div class="felqjxyj" :class="{ splash }">
<div class="bg" ref="bg" @click="onBgClick"></div>
<div class="main" ref="main">
<div class="icon" :class="type"><fa :icon="icon"/></div>
<header v-if="title" v-html="title"></header>
<div class="body" v-if="text" v-html="text"></div>
<ui-horizon-group no-grow class="buttons" v-if="!splash">
<ui-button @click="ok" primary autofocus>OK</ui-button>
<ui-button @click="cancel" v-if="showCancelButton">Cancel</ui-button>
</ui-horizon-group>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import * as anime from 'animejs';
import { faTimesCircle, faQuestionCircle } from '@fortawesome/free-regular-svg-icons';
export default Vue.extend({
props: {
type: {
type: String,
required: false,
default: 'info'
},
title: {
type: String,
required: false
},
text: {
type: String,
required: false
},
showCancelButton: {
type: Boolean,
default: false
},
splash: {
type: Boolean,
default: false
}
},
computed: {
icon(): any {
switch (this.type) {
case 'success': return 'check';
case 'error': return faTimesCircle;
case 'warning': return 'exclamation-triangle';
case 'info': return 'info-circle';
case 'question': return faQuestionCircle;
}
}
},
mounted() {
this.$nextTick(() => {
(this.$refs.bg as any).style.pointerEvents = 'auto';
anime({
targets: this.$refs.bg,
opacity: 1,
duration: 100,
easing: 'linear'
});
anime({
targets: this.$refs.main,
opacity: 1,
scale: [1.2, 1],
duration: 300,
easing: [0, 0.5, 0.5, 1]
});
if (this.splash) {
setTimeout(() => {
this.close();
}, 1000);
}
});
},
methods: {
ok() {
this.$emit('ok');
this.close();
},
cancel() {
this.$emit('cancel');
this.close();
},
close() {
(this.$refs.bg as any).style.pointerEvents = 'none';
anime({
targets: this.$refs.bg,
opacity: 0,
duration: 300,
easing: 'linear'
});
(this.$refs.main as any).style.pointerEvents = 'none';
anime({
targets: this.$refs.main,
opacity: 0,
scale: 0.8,
duration: 300,
easing: [0, 0.5, 0.5, 1],
complete: () => this.destroyDom()
});
},
onBgClick() {
this.cancel();
}
}
});
</script>
<style lang="stylus" scoped>
.felqjxyj
display flex
align-items center
justify-content center
position fixed
z-index 30000
top 0
left 0
width 100%
height 100%
&.splash
&, *
pointer-events none !important
> .main
min-width 0
width initial
> .bg
display block
position fixed
top 0
left 0
width 100%
height 100%
background rgba(#000, 0.7)
opacity 0
pointer-events none
> .main
display block
position fixed
margin auto
padding 32px
min-width 320px
max-width 480px
width calc(100% - 32px)
text-align center
background var(--face)
border-radius 8px
color var(--faceText)
opacity 0
> .icon
font-size 32px
&.success
color #37ec92
&.error
color #ec4137
&.warning
color #ecb637
> *
display block
margin 0 auto
> header
margin 16px 0 8px 0
font-weight bold
font-size 20px
& + .body
margin-top 8px
> .body
margin 16px 0
> .buttons
margin-top 16px
</style>

View File

@@ -0,0 +1,64 @@
<template>
<div class="mk-discord-setting">
<p>{{ $t('description') }}</p>
<p class="account" v-if="$store.state.i.discord" :title="`Discord ID: ${$store.state.i.discord.id}`">{{ $t('connected-to') }}: <a :href="`https://discordapp.com/users/${$store.state.i.discord.id}`" target="_blank">@{{ $store.state.i.discord.username }}#{{ $store.state.i.discord.discriminator }}</a></p>
<p>
<a :href="`${apiUrl}/connect/discord`" target="_blank" @click.prevent="connect">{{ $store.state.i.discord ? this.$t('reconnect') : this.$t('connect') }}</a>
<span v-if="$store.state.i.discord"> or </span>
<a :href="`${apiUrl}/disconnect/discord`" target="_blank" v-if="$store.state.i.discord" @click.prevent="disconnect">{{ $t('disconnect') }}</a>
</p>
<p class="id" v-if="$store.state.i.discord">Discord ID: {{ $store.state.i.discord.id }}</p>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
import { apiUrl } from '../../../config';
export default Vue.extend({
i18n: i18n('common/views/components/discord-setting.vue'),
data() {
return {
form: null,
apiUrl
};
},
mounted() {
this.$watch('$store.state.i', () => {
if (this.$store.state.i.discord && this.form)
this.form.close();
}, {
deep: true
});
},
methods: {
connect() {
this.form = window.open(apiUrl + '/connect/discord',
'discord_connect_window',
'height=570, width=520');
},
disconnect() {
window.open(apiUrl + '/disconnect/discord',
'discord_disconnect_window',
'height=570, width=520');
}
}
});
</script>
<style lang="stylus" scoped>
.mk-discord-setting
.account
border solid 1px #e1e8ed
border-radius 4px
padding 16px
a
font-weight bold
color inherit
.id
color #8899a6
</style>

View File

@@ -0,0 +1,202 @@
<template>
<div class="prlncendiewqqkrevzeruhndoakghvtx">
<header>
<button v-for="category in categories"
:title="category.text"
@click="go(category.ref)"
:class="{ active: category.isActive }"
>
<fa :icon="category.icon" fixed-width/>
</button>
</header>
<div class="emojis" ref="emojis" @scroll.passive="onScroll">
<section v-for="category in categories" :ref="category.ref">
<header><fa :icon="category.icon" fixed-width/> {{ category.text }}</header>
<div v-if="category.name">
<button v-for="emoji in Object.entries(lib).filter(([k, v]) => v.category === category.name)"
:title="emoji[0]"
@click="chosen(emoji[1].char)"
>
<mk-emoji :emoji="emoji[1].char"/>
</button>
</div>
<div v-else>
<button v-for="emoji in customEmojis"
:title="emoji.name"
@click="chosen(`:${emoji.name}:`)"
>
<img :src="emoji.url" :alt="emoji.name"/>
</button>
</div>
</section>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
import { lib } from 'emojilib';
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice } from '@fortawesome/free-solid-svg-icons';
import { faHeart, faFlag } from '@fortawesome/free-regular-svg-icons';
export default Vue.extend({
i18n: i18n('common/views/components/emoji-picker.vue'),
data() {
return {
lib,
customEmojis: [],
categories: [{
ref: 'customEmojiSection',
text: this.$t('custom-emoji'),
icon: faAsterisk,
isActive: true
}, {
name: 'people',
ref: 'peopleSection',
text: this.$t('people'),
icon: ['far', 'laugh'],
isActive: false
}, {
name: 'animals_and_nature',
ref: 'animalsAndNatureSection',
text: this.$t('animals-and-nature'),
icon: faLeaf,
isActive: false
}, {
name: 'food_and_drink',
ref: 'foodAndDrinkSection',
text: this.$t('food-and-drink'),
icon: faUtensils,
isActive: false
}, {
name: 'activity',
ref: 'activitySection',
text: this.$t('activity'),
icon: faFutbol,
isActive: false
}, {
name: 'travel_and_places',
ref: 'travelAndPlacesSection',
text: this.$t('travel-and-places'),
icon: faCity,
isActive: false
}, {
name: 'objects',
ref: 'objectsSection',
text: this.$t('objects'),
icon: faDice,
isActive: false
}, {
name: 'symbols',
ref: 'symbolsSection',
text: this.$t('symbols'),
icon: faHeart,
isActive: false
}, {
name: 'flags',
ref: 'flagsSection',
text: this.$t('flags'),
icon: faFlag,
isActive: false
}]
}
},
created() {
this.customEmojis = (this.$root.getMetaSync() || { emojis: [] }).emojis || [];
},
methods: {
go(ref) {
this.$refs.emojis.scrollTop = this.$refs[ref][0].offsetTop;
},
onScroll(e) {
const section = this.categories.forEach(x => {
const top = e.target.scrollTop;
const el = this.$refs[x.ref][0];
x.isActive = el.offsetTop <= top && el.offsetTop + el.offsetHeight > top;
});
},
chosen(emoji) {
this.$emit('chosen', emoji);
}
}
});
</script>
<style lang="stylus" scoped>
.prlncendiewqqkrevzeruhndoakghvtx
width 350px
background var(--face)
> header
display flex
> button
flex 1
padding 10px 0
font-size 16px
color var(--text)
transition color 0.2s ease
&:hover
color var(--textHighlighted)
transition color 0s
&.active
color var(--primary)
transition color 0s
> .emojis
height 300px
overflow-y auto
overflow-x hidden
> section
> header
position sticky
top 0
left 0
z-index 1
padding 8px
background var(--faceHeader)
color var(--text)
font-size 12px
> div
display grid
grid-template-columns 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr
gap 4px
padding 8px
> button
padding 0
width 100%
&:before
content ''
display block
width 1px
height 0
padding-bottom 100%
&:hover
> *
transform scale(1.2)
transition transform 0s
> *
position absolute
top 0
left 0
width 100%
height 100%
font-size 28px
transition transform 0.2s ease
pointer-events none
</style>

View File

@@ -22,7 +22,7 @@ export default Vue.extend({
}, },
customEmojis: { customEmojis: {
required: false, required: false,
default: [] default: () => []
} }
}, },

View File

@@ -0,0 +1,184 @@
<template>
<button class="wfliddvnhxvyusikowhxozkyxyenqxqr"
:class="{ wait, block, mini, active: isFollowing || hasPendingFollowRequestFromYou }"
@click="onClick"
:disabled="wait"
>
<template v-if="!wait">
<fa :icon="iconAndText[0]"/> <template v-if="!mini">{{ iconAndText[1] }}</template>
</template>
<template v-else><fa icon="spinner" pulse fixed-width/></template>
</button>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
export default Vue.extend({
i18n: i18n('common/views/components/follow-button.vue'),
props: {
user: {
type: Object,
required: true
},
block: {
type: Boolean,
required: false,
default: false
},
mini: {
type: Boolean,
required: false,
default: false
}
},
data() {
return {
isFollowing: this.user.isFollowing,
hasPendingFollowRequestFromYou: this.user.hasPendingFollowRequestFromYou,
wait: false,
connection: null
};
},
computed: {
iconAndText(): any[] {
return (
(this.hasPendingFollowRequestFromYou && this.user.isLocked) ? ['hourglass-half', this.$t('request-pending')] :
(this.hasPendingFollowRequestFromYou && !this.user.isLocked) ? ['hourglass-start', this.$t('follow-processing')] :
(this.isFollowing) ? ['minus', this.$t('following')] :
(!this.isFollowing && this.user.isLocked) ? ['plus', this.$t('follow-request')] :
(!this.isFollowing && !this.user.isLocked) ? ['plus', this.$t('follow')] :
[]
);
}
},
mounted() {
this.connection = this.$root.stream.useSharedConnection('main');
this.connection.on('follow', this.onFollowChange);
this.connection.on('unfollow', this.onFollowChange);
},
beforeDestroy() {
this.connection.dispose();
},
methods: {
onFollowChange(user) {
if (user.id == this.user.id) {
this.isFollowing = user.isFollowing;
this.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou;
}
},
async onClick() {
this.wait = true;
try {
if (this.isFollowing) {
await this.$root.api('following/delete', {
userId: this.user.id
});
} else {
if (this.hasPendingFollowRequestFromYou) {
await this.$root.api('following/requests/cancel', {
userId: this.user.id
});
} else if (this.user.isLocked) {
await this.$root.api('following/create', {
userId: this.user.id
});
this.hasPendingFollowRequestFromYou = true;
} else {
await this.$root.api('following/create', {
userId: this.user.id
});
this.hasPendingFollowRequestFromYou = true;
}
}
} catch (e) {
console.error(e);
} finally {
this.wait = false;
}
}
}
});
</script>
<style lang="stylus" scoped>
.wfliddvnhxvyusikowhxozkyxyenqxqr
display block
user-select none
cursor pointer
padding 0 16px
margin 0
min-width 100px
line-height 36px
font-size 14px
font-weight bold
color var(--primary)
background transparent
outline none
border solid 1px var(--primary)
border-radius 36px
&.mini
padding 0
min-width 0
width 32px
height 32px
font-size 16px
border-radius 4px
line-height 32px
&:focus
&:after
border-radius 8px
&.block
width 100%
&:focus
&:after
content ""
pointer-events none
position absolute
top -5px
right -5px
bottom -5px
left -5px
border 2px solid var(--primaryAlpha03)
border-radius 36px
&:hover
background var(--primaryAlpha01)
&:active
background var(--primaryAlpha02)
&.active
color var(--primaryForeground)
background var(--primary)
&:hover
background var(--primaryLighten10)
border-color var(--primaryLighten10)
&:active
background var(--primaryDarken10)
border-color var(--primaryDarken10)
&.wait
cursor wait !important
opacity 0.7
*
pointer-events none
</style>

View File

@@ -0,0 +1,26 @@
<template>
<span v-html="compiledFormula"></span>
</template>
<script lang="ts">
import Vue from 'vue';
import * as katex from 'katex';
export default Vue.extend({
props: {
formula: {
type: String,
required: true
}
},
computed: {
compiledFormula(): any {
return katex.renderToString(this.formula);
}
}
});
</script>
<style>
@import "../../../../../../node_modules/katex/dist/katex.min.css";
</style>

View File

@@ -0,0 +1,20 @@
<template>
<x-formula :formula="formula"/>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
components: {
XFormula: () => import('./formula-core.vue').then(m => m.default)
},
props: {
formula: {
type: String,
required: true
}
}
});
</script>

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="mk-github-setting"> <div class="mk-github-setting">
<p>{{ $t('description') }}<a :href="`${docsUrl}/link-to-github`" target="_blank">{{ $t('detail') }}</a></p> <p>{{ $t('description') }}</p>
<p class="account" v-if="$store.state.i.github" :title="`GitHub ID: ${$store.state.i.github.id}`">{{ $t('connected-to') }}: <a :href="`https://github.com/${$store.state.i.github.login}`" target="_blank">@{{ $store.state.i.github.login }}</a></p> <p class="account" v-if="$store.state.i.github" :title="`GitHub ID: ${$store.state.i.github.id}`">{{ $t('connected-to') }}: <a :href="`https://github.com/${$store.state.i.github.login}`" target="_blank">@{{ $store.state.i.github.login }}</a></p>
<p> <p>
<a :href="`${apiUrl}/connect/github`" target="_blank" @click.prevent="connect">{{ $store.state.i.github ? this.$t('reconnect') : this.$t('connect') }}</a> <a :href="`${apiUrl}/connect/github`" target="_blank" @click.prevent="connect">{{ $store.state.i.github ? this.$t('reconnect') : this.$t('connect') }}</a>
@@ -14,15 +14,14 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import i18n from '../../../i18n'; import i18n from '../../../i18n';
import { apiUrl, docsUrl } from '../../../config'; import { apiUrl } from '../../../config';
export default Vue.extend({ export default Vue.extend({
i18n: i18n('common/views/components/github-setting.vue'), i18n: i18n('common/views/components/github-setting.vue'),
data() { data() {
return { return {
form: null, form: null,
apiUrl, apiUrl
docsUrl
}; };
}, },
mounted() { mounted() {

View File

@@ -1,13 +1,8 @@
import Vue from 'vue'; import Vue from 'vue';
import muteAndBlock from './mute-and-block.vue'; import followButton from './follow-button.vue';
import error from './error.vue'; import error from './error.vue';
import apiSettings from './api-settings.vue';
import passwordSettings from './password-settings.vue';
import driveSettings from './drive-settings.vue';
import profileEditor from './profile-editor.vue';
import noteSkeleton from './note-skeleton.vue'; import noteSkeleton from './note-skeleton.vue';
import theme from './theme.vue';
import instance from './instance.vue'; import instance from './instance.vue';
import cwButton from './cw-button.vue'; import cwButton from './cw-button.vue';
import tagCloud from './tag-cloud.vue'; import tagCloud from './tag-cloud.vue';
@@ -27,14 +22,11 @@ import pollEditor from './poll-editor.vue';
import reactionIcon from './reaction-icon.vue'; import reactionIcon from './reaction-icon.vue';
import reactionsViewer from './reactions-viewer.vue'; import reactionsViewer from './reactions-viewer.vue';
import time from './time.vue'; import time from './time.vue';
import timer from './timer.vue';
import mediaList from './media-list.vue'; import mediaList from './media-list.vue';
import uploader from './uploader.vue'; import uploader from './uploader.vue';
import streamIndicator from './stream-indicator.vue'; import streamIndicator from './stream-indicator.vue';
import ellipsis from './ellipsis.vue'; import ellipsis from './ellipsis.vue';
import urlPreview from './url-preview.vue'; import urlPreview from './url-preview.vue';
import twitterSetting from './twitter-setting.vue';
import githubSetting from './github-setting.vue';
import fileTypeIcon from './file-type-icon.vue'; import fileTypeIcon from './file-type-icon.vue';
import emoji from './emoji.vue'; import emoji from './emoji.vue';
import welcomeTimeline from './welcome-timeline.vue'; import welcomeTimeline from './welcome-timeline.vue';
@@ -51,14 +43,9 @@ import uiInfo from './ui/info.vue';
import formButton from './ui/form/button.vue'; import formButton from './ui/form/button.vue';
import formRadio from './ui/form/radio.vue'; import formRadio from './ui/form/radio.vue';
Vue.component('mk-mute-and-block', muteAndBlock); Vue.component('mk-follow-button', followButton);
Vue.component('mk-error', error); Vue.component('mk-error', error);
Vue.component('mk-api-settings', apiSettings);
Vue.component('mk-password-settings', passwordSettings);
Vue.component('mk-drive-settings', driveSettings);
Vue.component('mk-profile-editor', profileEditor);
Vue.component('mk-note-skeleton', noteSkeleton); Vue.component('mk-note-skeleton', noteSkeleton);
Vue.component('mk-theme', theme);
Vue.component('mk-instance', instance); Vue.component('mk-instance', instance);
Vue.component('mk-cw-button', cwButton); Vue.component('mk-cw-button', cwButton);
Vue.component('mk-tag-cloud', tagCloud); Vue.component('mk-tag-cloud', tagCloud);
@@ -78,14 +65,11 @@ Vue.component('mk-poll-editor', pollEditor);
Vue.component('mk-reaction-icon', reactionIcon); Vue.component('mk-reaction-icon', reactionIcon);
Vue.component('mk-reactions-viewer', reactionsViewer); Vue.component('mk-reactions-viewer', reactionsViewer);
Vue.component('mk-time', time); Vue.component('mk-time', time);
Vue.component('mk-timer', timer);
Vue.component('mk-media-list', mediaList); Vue.component('mk-media-list', mediaList);
Vue.component('mk-uploader', uploader); Vue.component('mk-uploader', uploader);
Vue.component('mk-stream-indicator', streamIndicator); Vue.component('mk-stream-indicator', streamIndicator);
Vue.component('mk-ellipsis', ellipsis); Vue.component('mk-ellipsis', ellipsis);
Vue.component('mk-url-preview', urlPreview); Vue.component('mk-url-preview', urlPreview);
Vue.component('mk-twitter-setting', twitterSetting);
Vue.component('mk-github-setting', githubSetting);
Vue.component('mk-file-type-icon', fileTypeIcon); Vue.component('mk-file-type-icon', fileTypeIcon);
Vue.component('mk-emoji', emoji); Vue.component('mk-emoji', emoji);
Vue.component('mk-welcome-timeline', welcomeTimeline); Vue.component('mk-welcome-timeline', welcomeTimeline);

View File

@@ -34,6 +34,7 @@
import Vue from 'vue'; import Vue from 'vue';
import i18n from '../../../i18n'; import i18n from '../../../i18n';
import parse from '../../../../../mfm/parse'; import parse from '../../../../../mfm/parse';
import { unique } from '../../../../../prelude/array';
export default Vue.extend({ export default Vue.extend({
i18n: i18n('common/views/components/messaging-room.message.vue'), i18n: i18n('common/views/components/messaging-room.message.vue'),
@@ -49,9 +50,9 @@ export default Vue.extend({
urls(): string[] { urls(): string[] {
if (this.message.text) { if (this.message.text) {
const ast = parse(this.message.text); const ast = parse(this.message.text);
return ast return unique(ast
.filter(t => (t.type == 'url' || t.type == 'link') && !t.silent) .filter(t => (t.type == 'url' || t.type == 'link') && !t.silent)
.map(t => t.url); .map(t => t.url));
} else { } else {
return null; return null;
} }

View File

@@ -8,7 +8,7 @@
<p class="empty" v-if="!init && messages.length == 0"><fa icon="info-circle"/>{{ $t('empty') }}</p> <p class="empty" v-if="!init && messages.length == 0"><fa icon="info-circle"/>{{ $t('empty') }}</p>
<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages"><fa icon="flag"/>{{ $t('no-history') }}</p> <p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages"><fa icon="flag"/>{{ $t('no-history') }}</p>
<button class="more" :class="{ fetching: fetchingMoreMessages }" v-if="existMoreMessages" @click="fetchMoreMessages" :disabled="fetchingMoreMessages"> <button class="more" :class="{ fetching: fetchingMoreMessages }" v-if="existMoreMessages" @click="fetchMoreMessages" :disabled="fetchingMoreMessages">
<template v-if="fetchingMoreMessages"><fa icon="spinner .pulse" fixed-width/></template>{{ fetchingMoreMessages ? $t('@.loading') : $t('@.load-more') }} <template v-if="fetchingMoreMessages"><fa icon="spinner" pulse fixed-width/></template>{{ fetchingMoreMessages ? $t('@.loading') : $t('@.load-more') }}
</button> </button>
<template v-for="(message, i) in _messages"> <template v-for="(message, i) in _messages">
<x-message :message="message" :key="message.id"/> <x-message :message="message" :key="message.id"/>
@@ -20,7 +20,7 @@
<footer> <footer>
<transition name="fade"> <transition name="fade">
<div class="new-message" v-show="showIndicator"> <div class="new-message" v-show="showIndicator">
<button @click="onIndicatorClick"><i><fa icon="arrow-circle-down"/></i>{{ $t('new-message') }}</button> <button @click="onIndicatorClick"><i><fa :icon="faArrowCircleDown"/></i>{{ $t('new-message') }}</button>
</div> </div>
</transition> </transition>
<x-form :user="user" ref="form"/> <x-form :user="user" ref="form"/>
@@ -34,6 +34,7 @@ import i18n from '../../../i18n';
import XMessage from './messaging-room.message.vue'; import XMessage from './messaging-room.message.vue';
import XForm from './messaging-room.form.vue'; import XForm from './messaging-room.form.vue';
import { url } from '../../../config'; import { url } from '../../../config';
import { faArrowCircleDown } from '@fortawesome/free-solid-svg-icons';
export default Vue.extend({ export default Vue.extend({
i18n: i18n('common/views/components/messaging-room.vue'), i18n: i18n('common/views/components/messaging-room.vue'),
@@ -52,7 +53,8 @@ export default Vue.extend({
existMoreMessages: false, existMoreMessages: false,
connection: null, connection: null,
showIndicator: false, showIndicator: false,
timer: null timer: null,
faArrowCircleDown
}; };
}, },

View File

@@ -45,7 +45,7 @@
</template> </template>
</div> </div>
<p class="no-history" v-if="!fetching && messages.length == 0">{{ $t('no-history') }}</p> <p class="no-history" v-if="!fetching && messages.length == 0">{{ $t('no-history') }}</p>
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> <p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
</div> </div>
</template> </template>

View File

@@ -3,8 +3,9 @@ import { length } from 'stringz';
import parse from '../../../../../mfm/parse'; import parse from '../../../../../mfm/parse';
import getAcct from '../../../../../misc/acct/render'; import getAcct from '../../../../../misc/acct/render';
import MkUrl from './url.vue'; import MkUrl from './url.vue';
import MkGoogle from './google.vue';
import { concat } from '../../../../../prelude/array'; import { concat } from '../../../../../prelude/array';
import MkFormula from './formula.vue';
import MkGoogle from './google.vue';
export default Vue.component('misskey-flavored-markdown', { export default Vue.component('misskey-flavored-markdown', {
props: { props: {
@@ -199,7 +200,17 @@ export default Vue.component('misskey-flavored-markdown', {
})]; })];
} }
case 'math': {
//const MkFormula = () => import('./formula.vue').then(m => m.default);
return [createElement(MkFormula, {
props: {
formula: token.formula
}
})];
}
case 'search': { case 'search': {
//const MkGoogle = () => import('./google.vue').then(m => m.default);
return [createElement(MkGoogle, { return [createElement(MkGoogle, {
props: { props: {
q: token.query q: token.query

View File

@@ -14,11 +14,12 @@
<mk-time :time="note.createdAt"/> <mk-time :time="note.createdAt"/>
</router-link> </router-link>
<span class="visibility" v-if="note.visibility != 'public'"> <span class="visibility" v-if="note.visibility != 'public'">
<template v-if="note.visibility == 'home'"><fa icon="home"/></template> <fa v-if="note.visibility == 'home'" icon="home"/>
<template v-if="note.visibility == 'followers'"><fa icon="unlock"/></template> <fa v-if="note.visibility == 'followers'" icon="unlock"/>
<template v-if="note.visibility == 'specified'"><fa icon="envelope"/></template> <fa v-if="note.visibility == 'specified'" icon="envelope"/>
<template v-if="note.visibility == 'private'"><fa icon="lock"/></template> <fa v-if="note.visibility == 'private'" icon="lock"/>
</span> </span>
<span class="localOnly" v-if="note.localOnly == true"><fa icon="heart"/></span>
</div> </div>
</header> </header>
</template> </template>
@@ -115,4 +116,7 @@ export default Vue.extend({
> .visibility > .visibility
margin-left 8px margin-left 8px
> .localOnly
margin-left 4px
</style> </style>

View File

@@ -9,7 +9,6 @@ import Vue from 'vue';
import i18n from '../../../i18n'; import i18n from '../../../i18n';
import { url } from '../../../config'; import { url } from '../../../config';
import copyToClipboard from '../../../common/scripts/copy-to-clipboard'; import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
import Ok from './ok.vue';
import { concat, intersperse } from '../../../../../prelude/array'; import { concat, intersperse } from '../../../../../prelude/array';
export default Vue.extend({ export default Vue.extend({
@@ -56,7 +55,7 @@ export default Vue.extend({
} }
] : [] ] : []
], [ ], [
this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin ? [{ this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin || this.$store.state.i.isModerator ? [{
icon: ['far', 'trash-alt'], icon: ['far', 'trash-alt'],
text: this.$t('delete'), text: this.$t('delete'),
action: this.del action: this.del
@@ -79,7 +78,10 @@ export default Vue.extend({
this.$root.api('i/pin', { this.$root.api('i/pin', {
noteId: this.note.id noteId: this.note.id
}).then(() => { }).then(() => {
this.$root.new(Ok); this.$root.alert({
type: 'success',
splash: true
});
this.destroyDom(); this.destroyDom();
}); });
}, },
@@ -93,19 +95,29 @@ export default Vue.extend({
}, },
del() { del() {
if (!window.confirm(this.$t('delete-confirm'))) return; this.$root.alert({
type: 'warning',
text: this.$t('delete-confirm'),
showCancelButton: true
}).then(res => {
if (!res) return;
this.$root.api('notes/delete', { this.$root.api('notes/delete', {
noteId: this.note.id noteId: this.note.id
}).then(() => { }).then(() => {
this.destroyDom(); this.destroyDom();
}); });
});
}, },
favorite() { favorite() {
this.$root.api('notes/favorites/create', { this.$root.api('notes/favorites/create', {
noteId: this.note.id noteId: this.note.id
}).then(() => { }).then(() => {
this.$root.new(Ok); this.$root.alert({
type: 'success',
splash: true
});
this.destroyDom(); this.destroyDom();
}); });
}, },
@@ -114,7 +126,10 @@ export default Vue.extend({
this.$root.api('notes/favorites/delete', { this.$root.api('notes/favorites/delete', {
noteId: this.note.id noteId: this.note.id
}).then(() => { }).then(() => {
this.$root.new(Ok); this.$root.alert({
type: 'success',
splash: true
});
this.destroyDom(); this.destroyDom();
}); });
}, },

View File

@@ -1,175 +0,0 @@
<template>
<div class="yvbkymdqeusiqucuuloahhiqflzinufs">
<div class="bg" ref="bg"></div>
<div class="body" ref="body">
<div class="icon">
<div class="circle left"></div>
<span class="check tip"></span>
<span class="check long"></span>
<div class="ring"></div>
<div class="fix"></div>
<div class="circle right"></div>
</div>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import * as anime from 'animejs';
export default Vue.extend({
mounted() {
this.$nextTick(() => {
anime({
targets: this.$refs.bg,
opacity: 1,
duration: 300,
easing: 'linear'
});
anime({
targets: this.$refs.body,
opacity: 1,
scale: [1.2, 1],
duration: 300,
easing: [0, 0.5, 0.5, 1]
});
});
setTimeout(() => {
anime({
targets: this.$refs.bg,
opacity: 0,
duration: 300,
easing: 'linear'
});
anime({
targets: this.$refs.body,
opacity: 0,
scale: 0.8,
duration: 300,
easing: [0.5, 0, 1, 0.5],
complete: () => this.destroyDom()
});
}, 1250);
}
});
</script>
<style lang="stylus" scoped>
.yvbkymdqeusiqucuuloahhiqflzinufs
pointer-events none
> .bg
display block
position fixed
z-index 10000
top 0
left 0
width 100%
height 100%
background rgba(#000, 0.7)
opacity 0
> .body
position fixed
z-index 10000
top 0
right 0
left 0
bottom 0
margin auto
width 150px
height 150px
background var(--face)
border-radius 8px
opacity 0
> .icon
display flex
justify-content center
position absolute
top 0
right 0
left 0
bottom 0
width 5em
height 5em
margin auto
border .25em solid transparent
border-radius 50%
line-height 5em
cursor default
box-sizing content-box
user-select none
zoom normal
border-color #a5dc86
> .circle
position absolute
width 3.75em
height 7.5em
transform rotate(45deg)
border-radius 50%
background var(--face)
&.left
top -.4375em
left -2.0635em
transform rotate(-45deg)
transform-origin 3.75em 3.75em
border-radius 7.5em 0 0 7.5em
&.right
top -.6875em
left 1.875em
transform rotate(-45deg)
transform-origin 0 3.75em
border-radius 0 7.5em 7.5em 0
animation swal2-rotate-success-circular-line 4.25s ease-in
> .check
display block
position absolute
height .3125em
border-radius .125em
background-color #a5dc86
z-index 2
&.tip
top 2.875em
left .875em
width 1.5625em
transform rotate(45deg)
animation swal2-animate-success-line-tip .75s
&.long
top 2.375em
right .5em
width 2.9375em
transform rotate(-45deg)
animation swal2-animate-success-line-long .75s
> .fix
position absolute
top .5em
left 1.625em
width .4375em
height 5.625em
transform rotate(-45deg)
z-index 1
background var(--face)
> .ring
position absolute
top -.25em
left -.25em
width 100%
height 100%
border .25em solid rgba(165,220,134,.3)
border-radius 50%
z-index 2
box-sizing content-box
</style>

View File

@@ -25,12 +25,9 @@ export default Vue.extend({
type: 'password' type: 'password'
}).then(newPassword2 => { }).then(newPassword2 => {
if (newPassword !== newPassword2) { if (newPassword !== newPassword2) {
this.$dialog({ this.$root.alert({
title: null, title: null,
text: this.$t('not-match'), text: this.$t('not-match')
actions: [{
text: 'OK'
}]
}); });
return; return;
} }

View File

@@ -193,7 +193,7 @@ export default Vue.extend({
this.$store.state.i.bannerUrl = i.bannerUrl; this.$store.state.i.bannerUrl = i.bannerUrl;
if (notify) { if (notify) {
this.$swal({ this.$root.alert({
type: 'success', type: 'success',
text: this.$t('saved') text: this.$t('saved')
}); });
@@ -223,6 +223,5 @@ export default Vue.extend({
width 72px width 72px
height 72px height 72px
margin auto margin auto
box-shadow 0 0 16px rgba(0, 0, 0, 0.5)
</style> </style>

View File

@@ -14,6 +14,7 @@
<ui-button type="submit" :disabled="signing">{{ signing ? $t('signing-in') : $t('signin') }}</ui-button> <ui-button type="submit" :disabled="signing">{{ signing ? $t('signing-in') : $t('signin') }}</ui-button>
<p style="margin: 8px 0;"><a :href="`${apiUrl}/signin/twitter`">{{ $t('signin-with-twitter') }}</a></p> <p style="margin: 8px 0;"><a :href="`${apiUrl}/signin/twitter`">{{ $t('signin-with-twitter') }}</a></p>
<p style="margin: 8px 0;"><a :href="`${apiUrl}/signin/github`">{{ $t('signin-with-github') }}</a></p> <p style="margin: 8px 0;"><a :href="`${apiUrl}/signin/github`">{{ $t('signin-with-github') }}</a></p>
<p style="margin: 8px 0;"><a :href="`${apiUrl}/signin/discord`">{{ $t('signin-with-discord') /* TODO: Make these layouts better */ }}</a></p>
</form> </form>
</template> </template>

View File

@@ -10,7 +10,7 @@
<span>{{ $t('username') }}</span> <span>{{ $t('username') }}</span>
<span slot="prefix">@</span> <span slot="prefix">@</span>
<span slot="suffix">@{{ host }}</span> <span slot="suffix">@{{ host }}</span>
<p slot="desc" v-if="usernameState == 'wait'" style="color:#999"><fa icon="spinner .pulse" fixed-width/> {{ $t('checking') }}</p> <p slot="desc" v-if="usernameState == 'wait'" style="color:#999"><fa icon="spinner" pulse fixed-width/> {{ $t('checking') }}</p>
<p slot="desc" v-if="usernameState == 'ok'" style="color:#3CB7B5"><fa icon="check" fixed-width/> {{ $t('available') }}</p> <p slot="desc" v-if="usernameState == 'ok'" style="color:#3CB7B5"><fa icon="check" fixed-width/> {{ $t('available') }}</p>
<p slot="desc" v-if="usernameState == 'unavailable'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('unavailable') }}</p> <p slot="desc" v-if="usernameState == 'unavailable'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('unavailable') }}</p>
<p slot="desc" v-if="usernameState == 'error'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('error') }}</p> <p slot="desc" v-if="usernameState == 'error'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('error') }}</p>

View File

@@ -1,11 +1,11 @@
<template> <template>
<div class="mk-stream-indicator"> <div class="mk-stream-indicator">
<p v-if="stream.state == 'initializing'"> <p v-if="stream.state == 'initializing'">
<fa icon="spinner .pulse"/> <fa icon="spinner" pulse/>
<span>{{ $t('connecting') }}<mk-ellipsis/></span> <span>{{ $t('connecting') }}<mk-ellipsis/></span>
</p> </p>
<p v-if="stream.state == 'reconnecting'"> <p v-if="stream.state == 'reconnecting'">
<fa icon="spinner .pulse"/> <fa icon="spinner" pulse/>
<span>{{ $t('reconnecting') }}<mk-ellipsis/></span> <span>{{ $t('reconnecting') }}<mk-ellipsis/></span>
</p> </p>
<p v-if="stream.state == 'connected'"> <p v-if="stream.state == 'connected'">

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="jtivnzhfwquxpsfidertopbmwmchmnmo"> <div class="jtivnzhfwquxpsfidertopbmwmchmnmo">
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> <p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
<p class="empty" v-else-if="tags.length == 0"><fa icon="exclamation-circle"/>{{ $t('empty') }}</p> <p class="empty" v-else-if="tags.length == 0"><fa icon="exclamation-circle"/>{{ $t('empty') }}</p>
<div v-else> <div v-else>
<vue-word-cloud <vue-word-cloud

View File

@@ -1,7 +1,7 @@
<template> <template>
<div class="nicnklzforebnpfgasiypmpdaaglujqm"> <div class="nicnklzforebnpfgasiypmpdaaglujqm">
<label> <label>
<span>{{ $t('light-theme') }}</span> <span><fa :icon="faSun"/> {{ $t('light-theme') }}</span>
<ui-select v-model="light" :placeholder="$t('light-theme')"> <ui-select v-model="light" :placeholder="$t('light-theme')">
<optgroup :label="$t('light-themes')"> <optgroup :label="$t('light-themes')">
<option v-for="x in lightThemes" :value="x.id" :key="x.id">{{ x.name }}</option> <option v-for="x in lightThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
@@ -13,7 +13,7 @@
</label> </label>
<label> <label>
<span>{{ $t('dark-theme') }}</span> <span><fa :icon="faMoon"/> {{ $t('dark-theme') }}</span>
<ui-select v-model="dark" :placeholder="$t('dark-theme')"> <ui-select v-model="dark" :placeholder="$t('dark-theme')">
<optgroup :label="$t('dark-themes')"> <optgroup :label="$t('dark-themes')">
<option v-for="x in darkThemes" :value="x.id" :key="x.id">{{ x.name }}</option> <option v-for="x in darkThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
@@ -104,6 +104,7 @@ import { Chrome } from 'vue-color';
import * as uuid from 'uuid'; import * as uuid from 'uuid';
import * as tinycolor from 'tinycolor2'; import * as tinycolor from 'tinycolor2';
import * as JSON5 from 'json5'; import * as JSON5 from 'json5';
import { faMoon, faSun } from '@fortawesome/free-regular-svg-icons';
// 後方互換性のため // 後方互換性のため
function convertOldThemedefinition(t) { function convertOldThemedefinition(t) {
@@ -135,7 +136,8 @@ export default Vue.extend({
myThemeDesc: '', myThemeDesc: '',
myThemePrimary: lightTheme.vars.primary, myThemePrimary: lightTheme.vars.primary,
myThemeSecondary: lightTheme.vars.secondary, myThemeSecondary: lightTheme.vars.secondary,
myThemeText: lightTheme.vars.text myThemeText: lightTheme.vars.text,
faMoon, faSun
}; };
}, },
@@ -221,7 +223,7 @@ export default Vue.extend({
try { try {
theme = JSON5.parse(code); theme = JSON5.parse(code);
} catch (e) { } catch (e) {
this.$swal({ this.$root.alert({
type: 'error', type: 'error',
text: this.$t('invalid-theme') text: this.$t('invalid-theme')
}); });
@@ -234,7 +236,7 @@ export default Vue.extend({
} }
if (theme.id == null) { if (theme.id == null) {
this.$swal({ this.$root.alert({
type: 'error', type: 'error',
text: this.$t('invalid-theme') text: this.$t('invalid-theme')
}); });
@@ -242,7 +244,7 @@ export default Vue.extend({
} }
if (this.$store.state.device.themes.some(t => t.id == theme.id)) { if (this.$store.state.device.themes.some(t => t.id == theme.id)) {
this.$swal({ this.$root.alert({
type: 'info', type: 'info',
text: this.$t('already-installed') text: this.$t('already-installed')
}); });
@@ -254,7 +256,7 @@ export default Vue.extend({
key: 'themes', value: themes key: 'themes', value: themes
}); });
this.$swal({ this.$root.alert({
type: 'success', type: 'success',
text: this.$t('installed').replace('{}', theme.name) text: this.$t('installed').replace('{}', theme.name)
}); });
@@ -267,7 +269,7 @@ export default Vue.extend({
key: 'themes', value: themes key: 'themes', value: themes
}); });
this.$swal({ this.$root.alert({
type: 'info', type: 'info',
text: this.$t('uninstalled').replace('{}', theme.name) text: this.$t('uninstalled').replace('{}', theme.name)
}); });
@@ -304,7 +306,7 @@ export default Vue.extend({
const theme = this.myTheme; const theme = this.myTheme;
if (theme.name == null || theme.name.trim() == '') { if (theme.name == null || theme.name.trim() == '') {
this.$swal({ this.$root.alert({
type: 'warning', type: 'warning',
text: this.$t('theme-name-required') text: this.$t('theme-name-required')
}); });
@@ -318,7 +320,7 @@ export default Vue.extend({
key: 'themes', value: themes key: 'themes', value: themes
}); });
this.$swal({ this.$root.alert({
type: 'success', type: 'success',
text: this.$t('saved') text: this.$t('saved')
}); });

View File

@@ -1,49 +0,0 @@
<template>
<time class="mk-time">
{{ hh }}:{{ mm }}:{{ ss }}
</time>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: {
time: {
type: [Date, String],
required: true
}
},
data() {
return {
tickId: null,
hh: null,
mm: null,
ss: null
};
},
computed: {
_time(): Date {
return typeof this.time == 'string' ? new Date(this.time) : this.time;
}
},
created() {
this.tick();
this.tickId = setInterval(this.tick, 1000);
},
destroyed() {
clearInterval(this.tickId);
},
methods: {
tick() {
const now = new Date().getTime();
const start = this._time.getTime();
const ago = Math.floor((now - start) / 1000);
this.hh = Math.floor(ago / (60 * 60)).toString().padStart(2, '0');
this.mm = Math.floor(ago / 60).toString().padStart(2, '0');
this.ss = (ago % 60).toString().padStart(2, '0');
}
}
});
</script>

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="csqvmxybqbycalfhkxvyfrgbrdalkaoc"> <div class="csqvmxybqbycalfhkxvyfrgbrdalkaoc">
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> <p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
<p class="empty" v-else-if="stats.length == 0"><fa icon="exclamation-circle"/>{{ $t('empty') }}</p> <p class="empty" v-else-if="stats.length == 0"><fa icon="exclamation-circle"/>{{ $t('empty') }}</p>
<!-- トランジションを有効にするとなぜかメモリリークする --> <!-- トランジションを有効にするとなぜかメモリリークする -->
<transition-group v-else tag="div" name="chart"> <transition-group v-else tag="div" name="chart">

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="mk-twitter-setting"> <div class="mk-twitter-setting">
<p>{{ $t('description') }}<a :href="`${docsUrl}/link-to-twitter`" target="_blank">{{ $t('detail') }}</a></p> <p>{{ $t('description') }}</p>
<p class="account" v-if="$store.state.i.twitter" :title="`Twitter ID: ${$store.state.i.twitter.userId}`">{{ $t('connected-to') }}: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p> <p class="account" v-if="$store.state.i.twitter" :title="`Twitter ID: ${$store.state.i.twitter.userId}`">{{ $t('connected-to') }}: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
<p> <p>
<a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ $store.state.i.twitter ? this.$t('reconnect') : this.$t('connect') }}</a> <a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ $store.state.i.twitter ? this.$t('reconnect') : this.$t('connect') }}</a>
@@ -14,15 +14,14 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import i18n from '../../../i18n'; import i18n from '../../../i18n';
import { apiUrl, docsUrl } from '../../../config'; import { apiUrl } from '../../../config';
export default Vue.extend({ export default Vue.extend({
i18n: i18n('common/views/components/twitter-setting.vue'), i18n: i18n('common/views/components/twitter-setting.vue'),
data() { data() {
return { return {
form: null, form: null,
apiUrl, apiUrl
docsUrl
}; };
}, },
mounted() { mounted() {

View File

@@ -38,12 +38,24 @@ export default Vue.extend({
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
} },
autofocus: {
type: Boolean,
required: false,
default: false
},
}, },
data() { data() {
return { return {
styl: 'fill' styl: 'fill'
}; };
},
mounted() {
if (this.autofocus) {
this.$nextTick(() => {
this.$el.focus();
});
}
} }
}); });
</script> </script>
@@ -57,6 +69,7 @@ export default Vue.extend({
text-align center text-align center
font-weight normal font-weight normal
font-size 16px font-size 16px
line-height 24px
border none border none
border-radius 6px border-radius 6px
outline none outline none
@@ -85,6 +98,7 @@ export default Vue.extend({
&.inline &.inline
display inline-block display inline-block
width auto width auto
min-width 100px
&.primary &.primary
font-weight bold font-weight bold

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="pfzekjfwkwvadvlujpdnnxfggqgqjoze" :class="{ inputs }"> <div class="vnxwkwuf" :class="{ inputs, noGrow }">
<slot></slot> <slot></slot>
</div> </div>
</template> </template>
@@ -15,21 +15,27 @@ export default Vue.extend({
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
},
noGrow: {
type: Boolean,
required: false,
default: false
} }
} }
}); });
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
.pfzekjfwkwvadvlujpdnnxfggqgqjoze .vnxwkwuf
display flex
&.inputs &.inputs
margin 32px 0 margin 32px 0
&:not(.noGrow)
display flex
> * > *
flex 1 flex 1
&:not(:last-child) > *:not(:last-child)
margin-right 16px margin-right 16px
</style> </style>

View File

@@ -3,7 +3,7 @@
<ol v-if="uploads.length > 0"> <ol v-if="uploads.length > 0">
<li v-for="ctx in uploads" :key="ctx.id"> <li v-for="ctx in uploads" :key="ctx.id">
<div class="img" :style="{ backgroundImage: `url(${ ctx.img })` }"></div> <div class="img" :style="{ backgroundImage: `url(${ ctx.img })` }"></div>
<p class="name"><fa icon="spinner .pulse"/>{{ ctx.name }}</p> <p class="name"><fa icon="spinner" pulse/>{{ ctx.name }}</p>
<p class="status"> <p class="status">
<span class="initing" v-if="ctx.progress == undefined">{{ $t('waiting') }}<mk-ellipsis/></span> <span class="initing" v-if="ctx.progress == undefined">{{ $t('waiting') }}<mk-ellipsis/></span>
<span class="kb" v-if="ctx.progress != undefined">{{ String(Math.floor(ctx.progress.value / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i> / {{ String(Math.floor(ctx.progress.max / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i></span> <span class="kb" v-if="ctx.progress != undefined">{{ String(Math.floor(ctx.progress.value / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i> / {{ String(Math.floor(ctx.progress.max / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i></span>
@@ -57,17 +57,11 @@ export default Vue.extend({
return; return;
} }
// Upload if the file didn't exist yet
const buf = new Uint8Array(e.target.result);
let bin = '';
// We use for-of loop instead of apply() to avoid RangeError
// SEE: https://stackoverflow.com/questions/9267899/arraybuffer-to-base64-encoded-string
for (const byte of buf) bin += String.fromCharCode(byte);
const ctx = { const ctx = {
id: id, id: id,
name: file.name || 'untitled', name: file.name || 'untitled',
progress: undefined, progress: undefined,
img: 'data:*/*;base64,' + btoa(bin) img: window.URL.createObjectURL(file)
}; };
this.uploads.push(ctx); this.uploads.push(ctx);

View File

@@ -35,6 +35,24 @@
<span>{{ $t('private') }}</span> <span>{{ $t('private') }}</span>
</div> </div>
</div> </div>
<div @click="choose('local-public')" :class="{ active: v == 'local-public' }">
<div><fa icon="globe"/></div>
<div>
<span>{{ $t('local-public') }}</span>
</div>
</div>
<div @click="choose('local-home')" :class="{ active: v == 'local-home' }">
<div><fa icon="home"/></div>
<div>
<span>{{ $t('local-home') }}</span>
</div>
</div>
<div @click="choose('local-followers')" :class="{ active: v == 'local-followers' }">
<div><fa icon="unlock"/></div>
<div>
<span>{{ $t('local-followers') }}</span>
</div>
</div>
</div> </div>
</div> </div>
</template> </template>

View File

@@ -25,7 +25,7 @@
<template v-else-if="!user.isFollowing && user.isLocked"><fa icon="plus"/> {{ $t('follow-request') }}</template> <template v-else-if="!user.isFollowing && user.isLocked"><fa icon="plus"/> {{ $t('follow-request') }}</template>
<template v-else-if="!user.isFollowing && !user.isLocked"><fa icon="plus"/> {{ $t('follow') }}</template> <template v-else-if="!user.isFollowing && !user.isLocked"><fa icon="plus"/> {{ $t('follow') }}</template>
</template> </template>
<template v-else><fa icon="spinner .pulse" fixed-width/></template> <template v-else><fa icon="spinner" pulse fixed-width/></template>
</button> </button>
</div> </div>
</template> </template>

View File

@@ -3,9 +3,15 @@
<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2"> <mk-widget-container :show-header="props.design == 0" :naked="props.design == 2">
<template slot="header"><fa icon="camera"/>{{ $t('title') }}</template> <template slot="header"><fa icon="camera"/>{{ $t('title') }}</template>
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> <p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
<div :class="$style.stream" v-if="!fetching && images.length > 0"> <div :class="$style.stream" v-if="!fetching && images.length > 0">
<div v-for="image in images" :class="$style.img" :style="`background-image: url(${image.thumbnailUrl || image.url})`"></div> <div v-for="image in images"
:class="$style.img"
:style="`background-image: url(${image.thumbnailUrl || image.url})`"
draggable="true"
@dragstart="onDragstart(image, $event)"
@dragend="onDragend"
></div>
</div> </div>
<p :class="$style.empty" v-if="!fetching && images.length == 0">{{ $t('no-photos') }}</p> <p :class="$style.empty" v-if="!fetching && images.length == 0">{{ $t('no-photos') }}</p>
</mk-widget-container> </mk-widget-container>
@@ -31,6 +37,7 @@ export default define({
connection: null connection: null
}; };
}, },
mounted() { mounted() {
this.connection = this.$root.stream.useSharedConnection('main'); this.connection = this.$root.stream.useSharedConnection('main');
@@ -44,9 +51,11 @@ export default define({
this.fetching = false; this.fetching = false;
}); });
}, },
beforeDestroy() { beforeDestroy() {
this.connection.dispose(); this.connection.dispose();
}, },
methods: { methods: {
onDriveFileCreated(file) { onDriveFileCreated(file) {
if (/^image\/.+$/.test(file.type)) { if (/^image\/.+$/.test(file.type)) {
@@ -54,6 +63,7 @@ export default define({
if (this.images.length > 9) this.images.pop(); if (this.images.length > 9) this.images.pop();
} }
}, },
func() { func() {
if (this.props.design == 2) { if (this.props.design == 2) {
this.props.design = 0; this.props.design = 0;
@@ -62,7 +72,16 @@ export default define({
} }
this.save(); this.save();
} },
onDragstart(file, e) {
e.dataTransfer.effectAllowed = 'move';
e.dataTransfer.setData('mk_drive_file', JSON.stringify(file));
},
onDragend(e) {
this.browser.isDragSource = false;
},
} }
}); });
</script> </script>

View File

@@ -5,7 +5,7 @@
<button slot="func" title="設定" @click="setting"><fa icon="cog"/></button> <button slot="func" title="設定" @click="setting"><fa icon="cog"/></button>
<div class="mkw-rss--body" :data-mobile="platform == 'mobile'"> <div class="mkw-rss--body" :data-mobile="platform == 'mobile'">
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> <p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
<div class="feed" v-else> <div class="feed" v-else>
<a v-for="item in items" :href="item.link" target="_blank">{{ item.title }}</a> <a v-for="item in items" :href="item.link" target="_blank">{{ item.title }}</a>
</div> </div>

View File

@@ -3,6 +3,7 @@
<p>Maintainer: <b><a :href="'mailto:' + meta.maintainer.email" target="_blank">{{ meta.maintainer.name }}</a></b></p> <p>Maintainer: <b><a :href="'mailto:' + meta.maintainer.email" target="_blank">{{ meta.maintainer.name }}</a></b></p>
<p>Machine: {{ meta.machine }}</p> <p>Machine: {{ meta.machine }}</p>
<p>Node: {{ meta.node }}</p> <p>Node: {{ meta.node }}</p>
<p>Version: {{ meta.version }} </p>
</div> </div>
</template> </template>

View File

@@ -2,7 +2,7 @@
<div class="memory"> <div class="memory">
<x-pie class="pie" :value="usage"/> <x-pie class="pie" :value="usage"/>
<div> <div>
<p><fa icon="flask"/>Memory</p> <p><fa icon="memory"/>Memory</p>
<p>Total: {{ total | bytes(1) }}</p> <p>Total: {{ total | bytes(1) }}</p>
<p>Used: {{ used | bytes(1) }}</p> <p>Used: {{ used | bytes(1) }}</p>
<p>Free: {{ free | bytes(1) }}</p> <p>Free: {{ free | bytes(1) }}</p>

View File

@@ -4,7 +4,7 @@
<template slot="header"><fa icon="server"/>{{ $t('title') }}</template> <template slot="header"><fa icon="server"/>{{ $t('title') }}</template>
<button slot="func" @click="toggle" :title="$t('toggle')"><fa icon="sort"/></button> <button slot="func" @click="toggle" :title="$t('toggle')"><fa icon="sort"/></button>
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> <p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
<template v-if="!fetching"> <template v-if="!fetching">
<x-cpu-memory v-show="props.view == 0" :connection="connection"/> <x-cpu-memory v-show="props.view == 0" :connection="connection"/>
<x-cpu v-show="props.view == 1" :connection="connection" :meta="meta"/> <x-cpu v-show="props.view == 1" :connection="connection" :meta="meta"/>

View File

@@ -8,12 +8,9 @@ export default ($root: any) => {
const regex = RegExp('\.(jpg|jpeg|png|gif|webp|bmp|tiff)$'); const regex = RegExp('\.(jpg|jpeg|png|gif|webp|bmp|tiff)$');
if (!regex.test(file.name) ) { if (!regex.test(file.name) ) {
$root.$dialog({ $root.alert({
title: '%fa:info-circle% %i18n:desktop.invalid-filetype%', title: '%fa:info-circle% %i18n:desktop.invalid-filetype%',
text: null, text: null
actions: [{
text: '%i18n:common.got-it%'
}]
}); });
return reject('invalid-filetype'); return reject('invalid-filetype');
} }
@@ -90,12 +87,9 @@ export default ($root: any) => {
value: i.avatarUrl value: i.avatarUrl
}); });
$root.$dialog({ $root.alert({
title: '%fa:info-circle% %i18n:desktop.avatar-updated%', title: '%fa:info-circle% %i18n:desktop.avatar-updated%',
text: null, text: null
actions: [{
text: '%i18n:common.got-it%'
}]
}); });
return i; return i;

View File

@@ -10,10 +10,7 @@ export default ($root: any) => {
if (!regex.test(file.name) ) { if (!regex.test(file.name) ) {
$root.dialog({ $root.dialog({
title: '%fa:info-circle% %i18n:desktop.invalid-filetype%', title: '%fa:info-circle% %i18n:desktop.invalid-filetype%',
text: null, text: null
actions: [{
text: '%i18n:common.got-it%'
}]
}); });
return reject('invalid-filetype'); return reject('invalid-filetype');
} }
@@ -90,12 +87,9 @@ export default ($root: any) => {
value: i.bannerUrl value: i.bannerUrl
}); });
$root.$dialog({ $root.alert({
title: '%fa:info-circle% %i18n:desktop.banner-updated%', title: '%fa:info-circle% %i18n:desktop.banner-updated%',
text: null, text: null
actions: [{
text: '%i18n:common.got-it%'
}]
}); });
return i; return i;

View File

@@ -34,7 +34,6 @@ import PostFormWindow from './views/components/post-form-window.vue';
import RenoteFormWindow from './views/components/renote-form-window.vue'; import RenoteFormWindow from './views/components/renote-form-window.vue';
import MkChooseFileFromDriveWindow from './views/components/choose-file-from-drive-window.vue'; import MkChooseFileFromDriveWindow from './views/components/choose-file-from-drive-window.vue';
import MkChooseFolderFromDriveWindow from './views/components/choose-folder-from-drive-window.vue'; import MkChooseFolderFromDriveWindow from './views/components/choose-folder-from-drive-window.vue';
import Dialog from './views/components/dialog.vue';
import InputDialog from './views/components/input-dialog.vue'; import InputDialog from './views/components/input-dialog.vue';
import Notification from './views/components/ui-notification.vue'; import Notification from './views/components/ui-notification.vue';
@@ -114,21 +113,6 @@ init(async (launch) => {
}); });
}, },
$dialog(opts) {
return new Promise<string>((res, rej) => {
const o = opts || {};
const d = this.$root.new(Dialog, {
title: o.title,
text: o.text,
modal: o.modal,
buttons: o.actions
});
d.$once('clicked', id => {
res(id);
});
});
},
$input(opts) { $input(opts) {
return new Promise<string>((res, rej) => { return new Promise<string>((res, rej) => {
const o = opts || {}; const o = opts || {};

View File

@@ -4,7 +4,7 @@
<template slot="header"><fa icon="chart-bar"/>{{ $t('title') }}</template> <template slot="header"><fa icon="chart-bar"/>{{ $t('title') }}</template>
<button slot="func" :title="$t('toggle')" @click="toggle"><fa icon="sort"/></button> <button slot="func" :title="$t('toggle')" @click="toggle"><fa icon="sort"/></button>
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> <p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
<template v-else> <template v-else>
<x-calendar v-show="view == 0" :data="[].concat(activity)"/> <x-calendar v-show="view == 0" :data="[].concat(activity)"/>
<x-chart v-show="view == 1" :data="[].concat(activity)"/> <x-chart v-show="view == 1" :data="[].concat(activity)"/>

View File

@@ -1,168 +0,0 @@
<template>
<div class="mk-dialog">
<div class="bg" ref="bg" @click="onBgClick"></div>
<div class="main" ref="main">
<header v-html="title" :class="$style.header"></header>
<div class="body" v-html="text"></div>
<div class="buttons">
<button v-for="button in buttons" @click="click(button)">{{ button.text }}</button>
</div>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import * as anime from 'animejs';
export default Vue.extend({
props: {
title: {
type: String,
required: false
},
text: {
type: String,
required: true
},
buttons: {
type: Array,
default: () => {
return [{
text: 'OK'
}];
}
},
modal: {
type: Boolean,
default: false
}
},
mounted() {
this.$nextTick(() => {
(this.$refs.bg as any).style.pointerEvents = 'auto';
anime({
targets: this.$refs.bg,
opacity: 1,
duration: 100,
easing: 'linear'
});
anime({
targets: this.$refs.main,
opacity: 1,
scale: [1.2, 1],
duration: 300,
easing: [0, 0.5, 0.5, 1]
});
});
},
methods: {
click(button) {
this.$emit('clicked', button.id);
this.close();
},
close() {
(this.$refs.bg as any).style.pointerEvents = 'none';
anime({
targets: this.$refs.bg,
opacity: 0,
duration: 300,
easing: 'linear'
});
(this.$refs.main as any).style.pointerEvents = 'none';
anime({
targets: this.$refs.main,
opacity: 0,
scale: 0.8,
duration: 300,
easing: [ 0.5, -0.5, 1, 0.5 ],
complete: () => this.destroyDom()
});
},
onBgClick() {
if (!this.modal) {
this.close();
}
}
}
});
</script>
<style lang="stylus" scoped>
.mk-dialog
> .bg
display block
position fixed
z-index 8192
top 0
left 0
width 100%
height 100%
background rgba(#000, 0.7)
opacity 0
pointer-events none
> .main
display block
position fixed
z-index 8192
top 20%
left 0
right 0
margin 0 auto 0 auto
padding 32px 42px
width 480px
background #fff
opacity 0
> .body
margin 1em 0
color #888
> .buttons
> button
display inline-block
float right
margin 0
padding 10px 10px
font-size 1.1em
font-weight normal
text-decoration none
color #888
background transparent
outline none
border none
border-radius 0
cursor pointer
transition color 0.1s ease
i
margin 0 0.375em
&:hover
color var(--primary)
&:active
color var(--primaryDarken10)
transition color 0s ease
</style>
<style lang="stylus" module>
.header
margin 1em 0
color var(--primary)
// color #43A4EC
font-weight bold
&:empty
display none
> i
margin-right 0.5em
</style>

View File

@@ -170,12 +170,9 @@ export default Vue.extend({
copyUrl() { copyUrl() {
copyToClipboard(this.file.url); copyToClipboard(this.file.url);
this.$dialog({ this.$root.alert({
title: this.$t('contextmenu.copied'), title: this.$t('contextmenu.copied'),
text: this.$t('contextmenu.copied-url-to-clipboard'), text: this.$t('contextmenu.copied-url-to-clipboard')
actions: [{
text: this.$t('@.ok')
}]
}); });
}, },

View File

@@ -155,12 +155,9 @@ export default Vue.extend({
}).catch(err => { }).catch(err => {
switch (err) { switch (err) {
case 'detected-circular-definition': case 'detected-circular-definition':
this.$dialog({ this.$root.alert({
title: this.$t('unable-to-process'), title: this.$t('unable-to-process'),
text: this.$t('circular-reference-detected'), text: this.$t('circular-reference-detected')
actions: [{
text: this.$t('@.ok')
}]
}); });
break; break;
default: default:

View File

@@ -313,12 +313,9 @@ export default Vue.extend({
}).catch(err => { }).catch(err => {
switch (err) { switch (err) {
case 'detected-circular-definition': case 'detected-circular-definition':
this.$dialog({ this.$root.alert({
title: this.$t('unable-to-process'), title: this.$t('unable-to-process'),
text: this.$t('circular-reference-detected'), text: this.$t('circular-reference-detected')
actions: [{
text: this.$t('@.ok')
}]
}); });
break; break;
default: default:
@@ -343,12 +340,9 @@ export default Vue.extend({
folderId: this.folder ? this.folder.id : undefined folderId: this.folder ? this.folder.id : undefined
}); });
this.$dialog({ this.$root.alert({
title: this.$t('url-upload-requested'), title: this.$t('url-upload-requested'),
text: this.$t('may-take-time'), text: this.$t('may-take-time')
actions: [{
text: this.$t('@.ok')
}]
}); });
}); });
}, },

View File

@@ -0,0 +1,84 @@
<template>
<div class="gcafiosrssbtbnbzqupfmglvzgiaipyv">
<x-picker @chosen="chosen"/>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import contains from '../../../common/scripts/contains';
export default Vue.extend({
components: {
XPicker: () => import('../../../common/views/components/emoji-picker.vue').then(m => m.default)
},
props: {
x: {
type: Number,
required: true
},
y: {
type: Number,
required: true
}
},
mounted() {
this.$nextTick(() => {
const width = this.$el.offsetWidth;
const height = this.$el.offsetHeight;
let x = this.x;
let y = this.y;
if (x + width - window.pageXOffset > window.innerWidth) {
x = window.innerWidth - width + window.pageXOffset;
}
if (y + height - window.pageYOffset > window.innerHeight) {
y = window.innerHeight - height + window.pageYOffset;
}
this.$el.style.left = x + 'px';
this.$el.style.top = y + 'px';
Array.from(document.querySelectorAll('body *')).forEach(el => {
el.addEventListener('mousedown', this.onMousedown);
});
});
},
methods: {
onMousedown(e) {
e.preventDefault();
if (!contains(this.$el, e.target) && (this.$el != e.target)) this.close();
return false;
},
chosen(emoji) {
this.$emit('chosen', emoji);
this.close();
},
close() {
Array.from(document.querySelectorAll('body *')).forEach(el => {
el.removeEventListener('mousedown', this.onMousedown);
});
this.$emit('closed');
this.destroyDom();
}
}
});
</script>
<style lang="stylus" scoped>
.gcafiosrssbtbnbzqupfmglvzgiaipyv
position fixed
top 0
left 0
z-index 3000
box-shadow 0 2px 12px 0 rgba(0, 0, 0, 0.3)
</style>

View File

@@ -1,157 +0,0 @@
<template>
<button class="mk-follow-button"
:class="{ wait, active: u.isFollowing || u.hasPendingFollowRequestFromYou, big: size == 'big' }"
@click="onClick"
:disabled="wait"
>
<template v-if="!wait">
<template v-if="u.hasPendingFollowRequestFromYou && u.isLocked"><fa icon="hourglass-half"/><template v-if="size == 'big'"> {{ $t('request-pending') }}</template></template>
<template v-else-if="u.hasPendingFollowRequestFromYou && !u.isLocked"><fa icon="hourglass-start"/><template v-if="size == 'big'"> {{ $t('follow-processing') }}</template></template>
<template v-else-if="u.isFollowing"><fa icon="minus"/><template v-if="size == 'big'"> {{ $t('following') }}</template></template>
<template v-else-if="!u.isFollowing && u.isLocked"><fa icon="plus"/><template v-if="size == 'big'"> {{ $t('follow-request') }}</template></template>
<template v-else-if="!u.isFollowing && !u.isLocked"><fa icon="plus"/><template v-if="size == 'big'"> {{ $t('follow') }}</template></template>
</template>
<template v-else><fa icon="spinner .pulse" fixed-width/></template>
</button>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
export default Vue.extend({
i18n: i18n('desktop/views/components/follow-button.vue'),
props: {
user: {
type: Object,
required: true
},
size: {
type: String,
default: 'compact'
}
},
data() {
return {
u: this.user,
wait: false,
connection: null
};
},
mounted() {
this.connection = this.$root.stream.useSharedConnection('main');
this.connection.on('follow', this.onFollowChange);
this.connection.on('unfollow', this.onFollowChange);
},
beforeDestroy() {
this.connection.dispose();
},
methods: {
onFollowChange(user) {
if (user.id == this.u.id) {
this.u.isFollowing = user.isFollowing;
this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou;
this.$forceUpdate();
}
},
async onClick() {
this.wait = true;
try {
if (this.u.isFollowing) {
this.u = await this.$root.api('following/delete', {
userId: this.u.id
});
} else {
if (this.u.hasPendingFollowRequestFromYou) {
this.u = await this.$root.api('following/requests/cancel', {
userId: this.u.id
});
} else if (this.u.isLocked) {
this.u = await this.$root.api('following/create', {
userId: this.u.id
});
} else {
this.u = await this.$root.api('following/create', {
userId: this.user.id
});
}
}
} catch (e) {
console.error(e);
} finally {
this.wait = false;
}
}
}
});
</script>
<style lang="stylus" scoped>
.mk-follow-button
display block
cursor pointer
padding 0
margin 0
width 32px
height 32px
font-size 1em
outline none
border-radius 4px
*
pointer-events none
&:focus
&:after
content ""
pointer-events none
position absolute
top -5px
right -5px
bottom -5px
left -5px
border 2px solid var(--primaryAlpha03)
border-radius 8px
&:not(.active)
color var(--primary)
border solid 1px var(--primary)
&:hover
background var(--primaryAlpha03)
&:active
background var(--primaryAlpha05)
&.active
color var(--primaryForeground)
background var(--primary)
border solid 1px var(--primary)
&:not(:disabled)
font-weight bold
&:hover:not(:disabled)
background var(--primaryLighten5)
border-color var(--primaryLighten5)
&:active:not(:disabled)
background var(--primaryDarken5)
border-color var(--primaryDarken5)
&.wait
cursor wait !important
opacity 0.7
&.big
width 100%
height 38px
line-height 38px
</style>

View File

@@ -11,7 +11,7 @@
</div> </div>
</div> </div>
<p class="empty" v-if="!fetching && users.length == 0">{{ $t('empty') }}</p> <p class="empty" v-if="!fetching && users.length == 0">{{ $t('empty') }}</p>
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('fetching') }}<mk-ellipsis/></p> <p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('fetching') }}<mk-ellipsis/></p>
<a class="refresh" @click="refresh">{{ $t('refresh') }}</a> <a class="refresh" @click="refresh">{{ $t('refresh') }}</a>
<button class="close" @click="destroyDom()" :title="$t('title')"><fa icon="times"/></button> <button class="close" @click="destroyDom()" :title="$t('title')"><fa icon="times"/></button>
</div> </div>

View File

@@ -186,12 +186,9 @@ export default Vue.extend({
methods: { methods: {
hint() { hint() {
this.$dialog({ this.$root.alert({
title: this.$t('@.customization-tips.title'), title: this.$t('@.customization-tips.title'),
text: this.$t('@.customization-tips.paragraph'), text: this.$t('@.customization-tips.paragraph')
actions: [{
text: this.$t('@.customization-tips.gotit')
}]
}); });
}, },

View File

@@ -14,10 +14,8 @@ import mediaVideo from './media-video.vue';
import notifications from './notifications.vue'; import notifications from './notifications.vue';
import noteForm from './post-form.vue'; import noteForm from './post-form.vue';
import renoteForm from './renote-form.vue'; import renoteForm from './renote-form.vue';
import followButton from './follow-button.vue';
import notePreview from './note-preview.vue'; import notePreview from './note-preview.vue';
import noteDetail from './note-detail.vue'; import noteDetail from './note-detail.vue';
import settings from './settings.vue';
import calendar from './calendar.vue'; import calendar from './calendar.vue';
import activity from './activity.vue'; import activity from './activity.vue';
import friendsMaker from './friends-maker.vue'; import friendsMaker from './friends-maker.vue';
@@ -39,10 +37,8 @@ Vue.component('mk-media-video', mediaVideo);
Vue.component('mk-notifications', notifications); Vue.component('mk-notifications', notifications);
Vue.component('mk-post-form', noteForm); Vue.component('mk-post-form', noteForm);
Vue.component('mk-renote-form', renoteForm); Vue.component('mk-renote-form', renoteForm);
Vue.component('mk-follow-button', followButton);
Vue.component('mk-note-preview', notePreview); Vue.component('mk-note-preview', notePreview);
Vue.component('mk-note-detail', noteDetail); Vue.component('mk-note-detail', noteDetail);
Vue.component('mk-settings', settings);
Vue.component('mk-calendar', calendar); Vue.component('mk-calendar', calendar);
Vue.component('mk-activity', activity); Vue.component('mk-activity', activity);
Vue.component('mk-friends-maker', friendsMaker); Vue.component('mk-friends-maker', friendsMaker);

View File

@@ -8,7 +8,7 @@
:disabled="conversationFetching" :disabled="conversationFetching"
> >
<template v-if="!conversationFetching"><fa icon="ellipsis-v"/></template> <template v-if="!conversationFetching"><fa icon="ellipsis-v"/></template>
<template v-if="conversationFetching"><fa icon="spinner .pulse"/></template> <template v-if="conversationFetching"><fa icon="spinner" pulse/></template>
</button> </button>
<div class="conversation"> <div class="conversation">
<x-sub v-for="note in conversation" :key="note.id" :note="note"/> <x-sub v-for="note in conversation" :key="note.id" :note="note"/>
@@ -94,7 +94,7 @@ import MkRenoteFormWindow from './renote-form-window.vue';
import MkNoteMenu from '../../../common/views/components/note-menu.vue'; import MkNoteMenu from '../../../common/views/components/note-menu.vue';
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
import XSub from './note.sub.vue'; import XSub from './note.sub.vue';
import { sum } from '../../../../../prelude/array'; import { sum, unique } from '../../../../../prelude/array';
import noteSubscriber from '../../../common/scripts/note-subscriber'; import noteSubscriber from '../../../common/scripts/note-subscriber';
export default Vue.extend({ export default Vue.extend({
@@ -149,9 +149,9 @@ export default Vue.extend({
urls(): string[] { urls(): string[] {
if (this.p.text) { if (this.p.text) {
const ast = parse(this.p.text); const ast = parse(this.p.text);
return ast return unique(ast
.filter(t => (t.type == 'url' || t.type == 'link') && !t.silent) .filter(t => (t.type == 'url' || t.type == 'link') && !t.silent)
.map(t => t.url); .map(t => t.url));
} else { } else {
return null; return null;
} }

View File

@@ -2,7 +2,7 @@
<div <div
class="note" class="note"
:class="{ mini }" :class="{ mini }"
v-show="appearNote.deletedAt == null && !hideThisNote" v-show="(this.$store.state.settings.remainDeletedNote || appearNote.deletedAt == null) && !hideThisNote"
:tabindex="appearNote.deletedAt == null ? '-1' : null" :tabindex="appearNote.deletedAt == null ? '-1' : null"
v-hotkey="keymap" v-hotkey="keymap"
:title="title" :title="title"
@@ -20,12 +20,19 @@
<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link> <router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
<span>{{ this.$t('reposted-by').substr(this.$t('reposted-by').indexOf('}') + 1) }}</span> <span>{{ this.$t('reposted-by').substr(this.$t('reposted-by').indexOf('}') + 1) }}</span>
<mk-time :time="note.createdAt"/> <mk-time :time="note.createdAt"/>
<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="envelope"/>
<fa v-if="note.visibility == 'private'" icon="lock"/>
</span>
<span class="localOnly" v-if="note.localOnly == true"><fa icon="heart"/></span>
</div> </div>
<article> <article>
<mk-avatar class="avatar" :user="appearNote.user"/> <mk-avatar class="avatar" :user="appearNote.user"/>
<div class="main"> <div class="main">
<mk-note-header class="header" :note="appearNote" :mini="mini"/> <mk-note-header class="header" :note="appearNote" :mini="mini"/>
<div class="body"> <div class="body" v-if="appearNote.deletedAt == null">
<p v-if="appearNote.cw != null" class="cw"> <p v-if="appearNote.cw != null" class="cw">
<span class="text" v-if="appearNote.cw != ''">{{ appearNote.cw }}</span> <span class="text" v-if="appearNote.cw != ''">{{ appearNote.cw }}</span>
<mk-cw-button v-model="showContent"/> <mk-cw-button v-model="showContent"/>
@@ -46,7 +53,7 @@
<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"/>
</div> </div>
</div> </div>
<footer> <footer v-if="appearNote.deletedAt == null">
<span class="app" v-if="appearNote.app && mini && $store.state.settings.showVia">via <b>{{ appearNote.app.name }}</b></span> <span class="app" v-if="appearNote.app && mini && $store.state.settings.showVia">via <b>{{ appearNote.app.name }}</b></span>
<mk-reactions-viewer :note="appearNote" ref="reactionsViewer"/> <mk-reactions-viewer :note="appearNote" ref="reactionsViewer"/>
<button class="replyButton" @click="reply()" :title="$t('reply')"> <button class="replyButton" @click="reply()" :title="$t('reply')">
@@ -64,6 +71,7 @@
<fa icon="ellipsis-h"/> <fa icon="ellipsis-h"/>
</button> </button>
</footer> </footer>
<div class="deleted" v-if="appearNote.deletedAt != null">{{ $t('deleted') }}</div>
</div> </div>
</article> </article>
<div class="replies" v-if="detail && replies.length > 0"> <div class="replies" v-if="detail && replies.length > 0">
@@ -82,6 +90,7 @@ import noteSubscriber from '../../../common/scripts/note-subscriber';
export default Vue.extend({ export default Vue.extend({
i18n: i18n('desktop/views/components/note.vue'), i18n: i18n('desktop/views/components/note.vue'),
components: { components: {
XSub XSub
}, },
@@ -199,9 +208,6 @@ export default Vue.extend({
> span > span
flex-shrink 0 flex-shrink 0
&:last-of-type
margin-right 8px
.name .name
overflow hidden overflow hidden
flex-shrink 1 flex-shrink 1
@@ -215,6 +221,18 @@ export default Vue.extend({
flex-shrink 0 flex-shrink 0
font-size 0.9em font-size 0.9em
> .visibility
margin-left 8px
[data-icon]
margin-right 0
> .localOnly
margin-left 4px
[data-icon]
margin-right 0
& + article & + article
padding-top 8px padding-top 8px
@@ -327,6 +345,7 @@ export default Vue.extend({
margin-left 0.5em margin-left 0.5em
color var(--noteHeaderInfo) color var(--noteHeaderInfo)
font-size 0.8em font-size 0.8em
> button > button
margin 0 28px 0 0 margin 0 28px 0 0
padding 0 8px padding 0 8px
@@ -360,6 +379,10 @@ export default Vue.extend({
&.reacted, &.reacted:hover &.reacted, &.reacted:hover
color var(--noteActionsReactionHover) color var(--noteActionsReactionHover)
> .deleted
color var(--noteText)
opacity 0.7
</style> </style>
<style lang="stylus" module> <style lang="stylus" module>

View File

@@ -26,7 +26,7 @@
<footer v-if="more"> <footer v-if="more">
<button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }"> <button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
<template v-if="!moreFetching">{{ $t('@.load-more') }}</template> <template v-if="!moreFetching">{{ $t('@.load-more') }}</template>
<template v-if="moreFetching"><fa icon="spinner .pulse" fixed-width/></template> <template v-if="moreFetching"><fa icon="spinner" pulse fixed-width/></template>
</button> </button>
</footer> </footer>
</div> </div>

View File

@@ -105,7 +105,7 @@
</component> </component>
</div> </div>
<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications"> <button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
<template v-if="fetchingMoreNotifications"><fa icon="spinner .pulse" fixed-width/></template>{{ fetchingMoreNotifications ? $t('@.loading') : $t('@.load-more') }} <template v-if="fetchingMoreNotifications"><fa icon="spinner" pulse fixed-width/></template>{{ fetchingMoreNotifications ? $t('@.loading') : $t('@.load-more') }}
</button> </button>
<p class="empty" v-if="notifications.length == 0 && !fetching">{{ $t('empty') }}</p> <p class="empty" v-if="notifications.length == 0 && !fetching">{{ $t('empty') }}</p>
</div> </div>

View File

@@ -14,12 +14,17 @@
<b>{{ $t('recent-tags') }}:</b> <b>{{ $t('recent-tags') }}:</b>
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" :title="$t('click-to-tagging')">#{{ tag }}</a> <a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" :title="$t('click-to-tagging')">#{{ tag }}</a>
</div> </div>
<div class="local-only" v-if="this.localOnly == true">{{ $t('local-only-message') }}</div>
<input v-show="useCw" v-model="cw" :placeholder="$t('annotations')"> <input v-show="useCw" v-model="cw" :placeholder="$t('annotations')">
<div class="textarea">
<textarea :class="{ with: (files.length != 0 || poll) }" <textarea :class="{ with: (files.length != 0 || poll) }"
ref="text" v-model="text" :disabled="posting" ref="text" v-model="text" :disabled="posting"
@keydown="onKeydown" @paste="onPaste" :placeholder="placeholder" @keydown="onKeydown" @paste="onPaste" :placeholder="placeholder"
v-autocomplete="'text'" v-autocomplete="'text'"
></textarea> ></textarea>
<button class="emoji" @click="emoji" ref="emoji">
<fa :icon="['far', 'laugh']"/>
</button>
<div class="files" :class="{ with: poll }" v-show="files.length != 0"> <div class="files" :class="{ with: poll }" v-show="files.length != 0">
<x-draggable :list="files" :options="{ animation: 150 }"> <x-draggable :list="files" :options="{ animation: 150 }">
<div v-for="file in files" :key="file.id"> <div v-for="file in files" :key="file.id">
@@ -31,12 +36,13 @@
</div> </div>
<mk-poll-editor v-if="poll" ref="poll" @destroyed="poll = false" @updated="saveDraft()"/> <mk-poll-editor v-if="poll" ref="poll" @destroyed="poll = false" @updated="saveDraft()"/>
</div> </div>
</div>
<mk-uploader ref="uploader" @uploaded="attachMedia" @change="onChangeUploadings"/> <mk-uploader ref="uploader" @uploaded="attachMedia" @change="onChangeUploadings"/>
<button class="upload" :title="$t('attach-media-from-local')" @click="chooseFile"><fa icon="upload"/></button> <button class="upload" :title="$t('attach-media-from-local')" @click="chooseFile"><fa icon="upload"/></button>
<button class="drive" :title="$t('attach-media-from-drive')" @click="chooseFileFromDrive"><fa icon="cloud"/></button> <button class="drive" :title="$t('attach-media-from-drive')" @click="chooseFileFromDrive"><fa icon="cloud"/></button>
<button class="kao" :title="$t('insert-a-kao')" @click="kao"><fa :icon="['far', 'smile']"/></button> <button class="kao" :title="$t('insert-a-kao')" @click="kao"><fa :icon="['far', 'smile']"/></button>
<button class="poll" :title="$t('create-poll')" @click="poll = !poll"><fa icon="chart-pie"/></button> <button class="poll" :title="$t('create-poll')" @click="poll = !poll"><fa icon="chart-pie"/></button>
<button class="cw" :title="$t('hide-contents')" @click="useCw = !useCw"><fa icon="eye-slash"/></button> <button class="cw" :title="$t('hide-contents')" @click="useCw = !useCw"><fa :icon="['far', 'eye-slash']"/></button>
<button class="geo" :title="$t('attach-location-information')" @click="geo ? removeGeo() : setGeo()"><fa icon="map-marker-alt"/></button> <button class="geo" :title="$t('attach-location-information')" @click="geo ? removeGeo() : setGeo()"><fa icon="map-marker-alt"/></button>
<button class="visibility" :title="$t('visibility')" @click="setVisibility" ref="visibilityButton"> <button class="visibility" :title="$t('visibility')" @click="setVisibility" ref="visibilityButton">
<span v-if="visibility === 'public'"><fa icon="globe"/></span> <span v-if="visibility === 'public'"><fa icon="globe"/></span>
@@ -107,6 +113,7 @@ export default Vue.extend({
geo: null, geo: null,
visibility: this.$store.state.settings.rememberNoteVisibility ? (this.$store.state.device.visibility || this.$store.state.settings.defaultNoteVisibility) : this.$store.state.settings.defaultNoteVisibility, visibility: this.$store.state.settings.rememberNoteVisibility ? (this.$store.state.device.visibility || this.$store.state.settings.defaultNoteVisibility) : this.$store.state.settings.defaultNoteVisibility,
visibleUsers: [], visibleUsers: [],
localOnly: false,
autocomplete: null, autocomplete: null,
draghover: false, draghover: false,
recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]'), recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]'),
@@ -358,7 +365,14 @@ export default Vue.extend({
source: this.$refs.visibilityButton source: this.$refs.visibilityButton
}); });
w.$once('chosen', v => { w.$once('chosen', v => {
const m = v.match(/^local-(.+)/);
if (m) {
this.localOnly = true;
this.visibility = m[1];
} else {
this.localOnly = false;
this.visibility = v; this.visibility = v;
}
}); });
}, },
@@ -377,6 +391,19 @@ export default Vue.extend({
this.visibleUsers = erase(user, this.visibleUsers); this.visibleUsers = erase(user, this.visibleUsers);
}, },
async emoji() {
const Picker = await import('./emoji-picker-dialog.vue').then(m => m.default);
const button = this.$refs.emoji;
const rect = button.getBoundingClientRect();
const vm = this.$root.new(Picker, {
x: button.offsetWidth + rect.left + window.pageXOffset,
y: rect.top + window.pageYOffset
});
vm.$once('chosen', emoji => {
insertTextAtCursor(this.$refs.text, emoji);
});
},
post() { post() {
this.posting = true; this.posting = true;
@@ -389,6 +416,7 @@ export default Vue.extend({
cw: this.useCw ? this.cw || '' : undefined, cw: this.useCw ? this.cw || '' : undefined,
visibility: this.visibility, visibility: this.visibility,
visibleUserIds: this.visibility == 'specified' ? this.visibleUsers.map(u => u.id) : undefined, visibleUserIds: this.visibility == 'specified' ? this.visibleUsers.map(u => u.id) : undefined,
localOnly: this.localOnly,
geo: this.geo ? { geo: this.geo ? {
coordinates: [this.geo.longitude, this.geo.latitude], coordinates: [this.geo.longitude, this.geo.latitude],
altitude: this.geo.altitude, altitude: this.geo.altitude,
@@ -469,7 +497,7 @@ export default Vue.extend({
> .content > .content
> input > input
> textarea > .textarea > textarea
display block display block
width 100% width 100%
padding 12px padding 12px
@@ -480,6 +508,7 @@ export default Vue.extend({
border solid 1px var(--primaryAlpha01) border solid 1px var(--primaryAlpha01)
border-radius 4px border-radius 4px
transition border-color .2s ease transition border-color .2s ease
padding-right 30px
&:hover &:hover
border-color var(--primaryAlpha02) border-color var(--primaryAlpha02)
@@ -498,6 +527,24 @@ export default Vue.extend({
> input > input
margin-bottom 8px margin-bottom 8px
> .textarea
> .emoji
position absolute
top 0
right 0
padding 10px
font-size 18px
color var(--text)
opacity 0.5
&:hover
color var(--textHighlighted)
opacity 1
&:active
color var(--primary)
opacity 1
> textarea > textarea
margin 0 margin 0
max-width 100% max-width 100%
@@ -505,42 +552,24 @@ export default Vue.extend({
min-height 84px min-height 84px
&:hover &:hover
& + *
& + * + * & + * + *
& + * + * + *
border-color var(--primaryAlpha02) border-color var(--primaryAlpha02)
transition border-color .1s ease transition border-color .1s ease
&:focus &:focus
& + *
& + * + * & + * + *
& + * + * + *
border-color var(--primaryAlpha05) border-color var(--primaryAlpha05)
transition border-color 0s ease transition border-color 0s ease
& + .emoji
opacity 0.7
&.with &.with
border-bottom solid 1px var(--primaryAlpha01) !important border-bottom solid 1px var(--primaryAlpha01) !important
border-radius 4px 4px 0 0 border-radius 4px 4px 0 0
> .visibleUsers
margin-bottom 8px
font-size 14px
> span
margin-right 16px
color var(--primary)
> .hashtags
margin 0 0 8px 0
overflow hidden
white-space nowrap
font-size 14px
> b
color var(--primary)
> *
margin-right 8px
white-space nowrap
> .files > .files
margin 0 margin 0
padding 0 padding 0
@@ -601,6 +630,31 @@ export default Vue.extend({
border-radius 0 0 4px 4px border-radius 0 0 4px 4px
transition border-color .3s ease transition border-color .3s ease
> .visibleUsers
margin-bottom 8px
font-size 14px
> span
margin-right 16px
color var(--primary)
> .hashtags
margin 0 0 8px 0
overflow hidden
white-space nowrap
font-size 14px
> b
color var(--primary)
> *
margin-right 8px
white-space nowrap
> .local-only
margin 0 0 8px 0
color var(--primary)
> .mk-uploader > .mk-uploader
margin 8px 0 0 0 margin 8px 0 0 0
padding 8px padding 8px

View File

@@ -1,15 +1,21 @@
<template> <template>
<mk-window ref="window" is-modal width="700px" height="550px" @closed="destroyDom"> <mk-window ref="window" is-modal width="700px" height="550px" @closed="destroyDom">
<span slot="header" :class="$style.header"><fa icon="cog"/>{{ $t('settings') }}</span> <span slot="header" :class="$style.header"><fa icon="cog"/>{{ $t('settings') }}</span>
<mk-settings :initial-page="initialPage" @done="close"/> <x-settings :initial-page="initialPage" @done="close"/>
</mk-window> </mk-window>
</template> </template>
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import i18n from '../../../i18n'; import i18n from '../../../i18n';
export default Vue.extend({ export default Vue.extend({
i18n: i18n('desktop/views/components/settings-window.vue'), i18n: i18n('desktop/views/components/settings-window.vue'),
components: {
XSettings: () => import('./settings.vue').then(m => m.default)
},
props: { props: {
initialPage: { initialPage: {
type: String, type: String,

View File

@@ -15,19 +15,26 @@
</div> </div>
<div class="pages"> <div class="pages">
<div class="profile" v-show="page == 'profile'"> <div class="profile" v-show="page == 'profile'">
<mk-profile-editor/> <x-profile-editor/>
<ui-card> <ui-card>
<div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter') }}</div> <div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter') }}</div>
<section> <section>
<mk-twitter-setting/> <x-twitter-setting/>
</section> </section>
</ui-card> </ui-card>
<ui-card> <ui-card>
<div slot="title"><fa :icon="['fab', 'github']"/> {{ $t('github') }}</div> <div slot="title"><fa :icon="['fab', 'github']"/> {{ $t('github') }}</div>
<section> <section>
<mk-github-setting/> <x-github-setting/>
</section>
</ui-card>
<ui-card>
<div slot="title"><fa :icon="['fab', 'discord']"/> {{ $t('discord') }}</div>
<section>
<x-discord-setting/>
</section> </section>
</ui-card> </ui-card>
</div> </div>
@@ -36,7 +43,7 @@
<div slot="title"><fa icon="palette"/> {{ $t('theme') }}</div> <div slot="title"><fa icon="palette"/> {{ $t('theme') }}</div>
<section> <section>
<mk-theme/> <x-theme/>
</section> </section>
</ui-card> </ui-card>
@@ -123,6 +130,7 @@
<ui-switch v-model="showReplyTarget">{{ $t('show-reply-target') }}</ui-switch> <ui-switch v-model="showReplyTarget">{{ $t('show-reply-target') }}</ui-switch>
<ui-switch v-model="showMaps">{{ $t('show-maps') }}</ui-switch> <ui-switch v-model="showMaps">{{ $t('show-maps') }}</ui-switch>
<ui-switch v-model="disableAnimatedMfm">{{ $t('@.disable-animated-mfm') }}</ui-switch> <ui-switch v-model="disableAnimatedMfm">{{ $t('@.disable-animated-mfm') }}</ui-switch>
<ui-switch v-model="remainDeletedNote">{{ $t('remain-deleted-note') }}</ui-switch>
</section> </section>
<section> <section>
<header>{{ $t('deck-column-align') }}</header> <header>{{ $t('deck-column-align') }}</header>
@@ -194,7 +202,7 @@
</ui-card> </ui-card>
<div class="drive" v-if="page == 'drive'"> <div class="drive" v-if="page == 'drive'">
<mk-drive-settings/> <x-drive-settings/>
</div> </div>
<ui-card class="hashtags" v-show="page == 'hashtags'"> <ui-card class="hashtags" v-show="page == 'hashtags'">
@@ -205,7 +213,7 @@
</ui-card> </ui-card>
<div class="muteAndBlock" v-show="page == 'muteAndBlock'"> <div class="muteAndBlock" v-show="page == 'muteAndBlock'">
<mk-mute-and-block/> <x-mute-and-block/>
</div> </div>
<ui-card class="apps" v-show="page == 'apps'"> <ui-card class="apps" v-show="page == 'apps'">
@@ -218,7 +226,7 @@
<ui-card class="password" v-show="page == 'security'"> <ui-card class="password" v-show="page == 'security'">
<div slot="title"><fa icon="unlock-alt"/> {{ $t('password') }}</div> <div slot="title"><fa icon="unlock-alt"/> {{ $t('password') }}</div>
<section> <section>
<mk-password-settings/> <x-password-settings/>
</section> </section>
</ui-card> </ui-card>
@@ -237,7 +245,7 @@
</ui-card> </ui-card>
<div class="api" v-show="page == 'api'"> <div class="api" v-show="page == 'api'">
<mk-api-settings/> <x-api-settings/>
</div> </div>
<ui-card class="other" v-show="page == 'other'"> <ui-card class="other" v-show="page == 'other'">
@@ -292,6 +300,16 @@ import X2fa from './settings.2fa.vue';
import XApps from './settings.apps.vue'; import XApps from './settings.apps.vue';
import XSignins from './settings.signins.vue'; import XSignins from './settings.signins.vue';
import XTags from './settings.tags.vue'; import XTags from './settings.tags.vue';
import XTwitterSetting from '../../../common/views/components/twitter-setting.vue';
import XGithubSetting from '../../../common/views/components/github-setting.vue';
import XDiscordSetting from '../../../common/views/components/discord-setting.vue';
import XTheme from '../../../common/views/components/theme.vue';
import XDriveSettings from '../../../common/views/components/drive-settings.vue';
import XMuteAndBlock from '../../../common/views/components/mute-and-block.vue';
import XPasswordSettings from '../../../common/views/components/password-settings.vue';
import XProfileEditor from '../../../common/views/components/profile-editor.vue';
import XApiSettings from '../../../common/views/components/api-settings.vue';
import { url, langs, clientVersion as version } from '../../../config'; import { url, langs, clientVersion as version } from '../../../config';
import checkForUpdate from '../../../common/scripts/check-for-update'; import checkForUpdate from '../../../common/scripts/check-for-update';
@@ -301,7 +319,16 @@ export default Vue.extend({
X2fa, X2fa,
XApps, XApps,
XSignins, XSignins,
XTags XTags,
XTwitterSetting,
XGithubSetting,
XDiscordSetting,
XTheme,
XDriveSettings,
XMuteAndBlock,
XPasswordSettings,
XProfileEditor,
XApiSettings,
}, },
props: { props: {
initialPage: { initialPage: {
@@ -503,6 +530,11 @@ export default Vue.extend({
disableAnimatedMfm: { disableAnimatedMfm: {
get() { return this.$store.state.settings.disableAnimatedMfm; }, get() { return this.$store.state.settings.disableAnimatedMfm; },
set(value) { this.$store.dispatch('settings/set', { key: 'disableAnimatedMfm', value }); } set(value) { this.$store.dispatch('settings/set', { key: 'disableAnimatedMfm', value }); }
},
remainDeletedNote: {
get() { return this.$store.state.settings.remainDeletedNote; },
set(value) { this.$store.dispatch('settings/set', { key: 'remainDeletedNote', value }); }
} }
}, },
created() { created() {
@@ -543,12 +575,12 @@ export default Vue.extend({
this.checkingForUpdate = false; this.checkingForUpdate = false;
this.latestVersion = newer; this.latestVersion = newer;
if (newer == null) { if (newer == null) {
this.$dialog({ this.$root.alert({
title: this.$t('no-updates'), title: this.$t('no-updates'),
text: this.$t('no-updates-desc') text: this.$t('no-updates-desc')
}); });
} else { } else {
this.$dialog({ this.$root.alert({
title: this.$t('update-available'), title: this.$t('update-available'),
text: this.$t('update-available-desc') text: this.$t('update-available-desc')
}); });
@@ -557,7 +589,7 @@ export default Vue.extend({
}, },
clean() { clean() {
localStorage.clear(); localStorage.clear();
this.$dialog({ this.$root.alert({
title: this.$t('cache-cleared'), title: this.$t('cache-cleared'),
text: this.$t('cache-cleared-desc') text: this.$t('cache-cleared-desc')
}); });

View File

@@ -58,7 +58,7 @@
<i><fa icon="angle-right"/></i> <i><fa icon="angle-right"/></i>
</p> </p>
</li> </li>
<li v-if="$store.state.i.isAdmin"> <li v-if="$store.state.i.isAdmin || $store.state.i.isModerator">
<a href="/admin"> <a href="/admin">
<i><fa icon="terminal"/></i> <i><fa icon="terminal"/></i>
<span>{{ $t('admin') }}</span> <span>{{ $t('admin') }}</span>

View File

@@ -2,7 +2,7 @@
<div class="zvdbznxvfixtmujpsigoccczftvpiwqh"> <div class="zvdbznxvfixtmujpsigoccczftvpiwqh">
<div class="banner" :style="bannerStyle"></div> <div class="banner" :style="bannerStyle"></div>
<mk-avatar class="avatar" :user="user" :disable-preview="true"/> <mk-avatar class="avatar" :user="user" :disable-preview="true"/>
<mk-follow-button :user="user" class="follow"/> <mk-follow-button :user="user" class="follow" mini/>
<div class="body"> <div class="body">
<router-link :to="user | userPage" class="name">{{ user | userName }}</router-link> <router-link :to="user | userPage" class="name">{{ user | userName }}</router-link>
<span class="username">@{{ user | acct }}</span> <span class="username">@{{ user | acct }}</span>

View File

@@ -19,7 +19,7 @@
<p>{{ $t('followers') }}</p><span>{{ u.followersCount }}</span> <p>{{ $t('followers') }}</p><span>{{ u.followersCount }}</span>
</div> </div>
</div> </div>
<mk-follow-button v-if="$store.getters.isSignedIn && u.id != $store.state.i.id" :user="u"/> <mk-follow-button class="follow-button" v-if="$store.getters.isSignedIn && u.id != $store.state.i.id" :user="u" mini/>
</template> </template>
</div> </div>
</template> </template>
@@ -154,7 +154,7 @@ export default Vue.extend({
font-size 1em font-size 1em
color var(--primary) color var(--primary)
> .mk-follow-button > .follow-button
position absolute position absolute
top 92px top 92px
right 8px right 8px

View File

@@ -31,7 +31,7 @@
<footer v-if="more"> <footer v-if="more">
<button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }"> <button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
<template v-if="!moreFetching">{{ $t('@.load-more') }}</template> <template v-if="!moreFetching">{{ $t('@.load-more') }}</template>
<template v-if="moreFetching"><fa icon="spinner .pulse" fixed-width/></template> <template v-if="moreFetching"><fa icon="spinner" pulse fixed-width/></template>
</button> </button>
</footer> </footer>
</div> </div>

View File

@@ -17,7 +17,7 @@
</template> </template>
</component> </component>
<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications"> <button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
<template v-if="fetchingMoreNotifications"><fa icon="spinner .pulse" fixed-width/></template>{{ fetchingMoreNotifications ? this.$t('@.loading') : this.$t('@.load-more') }} <template v-if="fetchingMoreNotifications"><fa icon="spinner" pulse fixed-width/></template>{{ fetchingMoreNotifications ? this.$t('@.loading') : this.$t('@.load-more') }}
</button> </button>
<p class="empty" v-if="notifications.length == 0 && !fetching">{{ $t('empty') }}</p> <p class="empty" v-if="notifications.length == 0 && !fetching">{{ $t('empty') }}</p>
</div> </div>

View File

@@ -1,12 +1,12 @@
<template> <template>
<x-column :menu="menu" :name="name" :column="column" :is-stacked="isStacked"> <x-column :menu="menu" :name="name" :column="column" :is-stacked="isStacked">
<span slot="header"> <span slot="header">
<template v-if="column.type == 'home'"><fa icon="home"/></template> <fa v-if="column.type == 'home'" icon="home"/>
<template v-if="column.type == 'local'"><fa :icon="['far', 'comments']"/></template> <fa v-if="column.type == 'local'" :icon="['far', 'comments']"/>
<template v-if="column.type == 'hybrid'"><fa icon="share-alt"/></template> <fa v-if="column.type == 'hybrid'" icon="share-alt"/>
<template v-if="column.type == 'global'"><fa icon="globe"/></template> <fa v-if="column.type == 'global'" icon="globe"/>
<template v-if="column.type == 'list'"><fa icon="list"/></template> <fa v-if="column.type == 'list'" icon="list"/>
<template v-if="column.type == 'hashtag'"><fa icon="hashtag"/></template> <fa v-if="column.type == 'hashtag'" icon="hashtag"/>
<span>{{ name }}</span> <span>{{ name }}</span>
</span> </span>

View File

@@ -14,7 +14,7 @@
<header :style="bannerStyle"> <header :style="bannerStyle">
<div> <div>
<button class="menu" @click="menu" ref="menu"><fa icon="ellipsis-h"/></button> <button class="menu" @click="menu" ref="menu"><fa icon="ellipsis-h"/></button>
<mk-follow-button v-if="$store.getters.isSignedIn && user.id != $store.state.i.id" :user="user" class="follow"/> <mk-follow-button v-if="$store.getters.isSignedIn && user.id != $store.state.i.id" :user="user" class="follow" mini/>
<mk-avatar class="avatar" :user="user" :disable-preview="true"/> <mk-avatar class="avatar" :user="user" :disable-preview="true"/>
<span class="name">{{ user | userName }}</span> <span class="name">{{ user | userName }}</span>
<span class="acct">@{{ user | acct }}</span> <span class="acct">@{{ user | acct }}</span>
@@ -87,7 +87,6 @@ import XNotes from './deck.notes.vue';
import XNote from '../../components/note.vue'; import XNote from '../../components/note.vue';
import Menu from '../../../../common/views/components/menu.vue'; import Menu from '../../../../common/views/components/menu.vue';
import MkUserListsWindow from '../../components/user-lists-window.vue'; import MkUserListsWindow from '../../components/user-lists-window.vue';
import Ok from '../../../../common/views/components/ok.vue';
import { concat } from '../../../../../../prelude/array'; import { concat } from '../../../../../../prelude/array';
import * as ApexCharts from 'apexcharts'; import * as ApexCharts from 'apexcharts';
@@ -155,7 +154,8 @@ export default Vue.extend({
this.$root.api('users/notes', { this.$root.api('users/notes', {
userId: this.user.id, userId: this.user.id,
fileType: image, fileType: image,
limit: 9 limit: 9,
untilDate: new Date().getTime() + 1000 * 86400 * 365
}).then(notes => { }).then(notes => {
notes.forEach(note => { notes.forEach(note => {
note.files.forEach(file => { note.files.forEach(file => {
@@ -254,6 +254,7 @@ export default Vue.extend({
this.$root.api('users/notes', { this.$root.api('users/notes', {
userId: this.user.id, userId: this.user.id,
limit: fetchLimit + 1, limit: fetchLimit + 1,
untilDate: new Date().getTime() + 1000 * 86400 * 365,
withFiles: this.withFiles, withFiles: this.withFiles,
includeMyRenotes: this.$store.state.settings.showMyRenotes, includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
@@ -274,7 +275,7 @@ export default Vue.extend({
const promise = this.$root.api('users/notes', { const promise = this.$root.api('users/notes', {
userId: this.user.id, userId: this.user.id,
limit: fetchLimit + 1, limit: fetchLimit + 1,
untilId: (this.$refs.timeline as any).tail().id, untilDate: new Date((this.$refs.timeline as any).tail().createdAt).getTime(),
withFiles: this.withFiles, withFiles: this.withFiles,
includeMyRenotes: this.$store.state.settings.showMyRenotes, includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
@@ -306,7 +307,10 @@ export default Vue.extend({
listId: list.id, listId: list.id,
userId: this.user.id userId: this.user.id
}); });
this.$root.new(Ok); this.$root.alert({
type: 'success',
splash: true
});
}); });
} }
}]; }];

View File

@@ -0,0 +1,26 @@
<template>
<div class="lkafjvabenanajk17kwqpsatoushincb">
<span><fa :icon="['fab', 'discord']"/><a :href="`https://discordapp.com/users/${user.discord.id}`" target="_blank">@{{ user.discord.username }}#{{ user.discord.discriminator }}</a></span>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: ['user']
});
</script>
<style lang="stylus" scoped>
.lkafjvabenanajk17kwqpsatoushincb
padding 32px
background #7289da
border-radius 6px
color #fff
a
margin-left 8px
color #fff
</style>

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