Compare commits

...

469 Commits

Author SHA1 Message Date
d779e18546 10.45.0 2018-11-08 02:10:36 +09:00
3261d54cd3 Resolve #2320 2018-11-08 02:09:15 +09:00
e0ec56abb5 Fix bug 2018-11-08 01:42:02 +09:00
1056a7167d [Client] Improve usabiliy 2018-11-07 23:04:59 +09:00
b8e1162e2d Fix test 2018-11-07 21:30:28 +09:00
4c81e400c4 [MFM] Fix title parsing 2018-11-07 21:17:27 +09:00
a29d7a0475 10.44.2 2018-11-07 21:14:16 +09:00
d5408c429b Fix bug 2018-11-07 20:59:40 +09:00
501b07c383 [Test] Add MFM test 2018-11-07 19:58:05 +09:00
9dd21a19ff 10.44.1 2018-11-07 19:49:46 +09:00
a8d05cba5a Fix #3149 2018-11-07 19:43:21 +09:00
f5ddfb29f2 10.44.0 2018-11-07 13:16:29 +09:00
ba228a6b10 Clean up 2018-11-07 13:15:09 +09:00
cb6f390fb6 GitHub / Twitter連携の設定をDBに保存するように 2018-11-07 13:14:52 +09:00
5675ecead9 Fix 2018-11-07 12:30:56 +09:00
001bb7bbcd インスタンスの対象言語の設定を実装 2018-11-07 12:28:53 +09:00
1585bb12cf 🎨 2018-11-07 12:17:57 +09:00
26b47c18fd [Client] Fix #2737 2018-11-07 12:15:28 +09:00
665fa7f2aa [API] Improve drive/files/upload_from_url 2018-11-07 12:12:43 +09:00
0068dc30d3 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-11-07 12:09:33 +09:00
8f39655fef Fix bug 2018-11-07 12:09:24 +09:00
b1a4fc03bc Update @types/koa-router requirement from 7.0.32 to 7.0.33 (#3147)
Updates the requirements on [@types/koa-router](https://github.com/DefinitelyTyped/DefinitelyTyped) to permit the latest version.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-07 09:24:13 +09:00
05d20f1044 Update @types/request requirement from 2.48.0 to 2.48.1 (#3146)
Updates the requirements on [@types/request](https://github.com/DefinitelyTyped/DefinitelyTyped) to permit the latest version.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-07 09:24:04 +09:00
66a90b3fb1 Update qrcode requirement from 1.3.0 to 1.3.2 (#3145)
Updates the requirements on [qrcode](https://github.com/soldair/node-qrcode) to permit the latest version.
- [Release notes](https://github.com/soldair/node-qrcode/releases)
- [Commits](https://github.com/soldair/node-qrcode/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-07 09:23:47 +09:00
826d9d9fdf Update typescript requirement from 3.1.5 to 3.1.6 (#3144)
Updates the requirements on [typescript](https://github.com/Microsoft/TypeScript) to permit the latest version.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/commits/v3.1.6)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-07 09:23:38 +09:00
4a9a61f108 10.43.1 2018-11-07 03:57:08 +09:00
b72d15b56c [Client] Improve usability 2018-11-07 03:48:58 +09:00
8c68992594 Fix deploy fails on CircleCI 2018-11-07 02:06:32 +09:00
c052028fc3 10.43.0 2018-11-07 01:19:03 +09:00
c46fbcf345 Clean up 2018-11-07 01:18:21 +09:00
06b66f0209 メンテナ情報をDBに保存するように 2018-11-07 01:12:26 +09:00
2de48110bb ghostの設定をDBに保存するように 2018-11-07 00:44:56 +09:00
87d4452d19 Clean up 2018-11-07 00:16:32 +09:00
328fc64ca9 🎨 2018-11-07 00:16:08 +09:00
a6f8327aa2 reCAPTCHAの設定をDBに保存するように 2018-11-07 00:08:21 +09:00
d5ab6b41c9 10.42.2 2018-11-06 20:54:15 +09:00
ffdd0b7de7 [API] 文字列での真理値表現に対応
multipart/formdata では文字列しか送れないっぽい?
2018-11-06 20:53:50 +09:00
1808eb6eee 10.42.1 2018-11-06 20:49:03 +09:00
438563b505 [API] Fix bug 2018-11-06 20:47:56 +09:00
92dfcdad57 Fix #3141 2018-11-06 20:47:07 +09:00
c178cfabfa 10.42.0 2018-11-06 15:52:28 +09:00
260e4c955d 🎨 2018-11-06 15:51:18 +09:00
0c46f5ce70 Clean up 2018-11-06 15:51:05 +09:00
6d67cd07a0 [Client] Use dynamic import to reduce bundle size 2018-11-06 15:37:41 +09:00
fb8af53751 [Client] Improve usability & Refactoring 2018-11-06 15:08:22 +09:00
37999f4af7 [API] Implement notes/watching/ 2018-11-06 14:58:20 +09:00
3b6ab327c1 Twemojiで合字に対応 (#3140)
* Twemojiで合字に対応

* split emoji regex
2018-11-06 14:09:40 +09:00
d3ff3a7d54 10.41.0 2018-11-06 08:06:08 +09:00
cf36106520 🎨 2018-11-06 08:04:34 +09:00
1642fbec31 [Client] カスタム絵文字サジェストの結果をアルファベット順にソートするように 2018-11-06 08:02:19 +09:00
b195fd8145 🎨 2018-11-06 07:57:16 +09:00
5f59b980a7 Fix: download file (#3138)
* Fix: url download

* not explicitly close on end

* resolve on stream finish

* remove unnecessary code

* reject on file error
2018-11-06 07:53:03 +09:00
2a5c19cd01 リモートのファイルをキャッシュするかどうかの設定をDBに保存するように 2018-11-06 07:52:13 +09:00
42e007ddb7 🎨 2018-11-06 07:28:49 +09:00
756dc397d9 🎨 2018-11-06 07:22:39 +09:00
8f714b5b12 ドライブ容量の設定をDBに保存するようにしたりリファクタリングしたり 2018-11-06 07:14:43 +09:00
06bb2a1c7c Clean up 2018-11-06 06:25:35 +09:00
ac50bb9225 Resolve #3137 2018-11-06 06:24:31 +09:00
8fd95de25b 整理 2018-11-06 06:12:51 +09:00
0e14b2eba4 Update file-type requirement from 10.3.0 to 10.4.0 (#3135)
Updates the requirements on [file-type](https://github.com/sindresorhus/file-type) to permit the latest version.
- [Release notes](https://github.com/sindresorhus/file-type/releases)
- [Commits](https://github.com/sindresorhus/file-type/commits/v10.4.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-06 06:08:41 +09:00
08413a7550 Update webpack requirement from 4.23.1 to 4.25.1 (#3136)
Updates the requirements on [webpack](https://github.com/webpack/webpack) to permit the latest version.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/commits/v4.25.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-06 05:35:53 +09:00
5e0f2a5b06 [Client] Fix bug 2018-11-06 04:10:30 +09:00
3b505709c6 10.40.1 2018-11-06 04:02:04 +09:00
af32d1f81e [Client] Fix bug 2018-11-06 04:01:22 +09:00
67d8773e38 [Client] Fix bug 2018-11-06 03:59:58 +09:00
e445d39c2f [Client] Use v-if instaed of v-show 2018-11-06 03:59:02 +09:00
961ed969db メッセージでのカスタム絵文字対応 2018-11-06 03:57:02 +09:00
e9a3495225 Resolve #3132 2018-11-06 03:48:23 +09:00
6c5a78aeb2 Fix #3133 (#3134) 2018-11-06 03:31:16 +09:00
34e249317a 10.40.0 2018-11-06 02:06:15 +09:00
6d8ea89f09 Resolve #3126 2018-11-06 02:05:16 +09:00
64f89ba13e Better error code 2018-11-06 01:57:31 +09:00
f6b2f76bbf 10.39.1 2018-11-06 01:52:39 +09:00
1235bef038 [API] Fix bug 2018-11-06 01:51:42 +09:00
2e11f3a843 Clean up 2018-11-06 01:49:35 +09:00
84b7e0bb7d 🎨 2018-11-06 01:48:33 +09:00
9f5dc2c0df [WIP] Use FontAwesome Component for Vue (#3127)
* wip

* Rename

* Clean up

* Clean up

* wip

* wip

* Enable tree shaking

* ✌️

* ✌️

* wip

* wip

* Clean up
2018-11-06 01:40:11 +09:00
e640dbc501 🎨 2018-11-05 22:45:45 +09:00
85db090d9f 🎨 2018-11-05 22:42:08 +09:00
9f2d8e1d51 10.39.0 2018-11-05 21:07:24 +09:00
0c98a90b75 [Client] カスタム絵文字にホバーしたときに拡大するエフェクトを追加 2018-11-05 21:04:19 +09:00
0047920c1a Merge pull request #3117 from syuilo/twemoji
Use Twemoji
2018-11-05 20:52:55 +09:00
e4bb534f20 Better emoji regexp 2018-11-05 20:49:17 +09:00
3fc04fcdc5 Improve readdability 2018-11-05 20:49:02 +09:00
e542dcac30 Fix test 2018-11-05 20:40:39 +09:00
a0b13505a0 Insert missing spaces 2018-11-05 20:15:09 +09:00
389f9bfea2 Add test 2018-11-05 20:14:49 +09:00
630a534cee Fix test 2018-11-05 20:10:28 +09:00
5744c391e6 Revert "Fix test fails"
This reverts commit b9b05a7401.
2018-11-05 20:10:00 +09:00
b9b05a7401 Fix test fails 2018-11-05 19:50:38 +09:00
359470a263 Fix bug 2018-11-05 19:40:09 +09:00
3fe934ee62 Better alt value 2018-11-05 19:33:28 +09:00
3abe632f06 Clean up 2018-11-05 19:29:50 +09:00
65961bc15b Refactoring & 設定でTwemojiを使うかどうか切り替えられるように 2018-11-05 19:20:35 +09:00
12f932d48a Update CI configuration (#3120)
* Update config.yml

* Add `npm prune` command

refs: https://misskey.xyz/notes/5bd9b87168b2a30045edb3aa

* Ensure package-lock.json exists
2018-11-05 17:38:57 +09:00
54e9147782 Refactoring codes
refs: https://github.com/syuilo/misskey/pull/3117#pullrequestreview-171437187
2018-11-05 17:04:17 +09:00
31b7626d01 Make code better
refs: https://github.com/syuilo/misskey/pull/3117#pullrequestreview-171423739
refs: https://github.com/syuilo/misskey/pull/3117#pullrequestreview-171424596
refs: https://github.com/syuilo/misskey/pull/3117#pullrequestreview-171425303
2018-11-05 16:19:14 +09:00
200ebefe92 Add support for unicode emojis
refs: https://github.com/syuilo/misskey/pull/3117#issuecomment-435745613
2018-11-05 15:15:37 +09:00
9d29a2e85a 10.38.8 2018-11-05 13:47:57 +09:00
c62a225542 oops 2018-11-05 13:46:46 +09:00
d5d995a3e6 Refactor 2018-11-05 13:38:50 +09:00
b7f10fdc10 Fix bug
refs: https://github.com/syuilo/misskey/pull/3117#discussion_r230624389
2018-11-05 13:24:54 +09:00
cbba03b376 [Client] Fix bug 2018-11-05 13:23:30 +09:00
f84e9c7dc8 絵文字サジェストでスペースを挿入しないように 2018-11-05 12:35:50 +09:00
a22ddb1fb9 ✌️ 2018-11-05 11:58:41 +09:00
0d23ce3d45 Make /api/v1/instance and /api/v1/custom_emojis better (#3118)
* Separate commits

From commit dca110ebaa.

* Re-separate commits

From commit 9719387bee.
2018-11-05 11:57:17 +09:00
9719387bee Re-separate commits 2018-11-05 11:51:14 +09:00
dca110ebaa Separate commits
Flash Back 90's
2018-11-05 11:39:13 +09:00
136f23c7ad Merge branch 'develop' into twemoji 2018-11-05 11:21:34 +09:00
0963e6d6e1 Use Twemoji 2018-11-05 11:19:40 +09:00
712802e682 10.38.7 2018-11-05 11:11:23 +09:00
abe99c3c73 Update locales/ja-JP.yml 2018-11-05 11:10:02 +09:00
d7a3b71028 投稿の最大文字数情報を設定ファイルではなくDBに保存するように 2018-11-05 11:09:05 +09:00
10c434f24a Remove Travis
Closes #3109
2018-11-05 10:52:07 +09:00
fe46c53ea6 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-11-05 10:48:51 +09:00
cdd123dfd3 [doc] specify node version 2018-11-05 10:48:40 +09:00
a1a3ee44b5 Implement /api/v1/custom_emojis (#3116) 2018-11-05 10:45:57 +09:00
4e7fbd8967 Implement /api/v1/custom_emojis 2018-11-05 10:42:46 +09:00
a86c419f95 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-11-05 10:40:15 +09:00
e3ec0ad97e [Client] Improve admin panel usability 2018-11-05 10:40:01 +09:00
75791981ce Fix #3115 2018-11-05 10:34:53 +09:00
e813fe16b9 [API] Better validation of admin/emoji/add 2018-11-05 10:33:49 +09:00
42ac7b954d Improve admin panel usability 2018-11-05 10:32:45 +09:00
c1bbf5dab6 [Client] Fix error 2018-11-05 10:29:57 +09:00
e16dc2a910 Update README.md (#3112) 2018-11-05 01:57:08 +09:00
e236c05d79 10.38.6 2018-11-05 01:43:31 +09:00
454c1e3faf [API] Fix bug 2018-11-05 01:42:41 +09:00
43daf814df [Client] 絵文字登録フォームに便利情報を表示 2018-11-05 01:33:06 +09:00
c40b630530 10.38.5 2018-11-04 23:20:06 +09:00
7fc0698ecf 🎨 2018-11-04 23:15:46 +09:00
4f3c8b940e [API] Fix #3099 2018-11-04 23:13:35 +09:00
1855ab60f1 Resolve #3098 2018-11-04 23:00:43 +09:00
af4f1a7bd6 Clean up 2018-11-04 22:05:42 +09:00
8646a9c49c Add GitHub auth (#3095) 2018-11-04 22:03:55 +09:00
8d7c033cf5 Clean up 2018-11-04 21:21:34 +09:00
b8900e32de 🎨 2018-11-04 21:14:17 +09:00
d48c25d2c9 [API] Fix #3097 2018-11-04 21:11:54 +09:00
a87c5899c5 Fix typo 2018-11-04 20:08:31 +09:00
147ad69864 Revert "Add GitHub auth"
This reverts commit c146006476.
2018-11-04 19:22:04 +09:00
c146006476 Add GitHub auth 2018-11-04 19:17:30 +09:00
a0f10d7ca1 10.38.4 2018-11-04 18:38:04 +09:00
299b91edc4 [API] Improve admin/emoji/add 2018-11-04 18:37:12 +09:00
95c89ca6db RE: [Client] Fix bug 2018-11-04 18:36:19 +09:00
7fe0d71e7f [Client] Fix bug 2018-11-04 18:35:55 +09:00
fbbb506e86 🎨 2018-11-04 18:31:27 +09:00
ec80b06a45 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-11-04 18:24:20 +09:00
41e1619f1f [Client] Fix bug 2018-11-04 18:24:08 +09:00
ba6a9c6a93 Merge pull request #3092 from syuilo/l10n_develop
New Crowdin translations
2018-11-04 18:22:19 +09:00
18571c52fb Fix: emoji regex (#3093) 2018-11-04 17:36:37 +09:00
5d5dfeaa83 New translations ja-JP.yml (Japanese, Kansai) 2018-11-04 17:11:19 +09:00
3669d8c0f3 New translations ja-JP.yml (Japanese, Kansai) 2018-11-04 17:01:11 +09:00
69d72819c6 10.38.3 2018-11-04 15:18:37 +09:00
54dcc10250 Fix bug for Mastodon(?) 2018-11-04 15:17:52 +09:00
1edfce8f73 [Client] スマホ/タブレットからでも管理者ページを使えるように 2018-11-04 15:16:05 +09:00
675e573a8c 🎨 2018-11-04 14:23:28 +09:00
1080fa63a9 10.38.2 2018-11-04 11:09:31 +09:00
8047086988 Good bye package-lock 2018-11-04 11:08:46 +09:00
449b9f7fa0 [Client] Improve admin panel 2018-11-04 11:08:03 +09:00
b7a15bf6ca 絵文字を作成した/更新した時にupdateAtを更新するように 2018-11-04 10:42:16 +09:00
7c3873887d 10.38.1 2018-11-04 03:45:05 +09:00
247ea4cf12 Merge pull request #3083 from syuilo/l10n_develop
New Crowdin translations
2018-11-04 03:44:30 +09:00
0b7af5c669 [Client] Fix bug 2018-11-04 03:44:06 +09:00
2b62a4e2e5 New translations ja-JP.yml (English) 2018-11-04 03:42:45 +09:00
65bfa3c0d6 Fix: update_client_setting (#3086) 2018-11-04 03:33:37 +09:00
84db15694d Do not send needless emojis in note
投稿作成時に含まれている絵文字を保存しておくように

SEE: https://github.com/syuilo/misskey/pull/3085#issuecomment-435608434
2018-11-04 03:32:20 +09:00
746189ba37 New translations ja-JP.yml (Norwegian) 2018-11-04 03:23:44 +09:00
74e845b3ac New translations ja-JP.yml (Dutch) 2018-11-04 03:23:39 +09:00
90fe70540e New translations ja-JP.yml (Japanese, Kansai) 2018-11-04 03:23:36 +09:00
f28af75191 New translations ja-JP.yml (Spanish) 2018-11-04 03:23:31 +09:00
924bb2bc70 New translations ja-JP.yml (Russian) 2018-11-04 03:23:26 +09:00
19d60f3d51 New translations ja-JP.yml (Portuguese) 2018-11-04 03:23:22 +09:00
6903476868 New translations ja-JP.yml (Polish) 2018-11-04 03:23:16 +09:00
cf0dccc209 New translations ja-JP.yml (Korean) 2018-11-04 03:23:10 +09:00
cfd959129d New translations ja-JP.yml (Italian) 2018-11-04 03:23:06 +09:00
819287951c New translations ja-JP.yml (German) 2018-11-04 03:23:02 +09:00
e136193925 New translations ja-JP.yml (French) 2018-11-04 03:22:57 +09:00
8c631864d9 New translations ja-JP.yml (English) 2018-11-04 03:22:53 +09:00
d7d0f6ae2e New translations ja-JP.yml (Chinese Simplified) 2018-11-04 03:22:47 +09:00
b83b3fb9d1 New translations ja-JP.yml (Catalan) 2018-11-04 03:22:43 +09:00
dfce5bc0af [Client] Improve Emoji management page of admin panel 2018-11-04 03:18:57 +09:00
3487ddabea [API] Implement some Emoji APIs 2018-11-04 03:18:32 +09:00
2dbff75e7a New translations ja-JP.yml (French) 2018-11-04 02:53:30 +09:00
02465ded9f New translations ja-JP.yml (French) 2018-11-04 02:41:50 +09:00
ffcd387945 New translations ja-JP.yml (French) 2018-11-04 02:31:36 +09:00
4806346707 New translations ja-JP.yml (French) 2018-11-04 02:21:09 +09:00
31c3f6abf7 Fix: welcome-timeline (#3084) 2018-11-04 01:49:08 +09:00
83e47fdd60 New translations ja-JP.yml (English) 2018-11-04 01:21:56 +09:00
340ce7fa4c 10.38.0 2018-11-04 00:26:00 +09:00
ac86fee9b4 Merge pull request #3080 from syuilo/l10n_develop
New Crowdin translations
2018-11-04 00:13:09 +09:00
6dfa283d7a New translations ja-JP.yml (English) 2018-11-04 00:11:31 +09:00
0cce8a4d21 🎨 2018-11-04 00:10:13 +09:00
1c6d9ab2ef New translations ja-JP.yml (Norwegian) 2018-11-04 00:05:11 +09:00
6ca265e579 New translations ja-JP.yml (Dutch) 2018-11-04 00:04:59 +09:00
c612c4bf18 New translations ja-JP.yml (Japanese, Kansai) 2018-11-04 00:04:50 +09:00
481a791a60 New translations ja-JP.yml (Spanish) 2018-11-04 00:04:39 +09:00
cb516c2943 New translations ja-JP.yml (Russian) 2018-11-04 00:04:29 +09:00
c0abd6f0c0 New translations ja-JP.yml (Portuguese) 2018-11-04 00:04:17 +09:00
47695ed685 New translations ja-JP.yml (Polish) 2018-11-04 00:04:07 +09:00
4ca8020ef5 New translations ja-JP.yml (Korean) 2018-11-04 00:03:56 +09:00
bfac83d5b8 New translations ja-JP.yml (Italian) 2018-11-04 00:03:47 +09:00
4cd2e55fd3 New translations ja-JP.yml (German) 2018-11-04 00:03:37 +09:00
61c7e7bc48 New translations ja-JP.yml (French) 2018-11-04 00:03:28 +09:00
bef41718e2 New translations ja-JP.yml (English) 2018-11-04 00:03:16 +09:00
5b4b52bb97 New translations ja-JP.yml (Chinese Simplified) 2018-11-04 00:03:08 +09:00
8901b6d774 New translations ja-JP.yml (Catalan) 2018-11-04 00:02:57 +09:00
e3a24e9215 [Client] Improve admin panel 2018-11-03 23:57:14 +09:00
a515c1f53e Improve API documentation 2018-11-03 22:49:36 +09:00
2e22874dec Refactoring 2018-11-03 22:40:12 +09:00
30f0b1c30d Add missing semicolons 2018-11-03 22:38:12 +09:00
600aea4dbb [MFM] Fix emoji syntax parsing 2018-11-03 22:35:24 +09:00
f5d53d784d [Client] Improve admin panel 2018-11-03 22:21:20 +09:00
1061e1f7ae i18n 2018-11-03 22:20:09 +09:00
1d5fc04aa6 🎨 2018-11-03 22:03:06 +09:00
d1cf0c7998 Clean up 2018-11-03 22:01:58 +09:00
84218abf2b [Client] Make possible to change password in mobile
モバイル版からパスワードの変更を行えるように
2018-11-03 21:53:03 +09:00
5bebdb2511 🎨 2018-11-03 20:10:55 +09:00
9c8e9b4165 🎨 2018-11-03 20:03:21 +09:00
7b786bfde3 Improve usability of Admin panel 2018-11-03 19:57:44 +09:00
42a08642a4 Misskeyのバージョンもクライアントの環境変数に突っ込むように 2018-11-03 17:04:33 +09:00
e88f7ca7b2 [Client] Fix some charts 2018-11-03 16:44:05 +09:00
c26ed1421b [API] Increase chart limit 2018-11-03 16:43:50 +09:00
ed2f94a3c1 oops 2018-11-03 15:28:11 +09:00
daba7fe87c [MFM] Fix title syntax parsing 2018-11-03 15:28:00 +09:00
afc9caf7bf Improve performance 2018-11-03 15:21:07 +09:00
67697a7aa6 Merge pull request #3067 from syuilo/l10n_develop
New Crowdin translations
2018-11-03 15:14:13 +09:00
1623d9e70c 🎨 2018-11-03 15:05:00 +09:00
c304351335 🎨 2018-11-03 13:39:17 +09:00
c1520763c6 🎨 2018-11-03 13:30:57 +09:00
4853bc9414 Update src/client/app/admin/views/charts.vue 2018-11-03 13:08:49 +09:00
e7c865f8e3 Bump @types/request from 2.47.1 to 2.48.0 (#3054)
Bumps [@types/request](https://github.com/DefinitelyTyped/DefinitelyTyped) from 2.47.1 to 2.48.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-03 12:38:17 +09:00
46cb377bc2 Bump css-loader from 1.0.0 to 1.0.1 (#3070)
Bumps [css-loader](https://github.com/webpack-contrib/css-loader) from 1.0.0 to 1.0.1.
- [Release notes](https://github.com/webpack-contrib/css-loader/releases)
- [Changelog](https://github.com/webpack-contrib/css-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/css-loader/compare/v1.0.0...v1.0.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-03 12:37:54 +09:00
373a5ba3e1 Bump @types/node from 10.12.0 to 10.12.2 (#3072)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped) from 10.12.0 to 10.12.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-03 12:37:38 +09:00
3bedef67c8 Bump elasticsearch from 15.1.1 to 15.2.0 (#3073)
Bumps [elasticsearch](https://github.com/elastic/elasticsearch-js) from 15.1.1 to 15.2.0.
- [Release notes](https://github.com/elastic/elasticsearch-js/releases)
- [Changelog](https://github.com/elastic/elasticsearch-js/blob/master/docs/changelog.asciidoc)
- [Commits](https://github.com/elastic/elasticsearch-js/compare/v15.1.1...v15.2.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-03 12:37:28 +09:00
17ea19ada8 Bump typescript from 3.1.4 to 3.1.5 (#3069)
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 3.1.4 to 3.1.5.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v3.1.4...v3.1.5)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-03 12:37:11 +09:00
1f5b2285fd Bump file-type from 10.2.0 to 10.3.0 (#3071)
Bumps [file-type](https://github.com/sindresorhus/file-type) from 10.2.0 to 10.3.0.
- [Release notes](https://github.com/sindresorhus/file-type/releases)
- [Commits](https://github.com/sindresorhus/file-type/compare/v10.2.0...v10.3.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-03 12:36:59 +09:00
17f0001966 New translations ja-JP.yml (English) 2018-11-03 11:51:00 +09:00
04ba09a6af New translations ja-JP.yml (Norwegian) 2018-11-03 11:43:16 +09:00
70d2744319 New translations ja-JP.yml (Dutch) 2018-11-03 11:43:06 +09:00
6b2f0929ec New translations ja-JP.yml (Japanese, Kansai) 2018-11-03 11:42:55 +09:00
f2629bd3f2 New translations ja-JP.yml (Spanish) 2018-11-03 11:42:46 +09:00
9e6c29c3c0 New translations ja-JP.yml (Russian) 2018-11-03 11:42:38 +09:00
abda973094 New translations ja-JP.yml (Portuguese) 2018-11-03 11:42:27 +09:00
86b08dd5bd New translations ja-JP.yml (Polish) 2018-11-03 11:42:17 +09:00
617e331f0f New translations ja-JP.yml (Korean) 2018-11-03 11:42:06 +09:00
cc438a9372 New translations ja-JP.yml (Italian) 2018-11-03 11:41:58 +09:00
b0fb218bfd New translations ja-JP.yml (German) 2018-11-03 11:41:50 +09:00
fc85a607e6 New translations ja-JP.yml (French) 2018-11-03 11:41:42 +09:00
fb244c45e3 New translations ja-JP.yml (English) 2018-11-03 11:41:34 +09:00
c123784c54 New translations ja-JP.yml (Chinese Simplified) 2018-11-03 11:41:24 +09:00
342a5276fc New translations ja-JP.yml (Catalan) 2018-11-03 11:41:15 +09:00
51a32846ee Update src/client/app/admin/views/ap-log.vue 2018-11-03 11:39:56 +09:00
35865429a8 🎨 2018-11-03 11:39:18 +09:00
aadd5b95b8 Improve admin dashboard 2018-11-03 11:38:00 +09:00
f9f2ca51ac Improve stats API 2018-11-03 11:37:44 +09:00
1cb93a8c10 🎨 2018-11-03 11:37:17 +09:00
7e5dbb2ba5 Fix bug 2018-11-03 11:36:11 +09:00
2772e3d80e New translations ja-JP.yml (English) 2018-11-03 03:51:41 +09:00
223c578734 Improve admin dashboard 2018-11-03 03:30:28 +09:00
d01315dee2 🎨 2018-11-03 03:08:41 +09:00
7dafb4ce4c New translations ja-JP.yml (Norwegian) 2018-11-03 03:04:52 +09:00
9671db9b14 New translations ja-JP.yml (Dutch) 2018-11-03 03:04:41 +09:00
bec559f67c New translations ja-JP.yml (Japanese, Kansai) 2018-11-03 03:04:33 +09:00
14053c1394 New translations ja-JP.yml (Spanish) 2018-11-03 03:04:24 +09:00
55e4b1c828 New translations ja-JP.yml (Russian) 2018-11-03 03:04:17 +09:00
dda3421159 New translations ja-JP.yml (Portuguese) 2018-11-03 03:04:08 +09:00
45e7488e60 New translations ja-JP.yml (Polish) 2018-11-03 03:03:55 +09:00
30c7bd66b7 New translations ja-JP.yml (Korean) 2018-11-03 03:03:45 +09:00
af4f5bdac0 New translations ja-JP.yml (Italian) 2018-11-03 03:03:37 +09:00
3d1a8cc341 New translations ja-JP.yml (German) 2018-11-03 03:03:28 +09:00
0e52fb2544 New translations ja-JP.yml (French) 2018-11-03 03:03:18 +09:00
e6d6c0a17c New translations ja-JP.yml (English) 2018-11-03 03:03:10 +09:00
cfd2d47e00 New translations ja-JP.yml (Chinese Simplified) 2018-11-03 03:03:00 +09:00
83301a879d New translations ja-JP.yml (Catalan) 2018-11-03 03:02:51 +09:00
d7881ba129 Improve admin page 2018-11-03 03:00:23 +09:00
b9fef1edf7 New translations ja-JP.yml (Norwegian) 2018-11-03 02:14:35 +09:00
2c606f7b23 New translations ja-JP.yml (Dutch) 2018-11-03 02:14:27 +09:00
03797607ed New translations ja-JP.yml (Japanese, Kansai) 2018-11-03 02:14:19 +09:00
254b7f500d New translations ja-JP.yml (Spanish) 2018-11-03 02:14:09 +09:00
51edd51bf2 New translations ja-JP.yml (Russian) 2018-11-03 02:14:00 +09:00
0d403f4a3f New translations ja-JP.yml (Portuguese) 2018-11-03 02:13:52 +09:00
0fa134addd New translations ja-JP.yml (Polish) 2018-11-03 02:13:44 +09:00
7002270084 New translations ja-JP.yml (Korean) 2018-11-03 02:13:37 +09:00
1c5452d047 New translations ja-JP.yml (Italian) 2018-11-03 02:13:26 +09:00
f0d62c07bf New translations ja-JP.yml (German) 2018-11-03 02:13:18 +09:00
496ca55bba New translations ja-JP.yml (French) 2018-11-03 02:13:11 +09:00
79cfba226b New translations ja-JP.yml (English) 2018-11-03 02:13:00 +09:00
f69b60dffe New translations ja-JP.yml (Chinese Simplified) 2018-11-03 02:12:51 +09:00
513385133f New translations ja-JP.yml (Catalan) 2018-11-03 02:12:43 +09:00
6f1e2f6636 Improve admin page 2018-11-03 02:06:34 +09:00
8ae94c034d Update hashtags.ts 2018-11-02 23:46:57 +09:00
cd9696f25e Update src/server/api/endpoints/aggregation/hashtags.ts 2018-11-02 23:32:40 +09:00
d62a6bab41 Remove needless properties 2018-11-02 23:27:47 +09:00
20df002746 🍕 2018-11-02 23:23:01 +09:00
fa6b01546e New translations ja-JP.yml (English) 2018-11-02 23:22:06 +09:00
91b37a6e52 New translations ja-JP.yml (Norwegian) 2018-11-02 23:14:33 +09:00
d8171d7c8b New translations ja-JP.yml (Dutch) 2018-11-02 23:14:23 +09:00
fa96e2daf1 New translations ja-JP.yml (Japanese, Kansai) 2018-11-02 23:14:15 +09:00
87708c3b84 New translations ja-JP.yml (Spanish) 2018-11-02 23:14:06 +09:00
6319023cc9 New translations ja-JP.yml (Russian) 2018-11-02 23:13:58 +09:00
efad9d1b60 New translations ja-JP.yml (Portuguese) 2018-11-02 23:13:48 +09:00
a1dea657fa New translations ja-JP.yml (Polish) 2018-11-02 23:13:38 +09:00
6b1b75717b New translations ja-JP.yml (Korean) 2018-11-02 23:13:31 +09:00
efe08e0bd3 New translations ja-JP.yml (Italian) 2018-11-02 23:13:22 +09:00
62892c4894 New translations ja-JP.yml (German) 2018-11-02 23:13:15 +09:00
0c2a62da11 New translations ja-JP.yml (French) 2018-11-02 23:13:07 +09:00
5bc9e9aadd New translations ja-JP.yml (English) 2018-11-02 23:12:56 +09:00
112c33d35b New translations ja-JP.yml (Chinese Simplified) 2018-11-02 23:12:48 +09:00
864da3030f New translations ja-JP.yml (Catalan) 2018-11-02 23:12:38 +09:00
f2e719b361 [Client] Admin page improved 2018-11-02 23:05:53 +09:00
6aab515389 New translations ja-JP.yml (English) 2018-11-02 22:59:53 +09:00
819b535ab0 [API] Implement admin/add-emoji 2018-11-02 15:04:02 +09:00
60e95ac2ac Clean up 2018-11-02 14:53:55 +09:00
9b94ddff0a Clean up 2018-11-02 13:49:09 +09:00
174f8022eb Refactor 2018-11-02 13:47:44 +09:00
ddc3c5ba68 Better index 2018-11-02 12:49:18 +09:00
a7e6b766be Resolve #2623 2018-11-02 12:49:08 +09:00
befc35a3ac Update src/server/api/endpoints/meta.ts 2018-11-02 12:16:03 +09:00
2e9bbf389e Better index 2018-11-02 12:08:28 +09:00
80b5fda292 Remote custom emojis (#3074)
* Remote custom emojis

* んほおおおおお
2018-11-02 08:59:40 +09:00
c48cbd95f6 Fix bug 2018-11-02 03:41:09 +09:00
931bdc6aac Refactoring, Clean up and bug fixes 2018-11-02 03:32:24 +09:00
7f81506c8b New translations ja-JP.yml (French) 2018-11-01 22:01:38 +09:00
b4b9e76c8d Refactoring 2018-11-01 21:28:39 +09:00
e5a3dcf868 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-11-01 21:01:55 +09:00
825648535c Refactoring 2018-11-01 21:01:47 +09:00
5cbc908ba3 Fix typo 2018-11-01 19:32:11 +09:00
895cf53ee1 Fix bug 2018-11-01 18:05:14 +09:00
e41f74e77c 10.37.0 2018-11-01 11:52:33 +09:00
c21caad1c5 Custom emoji (#3061)
* wip

* wip

* wip
2018-11-01 11:51:49 +09:00
86fcd3a378 Fix bug 2018-11-01 10:00:15 +09:00
2b3687b3cb 10.36.1 2018-11-01 09:35:24 +09:00
5d61c7c691 Refactor and use original image for banner 2018-11-01 09:30:51 +09:00
1bb266e7c7 Update package-lock.json 2018-11-01 09:19:31 +09:00
1fca8d322c Clean up 2018-11-01 09:19:22 +09:00
325cd03a59 Improve performance 2018-11-01 09:08:00 +09:00
2f7e6baa05 Clean up 2018-11-01 09:02:54 +09:00
d252e066fe Improve performance 2018-11-01 09:00:18 +09:00
fe7bd9ab3c Bump typescript-eslint-parser from 20.0.0 to 20.1.1 (#3057)
Bumps [typescript-eslint-parser](https://github.com/eslint/typescript-eslint-parser) from 20.0.0 to 20.1.1.
- [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/compare/v20.0.0...v20.1.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-01 08:24:13 +09:00
84e3f41305 Bump ts-loader from 5.2.2 to 5.3.0 (#3055)
Bumps [ts-loader](https://github.com/TypeStrong/ts-loader) from 5.2.2 to 5.3.0.
- [Release notes](https://github.com/TypeStrong/ts-loader/releases)
- [Changelog](https://github.com/TypeStrong/ts-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/TypeStrong/ts-loader/compare/v5.2.2...v5.3.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-01 08:24:05 +09:00
3e8cccad0d Bump jsdom from 12.2.0 to 13.0.0 (#3058)
Bumps [jsdom](https://github.com/jsdom/jsdom) from 12.2.0 to 13.0.0.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/compare/12.2.0...13.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-01 08:23:38 +09:00
a2b94d67f7 Update README.md [AUTOGEN] (#3060) 2018-11-01 08:23:11 +09:00
6ab61e73b0 Bump apexcharts from 2.1.6 to 2.1.9 (#3056)
Bumps [apexcharts](https://github.com/apexcharts/apexcharts.js) from 2.1.6 to 2.1.9.
- [Release notes](https://github.com/apexcharts/apexcharts.js/releases)
- [Changelog](https://github.com/apexcharts/apexcharts.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/apexcharts/apexcharts.js/compare/v2.1.6...v2.1.9)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-01 08:22:53 +09:00
051c6973af Update README.md [AUTOGEN] (#3059) 2018-11-01 08:20:56 +09:00
806a49ec3d 10.36.0 2018-11-01 00:12:13 +09:00
3829fe128a Update src/server/api/endpoints/users/relation.ts 2018-11-01 00:11:52 +09:00
649177985d [API] Implement users/relation 2018-11-01 00:11:21 +09:00
c15148b23c [API] Include detailed user information for block/mute response 2018-10-31 23:34:35 +09:00
261a3f5d91 Better rate limitting 2018-10-31 23:03:14 +09:00
256ba78ba5 Fix 2018-10-31 22:55:17 +09:00
04aff8866e [MFM] Better hashtag detection 2018-10-31 22:38:05 +09:00
1a51b98700 Refactor 2018-10-31 22:35:02 +09:00
f64100226d Revert "Clean up"
This reverts commit 8948a0d3a4.
2018-10-31 22:10:25 +09:00
b7805e48a6 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-10-31 22:08:27 +09:00
0d9556620d Update package-lock.json 2018-10-31 22:08:19 +09:00
a51828a7a2 Update test.yml (#3052) 2018-10-31 22:07:26 +09:00
7e2009f408 Update config.yml (#3051) 2018-10-31 22:00:21 +09:00
008d950a39 10.35.1 2018-10-31 18:07:59 +09:00
22d5862afb 🎨 2018-10-31 18:07:00 +09:00
de569147a5 Fix #3041 2018-10-31 17:56:21 +09:00
a82c3db750 Merge pull request #3038 from syuilo/l10n_develop
New Crowdin translations
2018-10-31 13:44:10 +09:00
80706d10af Bump @types/speakeasy from 2.0.2 to 2.0.3 (#3012)
Bumps [@types/speakeasy](https://github.com/DefinitelyTyped/DefinitelyTyped) from 2.0.2 to 2.0.3.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-31 13:43:45 +09:00
93f01ed4df Bump typescript from 3.1.3 to 3.1.4 (#3049)
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 3.1.3 to 3.1.4.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v3.1.3...v3.1.4)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-31 13:42:47 +09:00
a3a28e5557 Bump file-type from 10.1.0 to 10.2.0 (#3039)
Bumps [file-type](https://github.com/sindresorhus/file-type) from 10.1.0 to 10.2.0.
- [Release notes](https://github.com/sindresorhus/file-type/releases)
- [Commits](https://github.com/sindresorhus/file-type/compare/v10.1.0...v10.2.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-31 13:42:31 +09:00
8948a0d3a4 Clean up 2018-10-31 13:28:05 +09:00
d849ea9b41 Clean up 2018-10-31 13:23:12 +09:00
0144575f3f Improve performance 2018-10-31 13:20:24 +09:00
bdbe646ca7 Improve performance 2018-10-31 13:14:45 +09:00
1a1483a242 Update package-lock.json 2018-10-31 12:29:38 +09:00
962346785b New translations ja-JP.yml (English) 2018-10-31 11:31:00 +09:00
a73da3cd70 10.35.0 2018-10-31 11:30:49 +09:00
9c27d0ae3f Add CircleCI badge (#3050) 2018-10-31 11:29:25 +09:00
525d5218c1 🎨 2018-10-31 11:29:03 +09:00
e23b13ec7f [API] Include detailed user information of blocking API responses 2018-10-31 11:24:36 +09:00
29b000e03c Remove needless async/await 2018-10-31 11:22:49 +09:00
6a7b0df810 New translations ja-JP.yml (Norwegian) 2018-10-31 11:22:11 +09:00
4142de9195 New translations ja-JP.yml (Dutch) 2018-10-31 11:22:07 +09:00
9195e1be00 New translations ja-JP.yml (Japanese, Kansai) 2018-10-31 11:22:03 +09:00
75382d13fd New translations ja-JP.yml (Spanish) 2018-10-31 11:21:59 +09:00
d444280a28 New translations ja-JP.yml (Russian) 2018-10-31 11:21:52 +09:00
52fc0fe04a New translations ja-JP.yml (Portuguese) 2018-10-31 11:21:48 +09:00
216bebadf1 New translations ja-JP.yml (Polish) 2018-10-31 11:21:44 +09:00
a5592931cb New translations ja-JP.yml (Korean) 2018-10-31 11:21:39 +09:00
a2228417ff New translations ja-JP.yml (Italian) 2018-10-31 11:21:35 +09:00
3e1e292c3e New translations ja-JP.yml (German) 2018-10-31 11:21:31 +09:00
f2f039ae9e New translations ja-JP.yml (French) 2018-10-31 11:21:27 +09:00
29dde1eda0 New translations ja-JP.yml (English) 2018-10-31 11:21:21 +09:00
45d3792ce0 New translations ja-JP.yml (Chinese Simplified) 2018-10-31 11:21:17 +09:00
875d0aaebb New translations ja-JP.yml (Catalan) 2018-10-31 11:21:13 +09:00
26c9d8ff6f Clean up 2018-10-31 11:20:54 +09:00
5e3372e932 Merge pull request #3047 from mei23/mei-1031-blokings-list
blockings list
2018-10-31 11:17:24 +09:00
f7069dcd18 良い感じに 2018-10-31 11:16:13 +09:00
560bb65384 blockings list 2018-10-31 04:59:01 +09:00
50cd6a036e Implement /api/v1/instance (#3045)
* Update mastodon.ts

* Update types.ts

* Update mastodon.ts
2018-10-31 02:17:54 +09:00
441ab2b5f8 Fix: can't recognize rebirthed instance user (#3046)
* resync uri from WebFinger

* trigger resync on user page

* allways update on resync

* Revert "trigger resync on user page"

This reverts commit 8ff139fb49ee61ad55e4b42c562f8a2c3f8098ac.

* background resync
2018-10-31 02:16:13 +09:00
ba5ed188a1 Add Crowdin info to translate docs (#3044) 2018-10-30 22:56:13 +09:00
72e672f08d Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-10-30 21:55:25 +09:00
120474ec6a Fix bug 2018-10-30 21:55:16 +09:00
eee57c47f5 Use cache when default.yml update (#3042)
* Use cache when default.yml update

* Install latest npm in base image
2018-10-30 21:18:03 +09:00
4c160869b8 Update test/api.ts 2018-10-30 21:17:26 +09:00
3720a7fbe0 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-10-30 14:34:39 +09:00
7afa541a53 Fix #3040 2018-10-30 14:34:32 +09:00
6f979c8275 Configure CI (#3037)
* Update config.yml

* Configure CI

* Use Vesion 2.1

* Fix error

* Ensure binary builds

* Ensure misskey builds

* Store artifacts

* Ensure node-gyp builds

* Fix typo

* Fix typo

* Ensure binary builds

* Update working directory

* Cache test npm packages

* Revert "Update working directory"

* Ensure misskey builds

* Ensure node-gyp builds

* Fix missing configurations

* Configure deploy filters

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

* UndoBlock

* UnBlock

* wip

* follow

* UI

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

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-28 21:38:27 +09:00
518646b925 Fix: Unexpected remote user is selected (#3032) 2018-10-28 07:49:58 +09:00
479d7e0087 Merge pull request #3031 from syuilo/patch-autogen 2018-10-27 13:37:02 +09:00
8ea1a555f4 Update README.md [AUTOGEN] 2018-10-27 13:36:06 +09:00
04024dc37c Update README.md [AUTOGEN] (#3024) 2018-10-27 03:47:04 +09:00
060ff9288f Build assets in CircleCI. (#3021) 2018-10-27 03:46:48 +09:00
197116ee78 New translations ja-JP.yml (Japanese, Kansai) 2018-10-26 22:12:16 +09:00
a1e0015257 New translations ja-JP.yml (Japanese, Kansai) 2018-10-26 22:01:37 +09:00
518 changed files with 10715 additions and 24715 deletions

143
.circleci/config.yml Normal file
View File

@ -0,0 +1,143 @@
version: 2.1
general:
branches:
ignore:
- l10n_develop
- imgbot
executors:
default:
working_directory: /tmp/workspace
docker:
- image: misskey/ci:latest
- image: circleci/mongo:latest
- image: circleci/redis:latest
docker:
working_directory: /tmp/workspace
docker:
- image: docker:latest
jobs:
build:
executor: default
steps:
- checkout
- run:
name: Ensure package-lock.json
command: |
[ ! -e package-lock.json ] && echo '{}' > package-lock.json
- restore_cache:
name: Restore npm package caches
keys:
- npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-
- npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-
- npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-
- npm-v1-arch-{{ arch }}-
- npm-v1-
- run:
name: Install Dependencies
command: |
npm install
npm prune
- run:
name: Configure
command: |
cp .circleci/misskey/default.yml .config
cp .circleci/misskey/test.yml .config
- run:
name: Build
command: |
npm run build || (echo -e '\033[0;34mRebuild modules\033[0;39m' && ls -1A node_modules | grep '^[^@]' | xargs npm rebuild && ls -1A node_modules | grep '^@' | xargs -I%1 sh -c 'ls -1A node_modules/'%1' | xargs -P0 -I%2 npm rebuild node_modules/'%1'/%2' && npm run build)
ls -1ARl node_modules > ls
- save_cache:
name: Cache npm packages
key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
paths:
- node_modules
# - store_artifacts:
# path: built
- persist_to_workspace:
root: .
paths:
- .
test:
parameters:
without_redis:
type: string
default: ""
executor: default
steps:
- attach_workspace:
at: /tmp/workspace
- when:
condition: <<parameters.without_redis>>
steps:
- run:
name: Configure
command: |
mv .config/test.yml .config/test_redis.yml
touch .config/test.yml
cat .config/test_redis.yml | while IFS= read line; do if [[ "$line" = '# __REDIS__' ]]; then break; else echo "$line" >> .config/test.yml; fi; done
- run:
name: Test
command: |
npm run test || (npm rebuild && npm run test) || ((node-gyp configure && node-gyp build && npm run build || (echo -e '\033[0;34mRebuild modules\033[0;39m' && ls -1A node_modules | grep '^[^@]' | xargs npm rebuild && ls -1A node_modules | grep '^@' | xargs -I%1 sh -c 'ls -1A node_modules/'%1' | xargs -P0 -I%2 npm rebuild node_modules/'%1'/%2' && npm run build)) && npm run test)
ls -1ARl node_modules > ls
- save_cache:
name: Cache npm packages
key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
paths:
- node_modules
docker:
parameters:
with_deploy:
type: string
default: ""
executor: docker
steps:
- checkout
- setup_remote_docker
- run:
name: Build
command: |
docker build -t misskey/misskey .
- when:
condition: <<parameters.with_deploy>>
steps:
- run:
name: Deploy
command: |
if [ "$DOCKERHUB_USERNAME$DOCKERHUB_PASSWORD" ]
then
docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD
docker push misskey/misskey
else
echo -e '\033[0;33mAborted deploying to Docker Hub\033[0;39m'
fi
workflows:
version: 2
build-and-test:
jobs:
- build
- test:
requires:
- build
- test:
without_redis: "true"
requires:
- build
filters:
branches:
only: master
# - docker:
# filters:
# branches:
# ignore: master
- docker:
with_deploy: "true"
filters:
branches:
only: master

View File

@ -1,6 +1,3 @@
maintainer:
name: syuilo
url: 'https://syuilo.com'
url: 'http://misskey.local' url: 'http://misskey.local'
port: 80 port: 80
mongodb: mongodb:

View File

@ -1,6 +1,3 @@
maintainer:
name: syuilo
url: 'https://syuilo.com'
url: 'http://misskey.local' url: 'http://misskey.local'
port: 80 port: 80
mongodb: mongodb:
@ -9,6 +6,7 @@ mongodb:
db: test-misskey db: test-misskey
user: admin user: admin
pass: '' pass: ''
# __REDIS__
redis: redis:
host: localhost host: localhost
port: 6379 port: 6379

View File

@ -1,13 +1,3 @@
name: example-instance-name # Name of your instance
description: example-description # Description of your instance
maintainer:
name: example-maitainer-name # Your name
url: http://example.com/ # Your contact (http or mailto)
repository_url: https://github.com/syuilo/misskey # Repository URL
feedback_url: https://github.com/syuilo/misskey/issues # Feedback URL (e.g. github issue)
# Final accessible URL seen by a user. # Final accessible URL seen by a user.
url: https://example.tld/ url: https://example.tld/
@ -25,7 +15,7 @@ url: https://example.tld/
# +------+ |+-------------+ +----------------+| # +------+ |+-------------+ +----------------+|
# +---------------------------------------+ # +---------------------------------------+
# #
# You need to setup reverse proxy. (eg. Nginx) # You need to setup reverse proxy. (eg. nginx)
# You do not define 'https' section. # You do not define 'https' section.
# Option 2: Standalone # Option 2: Standalone
@ -60,21 +50,6 @@ mongodb:
user: example-misskey-user user: example-misskey-user
pass: example-misskey-pass pass: example-misskey-pass
# Drive capacity of a local user (MB)
localDriveCapacityMb: 256
# Drive capacity of a remote user (MB)
remoteDriveCapacityMb: 8
# If enabled:
# Server will not cache remote files (Using direct link instead).
# You can save your storage.
#
# NOTE:
# * Users cannot see remote images when they turn off "Show media from a remote server" setting.
# * Since thumbnails are not provided, traffic increases.
preventCacheRemoteFiles: false
drive: drive:
storage: 'db' storage: 'db'
@ -113,6 +88,10 @@ drive:
# accessKey: XXX # accessKey: XXX
# secretKey: YYY # secretKey: YYY
# If enabled:
# The first account created is automatically marked as Admin.
autoAdmin: true
# #
# Below settings are optional # Below settings are optional
# #
@ -129,11 +108,6 @@ drive:
# port: 9200 # port: 9200
# pass: null # pass: null
# reCAPTCHA
#recaptcha:
# site_key: example-site-key
# secret_key: example-secret-key
# ServiceWorker # ServiceWorker
#sw: #sw:
# # Public key of VAPID # # Public key of VAPID
@ -142,17 +116,6 @@ drive:
# # Private key of VAPID # # Private key of VAPID
# private_key: example-sw-private-key # private_key: example-sw-private-key
# Twitter integration
# You need to set the oauth callback url as : https://<your-misskey-instance>/api/tw/cb
#twitter:
# consumer_key: example-twitter-consumer-key
# consumer_secret: example-twitter-consumer-secret-key
# Ghost
# Ghost account is an account used for the purpose of delegating
# followers when putting users in the list.
#ghost: user-id-of-your-ghost-account
# Clustering # Clustering
#clusterLimit: 1 #clusterLimit: 1
@ -164,6 +127,3 @@ drive:
# external: true # external: true
# engine: http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}} # engine: http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}
# timeout: 300000 # timeout: 300000
# Max allowed note text length in charactors
maxNoteTextLength: 1000

1
.npmrc
View File

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

View File

@ -1,41 +0,0 @@
# travis file
# https://docs.travis-ci.com/user/customizing-the-build
notifications:
email: false
branches:
except:
- l10n_master
language: node_js
node_js:
- 11.0.0
env:
- CXX=g++-4.8 NODE_ENV=production
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.8
cache:
directories:
- node_modules
services:
- mongodb
- redis-server
before_script:
- npm install
# 設定ファイルを配置
- cp ./.travis/default.yml ./.config
- cp ./.travis/test.yml ./.config
- travis_wait npm run build

View File

@ -23,5 +23,5 @@ Please use [Crowdin](https://crowdin.com/project/misskey) for localization.
* Test codes are located in `/test`. * Test codes are located in `/test`.
## Continuous integration ## Continuous integration
Misskey uses Travis for automated test. Misskey uses CircleCI for automated test.
Configuration files are located in `/.travis`. Configuration files are located in `/.circleci`.

View File

@ -3,8 +3,9 @@ FROM alpine:3.8 AS base
ENV NODE_ENV=production ENV NODE_ENV=production
RUN apk add --no-cache nodejs nodejs-npm zlib RUN apk add --no-cache nodejs nodejs-npm zlib
RUN npm i -g npm@latest
WORKDIR /misskey WORKDIR /misskey
COPY . ./
FROM base AS builder FROM base AS builder
@ -21,18 +22,23 @@ RUN apk add --no-cache \
pkgconfig \ pkgconfig \
libtool \ libtool \
zlib-dev zlib-dev
RUN npm install \ RUN npm i -g node-gyp
&& npm install -g node-gyp \
&& node-gyp configure \ COPY ./package.json ./
&& node-gyp build \ RUN npm i
&& npm run build
COPY . ./
RUN node-gyp configure \
&& node-gyp build \
&& npm run build
FROM base AS runner FROM base AS runner
COPY --from=builder /misskey/built ./built
COPY --from=builder /misskey/node_modules ./node_modules
RUN apk add --no-cache tini RUN apk add --no-cache tini
ENTRYPOINT ["/sbin/tini", "--"] ENTRYPOINT ["/sbin/tini", "--"]
COPY --from=builder /misskey/node_modules ./node_modules
COPY --from=builder /misskey/built ./built
COPY . ./
CMD ["npm", "start"] CMD ["npm", "start"]

View File

@ -3,7 +3,7 @@
[![Misskey](/assets/title.png)](https://misskey.xyz/) [![Misskey](/assets/title.png)](https://misskey.xyz/)
================================================================ ================================================================
[![][travis-badge]][travis-link] [![CircleCI](https://circleci.com/gh/syuilo/misskey.svg?style=svg)](https://circleci.com/gh/syuilo/misskey)
[![][dependencies-badge]][dependencies-link] [![][dependencies-badge]][dependencies-link]
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
@ -43,7 +43,7 @@ Easiest way to tell your emotions. Misskey allows you to add various type of rea
<h3 align="left">Interface</h3> <h3 align="left">Interface</h3>
<p align="left"> <p align="left">
No UI fits for everyone. Therefore, Misskey has a highly customizable UI for your taste. You can edit layouts of your timeline, place selectable widgets you can easily move and create your unique home as this place will be your home. Highly customizable UI for your taste. We understand no UI fits for everyone. You can edit layouts of your timeline, place selectable widgets you can easily move and create your unique home as this place will be your home.
</p> </p>
--- ---
@ -71,39 +71,46 @@ Please see [Contribution guide](./CONTRIBUTING.md).
---------------------------------------------------------------- ----------------------------------------------------------------
<!-- PATREON_START --> <!-- PATREON_START -->
<table><tr> <table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=CXe9AqlZy9AsYfiWd3OBYVOzvODoN47Litz0Tu4BFpU%3D" alt="Gargron"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1?token-time=2145916800&token-hash=d6P5MWHHsCMxUuBAEPAoVc5wLUR19mIhqAq7Ma9h9rI%3D" alt="ne_moni"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/2?token-time=2145916800&token-hash=mgPdX9TqZxEg4TTPuc477dxhIgYk9246qafjWZEqZ7g%3D" alt="Melilot"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/2?token-time=2145916800&token-hash=mgPdX9TqZxEg4TTPuc477dxhIgYk9246qafjWZEqZ7g%3D" alt="Melilot"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/2?token-time=2145916800&token-hash=rwZ8qvbm_kpA4ib3kc07tVKupXeySpY5ATQFGxfL9v0%3D" alt="Xeltica"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1?token-time=2145916800&token-hash=I8lJVM8LeW6TSo5W6uIIRZ42cw83zp1wK_FsbzY0mcQ%3D" alt="mydarkstar"></td>
<td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td> <td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=zwSu01tOtn5xTUucDZHuPsCxF2HBEMVs9ROJKTlEV_o%3D" alt="nemu"></td>
</tr><tr> </tr><tr>
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
<td><a href="https://www.patreon.com/negao">negao</a></td> <td><a href="https://www.patreon.com/negao">negao</a></td>
<td><a href="https://www.patreon.com/user?u=13099460">ne_moni</a></td>
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td> <td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
<td><a href="https://www.patreon.com/AxellaMC">Xeltica</a></td>
<td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td> <td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td>
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td> <td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td> <td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
</tr></table> </tr></table>
<table><tr> <table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D" alt="Naoki Kosaka"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=zwSu01tOtn5xTUucDZHuPsCxF2HBEMVs9ROJKTlEV_o%3D" alt="nemu"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3?token-time=2145916800&token-hash=qsdn0-e6yLaLI6hUX9JAkyTR6a5UdnSp7T1foniBvGQ%3D" alt="YUKIMOCHI"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/8241184/39e18850e87a449e9c9a71acb3310ebd/2?token-time=2145916800&token-hash=iUXOQzRyJDv3PJxwS7Mjwg1459dzh2trOq6NFtXu_OM%3D" alt="Acid Chicken"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=UERBN4OyP7Nh5XwwdDg0N0IE5cD6_qUQMO81Z5Wizso%3D" alt="Hiratake"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=UERBN4OyP7Nh5XwwdDg0N0IE5cD6_qUQMO81Z5Wizso%3D" alt="Hiratake"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/10789744/97175095d8f04c0f86225ff47cb98d40/1?token-time=2145916800&token-hash=P4BIzCX2I1CkEP66ottfhsC8Wr6BUSamjA-vq3pLqFI%3D" alt="Naoki Hirayama"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=tB1e_r8RlZ5sFL0KV_e8dugapxatNBRK1Z3h67TO1g8%3D" alt="Gargron"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1?token-time=2145916800&token-hash=VZUtwrjQa8Jml4twCjHYQQZ64wHEY4oIlGl7Kc-VYUQ%3D" alt="Nokotaro Takeda"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td>
</tr><tr> </tr><tr>
<td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td> <td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
<td><a href="https://www.patreon.com/acid_chicken">Acid Chicken</a></td>
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td> <td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
<td><a href="https://www.patreon.com/spinlock">Naoki Hirayama</a></td>
<td><a href="https://www.patreon.com/dansup">dansup</a></td> <td><a href="https://www.patreon.com/dansup">dansup</a></td>
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td> <td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
</tr></table> </tr></table>
<table><tr>
</tr><tr>
</tr></table>
**Last updated:** Tue, 02 Oct 2018 09:25:07 UTC **Last updated:** Wed, 31 Oct 2018 23:21:06 UTC
<!-- PATREON_END --> <!-- PATREON_END -->
:four_leaf_clover: Copyright :four_leaf_clover: Copyright
@ -116,8 +123,6 @@ Misskey is an open-source software licensed under the [GNU AGPLv3](LICENSE).
[agpl-3.0]: https://www.gnu.org/licenses/agpl-3.0.en.html [agpl-3.0]: https://www.gnu.org/licenses/agpl-3.0.en.html
[agpl-3.0-badge]: https://img.shields.io/badge/license-AGPL--3.0-444444.svg?style=flat-square [agpl-3.0-badge]: https://img.shields.io/badge/license-AGPL--3.0-444444.svg?style=flat-square
[travis-link]: https://travis-ci.org/syuilo/misskey
[travis-badge]: http://img.shields.io/travis/syuilo/misskey/master.svg?style=flat-square
[dependencies-link]: https://david-dm.org/syuilo/misskey [dependencies-link]: https://david-dm.org/syuilo/misskey
[dependencies-badge]: https://img.shields.io/david/syuilo/misskey.svg?style=flat-square [dependencies-badge]: https://img.shields.io/david/syuilo/misskey.svg?style=flat-square

View File

@ -1,38 +0,0 @@
# appveyor file
# http://www.appveyor.com/docs/appveyor-yml
environment:
matrix:
- nodejs_version: 11.0.0
platform:
- x64
- Any CPU
build: off
install:
# Get the latest stable version of Node.js or io.js
- ps: Install-Product node $env:nodejs_version
# Update node-gyp
# 必須! node-gyp のバージョンを上げないと、ネイティブモジュールのコンパイルに失敗します
- npm install -g node-gyp
- npm install
init:
# git clone の際の改行を変換しないようにします
- git config --global core.autocrlf false
before_test:
# 設定ファイルを配置
- cp ./.travis/default.yml ./.config
- cp ./.travis/test.yml ./.config
- npm run build
test_script:
- node --version
- npm --version
- npm test

View File

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

View File

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

View File

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

View File

@ -22,7 +22,7 @@ adduser --disabled-password --disabled-login misskey
Please install and setup these softwares: Please install and setup these softwares:
#### Dependencies :package: #### Dependencies :package:
* **[Node.js](https://nodejs.org/en/)** * **[Node.js](https://nodejs.org/en/)** >= 10.0.0
* **[MongoDB](https://www.mongodb.com/)** >= 3.6 * **[MongoDB](https://www.mongodb.com/)** >= 3.6
##### Optional ##### Optional
@ -47,11 +47,6 @@ 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)* reCAPTCHA tokens
----------------------------------------------------------------
If you want to enable reCAPTCHA, you need to generate reCAPTCHA tokens:
Please visit https://www.google.com/recaptcha/intro/ and generate keys.
*(optional)* Generating VAPID keys *(optional)* Generating 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:
@ -62,13 +57,6 @@ npm install web-push -g
web-push generate-vapid-keys web-push generate-vapid-keys
``` ```
*(optional)* Create a twitter application
----------------------------------------------------------------
If you want to enable the twitter integration, you need to create a twitter app at [https://developer.twitter.com/en/apply/user](https://developer.twitter.com/en/apply/user).
In the app you need to set the oauth callback url as : https://misskey-instance/api/tw/cb
*5.* Make configuration file *5.* Make configuration file
---------------------------------------------------------------- ----------------------------------------------------------------
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`.

View File

@ -22,7 +22,7 @@ adduser --disabled-password --disabled-login misskey
これらのソフトウェアをインストール・設定してください: これらのソフトウェアをインストール・設定してください:
#### 依存関係 :package: #### 依存関係 :package:
* **[Node.js](https://nodejs.org/en/)** * **[Node.js](https://nodejs.org/en/)** (10.0.0以上)
* **[MongoDB](https://www.mongodb.com/)** (3.6以上) * **[MongoDB](https://www.mongodb.com/)** (3.6以上)
##### オプション ##### オプション
@ -53,11 +53,6 @@ adduser --disabled-password --disabled-login misskey
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認 4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
5. `npm install` Misskeyの依存パッケージをインストール 5. `npm install` Misskeyの依存パッケージをインストール
*(オプション)* reCAPTCHAトークン
----------------------------------------------------------------
reCAPTCHAを有効にする場合、reCAPTCHAトークンを取得する必要があります。
https://www.google.com/recaptcha/intro/ にアクセスしてトークンを取得してください。
*(オプション)* VAPIDキーペアの生成 *(オプション)* VAPIDキーペアの生成
---------------------------------------------------------------- ----------------------------------------------------------------
ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります: ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります:

View File

@ -18,6 +18,10 @@ If you find an untranslated part on Misskey:
4. Add the text property using the `foo` keyword below the path that you found or created in step 2. Make sure to type your text in quotation marks. Text should always be inside of quotes. 4. Add the text property using the `foo` keyword below the path that you found or created in step 2. Make sure to type your text in quotation marks. Text should always be inside of quotes.
- For example, in this case we add timeline: `timeline: "タイムライン"` to `locales/ja-JP.yml`. - For example, in this case we add timeline: `timeline: "タイムライン"` to `locales/ja-JP.yml`.
5. And done 5. When you add text to the ja-JP file (of syuilo/misskey), it will automatically be applied to all other local language files within 24-48 hours. Translations added in ja-JP file should contain the original Japanese strings (example see step 4).
6. The new strings will automatically appear in the localized language files in the original Japanese text. After that, please go to [CrowdIn](https://crowdin.com/project/misskey) to do the localized translations in your language.
7. And done
For more details, please refer to this [commit](https://github.com/syuilo/misskey/commit/10f6d5980fa7692ccb45fbc5f843458b69b7607c). For more details, please refer to this [commit](https://github.com/syuilo/misskey/commit/10f6d5980fa7692ccb45fbc5f843458b69b7607c).

View File

@ -21,7 +21,6 @@ import * as htmlmin from 'gulp-htmlmin';
const uglifyes = require('uglify-es'); const uglifyes = require('uglify-es');
const locales = require('./locales'); const locales = require('./locales');
import { fa } from './src/misc/fa';
const uglify = uglifyComposer(uglifyes, console); const uglify = uglifyComposer(uglifyes, console);
@ -164,8 +163,7 @@ gulp.task('build:client:pug', [
gulp.src('./src/client/app/base.pug') gulp.src('./src/client/app/base.pug')
.pipe(pug({ .pipe(pug({
locals: { locals: {
themeColor: constants.themeColor, themeColor: constants.themeColor
facss: fa.dom.css()
} }
})) }))
.pipe(htmlmin({ .pipe(htmlmin({

View File

@ -186,6 +186,7 @@ common:
stack-left: "左に重ねる" stack-left: "左に重ねる"
pop-right: "右に出す" pop-right: "右に出す"
dev: "アプリの作成に失敗しました。再度お試しください。" dev: "アプリの作成に失敗しました。再度お試しください。"
ai-chan-kawaii: "藍ちゃかわいい"
auth/views/form.vue: auth/views/form.vue:
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?" share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
permission-ask: "このアプリは次の権限を要求しています:" permission-ask: "このアプリは次の権限を要求しています:"
@ -741,7 +742,8 @@ desktop/views/components/settings.vue:
profile: "プロフィール" profile: "プロフィール"
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute-and-block: "ミュート/ブロック"
blocking: "ブロック"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
@ -867,9 +869,13 @@ common/views/components/drive-settings.vue:
max: "容量" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計" stats: "統計"
desktop/views/components/settings.mute.vue: common/views/components/mute-and-block.vue:
no-users: "ミュートしているユーザーはいません" mute-and-block: "ミュートとブロック"
desktop/views/components/settings.password.vue: mute: "ミュート"
block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません"
common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください" enter-new-password: "新しいパスワードを入力してください"
@ -941,41 +947,86 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス"
emoji: "カスタム絵文字"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
desktop/views/pages/admin/admin.dashboard.vue: back-to-misskey: "Misskeyに戻る"
admin/views/dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" accounts: "アカウント"
original-users: "このインスタンスのユーザー" notes: "投稿"
all-notes: "全ての投稿" drive: "ドライブ"
original-notes: "このインスタンスの投稿" instances: "インスタンス"
this-instance: "このインスタンス"
federated: "連合"
invite: "招待" invite: "招待"
banner-url: "Banner URL" banner-url: "Banner URL"
disableRegistration: "Disable new user registration" disableRegistration: "Disable new user registration"
disableLocalTimeline: "Disable the local timeline" disableLocalTimeline: "Disable the local timeline"
desktop/views/pages/admin/admin.suspend-user.vue: admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
network: "ネットワーク"
charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の積算"
users: "ユーザーの増減"
users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト"
network-time: "応答時間"
network-usage: "通信量"
admin/views/users.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
suspend: "凍結" suspend: "凍結"
suspended: "凍結しました" suspended: "凍結しました"
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除" unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除" unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました" unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする" verify: "公式アカウントにする"
verified: "公式アカウントにしました" verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.announcements.vue: admin/views/emoji.vue:
add-emoji:
title: "絵文字の登録"
name: "絵文字名"
name-desc: "a~z 0~9 _ の文字が使えます。"
aliases: "エイリアス"
aliases-desc: "スペースで区切って複数設定できます。"
url: "絵文字画像URL"
add: "追加"
emojis:
title: "絵文字一覧"
update: "更新"
remove: "削除"
admin/views/announcements.vue:
announcements: "お知らせ" announcements: "お知らせ"
desktop/views/pages/admin/admin.hashtags.vue: save: "保存"
remove: "削除"
add: "追加"
title: "タイトル"
text: "内容"
admin/views/hashtags.vue:
hided-tags: "Hidden Tags" hided-tags: "Hidden Tags"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
@ -1055,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1320,6 +1374,7 @@ mobile/views/pages/settings.vue:
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする" mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"
@ -1329,6 +1384,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"
images: "画像" images: "画像"

View File

@ -186,6 +186,7 @@ common:
stack-left: "Nach links schichten" stack-left: "Nach links schichten"
pop-right: "Rechts andocken" pop-right: "Rechts andocken"
dev: "Fehler beim Erstellen der Applikation. Bitte versuche es erneut." dev: "Fehler beim Erstellen der Applikation. Bitte versuche es erneut."
ai-chan-kawaii: "藍ちゃかわいい"
auth/views/form.vue: auth/views/form.vue:
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?" share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
permission-ask: "このアプリは次の権限を要求しています:" permission-ask: "このアプリは次の権限を要求しています:"
@ -741,7 +742,8 @@ desktop/views/components/settings.vue:
profile: "Profil" profile: "Profil"
notification: "Mitteilungen" notification: "Mitteilungen"
apps: "In App öffnen" apps: "In App öffnen"
mute: "Stummschalten" mute-and-block: "ミュート/ブロック"
blocking: "ブロック"
security: "Sicherheit" security: "Sicherheit"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "Passwort" password: "Passwort"
@ -867,15 +869,19 @@ common/views/components/drive-settings.vue:
max: "容量" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計" stats: "統計"
desktop/views/components/settings.mute.vue: common/views/components/mute-and-block.vue:
no-users: "ミュートしているユーザーはいません" mute-and-block: "ミュートとブロック"
desktop/views/components/settings.password.vue: mute: "ミュート"
reset: "Passwort ändern" block: "ブロック"
enter-current-password: "Derzeitiges Passwort eingeben" no-muted-users: "ミュートしているユーザーはいません"
enter-new-password: "Neues Passwort eingeben" no-blocked-users: "ブロックしているユーザーはいません"
enter-new-password-again: "Neues Passwort erneut eingeben" common/views/components/password-settings.vue:
not-match: "Passwörter stimmen nicht überein." reset: "パスワードを変更する"
changed: "Passwort geändert" enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください"
enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
@ -941,41 +947,86 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス"
emoji: "カスタム絵文字"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
desktop/views/pages/admin/admin.dashboard.vue: back-to-misskey: "Misskeyに戻る"
admin/views/dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" accounts: "アカウント"
original-users: "このインスタンスのユーザー" notes: "投稿"
all-notes: "全ての投稿" drive: "ドライブ"
original-notes: "このインスタンスの投稿" instances: "インスタンス"
this-instance: "このインスタンス"
federated: "連合"
invite: "招待" invite: "招待"
banner-url: "Banner URL" banner-url: "Banner URL"
disableRegistration: "Disable new user registration" disableRegistration: "Disable new user registration"
disableLocalTimeline: "Disable the local timeline" disableLocalTimeline: "Disable the local timeline"
desktop/views/pages/admin/admin.suspend-user.vue: admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
network: "ネットワーク"
charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の積算"
users: "ユーザーの増減"
users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト"
network-time: "応答時間"
network-usage: "通信量"
admin/views/users.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
suspend: "凍結" suspend: "凍結"
suspended: "凍結しました" suspended: "凍結しました"
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除" unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除" unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました" unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする" verify: "公式アカウントにする"
verified: "公式アカウントにしました" verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.announcements.vue: admin/views/emoji.vue:
add-emoji:
title: "絵文字の登録"
name: "絵文字名"
name-desc: "a~z 0~9 _ の文字が使えます。"
aliases: "エイリアス"
aliases-desc: "スペースで区切って複数設定できます。"
url: "絵文字画像URL"
add: "追加"
emojis:
title: "絵文字一覧"
update: "更新"
remove: "削除"
admin/views/announcements.vue:
announcements: "お知らせ" announcements: "お知らせ"
desktop/views/pages/admin/admin.hashtags.vue: save: "保存"
remove: "削除"
add: "追加"
title: "タイトル"
text: "内容"
admin/views/hashtags.vue:
hided-tags: "Hidden Tags" hided-tags: "Hidden Tags"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
@ -1055,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1320,6 +1374,7 @@ mobile/views/pages/settings.vue:
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする" mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"
@ -1329,6 +1384,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"
images: "画像" images: "画像"

View File

@ -186,6 +186,7 @@ common:
stack-left: "Stack to the left" stack-left: "Stack to the left"
pop-right: "Dock on the right" pop-right: "Dock on the right"
dev: "Failed to create the application. Please try again." dev: "Failed to create the application. Please try again."
ai-chan-kawaii: "Ai-chan kawaii!"
auth/views/form.vue: auth/views/form.vue:
share-access: "Would you <b>allow</b> <i>{{ app.name }}</i> to access your account?" share-access: "Would you <b>allow</b> <i>{{ app.name }}</i> to access your account?"
permission-ask: "This application requires the following permissions:" permission-ask: "This application requires the following permissions:"
@ -249,7 +250,7 @@ common/views/components/games/reversi/reversi.room.vue:
this-game-is-started-soon: "The game will begin in seconds" this-game-is-started-soon: "The game will begin in seconds"
waiting-for-other: "Waiting for the opponent" waiting-for-other: "Waiting for the opponent"
waiting-for-me: "Waiting for the your preparation" waiting-for-me: "Waiting for the your preparation"
waiting-for-both: "Prepareing" waiting-for-both: "Preparing"
cancel: "Cancel" cancel: "Cancel"
ready: "Ready" ready: "Ready"
cancel-ready: "Cancel \"Ready\"" cancel-ready: "Cancel \"Ready\""
@ -741,7 +742,8 @@ desktop/views/components/settings.vue:
profile: "Profile" profile: "Profile"
notification: "Notification" notification: "Notification"
apps: "Apps" apps: "Apps"
mute: "Mute" mute-and-block: "Mute / Block"
blocking: "Blocking"
security: "Security" security: "Security"
signin: "Sign in history" signin: "Sign in history"
password: "Password" password: "Password"
@ -867,15 +869,19 @@ common/views/components/drive-settings.vue:
max: "Max" max: "Max"
in-use: "In use" in-use: "In use"
stats: "Statistics" stats: "Statistics"
desktop/views/components/settings.mute.vue: common/views/components/mute-and-block.vue:
no-users: "No muted users" mute-and-block: "Mute / Block"
desktop/views/components/settings.password.vue: mute: "Mute"
block: "Blocking"
no-muted-users: "No muted users"
no-blocked-users: "No blocked users"
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"
enter-new-password: "Enter the new password" enter-new-password: "Enter the new password"
enter-new-password-again: "Enter new password again" enter-new-password-again: "Enter the new password again"
not-match: "The new passwords do not match" not-match: "The new passwords do not match"
changed: "Password updated" changed: "Password changed"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "This post is private" private: "This post is private"
deleted: "This post has been deleted" deleted: "This post has been deleted"
@ -941,41 +947,86 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "Pop-out" popout: "Pop-out"
close: "Close" close: "Close"
desktop/views/pages/admin/admin.vue: admin/views/index.vue:
dashboard: "Dashboard" dashboard: "Dashboard"
instance: "Instance"
emoji: "Emoji"
users: "Users" users: "Users"
update: "Updates" update: "Update"
announcements: "Announcements" announcements: "Announcements"
hashtags: "Hashtags" hashtags: "Hashtags"
desktop/views/pages/admin/admin.dashboard.vue: back-to-misskey: "Back to Misskey"
admin/views/dashboard.vue:
dashboard: "Dashboard" dashboard: "Dashboard"
all-users: "All Users" accounts: "Accounts"
original-users: "Users on this instance" notes: "Notes"
all-notes: "All the posts" drive: "Drive"
original-notes: "Posts on this instance" instances: "Instances"
this-instance: "This instance"
federated: "Federated"
invite: "Invite" invite: "Invite"
banner-url: "Banner URL" banner-url: "Banner URL"
disableRegistration: "Disable new user registration" disableRegistration: "Disable new user registration"
disableLocalTimeline: "Disable the local timeline" disableLocalTimeline: "Disable the local timeline"
desktop/views/pages/admin/admin.suspend-user.vue: admin/views/charts.vue:
title: "Chart"
per-day: "per Day"
per-hour: "per Hour"
federation: "Federation"
notes: "Posts"
users: "Users"
drive: "Drive"
network: "Network"
charts:
federation-instances: "The number of instances: increase/decrease"
federation-instances-total: "Total number of instances"
notes: "The number of posts: increase/decrease (Combined)"
local-notes: "The number of posts: increase/decrease (Local)"
remote-notes: "The number of posts: increase/decrease (Remote)"
notes-total: "Total posts"
users: "The number of users: increase/decrease"
users-total: "Total users"
drive: "Capacity used as the storage: increase/decrease"
drive-total: "Total usage of Drive"
drive-files: "The number of files on the storage: increase/decrease"
drive-files-total: "Total number of files on Drive"
network-requests: "Requests"
network-time: "Response time"
network-usage: "Traffic"
admin/views/users.vue:
suspend-user: "Suspend a user" suspend-user: "Suspend a user"
suspend: "Suspend" suspend: "Suspend"
suspended: "Successfully suspended." suspended: "Successfully suspended."
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "Unsuspend users" unsuspend-user: "Unsuspend users"
unsuspend: "Unsuspend" unsuspend: "Unsuspend"
unsuspended: "The user has successfully unsuspended." unsuspended: "The user has successfully unsuspended."
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "User account verification settings" verify-user: "User account verification settings"
verify: "Verify account" verify: "Verify account"
verified: "The account is now being verified" verified: "The account is now being verified"
desktop/views/pages/admin/admin.unverify-user.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"
desktop/views/pages/admin/admin.announcements.vue: admin/views/emoji.vue:
add-emoji:
title: "Add emoji"
name: "Emoji name"
name-desc: "You can use the characters a~z 0~9 _"
aliases: "Aliases"
aliases-desc: "You can add more than one, separated by spaces."
url: "Image URL"
add: "Add"
emojis:
title: "Emojis"
update: "Update"
remove: "Remove"
admin/views/announcements.vue:
announcements: "Announcements" announcements: "Announcements"
desktop/views/pages/admin/admin.hashtags.vue: save: "Save"
remove: "Remove"
add: "Add"
title: "Title"
text: "Content"
admin/views/hashtags.vue:
hided-tags: "Hidden Tags" hided-tags: "Hidden Tags"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Only media posts" is-media-only: "Only media posts"
@ -1055,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "Mute" mute: "Mute"
muted: "Muting" muted: "Muting"
unmute: "Unmute" unmute: "Unmute"
block: "Block"
unblock: "Unblock"
block-confirm: "Are you sure block this user?"
push-to-a-list: "Add to list" push-to-a-list: "Add to list"
list-pushed: "Successfully added {user} to {list}." list-pushed: "Successfully added {user} to {list}."
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1320,6 +1374,7 @@ mobile/views/pages/settings.vue:
sound: "Sounds" sound: "Sounds"
enable-sounds: "Enable sounds" enable-sounds: "Enable sounds"
mark-as-read-all-unread-notes: "Mark all posts as read" mark-as-read-all-unread-notes: "Mark all posts as read"
password: "Password"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "Follows you" follows-you: "Follows you"
following: "Following" following: "Following"
@ -1329,6 +1384,10 @@ mobile/views/pages/user.vue:
timeline: "Timeline" timeline: "Timeline"
media: "Media" media: "Media"
is-suspended: "This account has been suspended." is-suspended: "This account has been suspended."
mute: "Mute"
unmute: "Unmute"
block: "Block"
unblock: "Unblock"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "Recent notes" recent-notes: "Recent notes"
images: "Images" images: "Images"

View File

@ -186,6 +186,7 @@ common:
stack-left: "A la izqda." stack-left: "A la izqda."
pop-right: "A la dcha." pop-right: "A la dcha."
dev: "アプリの作成に失敗しました。再度お試しください。" dev: "アプリの作成に失敗しました。再度お試しください。"
ai-chan-kawaii: "藍ちゃかわいい"
auth/views/form.vue: auth/views/form.vue:
share-access: "¿Deseas <b>permitir</b> a <i>{{ app.name }}</i> acceder a tu cuenta?" share-access: "¿Deseas <b>permitir</b> a <i>{{ app.name }}</i> acceder a tu cuenta?"
permission-ask: "La aplicación requiere los siguientes permisos:" permission-ask: "La aplicación requiere los siguientes permisos:"
@ -741,7 +742,8 @@ desktop/views/components/settings.vue:
profile: "Perfil" profile: "Perfil"
notification: "Notificación" notification: "Notificación"
apps: "Aplicaciones" apps: "Aplicaciones"
mute: "Silenciar" mute-and-block: "ミュート/ブロック"
blocking: "ブロック"
security: "Seguridad" security: "Seguridad"
signin: "Historial de inicios de sesión" signin: "Historial de inicios de sesión"
password: "Contraseña" password: "Contraseña"
@ -867,15 +869,19 @@ common/views/components/drive-settings.vue:
max: "容量" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計" stats: "統計"
desktop/views/components/settings.mute.vue: common/views/components/mute-and-block.vue:
no-users: "No hay usuarios silenciados" mute-and-block: "ミュートとブロック"
desktop/views/components/settings.password.vue: mute: "ミュート"
reset: "Cambiar contraseña" block: "ブロック"
enter-current-password: "Ingresar contraseña actual" no-muted-users: "ミュートしているユーザーはいません"
enter-new-password: "Ingresar nueva contraseña" no-blocked-users: "ブロックしているユーザーはいません"
enter-new-password-again: "Ingresar nueva contraseña de nuevo" common/views/components/password-settings.vue:
not-match: "Las nuevas contraseñas no se corresponden consigo mismas" reset: "パスワードを変更する"
changed: "Contraseña actualizada" enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください"
enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
@ -941,41 +947,86 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス"
emoji: "カスタム絵文字"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
desktop/views/pages/admin/admin.dashboard.vue: back-to-misskey: "Misskeyに戻る"
admin/views/dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" accounts: "アカウント"
original-users: "このインスタンスのユーザー" notes: "投稿"
all-notes: "全ての投稿" drive: "ドライブ"
original-notes: "このインスタンスの投稿" instances: "インスタンス"
this-instance: "このインスタンス"
federated: "連合"
invite: "招待" invite: "招待"
banner-url: "Banner URL" banner-url: "Banner URL"
disableRegistration: "Disable new user registration" disableRegistration: "Disable new user registration"
disableLocalTimeline: "Disable the local timeline" disableLocalTimeline: "Disable the local timeline"
desktop/views/pages/admin/admin.suspend-user.vue: admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
network: "ネットワーク"
charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の積算"
users: "ユーザーの増減"
users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト"
network-time: "応答時間"
network-usage: "通信量"
admin/views/users.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
suspend: "凍結" suspend: "凍結"
suspended: "凍結しました" suspended: "凍結しました"
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除" unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除" unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました" unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする" verify: "公式アカウントにする"
verified: "公式アカウントにしました" verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.announcements.vue: admin/views/emoji.vue:
add-emoji:
title: "絵文字の登録"
name: "絵文字名"
name-desc: "a~z 0~9 _ の文字が使えます。"
aliases: "エイリアス"
aliases-desc: "スペースで区切って複数設定できます。"
url: "絵文字画像URL"
add: "追加"
emojis:
title: "絵文字一覧"
update: "更新"
remove: "削除"
admin/views/announcements.vue:
announcements: "お知らせ" announcements: "お知らせ"
desktop/views/pages/admin/admin.hashtags.vue: save: "保存"
remove: "削除"
add: "追加"
title: "タイトル"
text: "内容"
admin/views/hashtags.vue:
hided-tags: "Hidden Tags" hided-tags: "Hidden Tags"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
@ -1055,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1320,6 +1374,7 @@ mobile/views/pages/settings.vue:
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする" mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"
@ -1329,6 +1384,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"
images: "画像" images: "画像"

View File

@ -28,11 +28,11 @@ common:
BSoD: BSoD:
fatal-error: ":( 致命的な問題が発生しました。" fatal-error: ":( 致命的な問題が発生しました。"
update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。" update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
error-code: "エラーコード" error-code: "Code derreur"
browser-version: "ブラウザ バージョン" browser-version: "Version du navigateur"
client-version: "クライアント バージョン" client-version: "La version du client"
email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。" email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
thanks: "Thank you for using Misskey." thanks: "Merci davoir choisi dutiliser Misskey."
got-it: "J'ai compris !" got-it: "J'ai compris !"
customization-tips: customization-tips:
title: "Conseils de personnalisation" title: "Conseils de personnalisation"
@ -62,7 +62,7 @@ common:
years_ago: "Il y a {} an·s" years_ago: "Il y a {} an·s"
month-and-day: "{month} mois/{day} jour" month-and-day: "{month} mois/{day} jour"
trash: "Corbeille" trash: "Corbeille"
drive: "ドライブ" drive: "Drive"
weekday-short: weekday-short:
sunday: "D" sunday: "D"
monday: "L" monday: "L"
@ -124,12 +124,12 @@ common:
reduce-motion: "Réduire les animations dans linterface utilisateur" reduce-motion: "Réduire les animations dans linterface utilisateur"
this-setting-is-this-device-only: "Uniquement sur cet appareil" this-setting-is-this-device-only: "Uniquement sur cet appareil"
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: "このユーザー情報はコピーです。" is-remote-user: "Ces informations utilisateur ont été copiées."
is-remote-post: "この投稿情報はコピーです。" is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "正確な情報を見る" view-on-remote: "Consulter le profil complet"
error: error:
title: '問題が発生しました' title: 'Une erreur est survenue'
retry: 'やり直す' retry: 'Réessayer'
reversi: reversi:
drawn: "Partie nulle" drawn: "Partie nulle"
my-turn: "Cest votre tour" my-turn: "Cest votre tour"
@ -185,7 +185,8 @@ common:
rename: "Renommer" rename: "Renommer"
stack-left: "Vers la gauche" stack-left: "Vers la gauche"
pop-right: "Vers la droite" pop-right: "Vers la droite"
dev: "アプリの作成に失敗しました。再度お試しください。" dev: "Échec lors de la création de lapplication. Veuillez réessayer."
ai-chan-kawaii: "藍ちゃかわいい"
auth/views/form.vue: auth/views/form.vue:
share-access: "Désirez-vous <b>autoriser</b> <i>{{ app.name }}</i> à avoir accès à votre compte ?" share-access: "Désirez-vous <b>autoriser</b> <i>{{ app.name }}</i> à avoir accès à votre compte ?"
permission-ask: "Cette application nécessite les autorisations suivantes :" permission-ask: "Cette application nécessite les autorisations suivantes :"
@ -444,7 +445,7 @@ common/views/components/profile-editor.vue:
is-cat: "Ce compte est un Chat" is-cat: "Ce compte est un Chat"
is-bot: "Ce compte est un Bot" is-bot: "Ce compte est un Bot"
is-locked: "Demandes dabonnements requièrent lapprobation" is-locked: "Demandes dabonnements requièrent lapprobation"
careful-bot: "Botからのフォローだけ承認制にする" careful-bot: "Les demandes dabonnements venant de Bots requièrent lapprobation"
advanced: "Avancé" advanced: "Avancé"
privacy: "Vie privée" privacy: "Vie privée"
save: "Mettre à jour le profil" save: "Mettre à jour le profil"
@ -501,7 +502,7 @@ common/views/widgets/tips.vue:
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます" tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "Vous pouvez mettre un texte en surbrillance en le mettant entre ** **" tips-line17: "Vous pouvez mettre un texte en surbrillance en le mettant entre ** **"
tips-line19: "Plusieurs fenêtres peuvent être détachées en dehors du navigateur." tips-line19: "Plusieurs fenêtres peuvent être détachées en dehors du navigateur."
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています" tips-line20: "Pourcentage sur le widget calendrier qui indique le pourcentage de temps passé"
tips-line21: "Vous pouvez aussi utiliser l'API pour développer des Bots." tips-line21: "Vous pouvez aussi utiliser l'API pour développer des Bots."
tips-line23: "Mayu est mignone avec ses sourcils." tips-line23: "Mayu est mignone avec ses sourcils."
tips-line24: "Misskey a vu le jour en 2014" tips-line24: "Misskey a vu le jour en 2014"
@ -542,24 +543,24 @@ desktop/views/components/charts.vue:
title: "Graphiques" title: "Graphiques"
per-day: "par jour" per-day: "par jour"
per-hour: "par heure" per-hour: "par heure"
federation: "フェデレーション" federation: "Fédération"
notes: "Publications" notes: "Publications"
users: "Utilisateurs" users: "Utilisateurs"
drive: "Drive" drive: "Drive"
network: "Réseau" network: "Réseau"
charts: charts:
federation-instances: "インスタンスの増減" federation-instances: "Nombre dinstances : augmentation/diminution"
federation-instances-total: "インスタンスの積算" federation-instances-total: "Nombre total dinstances"
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
notes-total: "Total des notes" notes-total: "Total des notes"
users: "Nombre dutilisateurs·trices : augmentation/diminution" users: "Nombre dutilisateurs·trices : augmentation/diminution"
users-total: "ユーザーの積算" users-total: "Nombre total des utilisateurs·rices"
drive: "ドライブ使用量の増減" drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の積算" drive-total: "Utilisation totale du lecteur"
drive-files: "ドライブのファイル数の増減" drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の積算" drive-files-total: "Nombre total de fichiers sur le lecteur"
network-requests: "Requêtes" network-requests: "Requêtes"
network-time: "Temps de réponse" network-time: "Temps de réponse"
network-usage: "Traffic" network-usage: "Traffic"
@ -679,10 +680,10 @@ desktop/views/components/note.vue:
reposted-by: "Partagé par {}" reposted-by: "Partagé par {}"
reply: "Répondre" reply: "Répondre"
renote: "Partager" renote: "Partager"
add-reaction: "リアクション" add-reaction: "Ajouter votre réaction"
detail: "詳細" detail: "Détails"
private: "この投稿は非公開です" private: "Cette publication est privée"
deleted: "この投稿は削除されました" deleted: "Cette publication a été supprimée"
desktop/views/components/notes.vue: desktop/views/components/notes.vue:
error: "Échec du chargement." error: "Échec du chargement."
retry: "Réessayer" retry: "Réessayer"
@ -741,7 +742,8 @@ desktop/views/components/settings.vue:
profile: "Profil" profile: "Profil"
notification: "Notification" notification: "Notification"
apps: "Applications" apps: "Applications"
mute: "Mettre en sourdine" mute-and-block: "ミュート/ブロック"
blocking: "ブロック"
security: "Sécurité" security: "Sécurité"
signin: "Historique de connexion" signin: "Historique de connexion"
password: "Mot de Passe" password: "Mot de Passe"
@ -765,7 +767,7 @@ desktop/views/components/settings.vue:
deck-default: "デッキをデフォルトのUIにする" deck-default: "デッキをデフォルトのUIにする"
display: "Affichage et design" display: "Affichage et design"
customize: "Personnaliser l'Accueil" customize: "Personnaliser l'Accueil"
wallpaper: "壁紙" wallpaper: "Arrière plan"
choose-wallpaper: "Sélectionner un fond d'écran" choose-wallpaper: "Sélectionner un fond d'écran"
delete-wallpaper: "Supprimer le fond d'écran" delete-wallpaper: "Supprimer le fond d'écran"
dark-mode: "Mode nuit" dark-mode: "Mode nuit"
@ -777,14 +779,14 @@ desktop/views/components/settings.vue:
suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie" suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie"
show-clock-on-header: "Afficher l'horloge à droite sur le coté supérieur" show-clock-on-header: "Afficher l'horloge à droite sur le coté supérieur"
show-reply-target: "Afficher les réponses" show-reply-target: "Afficher les réponses"
timeline: "タイムライン" timeline: "Chronologie"
show-my-renotes: "Afficher mes republications dans le fil" show-my-renotes: "Afficher mes republications dans le fil"
show-renoted-my-notes: "Afficher mes republications dans les fils" show-renoted-my-notes: "Afficher mes republications dans les fils"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する" show-local-renotes: "Afficher les partages locaux sur les fils"
show-maps: "Afficher la carte" show-maps: "Afficher la carte"
deck-column-align: "デッキのカラムの位置" deck-column-align: "デッキのカラムの位置"
deck-column-align-center: "中央" deck-column-align-center: "Centrer"
deck-column-align-left: "" deck-column-align-left: "À gauche"
sound: "Son" sound: "Son"
enable-sounds: "Activer le son" enable-sounds: "Activer le son"
enable-sounds-desc: "Jouer un son lorsque vous recevez un message. Ce paramètre est sauvegardé dans le navigateur." enable-sounds-desc: "Jouer un son lorsque vous recevez un message. Ce paramètre est sauvegardé dans le navigateur."
@ -825,7 +827,7 @@ desktop/views/components/settings.vue:
tools: "Outils" tools: "Outils"
task-manager: "Gestionnaire de tâches" task-manager: "Gestionnaire de tâches"
third-parties: "Services tiers" third-parties: "Services tiers"
navbar-position: "ナビゲーションバーの位置" navbar-position: "Position de la barre de navigation"
navbar-position-top: "En haut" navbar-position-top: "En haut"
navbar-position-left: "à gauche" navbar-position-left: "à gauche"
navbar-position-right: "à droite" navbar-position-right: "à droite"
@ -850,31 +852,35 @@ desktop/views/components/settings.2fa.vue:
common/views/components/api-settings.vue: common/views/components/api-settings.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。" regeneration-of-token: "Si votre jeton est compromis, vous pouvez le régénérer."
regenerate-token: "トークンを再生成" regenerate-token: "Régénérer le jeton"
token: "Token:" token: "Jeton :"
enter-password: "パスワードを入力してください" enter-password: "Entrez le mot de passe"
console: console:
title: 'APIコンソール' title: 'Console API'
endpoint: 'エンドポイント' endpoint: 'Point de terminaison'
parameter: 'パラメータ' parameter: 'Paramètres'
send: '送信' send: 'Envoyer'
sending: '応答待ち' sending: 'Envoi en cours'
response: '結果' response: 'Résultat'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "Aucune application autorisée" no-apps: "Aucune application autorisée"
common/views/components/drive-settings.vue: common/views/components/drive-settings.vue:
max: "容量" max: "Maximale"
in-use: "使用中" in-use: "utilisé"
stats: "統計" stats: "Statistiques"
desktop/views/components/settings.mute.vue: common/views/components/mute-and-block.vue:
no-users: "Aucun utilisateurs mis en sourdine" mute-and-block: "Silencer / Bloquer"
desktop/views/components/settings.password.vue: mute: "Mettre en sourdine"
reset: "Changer votre mot de passe" block: "En cours blocage"
no-muted-users: "Aucun utilisateur·rice nest mis·e en sourdine"
no-blocked-users: "Aucun utilisateur·rice nest bloqué·e"
common/views/components/password-settings.vue:
reset: "Modifier le mot de passe"
enter-current-password: "Entrez votre mot de passe actuel" enter-current-password: "Entrez votre mot de passe actuel"
enter-new-password: "Entrez votre nouveau mot de passe" enter-new-password: "Saisissez le nouveau mot de passe"
enter-new-password-again: "Entrez à nouveau le nouveau mot de passe" enter-new-password-again: "Entrez à nouveau le nouveau mot de passe"
not-match: "Le nouveau mot de passe ne correspond pas." not-match: "Les nouveaux mots de passe ne sont pas identiques"
changed: "Mot de passe modifié avec succès" changed: "Mot de passe modifié avec succès"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "cette publication est privée" private: "cette publication est privée"
@ -941,55 +947,100 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "Fermer" close: "Fermer"
desktop/views/pages/admin/admin.vue: admin/views/index.vue:
dashboard: "Tableau de bord" dashboard: "Tableau de bord"
instance: "Instance"
emoji: "Emoji"
users: "Utilisateur·rice·s" users: "Utilisateur·rice·s"
update: "Mises à jour" update: "Mise à jour"
announcements: "お知らせ" announcements: "Annonces"
hashtags: "ハッシュタグ" hashtags: "Hashtags"
desktop/views/pages/admin/admin.dashboard.vue: back-to-misskey: "Retour vers Misskey"
admin/views/dashboard.vue:
dashboard: "Tableau de bord" dashboard: "Tableau de bord"
all-users: "Toutes les utilisateurrices" accounts: "Comptes"
original-users: "Utilisateur·rice·s sur cette instance" notes: "Notes"
all-notes: "Toutes les publications" drive: "Lecteur"
original-notes: "Publications sur cette instance" instances: "Instances"
invite: "Invitation" this-instance: "Cette instance"
banner-url: "Banner URL" federated: "Fédérées"
disableRegistration: "Disable new user registration" invite: "Inviter"
disableLocalTimeline: "Disable the local timeline" banner-url: "URL de la bannière"
desktop/views/pages/admin/admin.suspend-user.vue: disableRegistration: "Désactiver lenregistrement de nouveaux utilisateur·rice·s"
disableLocalTimeline: "Désactiver le fil local"
admin/views/charts.vue:
title: "Graph"
per-day: "par jour"
per-hour: "par heure"
federation: "Fédération"
notes: "Publications"
users: "Utilisateur·rice·s"
drive: "Lecteur"
network: "Réseau"
charts:
federation-instances: "Nombre dinstances : augmentation/diminution"
federation-instances-total: "Nombre total dinstances"
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "Total des publications"
users: "Nombre dutilisateur·rice·s : augmentation/diminution"
users-total: "Nombre total des utilisateur·rice·s"
drive: "ドライブ使用量の増減"
drive-total: "Utilisation totale du lecteur"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "Nombre total de fichiers sur le lecteur"
network-requests: "Requêtes"
network-time: "Temps de réponse"
network-usage: "Traffic"
admin/views/users.vue:
suspend-user: "Suspendre un·e utilisateur·rice" suspend-user: "Suspendre un·e utilisateur·rice"
suspend: "Suspendre" suspend: "Suspendre"
suspended: "Suspendu avec succès" suspended: "Suspendu·e avec succès."
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "Lever la suspension dutilisateur·rice·s" unsuspend-user: "Lever la suspension dutilisateur·rice·s"
unsuspend: "Suspension levée" unsuspend: "Suspension levée"
unsuspended: "La suspension de lutilisateur·rice a été levée avec succès" unsuspended: "La suspension de lutilisateur·rice a été levée avec succès"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "Paramètres de vérification du compte utilisateur" verify-user: "Paramètres de vérification du compte utilisateur"
verify: "Vérification du compte" verify: "公式アカウントにする"
verified: "Le compte a été vérifié" verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "Ôter la vérification du compte" unverify: "Ôter la vérification du compte"
unverified: "Ce compte n'est pas vérifié" unverified: "Ce compte n'est plus vérifié"
desktop/views/pages/admin/admin.announcements.vue: admin/views/emoji.vue:
announcements: "お知らせ" add-emoji:
desktop/views/pages/admin/admin.hashtags.vue: title: "Ajouter un émoji"
hided-tags: "Hidden Tags" name: "Nom de lémoji"
name-desc: "a~z 0~9 _ の文字が使えます。"
aliases: "Aliases"
aliases-desc: "Vous pouvez définir plus dun, séparés par des espaces."
url: "URL de limage"
add: "Ajouter"
emojis:
title: "絵文字一覧"
update: "更新"
remove: "削除"
admin/views/announcements.vue:
announcements: "Annonces"
save: "Enregistrer"
remove: "Supprimer"
add: "Ajouter"
title: "Titre"
text: "Contenu"
admin/views/hashtags.vue:
hided-tags: "Tags cachés"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Les publications médias uniquement" is-media-only: "Les publications médias uniquement"
is-media-view: "Vue média" is-media-view: "Vue média"
edit: "Options" edit: "Options"
desktop/views/pages/deck/deck.user-column.vue: desktop/views/pages/deck/deck.user-column.vue:
posts: "投稿" posts: "Publications"
following: "フォロー" following: "Suit"
followers: "フォロワー" followers: "Abonné·e·s"
images: "画像" images: "Images"
activity: "アクティビティ" activity: "Activité"
timeline: "タイムライン" timeline: "Chronologie"
pinned-notes: "ピン留めされた投稿" pinned-notes: "Publications épinglées"
push-to-a-list: "リストに追加" push-to-a-list: "Ajouter à la liste"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "Toutes les utilisateurrices" all-users: "Toutes les utilisateurrices"
original-users: "Utilisateur·rice·s sur cette instance" original-users: "Utilisateur·rice·s sur cette instance"
@ -1042,7 +1093,7 @@ desktop/views/pages/user/user.friends.vue:
no-users: "Pas d'utilisateurs" no-users: "Pas d'utilisateurs"
desktop/views/pages/user/user.vue: desktop/views/pages/user/user.vue:
is-suspended: "Ce compte a été suspendu." is-suspended: "Ce compte a été suspendu."
last-used-at: "最終アクセス" last-used-at: "Actif·ive pour la dernière fois"
desktop/views/pages/user/user.photos.vue: desktop/views/pages/user/user.photos.vue:
title: "Photos" title: "Photos"
loading: "Chargement en cours" loading: "Chargement en cours"
@ -1055,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "Mettre en sourdine" mute: "Mettre en sourdine"
muted: "Muting" muted: "Muting"
unmute: "Enlever la sourdine" unmute: "Enlever la sourdine"
block: "Bloquer"
unblock: "Débloquer"
block-confirm: "Bloquer cet utilisateur ?"
push-to-a-list: "Ajouter à la liste" push-to-a-list: "Ajouter à la liste"
list-pushed: "Vous avez ajouté {user} à la liste {list}." list-pushed: "Vous avez ajouté {user} à la liste {list}."
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1062,10 +1116,10 @@ desktop/views/pages/user/user.header.vue:
following: "Suit" following: "Suit"
followers: "Abonné·e·s" followers: "Abonné·e·s"
is-bot: "Ce compte est un Bot" is-bot: "Ce compte est un Bot"
years-old: "" years-old: "ans dâge"
year: "" year: "Année"
month: "" month: "Mois"
day: "" day: "Jour"
desktop/views/pages/user/user.timeline.vue: desktop/views/pages/user/user.timeline.vue:
default: "Publications" default: "Publications"
with-replies: "Publications et réponses" with-replies: "Publications et réponses"
@ -1124,8 +1178,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "Hash (md5)" hash: "Hash (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "CW" nsfw: "CW"
mark-as-sensitive: "閲覧注意に設定" mark-as-sensitive: "Marquer comme sensible"
unmark-as-sensitive: "閲覧注意を解除" unmark-as-sensitive: "Ne pas marquer comme sensible"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "Le contenu est NSFW" sensitive: "Le contenu est NSFW"
click-to-show: "Cliquer pour afficher" click-to-show: "Cliquer pour afficher"
@ -1285,8 +1339,8 @@ mobile/views/pages/settings.vue:
timeline: "Fil d'actualité" timeline: "Fil d'actualité"
show-reply-target: "Afficher les réponses" show-reply-target: "Afficher les réponses"
show-my-renotes: "Afficher mes republications" show-my-renotes: "Afficher mes republications"
show-renoted-my-notes: "自分の投稿のRenoteを表示する" show-renoted-my-notes: "Afficher mes publications partagées"
show-local-renotes: "ローカルの投稿のRenoteを表示する" show-local-renotes: "Afficher les publications partagées localement"
post-style: "Style de la publication" post-style: "Style de la publication"
post-style-standard: "Standard" post-style-standard: "Standard"
post-style-smart: "Intelligent" post-style-smart: "Intelligent"
@ -1319,7 +1373,8 @@ mobile/views/pages/settings.vue:
signout: "Déconnexion" signout: "Déconnexion"
sound: "Sons" sound: "Sons"
enable-sounds: "Activer les sons" enable-sounds: "Activer les sons"
mark-as-read-all-unread-notes: "すべての投稿を既読にする" mark-as-read-all-unread-notes: "Marquer toutes les publications comme lues"
password: "Mot de Passe"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "Vous suit" follows-you: "Vous suit"
following: "Abonnements" following: "Abonnements"
@ -1329,6 +1384,10 @@ mobile/views/pages/user.vue:
timeline: "Fil d'actualité" timeline: "Fil d'actualité"
media: "Media" media: "Media"
is-suspended: "This account has been suspended." is-suspended: "This account has been suspended."
mute: "Mettre en sourdine"
unmute: "Enlever la sourdine"
block: "Bloquer"
unblock: "Débloquer"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "Notes récentes" recent-notes: "Notes récentes"
images: "Images" images: "Images"
@ -1375,28 +1434,28 @@ docs:
dev/views/index.vue: dev/views/index.vue:
manage-apps: "Gestion des applications" manage-apps: "Gestion des applications"
dev/views/apps.vue: dev/views/apps.vue:
manage-apps: "アプリを管理" manage-apps: "Gestion des applications"
create-app: "アプリ作成" create-app: "Créer une app"
app-missing: "アプリなし" app-missing: "Aucune application"
dev/views/new-app.vue: dev/views/new-app.vue:
create-app: "アプリケーションの作成" create-app: "Création dune application"
app-name: "アプリケーション名" app-name: "Nom de lapplication"
app-name-desc: "あなたのアプリの名称。" app-name-desc: "Le nom de votre application"
app-name-ex: "ex) Misskey for iOS" app-name-ex: "p. ex. Misskey pour iOS"
app-overview: "アプリの概要" app-overview: "Description courte de lapplication"
app-desc: "あなたのアプリの簡単な説明や紹介。" app-desc: "Brève description introductive à votre application."
app-desc-ex: "ex) Misskey iOSクライアント。" app-desc-ex: "p. ex) Misskey pour iOS"
callback-url: "コールバックURL (オプション)" callback-url: "コールバックURL (オプション)"
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。" callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
authority: "権限" authority: "Autorisations "
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。" authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。" authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
account-read: "アカウントの情報を見る。" account-read: "Afficher les informations du compte"
account-write: "アカウントの情報を操作する。" account-write: "Modifications des informations du compte"
note-write: "投稿する。" note-write: "Publications."
reaction-write: "リアクションしたりリアクションをキャンセルする。" reaction-write: "Ajout et suppression de réactions."
following-write: "フォローしたりフォロー解除する。" following-write: "Sabonner et se désabonner."
drive-read: "ドライブを見る。" drive-read: "Lecture du Drive."
drive-write: "ドライブを操作する。" drive-write: "Téléversement/suppression des fichiers de votre Lecteur."
notification-read: "通知を見る。" notification-read: "Lire vos notifications."
notification-write: "通知を操作する。" notification-write: "Gestion de vos notifications."

View File

@ -186,6 +186,7 @@ common:
stack-left: "左に重ねる" stack-left: "左に重ねる"
pop-right: "右に出す" pop-right: "右に出す"
dev: "アプリの作成に失敗しました。再度お試しください。" dev: "アプリの作成に失敗しました。再度お試しください。"
ai-chan-kawaii: "藍ちゃかわいい"
auth/views/form.vue: auth/views/form.vue:
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?" share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
permission-ask: "このアプリは次の権限を要求しています:" permission-ask: "このアプリは次の権限を要求しています:"
@ -741,7 +742,8 @@ desktop/views/components/settings.vue:
profile: "プロフィール" profile: "プロフィール"
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute-and-block: "ミュート/ブロック"
blocking: "ブロック"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
@ -867,9 +869,13 @@ common/views/components/drive-settings.vue:
max: "容量" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計" stats: "統計"
desktop/views/components/settings.mute.vue: common/views/components/mute-and-block.vue:
no-users: "ミュートしているユーザーはいません" mute-and-block: "ミュートとブロック"
desktop/views/components/settings.password.vue: mute: "ミュート"
block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません"
common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください" enter-new-password: "新しいパスワードを入力してください"
@ -941,41 +947,86 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス"
emoji: "カスタム絵文字"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
desktop/views/pages/admin/admin.dashboard.vue: back-to-misskey: "Misskeyに戻る"
admin/views/dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" accounts: "アカウント"
original-users: "このインスタンスのユーザー" notes: "投稿"
all-notes: "全ての投稿" drive: "ドライブ"
original-notes: "このインスタンスの投稿" instances: "インスタンス"
this-instance: "このインスタンス"
federated: "連合"
invite: "招待" invite: "招待"
banner-url: "Banner URL" banner-url: "Banner URL"
disableRegistration: "Disable new user registration" disableRegistration: "Disable new user registration"
disableLocalTimeline: "Disable the local timeline" disableLocalTimeline: "Disable the local timeline"
desktop/views/pages/admin/admin.suspend-user.vue: admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
network: "ネットワーク"
charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の積算"
users: "ユーザーの増減"
users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト"
network-time: "応答時間"
network-usage: "通信量"
admin/views/users.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
suspend: "凍結" suspend: "凍結"
suspended: "凍結しました" suspended: "凍結しました"
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除" unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除" unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました" unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする" verify: "公式アカウントにする"
verified: "公式アカウントにしました" verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.announcements.vue: admin/views/emoji.vue:
add-emoji:
title: "絵文字の登録"
name: "絵文字名"
name-desc: "a~z 0~9 _ の文字が使えます。"
aliases: "エイリアス"
aliases-desc: "スペースで区切って複数設定できます。"
url: "絵文字画像URL"
add: "追加"
emojis:
title: "絵文字一覧"
update: "更新"
remove: "削除"
admin/views/announcements.vue:
announcements: "お知らせ" announcements: "お知らせ"
desktop/views/pages/admin/admin.hashtags.vue: save: "保存"
remove: "削除"
add: "追加"
title: "タイトル"
text: "内容"
admin/views/hashtags.vue:
hided-tags: "Hidden Tags" hided-tags: "Hidden Tags"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
@ -1055,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1320,6 +1374,7 @@ mobile/views/pages/settings.vue:
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする" mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"
@ -1329,6 +1384,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"
images: "画像" images: "画像"

View File

@ -131,6 +131,7 @@ common:
show-full-acct: "ユーザー名のホストを省略しない" show-full-acct: "ユーザー名のホストを省略しない"
reduce-motion: "UIの動きを減らす" reduce-motion: "UIの動きを減らす"
this-setting-is-this-device-only: "このデバイスのみ" this-setting-is-this-device-only: "このデバイスのみ"
use-os-default-emojis: "OS標準の絵文字を使用"
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
@ -201,6 +202,7 @@ common:
pop-right: "右に出す" pop-right: "右に出す"
dev: "アプリの作成に失敗しました。再度お試しください。" dev: "アプリの作成に失敗しました。再度お試しください。"
ai-chan-kawaii: "藍ちゃかわいい"
auth/views/form.vue: auth/views/form.vue:
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?" share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
@ -416,6 +418,7 @@ common/views/components/signin.vue:
signin: "サインイン" signin: "サインイン"
or: "または" or: "または"
signin-with-twitter: "Twitterでログイン" signin-with-twitter: "Twitterでログイン"
signin-with-github: "GitHubでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue: common/views/components/signup.vue:
@ -459,6 +462,14 @@ common/views/components/twitter-setting.vue:
connect: "Twitterと接続する" connect: "Twitterと接続する"
disconnect: "切断する" disconnect: "切断する"
common/views/components/github-setting.vue:
description: "お使いのGitHubアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでGitHubアカウント情報が表示されるようになったり、GitHubを用いた便利なサインインを利用できるようになります。"
connected-to: "次のGitHubアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "GitHubと接続する"
disconnect: "切断する"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "待機中" waiting: "待機中"
@ -598,32 +609,6 @@ desktop/views/components/calendar.vue:
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
network: "ネットワーク"
charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の積算"
users: "ユーザーの増減"
users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト"
network-time: "応答時間"
network-usage: "通信量"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
@ -832,7 +817,8 @@ desktop/views/components/settings.vue:
profile: "プロフィール" profile: "プロフィール"
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute-and-block: "ミュート/ブロック"
blocking: "ブロック"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
@ -961,6 +947,7 @@ common/views/components/api-settings.vue:
title: 'APIコンソール' title: 'APIコンソール'
endpoint: 'エンドポイント' endpoint: 'エンドポイント'
parameter: 'パラメータ' parameter: 'パラメータ'
credential-info: "「i」パラメータは自動で付与されます。"
send: '送信' send: '送信'
sending: '応答待ち' sending: '応答待ち'
response: '結果' response: '結果'
@ -973,10 +960,14 @@ common/views/components/drive-settings.vue:
in-use: "使用中" in-use: "使用中"
stats: "統計" stats: "統計"
desktop/views/components/settings.mute.vue: common/views/components/mute-and-block.vue:
no-users: "ミュートしているユーザーはいません" mute-and-block: "ミュートとブロック"
mute: "ミュート"
block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません"
desktop/views/components/settings.password.vue: common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください" enter-new-password: "新しいパスワードを入力してください"
@ -1064,48 +1055,141 @@ desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス"
emoji: "カスタム絵文字"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
back-to-misskey: "Misskeyに戻る"
desktop/views/pages/admin/admin.dashboard.vue: admin/views/dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" accounts: "アカウント"
original-users: "このインスタンスのユーザー" notes: "投稿"
all-notes: "全ての投稿" drive: "ドライブ"
original-notes: "このインスタンスの投稿" instances: "インスタンス"
invite: "招待" this-instance: "このインスタンス"
banner-url: "Banner URL" federated: "連合"
disableRegistration: "Disable new user registration"
disableLocalTimeline: "Disable the local timeline"
desktop/views/pages/admin/admin.suspend-user.vue: admin/views/instance.vue:
instance: "インスタンス"
instance-name: "インスタンス名"
instance-description: "インスタンスの紹介"
banner-url: "バナー画像URL"
languages: "インスタンスの対象言語"
languages-desc: "スペースで区切って複数設定できます。"
maintainer-config: "管理者情報"
maintainer-name: "管理者名"
maintainer-email: "管理者の連絡先"
drive-config: "ドライブの設定"
cache-remote-files: "リモートのファイルをキャッシュする"
cache-remote-files-desc: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。そのためサーバーのストレージを節約できますが、プライバシー設定で直リンクを無効にしているユーザーにはファイルが見えなくなったり、サムネイルが生成されないので通信量が増加します。通常はこの設定をオンにしておくことをおすすめします。"
local-drive-capacity-mb: "ローカルユーザーひとりあたりのドライブ容量"
remote-drive-capacity-mb: "リモートユーザーひとりあたりのドライブ容量"
mb: "メガバイト単位"
recaptcha-config: "reCAPTCHAの設定"
recaptcha-info: "reCAPTCHAを有効にする場合、reCAPTCHAトークンを取得する必要があります。https://www.google.com/recaptcha/intro/ にアクセスしてトークンを取得してください。"
enable-recaptcha: "reCAPTCHAを有効にする"
recaptcha-site-key: "reCAPTCHA site key"
recaptcha-secret-key: "reCAPTCHA secret key"
twitter-integration-config: "Twitter連携の設定"
twitter-integration-info: "コールバックURLは /api/tw/cb に設定します。"
enable-twitter-integration: "Twitter連携を有効にする"
twitter-integration-consumer-key: "Consumer key"
twitter-integration-consumer-secret: "Consumer secret"
github-integration-config: "GitHub連携の設定"
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
enable-github-integration: "GitHub連携を有効にする"
github-integration-client-id: "Client ID"
github-integration-client-secret: "Client secret"
proxy-account-config: "プロキシアカウントの設定"
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
proxy-account-username: "プロキシアカウントのユーザー名"
proxy-account-username-desc: "プロキシとして使用するアカウントのユーザー名を指定してください。"
proxy-account-warn: "アカウントは自動で作られないため、そのユーザー名のアカウントを予め作成しておく必要があります。"
max-note-text-length: "投稿の最大文字数"
disable-registration: "ユーザー登録の受付を停止する"
disable-local-timeline: "ローカルタイムラインを無効にする"
invite: "招待"
save: "保存"
saved: "保存しました"
admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
network: "ネットワーク"
charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の積算"
users: "ユーザーの増減"
users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト"
network-time: "応答時間"
network-usage: "通信量"
admin/views/users.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
suspend: "凍結" suspend: "凍結"
suspended: "凍結しました" suspended: "凍結しました"
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除" unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除" unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました" unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする" verify: "公式アカウントにする"
verified: "公式アカウントにしました" verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.announcements.vue: admin/views/emoji.vue:
announcements: "お知らせ" add-emoji:
title: "絵文字の登録"
name: "絵文字名"
name-desc: "a~z 0~9 _ の文字が使えます。"
aliases: "エイリアス"
aliases-desc: "スペースで区切って複数設定できます。"
url: "絵文字画像URL"
add: "追加"
info: "50KB以下のPNG画像をおすすめします。"
added: "絵文字を登録しました"
emojis:
title: "絵文字一覧"
update: "更新"
remove: "削除"
updated: "更新しました"
remove-emoji:
are-you-sure: "「$1」を削除しますか"
removed: "削除しました"
desktop/views/pages/admin/admin.hashtags.vue: admin/views/announcements.vue:
announcements: "お知らせ"
save: "保存"
remove: "削除"
add: "追加"
title: "タイトル"
text: "内容"
saved: "保存しました"
_remove:
are-you-sure: "「$1」を削除しますか"
removed: "削除しました"
admin/views/hashtags.vue:
hided-tags: "Hidden Tags" hided-tags: "Hidden Tags"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
@ -1123,12 +1207,6 @@ desktop/views/pages/deck/deck.user-column.vue:
pinned-notes: "ピン留めされた投稿" pinned-notes: "ピン留めされた投稿"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@ -1203,6 +1281,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
@ -1507,6 +1588,10 @@ mobile/views/pages/settings.vue:
twitter-connect: "Twitterアカウントに接続する" twitter-connect: "Twitterアカウントに接続する"
twitter-reconnect: "再接続する" twitter-reconnect: "再接続する"
twitter-disconnect: "切断する" twitter-disconnect: "切断する"
github: "GitHub連携"
github-connect: "GitHubアカウントに接続する"
github-reconnect: "再接続する"
github-disconnect: "切断する"
update: "Misskey Update" update: "Misskey Update"
version: "バージョン:" version: "バージョン:"
latest-version: "最新のバージョン:" latest-version: "最新のバージョン:"
@ -1521,6 +1606,7 @@ mobile/views/pages/settings.vue:
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする" mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
@ -1531,6 +1617,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"

View File

@ -186,6 +186,7 @@ common:
stack-left: "左に重ねんで!" stack-left: "左に重ねんで!"
pop-right: "右に出すで!" pop-right: "右に出すで!"
dev: "アプリの作成あかんかったわ。もっぺんやってみて。" dev: "アプリの作成あかんかったわ。もっぺんやってみて。"
ai-chan-kawaii: "藍ちゃめっさべっぴんさんや"
auth/views/form.vue: auth/views/form.vue:
share-access: "<i>{{ app.name }}</i>があんさんのアカウントにアクセスすんのを<b>許可</b>してもええか?" share-access: "<i>{{ app.name }}</i>があんさんのアカウントにアクセスすんのを<b>許可</b>してもええか?"
permission-ask: "このアプリは次の権限を要求してんで:" permission-ask: "このアプリは次の権限を要求してんで:"
@ -741,8 +742,9 @@ desktop/views/components/settings.vue:
profile: "プロフィール" profile: "プロフィール"
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute-and-block: "ミュート/ブロック"
security: "守護神セキュリティ" blocking: "ブロック"
security: "セキュリティ"
signin: "こんな感じでサインインしたらしいで" signin: "こんな感じでサインインしたらしいで"
password: "パスワード" password: "パスワード"
2fa: "二段階認証" 2fa: "二段階認証"
@ -848,32 +850,36 @@ desktop/views/components/settings.2fa.vue:
failed: "なんか設定に失敗したで。トークンを間違えとらんか確認してや。" failed: "なんか設定に失敗したで。トークンを間違えとらんか確認してや。"
info: "次のサインインからは、パスワードに加えてデバイスに出とるトークンを入力してな。" info: "次のサインインからは、パスワードに加えてデバイスに出とるトークンを入力してな。"
common/views/components/api-settings.vue: common/views/components/api-settings.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" intro: "API使うんやったらこのトークンを「i」っちゅうパラメータにくっつけてリクエストできるで。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" caution: "アカウント勝手にいじられるかも知れんから、このトークンは教えたらあかんし、アプリにも書いたらあかんで(これはフリちゃうで)"
regeneration-of-token: "万が一このトークン漏れたりその可能性がある場合はトークンを再生成できます。" regeneration-of-token: "トークン漏れてもうたんやったらもっかい生成できるで。"
regenerate-token: "トークンを再生成" regenerate-token: "トークンもっかい生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入れてや"
console: console:
title: 'APIコンソール' title: 'APIコンソール'
endpoint: 'エンドポイント' endpoint: 'エンドポイント'
parameter: 'パラメータ' parameter: 'パラメータ'
send: '送' send: '送'
sending: '応答待' sending: '応答待っとる'
response: '結果' response: 'こんなん返ってきたわ'
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはあらへんで" no-apps: "連携しているアプリケーションはあらへんで"
common/views/components/drive-settings.vue: common/views/components/drive-settings.vue:
max: "容量" max: "容量"
in-use: "使うとる" in-use: "使うとる"
stats: "統計" stats: "統計"
desktop/views/components/settings.mute.vue: common/views/components/mute-and-block.vue:
no-users: "ミュートしているユーザーはおらんで" mute-and-block: "ミュートとブロック"
desktop/views/components/settings.password.vue: mute: "ミュート"
reset: "パスワードを変更する" block: "ブロック"
no-muted-users: "ミュートしとるユーザーはおらんで"
no-blocked-users: "ブロックしとるユーザーはおらんで"
common/views/components/password-settings.vue:
reset: "パスワード変える"
enter-current-password: "今のパスワードを入れてや" enter-current-password: "今のパスワードを入れてや"
enter-new-password: "さらのパスワード入れてや" enter-new-password: "こんどのパスワード入れてや"
enter-new-password-again: "もういっぺんさらのパスワードを入れてや" enter-new-password-again: "もっぺん入れてや"
not-match: "パスワードがおうとらん" not-match: "パスワードがおうとらん"
changed: "パスワード変えたわ" changed: "パスワード変えたわ"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
@ -941,41 +947,86 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "さいなら" close: "さいなら"
desktop/views/pages/admin/admin.vue: admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス"
emoji: "カスタム絵文字"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "知っといてや" announcements: "知っといてや"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
desktop/views/pages/admin/admin.dashboard.vue: back-to-misskey: "Misskeyに戻る"
admin/views/dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "知り合い全員や" accounts: "アカウント"
original-users: "ここの人らだけ" notes: "投稿"
all-notes: "全ての投稿" drive: "ドライブ"
original-notes: "このインスタンスの投稿" instances: "インスタンス"
this-instance: "ワイのインスタンス"
federated: "連合"
invite: "来てや" invite: "来てや"
banner-url: "Banner URL" banner-url: "Banner URL"
disableRegistration: "Disable new user registration" disableRegistration: "Disable new user registration"
disableLocalTimeline: "Disable the local timeline" disableLocalTimeline: "Disable the local timeline"
desktop/views/pages/admin/admin.suspend-user.vue: admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
network: "ネットワーク"
charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減(統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の積算"
users: "ユーザーの増減"
users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト"
network-time: "応答時間"
network-usage: "通信量"
admin/views/users.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
suspend: "凍結" suspend: "凍結"
suspended: "凍結した" suspended: "凍結しました"
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除" unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除" unsuspend: "凍結の解除"
unsuspended: "凍結を解除した" unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする" verify: "公式アカウントにする"
verified: "公式アカウントにした" verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue: unverify-user: "ユーザーの公式アカウント解除"
unverify-user: "ユーザーの公式アカウントにせーへん" unverify: "公式アカウントを解除する"
unverify: "公式アカウントにはさせへんで" unverified: "公式アカウントを解除しました"
unverified: "公式アカウントを解除したで" admin/views/emoji.vue:
desktop/views/pages/admin/admin.announcements.vue: add-emoji:
announcements: "知っといてや" title: "絵文字の登録"
desktop/views/pages/admin/admin.hashtags.vue: name: "絵文字名"
name-desc: "a~z 0~9 _ の文字が使えます。"
aliases: "エイリアス"
aliases-desc: "スペースで区切って複数設定できます。"
url: "絵文字画像URL"
add: "追加"
emojis:
title: "絵文字一覧"
update: "更新"
remove: "削除"
admin/views/announcements.vue:
announcements: "お知らせ"
save: "保存"
remove: "削除"
add: "追加"
title: "タイトル"
text: "内容"
admin/views/hashtags.vue:
hided-tags: "Hidden Tags" hided-tags: "Hidden Tags"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿だけや" is-media-only: "メディア投稿だけや"
@ -1055,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしとるで" muted: "ミュートしとるで"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加したで。" list-pushed: "{user}を{list}に追加したで。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1320,6 +1374,7 @@ mobile/views/pages/settings.vue:
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンド鳴らす" enable-sounds: "サウンド鳴らす"
mark-as-read-all-unread-notes: "全部もう読んだわ" mark-as-read-all-unread-notes: "全部もう読んだわ"
password: "パスワード"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされとるで" follows-you: "フォローされとるで"
following: "フォロー" following: "フォロー"
@ -1329,6 +1384,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーはあかんわ。凍結されとる。" is-suspended: "このユーザーはあかんわ。凍結されとる。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロックやめたる"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近儲かりまっか?" recent-notes: "最近儲かりまっか?"
images: "画像" images: "画像"

View File

@ -186,6 +186,7 @@ common:
stack-left: "左に重ねる" stack-left: "左に重ねる"
pop-right: "右に出す" pop-right: "右に出す"
dev: "アプリの作成に失敗しました。再度お試しください。" dev: "アプリの作成に失敗しました。再度お試しください。"
ai-chan-kawaii: "藍ちゃかわいい"
auth/views/form.vue: auth/views/form.vue:
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?" share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
permission-ask: "このアプリは次の権限を要求しています:" permission-ask: "このアプリは次の権限を要求しています:"
@ -741,7 +742,8 @@ desktop/views/components/settings.vue:
profile: "プロフィール" profile: "プロフィール"
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute-and-block: "ミュート/ブロック"
blocking: "ブロック"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
@ -867,9 +869,13 @@ common/views/components/drive-settings.vue:
max: "容量" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計" stats: "統計"
desktop/views/components/settings.mute.vue: common/views/components/mute-and-block.vue:
no-users: "ミュートしているユーザーはいません" mute-and-block: "ミュートとブロック"
desktop/views/components/settings.password.vue: mute: "ミュート"
block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません"
common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください" enter-new-password: "新しいパスワードを入力してください"
@ -941,41 +947,86 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス"
emoji: "カスタム絵文字"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
desktop/views/pages/admin/admin.dashboard.vue: back-to-misskey: "Misskeyに戻る"
admin/views/dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" accounts: "アカウント"
original-users: "このインスタンスのユーザー" notes: "投稿"
all-notes: "全ての投稿" drive: "ドライブ"
original-notes: "このインスタンスの投稿" instances: "インスタンス"
this-instance: "このインスタンス"
federated: "連合"
invite: "招待" invite: "招待"
banner-url: "Banner URL" banner-url: "Banner URL"
disableRegistration: "Disable new user registration" disableRegistration: "Disable new user registration"
disableLocalTimeline: "Disable the local timeline" disableLocalTimeline: "Disable the local timeline"
desktop/views/pages/admin/admin.suspend-user.vue: admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
network: "ネットワーク"
charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の積算"
users: "ユーザーの増減"
users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト"
network-time: "応答時間"
network-usage: "通信量"
admin/views/users.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
suspend: "凍結" suspend: "凍結"
suspended: "凍結しました" suspended: "凍結しました"
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除" unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除" unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました" unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする" verify: "公式アカウントにする"
verified: "公式アカウントにしました" verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.announcements.vue: admin/views/emoji.vue:
add-emoji:
title: "絵文字の登録"
name: "絵文字名"
name-desc: "a~z 0~9 _ の文字が使えます。"
aliases: "エイリアス"
aliases-desc: "スペースで区切って複数設定できます。"
url: "絵文字画像URL"
add: "追加"
emojis:
title: "絵文字一覧"
update: "更新"
remove: "削除"
admin/views/announcements.vue:
announcements: "お知らせ" announcements: "お知らせ"
desktop/views/pages/admin/admin.hashtags.vue: save: "保存"
remove: "削除"
add: "追加"
title: "タイトル"
text: "内容"
admin/views/hashtags.vue:
hided-tags: "Hidden Tags" hided-tags: "Hidden Tags"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
@ -1055,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1320,6 +1374,7 @@ mobile/views/pages/settings.vue:
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする" mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"
@ -1329,6 +1384,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"
images: "画像" images: "画像"

View File

@ -186,6 +186,7 @@ common:
stack-left: "左に重ねる" stack-left: "左に重ねる"
pop-right: "右に出す" pop-right: "右に出す"
dev: "アプリの作成に失敗しました。再度お試しください。" dev: "アプリの作成に失敗しました。再度お試しください。"
ai-chan-kawaii: "藍ちゃかわいい"
auth/views/form.vue: auth/views/form.vue:
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?" share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
permission-ask: "このアプリは次の権限を要求しています:" permission-ask: "このアプリは次の権限を要求しています:"
@ -741,7 +742,8 @@ desktop/views/components/settings.vue:
profile: "Profiel" profile: "Profiel"
notification: "Melding" notification: "Melding"
apps: "Apps" apps: "Apps"
mute: "Dempen" mute-and-block: "ミュート/ブロック"
blocking: "ブロック"
security: "Beveiliging" security: "Beveiliging"
signin: "Inloggeschiedenis" signin: "Inloggeschiedenis"
password: "Wachtwoord" password: "Wachtwoord"
@ -867,15 +869,19 @@ common/views/components/drive-settings.vue:
max: "容量" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計" stats: "統計"
desktop/views/components/settings.mute.vue: common/views/components/mute-and-block.vue:
no-users: "Geen gedempte gebruikers" mute-and-block: "ミュートとブロック"
desktop/views/components/settings.password.vue: mute: "ミュート"
reset: "Wachtwoord wijzigen" block: "ブロック"
enter-current-password: "Voer je huidige wachtwoord in" no-muted-users: "ミュートしているユーザーはいません"
enter-new-password: "Voer je nieuwe wachtwoord in" no-blocked-users: "ブロックしているユーザーはいません"
enter-new-password-again: "Voer je nieuwe wachtwoord nogmaals in" common/views/components/password-settings.vue:
not-match: "Het nieuwe wachtwoord komt niet overeen" reset: "パスワードを変更する"
changed: "Wachtwoord bijgewerkt" enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください"
enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
@ -941,41 +947,86 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "Uitvouwen" popout: "Uitvouwen"
close: "Sluiten" close: "Sluiten"
desktop/views/pages/admin/admin.vue: admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス"
emoji: "カスタム絵文字"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
desktop/views/pages/admin/admin.dashboard.vue: back-to-misskey: "Misskeyに戻る"
admin/views/dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" accounts: "アカウント"
original-users: "このインスタンスのユーザー" notes: "投稿"
all-notes: "全ての投稿" drive: "ドライブ"
original-notes: "このインスタンスの投稿" instances: "インスタンス"
this-instance: "このインスタンス"
federated: "連合"
invite: "招待" invite: "招待"
banner-url: "Banner URL" banner-url: "Banner URL"
disableRegistration: "Disable new user registration" disableRegistration: "Disable new user registration"
disableLocalTimeline: "Disable the local timeline" disableLocalTimeline: "Disable the local timeline"
desktop/views/pages/admin/admin.suspend-user.vue: admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
network: "ネットワーク"
charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の積算"
users: "ユーザーの増減"
users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト"
network-time: "応答時間"
network-usage: "通信量"
admin/views/users.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
suspend: "凍結" suspend: "凍結"
suspended: "凍結しました" suspended: "凍結しました"
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除" unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除" unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました" unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする" verify: "公式アカウントにする"
verified: "公式アカウントにしました" verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.announcements.vue: admin/views/emoji.vue:
add-emoji:
title: "絵文字の登録"
name: "絵文字名"
name-desc: "a~z 0~9 _ の文字が使えます。"
aliases: "エイリアス"
aliases-desc: "スペースで区切って複数設定できます。"
url: "絵文字画像URL"
add: "追加"
emojis:
title: "絵文字一覧"
update: "更新"
remove: "削除"
admin/views/announcements.vue:
announcements: "お知らせ" announcements: "お知らせ"
desktop/views/pages/admin/admin.hashtags.vue: save: "保存"
remove: "削除"
add: "追加"
title: "タイトル"
text: "内容"
admin/views/hashtags.vue:
hided-tags: "Hidden Tags" hided-tags: "Hidden Tags"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
@ -1055,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "Dempen" mute: "Dempen"
muted: "Dempend" muted: "Dempend"
unmute: "Ontdempen" unmute: "Ontdempen"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1320,6 +1374,7 @@ mobile/views/pages/settings.vue:
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする" mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "Volgt jou" follows-you: "Volgt jou"
following: "Volgend" following: "Volgend"
@ -1329,6 +1384,10 @@ mobile/views/pages/user.vue:
timeline: "Tijdlijn" timeline: "Tijdlijn"
media: "Media" media: "Media"
is-suspended: "Dit account is geschorst." is-suspended: "Dit account is geschorst."
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "Recente notities" recent-notes: "Recente notities"
images: "Afbeeldingen" images: "Afbeeldingen"

View File

@ -186,6 +186,7 @@ common:
stack-left: "左に重ねる" stack-left: "左に重ねる"
pop-right: "Til høyre" pop-right: "Til høyre"
dev: "アプリの作成に失敗しました。再度お試しください。" dev: "アプリの作成に失敗しました。再度お試しください。"
ai-chan-kawaii: "藍ちゃかわいい"
auth/views/form.vue: auth/views/form.vue:
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?" share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
permission-ask: "このアプリは次の権限を要求しています:" permission-ask: "このアプリは次の権限を要求しています:"
@ -741,7 +742,8 @@ desktop/views/components/settings.vue:
profile: "プロフィール" profile: "プロフィール"
notification: "Notifikasjon" notification: "Notifikasjon"
apps: "Apper" apps: "Apper"
mute: "Demp" mute-and-block: "ミュート/ブロック"
blocking: "ブロック"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "Passord" password: "Passord"
@ -867,9 +869,13 @@ common/views/components/drive-settings.vue:
max: "容量" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計" stats: "統計"
desktop/views/components/settings.mute.vue: common/views/components/mute-and-block.vue:
no-users: "ミュートしているユーザーはいません" mute-and-block: "ミュートとブロック"
desktop/views/components/settings.password.vue: mute: "ミュート"
block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません"
common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください" enter-new-password: "新しいパスワードを入力してください"
@ -941,41 +947,86 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "Lukk" close: "Lukk"
desktop/views/pages/admin/admin.vue: admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
users: "Brukere" instance: "インスタンス"
update: "Oppdater" emoji: "カスタム絵文字"
users: "ユーザー"
update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
desktop/views/pages/admin/admin.dashboard.vue: back-to-misskey: "Misskeyに戻る"
admin/views/dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" accounts: "アカウント"
original-users: "このインスタンスのユーザー" notes: "投稿"
all-notes: "全ての投稿" drive: "ドライブ"
original-notes: "このインスタンスの投稿" instances: "インスタンス"
invite: "Inviter" this-instance: "このインスタンス"
federated: "連合"
invite: "招待"
banner-url: "Banner URL" banner-url: "Banner URL"
disableRegistration: "Disable new user registration" disableRegistration: "Disable new user registration"
disableLocalTimeline: "Disable the local timeline" disableLocalTimeline: "Disable the local timeline"
desktop/views/pages/admin/admin.suspend-user.vue: admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
network: "ネットワーク"
charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の積算"
users: "ユーザーの増減"
users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト"
network-time: "応答時間"
network-usage: "通信量"
admin/views/users.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
suspend: "Suspender" suspend: "凍結"
suspended: "凍結しました" suspended: "凍結しました"
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除" unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除" unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました" unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする" verify: "公式アカウントにする"
verified: "公式アカウントにしました" verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.announcements.vue: admin/views/emoji.vue:
add-emoji:
title: "絵文字の登録"
name: "絵文字名"
name-desc: "a~z 0~9 _ の文字が使えます。"
aliases: "エイリアス"
aliases-desc: "スペースで区切って複数設定できます。"
url: "絵文字画像URL"
add: "追加"
emojis:
title: "絵文字一覧"
update: "更新"
remove: "削除"
admin/views/announcements.vue:
announcements: "お知らせ" announcements: "お知らせ"
desktop/views/pages/admin/admin.hashtags.vue: save: "保存"
remove: "削除"
add: "追加"
title: "タイトル"
text: "内容"
admin/views/hashtags.vue:
hided-tags: "Hidden Tags" hided-tags: "Hidden Tags"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
@ -1055,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1320,6 +1374,7 @@ mobile/views/pages/settings.vue:
sound: "Lyder" sound: "Lyder"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする" mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "Følger" following: "Følger"
@ -1329,6 +1384,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "Media" media: "Media"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "Nylige innlegg" recent-notes: "Nylige innlegg"
images: "Bilder" images: "Bilder"

View File

@ -186,6 +186,7 @@ common:
stack-left: "Przypnij do lewej" stack-left: "Przypnij do lewej"
pop-right: "Odepnij w prawo" pop-right: "Odepnij w prawo"
dev: "アプリの作成に失敗しました。再度お試しください。" dev: "アプリの作成に失敗しました。再度お試しください。"
ai-chan-kawaii: "藍ちゃかわいい"
auth/views/form.vue: auth/views/form.vue:
share-access: "Czy chcesz <b>zezwolić</b> <i>{{ app.name }}</i> na dostęp do Twojego konta?" share-access: "Czy chcesz <b>zezwolić</b> <i>{{ app.name }}</i> na dostęp do Twojego konta?"
permission-ask: "Ta aplikacja wymaga następujących uprawnień:" permission-ask: "Ta aplikacja wymaga następujących uprawnień:"
@ -741,7 +742,8 @@ desktop/views/components/settings.vue:
profile: "Profil" profile: "Profil"
notification: "Powiadomienia" notification: "Powiadomienia"
apps: "Aplikacje" apps: "Aplikacje"
mute: "Wyciszanie" mute-and-block: "ミュート/ブロック"
blocking: "ブロック"
security: "Bezpieczeństwo" security: "Bezpieczeństwo"
signin: "Historia logowań" signin: "Historia logowań"
password: "Hasło" password: "Hasło"
@ -867,15 +869,19 @@ common/views/components/drive-settings.vue:
max: "容量" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計" stats: "統計"
desktop/views/components/settings.mute.vue: common/views/components/mute-and-block.vue:
no-users: "Brak wyciszonych użytkowników" mute-and-block: "ミュートとブロック"
desktop/views/components/settings.password.vue: mute: "ミュート"
reset: "Zmień hasło" block: "ブロック"
enter-current-password: "Wprowadź obecne hasło" no-muted-users: "ミュートしているユーザーはいません"
enter-new-password: "Wprowadź nowe hasło" no-blocked-users: "ブロックしているユーザーはいません"
enter-new-password-again: "Wprowadź ponownie nowe hasło" common/views/components/password-settings.vue:
not-match: "Nowe hasła nie pasują do siebie" reset: "パスワードを変更する"
changed: "Pomyślnie zmieniono hasło" enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください"
enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "ten wpis jest prywatny" private: "ten wpis jest prywatny"
deleted: "ten wpis został usunięty" deleted: "ten wpis został usunięty"
@ -941,41 +947,86 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "Pop-out" popout: "Pop-out"
close: "Zamknij" close: "Zamknij"
desktop/views/pages/admin/admin.vue: admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス"
emoji: "カスタム絵文字"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
desktop/views/pages/admin/admin.dashboard.vue: back-to-misskey: "Misskeyに戻る"
admin/views/dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" accounts: "アカウント"
original-users: "このインスタンスのユーザー" notes: "投稿"
all-notes: "全ての投稿" drive: "ドライブ"
original-notes: "このインスタンスの投稿" instances: "インスタンス"
this-instance: "このインスタンス"
federated: "連合"
invite: "招待" invite: "招待"
banner-url: "Banner URL" banner-url: "Banner URL"
disableRegistration: "Disable new user registration" disableRegistration: "Disable new user registration"
disableLocalTimeline: "Disable the local timeline" disableLocalTimeline: "Disable the local timeline"
desktop/views/pages/admin/admin.suspend-user.vue: admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
network: "ネットワーク"
charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の積算"
users: "ユーザーの増減"
users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト"
network-time: "応答時間"
network-usage: "通信量"
admin/views/users.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
suspend: "凍結" suspend: "凍結"
suspended: "凍結しました" suspended: "凍結しました"
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除" unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除" unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました" unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする" verify: "公式アカウントにする"
verified: "公式アカウントにしました" verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.announcements.vue: admin/views/emoji.vue:
add-emoji:
title: "絵文字の登録"
name: "絵文字名"
name-desc: "a~z 0~9 _ の文字が使えます。"
aliases: "エイリアス"
aliases-desc: "スペースで区切って複数設定できます。"
url: "絵文字画像URL"
add: "追加"
emojis:
title: "絵文字一覧"
update: "更新"
remove: "削除"
admin/views/announcements.vue:
announcements: "お知らせ" announcements: "お知らせ"
desktop/views/pages/admin/admin.hashtags.vue: save: "保存"
remove: "削除"
add: "追加"
title: "タイトル"
text: "内容"
admin/views/hashtags.vue:
hided-tags: "Hidden Tags" hided-tags: "Hidden Tags"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Tylko wpisy z zawartością multimedialną" is-media-only: "Tylko wpisy z zawartością multimedialną"
@ -1055,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "Wycisz" mute: "Wycisz"
muted: "Wyciszyłeś" muted: "Wyciszyłeś"
unmute: "Cofnij wyciszenie" unmute: "Cofnij wyciszenie"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "Dodaj do listy" push-to-a-list: "Dodaj do listy"
list-pushed: "Dodałeś(-aś) {user} do {list}." list-pushed: "Dodałeś(-aś) {user} do {list}."
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1320,6 +1374,7 @@ mobile/views/pages/settings.vue:
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする" mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "Śledzi Cię" follows-you: "Śledzi Cię"
following: "Śledzeni" following: "Śledzeni"
@ -1329,6 +1384,10 @@ mobile/views/pages/user.vue:
timeline: "Oś czasu" timeline: "Oś czasu"
media: "Multimedia" media: "Multimedia"
is-suspended: "To konto zostało zablokowane" is-suspended: "To konto zostało zablokowane"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "Ostatnie wpisy" recent-notes: "Ostatnie wpisy"
images: "Zdjęcia" images: "Zdjęcia"

View File

@ -186,6 +186,7 @@ common:
stack-left: "左に重ねる" stack-left: "左に重ねる"
pop-right: "Acoplar à direita" pop-right: "Acoplar à direita"
dev: "アプリの作成に失敗しました。再度お試しください。" dev: "アプリの作成に失敗しました。再度お試しください。"
ai-chan-kawaii: "藍ちゃかわいい"
auth/views/form.vue: auth/views/form.vue:
share-access: "Você <b>permite</b> que <i>{{ app.name }}</i> acesse sua conta?" share-access: "Você <b>permite</b> que <i>{{ app.name }}</i> acesse sua conta?"
permission-ask: "Este aplicativo precisa das seguintes permissões:" permission-ask: "Este aplicativo precisa das seguintes permissões:"
@ -741,7 +742,8 @@ desktop/views/components/settings.vue:
profile: "プロフィール" profile: "プロフィール"
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute-and-block: "ミュート/ブロック"
blocking: "ブロック"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
@ -867,9 +869,13 @@ common/views/components/drive-settings.vue:
max: "容量" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計" stats: "統計"
desktop/views/components/settings.mute.vue: common/views/components/mute-and-block.vue:
no-users: "ミュートしているユーザーはいません" mute-and-block: "ミュートとブロック"
desktop/views/components/settings.password.vue: mute: "ミュート"
block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません"
common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください" enter-new-password: "新しいパスワードを入力してください"
@ -941,41 +947,86 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
users: "Usuários" instance: "インスタンス"
update: "Actualizações" emoji: "カスタム絵文字"
users: "ユーザー"
update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
desktop/views/pages/admin/admin.dashboard.vue: back-to-misskey: "Misskeyに戻る"
admin/views/dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "Todos os usuários" accounts: "アカウント"
original-users: "このインスタンスのユーザー" notes: "投稿"
all-notes: "全ての投稿" drive: "ドライブ"
original-notes: "このインスタンスの投稿" instances: "インスタンス"
this-instance: "このインスタンス"
federated: "連合"
invite: "招待" invite: "招待"
banner-url: "Banner URL" banner-url: "Banner URL"
disableRegistration: "Disable new user registration" disableRegistration: "Disable new user registration"
disableLocalTimeline: "Disable the local timeline" disableLocalTimeline: "Disable the local timeline"
desktop/views/pages/admin/admin.suspend-user.vue: admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
network: "ネットワーク"
charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の積算"
users: "ユーザーの増減"
users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト"
network-time: "応答時間"
network-usage: "通信量"
admin/views/users.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
suspend: "凍結" suspend: "凍結"
suspended: "凍結しました" suspended: "凍結しました"
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除" unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除" unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました" unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする" verify: "公式アカウントにする"
verified: "公式アカウントにしました" verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.announcements.vue: admin/views/emoji.vue:
add-emoji:
title: "絵文字の登録"
name: "絵文字名"
name-desc: "a~z 0~9 _ の文字が使えます。"
aliases: "エイリアス"
aliases-desc: "スペースで区切って複数設定できます。"
url: "絵文字画像URL"
add: "追加"
emojis:
title: "絵文字一覧"
update: "更新"
remove: "削除"
admin/views/announcements.vue:
announcements: "お知らせ" announcements: "お知らせ"
desktop/views/pages/admin/admin.hashtags.vue: save: "保存"
remove: "削除"
add: "追加"
title: "タイトル"
text: "内容"
admin/views/hashtags.vue:
hided-tags: "Hidden Tags" hided-tags: "Hidden Tags"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
@ -1055,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1320,6 +1374,7 @@ mobile/views/pages/settings.vue:
sound: "Sons" sound: "Sons"
enable-sounds: "Ativar sons" enable-sounds: "Ativar sons"
mark-as-read-all-unread-notes: "すべての投稿を既読にする" mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "Te segue" follows-you: "Te segue"
following: "Seguindo" following: "Seguindo"
@ -1329,6 +1384,10 @@ mobile/views/pages/user.vue:
timeline: "Linha do tempo" timeline: "Linha do tempo"
media: "Mídia" media: "Mídia"
is-suspended: "Esta conta foi suspensa" is-suspended: "Esta conta foi suspensa"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "Notas recentes" recent-notes: "Notas recentes"
images: "Imagens" images: "Imagens"

View File

@ -186,6 +186,7 @@ common:
stack-left: "左に重ねる" stack-left: "左に重ねる"
pop-right: "右に出す" pop-right: "右に出す"
dev: "アプリの作成に失敗しました。再度お試しください。" dev: "アプリの作成に失敗しました。再度お試しください。"
ai-chan-kawaii: "藍ちゃかわいい"
auth/views/form.vue: auth/views/form.vue:
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?" share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
permission-ask: "このアプリは次の権限を要求しています:" permission-ask: "このアプリは次の権限を要求しています:"
@ -741,7 +742,8 @@ desktop/views/components/settings.vue:
profile: "プロフィール" profile: "プロフィール"
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute-and-block: "ミュート/ブロック"
blocking: "ブロック"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
@ -867,9 +869,13 @@ common/views/components/drive-settings.vue:
max: "容量" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計" stats: "統計"
desktop/views/components/settings.mute.vue: common/views/components/mute-and-block.vue:
no-users: "ミュートしているユーザーはいません" mute-and-block: "ミュートとブロック"
desktop/views/components/settings.password.vue: mute: "ミュート"
block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません"
common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください" enter-new-password: "新しいパスワードを入力してください"
@ -941,41 +947,86 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス"
emoji: "カスタム絵文字"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
desktop/views/pages/admin/admin.dashboard.vue: back-to-misskey: "Misskeyに戻る"
admin/views/dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" accounts: "アカウント"
original-users: "このインスタンスのユーザー" notes: "投稿"
all-notes: "全ての投稿" drive: "ドライブ"
original-notes: "このインスタンスの投稿" instances: "インスタンス"
this-instance: "このインスタンス"
federated: "連合"
invite: "招待" invite: "招待"
banner-url: "Banner URL" banner-url: "Banner URL"
disableRegistration: "Disable new user registration" disableRegistration: "Disable new user registration"
disableLocalTimeline: "Disable the local timeline" disableLocalTimeline: "Disable the local timeline"
desktop/views/pages/admin/admin.suspend-user.vue: admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
network: "ネットワーク"
charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の積算"
users: "ユーザーの増減"
users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト"
network-time: "応答時間"
network-usage: "通信量"
admin/views/users.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
suspend: "凍結" suspend: "凍結"
suspended: "凍結しました" suspended: "凍結しました"
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除" unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除" unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました" unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする" verify: "公式アカウントにする"
verified: "公式アカウントにしました" verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.announcements.vue: admin/views/emoji.vue:
add-emoji:
title: "絵文字の登録"
name: "絵文字名"
name-desc: "a~z 0~9 _ の文字が使えます。"
aliases: "エイリアス"
aliases-desc: "スペースで区切って複数設定できます。"
url: "絵文字画像URL"
add: "追加"
emojis:
title: "絵文字一覧"
update: "更新"
remove: "削除"
admin/views/announcements.vue:
announcements: "お知らせ" announcements: "お知らせ"
desktop/views/pages/admin/admin.hashtags.vue: save: "保存"
remove: "削除"
add: "追加"
title: "タイトル"
text: "内容"
admin/views/hashtags.vue:
hided-tags: "Hidden Tags" hided-tags: "Hidden Tags"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
@ -1055,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1320,6 +1374,7 @@ mobile/views/pages/settings.vue:
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする" mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"
@ -1329,6 +1384,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"
images: "画像" images: "画像"

View File

@ -186,6 +186,7 @@ common:
stack-left: "左に重ねる" stack-left: "左に重ねる"
pop-right: "右に出す" pop-right: "右に出す"
dev: "アプリの作成に失敗しました。再度お試しください。" dev: "アプリの作成に失敗しました。再度お試しください。"
ai-chan-kawaii: "藍ちゃかわいい"
auth/views/form.vue: auth/views/form.vue:
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?" share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
permission-ask: "このアプリは次の権限を要求しています:" permission-ask: "このアプリは次の権限を要求しています:"
@ -741,7 +742,8 @@ desktop/views/components/settings.vue:
profile: "プロフィール" profile: "プロフィール"
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute-and-block: "ミュート/ブロック"
blocking: "ブロック"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
@ -867,9 +869,13 @@ common/views/components/drive-settings.vue:
max: "容量" max: "容量"
in-use: "使用中" in-use: "使用中"
stats: "統計" stats: "統計"
desktop/views/components/settings.mute.vue: common/views/components/mute-and-block.vue:
no-users: "ミュートしているユーザーはいません" mute-and-block: "ミュートとブロック"
desktop/views/components/settings.password.vue: mute: "ミュート"
block: "ブロック"
no-muted-users: "ミュートしているユーザーはいません"
no-blocked-users: "ブロックしているユーザーはいません"
common/views/components/password-settings.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください" enter-new-password: "新しいパスワードを入力してください"
@ -941,41 +947,86 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/admin/admin.vue: admin/views/index.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
instance: "インスタンス"
emoji: "カスタム絵文字"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
desktop/views/pages/admin/admin.dashboard.vue: back-to-misskey: "Misskeyに戻る"
admin/views/dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" accounts: "アカウント"
original-users: "このインスタンスのユーザー" notes: "投稿"
all-notes: "全ての投稿" drive: "ドライブ"
original-notes: "このインスタンスの投稿" instances: "インスタンス"
this-instance: "このインスタンス"
federated: "連合"
invite: "招待" invite: "招待"
banner-url: "Banner URL" banner-url: "Banner URL"
disableRegistration: "Disable new user registration" disableRegistration: "Disable new user registration"
disableLocalTimeline: "Disable the local timeline" disableLocalTimeline: "Disable the local timeline"
desktop/views/pages/admin/admin.suspend-user.vue: admin/views/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
federation: "フェデレーション"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
network: "ネットワーク"
charts:
federation-instances: "インスタンスの増減"
federation-instances-total: "インスタンスの積算"
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の積算"
users: "ユーザーの増減"
users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト"
network-time: "応答時間"
network-usage: "通信量"
admin/views/users.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
suspend: "凍結" suspend: "凍結"
suspended: "凍結しました" suspended: "凍結しました"
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除" unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除" unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました" unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする" verify: "公式アカウントにする"
verified: "公式アカウントにしました" verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.announcements.vue: admin/views/emoji.vue:
add-emoji:
title: "絵文字の登録"
name: "絵文字名"
name-desc: "a~z 0~9 _ の文字が使えます。"
aliases: "エイリアス"
aliases-desc: "スペースで区切って複数設定できます。"
url: "絵文字画像URL"
add: "追加"
emojis:
title: "絵文字一覧"
update: "更新"
remove: "削除"
admin/views/announcements.vue:
announcements: "お知らせ" announcements: "お知らせ"
desktop/views/pages/admin/admin.hashtags.vue: save: "保存"
remove: "削除"
add: "追加"
title: "タイトル"
text: "内容"
admin/views/hashtags.vue:
hided-tags: "Hidden Tags" hided-tags: "Hidden Tags"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
@ -1055,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
block: "ブロックする"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
@ -1320,6 +1374,7 @@ mobile/views/pages/settings.vue:
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
mark-as-read-all-unread-notes: "すべての投稿を既読にする" mark-as-read-all-unread-notes: "すべての投稿を既読にする"
password: "パスワード"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"
@ -1329,6 +1384,10 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"
images: "画像" images: "画像"

17352
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "10.33.0", "version": "10.45.0",
"clientVersion": "1.0.11172", "clientVersion": "1.0.11641",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,
@ -20,10 +20,11 @@
"format": "gulp format" "format": "gulp format"
}, },
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-svg-core": "1.2.6", "@fortawesome/fontawesome-svg-core": "1.2.8",
"@fortawesome/free-brands-svg-icons": "5.4.1", "@fortawesome/free-brands-svg-icons": "5.5.0",
"@fortawesome/free-regular-svg-icons": "5.4.1", "@fortawesome/free-regular-svg-icons": "5.5.0",
"@fortawesome/free-solid-svg-icons": "5.4.1", "@fortawesome/free-solid-svg-icons": "5.5.0",
"@fortawesome/vue-fontawesome": "0.1.2",
"@koa/cors": "2.2.2", "@koa/cors": "2.2.2",
"@prezzemolo/rap": "0.1.2", "@prezzemolo/rap": "0.1.2",
"@prezzemolo/zip": "0.0.3", "@prezzemolo/zip": "0.0.3",
@ -52,7 +53,7 @@
"@types/koa-logger": "3.1.1", "@types/koa-logger": "3.1.1",
"@types/koa-mount": "3.0.1", "@types/koa-mount": "3.0.1",
"@types/koa-multer": "1.0.0", "@types/koa-multer": "1.0.0",
"@types/koa-router": "7.0.32", "@types/koa-router": "7.0.33",
"@types/koa-send": "4.1.1", "@types/koa-send": "4.1.1",
"@types/koa-views": "2.0.3", "@types/koa-views": "2.0.3",
"@types/koa__cors": "2.2.3", "@types/koa__cors": "2.2.3",
@ -61,20 +62,21 @@
"@types/mocha": "5.2.5", "@types/mocha": "5.2.5",
"@types/mongodb": "3.1.12", "@types/mongodb": "3.1.12",
"@types/ms": "0.7.30", "@types/ms": "0.7.30",
"@types/node": "10.12.0", "@types/node": "10.12.2",
"@types/oauth": "0.9.1",
"@types/portscanner": "2.1.0", "@types/portscanner": "2.1.0",
"@types/pug": "2.0.4", "@types/pug": "2.0.4",
"@types/qrcode": "1.3.0", "@types/qrcode": "1.3.0",
"@types/ratelimiter": "2.1.28", "@types/ratelimiter": "2.1.28",
"@types/redis": "2.8.7", "@types/redis": "2.8.7",
"@types/request": "2.47.1", "@types/request": "2.48.1",
"@types/request-promise-native": "1.0.15", "@types/request-promise-native": "1.0.15",
"@types/rimraf": "2.0.2", "@types/rimraf": "2.0.2",
"@types/seedrandom": "2.4.27", "@types/seedrandom": "2.4.27",
"@types/sharp": "0.21.0", "@types/sharp": "0.21.0",
"@types/showdown": "1.7.5", "@types/showdown": "1.7.5",
"@types/single-line-log": "1.1.0", "@types/single-line-log": "1.1.0",
"@types/speakeasy": "2.0.2", "@types/speakeasy": "2.0.3",
"@types/systeminformation": "3.23.0", "@types/systeminformation": "3.23.0",
"@types/tinycolor2": "1.4.1", "@types/tinycolor2": "1.4.1",
"@types/tmp": "0.0.33", "@types/tmp": "0.0.33",
@ -84,35 +86,34 @@
"@types/websocket": "0.0.40", "@types/websocket": "0.0.40",
"@types/ws": "6.0.1", "@types/ws": "6.0.1",
"animejs": "2.2.0", "animejs": "2.2.0",
"apexcharts": "2.1.6", "apexcharts": "2.1.9",
"autobind-decorator": "2.1.0", "autobind-decorator": "2.1.0",
"autosize": "4.0.2", "autosize": "4.0.2",
"autwh": "0.1.0", "autwh": "0.1.0",
"bcryptjs": "2.4.3", "bcryptjs": "2.4.3",
"bee-queue": "1.2.2", "bee-queue": "1.2.2",
"bootstrap-vue": "2.0.0-rc.11", "bootstrap-vue": "2.0.0-rc.11",
"cafy": "11.3.0", "cafy": "12.0.0",
"chai": "4.2.0", "chai": "4.2.0",
"chai-http": "4.2.0", "chai-http": "4.2.0",
"chalk": "2.4.1", "chalk": "2.4.1",
"chart.js": "2.7.3",
"commander": "2.19.0", "commander": "2.19.0",
"crc-32": "1.2.0", "crc-32": "1.2.0",
"css-loader": "1.0.0", "css-loader": "1.0.1",
"dateformat": "3.0.3", "dateformat": "3.0.3",
"debug": "4.1.0", "debug": "4.1.0",
"deep-equal": "1.0.1", "deep-equal": "1.0.1",
"deepcopy": "0.6.3", "deepcopy": "0.6.3",
"diskusage": "0.2.5", "diskusage": "0.2.5",
"double-ended-queue": "2.1.0-0", "double-ended-queue": "2.1.0-0",
"elasticsearch": "15.1.1", "elasticsearch": "15.2.0",
"emojilib": "2.3.0", "emojilib": "2.3.0",
"escape-regexp": "0.0.1", "escape-regexp": "0.0.1",
"eslint": "5.7.0", "eslint": "5.8.0",
"eslint-plugin-vue": "4.7.1", "eslint-plugin-vue": "4.7.1",
"eventemitter3": "3.1.0", "eventemitter3": "3.1.0",
"file-loader": "2.0.0", "file-loader": "2.0.0",
"file-type": "10.1.0", "file-type": "10.4.0",
"fuckadblock": "3.2.1", "fuckadblock": "3.2.1",
"gulp": "3.9.1", "gulp": "3.9.1",
"gulp-cssnano": "2.1.3", "gulp-cssnano": "2.1.3",
@ -135,7 +136,7 @@
"is-root": "2.0.0", "is-root": "2.0.0",
"is-url": "1.2.4", "is-url": "1.2.4",
"js-yaml": "3.12.0", "js-yaml": "3.12.0",
"jsdom": "12.2.0", "jsdom": "13.0.0",
"json5": "2.1.0", "json5": "2.1.0",
"json5-loader": "1.0.1", "json5-loader": "1.0.1",
"koa": "2.6.1", "koa": "2.6.1",
@ -173,7 +174,7 @@
"promise-sequential": "1.1.1", "promise-sequential": "1.1.1",
"pug": "2.0.3", "pug": "2.0.3",
"punycode": "2.1.1", "punycode": "2.1.1",
"qrcode": "1.3.0", "qrcode": "1.3.2",
"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",
@ -201,22 +202,20 @@
"textarea-caret": "3.1.0", "textarea-caret": "3.1.0",
"tinycolor2": "1.4.1", "tinycolor2": "1.4.1",
"tmp": "0.0.33", "tmp": "0.0.33",
"ts-loader": "5.2.2", "ts-loader": "5.3.0",
"ts-node": "7.0.1", "ts-node": "7.0.1",
"tslint": "5.10.0", "tslint": "5.10.0",
"typescript": "3.1.3", "typescript": "3.1.6",
"typescript-eslint-parser": "20.0.0", "typescript-eslint-parser": "20.1.1",
"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",
"v-animate-css": "0.0.2", "v-animate-css": "0.0.2",
"vue": "2.5.17", "vue": "2.5.17",
"vue-chartjs": "3.4.0",
"vue-color": "2.7.0", "vue-color": "2.7.0",
"vue-content-loading": "1.5.3", "vue-content-loading": "1.5.3",
"vue-cropperjs": "2.2.2", "vue-cropperjs": "2.2.2",
"vue-js-modal": "1.3.26", "vue-js-modal": "1.3.26",
"vue-json-tree-view": "2.1.4",
"vue-loader": "15.4.2", "vue-loader": "15.4.2",
"vue-router": "3.0.1", "vue-router": "3.0.1",
"vue-style-loader": "4.1.2", "vue-style-loader": "4.1.2",
@ -229,17 +228,10 @@
"vuex-persistedstate": "2.5.4", "vuex-persistedstate": "2.5.4",
"web-push": "3.3.3", "web-push": "3.3.3",
"webfinger.js": "2.6.6", "webfinger.js": "2.6.6",
"webpack": "4.23.1", "webpack": "4.25.1",
"webpack-cli": "3.1.2", "webpack-cli": "3.1.2",
"websocket": "1.0.28", "websocket": "1.0.28",
"ws": "6.1.0", "ws": "6.1.0",
"xev": "2.0.1" "xev": "2.0.1"
},
"greenkeeper": {
"ignore": [
"deepcopy",
"cafy",
"@types/gulp"
]
} }
} }

View File

@ -230,7 +230,7 @@ export default abstract class Chart<T> {
null; null;
// ログ取得 // ログ取得
const logs = await this.collection.find({ let logs = await this.collection.find({
group: group, group: group,
span: span, span: span,
date: { date: {
@ -245,6 +245,27 @@ export default abstract class Chart<T> {
} }
}); });
// 要求された範囲にログがひとつもなかったら
if (logs.length == 0) {
// もっとも新しいログを持ってくる
// (すくなくともひとつログが無いと隙間埋めできないため)
const recentLog = await this.collection.findOne({
group: group,
span: span
}, {
sort: {
date: -1
},
fields: {
_id: 0
}
});
if (recentLog) {
logs = [recentLog];
}
}
// 整形 // 整形
for (let i = (range - 1); i >= 0; i--) { for (let i = (range - 1); i >= 0; i--) {
const current = const current =
@ -269,14 +290,11 @@ export default abstract class Chart<T> {
/** /**
* [{ * [{
* xxxxx: 1, * xxxxx: 1, yyyyy: 5
* yyyyy: 5
* }, { * }, {
* xxxxx: 2, * xxxxx: 2, yyyyy: 6
* yyyyy: 6
* }, { * }, {
* xxxxx: 3, * xxxxx: 3, yyyyy: 7
* yyyyy: 7
* }] * }]
* *
* を * を

View File

@ -0,0 +1,150 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="512"
height="512"
viewBox="0 0 135.46667 135.46667"
version="1.1"
id="svg8"
inkscape:version="0.92.1 r15371"
sodipodi:docname="header-icon.dark.svg"
inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\32.png"
inkscape:export-xdpi="6"
inkscape:export-ydpi="6">
<defs
id="defs2">
<inkscape:path-effect
effect="simplify"
id="path-effect5115"
is_visible="true"
steps="1"
threshold="0.000408163"
smooth_angles="360"
helper_size="0"
simplify_individual_paths="false"
simplify_just_coalesce="false"
simplifyindividualpaths="false"
simplifyJustCoalesce="false" />
<inkscape:path-effect
effect="simplify"
id="path-effect5111"
is_visible="true"
steps="1"
threshold="0.000408163"
smooth_angles="360"
helper_size="0"
simplify_individual_paths="false"
simplify_just_coalesce="false"
simplifyindividualpaths="false"
simplifyJustCoalesce="false" />
<inkscape:path-effect
effect="simplify"
id="path-effect5104"
is_visible="true"
steps="1"
threshold="0.000408163"
smooth_angles="360"
helper_size="0"
simplify_individual_paths="false"
simplify_just_coalesce="false"
simplifyindividualpaths="false"
simplifyJustCoalesce="false" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4142136"
inkscape:cx="114.309"
inkscape:cy="251.50613"
inkscape:document-units="px"
inkscape:current-layer="g4502"
showgrid="true"
units="px"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-center="true"
inkscape:snap-page="true"
inkscape:window-width="1920"
inkscape:window-height="1027"
inkscape:window-x="-8"
inkscape:window-y="1072"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-midpoints="true"
inkscape:object-paths="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
objecttolerance="1"
guidetolerance="1"
inkscape:snap-nodes="false"
inkscape:snap-others="false">
<inkscape:grid
type="xygrid"
id="grid4504"
spacingx="4.2333334"
spacingy="4.2333334"
empcolor="#ff3fff"
empopacity="0.25098039"
empspacing="4" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="レイヤー 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-30.809093,-111.78601)">
<g
id="g4502"
transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)">
<g
style="fill-opacity:1"
transform="translate(-1.3333333e-6,-1.3439941e-6)"
id="g5125">
<g
transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)"
id="text4489"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
aria-label="Mi">
<path
sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz"
inkscape:connector-curvature="0"
id="path5210"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill-opacity:1;stroke-width:0.28950602px"
d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" />
<path
inkscape:connector-curvature="0"
id="path5212"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill-opacity:1;stroke-width:0.28950602px"
d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@ -0,0 +1,27 @@
/**
* Admin
*/
import VueRouter from 'vue-router';
// Style
import './style.styl';
import init from '../init';
import Index from './views/index.vue';
init(launch => {
document.title = 'Admin';
// Init router
const router = new VueRouter({
mode: 'history',
base: '/admin/',
routes: [
{ path: '/', component: Index },
]
});
// Launch the app
launch(router);
});

View File

@ -0,0 +1,6 @@
@import "../app"
@import "../reset"
html
height 100%
background var(--bg)

View File

@ -0,0 +1,90 @@
<template>
<div class="cdeuzmsthagexbkpofbmatmugjuvogfb">
<ui-card>
<div slot="title"><fa icon="broadcast-tower"/> %i18n:@announcements%</div>
<section v-for="(announcement, i) in announcements" class="fit-top">
<ui-input v-model="announcement.title" @change="save">
<span>%i18n:@title%</span>
</ui-input>
<ui-textarea v-model="announcement.text">
<span>%i18n:@text%</span>
</ui-textarea>
<ui-horizon-group>
<ui-button @click="save()"><fa :icon="['far', 'save']"/> %i18n:@save%</ui-button>
<ui-button @click="remove(i)"><fa :icon="['far', 'trash-alt']"/> %i18n:@remove%</ui-button>
</ui-horizon-group>
</section>
<section>
<ui-button @click="add"><fa icon="plus"/> %i18n:@add%</ui-button>
</section>
</ui-card>
</div>
</template>
<script lang="ts">
import Vue from "vue";
export default Vue.extend({
data() {
return {
announcements: [],
};
},
created() {
(this as any).os.getMeta().then(meta => {
this.announcements = meta.broadcasts;
});
},
methods: {
add() {
this.announcements.push({
title: '',
text: ''
});
},
remove(i) {
this.$swal({
type: 'warning',
text: '%i18n:@_remove.are-you-sure%'.replace('$1', this.announcements.find((_, j) => j == i).title),
showCancelButton: true
}).then(res => {
if (!res.value) return;
this.announcements = this.announcements.filter((_, j) => j !== i);
this.save(true);
this.$swal({
type: 'success',
text: '%i18n:@_remove.removed%'
});
});
},
save(silent) {
(this as any).api('admin/update-meta', {
broadcasts: this.announcements
}).then(() => {
if (!silent) {
this.$swal({
type: 'success',
text: '%i18n:@saved%'
});
}
}).catch(e => {
this.$swal({
type: 'error',
text: e
});
});
}
}
});
</script>
<style lang="stylus" scoped>
.cdeuzmsthagexbkpofbmatmugjuvogfb
@media (min-width 500px)
padding 16px
</style>

View File

@ -0,0 +1,105 @@
<template>
<div class="hyhctythnmwihguaaapnbrbszsjqxpio">
<table>
<thead>
<tr>
<th><fa icon="exchange-alt"/> In/Out</th>
<th><fa icon="server"/> Host</th>
<th><fa icon="bolt"/> Activity</th>
<th><fa icon="user"/> Actor</th>
</tr>
</thead>
<tbody>
<tr v-for="log in logs" :key="log.id">
<td :class="log.direction">{{ log.direction == 'in' ? '<' : '>' }} {{ log.direction }}</td>
<td>{{ log.host }}</td>
<td>{{ log.activity }}</td>
<td>@{{ log.actor }}</td>
</tr>
</tbody>
</table>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
data() {
return {
logs: [],
connection: null
};
},
mounted() {
this.connection = (this as any).os.stream.useSharedConnection('apLog');
this.connection.on('log', this.onLog);
this.connection.on('logs', this.onLogs);
this.connection.send('requestLog', {
id: Math.random().toString().substr(2, 8),
length: 50
});
},
beforeDestroy() {
this.connection.dispose();
},
methods: {
onLog(log) {
log.id = Math.random();
this.logs.unshift(log);
if (this.logs.length > 50) this.logs.pop();
},
onLogs(logs) {
logs.reverse().forEach(log => this.onLog(log));
}
}
});
</script>
<style lang="stylus" scoped>
.hyhctythnmwihguaaapnbrbszsjqxpio
display block
padding 12px 16px 16px 16px
height 250px
overflow hidden
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
background var(--adminDashboardCardBg)
border-radius 8px
> table
width 100%
max-width 100%
overflow auto
border-spacing 0
border-collapse collapse
color var(--adminDashboardCardFg)
font-size 14px
thead
border-bottom solid 1px var(--adminDashboardCardDivider)
tr
th
font-weight normal
text-align left
tbody
tr
&:nth-child(odd)
background rgba(0, 0, 0, 0.025)
th, td
padding 8px 16px
min-width 128px
td.in
color #d26755
td.out
color #55bb83
</style>

View File

@ -0,0 +1,491 @@
<template>
<div class="qvgidhudpqhjttdhxubzuyrhyzgslujw">
<header>
<b><fa :icon="['far', 'chart-bar']"/> %i18n:@title%:</b>
<select v-model="src">
<optgroup label="%i18n:@federation%">
<option value="federation-instances">%i18n:@charts.federation-instances%</option>
<option value="federation-instances-total">%i18n:@charts.federation-instances-total%</option>
</optgroup>
<optgroup label="%i18n:@users%">
<option value="users">%i18n:@charts.users%</option>
<option value="users-total">%i18n:@charts.users-total%</option>
</optgroup>
<optgroup label="%i18n:@notes%">
<option value="notes">%i18n:@charts.notes%</option>
<option value="local-notes">%i18n:@charts.local-notes%</option>
<option value="remote-notes">%i18n:@charts.remote-notes%</option>
<option value="notes-total">%i18n:@charts.notes-total%</option>
</optgroup>
<optgroup label="%i18n:@drive%">
<option value="drive-files">%i18n:@charts.drive-files%</option>
<option value="drive-files-total">%i18n:@charts.drive-files-total%</option>
<option value="drive">%i18n:@charts.drive%</option>
<option value="drive-total">%i18n:@charts.drive-total%</option>
</optgroup>
<optgroup label="%i18n:@network%">
<option value="network-requests">%i18n:@charts.network-requests%</option>
<option value="network-time">%i18n:@charts.network-time%</option>
<option value="network-usage">%i18n:@charts.network-usage%</option>
</optgroup>
</select>
<div>
<span @click="span = 'day'" :class="{ active: span == 'day' }">%i18n:@per-day%</span> | <span @click="span = 'hour'" :class="{ active: span == 'hour' }">%i18n:@per-hour%</span>
</div>
</header>
<div ref="chart"></div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import * as tinycolor from 'tinycolor2';
import * as ApexCharts from 'apexcharts';
const limit = 90;
const sum = (...arr) => arr.reduce((r, a) => r.map((b, i) => a[i] + b));
const negate = arr => arr.map(x => -x);
export default Vue.extend({
data() {
return {
chart: null,
src: 'notes',
span: 'hour',
chartInstance: null
};
},
computed: {
data(): any {
if (this.chart == null) return null;
switch (this.src) {
case 'federation-instances': return this.federationInstancesChart(false);
case 'federation-instances-total': return this.federationInstancesChart(true);
case 'users': return this.usersChart(false);
case 'users-total': return this.usersChart(true);
case 'notes': return this.notesChart('combined');
case 'local-notes': return this.notesChart('local');
case 'remote-notes': return this.notesChart('remote');
case 'notes-total': return this.notesTotalChart();
case 'drive': return this.driveChart();
case 'drive-total': return this.driveTotalChart();
case 'drive-files': return this.driveFilesChart();
case 'drive-files-total': return this.driveFilesTotalChart();
case 'network-requests': return this.networkRequestsChart();
case 'network-time': return this.networkTimeChart();
case 'network-usage': return this.networkUsageChart();
}
},
stats(): any[] {
const stats =
this.span == 'day' ? this.chart.perDay :
this.span == 'hour' ? this.chart.perHour :
null;
return stats;
}
},
watch: {
src() {
this.render();
},
span() {
this.render();
}
},
async mounted() {
this.now = new Date();
const [perHour, perDay] = await Promise.all([Promise.all([
(this as any).api('charts/federation', { limit: limit, span: 'hour' }),
(this as any).api('charts/users', { limit: limit, span: 'hour' }),
(this as any).api('charts/notes', { limit: limit, span: 'hour' }),
(this as any).api('charts/drive', { limit: limit, span: 'hour' }),
(this as any).api('charts/network', { limit: limit, span: 'hour' })
]), Promise.all([
(this as any).api('charts/federation', { limit: limit, span: 'day' }),
(this as any).api('charts/users', { limit: limit, span: 'day' }),
(this as any).api('charts/notes', { limit: limit, span: 'day' }),
(this as any).api('charts/drive', { limit: limit, span: 'day' }),
(this as any).api('charts/network', { limit: limit, span: 'day' })
])]);
const chart = {
perHour: {
federation: perHour[0],
users: perHour[1],
notes: perHour[2],
drive: perHour[3],
network: perHour[4]
},
perDay: {
federation: perDay[0],
users: perDay[1],
notes: perDay[2],
drive: perDay[3],
network: perDay[4]
}
};
this.chart = chart;
this.render();
},
methods: {
setSrc(src) {
this.src = src;
},
render() {
if (this.chartInstance) {
this.chartInstance.destroy();
}
this.chartInstance = new ApexCharts(this.$refs.chart, {
chart: {
type: 'area',
height: 300,
animations: {
dynamicAnimation: {
enabled: false
}
},
toolbar: {
show: false
},
zoom: {
enabled: false
}
},
dataLabels: {
enabled: false
},
grid: {
clipMarkers: false,
borderColor: 'rgba(0, 0, 0, 0.1)'
},
stroke: {
curve: 'straight',
width: 2
},
legend: {
labels: {
color: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
},
},
xaxis: {
type: 'datetime',
labels: {
style: {
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
}
},
axisBorder: {
color: 'rgba(0, 0, 0, 0.1)'
},
axisTicks: {
color: 'rgba(0, 0, 0, 0.1)'
},
},
yaxis: {
labels: {
formatter: this.data.bytes ? v => Vue.filter('bytes')(v, 0) : v => Vue.filter('number')(v),
style: {
color: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
}
}
},
series: this.data.series
});
this.chartInstance.render();
},
getDate(i: number) {
const y = this.now.getFullYear();
const m = this.now.getMonth();
const d = this.now.getDate();
const h = this.now.getHours();
return (
this.span == 'day' ? new Date(y, m, d - i) :
this.span == 'hour' ? new Date(y, m, d, h - i) :
null
);
},
format(arr) {
return arr.map((v, i) => ({ x: this.getDate(i).getTime(), y: v }));
},
federationInstancesChart(total: boolean): any {
return {
series: [{
data: this.format(total
? this.stats.federation.instance.total
: sum(this.stats.federation.instance.inc, negate(this.stats.federation.instance.dec))
)
}]
};
},
notesChart(type: string): any {
return {
series: [{
name: 'All',
type: 'line',
data: this.format(type == 'combined'
? sum(this.stats.notes.local.inc, negate(this.stats.notes.local.dec), this.stats.notes.remote.inc, negate(this.stats.notes.remote.dec))
: sum(this.stats.notes[type].inc, negate(this.stats.notes[type].dec))
)
}, {
name: 'Renotes',
type: 'area',
data: this.format(type == 'combined'
? sum(this.stats.notes.local.diffs.renote, this.stats.notes.remote.diffs.renote)
: this.stats.notes[type].diffs.renote
)
}, {
name: 'Replies',
type: 'area',
data: this.format(type == 'combined'
? sum(this.stats.notes.local.diffs.reply, this.stats.notes.remote.diffs.reply)
: this.stats.notes[type].diffs.reply
)
}, {
name: 'Normal',
type: 'area',
data: this.format(type == 'combined'
? sum(this.stats.notes.local.diffs.normal, this.stats.notes.remote.diffs.normal)
: this.stats.notes[type].diffs.normal
)
}]
};
},
notesTotalChart(): any {
return {
series: [{
name: 'Combined',
type: 'line',
data: this.format(sum(this.stats.notes.local.total, this.stats.notes.remote.total))
}, {
name: 'Local',
type: 'area',
data: this.format(this.stats.notes.local.total)
}, {
name: 'Remote',
type: 'area',
data: this.format(this.stats.notes.remote.total)
}]
};
},
usersChart(total: boolean): any {
return {
series: [{
name: 'Combined',
type: 'line',
data: this.format(total
? sum(this.stats.users.local.total, this.stats.users.remote.total)
: sum(this.stats.users.local.inc, negate(this.stats.users.local.dec), this.stats.users.remote.inc, negate(this.stats.users.remote.dec))
)
}, {
name: 'Local',
type: 'area',
data: this.format(total
? this.stats.users.local.total
: sum(this.stats.users.local.inc, negate(this.stats.users.local.dec))
)
}, {
name: 'Remote',
type: 'area',
data: this.format(total
? this.stats.users.remote.total
: sum(this.stats.users.remote.inc, negate(this.stats.users.remote.dec))
)
}]
};
},
driveChart(): any {
return {
bytes: true,
series: [{
name: 'All',
type: 'line',
data: this.format(
sum(
this.stats.drive.local.incSize,
negate(this.stats.drive.local.decSize),
this.stats.drive.remote.incSize,
negate(this.stats.drive.remote.decSize)
)
)
}, {
name: 'Local +',
type: 'area',
data: this.format(this.stats.drive.local.incSize)
}, {
name: 'Local -',
type: 'area',
data: this.format(negate(this.stats.drive.local.decSize))
}, {
name: 'Remote +',
type: 'area',
data: this.format(this.stats.drive.remote.incSize)
}, {
name: 'Remote -',
type: 'area',
data: this.format(negate(this.stats.drive.remote.decSize))
}]
};
},
driveTotalChart(): any {
return {
bytes: true,
series: [{
name: 'Combined',
type: 'line',
data: this.format(sum(this.stats.drive.local.totalSize, this.stats.drive.remote.totalSize))
}, {
name: 'Local',
type: 'area',
data: this.format(this.stats.drive.local.totalSize)
}, {
name: 'Remote',
type: 'area',
data: this.format(this.stats.drive.remote.totalSize)
}]
};
},
driveFilesChart(): any {
return {
series: [{
name: 'All',
type: 'line',
data: this.format(
sum(
this.stats.drive.local.incCount,
negate(this.stats.drive.local.decCount),
this.stats.drive.remote.incCount,
negate(this.stats.drive.remote.decCount)
)
)
}, {
name: 'Local +',
type: 'area',
data: this.format(this.stats.drive.local.incCount)
}, {
name: 'Local -',
type: 'area',
data: this.format(negate(this.stats.drive.local.decCount))
}, {
name: 'Remote +',
type: 'area',
data: this.format(this.stats.drive.remote.incCount)
}, {
name: 'Remote -',
type: 'area',
data: this.format(negate(this.stats.drive.remote.decCount))
}]
};
},
driveFilesTotalChart(): any {
return {
series: [{
name: 'Combined',
type: 'line',
data: this.format(sum(this.stats.drive.local.totalCount, this.stats.drive.remote.totalCount))
}, {
name: 'Local',
type: 'area',
data: this.format(this.stats.drive.local.totalCount)
}, {
name: 'Remote',
type: 'area',
data: this.format(this.stats.drive.remote.totalCount)
}]
};
},
networkRequestsChart(): any {
return {
series: [{
name: 'Incoming',
data: this.format(this.stats.network.incomingRequests)
}]
};
},
networkTimeChart(): any {
const data = [];
for (let i = 0; i < limit; i++) {
data.push(this.stats.network.incomingRequests[i] != 0 ? (this.stats.network.totalTime[i] / this.stats.network.incomingRequests[i]) : 0);
}
return {
series: [{
name: 'Avg time',
data: this.format(data)
}]
};
},
networkUsageChart(): any {
return {
bytes: true,
series: [{
name: 'Incoming',
data: this.format(this.stats.network.incomingBytes)
}, {
name: 'Outgoing',
data: this.format(this.stats.network.outgoingBytes)
}]
};
},
}
});
</script>
<style lang="stylus" scoped>
.qvgidhudpqhjttdhxubzuyrhyzgslujw
display block
flex 1
padding 32px 24px
padding-bottom 0
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
background var(--face)
border-radius 8px
> header
display flex
margin 0 8px
padding 0 0 8px 0
font-size 1em
color var(--adminDashboardCardFg)
border-bottom solid 1px var(--adminDashboardCardDivider)
> b
margin-right 8px
> *:last-child
margin-left auto
*
&:not(.active)
color var(--primary)
cursor pointer
</style>

View File

@ -0,0 +1,180 @@
<template>
<div class="zyknedwtlthezamcjlolyusmipqmjgxz">
<div>
<header>
<span><fa icon="microchip"/> CPU <span>{{ cpuP }}%</span></span>
<span v-if="meta">{{ meta.cpu.model }}</span>
</header>
<div ref="cpu"></div>
</div>
<div>
<header>
<span><fa icon="memory"/> MEM <span>{{ memP }}%</span></span>
<span v-if="meta"></span>
</header>
<div ref="mem"></div>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import * as ApexCharts from 'apexcharts';
export default Vue.extend({
props: ['connection'],
data() {
return {
stats: [],
cpuChart: null,
memChart: null,
cpuP: '',
memP: '',
meta: null
};
},
watch: {
stats(stats) {
this.cpuChart.updateSeries([{
data: stats.map((x, i) => ({ x: i, y: x.cpu_usage }))
}]);
this.memChart.updateSeries([{
data: stats.map((x, i) => ({ x: i, y: (x.mem.used / x.mem.total) }))
}]);
}
},
mounted() {
(this as any).os.getMeta().then(meta => {
this.meta = meta;
});
this.connection.on('stats', this.onStats);
this.connection.on('statsLog', this.onStatsLog);
this.connection.send('requestLog', {
id: Math.random().toString().substr(2, 8),
length: 200
});
const chartOpts = {
chart: {
type: 'area',
height: 200,
animations: {
dynamicAnimation: {
enabled: false
}
},
toolbar: {
show: false
},
zoom: {
enabled: false
}
},
dataLabels: {
enabled: false
},
grid: {
clipMarkers: false,
borderColor: 'rgba(0, 0, 0, 0.1)'
},
stroke: {
curve: 'straight',
width: 2
},
tooltip: {
enabled: false
},
series: [{
data: []
}],
xaxis: {
type: 'numeric',
labels: {
show: false
},
tooltip: {
enabled: false
}
},
yaxis: {
show: false,
min: 0,
max: 1
}
};
this.cpuChart = new ApexCharts(this.$refs.cpu, chartOpts);
this.memChart = new ApexCharts(this.$refs.mem, chartOpts);
this.cpuChart.render();
this.memChart.render();
},
beforeDestroy() {
this.connection.off('stats', this.onStats);
this.connection.off('statsLog', this.onStatsLog);
},
methods: {
onStats(stats) {
this.stats.push(stats);
if (this.stats.length > 200) this.stats.shift();
this.cpuP = (stats.cpu_usage * 100).toFixed(0);
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
},
onStatsLog(statsLog) {
statsLog.reverse().forEach(stats => this.onStats(stats));
}
}
});
</script>
<style lang="stylus" scoped>
.zyknedwtlthezamcjlolyusmipqmjgxz
display flex
> div
display block
flex 1
padding 20px 12px 0 12px
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
background var(--face)
border-radius 8px
&:first-child
margin-right 16px
> header
display flex
padding 0 8px
margin-bottom -16px
color var(--adminDashboardCardFg)
font-size 14px
> span
&:last-child
margin-left auto
opacity 0.7
> span
opacity 0.7
> div
margin-bottom -10px
@media (max-width 1000px)
display block
margin-bottom 26px
> div
&:first-child
margin-right 0
margin-bottom 26px
</style>

View File

@ -0,0 +1,236 @@
<template>
<div class="obdskegsannmntldydackcpzezagxqfy">
<header v-if="meta">
<p><b>Misskey</b><span>{{ meta.version }}</span></p>
<p><b>Machine</b><span>{{ meta.machine }}</span></p>
<p><b>OS</b><span>{{ meta.os }}</span></p>
<p><b>Node</b><span>{{ meta.node }}</span></p>
<p>%i18n:common.ai-chan-kawaii%</p>
</header>
<div v-if="stats" class="stats">
<div>
<div>
<div><fa icon="user"/></div>
<div>
<span>%i18n:@accounts%</span>
<b class="primary">{{ stats.originalUsersCount | number }}</b>
</div>
</div>
<div>
<span><fa icon="home"/> %i18n:@this-instance%</span>
<span @click="setChartSrc('users')"><fa :icon="['far', 'chart-bar']"/></span>
</div>
</div>
<div>
<div>
<div><fa icon="pencil-alt"/></div>
<div>
<span>%i18n:@notes%</span>
<b class="primary">{{ stats.originalNotesCount | number }}</b>
</div>
</div>
<div>
<span><fa icon="home"/> %i18n:@this-instance%</span>
<span @click="setChartSrc('notes')"><fa :icon="['far', 'chart-bar']"/></span>
</div>
</div>
<div>
<div>
<div><fa icon="database"/></div>
<div>
<span>%i18n:@drive%</span>
<b>{{ stats.driveUsageLocal | bytes }}</b>
</div>
</div>
<div>
<span><fa icon="home"/> %i18n:@this-instance%</span>
<span @click="setChartSrc('drive')"><fa :icon="['far', 'chart-bar']"/></span>
</div>
</div>
<div>
<div>
<div><fa :icon="['far', 'hdd']"/></div>
<div>
<span>%i18n:@instances%</span>
<b>{{ stats.instances | number }}</b>
</div>
</div>
<div>
<span><fa icon="globe"/> %i18n:@federated%</span>
<span @click="setChartSrc('federation-instances-total')"><fa :icon="['far', 'chart-bar']"/></span>
</div>
</div>
</div>
<div class="charts">
<x-charts ref="charts"/>
</div>
<div class="cpu-memory">
<x-cpu-memory :connection="connection"/>
</div>
<div class="ap">
<x-ap-log/>
</div>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import XCpuMemory from "./cpu-memory.vue";
import XCharts from "./charts.vue";
import XApLog from "./ap-log.vue";
export default Vue.extend({
components: {
XCpuMemory,
XCharts,
XApLog
},
data() {
return {
stats: null,
connection: null,
meta: null
};
},
created() {
this.connection = (this as any).os.stream.useSharedConnection('serverStats');
(this as any).os.getMeta().then(meta => {
this.meta = meta;
});
(this as any).api('stats').then(stats => {
this.stats = stats;
});
},
beforeDestroy() {
this.connection.dispose();
},
methods: {
setChartSrc(src) {
this.$refs.charts.setSrc(src);
}
}
});
</script>
<style lang="stylus" scoped>
.obdskegsannmntldydackcpzezagxqfy
padding 16px
@media (min-width 500px)
padding 32px
> header
display flex
margin-bottom 16px
padding-bottom 16px
border-bottom solid 1px var(--adminDashboardHeaderBorder)
color var(--adminDashboardHeaderFg)
font-size 14px
white-space nowrap
@media (max-width 1000px)
display none
> p
display block
margin 0 32px 0 0
overflow hidden
text-overflow ellipsis
> b
&:after
content ':'
margin-right 8px
&:last-child
margin-left auto
margin-right 0
> .stats
display flex
justify-content space-between
margin-bottom 16px
> div
flex 1
margin-right 16px
color var(--adminDashboardCardFg)
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
background var(--adminDashboardCardBg)
border-radius 8px
&:last-child
margin-right 0
> div:first-child
display flex
align-items center
text-align center
&:last-child
margin-right 0
> div:first-child
padding 16px 24px
font-size 28px
> div:last-child
flex 1
padding 16px 32px 16px 0
text-align right
> span
font-size 70%
opacity 0.7
> b
display block
&.primary
color var(--primary)
> div:last-child
display flex
padding 6px 16px
border-top solid 1px var(--adminDashboardCardDivider)
> span
font-size 70%
opacity 0.7
&:last-child
margin-left auto
cursor pointer
@media (max-width 900px)
display grid
grid-template-columns 1fr 1fr
grid-template-rows 1fr 1fr
gap 16px
> div
margin-right 0
@media (max-width 500px)
display block
> div:not(:last-child)
margin-bottom 16px
> .charts
margin-bottom 16px
> .cpu-memory
margin-bottom 16px
</style>

View File

@ -0,0 +1,147 @@
<template>
<div class="tumhkfkmgtvzljezfvmgkeurkfncshbe">
<ui-card>
<div slot="title"><fa icon="plus"/> %i18n:@add-emoji.title%</div>
<section class="fit-top">
<ui-horizon-group inputs>
<ui-input v-model="name">
<span>%i18n:@add-emoji.name%</span>
<span slot="desc">%i18n:@add-emoji.name-desc%</span>
</ui-input>
<ui-input v-model="aliases">
<span>%i18n:@add-emoji.aliases%</span>
<span slot="desc">%i18n:@add-emoji.aliases-desc%</span>
</ui-input>
</ui-horizon-group>
<ui-input v-model="url">
<i slot="icon"><fa icon="link"/></i>
<span>%i18n:@add-emoji.url%</span>
</ui-input>
<ui-info>%i18n:@add-emoji.info%</ui-info>
<ui-button @click="add">%i18n:@add-emoji.add%</ui-button>
</section>
</ui-card>
<ui-card>
<div slot="title"><fa :icon="['far', 'grin']"/> %i18n:@emojis.title%</div>
<section v-for="emoji in emojis">
<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/>
<ui-horizon-group inputs>
<ui-input v-model="emoji.name">
<span>%i18n:@add-emoji.name%</span>
</ui-input>
<ui-input v-model="emoji.aliases">
<span>%i18n:@add-emoji.aliases%</span>
</ui-input>
</ui-horizon-group>
<ui-input v-model="emoji.url">
<i slot="icon"><fa icon="link"/></i>
<span>%i18n:@add-emoji.url%</span>
</ui-input>
<ui-horizon-group>
<ui-button @click="updateEmoji(emoji)"><fa :icon="['far', 'save']"/> %i18n:@emojis.update%</ui-button>
<ui-button @click="removeEmoji(emoji)"><fa :icon="['far', 'trash-alt']"/> %i18n:@emojis.remove%</ui-button>
</ui-horizon-group>
</section>
</ui-card>
</div>
</template>
<script lang="ts">
import Vue from "vue";
export default Vue.extend({
data() {
return {
name: '',
url: '',
aliases: '',
emojis: []
};
},
mounted() {
this.fetchEmojis();
},
methods: {
add() {
(this as any).api('admin/emoji/add', {
name: this.name,
url: this.url,
aliases: this.aliases.split(' ').filter(x => x.length > 0)
}).then(() => {
this.$swal({
type: 'success',
text: '%i18n:@add-emoji.added%'
});
this.fetchEmojis();
}).catch(e => {
this.$swal({
type: 'error',
text: e
});
});
},
fetchEmojis() {
(this as any).api('admin/emoji/list').then(emojis => {
emojis.reverse();
emojis.forEach(e => e.aliases = (e.aliases || []).join(' '));
this.emojis = emojis;
});
},
updateEmoji(emoji) {
(this as any).api('admin/emoji/update', {
id: emoji.id,
name: emoji.name,
url: emoji.url,
aliases: emoji.aliases.split(' ').filter(x => x.length > 0)
}).then(() => {
this.$swal({
type: 'success',
text: '%i18n:@updated%'
});
}).catch(e => {
this.$swal({
type: 'error',
text: e
});
});
},
removeEmoji(emoji) {
this.$swal({
type: 'warning',
text: '%i18n:@remove-emoji.are-you-sure%'.replace('$1', emoji.name),
showCancelButton: true
}).then(res => {
if (!res.value) return;
(this as any).api('admin/emoji/remove', {
id: emoji.id
}).then(() => {
this.$swal({
type: 'success',
text: '%i18n:@remove-emoji.removed%'
});
this.fetchEmojis();
}).catch(e => {
this.$swal({
type: 'error',
text: e
});
});
});
}
}
});
</script>
<style lang="stylus" scoped>
.tumhkfkmgtvzljezfvmgkeurkfncshbe
@media (min-width 500px)
padding 16px
</style>

View File

@ -1,8 +1,12 @@
<template> <template>
<div class="jdnqwkzlnxcfftthoybjxrebyolvoucw mk-admin-card"> <div>
<header>%i18n:@hided-tags%</header> <ui-card>
<textarea v-model="hidedTags"></textarea> <div slot="title">%i18n:@hided-tags%</div>
<button class="ui" @click="save">%i18n:@save%</button> <section>
<textarea class="jdnqwkzlnxcfftthoybjxrebyolvoucw" v-model="hidedTags"></textarea>
<ui-button @click="save">%i18n:@save%</ui-button>
</section>
</ui-card>
</div> </div>
</template> </template>
@ -25,9 +29,9 @@ export default Vue.extend({
(this as any).api('admin/update-meta', { (this as any).api('admin/update-meta', {
hidedTags: this.hidedTags.split('\n') hidedTags: this.hidedTags.split('\n')
}).then(() => { }).then(() => {
(this as any).os.apis.dialog({ text: `Saved` }); //(this as any).os.apis.dialog({ text: `Saved` });
}).catch(e => { }).catch(e => {
(this as any).os.apis.dialog({ text: `Failed ${e}` }); //(this as any).os.apis.dialog({ text: `Failed ${e}` });
}); });
} }
} }
@ -35,11 +39,8 @@ export default Vue.extend({
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
.jdnqwkzlnxcfftthoybjxrebyolvoucw .jdnqwkzlnxcfftthoybjxrebyolvoucw
textarea width 100%
width 100% min-height 300px
min-height 300px
</style> </style>

View File

@ -0,0 +1,260 @@
<template>
<div class="mk-admin" :class="{ isMobile }">
<header v-show="isMobile">
<button class="nav" @click="navOpend = true"><fa icon="bars"/></button>
<span>MisskeyMyAdmin</span>
</header>
<div class="nav-backdrop"
v-if="navOpend && isMobile"
@click="navOpend = false"
@touchstart="navOpend = false"
></div>
<nav v-show="navOpend">
<div class="mi">
<img svg-inline src="../assets/header-icon.svg"/>
</div>
<div class="me">
<img class="avatar" :src="$store.state.i.avatarUrl" alt="avatar"/>
<p class="name">{{ $store.state.i | userName }}</p>
</div>
<ul>
<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }"><fa icon="home" fixed-width/>%i18n:@dashboard%</li>
<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>%i18n:@instance%</li>
<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>%i18n:@users%</li>
<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="['far', 'grin']" fixed-width/>%i18n:@emoji%</li>
<li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>%i18n:@announcements%</li>
<li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }"><fa icon="hashtag" fixed-width/>%i18n:@hashtags%</li>
<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>%i18n:common.drive%</li> -->
<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> -->
</ul>
<div class="back-to-misskey">
<a href="/"><fa icon="arrow-left"/> %i18n:@back-to-misskey%</a>
</div>
<div class="version">
<small>Misskey {{ version }}</small>
</div>
</nav>
<main>
<div v-if="page == 'dashboard'"><x-dashboard/></div>
<div v-if="page == 'instance'"><x-instance/></div>
<div v-if="page == 'users'"><x-users/></div>
<div v-if="page == 'emoji'"><x-emoji/></div>
<div v-if="page == 'announcements'"><x-announcements/></div>
<div v-if="page == 'hashtags'"><x-hashtags/></div>
<div v-if="page == 'drive'"></div>
<div v-if="page == 'update'"></div>
</main>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import { version } from '../../config';
import XDashboard from "./dashboard.vue";
import XInstance from "./instance.vue";
import XEmoji from "./emoji.vue";
import XAnnouncements from "./announcements.vue";
import XHashtags from "./hashtags.vue";
import XUsers from "./users.vue";
// Detect the user agent
const ua = navigator.userAgent.toLowerCase();
const isMobile = /mobile|iphone|ipad|android/.test(ua);
export default Vue.extend({
components: {
XDashboard,
XInstance,
XEmoji,
XAnnouncements,
XHashtags,
XUsers
},
provide: {
isMobile
},
data() {
return {
page: 'dashboard',
version,
isMobile,
navOpend: !isMobile
};
},
methods: {
nav(page: string) {
this.page = page;
}
}
});
</script>
<style lang="stylus">
.mk-admin
$headerHeight = 48px
display flex
height 100%
> header
position fixed
top 0
z-index 10000
width 100%
color var(--mobileHeaderFg)
background-color var(--mobileHeaderBg)
box-shadow 0 1px 0 rgba(#000, 0.075)
&, *
user-select none
> span
display block
line-height $headerHeight
text-align center
> .nav
display block
position absolute
top 0
left 0
z-index 10001
padding 0
width $headerHeight
font-size 1.4em
line-height $headerHeight
border-right solid 1px rgba(#000, 0.1)
> [data-icon]
transition all 0.2s ease
> nav
position fixed
z-index 20001
top 0
left 0
width 250px
height 100vh
overflow auto
background #333
color #fff
> .mi
text-align center
> svg
width 24px
height 82px
vertical-align top
fill #fff
opacity 0.7
> .me
display flex
margin 0 16px 16px 16px
padding 16px 0
align-items center
border-top solid 1px #555
border-bottom solid 1px #555
> .avatar
height 48px
border-radius 100%
vertical-align middle
> .name
margin 0 16px
padding 0
color #fff
overflow hidden
text-overflow ellipsis
white-space nowrap
font-size 15px
> .back-to-misskey
margin 16px 16px 0 16px
padding 0
border-top solid 1px #555
> a
display block
padding 16px 4px
color inherit
text-decoration none
color #eee
font-size 15px
&:hover
color #fff
> [data-icon]
margin-right 6px
> .version
margin 0 16px 16px 16px
padding-top 16px
border-top solid 1px #555
text-align center
> small
opacity 0.7
> ul
margin 0
padding 0
list-style none
font-size 15px
> li
display block
padding 10px 16px
margin 0
cursor pointer
user-select none
color #eee
transition margin-left 0.2s ease
&:hover
color #fff
> [data-icon]
margin-right 6px
&.active
margin-left 8px
color var(--primary) !important
&:after
content ""
display block
position absolute
top 0
right 0
bottom 0
margin auto 0
height 0
border-top solid 16px transparent
border-right solid 16px var(--bg)
border-bottom solid 16px transparent
border-left solid 16px transparent
> .nav-backdrop
position fixed
top 0
left 0
z-index 20000
width 100%
height 100%
background var(--mobileNavBackdrop)
> main
width 100%
padding 0 0 0 250px
max-width 1300px
&.isMobile
> main
padding $headerHeight 0 0 0
</style>

View File

@ -0,0 +1,195 @@
<template>
<div class="axbwjelsbymowqjyywpirzhdlszoncqs">
<ui-card>
<div slot="title"><fa icon="cog"/> %i18n:@instance%</div>
<section class="fit-top fit-bottom">
<ui-input v-model="name">%i18n:@instance-name%</ui-input>
<ui-textarea v-model="description">%i18n:@instance-description%</ui-textarea>
<ui-input v-model="bannerUrl"><i slot="icon"><fa icon="link"/></i>%i18n:@banner-url%</ui-input>
<ui-input v-model="languages"><i slot="icon"><fa icon="language"/></i>%i18n:@languages%<span slot="desc">%i18n:@languages-desc%</span></ui-input>
</section>
<section class="fit-bottom">
<header><fa icon="headset"/> %i18n:@maintainer-config%</header>
<ui-input v-model="maintainerName">%i18n:@maintainer-name%</ui-input>
<ui-input v-model="maintainerEmail" type="email"><i slot="icon"><fa :icon="['far', 'envelope']"/></i>%i18n:@maintainer-email%</ui-input>
</section>
<section class="fit-top fit-bottom">
<ui-input v-model="maxNoteTextLength">%i18n:@max-note-text-length%</ui-input>
</section>
<section class="fit-bottom">
<header><fa icon="cloud"/> %i18n:@drive-config%</header>
<ui-switch v-model="cacheRemoteFiles">%i18n:@cache-remote-files%<span slot="desc">%i18n:@cache-remote-files-desc%</span></ui-switch>
<ui-input v-model="localDriveCapacityMb" type="number">%i18n:@local-drive-capacity-mb%<span slot="suffix">MB</span><span slot="desc">%i18n:@mb%</span></ui-input>
<ui-input v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles">%i18n:@remote-drive-capacity-mb%<span slot="suffix">MB</span><span slot="desc">%i18n:@mb%</span></ui-input>
</section>
<section class="fit-bottom">
<header><fa icon="shield-alt"/> %i18n:@recaptcha-config%</header>
<ui-switch v-model="enableRecaptcha">%i18n:@enable-recaptcha%</ui-switch>
<ui-info>%i18n:@recaptcha-info%</ui-info>
<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>%i18n:@recaptcha-site-key%</ui-input>
<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>%i18n:@recaptcha-secret-key%</ui-input>
</section>
<section>
<header><fa icon="ghost"/> %i18n:@proxy-account-config%</header>
<ui-info>%i18n:@proxy-account-info%</ui-info>
<ui-input v-model="proxyAccount"><span slot="prefix">@</span>%i18n:@proxy-account-username%<span slot="desc">%i18n:@proxy-account-username-desc%</span></ui-input>
<ui-info warn>%i18n:@proxy-account-warn%</ui-info>
</section>
<section>
<ui-switch v-model="disableRegistration">%i18n:@disable-registration%</ui-switch>
</section>
<section>
<ui-switch v-model="disableLocalTimeline">%i18n:@disable-local-timeline%</ui-switch>
</section>
<section>
<ui-button @click="updateMeta">%i18n:@save%</ui-button>
</section>
</ui-card>
<ui-card>
<div slot="title">%i18n:@invite%</div>
<section>
<ui-button @click="invite">%i18n:@invite%</ui-button>
<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p>
</section>
</ui-card>
<ui-card>
<div slot="title"><fa :icon="['fab', 'twitter']"/> %i18n:@twitter-integration-config%</div>
<section>
<ui-switch v-model="enableTwitterIntegration">%i18n:@enable-twitter-integration%</ui-switch>
<ui-info>%i18n:@twitter-integration-info%</ui-info>
<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>%i18n:@twitter-integration-consumer-key%</ui-input>
<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>%i18n:@twitter-integration-consumer-secret%</ui-input>
<ui-button @click="updateMeta">%i18n:@save%</ui-button>
</section>
</ui-card>
<ui-card>
<div slot="title"><fa :icon="['fab', 'github']"/> %i18n:@github-integration-config%</div>
<section>
<ui-switch v-model="enableGithubIntegration">%i18n:@enable-github-integration%</ui-switch>
<ui-info>%i18n:@github-integration-info%</ui-info>
<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>%i18n:@github-integration-client-id%</ui-input>
<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>%i18n:@github-integration-client-secret%</ui-input>
<ui-button @click="updateMeta">%i18n:@save%</ui-button>
</section>
</ui-card>
</div>
</template>
<script lang="ts">
import Vue from "vue";
export default Vue.extend({
data() {
return {
maintainerName: null,
maintainerEmail: null,
disableRegistration: false,
disableLocalTimeline: false,
bannerUrl: null,
name: null,
description: null,
languages: null,
cacheRemoteFiles: false,
localDriveCapacityMb: null,
remoteDriveCapacityMb: null,
maxNoteTextLength: null,
enableRecaptcha: false,
recaptchaSiteKey: null,
recaptchaSecretKey: null,
enableTwitterIntegration: false,
twitterConsumerKey: null,
twitterConsumerSecret: null,
enableGithubIntegration: false,
githubClientId: null,
githubClientSecret: null,
proxyAccount: null,
inviteCode: null,
};
},
created() {
(this as any).os.getMeta().then(meta => {
this.maintainerName = meta.maintainer.name;
this.maintainerEmail = meta.maintainer.email;
this.bannerUrl = meta.bannerUrl;
this.name = meta.name;
this.description = meta.description;
this.languages = meta.langs.join(' ');
this.cacheRemoteFiles = meta.cacheRemoteFiles;
this.localDriveCapacityMb = meta.driveCapacityPerLocalUserMb;
this.remoteDriveCapacityMb = meta.driveCapacityPerRemoteUserMb;
this.maxNoteTextLength = meta.maxNoteTextLength;
this.enableRecaptcha = meta.enableRecaptcha;
this.recaptchaSiteKey = meta.recaptchaSiteKey;
this.recaptchaSecretKey = meta.recaptchaSecretKey;
this.proxyAccount = meta.proxyAccount;
this.enableTwitterIntegration = meta.enableTwitterIntegration;
this.twitterConsumerKey = meta.twitterConsumerKey;
this.twitterConsumerSecret = meta.twitterConsumerSecret;
this.enableGithubIntegration = meta.enableGithubIntegration;
this.githubClientId = meta.githubClientId;
this.githubClientSecret = meta.githubClientSecret;
});
},
methods: {
invite() {
(this as any).api('admin/invite').then(x => {
this.inviteCode = x.code;
}).catch(e => {
this.$swal({
type: 'error',
text: e
});
});
},
updateMeta() {
(this as any).api('admin/update-meta', {
maintainerName: this.maintainerName,
maintainerEmail: this.maintainerEmail,
disableRegistration: this.disableRegistration,
disableLocalTimeline: this.disableLocalTimeline,
bannerUrl: this.bannerUrl,
name: this.name,
description: this.description,
langs: this.languages.split(' '),
cacheRemoteFiles: this.cacheRemoteFiles,
localDriveCapacityMb: parseInt(this.localDriveCapacityMb, 10),
remoteDriveCapacityMb: parseInt(this.remoteDriveCapacityMb, 10),
maxNoteTextLength: parseInt(this.maxNoteTextLength, 10),
enableRecaptcha: this.enableRecaptcha,
recaptchaSiteKey: this.recaptchaSiteKey,
recaptchaSecretKey: this.recaptchaSecretKey,
proxyAccount: this.proxyAccount,
enableTwitterIntegration: this.enableTwitterIntegration,
twitterConsumerKey: this.twitterConsumerKey,
twitterConsumerSecret: this.twitterConsumerSecret,
enableGithubIntegration: this.enableGithubIntegration,
githubClientId: this.githubClientId,
githubClientSecret: this.githubClientSecret,
}).then(() => {
this.$swal({
type: 'success',
text: '%i18n:@saved%'
});
}).catch(e => {
this.$swal({
type: 'error',
text: e
});
});
}
}
});
</script>
<style lang="stylus" scoped>
.axbwjelsbymowqjyywpirzhdlszoncqs
@media (min-width 500px)
padding 16px
</style>

View File

@ -0,0 +1,136 @@
<template>
<div class="ucnffhbtogqgscfmqcymwmmupoknpfsw">
<ui-card>
<div slot="title">%i18n:@verify-user%</div>
<section class="fit-top">
<ui-input v-model="verifyUsername" type="text">
<span slot="prefix">@</span>
</ui-input>
<ui-button @click="verifyUser" :disabled="verifying">%i18n:@verify%</ui-button>
</section>
</ui-card>
<ui-card>
<div slot="title">%i18n:@unverify-user%</div>
<section class="fit-top">
<ui-input v-model="unverifyUsername" type="text">
<span slot="prefix">@</span>
</ui-input>
<ui-button @click="unverifyUser" :disabled="unverifying">%i18n:@unverify%</ui-button>
</section>
</ui-card>
<ui-card>
<div slot="title">%i18n:@suspend-user%</div>
<section class="fit-top">
<ui-input v-model="suspendUsername" type="text">
<span slot="prefix">@</span>
</ui-input>
<ui-button @click="suspendUser" :disabled="suspending">%i18n:@suspend%</ui-button>
</section>
</ui-card>
<ui-card>
<div slot="title">%i18n:@unsuspend-user%</div>
<section class="fit-top">
<ui-input v-model="unsuspendUsername" type="text">
<span slot="prefix">@</span>
</ui-input>
<ui-button @click="unsuspendUser" :disabled="unsuspending">%i18n:@unsuspend%</ui-button>
</section>
</ui-card>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import parseAcct from "../../../../misc/acct/parse";
export default Vue.extend({
data() {
return {
verifyUsername: null,
verifying: false,
unverifyUsername: null,
unverifying: false,
suspendUsername: null,
suspending: false,
unsuspendUsername: null,
unsuspending: false
};
},
methods: {
async verifyUser() {
this.verifying = true;
const process = async () => {
const user = await (this as any).os.api('users/show', parseAcct(this.verifyUsername));
await (this as any).os.api('admin/verify-user', { userId: user.id });
//(this as any).os.apis.dialog({ text: '%i18n:@verified%' });
};
await process().catch(e => {
//(this as any).os.apis.dialog({ text: `Failed: ${e}` });
});
this.verifying = false;
},
async unverifyUser() {
this.unverifying = true;
const process = async () => {
const user = await (this as any).os.api('users/show', parseAcct(this.unverifyUsername));
await (this as any).os.api('admin/unverify-user', { userId: user.id });
//(this as any).os.apis.dialog({ text: '%i18n:@unverified%' });
};
await process().catch(e => {
//(this as any).os.apis.dialog({ text: `Failed: ${e}` });
});
this.unverifying = false;
},
async suspendUser() {
this.suspending = true;
const process = async () => {
const user = await (this as any).os.api('users/show', parseAcct(this.suspendUsername));
await (this as any).os.api('admin/suspend-user', { userId: user.id });
//(this as any).os.apis.dialog({ text: '%i18n:@suspended%' });
};
await process().catch(e => {
//(this as any).os.apis.dialog({ text: `Failed: ${e}` });
});
this.suspending = false;
},
async unsuspendUser() {
this.unsuspending = true;
const process = async () => {
const user = await (this as any).os.api('users/show', parseAcct(this.unsuspendUsername));
await (this as any).os.api('admin/unsuspend-user', { userId: user.id });
//(this as any).os.apis.dialog({ text: '%i18n:@unsuspended%' });
};
await process().catch(e => {
//(this as any).os.apis.dialog({ text: `Failed: ${e}` });
});
this.unsuspending = false;
}
}
});
</script>
<style lang="stylus" scoped>
.ucnffhbtogqgscfmqcymwmmupoknpfsw
@media (min-width 500px)
padding 16px
</style>

View File

@ -128,7 +128,7 @@ pre
overflow auto overflow auto
tab-size 2 tab-size 2
[data-fa] [data-icon]
display inline-block display inline-block
.swal2-container .swal2-container

View File

@ -46,6 +46,7 @@
if (`${url.pathname}/`.startsWith('/docs/')) app = 'docs'; if (`${url.pathname}/`.startsWith('/docs/')) app = 'docs';
if (`${url.pathname}/`.startsWith('/dev/')) app = 'dev'; if (`${url.pathname}/`.startsWith('/dev/')) app = 'dev';
if (`${url.pathname}/`.startsWith('/auth/')) app = 'auth'; if (`${url.pathname}/`.startsWith('/auth/')) app = 'auth';
if (`${url.pathname}/`.startsWith('/admin/')) app = 'admin';
//#endregion //#endregion
//#region Detect the user language //#region Detect the user language

View File

@ -1,5 +1,5 @@
import MiOS from '../../mios'; import MiOS from '../../mios';
import { version as current } from '../../config'; import { clientVersion as current } from '../../config';
export default async function(mios: MiOS, force = false, silent = false) { export default async function(mios: MiOS, force = false, silent = false) {
const meta = await mios.getMeta(force); const meta = await mios.getMeta(force);

View File

@ -1,6 +1,6 @@
<template> <template>
<ui-card> <ui-card>
<div slot="title">%fa:key% API</div> <div slot="title"><fa icon="key"/> API</div>
<section class="fit-top"> <section class="fit-top">
<ui-input :value="$store.state.i.token" readonly> <ui-input :value="$store.state.i.token" readonly>
@ -9,20 +9,21 @@
<p>%i18n:@intro%</p> <p>%i18n:@intro%</p>
<ui-info warn>%i18n:@caution%</ui-info> <ui-info warn>%i18n:@caution%</ui-info>
<p>%i18n:@regeneration-of-token%</p> <p>%i18n:@regeneration-of-token%</p>
<ui-button @click="regenerateToken">%fa:sync-alt% %i18n:@regenerate-token%</ui-button> <ui-button @click="regenerateToken"><fa icon="sync-alt"/> %i18n:@regenerate-token%</ui-button>
</section> </section>
<section> <section>
<header>%fa:terminal% %i18n:@console.title%</header> <header><fa icon="terminal"/> %i18n:@console.title%</header>
<ui-input v-model="endpoint"> <ui-input v-model="endpoint">
<span>%i18n:@console.endpoint%</span> <span>%i18n:@console.endpoint%</span>
</ui-input> </ui-input>
<ui-textarea v-model="body"> <ui-textarea v-model="body">
<span>%i18n:@console.parameter% (JSON or JSON5)</span> <span>%i18n:@console.parameter% (JSON or JSON5)</span>
<span slot="desc">%i18n:@console.credential-info%</span>
</ui-textarea> </ui-textarea>
<ui-button @click="send" :disabled="sending"> <ui-button @click="send" :disabled="sending">
<template v-if="sending">%i18n:@console.sending%</template> <template v-if="sending">%i18n:@console.sending%</template>
<template v-else>%fa:paper-plane% %i18n:@console.send%</template> <template v-else><fa icon="paper-plane"/> %i18n:@console.send%</template>
</ui-button> </ui-button>
<ui-textarea v-if="res" v-model="res" readonly tall> <ui-textarea v-if="res" v-model="res" readonly tall>
<span>%i18n:@console.response%</span> <span>%i18n:@console.response%</span>

View File

@ -14,9 +14,11 @@
</ol> </ol>
<ol class="emojis" ref="suggests" v-if="emojis.length > 0"> <ol class="emojis" ref="suggests" v-if="emojis.length > 0">
<li v-for="emoji in emojis" @click="complete(type, emoji.emoji)" @keydown="onKeydown" tabindex="-1"> <li v-for="emoji in emojis" @click="complete(type, emoji.emoji)" @keydown="onKeydown" tabindex="-1">
<span class="emoji">{{ emoji.emoji }}</span> <span class="emoji" v-if="emoji.isCustomEmoji"><img :src="emoji.url" :alt="emoji.emoji"/></span>
<span class="emoji" v-else-if="!useOsDefaultEmojis"><img :src="emoji.url" :alt="emoji.emoji"/></span>
<span class="emoji" v-else>{{ emoji.emoji }}</span>
<span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span> <span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
<span class="alias" v-if="emoji.alias">({{ emoji.alias }})</span> <span class="alias" v-if="emoji.aliasOf">({{ emoji.aliasOf }})</span>
</li> </li>
</ol> </ol>
</div> </div>
@ -27,14 +29,29 @@ import Vue from 'vue';
import * as emojilib from 'emojilib'; import * as emojilib from 'emojilib';
import contains from '../../../common/scripts/contains'; import contains from '../../../common/scripts/contains';
type EmojiDef = {
emoji: string;
name: string;
aliasOf?: string;
url?: string;
isCustomEmoji?: boolean;
};
const lib = Object.entries(emojilib.lib).filter((x: any) => { const lib = Object.entries(emojilib.lib).filter((x: any) => {
return x[1].category != 'flags'; return x[1].category != 'flags';
}); });
const emjdb = lib.map((x: any) => ({ const char2file = (char: string) => {
let codes = [...char].map(x => x.codePointAt(0).toString(16));
if (!codes.includes('200d')) codes = codes.filter(x => x != 'fe0f');
return codes.join('-');
};
const emjdb: EmojiDef[] = lib.map((x: any) => ({
emoji: x[1].char, emoji: x[1].char,
name: x[0], name: x[0],
alias: null aliasOf: null,
url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
})); }));
lib.forEach((x: any) => { lib.forEach((x: any) => {
@ -43,7 +60,8 @@ lib.forEach((x: any) => {
emjdb.push({ emjdb.push({
emoji: x[1].char, emoji: x[1].char,
name: k, name: k,
alias: x[0] aliasOf: x[0],
url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
}); });
}); });
} }
@ -61,13 +79,18 @@ export default Vue.extend({
hashtags: [], hashtags: [],
emojis: [], emojis: [],
select: -1, select: -1,
emojilib emojilib,
emojiDb: [] as EmojiDef[]
} }
}, },
computed: { computed: {
items(): HTMLCollection { items(): HTMLCollection {
return (this.$refs.suggests as Element).children; return (this.$refs.suggests as Element).children;
},
useOsDefaultEmojis(): boolean {
return this.$store.state.device.useOsDefaultEmojis;
} }
}, },
@ -90,6 +113,36 @@ export default Vue.extend({
}, },
mounted() { mounted() {
//#region Construct Emoji DB
const customEmojis = (this.os.getMetaSync() || { emojis: [] }).emojis || [];
const emojiDefinitions: EmojiDef[] = [];
customEmojis.forEach(x => {
emojiDefinitions.push({
name: x.name,
emoji: `:${x.name}:`,
url: x.url,
isCustomEmoji: true
});
if (x.aliases) {
x.aliases.forEach(alias => {
emojiDefinitions.push({
name: alias,
aliasOf: x.name,
emoji: `:${x.name}:`,
url: x.url,
isCustomEmoji: true
});
});
}
});
emojiDefinitions.sort((a, b) => a.name.length - b.name.length);
this.emojiDb = emojiDefinitions.concat(emjdb);
//#endregion
this.textarea.addEventListener('keydown', this.onKeydown); this.textarea.addEventListener('keydown', this.onKeydown);
Array.from(document.querySelectorAll('body *')).forEach(el => { Array.from(document.querySelectorAll('body *')).forEach(el => {
@ -168,23 +221,35 @@ export default Vue.extend({
} }
} }
} else if (this.type == 'emoji') { } else if (this.type == 'emoji') {
if (this.q == null || this.q == '') {
this.emojis = this.emojiDb.filter(x => x.isCustomEmoji && !x.aliasOf).sort((a, b) => {
var textA = a.name.toUpperCase();
var textB = b.name.toUpperCase();
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});
return;
}
const matched = []; const matched = [];
emjdb.some(x => { const max = 30;
if (x.name.indexOf(this.q) == 0 && !x.alias && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
return matched.length == 30; this.emojiDb.some(x => {
if (x.name.startsWith(this.q) && !x.aliasOf && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
return matched.length == max;
}); });
if (matched.length < 30) { if (matched.length < max) {
emjdb.some(x => { this.emojiDb.some(x => {
if (x.name.indexOf(this.q) == 0 && !matched.some(y => y.emoji == x.emoji)) matched.push(x); if (x.name.startsWith(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
return matched.length == 30; return matched.length == max;
}); });
} }
if (matched.length < 30) { if (matched.length < max) {
emjdb.some(x => { this.emojiDb.some(x => {
if (x.name.indexOf(this.q) > -1 && !matched.some(y => y.emoji == x.emoji)) matched.push(x); if (x.name.includes(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
return matched.length == 30; return matched.length == max;
}); });
} }
this.emojis = matched; this.emojis = matched;
} }
}, },
@ -340,6 +405,10 @@ export default Vue.extend({
margin 0 4px 0 0 margin 0 4px 0 0
width 24px width 24px
> img
width 24px
vertical-align bottom
.name .name
color var(--autocompleteItemText) color var(--autocompleteItemText)

View File

@ -1,35 +1,35 @@
<template> <template>
<div class="troubleshooter"> <div class="troubleshooter">
<div class="body"> <div class="body">
<h1>%fa:wrench%%i18n:@title%</h1> <h1><fa icon="wrench"/>%i18n:@title%</h1>
<div> <div>
<p :data-wip="network == null"> <p :data-wip="network == null">
<template v-if="network != null"> <template v-if="network != null">
<template v-if="network">%fa:check%</template> <template v-if="network"><fa icon="check"/></template>
<template v-if="!network">%fa:times%</template> <template v-if="!network"><fa icon="times"/></template>
</template> </template>
{{ network == null ? '%i18n:@checking-network%' : '%i18n:@network%' }}<mk-ellipsis v-if="network == null"/> {{ network == null ? '%i18n:@checking-network%' : '%i18n:@network%' }}<mk-ellipsis v-if="network == null"/>
</p> </p>
<p v-if="network == true" :data-wip="internet == null"> <p v-if="network == true" :data-wip="internet == null">
<template v-if="internet != null"> <template v-if="internet != null">
<template v-if="internet">%fa:check%</template> <template v-if="internet"><fa icon="check"/></template>
<template v-if="!internet">%fa:times%</template> <template v-if="!internet"><fa icon="times"/></template>
</template> </template>
{{ internet == null ? '%i18n:@checking-internet%' : '%i18n:@internet%' }}<mk-ellipsis v-if="internet == null"/> {{ internet == null ? '%i18n:@checking-internet%' : '%i18n:@internet%' }}<mk-ellipsis v-if="internet == null"/>
</p> </p>
<p v-if="internet == true" :data-wip="server == null"> <p v-if="internet == true" :data-wip="server == null">
<template v-if="server != null"> <template v-if="server != null">
<template v-if="server">%fa:check%</template> <template v-if="server"><fa icon="check"/></template>
<template v-if="!server">%fa:times%</template> <template v-if="!server"><fa icon="times"/></template>
</template> </template>
{{ server == null ? '%i18n:@checking-server%' : '%i18n:@server%' }}<mk-ellipsis v-if="server == null"/> {{ server == null ? '%i18n:@checking-server%' : '%i18n:@server%' }}<mk-ellipsis v-if="server == null"/>
</p> </p>
</div> </div>
<p v-if="!end">%i18n:@finding%<mk-ellipsis/></p> <p v-if="!end">%i18n:@finding%<mk-ellipsis/></p>
<p v-if="network === false"><b>%fa:exclamation-triangle%%i18n:@no-network%</b><br>%i18n:@no-network-desc%</p> <p v-if="network === false"><b><fa icon="exclamation-triangle"/>%i18n:@no-network%</b><br>%i18n:@no-network-desc%</p>
<p v-if="internet === false"><b>%fa:exclamation-triangle%%i18n:@no-internet%</b><br>%i18n:@no-internet-desc%</p> <p v-if="internet === false"><b><fa icon="exclamation-triangle"/>%i18n:@no-internet%</b><br>%i18n:@no-internet-desc%</p>
<p v-if="server === false"><b>%fa:exclamation-triangle%%i18n:@no-server%</b><br>%i18n:@no-server-desc%</p> <p v-if="server === false"><b><fa icon="exclamation-triangle"/>%i18n:@no-server%</b><br>%i18n:@no-server-desc%</p>
<p v-if="server === true" class="success"><b>%fa:info-circle%%i18n:@success%</b><br>%i18n:@success-desc%</p> <p v-if="server === true" class="success"><b><fa icon="info-circle"/>%i18n:@success%</b><br>%i18n:@success-desc%</p>
</div> </div>
<footer> <footer>
<a href="/assets/flush.html">%i18n:@flush%</a> | <a href="/assets/version.html">%i18n:@set-version%</a> <a href="/assets/flush.html">%i18n:@flush%</a> | <a href="/assets/version.html">%i18n:@set-version%</a>
@ -100,7 +100,7 @@ export default Vue.extend({
color #444 color #444
border-bottom solid 1px #eee border-bottom solid 1px #eee
> [data-fa] > [data-icon]
margin-right 0.25em margin-right 0.25em
> div > div
@ -115,7 +115,7 @@ export default Vue.extend({
&[data-wip] &[data-wip]
color #888 color #888
> [data-fa] > [data-icon]
margin-right 0.25em margin-right 0.25em
&.times &.times
@ -132,7 +132,7 @@ export default Vue.extend({
border-top solid 1px #eee border-top solid 1px #eee
> b > b
> [data-fa] > [data-icon]
margin-right 0.25em margin-right 0.25em
&.success &.success

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="mk-connect-failed"> <div class="mk-connect-failed">
<img src="data:image/jpeg;base64,%base64:/assets/error.jpg%" alt=""/> <img src="https://raw.githubusercontent.com/syuilo/misskey/develop/src/client/assets/error.jpg" alt=""/>
<h1>%i18n:@title%</h1> <h1>%i18n:@title%</h1>
<p class="text"> <p class="text">
<span>{{ '%i18n:@description%'.substr(0, '%i18n:@description%'.indexOf('{')) }}</span> <span>{{ '%i18n:@description%'.substr(0, '%i18n:@description%'.indexOf('{')) }}</span>

View File

@ -1,6 +1,6 @@
<template> <template>
<ui-card> <ui-card>
<div slot="title">%fa:cloud% %i18n:common.drive%</div> <div slot="title"><fa icon="cloud"/> %i18n:common.drive%</div>
<section v-if="!fetching" class="juakhbxthdewydyreaphkepoxgxvfogn"> <section v-if="!fetching" class="juakhbxthdewydyreaphkepoxgxvfogn">
<div class="meter"><div :style="meterStyle"></div></div> <div class="meter"><div :style="meterStyle"></div></div>

View File

@ -0,0 +1,85 @@
<template>
<img v-if="customEmoji" class="fvgwvorwhxigeolkkrcderjzcawqrscl custom" :src="url" :alt="alt" :title="alt"/>
<img v-else-if="char && !useOsDefaultEmojis" class="fvgwvorwhxigeolkkrcderjzcawqrscl" :src="url" :alt="alt" :title="alt"/>
<span v-else-if="char && useOsDefaultEmojis">{{ char }}</span>
<span v-else>:{{ name }}:</span>
</template>
<script lang="ts">
import Vue from 'vue';
import { lib } from 'emojilib';
export default Vue.extend({
props: {
name: {
type: String,
required: false
},
emoji: {
type: String,
required: false
},
customEmojis: {
required: false,
default: []
}
},
data() {
return {
url: null,
char: null,
customEmoji: null
}
},
computed: {
alt(): string {
return this.customEmoji ? `:${this.customEmoji.name}:` : this.char;
},
useOsDefaultEmojis(): boolean {
return this.$store.state.device.useOsDefaultEmojis;
}
},
created() {
if (this.name) {
const customEmoji = this.customEmojis.find(x => x.name == this.name);
if (customEmoji) {
this.customEmoji = customEmoji;
this.url = customEmoji.url;
} else {
const emoji = lib[this.name];
if (emoji) {
this.char = emoji.char;
}
}
} else {
this.char = this.emoji;
}
if (this.char) {
let codes = [...this.char].map(x => x.codePointAt(0).toString(16));
if (!codes.includes('200d')) codes = codes.filter(x => x != 'fe0f');
this.url = `https://twemoji.maxcdn.com/2/svg/${codes.join('-')}.svg`;
}
}
});
</script>
<style lang="stylus" scoped>
.fvgwvorwhxigeolkkrcderjzcawqrscl
height 1.25em
vertical-align -0.25em
&.custom
height 2.5em
vertical-align middle
transition transform 0.2s ease
&:hover
transform scale(1.2)
</style>

View File

@ -0,0 +1,19 @@
<template>
<div class="wjqjnyhzogztorhrdgcpqlkxhkmuetgj">
<p><fa icon="exclamation-triangle"/> %i18n:common.error.title%</p>
<ui-button @click="() => $emit('retry')">%i18n:common.error.retry%</ui-button>
</div>
</template>
<style lang="stylus" scoped>
.wjqjnyhzogztorhrdgcpqlkxhkmuetgj
max-width 350px
margin 0 auto
padding 32px
text-align center
color var(--text)
> p
margin 0 0 8px 0
</style>

View File

@ -1,6 +1,6 @@
<template> <template>
<span class="mk-file-type-icon"> <span class="mk-file-type-icon">
<template v-if="kind == 'image'">%fa:file-image%</template> <template v-if="kind == 'image'"><fa icon="file-image"/></template>
</span> </span>
</template> </template>

View File

@ -1,5 +1,5 @@
<template> <template>
<a class="a" href="https://github.com/syuilo/misskey" target="_blank" title="View source on Github"> <a class="a" href="https://github.com/syuilo/misskey" target="_blank" title="View source on GitHub">
<svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="aria-hidden"> <svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="aria-hidden">
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path> <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
<path class="octo-arm" d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor"></path> <path class="octo-arm" d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor"></path>

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="xqnhankfuuilcwvhgsopeqncafzsquya"> <div class="xqnhankfuuilcwvhgsopeqncafzsquya">
<button class="go-index" v-if="selfNav" @click="goIndex">%fa:arrow-left%</button> <button class="go-index" v-if="selfNav" @click="goIndex"><fa icon="arrow-left"/></button>
<header><b><router-link :to="blackUser | userPage">{{ blackUser | userName }}</router-link></b>(%i18n:common.reversi.black%) vs <b><router-link :to="whiteUser | userPage">{{ whiteUser | userName }}</router-link></b>(%i18n:common.reversi.white%)</header> <header><b><router-link :to="blackUser | userPage">{{ blackUser | userName }}</router-link></b>(%i18n:common.reversi.black%) vs <b><router-link :to="whiteUser | userPage">{{ whiteUser | userName }}</router-link></b>(%i18n:common.reversi.white%)</header>
<div style="overflow: hidden; line-height: 28px;"> <div style="overflow: hidden; line-height: 28px;">
@ -51,13 +51,13 @@
<div class="player" v-if="game.isEnded"> <div class="player" v-if="game.isEnded">
<div> <div>
<button @click="logPos = 0" :disabled="logPos == 0">%fa:angle-double-left%</button> <button @click="logPos = 0" :disabled="logPos == 0"><fa icon="angle-double-left"/></button>
<button @click="logPos--" :disabled="logPos == 0">%fa:angle-left%</button> <button @click="logPos--" :disabled="logPos == 0"><fa icon="angle-left"/></button>
</div> </div>
<span>{{ logPos }} / {{ logs.length }}</span> <span>{{ logPos }} / {{ logs.length }}</span>
<div> <div>
<button @click="logPos++" :disabled="logPos == logs.length">%fa:angle-right%</button> <button @click="logPos++" :disabled="logPos == logs.length"><fa icon="angle-right"/></button>
<button @click="logPos = logs.length" :disabled="logPos == logs.length">%fa:angle-double-right%</button> <button @click="logPos = logs.length" :disabled="logPos == logs.length"><fa icon="angle-double-right"/></button>
</div> </div>
</div> </div>

View File

@ -17,13 +17,13 @@
</header> </header>
<div> <div>
<div class="random" v-if="game.settings.map == null">%fa:dice%</div> <div class="random" v-if="game.settings.map == null"><fa icon="dice"/></div>
<div class="board" v-else :style="{ 'grid-template-rows': `repeat(${ game.settings.map.length }, 1fr)`, 'grid-template-columns': `repeat(${ game.settings.map[0].length }, 1fr)` }"> <div class="board" v-else :style="{ 'grid-template-rows': `repeat(${ game.settings.map.length }, 1fr)`, 'grid-template-columns': `repeat(${ game.settings.map[0].length }, 1fr)` }">
<div v-for="(x, i) in game.settings.map.join('')" <div v-for="(x, i) in game.settings.map.join('')"
:data-none="x == ' '" :data-none="x == ' '"
@click="onPixelClick(i, x)"> @click="onPixelClick(i, x)">
<template v-if="x == 'b'"><template v-if="$store.state.device.darkmode">%fa:circle R%</template><template v-else>%fa:circle%</template></template> <template v-if="x == 'b'"><template v-if="$store.state.device.darkmode"><fa :icon="['far', 'circle']"/></template><template v-else><fa icon="circle"/></template></template>
<template v-if="x == 'w'"><template v-if="$store.state.device.darkmode">%fa:circle%</template><template v-else>%fa:circle R%</template></template> <template v-if="x == 'w'"><template v-if="$store.state.device.darkmode"><fa :icon="['far', 'circle']"/></template><template v-else><fa icon="circle"/></template></template>
</div> </div>
</div> </div>
</div> </div>

View File

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

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="mk-google"> <div class="mk-google">
<input type="search" v-model="query" :placeholder="q"> <input type="search" v-model="query" :placeholder="q">
<button @click="search">%fa:search% %i18n:common.search%</button> <button @click="search"><fa icon="search"/> %i18n:common.search%</button>
</div> </div>
</template> </template>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="mk-media-image-dialog"> <div class="dkjvrdxtkvqrwmhfickhndpmnncsgacq">
<div class="bg" @click="close"></div> <div class="bg" @click="close"></div>
<img :src="image.url" :alt="image.name" :title="image.name" @click="close"/> <img :src="image.url" :alt="image.name" :title="image.name" @click="close"/>
</div> </div>
@ -34,7 +34,7 @@ export default Vue.extend({
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
.mk-media-image-dialog .dkjvrdxtkvqrwmhfickhndpmnncsgacq
display block display block
position fixed position fixed
z-index 2048 z-index 2048

View File

@ -1,6 +1,9 @@
import Vue from 'vue'; import Vue from 'vue';
import muteAndBlock from './mute-and-block.vue';
import error from './error.vue';
import apiSettings from './api-settings.vue'; import apiSettings from './api-settings.vue';
import passwordSettings from './password-settings.vue';
import driveSettings from './drive-settings.vue'; import driveSettings from './drive-settings.vue';
import profileEditor from './profile-editor.vue'; import profileEditor from './profile-editor.vue';
import noteSkeleton from './note-skeleton.vue'; import noteSkeleton from './note-skeleton.vue';
@ -34,11 +37,13 @@ import messaging from './messaging.vue';
import messagingRoom from './messaging-room.vue'; import messagingRoom from './messaging-room.vue';
import urlPreview from './url-preview.vue'; import urlPreview from './url-preview.vue';
import twitterSetting from './twitter-setting.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 Reversi from './games/reversi/reversi.vue'; import emoji from './emoji.vue';
import welcomeTimeline from './welcome-timeline.vue'; import welcomeTimeline from './welcome-timeline.vue';
import uiInput from './ui/input.vue'; import uiInput from './ui/input.vue';
import uiButton from './ui/button.vue'; import uiButton from './ui/button.vue';
import uiHorizonGroup from './ui/horizon-group.vue';
import uiCard from './ui/card.vue'; import uiCard from './ui/card.vue';
import uiForm from './ui/form.vue'; import uiForm from './ui/form.vue';
import uiTextarea from './ui/textarea.vue'; import uiTextarea from './ui/textarea.vue';
@ -49,7 +54,10 @@ 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-error', error);
Vue.component('mk-api-settings', apiSettings); Vue.component('mk-api-settings', apiSettings);
Vue.component('mk-password-settings', passwordSettings);
Vue.component('mk-drive-settings', driveSettings); Vue.component('mk-drive-settings', driveSettings);
Vue.component('mk-profile-editor', profileEditor); Vue.component('mk-profile-editor', profileEditor);
Vue.component('mk-note-skeleton', noteSkeleton); Vue.component('mk-note-skeleton', noteSkeleton);
@ -83,11 +91,13 @@ Vue.component('mk-messaging', messaging);
Vue.component('mk-messaging-room', messagingRoom); Vue.component('mk-messaging-room', messagingRoom);
Vue.component('mk-url-preview', urlPreview); Vue.component('mk-url-preview', urlPreview);
Vue.component('mk-twitter-setting', twitterSetting); 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-reversi', Reversi); Vue.component('mk-emoji', emoji);
Vue.component('mk-welcome-timeline', welcomeTimeline); Vue.component('mk-welcome-timeline', welcomeTimeline);
Vue.component('ui-input', uiInput); Vue.component('ui-input', uiInput);
Vue.component('ui-button', uiButton); Vue.component('ui-button', uiButton);
Vue.component('ui-horizon-group', uiHorizonGroup);
Vue.component('ui-card', uiCard); Vue.component('ui-card', uiCard);
Vue.component('ui-form', uiForm); Vue.component('ui-form', uiForm);
Vue.component('ui-textarea', uiTextarea); Vue.component('ui-textarea', uiTextarea);

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="mk-media-banner"> <div class="mk-media-banner">
<div class="sensitive" v-if="media.isSensitive && hide" @click="hide = false"> <div class="sensitive" v-if="media.isSensitive && hide" @click="hide = false">
<span class="icon">%fa:exclamation-triangle%</span> <span class="icon"><fa icon="exclamation-triangle"/></span>
<b>%i18n:@sensitive%</b> <b>%i18n:@sensitive%</b>
<span>%i18n:@click-to-show%</span> <span>%i18n:@click-to-show%</span>
</div> </div>
@ -18,7 +18,7 @@
:title="media.name" :title="media.name"
:download="media.name" :download="media.name"
> >
<span class="icon">%fa:download%</span> <span class="icon"><fa icon="download"/></span>
<b>{{ media.name }}</b> <b>{{ media.name }}</b>
</a> </a>
</div> </div>

View File

@ -4,7 +4,9 @@
<div class="popover" :class="{ hukidasi }" ref="popover"> <div class="popover" :class="{ hukidasi }" ref="popover">
<template v-for="item, i in items"> <template v-for="item, i in items">
<div v-if="item === null"></div> <div v-if="item === null"></div>
<button v-if="item" @click="clicked(item.action)" v-html="item.icon ? item.icon + ' ' + item.text : item.text" :tabindex="i"></button> <button v-if="item" @click="clicked(item.action)" :tabindex="i">
<fa v-if="item.icon" :icon="item.icon"/>{{ item.text }}
</button>
</template> </template>
</div> </div>
</div> </div>
@ -188,6 +190,9 @@ export default Vue.extend({
color var(--primaryForeground) color var(--primaryForeground)
background var(--primaryDarken10) background var(--primaryDarken10)
> [data-icon]
margin-right 4px
> div > div
margin 8px 0 margin 8px 0
height 1px height 1px

View File

@ -14,13 +14,13 @@
<div class="file" @click="file = null" v-if="file">{{ file.name }}</div> <div class="file" @click="file = null" v-if="file">{{ file.name }}</div>
<mk-uploader ref="uploader" @uploaded="onUploaded"/> <mk-uploader ref="uploader" @uploaded="onUploaded"/>
<button class="send" @click="send" :disabled="!canSend || sending" title="%i18n:@send%"> <button class="send" @click="send" :disabled="!canSend || sending" title="%i18n:@send%">
<template v-if="!sending">%fa:paper-plane%</template><template v-if="sending">%fa:spinner .spin%</template> <template v-if="!sending"><fa icon="paper-plane"/></template><template v-if="sending"><fa icon="spinner .spin"/></template>
</button> </button>
<button class="attach-from-local" @click="chooseFile" title="%i18n:@attach-from-local%"> <button class="attach-from-local" @click="chooseFile" title="%i18n:@attach-from-local%">
%fa:upload% <fa icon="upload"/>
</button> </button>
<button class="attach-from-drive" @click="chooseFileFromDrive" title="%i18n:@attach-from-drive%"> <button class="attach-from-drive" @click="chooseFileFromDrive" title="%i18n:@attach-from-drive%">
%fa:R folder-open% <fa :icon="['far', 'folder-open']"/>
</button> </button>
<input ref="file" type="file" @change="onChangeFile"/> <input ref="file" type="file" @change="onChangeFile"/>
</div> </div>

View File

@ -24,7 +24,7 @@
<footer> <footer>
<span class="read" v-if="isMe && message.isRead">%i18n:@is-read%</span> <span class="read" v-if="isMe && message.isRead">%i18n:@is-read%</span>
<mk-time :time="message.createdAt"/> <mk-time :time="message.createdAt"/>
<template v-if="message.is_edited">%fa:pencil-alt%</template> <template v-if="message.is_edited"><fa icon="pencil-alt"/></template>
</footer> </footer>
</div> </div>
</div> </div>
@ -179,7 +179,10 @@ export default Vue.extend({
font-size 10px font-size 10px
color var(--messagingRoomMessageInfo) color var(--messagingRoomMessageInfo)
> [data-fa] > .read
margin 0 8px
> [data-icon]
margin-left 4px margin-left 4px
&:not([data-is-me]) &:not([data-is-me])

View File

@ -4,11 +4,11 @@
@drop.prevent.stop="onDrop" @drop.prevent.stop="onDrop"
> >
<div class="body"> <div class="body">
<p class="init" v-if="init">%fa:spinner .spin%%i18n:common.loading%</p> <p class="init" v-if="init"><fa icon="spinner .spin"/>%i18n:common.loading%</p>
<p class="empty" v-if="!init && messages.length == 0">%fa:info-circle%%i18n:@empty%</p> <p class="empty" v-if="!init && messages.length == 0"><fa icon="info-circle"/>%i18n:@empty%</p>
<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages">%fa:flag%%i18n:@no-history%</p> <p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages"><fa icon="flag"/>%i18n:@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:spinner .pulse .fw%</template>{{ fetchingMoreMessages ? '%i18n:common.loading%' : '%i18n:@more%' }} <template v-if="fetchingMoreMessages"><fa icon="spinner .pulse" fixed-width/></template>{{ fetchingMoreMessages ? '%i18n:common.loading%' : '%i18n:@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">%fa:arrow-circle-down%%i18n:@new-message%</button> <button @click="onIndicatorClick"><i><fa icon="arrow-circle-down"/></i>%i18n:@new-message%</button>
</div> </div>
</transition> </transition>
<x-form :user="user" ref="form"/> <x-form :user="user" ref="form"/>
@ -280,7 +280,7 @@ export default Vue.extend({
color var(--messagingRoomInfo) color var(--messagingRoomInfo)
opacity 0.5 opacity 0.5
[data-fa] [data-icon]
margin-right 4px margin-right 4px
> .no-history > .no-history
@ -292,7 +292,7 @@ export default Vue.extend({
color var(--messagingRoomInfo) color var(--messagingRoomInfo)
opacity 0.5 opacity 0.5
[data-fa] [data-icon]
margin-right 4px margin-right 4px
> .more > .more
@ -313,7 +313,7 @@ export default Vue.extend({
&.fetching &.fetching
cursor wait cursor wait
> [data-fa] > [data-icon]
margin-right 4px margin-right 4px
> .message > .message
@ -381,7 +381,7 @@ export default Vue.extend({
&:active &:active
background var(--primaryDarken10) background var(--primaryDarken10)
> [data-fa] > i
position absolute position absolute
top 0 top 0
left 10px left 10px

View File

@ -2,7 +2,7 @@
<div class="mk-messaging" :data-compact="compact"> <div class="mk-messaging" :data-compact="compact">
<div class="search" v-if="!compact" :style="{ top: headerTop + 'px' }"> <div class="search" v-if="!compact" :style="{ top: headerTop + 'px' }">
<div class="form"> <div class="form">
<label for="search-input">%fa:search%</label> <label for="search-input"><i><fa icon="search"/></i></label>
<input v-model="q" type="search" @input="search" @keydown="onSearchKeydown" placeholder="%i18n:@search-user%"/> <input v-model="q" type="search" @input="search" @keydown="onSearchKeydown" placeholder="%i18n:@search-user%"/>
</div> </div>
<div class="result"> <div class="result">
@ -45,7 +45,7 @@
</template> </template>
</div> </div>
<p class="no-history" v-if="!fetching && messages.length == 0">%i18n:@no-history%</p> <p class="no-history" v-if="!fetching && messages.length == 0">%i18n:@no-history%</p>
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> <p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
</div> </div>
</template> </template>
@ -213,7 +213,7 @@ export default Vue.extend({
width 38px width 38px
pointer-events none pointer-events none
> [data-fa] > i
display block display block
position absolute position absolute
top 0 top 0
@ -418,7 +418,7 @@ export default Vue.extend({
text-align center text-align center
color #aaa color #aaa
> [data-fa] > [data-icon]
margin-right 4px margin-right 4px
// TODO: element base media query // TODO: element base media query

View File

@ -1,9 +1,7 @@
import Vue, { VNode } from 'vue'; import Vue, { VNode } from 'vue';
import * as emojilib from 'emojilib';
import { length } from 'stringz'; 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 { url } from '../../../config';
import MkUrl from './url.vue'; import MkUrl from './url.vue';
import MkGoogle from './google.vue'; import MkGoogle from './google.vue';
import { concat } from '../../../../../prelude/array'; import { concat } from '../../../../../prelude/array';
@ -25,6 +23,9 @@ export default Vue.component('misskey-flavored-markdown', {
i: { i: {
type: Object, type: Object,
default: null default: null
},
customEmojis: {
required: false,
} }
}, },
@ -186,8 +187,16 @@ export default Vue.component('misskey-flavored-markdown', {
} }
case 'emoji': { case 'emoji': {
const emoji = emojilib.lib[token.emoji]; const customEmojis = (this.os.getMetaSync() || { emojis: [] }).emojis || [];
return [createElement('span', emoji ? emoji.char : token.content)]; return [createElement('mk-emoji', {
attrs: {
emoji: token.emoji,
name: token.name
},
props: {
customEmojis: this.customEmojis || customEmojis
}
})];
} }
case 'search': { case 'search': {

View File

@ -0,0 +1,52 @@
<template>
<ui-card>
<div slot="title"><fa icon="ban"/> %i18n:@mute-and-block%</div>
<section>
<header>%i18n:@mute%</header>
<ui-info v-if="!muteFetching && mute.length == 0">%i18n:@no-muted-users%</ui-info>
<div class="users" v-if="mute.length != 0">
<div v-for="user in mute" :key="user.id">
<p><b>{{ user | userName }}</b> @{{ user | acct }}</p>
</div>
</div>
</section>
<section>
<header>%i18n:@block%</header>
<ui-info v-if="!blockFetching && block.length == 0">%i18n:@no-blocked-users%</ui-info>
<div class="users" v-if="block.length != 0">
<div v-for="user in block" :key="user.id">
<p><b>{{ user | userName }}</b> @{{ user | acct }}</p>
</div>
</div>
</section>
</ui-card>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
data() {
return {
muteFetching: true,
blockFetching: true,
mute: [],
block: []
};
},
mounted() {
(this as any).api('mute/list').then(mute => {
this.mute = mute.map(x => x.mutee);
this.muteFetching = false;
});
(this as any).api('blocking/list').then(blocking => {
this.block = blocking.map(x => x.blockee);
this.blockFetching = false;
});
}
});
</script>

View File

@ -2,15 +2,11 @@
<span class="mk-nav"> <span class="mk-nav">
<a :href="aboutUrl">%i18n:@about%</a> <a :href="aboutUrl">%i18n:@about%</a>
<i></i> <i></i>
<a href="/stats">%i18n:@stats%</a>
<i></i>
<a :href="repositoryUrl">%i18n:@repository%</a> <a :href="repositoryUrl">%i18n:@repository%</a>
<i></i> <i></i>
<a :href="feedbackUrl" target="_blank">%i18n:@feedback%</a> <a :href="feedbackUrl" target="_blank">%i18n:@feedback%</a>
<i></i> <i></i>
<a href="/dev">%i18n:@develop%</a> <a href="/dev">%i18n:@develop%</a>
<i></i>
<a href="https://twitter.com/misskey_xyz" target="_blank">Follow us on %fa:B twitter%</a>
</span> </span>
</template> </template>

View File

@ -2,22 +2,22 @@
<header class="bvonvjxbwzaiskogyhbwgyxvcgserpmu"> <header class="bvonvjxbwzaiskogyhbwgyxvcgserpmu">
<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/> <mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/>
<router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link> <router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link>
<span class="is-verified" v-if="note.user.isVerified" title="%i18n:common.verified-user%">%fa:star%</span>
<span class="is-admin" v-if="note.user.isAdmin">admin</span> <span class="is-admin" v-if="note.user.isAdmin">admin</span>
<span class="is-bot" v-if="note.user.isBot">bot</span> <span class="is-bot" v-if="note.user.isBot">bot</span>
<span class="is-cat" v-if="note.user.isCat">cat</span> <span class="is-cat" v-if="note.user.isCat">cat</span>
<span class="username"><mk-acct :user="note.user"/></span> <span class="username"><mk-acct :user="note.user"/></span>
<span class="is-verified" v-if="note.user.isVerified" title="%i18n:common.verified-user%"><fa icon="star"/></span>
<div class="info"> <div class="info">
<span class="app" v-if="note.app && !mini">via <b>{{ note.app.name }}</b></span> <span class="app" v-if="note.app && !mini">via <b>{{ note.app.name }}</b></span>
<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span> <span class="mobile" v-if="note.viaMobile"><fa icon="mobile-alt"/></span>
<router-link class="created-at" :to="note | notePage"> <router-link class="created-at" :to="note | notePage">
<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:home%</template> <template v-if="note.visibility == 'home'"><fa icon="home"/></template>
<template v-if="note.visibility == 'followers'">%fa:unlock%</template> <template v-if="note.visibility == 'followers'"><fa icon="unlock"/></template>
<template v-if="note.visibility == 'specified'">%fa:envelope%</template> <template v-if="note.visibility == 'specified'"><fa icon="envelope"/></template>
<template v-if="note.visibility == 'private'">%fa:lock%</template> <template v-if="note.visibility == 'private'"><fa icon="lock"/></template>
</span> </span>
</div> </div>
</header> </header>
@ -68,10 +68,6 @@ export default Vue.extend({
&:hover &:hover
text-decoration underline text-decoration underline
> .is-verified
margin-right 8px
color #4dabf7
> .is-admin > .is-admin
> .is-bot > .is-bot
> .is-cat > .is-cat
@ -95,6 +91,10 @@ export default Vue.extend({
color var(--noteHeaderAcct) color var(--noteHeaderAcct)
flex-shrink 2147483647 flex-shrink 2147483647
> .is-verified
margin 0 .5em 0 0
color #4dabf7
> .info > .info
margin-left auto margin-left auto
font-size 0.9em font-size 0.9em

View File

@ -15,18 +15,18 @@ export default Vue.extend({
computed: { computed: {
items() { items() {
const items = [{ const items = [{
icon: '%fa:info-circle%', icon: 'info-circle',
text: '%i18n:@detail%', text: '%i18n:@detail%',
action: this.detail action: this.detail
}, { }, {
icon: '%fa:link%', icon: 'link',
text: '%i18n:@copy-link%', text: '%i18n:@copy-link%',
action: this.copyLink action: this.copyLink
}]; }];
if (this.note.uri) { if (this.note.uri) {
items.push({ items.push({
icon: '%fa:external-link-square-alt%', icon: 'external-link-square-alt',
text: '%i18n:@remote%', text: '%i18n:@remote%',
action: () => { action: () => {
window.open(this.note.uri, '_blank'); window.open(this.note.uri, '_blank');
@ -38,13 +38,13 @@ export default Vue.extend({
if (this.note.isFavorited) { if (this.note.isFavorited) {
items.push({ items.push({
icon: '%fa:star%', icon: 'star',
text: '%i18n:@unfavorite%', text: '%i18n:@unfavorite%',
action: this.unfavorite action: this.unfavorite
}); });
} else { } else {
items.push({ items.push({
icon: '%fa:star%', icon: 'star',
text: '%i18n:@favorite%', text: '%i18n:@favorite%',
action: this.favorite action: this.favorite
}); });
@ -53,13 +53,13 @@ export default Vue.extend({
if (this.note.userId == this.$store.state.i.id) { if (this.note.userId == this.$store.state.i.id) {
if ((this.$store.state.i.pinnedNoteIds || []).includes(this.note.id)) { if ((this.$store.state.i.pinnedNoteIds || []).includes(this.note.id)) {
items.push({ items.push({
icon: '%fa:thumbtack%', icon: 'thumbtack',
text: '%i18n:@unpin%', text: '%i18n:@unpin%',
action: this.unpin action: this.unpin
}); });
} else { } else {
items.push({ items.push({
icon: '%fa:thumbtack%', icon: 'thumbtack',
text: '%i18n:@pin%', text: '%i18n:@pin%',
action: this.pin action: this.pin
}); });
@ -69,7 +69,7 @@ export default Vue.extend({
if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) { if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) {
items.push(null); items.push(null);
items.push({ items.push({
icon: '%fa:trash-alt R%', icon: ['far', 'trash-alt'],
text: '%i18n:@delete%', text: '%i18n:@delete%',
action: this.del action: this.del
}); });

View File

@ -1,19 +1,19 @@
<template> <template>
<div class="mk-poll-editor"> <div class="mk-poll-editor">
<p class="caution" v-if="choices.length < 2"> <p class="caution" v-if="choices.length < 2">
%fa:exclamation-triangle%%i18n:@no-only-one-choice% <fa icon="exclamation-triangle"/>%i18n:@no-only-one-choice%
</p> </p>
<ul ref="choices"> <ul ref="choices">
<li v-for="(choice, i) in choices"> <li v-for="(choice, i) in choices">
<input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:@choice-n%'.replace('{}', i + 1)"> <input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:@choice-n%'.replace('{}', i + 1)">
<button @click="remove(i)" title="%i18n:@remove%"> <button @click="remove(i)" title="%i18n:@remove%">
%fa:times% <fa icon="times"/>
</button> </button>
</li> </li>
</ul> </ul>
<button class="add" v-if="choices.length < 10" @click="add">%i18n:@add%</button> <button class="add" v-if="choices.length < 10" @click="add">%i18n:@add%</button>
<button class="destroy" @click="destroy" title="%i18n:@destroy%"> <button class="destroy" @click="destroy" title="%i18n:@destroy%">
%fa:times% <fa icon="times"/>
</button> </button>
</div> </div>
</template> </template>
@ -76,7 +76,7 @@ export default Vue.extend({
font-size 0.8em font-size 0.8em
color #f00 color #f00
> [data-fa] > [data-icon]
margin-right 4px margin-right 4px
> ul > ul

View File

@ -4,7 +4,7 @@
<li v-for="choice in poll.choices" :key="choice.id" @click="vote(choice.id)" :class="{ voted: choice.voted }" :title="!isVoted ? '%i18n:@vote-to%'.replace('{}', choice.text) : ''"> <li v-for="choice in poll.choices" :key="choice.id" @click="vote(choice.id)" :class="{ voted: choice.voted }" :title="!isVoted ? '%i18n:@vote-to%'.replace('{}', choice.text) : ''">
<div class="backdrop" :style="{ 'width': (showResult ? (choice.votes / total * 100) : 0) + '%' }"></div> <div class="backdrop" :style="{ 'width': (showResult ? (choice.votes / total * 100) : 0) + '%' }"></div>
<span> <span>
<template v-if="choice.isVoted">%fa:check%</template> <template v-if="choice.isVoted"><fa icon="check"/></template>
<span>{{ choice.text }}</span> <span>{{ choice.text }}</span>
<span class="votes" v-if="showResult">({{ '%i18n:@vote-count%'.replace('{}', choice.votes) }})</span> <span class="votes" v-if="showResult">({{ '%i18n:@vote-count%'.replace('{}', choice.votes) }})</span>
</span> </span>
@ -100,7 +100,7 @@ export default Vue.extend({
transition width 1s ease transition width 1s ease
> span > span
> [data-fa] > [data-icon]
margin-right 4px margin-right 4px
> .votes > .votes

View File

@ -1,6 +1,6 @@
<template> <template>
<ui-card> <ui-card>
<div slot="title">%fa:user% %i18n:@title%</div> <div slot="title"><fa icon="user"/> %i18n:@title%</div>
<section class="fit-top"> <section class="fit-top">
<ui-form :disabled="saving"> <ui-form :disabled="saving">
@ -16,12 +16,12 @@
<ui-input v-model="location"> <ui-input v-model="location">
<span>%i18n:@location%</span> <span>%i18n:@location%</span>
<span slot="prefix">%fa:map-marker-alt%</span> <span slot="prefix"><fa icon="map-marker-alt"/></span>
</ui-input> </ui-input>
<ui-input v-model="birthday" type="date"> <ui-input v-model="birthday" type="date">
<span>%i18n:@birthday%</span> <span>%i18n:@birthday%</span>
<span slot="prefix">%fa:birthday-cake%</span> <span slot="prefix"><fa icon="birthday-cake"/></span>
</ui-input> </ui-input>
<ui-textarea v-model="description" :max="500"> <ui-textarea v-model="description" :max="500">
@ -30,14 +30,14 @@
<ui-input type="file" @change="onAvatarChange"> <ui-input type="file" @change="onAvatarChange">
<span>%i18n:@avatar%</span> <span>%i18n:@avatar%</span>
<span slot="icon">%fa:image%</span> <span slot="icon"><fa icon="image"/></span>
<span slot="text" v-if="avatarUploading">%i18n:@uploading%<mk-ellipsis/></span> <span slot="desc" v-if="avatarUploading">%i18n:@uploading%<mk-ellipsis/></span>
</ui-input> </ui-input>
<ui-input type="file" @change="onBannerChange"> <ui-input type="file" @change="onBannerChange">
<span>%i18n:@banner%</span> <span>%i18n:@banner%</span>
<span slot="icon">%fa:image%</span> <span slot="icon"><fa icon="image"/></span>
<span slot="text" v-if="bannerUploading">%i18n:@uploading%<mk-ellipsis/></span> <span slot="desc" v-if="bannerUploading">%i18n:@uploading%<mk-ellipsis/></span>
</ui-input> </ui-input>
<ui-button @click="save(true)">%i18n:@save%</ui-button> <ui-button @click="save(true)">%i18n:@save%</ui-button>

View File

@ -8,11 +8,12 @@
</ui-input> </ui-input>
<ui-input v-model="password" type="password" required styl="fill"> <ui-input v-model="password" type="password" required styl="fill">
<span>%i18n:@password%</span> <span>%i18n:@password%</span>
<span slot="prefix">%fa:lock%</span> <span slot="prefix"><fa icon="lock"/></span>
</ui-input> </ui-input>
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required styl="fill"/> <ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required styl="fill"/>
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button> <ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
<p style="margin: 8px 0;">%i18n:@or% <a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p> <p style="margin: 8px 0;">%i18n:@or% <a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
<p style="margin: 8px 0;">%i18n:@or% <a :href="`${apiUrl}/signin/github`">%i18n:@signin-with-github%</a></p>
</form> </form>
</template> </template>

View File

@ -3,39 +3,39 @@
<template v-if="meta"> <template v-if="meta">
<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required styl="fill"> <ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required styl="fill">
<span>%i18n:@invitation-code%</span> <span>%i18n:@invitation-code%</span>
<span slot="prefix">%fa:id-card-alt%</span> <span slot="prefix"><fa icon="id-card-alt"/></span>
<p slot="text" v-html="'%i18n:@invitation-info%'.replace('{}', meta.maintainer.url)"></p> <p slot="desc" v-html="'%i18n:@invitation-info%'.replace('{}', 'mailto:' + meta.maintainer.email)"></p>
</ui-input> </ui-input>
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername" styl="fill"> <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername" styl="fill">
<span>%i18n:@username%</span> <span>%i18n:@username%</span>
<span slot="prefix">@</span> <span slot="prefix">@</span>
<span slot="suffix">@{{ host }}</span> <span slot="suffix">@{{ host }}</span>
<p slot="text" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw% %i18n:@checking%</p> <p slot="desc" v-if="usernameState == 'wait'" style="color:#999"><fa icon="spinner .pulse" fixed-width/> %i18n:@checking%</p>
<p slot="text" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw% %i18n:@available%</p> <p slot="desc" v-if="usernameState == 'ok'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@available%</p>
<p slot="text" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@unavailable%</p> <p slot="desc" v-if="usernameState == 'unavailable'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@unavailable%</p>
<p slot="text" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@error%</p> <p slot="desc" v-if="usernameState == 'error'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@error%</p>
<p slot="text" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@invalid-format%</p> <p slot="desc" v-if="usernameState == 'invalid-format'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@invalid-format%</p>
<p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-short%</p> <p slot="desc" v-if="usernameState == 'min-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@too-short%</p>
<p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-long%</p> <p slot="desc" v-if="usernameState == 'max-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@too-long%</p>
</ui-input> </ui-input>
<ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true" styl="fill"> <ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true" styl="fill">
<span>%i18n:@password%</span> <span>%i18n:@password%</span>
<span slot="prefix">%fa:lock%</span> <span slot="prefix"><fa icon="lock"/></span>
<div slot="text"> <div slot="desc">
<p slot="text" v-if="passwordStrength == 'low'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@weak-password%</p> <p v-if="passwordStrength == 'low'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@weak-password%</p>
<p slot="text" v-if="passwordStrength == 'medium'" style="color:#3CB7B5">%fa:check .fw% %i18n:@normal-password%</p> <p v-if="passwordStrength == 'medium'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@normal-password%</p>
<p slot="text" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw% %i18n:@strong-password%</p> <p v-if="passwordStrength == 'high'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@strong-password%</p>
</div> </div>
</ui-input> </ui-input>
<ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype" styl="fill"> <ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype" styl="fill">
<span>%i18n:@password% (%i18n:@retype%)</span> <span>%i18n:@password% (%i18n:@retype%)</span>
<span slot="prefix">%fa:lock%</span> <span slot="prefix"><fa icon="lock"/></span>
<div slot="text"> <div slot="desc">
<p slot="text" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5">%fa:check .fw% %i18n:@password-matched%</p> <p v-if="passwordRetypeState == 'match'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@password-matched%</p>
<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p> <p v-if="passwordRetypeState == 'not-match'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@password-not-matched%</p>
</div> </div>
</ui-input> </ui-input>
<div v-if="meta.recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="meta.recaptchaSitekey" style="margin: 16px 0;"></div> <div v-if="meta.enableRecaptcha" class="g-recaptcha" :data-sitekey="meta.recaptchaSiteKey" style="margin: 16px 0;"></div>
<ui-button type="submit">%i18n:@create%</ui-button> <ui-button type="submit">%i18n:@create%</ui-button>
</template> </template>
</form> </form>
@ -130,7 +130,7 @@ export default Vue.extend({
username: this.username, username: this.username,
password: this.password, password: this.password,
invitationCode: this.invitationCode, invitationCode: this.invitationCode,
'g-recaptcha-response': this.meta.recaptchaSitekey != null ? (window as any).grecaptcha.getResponse() : null 'g-recaptcha-response': this.meta.enableRecaptcha ? (window as any).grecaptcha.getResponse() : null
}, true).then(() => { }, true).then(() => {
(this as any).api('signin', { (this as any).api('signin', {
username: this.username, username: this.username,
@ -141,7 +141,7 @@ export default Vue.extend({
}).catch(() => { }).catch(() => {
alert('%i18n:@some-error%'); alert('%i18n:@some-error%');
if (this.meta.recaptchaSitekey != null) { if (this.meta.enableRecaptcha) {
(window as any).grecaptcha.reset(); (window as any).grecaptcha.reset();
} }
}); });

View File

@ -1,15 +1,15 @@
<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:spinner .pulse% <fa icon="spinner .pulse"/>
<span>%i18n:@connecting%<mk-ellipsis/></span> <span>%i18n:@connecting%<mk-ellipsis/></span>
</p> </p>
<p v-if="stream.state == 'reconnecting'"> <p v-if="stream.state == 'reconnecting'">
%fa:spinner .pulse% <fa icon="spinner .pulse"/>
<span>%i18n:@reconnecting%<mk-ellipsis/></span> <span>%i18n:@reconnecting%<mk-ellipsis/></span>
</p> </p>
<p v-if="stream.state == 'connected'"> <p v-if="stream.state == 'connected'">
%fa:check% <fa icon="check"/>
<span>%i18n:@connected%</span> <span>%i18n:@connected%</span>
</p> </p>
</div> </div>
@ -80,7 +80,7 @@ export default Vue.extend({
display block display block
margin 0 margin 0
> [data-fa] > [data-icon]
margin-right 0.25em margin-right 0.25em
</style> </style>

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="jtivnzhfwquxpsfidertopbmwmchmnmo"> <div class="jtivnzhfwquxpsfidertopbmwmchmnmo">
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> <p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
<p class="empty" v-else-if="tags.length == 0">%fa:exclamation-circle%%i18n:@empty%</p> <p class="empty" v-else-if="tags.length == 0"><fa icon="exclamation-circle"/>%i18n:@empty%</p>
<div v-else> <div v-else>
<vue-word-cloud <vue-word-cloud
:words="tags.slice(0, 20).map(x => [x.name, x.count])" :words="tags.slice(0, 20).map(x => [x.name, x.count])"
@ -74,7 +74,7 @@ export default Vue.extend({
text-align center text-align center
color #aaa color #aaa
> [data-fa] > [data-icon]
margin-right 4px margin-right 4px
> div > div

View File

@ -25,7 +25,7 @@
</label> </label>
<details class="creator"> <details class="creator">
<summary>%fa:palette% %i18n:@create-a-theme%</summary> <summary><fa icon="palette"/> %i18n:@create-a-theme%</summary>
<div> <div>
<span>%i18n:@base-theme%:</span> <span>%i18n:@base-theme%:</span>
<ui-radio v-model="myThemeBase" value="light">%i18n:@base-theme-light%</ui-radio> <ui-radio v-model="myThemeBase" value="light">%i18n:@base-theme-light%</ui-radio>
@ -51,23 +51,23 @@
<div style="padding-bottom:8px;">%i18n:@text-color%:</div> <div style="padding-bottom:8px;">%i18n:@text-color%:</div>
<color-picker v-model="myThemeText"/> <color-picker v-model="myThemeText"/>
</div> </div>
<ui-button @click="preview()">%fa:eye% %i18n:@preview-created-theme%</ui-button> <ui-button @click="preview()"><fa icon="eye"/> %i18n:@preview-created-theme%</ui-button>
<ui-button primary @click="gen()">%fa:save R% %i18n:@save-created-theme%</ui-button> <ui-button primary @click="gen()"><fa :icon="['far', 'save']"/> %i18n:@save-created-theme%</ui-button>
</details> </details>
<details> <details>
<summary>%fa:download% %i18n:@install-a-theme%</summary> <summary><fa icon="download"/> %i18n:@install-a-theme%</summary>
<ui-button @click="import_()">%fa:file-import% %i18n:@import%</ui-button> <ui-button @click="import_()"><fa icon="file-import"/> %i18n:@import%</ui-button>
<input ref="file" type="file" accept=".misskeytheme" style="display:none;" @change="onUpdateImportFile"/> <input ref="file" type="file" accept=".misskeytheme" style="display:none;" @change="onUpdateImportFile"/>
<p>%i18n:@import-by-code%:</p> <p>%i18n:@import-by-code%:</p>
<ui-textarea v-model="installThemeCode"> <ui-textarea v-model="installThemeCode">
<span>%i18n:@theme-code%</span> <span>%i18n:@theme-code%</span>
</ui-textarea> </ui-textarea>
<ui-button @click="() => install(this.installThemeCode)">%fa:check% %i18n:@install%</ui-button> <ui-button @click="() => install(this.installThemeCode)"><fa icon="check"/> %i18n:@install%</ui-button>
</details> </details>
<details> <details>
<summary>%fa:folder-open% %i18n:@manage-themes%</summary> <summary><fa icon="folder-open"/> %i18n:@manage-themes%</summary>
<ui-select v-model="selectedThemeId" placeholder="%i18n:@select-theme%"> <ui-select v-model="selectedThemeId" placeholder="%i18n:@select-theme%">
<optgroup label="%i18n:@builtin-themes%"> <optgroup label="%i18n:@builtin-themes%">
<option v-for="x in builtinThemes" :value="x.id" :key="x.id">{{ x.name }}</option> <option v-for="x in builtinThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
@ -89,8 +89,8 @@
<ui-textarea readonly :value="selectedThemeCode"> <ui-textarea readonly :value="selectedThemeCode">
<span>%i18n:@theme-code%</span> <span>%i18n:@theme-code%</span>
</ui-textarea> </ui-textarea>
<ui-button @click="export_()" link :download="`${selectedTheme.name}.misskeytheme`" ref="export">%fa:box% %i18n:@export%</ui-button> <ui-button @click="export_()" link :download="`${selectedTheme.name}.misskeytheme`" ref="export"><fa icon="box"/> %i18n:@export%</ui-button>
<ui-button @click="uninstall()" v-if="!builtinThemes.some(t => t.id == selectedTheme.id)">%fa:trash-alt R% %i18n:@uninstall%</ui-button> <ui-button @click="uninstall()" v-if="!builtinThemes.some(t => t.id == selectedTheme.id)"><fa :icon="['far', 'trash-alt']"/> %i18n:@uninstall%</ui-button>
</template> </template>
</details> </details>
</div> </div>

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="csqvmxybqbycalfhkxvyfrgbrdalkaoc"> <div class="csqvmxybqbycalfhkxvyfrgbrdalkaoc">
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> <p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
<p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%</p> <p class="empty" v-else-if="stats.length == 0"><fa icon="exclamation-circle"/>%i18n:@empty%</p>
<!-- トランジションを有効にするとなぜかメモリリークする --> <!-- トランジションを有効にするとなぜかメモリリークする -->
<transition-group v-else tag="div" name="chart"> <transition-group v-else tag="div" name="chart">
<div v-for="stat in stats" :key="stat.tag"> <div v-for="stat in stats" :key="stat.tag">
@ -58,7 +58,7 @@ export default Vue.extend({
color var(--text) color var(--text)
opacity 0.7 opacity 0.7
> [data-fa] > [data-icon]
margin-right 4px margin-right 4px
> div > div

View File

@ -1,5 +1,10 @@
<template> <template>
<component class="dmtdnykelhudezerjlfpbhgovrgnqqgr" :is="link ? 'a' : 'button'" :class="[styl, { inline, primary }]" :type="type" @click="$emit('click')"> <component class="dmtdnykelhudezerjlfpbhgovrgnqqgr"
:is="link ? 'a' : 'button'"
:class="[styl, { inline, primary }]"
:type="type"
@click="$emit('click')"
>
<slot></slot> <slot></slot>
</component> </component>
</template> </template>
@ -7,6 +12,11 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
export default Vue.extend({ export default Vue.extend({
inject: {
horizonGrouped: {
default: false
}
},
props: { props: {
type: { type: {
type: String, type: String,
@ -20,7 +30,9 @@ export default Vue.extend({
inline: { inline: {
type: Boolean, type: Boolean,
required: false, required: false,
default: false default(): boolean {
return this.horizonGrouped;
}
}, },
link: { link: {
type: Boolean, type: Boolean,

View File

@ -48,6 +48,9 @@ export default Vue.extend({
&.fit-top &.fit-top
padding-top 0 padding-top 0
&.fit-bottom
padding-bottom 0
> header > header
margin-bottom 16px margin-bottom 16px
font-weight bold font-weight bold

View File

@ -0,0 +1,35 @@
<template>
<div class="pfzekjfwkwvadvlujpdnnxfggqgqjoze" :class="{ inputs }">
<slot></slot>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
provide: {
horizonGrouped: true
},
props: {
inputs: {
type: Boolean,
required: false,
default: false
}
}
});
</script>
<style lang="stylus" scoped>
.pfzekjfwkwvadvlujpdnnxfggqgqjoze
display flex
&.inputs
margin 32px 0
> *
flex 1
&:not(:last-child)
margin-right 16px
</style>

View File

@ -1,6 +1,7 @@
<template> <template>
<div class="ymxyweixqwsxauxldgpvecjepnwxbylu" :class="{ warn }"> <div class="ymxyweixqwsxauxldgpvecjepnwxbylu" :class="{ warn }">
<i v-if="warn">%fa:exclamation-triangle%</i> <i v-if="warn"><fa icon="exclamation-triangle"/></i>
<i v-else><fa icon="info-circle"/></i>
<slot></slot> <slot></slot>
</div> </div>
</template> </template>
@ -23,11 +24,20 @@ export default Vue.extend({
margin 16px 0 margin 16px 0
padding 16px padding 16px
font-size 90% font-size 90%
background var(--infoBg)
> i color var(--infoFg)
margin-right 4px
&.warn &.warn
background var(--infoWarnBg) background var(--infoWarnBg)
color var(--infoWarnFg) color var(--infoWarnFg)
&:first-child
margin-top 0
&:last-child
margin-bottom 0
> i
margin-right 4px
</style> </style>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="ui-input" :class="[{ focused, filled }, styl]"> <div class="ui-input" :class="[{ focused, filled, inline, disabled }, styl]">
<div class="icon" ref="icon"><slot name="icon"></slot></div> <div class="icon" ref="icon"><slot name="icon"></slot></div>
<div class="input"> <div class="input">
<div class="password-meter" v-if="withPasswordMeter" v-show="passwordStrength != ''" :data-strength="passwordStrength"> <div class="password-meter" v-if="withPasswordMeter" v-show="passwordStrength != ''" :data-strength="passwordStrength">
@ -11,6 +11,7 @@
<input ref="input" <input ref="input"
:type="type" :type="type"
v-model="v" v-model="v"
:disabled="disabled"
:required="required" :required="required"
:readonly="readonly" :readonly="readonly"
:pattern="pattern" :pattern="pattern"
@ -32,7 +33,7 @@
</template> </template>
<div class="suffix" ref="suffix"><slot name="suffix"></slot></div> <div class="suffix" ref="suffix"><slot name="suffix"></slot></div>
</div> </div>
<div class="text"><slot name="text"></slot></div> <div class="desc"><slot name="desc"></slot></div>
</div> </div>
</template> </template>
@ -41,6 +42,11 @@ import Vue from 'vue';
const getPasswordStrength = require('syuilo-password-strength'); const getPasswordStrength = require('syuilo-password-strength');
export default Vue.extend({ export default Vue.extend({
inject: {
horizonGrouped: {
default: false
}
},
props: { props: {
value: { value: {
required: false required: false
@ -57,6 +63,10 @@ export default Vue.extend({
type: Boolean, type: Boolean,
required: false required: false
}, },
disabled: {
type: Boolean,
required: false
},
pattern: { pattern: {
type: String, type: String,
required: false required: false
@ -72,6 +82,13 @@ export default Vue.extend({
required: false, required: false,
default: false default: false
}, },
inline: {
type: Boolean,
required: false,
default(): boolean {
return this.horizonGrouped;
}
},
styl: { styl: {
type: String, type: String,
required: false, required: false,
@ -304,7 +321,7 @@ root(fill)
if fill if fill
padding-right 12px padding-right 12px
> .text > .desc
margin 6px 0 margin 6px 0
font-size 13px font-size 13px
@ -337,4 +354,14 @@ root(fill)
&:not(.fill) &:not(.fill)
root(false) root(false)
&.inline
display inline-block
margin 0
&.disabled
opacity 0.7
&, *
cursor not-allowed !important
</style> </style>

View File

@ -129,5 +129,6 @@ export default Vue.extend({
> p > p
margin 0 margin 0
opacity 0.7 opacity 0.7
font-size 90%
</style> </style>

View File

@ -13,7 +13,7 @@
@blur="focused = false" @blur="focused = false"
></textarea> ></textarea>
</div> </div>
<div class="text"><slot name="text"></slot></div> <div class="desc"><slot name="desc"></slot></div>
</div> </div>
</template> </template>
@ -139,7 +139,7 @@ root(fill)
outline none outline none
box-shadow none box-shadow none
> .text > .desc
margin 6px 0 margin 6px 0
font-size 13px font-size 13px

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: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">%i18n:@waiting%<mk-ellipsis/></span> <span class="initing" v-if="ctx.progress == undefined">%i18n:@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>
@ -155,7 +155,7 @@ export default Vue.extend({
text-overflow ellipsis text-overflow ellipsis
overflow hidden overflow hidden
> [data-fa] > [data-icon]
margin-right 4px margin-right 4px
> .status > .status

View File

@ -6,7 +6,7 @@
<span class="pathname" v-if="pathname != ''">{{ pathname }}</span> <span class="pathname" v-if="pathname != ''">{{ pathname }}</span>
<span class="query">{{ query }}</span> <span class="query">{{ query }}</span>
<span class="hash">{{ hash }}</span> <span class="hash">{{ hash }}</span>
%fa:external-link-square-alt% <fa icon="external-link-square-alt"/>
</a> </a>
</template> </template>
@ -40,7 +40,7 @@ export default Vue.extend({
<style lang="stylus" scoped> <style lang="stylus" scoped>
.mk-url .mk-url
word-break break-all word-break break-all
> [data-fa] > [data-icon]
padding-left 2px padding-left 2px
font-size .9em font-size .9em
font-weight 400 font-weight 400

View File

@ -3,34 +3,34 @@
<div class="backdrop" ref="backdrop" @click="close"></div> <div class="backdrop" ref="backdrop" @click="close"></div>
<div class="popover" :class="{ compact }" ref="popover"> <div class="popover" :class="{ compact }" ref="popover">
<div @click="choose('public')" :class="{ active: v == 'public' }"> <div @click="choose('public')" :class="{ active: v == 'public' }">
<div>%fa:globe%</div> <div><fa icon="globe"/></div>
<div> <div>
<span>%i18n:@public%</span> <span>%i18n:@public%</span>
</div> </div>
</div> </div>
<div @click="choose('home')" :class="{ active: v == 'home' }"> <div @click="choose('home')" :class="{ active: v == 'home' }">
<div>%fa:home%</div> <div><fa icon="home"/></div>
<div> <div>
<span>%i18n:@home%</span> <span>%i18n:@home%</span>
<span>%i18n:@home-desc%</span> <span>%i18n:@home-desc%</span>
</div> </div>
</div> </div>
<div @click="choose('followers')" :class="{ active: v == 'followers' }"> <div @click="choose('followers')" :class="{ active: v == 'followers' }">
<div>%fa:unlock%</div> <div><fa icon="unlock"/></div>
<div> <div>
<span>%i18n:@followers%</span> <span>%i18n:@followers%</span>
<span>%i18n:@followers-desc%</span> <span>%i18n:@followers-desc%</span>
</div> </div>
</div> </div>
<div @click="choose('specified')" :class="{ active: v == 'specified' }"> <div @click="choose('specified')" :class="{ active: v == 'specified' }">
<div>%fa:envelope%</div> <div><fa icon="envelope"/></div>
<div> <div>
<span>%i18n:@specified%</span> <span>%i18n:@specified%</span>
<span>%i18n:@specified-desc%</span> <span>%i18n:@specified-desc%</span>
</div> </div>
</div> </div>
<div @click="choose('private')" :class="{ active: v == 'private' }"> <div @click="choose('private')" :class="{ active: v == 'private' }">
<div>%fa:lock%</div> <div><fa icon="lock"/></div>
<div> <div>
<span>%i18n:@private%</span> <span>%i18n:@private%</span>
</div> </div>

View File

@ -14,7 +14,7 @@
</div> </div>
</header> </header>
<div class="text"> <div class="text">
<misskey-flavored-markdown v-if="note.text" :text="note.text"/> <misskey-flavored-markdown v-if="note.text" :text="note.text" :customEmojis="note.emojis"/>
</div> </div>
</div> </div>
</div> </div>

View File

@ -109,7 +109,7 @@ class Autocomplete {
if (isEmoji && opened == false) { if (isEmoji && opened == false) {
const emoji = text.substr(emojiIndex + 1); const emoji = text.substr(emojiIndex + 1);
if (emoji != '' && emoji.match(/^[\+\-a-z0-9_]+$/)) { if (!emoji.includes(' ')) {
this.open('emoji', emoji); this.open('emoji', emoji);
opened = true; opened = true;
} }
@ -145,6 +145,7 @@ class Autocomplete {
} else { } else {
// サジェスト要素作成 // サジェスト要素作成
this.suggestion = new MkAutocomplete({ this.suggestion = new MkAutocomplete({
parent: this.vm,
propsData: { propsData: {
textarea: this.textarea, textarea: this.textarea,
complete: this.complete, complete: this.complete,
@ -228,7 +229,7 @@ class Autocomplete {
// キャレットを戻す // キャレットを戻す
this.vm.$nextTick(() => { this.vm.$nextTick(() => {
this.textarea.focus(); this.textarea.focus();
const pos = trimmedBefore.length + 1; const pos = trimmedBefore.length + (value.startsWith(':') ? value.length : 1);
this.textarea.setSelectionRange(pos, pos); this.textarea.setSelectionRange(pos, pos);
}); });
} }

View File

@ -1,6 +1,7 @@
import Vue from 'vue'; import Vue from 'vue';
Vue.filter('bytes', (v, digits = 0) => { Vue.filter('bytes', (v, digits = 0) => {
if (v == null) return '?';
const sizes = ['B', 'KB', 'MB', 'GB', 'TB']; const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
if (v == 0) return '0'; if (v == 0) return '0';
const isMinus = v < 0; const isMinus = v < 0;

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