Compare commits

...

241 Commits

Author SHA1 Message Date
syuilo 255c07d1ab 2.25.1 2018-06-03 04:51:58 +09:00
syuilo 0aa9201770 2.25.0 2018-06-02 19:23:17 +09:00
syuilo 534e43f72d Fix bug 2018-06-02 19:19:58 +09:00
syuilo 8f50080647 Merge pull request #1673 from syuilo/l10n_master
New Crowdin translations
2018-06-02 17:05:18 +09:00
syuilo cdc70875e5 New translations ja.yml (English) 2018-06-02 16:51:10 +09:00
syuilo e6962d6fab New translations ja.yml (English) 2018-06-02 16:41:22 +09:00
syuilo 3703563939 New translations ja.yml (Portuguese) 2018-06-02 16:31:39 +09:00
syuilo e81b145735 New translations ja.yml (Korean) 2018-06-02 16:31:37 +09:00
syuilo 7f4145ee56 New translations ja.yml (Polish) 2018-06-02 16:31:35 +09:00
syuilo 3967cf40b3 New translations ja.yml (Chinese Simplified) 2018-06-02 16:31:33 +09:00
syuilo 84b0d56c4c New translations ja.yml (Italian) 2018-06-02 16:31:32 +09:00
syuilo e081d8d4ca New translations ja.yml (Russian) 2018-06-02 16:31:30 +09:00
syuilo b6ad7149d8 New translations ja.yml (English) 2018-06-02 16:31:28 +09:00
syuilo 0f36f60cb4 New translations ja.yml (Spanish) 2018-06-02 16:31:26 +09:00
syuilo 1284eef9e2 New translations ja.yml (German) 2018-06-02 16:31:24 +09:00
syuilo dec264ee6a New translations ja.yml (French) 2018-06-02 16:31:22 +09:00
syuilo e25e1d88d6 Merge pull request #1671 from syuilo/locked-account
Locked account
2018-06-02 16:28:08 +09:00
syuilo 60a7f7f146 wip 2018-06-02 16:27:24 +09:00
syuilo 897f7a031d wip 2018-06-02 16:13:32 +09:00
syuilo 4feff8835c wip 2018-06-02 16:01:32 +09:00
syuilo 8dfd892b71 wip 2018-06-02 15:51:43 +09:00
syuilo 9e8cfd76c8 wip 2018-06-02 13:40:28 +09:00
syuilo a6a4bb6599 wip 2018-06-02 13:36:29 +09:00
syuilo 5ca8a0d886 wip 2018-06-02 13:34:53 +09:00
syuilo 6840496791 wip 2018-06-02 13:14:54 +09:00
syuilo 0128831649 wip 2018-06-02 13:11:28 +09:00
syuilo 56fa24e401 wip 2018-06-02 12:58:56 +09:00
syuilo e011870a60 Merge pull request #1672 from Angristan/patch-1
Update build docs
2018-06-02 03:54:10 +09:00
Angristan 8d78ee08c1 Cover multiple cases 2018-06-01 20:52:47 +02:00
Angristan 2752319e50 Update build docs
Fix #1474
2018-06-01 20:24:30 +02:00
syuilo a26c19cbd2 wip 2018-06-02 00:51:20 +09:00
syuilo f14571dc42 wip 2018-06-02 00:38:31 +09:00
syuilo 484d17f53f wip 2018-06-02 00:15:17 +09:00
syuilo 924119651a Merge branch 'master' into locked-account 2018-06-01 23:37:19 +09:00
syuilo c6d49dacbc Merge pull request #1670 from syuilo/l10n_master
New Crowdin translations
2018-06-01 23:36:22 +09:00
syuilo 0be790fa31 wip 2018-06-01 21:55:27 +09:00
syuilo b7f6eb8290 New translations ja.yml (English) 2018-06-01 16:29:25 +09:00
syuilo f1bda0b2e1 New translations ja.yml (English) 2018-06-01 16:12:22 +09:00
syuilo bae44b4708 wip 2018-06-01 01:12:02 +09:00
syuilo 35115607bc wip 2018-06-01 00:42:37 +09:00
syuilo 51255bb446 wip 2018-05-31 22:56:02 +09:00
syuilo bd758a156e wip 2018-05-31 18:34:15 +09:00
syuilo 51929fb607 typo 2018-05-31 18:11:28 +09:00
syuilo 9599a31239 wip 2018-05-31 18:08:47 +09:00
syuilo 9fdb125960 Merge pull request #1668 from syuilo/l10n_master
New Crowdin translations
2018-05-31 17:38:49 +09:00
syuilo 534c0a6001 New translations ja.yml (English) 2018-05-31 17:31:23 +09:00
syuilo 58bfcfda91 New translations ja.yml (English) 2018-05-31 17:21:36 +09:00
syuilo 8d0802f05d New translations ja.yml (English) 2018-05-31 17:12:41 +09:00
syuilo 5cd8c5d229 New translations ja.yml (English) 2018-05-31 17:02:48 +09:00
syuilo fa3c4436d9 New translations ja.yml (English) 2018-05-31 16:52:27 +09:00
syuilo d32d95918c 🎨 2018-05-31 16:44:11 +09:00
syuilo 34899757d5 New translations ja.yml (English) 2018-05-31 16:41:32 +09:00
syuilo 111dbdcd7f Fix 2018-05-31 16:38:05 +09:00
syuilo 0c38509f1c New translations ja.yml (Polish) 2018-05-31 04:21:47 +09:00
syuilo 652aa1f69b New translations ja.yml (German) 2018-05-31 00:33:22 +09:00
syuilo dc380c38da New translations ja.yml (German) 2018-05-31 00:23:33 +09:00
syuilo 8555e04f50 New translations ja.yml (German) 2018-05-31 00:13:36 +09:00
syuilo c23bbf81f1 2.24.3 2018-05-30 23:08:26 +09:00
syuilo 7dd7de8ff6 Update endpoints.ts 2018-05-30 23:05:24 +09:00
syuilo 2ca8bafde3 Merge pull request #1664 from syuilo/l10n_master
New Crowdin translations
2018-05-30 22:08:38 +09:00
syuilo 79f6c3f1ca New translations ja.yml (Portuguese) 2018-05-30 21:23:17 +09:00
syuilo fce0b315cf New translations ja.yml (Korean) 2018-05-30 21:23:14 +09:00
syuilo 56c7a8f2e4 New translations ja.yml (Polish) 2018-05-30 21:23:10 +09:00
syuilo 5ef2f157f2 New translations ja.yml (Chinese Simplified) 2018-05-30 21:23:08 +09:00
syuilo 738afbe475 New translations ja.yml (Italian) 2018-05-30 21:23:06 +09:00
syuilo 791a81a4c7 New translations ja.yml (Russian) 2018-05-30 21:23:03 +09:00
syuilo aa82d7a2c9 New translations ja.yml (English) 2018-05-30 21:23:01 +09:00
syuilo f57d2e54d2 New translations ja.yml (Spanish) 2018-05-30 21:22:58 +09:00
syuilo fea1a2e51b New translations ja.yml (German) 2018-05-30 21:22:55 +09:00
syuilo bda5347f1e New translations ja.yml (French) 2018-05-30 21:22:53 +09:00
syuilo 98d9c37922 Merge pull request #1665 from m4sk1n/patch-1
fix typo
2018-05-30 21:21:59 +09:00
syuilo e3bde41a25 New translations ja.yml (Polish) 2018-05-30 21:14:46 +09:00
Marcin Mikołajczak 5fb2f7749d fix typo 2018-05-30 12:13:51 +00:00
syuilo a56bdf2372 New translations ja.yml (Polish) 2018-05-30 21:05:48 +09:00
syuilo 9d991df32f New translations ja.yml (English) 2018-05-30 21:05:45 +09:00
syuilo c4a3f89d1c New translations ja.yml (English) 2018-05-30 20:51:48 +09:00
syuilo ea223bab51 Fix bug 2018-05-30 18:13:20 +09:00
syuilo dd94392317 2.24.2 2018-05-30 05:02:56 +09:00
syuilo baa2845916 Merge pull request #1663 from syuilo/l10n_master
New Crowdin translations
2018-05-30 05:02:17 +09:00
syuilo 97ae4ea13e New translations ja.yml (English) 2018-05-30 05:00:58 +09:00
syuilo d1c5f0c70f New translations ja.yml (Portuguese) 2018-05-30 04:51:38 +09:00
syuilo 95bff3005f New translations ja.yml (Korean) 2018-05-30 04:51:36 +09:00
syuilo c0b06496b1 New translations ja.yml (Polish) 2018-05-30 04:51:34 +09:00
syuilo 2105e1f259 New translations ja.yml (Chinese Simplified) 2018-05-30 04:51:32 +09:00
syuilo e546414c2f New translations ja.yml (Italian) 2018-05-30 04:51:30 +09:00
syuilo 1f4660a930 New translations ja.yml (Russian) 2018-05-30 04:51:28 +09:00
syuilo a2165c2e01 New translations ja.yml (English) 2018-05-30 04:51:26 +09:00
syuilo 1af920739f New translations ja.yml (Spanish) 2018-05-30 04:51:24 +09:00
syuilo 868e8228f0 New translations ja.yml (German) 2018-05-30 04:51:22 +09:00
syuilo 2bbc74560d New translations ja.yml (French) 2018-05-30 04:51:20 +09:00
syuilo 5d2caa456d 🎨 2018-05-30 04:46:50 +09:00
syuilo 9069a99a15 wip 2018-05-30 04:45:27 +09:00
syuilo fa56a44d85 🎨 2018-05-30 04:07:23 +09:00
syuilo 248acaee75 2.24.1 2018-05-30 00:16:03 +09:00
syuilo ef75f12abe Fix bug 2018-05-30 00:15:32 +09:00
syuilo 854814c226 2.24.0 2018-05-29 23:57:25 +09:00
syuilo b6a322f447 Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-29 23:56:52 +09:00
syuilo 161b9602f4 Fix bug 2018-05-29 23:56:44 +09:00
syuilo 62669bff07 Merge pull request #1662 from syuilo/l10n_master
New Crowdin translations
2018-05-29 23:55:19 +09:00
syuilo 02bd299714 New translations ja.yml (English) 2018-05-29 23:52:22 +09:00
syuilo f71dabfbfa New translations ja.yml (Portuguese) 2018-05-29 23:45:17 +09:00
syuilo 8d31cedafc New translations ja.yml (Korean) 2018-05-29 23:45:11 +09:00
syuilo a88d6c1c47 New translations ja.yml (Polish) 2018-05-29 23:45:09 +09:00
syuilo d35a13fc0b New translations ja.yml (Chinese Simplified) 2018-05-29 23:45:05 +09:00
syuilo 8e4029c1cd New translations ja.yml (Italian) 2018-05-29 23:44:59 +09:00
syuilo 9a9f852540 New translations ja.yml (Russian) 2018-05-29 23:44:57 +09:00
syuilo c66497a4de New translations ja.yml (English) 2018-05-29 23:44:55 +09:00
syuilo 1f9ecbf0be New translations ja.yml (Spanish) 2018-05-29 23:44:53 +09:00
syuilo 423a6f7013 New translations ja.yml (German) 2018-05-29 23:44:51 +09:00
syuilo ef0ca38362 New translations ja.yml (French) 2018-05-29 23:44:48 +09:00
syuilo ae9bfd69b0 Add analog clock widget 2018-05-29 23:13:39 +09:00
syuilo 3d231c3456 Fix 2018-05-29 22:56:05 +09:00
syuilo 95d0d0047a 時計をSVG化 2018-05-29 22:43:03 +09:00
syuilo d05aee19f2 2.23.2 2018-05-29 21:46:30 +09:00
syuilo 125765faa6 Fix bug 2018-05-29 21:46:02 +09:00
syuilo 70c0b1d8c0 🎨 2018-05-29 19:13:49 +09:00
syuilo 72e8660ae3 🎨 2018-05-29 19:03:03 +09:00
syuilo 2127bf32c2 2.23.1 2018-05-29 17:11:48 +09:00
syuilo 2b9acc239e Fix bug 2018-05-29 17:10:59 +09:00
syuilo 47a6188097 2.23.0 2018-05-29 15:43:24 +09:00
syuilo 8abce1469a Merge pull request #1661 from syuilo/l10n_master
New Crowdin translations
2018-05-29 15:43:01 +09:00
syuilo 8a2bee2136 New translations ja.yml (Portuguese) 2018-05-29 15:42:20 +09:00
syuilo e7a532f0cc New translations ja.yml (Korean) 2018-05-29 15:42:17 +09:00
syuilo 2cb1678577 New translations ja.yml (Polish) 2018-05-29 15:42:15 +09:00
syuilo d249bc6575 New translations ja.yml (Chinese Simplified) 2018-05-29 15:42:13 +09:00
syuilo e409b45873 New translations ja.yml (Italian) 2018-05-29 15:42:10 +09:00
syuilo f2d26c1909 New translations ja.yml (Russian) 2018-05-29 15:42:08 +09:00
syuilo 898e3d7138 New translations ja.yml (English) 2018-05-29 15:42:06 +09:00
syuilo 78cc0f7b6f New translations ja.yml (Spanish) 2018-05-29 15:42:04 +09:00
syuilo b14ca6a464 New translations ja.yml (German) 2018-05-29 15:42:02 +09:00
syuilo 4691c1259a New translations ja.yml (French) 2018-05-29 15:42:00 +09:00
syuilo 69f07cb015 Fix bug 2018-05-29 15:41:49 +09:00
syuilo a426f4c7bd nanka iroiro 2018-05-29 15:38:48 +09:00
syuilo 3430a2d093 New translations ja.yml (English) 2018-05-29 15:31:19 +09:00
syuilo 4ecc8c799d 🎨 2018-05-29 15:21:03 +09:00
syuilo fa02a58fc4 New translations ja.yml (Portuguese) 2018-05-29 14:51:25 +09:00
syuilo 2905d172b8 New translations ja.yml (Korean) 2018-05-29 14:51:23 +09:00
syuilo 5f6e5e4c8b New translations ja.yml (Polish) 2018-05-29 14:51:21 +09:00
syuilo d68c2a0170 New translations ja.yml (Chinese Simplified) 2018-05-29 14:51:19 +09:00
syuilo 76c7ad5e24 New translations ja.yml (Italian) 2018-05-29 14:51:17 +09:00
syuilo 1cf65a0145 New translations ja.yml (Russian) 2018-05-29 14:51:16 +09:00
syuilo 0c8602f1d5 New translations ja.yml (English) 2018-05-29 14:51:14 +09:00
syuilo 2dc4990804 New translations ja.yml (Spanish) 2018-05-29 14:51:12 +09:00
syuilo 47ecd2e900 New translations ja.yml (German) 2018-05-29 14:51:10 +09:00
syuilo 01d8e9cf4e New translations ja.yml (French) 2018-05-29 14:51:08 +09:00
syuilo da52f980c4 ✌️ 2018-05-29 14:42:29 +09:00
syuilo 366b7ef946 🎨 2018-05-29 14:22:15 +09:00
syuilo 0e7c0fd528 2.22.3 2018-05-29 13:22:29 +09:00
syuilo fb28b238cf Add workaround for Safari bug 2018-05-29 13:21:38 +09:00
syuilo b375bbc75c 2.22.2 2018-05-29 11:53:59 +09:00
syuilo 74ebd6e4a0 Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-29 11:53:35 +09:00
syuilo 72f2b92d4f ✌️ 2018-05-29 11:53:28 +09:00
syuilo 178eeec041 Merge pull request #1660 from syuilo/l10n_master
New Crowdin translations
2018-05-29 11:53:03 +09:00
syuilo 7ff950b5e3 New translations ja.yml (English) 2018-05-29 11:50:50 +09:00
syuilo 11409b723e 🎨 2018-05-29 11:45:01 +09:00
syuilo a59c8b4f57 New translations ja.yml (Portuguese) 2018-05-29 11:41:13 +09:00
syuilo 690e273257 New translations ja.yml (Korean) 2018-05-29 11:41:11 +09:00
syuilo 0133a1ba97 New translations ja.yml (Polish) 2018-05-29 11:41:09 +09:00
syuilo 809b0e67a6 New translations ja.yml (Chinese Simplified) 2018-05-29 11:41:08 +09:00
syuilo a702271efd New translations ja.yml (Italian) 2018-05-29 11:41:06 +09:00
syuilo ec4f8ddd3e New translations ja.yml (Russian) 2018-05-29 11:41:04 +09:00
syuilo 839f66c82f New translations ja.yml (English) 2018-05-29 11:41:02 +09:00
syuilo 9ae2775452 New translations ja.yml (Spanish) 2018-05-29 11:41:00 +09:00
syuilo c9818358ee New translations ja.yml (German) 2018-05-29 11:40:58 +09:00
syuilo 6e3a88ffcb New translations ja.yml (French) 2018-05-29 11:40:56 +09:00
syuilo 4c54d68fad Darken 2018-05-29 11:38:24 +09:00
syuilo c351ba7820 Fix 2018-05-29 11:36:45 +09:00
syuilo 3c2d72f611 Fix bug 2018-05-29 11:32:55 +09:00
syuilo f557407589 Fix bug 2018-05-29 11:29:02 +09:00
syuilo a0a4ce4dd9 Fix bug 2018-05-29 11:25:28 +09:00
syuilo 281971f4a4 2.22.1 2018-05-29 02:37:31 +09:00
syuilo 12b13e974c 🎨 2018-05-29 02:36:57 +09:00
syuilo 9d27fa7eaa Fix bug 2018-05-29 02:31:32 +09:00
syuilo 9f1385b03a 2.22.0 2018-05-29 02:26:13 +09:00
syuilo 8c019a6d0b Merge pull request #1659 from syuilo/l10n_master
New Crowdin translations
2018-05-29 02:24:14 +09:00
syuilo 87faf5942c New translations ja.yml (English) 2018-05-29 02:22:44 +09:00
syuilo 8c9977c136 🎨 2018-05-29 02:20:40 +09:00
syuilo 1ffa66af4f New translations ja.yml (English) 2018-05-29 02:13:39 +09:00
syuilo 3d5d2de80b New translations ja.yml (Portuguese) 2018-05-29 02:03:19 +09:00
syuilo 12c313235e New translations ja.yml (Korean) 2018-05-29 02:03:16 +09:00
syuilo c63acba0a5 New translations ja.yml (Polish) 2018-05-29 02:03:14 +09:00
syuilo 5aaf8e6308 New translations ja.yml (Chinese Simplified) 2018-05-29 02:03:12 +09:00
syuilo f7d6d41a90 New translations ja.yml (Italian) 2018-05-29 02:03:10 +09:00
syuilo 0d79a41527 New translations ja.yml (Russian) 2018-05-29 02:03:08 +09:00
syuilo fef8c14586 New translations ja.yml (English) 2018-05-29 02:03:06 +09:00
syuilo 1bfd4cfc34 New translations ja.yml (Spanish) 2018-05-29 02:03:04 +09:00
syuilo a8e48e06a1 New translations ja.yml (German) 2018-05-29 02:03:02 +09:00
syuilo d59dd7e44a New translations ja.yml (French) 2018-05-29 02:03:00 +09:00
syuilo e5431648fd ✌️ 2018-05-29 02:00:45 +09:00
syuilo 2ddbca4641 Fix bug 2018-05-29 01:55:32 +09:00
syuilo d944827f3d New translations ja.yml (Portuguese) 2018-05-29 01:52:43 +09:00
syuilo bd01d81d1d New translations ja.yml (Korean) 2018-05-29 01:52:41 +09:00
syuilo 9d52bd9ae8 New translations ja.yml (Polish) 2018-05-29 01:52:39 +09:00
syuilo 4f782ac219 New translations ja.yml (Chinese Simplified) 2018-05-29 01:52:37 +09:00
syuilo 77377ba63f New translations ja.yml (Italian) 2018-05-29 01:52:35 +09:00
syuilo 6afb985121 New translations ja.yml (Russian) 2018-05-29 01:52:33 +09:00
syuilo 47fb538311 New translations ja.yml (English) 2018-05-29 01:52:31 +09:00
syuilo 5644a2ff0b New translations ja.yml (Spanish) 2018-05-29 01:52:29 +09:00
syuilo c87aeb6cc4 New translations ja.yml (German) 2018-05-29 01:52:27 +09:00
syuilo 37ce882337 New translations ja.yml (French) 2018-05-29 01:52:24 +09:00
syuilo afc2efee1b ✌️ 2018-05-29 01:50:01 +09:00
syuilo 8f79f862b9 🍕 2018-05-29 01:44:15 +09:00
syuilo 016386b350 ✌️ 2018-05-29 01:25:54 +09:00
syuilo ab16fb3a3f #1634 2018-05-29 01:22:39 +09:00
syuilo 973b1e42ef typo 2018-05-29 00:38:07 +09:00
syuilo bd1f3a2f01 #1579 2018-05-29 00:36:52 +09:00
syuilo 5d82443389 2.21.1 2018-05-28 22:00:29 +09:00
syuilo 43eb8bd99b notes/local-timeline と notes/global-timeline のサインインを不要に 2018-05-28 21:59:57 +09:00
syuilo 06e77a4f16 Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-28 21:45:23 +09:00
syuilo 0ca2c313ec 2.21.0 2018-05-28 21:45:14 +09:00
syuilo c0b70e87bc Merge pull request #1658 from syuilo/l10n_master
New Crowdin translations
2018-05-28 21:44:45 +09:00
syuilo 5a76716b5a home 2018-05-28 21:43:33 +09:00
syuilo 3f9e5fffbe Fix bug 2018-05-28 21:43:21 +09:00
syuilo 90346a6b5f New translations ja.yml (English) 2018-05-28 21:42:52 +09:00
syuilo 57fda16c9c New translations ja.yml (Portuguese) 2018-05-28 21:37:45 +09:00
syuilo ae409bdaea New translations ja.yml (Korean) 2018-05-28 21:37:43 +09:00
syuilo a560427b95 New translations ja.yml (Polish) 2018-05-28 21:37:39 +09:00
syuilo cd57d7035a New translations ja.yml (Chinese Simplified) 2018-05-28 21:37:37 +09:00
syuilo 7753e8f169 New translations ja.yml (Italian) 2018-05-28 21:37:35 +09:00
syuilo e352832096 New translations ja.yml (Russian) 2018-05-28 21:37:32 +09:00
syuilo 63cc7b5a75 New translations ja.yml (English) 2018-05-28 21:37:30 +09:00
syuilo 753176588f New translations ja.yml (Spanish) 2018-05-28 21:37:28 +09:00
syuilo 10c1296a7c New translations ja.yml (German) 2018-05-28 21:37:26 +09:00
syuilo 76b5c32e31 New translations ja.yml (French) 2018-05-28 21:37:23 +09:00
syuilo abe14c1665 🎨 2018-05-28 21:33:36 +09:00
syuilo ba1b1a73b6 ✌️ 2018-05-28 21:31:20 +09:00
syuilo f0b86edb53 New translations ja.yml (Polish) 2018-05-28 19:32:32 +09:00
syuilo ce0f405d1e New translations ja.yml (Polish) 2018-05-28 18:11:37 +09:00
syuilo f1af362117 New translations ja.yml (Polish) 2018-05-28 16:52:07 +09:00
syuilo d2b1b30ef5 New translations ja.yml (Polish) 2018-05-28 16:51:02 +09:00
syuilo aa9b8a7ca5 New translations ja.yml (English) 2018-05-28 15:41:31 +09:00
syuilo e3bd8b1c21 New translations ja.yml (Portuguese) 2018-05-28 15:31:21 +09:00
syuilo 3b67350e8c New translations ja.yml (Korean) 2018-05-28 15:31:19 +09:00
syuilo 4db098d01d New translations ja.yml (Polish) 2018-05-28 15:31:17 +09:00
syuilo 1133b340e9 New translations ja.yml (Chinese Simplified) 2018-05-28 15:31:15 +09:00
syuilo 4bf5a28804 New translations ja.yml (Italian) 2018-05-28 15:31:13 +09:00
syuilo 1872fd4547 New translations ja.yml (Russian) 2018-05-28 15:31:11 +09:00
syuilo dc6c5104d4 New translations ja.yml (English) 2018-05-28 15:31:08 +09:00
syuilo 3a3f3f7663 New translations ja.yml (Spanish) 2018-05-28 15:31:06 +09:00
syuilo e8b14d5570 New translations ja.yml (German) 2018-05-28 15:31:04 +09:00
syuilo 9aed2632f7 New translations ja.yml (French) 2018-05-28 15:31:02 +09:00
133 changed files with 2803 additions and 1416 deletions
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

+8 -1
View File
@@ -47,7 +47,14 @@ You need to generate config file via `npm run config` command.
*5.* Build Misskey *5.* Build Misskey
---------------------------------------------------------------- ----------------------------------------------------------------
We need to use `node-gyp` to build the `crypto` module.
Build misskey with the following:
`npm run build`
If you're on Debian, you will need to install the `build-essential` package.
If you're still encountering errors about some modules, use node-gyp:
1. `npm install -g node-gyp` 1. `npm install -g node-gyp`
2. `node-gyp configure` 2. `node-gyp configure`
+98 -64
View File
@@ -3,7 +3,9 @@ meta:
lang: "Deutsch" lang: "Deutsch"
divider: "" divider: ""
common: common:
misskey: "Teile alles mit anderen mithilfe von Misskey" misskey: "A planet of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
time: time:
unknown: "Unbekannt" unknown: "Unbekannt"
future: "Zukunft" future: "Zukunft"
@@ -33,32 +35,40 @@ common:
angry: "Wütend" angry: "Wütend"
confused: "Verwirrt" confused: "Verwirrt"
pudding: "Pudding" pudding: "Pudding"
note-placeholders:
a: "Was machst du gerade?"
b: "Was ist so passiert?"
c: "Was geht dir durch den Kopf?"
d: "Willst du etwas sagen?"
e: "Schreib hier etwas!"
f: "Warte darauf, das du schreibst."
delete: "Löschen" delete: "Löschen"
loading: "Laden" loading: "Laden"
ok: "OK" ok: "OK"
update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden" update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden"
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet." my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
widgets: widgets:
profile: "プロフィール" analog-clock: "Analoge Uhr"
calendar: "カレンダー" profile: "Profil"
timemachine: "カレンダー(タイムマシン)" calendar: "Kalender"
activity: "アクティビティ" timemachine: "Kalender (Zeitmaschiene)"
rss: "RSSリーダー" activity: "Aktivitäten"
memo: "メモ" rss: "RSS Leser"
trends: "トレンド" memo: "Notizen"
photo-stream: "フォトストリーム" trends: "Trends"
slideshow: "スライドショー" photo-stream: "Bilder"
version: "バージョン" slideshow: "Diashow"
version: "Version"
broadcast: "ブロードキャスト" broadcast: "ブロードキャスト"
notifications: "通知" notifications: "Benachrichtigungen"
users: "おすすめユーザー" users: "Empfohlene Benutzer"
polls: "投票" polls: "Umfragen"
post-form: "投稿フォーム" post-form: "投稿フォーム"
messaging: "メッセージ" messaging: "Nachrichten"
server: "サーバー情報" server: "Server-Info"
donation: "寄付のお願い" donation: "Spenden"
nav: "ナビゲーション" nav: "Navigation"
tips: "ヒント" tips: "Tipps"
common/views/components/connect-failed.vue: common/views/components/connect-failed.vue:
title: "Verbindung zum Server ist fehlgeschlagen" title: "Verbindung zum Server ist fehlgeschlagen"
description: "Es gibt entweder ein Problem mit deiner Internetverbindung, der Server ist nicht erreichbar oder wird gerade gewartet. Bitte versuche es später noch einmal." description: "Es gibt entweder ein Problem mit deiner Internetverbindung, der Server ist nicht erreichbar oder wird gerade gewartet. Bitte versuche es später noch einmal."
@@ -113,8 +123,8 @@ common/views/components/nav.vue:
common/views/components/note-menu.vue: common/views/components/note-menu.vue:
favorite: "Diese Anmerkung favorisieren" favorite: "Diese Anmerkung favorisieren"
pin: "An die Profilseite pinnen" pin: "An die Profilseite pinnen"
delete: "削除" delete: "Löschen"
delete-confirm: "この投稿を削除しますか?" delete-confirm: "Diesen Post löschen?"
remote: "Auf Quelle anzeigen" remote: "Auf Quelle anzeigen"
common/views/components/poll.vue: common/views/components/poll.vue:
vote-to: "Stimme für '{}'" vote-to: "Stimme für '{}'"
@@ -175,14 +185,14 @@ common/views/components/twitter-setting.vue:
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "Warten" waiting: "Warten"
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
public: "公開" public: "Öffentlich"
home: "ホーム" home: "Home"
home-desc: "ホームタイムラインにのみ公開" home-desc: "ホームタイムラインにのみ公開"
followers: "フォロワー" followers: "Folgende"
followers-desc: "自分のフォロワーにのみ公開" followers-desc: "Nur für diejenigen sichtbar, die dir folgen"
specified: "ダイレクト" specified: "Direkt"
specified-desc: "指定したユーザーにのみ公開" specified-desc: "Poste nur für bestimmte Benutzer"
private: "非公開" private: "Privat"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "Laden" fetching: "Laden"
no-broadcasts: "Keine Broadcasts" no-broadcasts: "Keine Broadcasts"
@@ -198,9 +208,9 @@ common/views/widgets/server.vue:
title: "Serverinformationen" title: "Serverinformationen"
toggle: "Sicht umschalten" toggle: "Sicht umschalten"
common/views/widgets/memo.vue: common/views/widgets/memo.vue:
title: "メモ" title: "Notizen"
memo: "ここに書いて!" memo: "Schreib hier!"
save: "保存" save: "Speichern"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Schwarz ... komplett" total: "Schwarz ... komplett"
notes: "Blau ... Hinweise" notes: "Blau ... Hinweise"
@@ -239,29 +249,29 @@ desktop/views/components/drive.file.vue:
copy-url: "URL kopieren" copy-url: "URL kopieren"
download: "Download" download: "Download"
else-files: "その他..." else-files: "その他..."
set-as-avatar: "アイコンに設定" set-as-avatar: "Als Avatar festlegen"
set-as-banner: "バナーに設定" set-as-banner: "Setze als Banner"
open-in-app: "アプリで開く" open-in-app: "In der App öffnen"
add-app: "アプリを追加" add-app: "App hinzufügen"
rename-file: "ファイル名の変更" rename-file: "Datei umbennen"
input-new-file-name: "新しいファイル名を入力してください" input-new-file-name: "Geben Sie den neuen Dateinamen an"
copied: "コピー完了" copied: "Kopieren erfolgreich"
copied-url-to-clipboard: "URLをクリップボードにコピーしました" copied-url-to-clipboard: "URL wurde in die Zwischenablage kopiert"
desktop/views/components/drive.folder.vue: desktop/views/components/drive.folder.vue:
unable-to-process: "操作を完了できません" unable-to-process: "Der Vorgang konnte nicht beendet werden"
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。" circular-reference-detected: "Das Zielverzeichnis ist ein Unterverzeichnis des Verzeichnisses welches du verschieben möchtest"
unhandled-error: "不明なエラー" unhandled-error: "Unbekannter Fehler"
contextmenu: contextmenu:
move-to-this-folder: "このフォルダへ移動" move-to-this-folder: "Verschiebe in diesen Ordner"
show-in-new-window: "新しいウィンドウで表示" show-in-new-window: "In einem neuen Fenster anzeigen"
rename: "名前を変更" rename: "Umbenennen"
rename-folder: "フォルダ名の変更" rename-folder: "Ordner umbenennen"
input-new-folder-name: "新しいフォルダ名を入力してください" input-new-folder-name: "Namen für neuen Ordner eingeben"
desktop/views/components/drive.nav-folder.vue: desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ" drive: "Laufwerk"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "検索" search: "Suchen"
load-more: "もっと読み込む" load-more: "Mehr laden"
empty-draghover: "Herzlich Willkommen!" empty-draghover: "Herzlich Willkommen!"
empty-drive: "Dein Speicher ist leer" empty-drive: "Dein Speicher ist leer"
empty-drive-description: "Du kannst rechts klicken und \"Datei hochladen\" auswählen oder eine Datei per Drag and Drop auf das Fenster ziehen." empty-drive-description: "Du kannst rechts klicken und \"Datei hochladen\" auswählen oder eine Datei per Drag and Drop auf das Fenster ziehen."
@@ -280,12 +290,14 @@ desktop/views/components/drive.vue:
upload: "Eine Datei hochladen" upload: "Eine Datei hochladen"
url-upload: "Von einer URL hochladen" url-upload: "Von einer URL hochladen"
desktop/views/components/follow-button.vue: desktop/views/components/follow-button.vue:
unfollow: "フォロー解除" unfollow: "フォロー"
follow: "フォローする" follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
empty: "フォロワーはいないようです。" empty: "Dir scheint niemand zu folgen."
desktop/views/components/following-window.vue: desktop/views/components/following-window.vue:
following: "{} のフォロー" following: "{} のフォロー"
desktop/views/components/following.vue: desktop/views/components/following.vue:
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
location: "Ort" location: "Ort"
renote: "Anmerkung" renote: "Anmerkung"
add-reaction: "Reaktion hinzufügen" add-reaction: "Reaktion hinzufügen"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "Auch geteilt von" reposted-by: "Auch geteilt von"
reply: "Antworten" reply: "Antworten"
renote: "Anmerken" renote: "Anmerken"
add-reaction: "Eine Reaktion hinzufügen" add-reaction: "Eine Reaktion hinzufügen"
detail: "Zeige Details" detail: "Zeige Details"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.vue: desktop/views/components/notes.vue:
error: "Laden fehlgeschlagen." error: "Laden fehlgeschlagen."
retry: "Erneut versuchen" retry: "Erneut versuchen"
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
more: "Mehr" more: "Mehr"
empty: "Keine Benachrichtigungen" empty: "Keine Benachrichtigungen"
desktop/views/components/post-form.vue: desktop/views/components/post-form.vue:
note-placeholder: "Was ist bei dir los?"
reply-placeholder: "Antworte auf diese Anmerkung..." reply-placeholder: "Antworte auf diese Anmerkung..."
quote-placeholder: "Zitiere diese Anmerkung..." quote-placeholder: "Zitiere diese Anmerkung..."
note: "Post" submit: "投稿"
reply: "Antworten" reply: "Antworten"
renote: "Anmerkung" renote: "Anmerkung"
posted: "Gepostet!" posted: "Gepostet!"
@@ -468,7 +478,7 @@ desktop/views/components/settings.api.vue:
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
drive: "Speicher" drive: "Speicher"
favorites: "Favoriten" favorites: "Favoriten"
lists: "Listen" lists: "Listen"
follow-requests: "フォロー申請"
customize: "Anpassen" customize: "Anpassen"
settings: "Einstellungen" settings: "Einstellungen"
signout: "Ausloggen" signout: "Ausloggen"
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
post: "Einen neuen Post erstellen" post: "Einen neuen Post erstellen"
desktop/views/components/ui.header.search.vue: desktop/views/components/ui.header.search.vue:
placeholder: "Suchen" placeholder: "Suchen"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
signin: "ログイン" signin: "ログイン"
signup: "新規登録" signup: "新規登録"
signin-button: "やってる" signin-button: "やってる"
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
desktop/views/widgets/post-form.vue: desktop/views/widgets/post-form.vue:
title: "投稿" title: "投稿"
note: "投稿" note: "投稿"
placeholder: "いまどうしてる?"
desktop/views/widgets/profile.vue: desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集" update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集" update-avatar: "クリックでアバター編集"
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
mobile/views/components/follow-button.vue: mobile/views/components/follow-button.vue:
unfollow: "フォロー中"
follow: "フォロー" follow: "フォロー"
unfollow: "フォロー解除" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。" empty: "おすすめのユーザーは見つかりませんでした。"
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
submit: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)" quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
note-placeholder: "いまどうしてる?"
cw-placeholder: "内容への注釈 (オプション)" cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません" location-alert: "お使いの端末は位置情報に対応していません"
error: "エラー" error: "エラー"
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
empty: "投稿がありません" empty: "投稿がありません"
load-more: "もっと" load-more: "もっと"
mobile/views/components/ui.nav.vue: mobile/views/components/ui.nav.vue:
home: "ホーム" timeline: "タイムライン"
notifications: "通知" notifications: "通知"
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ" drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定" settings: "設定"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
all: "すべて" all: "すべて"
known: "知り合い" known: "知り合い"
load-more: "もっと" load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ" drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー" followers-of: "{}のフォロワー"
mobile/views/pages/following.vue: mobile/views/pages/following.vue:
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
messaging: "メッセージ" messaging: "メッセージ"
mobile/views/pages/messaging-room.vue: mobile/views/pages/messaging-room.vue:
messaging: "メッセージ" messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue: mobile/views/pages/note.vue:
title: "投稿" title: "投稿"
prev: "前の投稿" prev: "前の投稿"
+100 -66
View File
@@ -3,7 +3,9 @@ meta:
lang: "English" lang: "English"
divider: "" divider: ""
common: common:
misskey: "Share everything with others using Misskey." misskey: "A planet of fediverse"
about-title: "A ⭐ of fediverse."
about: "Thanks for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within Fediverse (a universe where various social media platforms are organized) it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?"
time: time:
unknown: "unknown" unknown: "unknown"
future: "future" future: "future"
@@ -33,12 +35,20 @@ common:
angry: "Angry" angry: "Angry"
confused: "Confused" confused: "Confused"
pudding: "Pudding" pudding: "Pudding"
note-placeholders:
a: "What are you doing?"
b: "What's happening?"
c: "Whats on your mind?"
d: "Do you want to say something?"
e: "Write here!"
f: "Waiting for your writing."
delete: "Delete" delete: "Delete"
loading: "Loading" loading: "Loading"
ok: "OK" ok: "OK"
update-available: "A new version of Misskey is now available({newer}, current is {current}). Reload the page to apply the update." update-available: "A new version of Misskey is now available({newer}, the current version is {current}). Reload the page to apply updates."
my-token-regenerated: "Your token has been generated. You will now get logged out." my-token-regenerated: "Your token has been renewed so you will be signed out."
widgets: widgets:
analog-clock: "Analog clock"
profile: "Profile" profile: "Profile"
calendar: "Calendar" calendar: "Calendar"
timemachine: "Calendar (Time Machine)" timemachine: "Calendar (Time Machine)"
@@ -72,9 +82,9 @@ common/views/components/connect-failed.troubleshooter.vue:
checking-internet: "Checking internet connection" checking-internet: "Checking internet connection"
server: "Server connection" server: "Server connection"
checking-server: "Checking server connection" checking-server: "Checking server connection"
finding: "Finding a problem" finding: "Searching for issues"
no-network: "There is no Network connection" no-network: "No connection"
no-network-desc: "Please make sure you are connected to the Network." no-network-desc: "Please make sure you are connected to the network."
no-internet: "There is no Internet connection" no-internet: "There is no Internet connection"
no-internet-desc: "Please make sure you are connected to the Internet." no-internet-desc: "Please make sure you are connected to the Internet."
no-server: "Unable to connect to the Misskey server" no-server: "Unable to connect to the Misskey server"
@@ -84,19 +94,19 @@ common/views/components/connect-failed.troubleshooter.vue:
flush: "Clean cache" flush: "Clean cache"
set-version: "Specify version" set-version: "Specify version"
common/views/components/messaging.vue: common/views/components/messaging.vue:
search-user: "Find an user" search-user: "Find a user"
you: "You" you: "You"
no-history: "No history" no-history: "No history"
common/views/components/messaging-room.vue: common/views/components/messaging-room.vue:
empty: "No conversations" empty: "You haven't messaged this user"
more: "More" more: "Read more"
no-history: "There is no more history" no-history: "There is no more history"
resize-form: "Drag to resize" resize-form: "Drag to resize"
new-message: "New message" new-message: "New message"
common/views/components/messaging-room.form.vue: common/views/components/messaging-room.form.vue:
input-message-here: "Enter message here" input-message-here: "Enter message here"
send: "Send" send: "Send"
attach-from-local: "Attach files from your pc" attach-from-local: "Attach files from your PC"
attach-from-drive: "Attach files from your Drive" attach-from-drive: "Attach files from your Drive"
common/views/components/messaging-room.message.vue: common/views/components/messaging-room.message.vue:
is-read: "Read" is-read: "Read"
@@ -128,7 +138,7 @@ common/views/components/poll-editor.vue:
choice-n: "Choice {}" choice-n: "Choice {}"
remove: "Remove this choice" remove: "Remove this choice"
add: "+ Add a choice" add: "+ Add a choice"
destroy: "Destroy this poll" destroy: "Cancel this poll"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "Choose a reaction" choose-reaction: "Choose a reaction"
common/views/components/signin.vue: common/views/components/signin.vue:
@@ -148,10 +158,10 @@ common/views/components/signup.vue:
too-long: "Please enter up to 20 characters." too-long: "Please enter up to 20 characters."
password: "Password" password: "Password"
password-placeholder: "We recommend more than 8 characters." password-placeholder: "We recommend more than 8 characters."
weak-password: "Weak" weak-password: "Weak password"
normal-password: "So so" normal-password: "Fair password"
strong-password: "Strong" strong-password: "Strong password"
retype: "Type again" retype: "Re-enter"
retype-placeholder: "Confirm your password" retype-placeholder: "Confirm your password"
password-matched: "OK" password-matched: "OK"
password-not-matched: "Doesn't match" password-not-matched: "Doesn't match"
@@ -168,9 +178,9 @@ common/views/components/stream-indicator.vue:
common/views/components/twitter-setting.vue: common/views/components/twitter-setting.vue:
description: "If you connect your Twitter account to your Misskey account, you will be able to see your Twitter account information on your profile and you can sign-in using Twitter." description: "If you connect your Twitter account to your Misskey account, you will be able to see your Twitter account information on your profile and you can sign-in using Twitter."
connected-to: "You are connected to this Twitter account" connected-to: "You are connected to this Twitter account"
detail: "Detail..." detail: "Details..."
reconnect: "Reconnect" reconnect: "Reconnect"
connect: "Link your twitter account" connect: "Link your Twitter account"
disconnect: "Disconnect" disconnect: "Disconnect"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "Waiting" waiting: "Waiting"
@@ -190,7 +200,7 @@ common/views/widgets/broadcast.vue:
next: "Next" next: "Next"
common/views/widgets/donation.vue: common/views/widgets/donation.vue:
title: "Donation" title: "Donation"
text: "To keep Misskey up and running we spend money for our domain name, servers and so on.. We don't get any money from it, and we would really appreciate it if you could donate. If you're interested contact {}. Thank you for your contribution!" text: "To keep Misskey up and running we spend money for our domain name, servers and so on. Since we don't get money from advertisements, we count on donations from all of you. If you're interested contact {}. Thank you for your contribution!"
common/views/widgets/photo-stream.vue: common/views/widgets/photo-stream.vue:
title: "Photostream" title: "Photostream"
no-photos: "No photos" no-photos: "No photos"
@@ -213,7 +223,7 @@ desktop/views/components/calendar.vue:
title: "{1} / {2}" title: "{1} / {2}"
prev: "Previous month" prev: "Previous month"
next: "Next month" next: "Next month"
go: "Click to naviguate" go: "Click to navigate"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "Choosing files" choose-file: "Choosing files"
upload: "Upload files from your PC" upload: "Upload files from your PC"
@@ -280,19 +290,21 @@ desktop/views/components/drive.vue:
upload: "Upload a file" upload: "Upload a file"
url-upload: "Upload from a URL" url-upload: "Upload from a URL"
desktop/views/components/follow-button.vue: desktop/views/components/follow-button.vue:
unfollow: "Unfollow" unfollow: "Following"
follow: "Follow" follow: "Follow"
request-pending: "フォロー許可待ち"
follow-request: "Follow request"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "Followers of {}" followers: "{}'s followers"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
empty: "Seems that you dont have any followers." empty: "Seems like you dont have any followers."
desktop/views/components/following-window.vue: desktop/views/components/following-window.vue:
following: "Following of {}" following: "Following {}"
desktop/views/components/following.vue: desktop/views/components/following.vue:
empty: "You dont follow anyone." empty: "You dont follow anyone."
desktop/views/components/friends-maker.vue: desktop/views/components/friends-maker.vue:
title: "Recommended users:" title: "Recommended users:"
empty: "Similar users werent found." empty: "Couldn't find any recommended users."
fetching: "Loading…" fetching: "Loading…"
refresh: "More" refresh: "More"
close: "Close" close: "Close"
@@ -313,19 +325,18 @@ desktop/views/components/note-detail.vue:
more: "Load more conversations" more: "Load more conversations"
private: "this post is private" private: "this post is private"
deleted: "this post has been deleted" deleted: "this post has been deleted"
reposted-by: "Renoted by {}" reposted-by: "Reposted by {}"
location: "Location" location: "Location"
renote: "Renote" renote: "Repost"
add-reaction: "Add a reaction" add-reaction: "Add a reaction"
desktop/views/components/note-detail.sub.vue:
private: "this post is private"
deleted: "this post has been deleted"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "Reposted by {}" reposted-by: "Reposted by {}"
reply: "Reply" reply: "Reply"
renote: "Renote" renote: "Repost"
add-reaction: "Add a reaction" add-reaction: "Add a reaction"
detail: "Show detail" detail: "Show details"
private: "this post is private"
deleted: "this post has been deleted"
desktop/views/components/notes.vue: desktop/views/components/notes.vue:
error: "Loading failed." error: "Loading failed."
retry: "Retry" retry: "Retry"
@@ -333,25 +344,24 @@ desktop/views/components/notifications.vue:
more: "More" more: "More"
empty: "No notifications" empty: "No notifications"
desktop/views/components/post-form.vue: desktop/views/components/post-form.vue:
note-placeholder: "What's happening?"
reply-placeholder: "Reply to this note..." reply-placeholder: "Reply to this note..."
quote-placeholder: "Quote this note..." quote-placeholder: "Quote this note..."
note: "Post" submit: "Post"
reply: "Reply" reply: "Reply"
renote: "Renote" renote: "Repost"
posted: "Posted!" posted: "Posted!"
replied: "Replied!" replied: "Replied!"
reposted: "Reposted!" reposted: "Reposted!"
note-failed: "Failed to note" note-failed: "Failed to note"
reply-failed: "Failed to reply" reply-failed: "Failed to reply"
renote-failed: "Failed to renote" renote-failed: "Failed to repost"
posting: "Posting" posting: "Posting"
attach-media-from-local: "Attach media from your pc" attach-media-from-local: "Attach media from your PC"
attach-media-from-drive: "Attach media from your Drive" attach-media-from-drive: "Attach media from your Drive"
attach-cancel: "Cancel attachment" attach-cancel: "Cancel attachment"
insert-a-kao: "v(‘ω’)v" insert-a-kao: "v(‘ω’)v"
create-poll: "Create a poll" create-poll: "Create a poll"
text-remain: "{} chars remaining" text-remain: "{} characters remaining"
desktop/views/components/post-form-window.vue: desktop/views/components/post-form-window.vue:
note: "New note" note: "New note"
reply: "Reply" reply: "Reply"
@@ -362,12 +372,12 @@ desktop/views/components/progress-dialog.vue:
desktop/views/components/renote-form.vue: desktop/views/components/renote-form.vue:
quote: "Quote..." quote: "Quote..."
cancel: "Cancel" cancel: "Cancel"
renote: "Renote" renote: "Repost"
reposting: "Reposting..." reposting: "Reposting..."
success: "Reposted!" success: "Reposted!"
failure: "Failed to Renote" failure: "Repost failed"
desktop/views/components/renote-form-window.vue: desktop/views/components/renote-form-window.vue:
title: "Are you sure you want to renote this note?" title: "Are you sure you want to repost this?"
desktop/views/components/settings-window.vue: desktop/views/components/settings-window.vue:
settings: "Settings" settings: "Settings"
desktop/views/components/settings.vue: desktop/views/components/settings.vue:
@@ -397,22 +407,22 @@ desktop/views/components/settings.vue:
gradient-window-header: "Use gradients on window headers" gradient-window-header: "Use gradients on window headers"
post-form-on-timeline: "Display post form at the top of the timeline" post-form-on-timeline: "Display post form at the top of the timeline"
show-reply-target: "Display reply target" show-reply-target: "Display reply target"
show-my-renotes: "Show my renote in the timeline" show-my-renotes: "Show my reposts in the timeline"
show-renoted-my-notes: "Show renoted my post in the timeline" show-renoted-my-notes: "Show my posts that have been shared in the timeline"
show-maps: "Show the map" show-maps: "Show the map"
show-maps-desc: "Show the map of the location attached to the post." show-maps-desc: "Automatically show the map of the location attached to the post."
sound: "Sound" sound: "Sound"
enable-sounds: "Enable sound" enable-sounds: "Enable sound"
enable-sounds-desc: "Play a sound when you received a post/message. This setting is stored in the browser." enable-sounds-desc: "Play a sound when you receive a post/message. This setting is stored in the browser."
volume: "Volume" volume: "Volume"
test: "Test" test: "Test"
mobile: "Mobile" mobile: "Mobile"
disable-via-mobile: "Not mark the post as 'from mobile'" disable-via-mobile: "Don't mark the post as 'from mobile'"
language: "Language" language: "Language"
pick-language: "Select a language" pick-language: "Select a language"
recommended: "Recommended" recommended: "Recommended"
auto: "Auto" auto: "Auto"
specify-language: "Specify the language" specify-language: "Specify language"
language-desc: "You need to reload the page for the changes to take effect." language-desc: "You need to reload the page for the changes to take effect."
cache: "Cache" cache: "Cache"
clean-cache: "Cleanup" clean-cache: "Cleanup"
@@ -430,11 +440,11 @@ desktop/views/components/settings.vue:
do-update: "Check for update" do-update: "Check for update"
update-settings: "Advanced settings" update-settings: "Advanced settings"
prevent-update: "Postpone updates (not recommended)" prevent-update: "Postpone updates (not recommended)"
prevent-update-desc: "You may reflect updates even if you select this setting. This setting is valid only this device." prevent-update-desc: "Even if you turn this setting on updates may apply. This setting is valid only for this device."
no-updates: "No updates available" no-updates: "No updates available"
no-updates-desc: "Your Misskey is up to date." no-updates-desc: "Your Misskey is up to date."
update-available: "New version is available!" update-available: "New version is available!"
update-available-desc: "To reload the page and updates are applied." update-available-desc: "The updates will apply if you reload the page again."
advanced-settings: "Advanced" advanced-settings: "Advanced"
debug-mode: "Enable the debug mode" debug-mode: "Enable the debug mode"
debug-mode-desc: "This setting is stored in the browser." debug-mode-desc: "This setting is stored in the browser."
@@ -468,8 +478,8 @@ desktop/views/components/settings.api.vue:
regenerate-token: "Regenerate the token" regenerate-token: "Regenerate the token"
token: "Token:" token: "Token:"
enter-password: "Please enter the password" enter-password: "Please enter the password"
desktop/views/components/settings.app.vue: desktop/views/components/settings.apps.vue:
no-apps: "No authorized apps" no-apps: "No linked applications"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "No muted users" no-users: "No muted users"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
drive: "Drive" drive: "Drive"
favorites: "Favorites" favorites: "Favorites"
lists: "Lists" lists: "Lists"
follow-requests: "Follow requests"
customize: "Customize" customize: "Customize"
settings: "Settings" settings: "Settings"
signout: "Sign out" signout: "Sign out"
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
post: "Compose new Post" post: "Compose new Post"
desktop/views/components/ui.header.search.vue: desktop/views/components/ui.header.search.vue:
placeholder: "Search" placeholder: "Search"
desktop/views/components/received-follow-requests-window.vue:
title: "Follow requests"
accept: "Accept"
reject: "Reject"
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "User lists"
create-list: "Create list" create-list: "Create list"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "Posts" notes: "Posts"
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
popout: "Popout" popout: "Popout"
close: "Close" close: "Close"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "about"
gotit: "Got it!"
signin: "Log In" signin: "Log In"
signup: "Sign up" signup: "Sign up"
signin-button: "Log in" signin-button: "Log in"
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
desktop/views/widgets/post-form.vue: desktop/views/widgets/post-form.vue:
title: "Post" title: "Post"
note: "Post" note: "Post"
placeholder: "What's happening?"
desktop/views/widgets/profile.vue: desktop/views/widgets/profile.vue:
update-banner: "Click to edit your banner" update-banner: "Click to edit your banner"
update-avatar: "Click to edit your avatar" update-avatar: "Click to edit your avatar"
@@ -624,13 +641,13 @@ mobile/views/components/drive.vue:
load-more: "Load more" load-more: "Load more"
nothing-in-drive: "Nothing" nothing-in-drive: "Nothing"
folder-is-empty: "This folder is empty" folder-is-empty: "This folder is empty"
prompt: "何をしますか?(数字を入力してください): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>" prompt: "What do you want to do? (Please enter a number): <1 → Upload a file | 2 → Upload a file from a URL | 3 → Create a folder | 4 → Change this folder's name | 5 → Move this folder | 6 → Delete this folder>"
deletion-alert: "Sorry! Deleting a folder is not yet implemented." deletion-alert: "Sorry! Deleting a folder is not yet implemented."
folder-name: "Folder name" folder-name: "Folder name"
root-rename-alert: "現在いる場所はルートで、フォルダではないため名前の変更はできません。名前を変更したいフォルダに移動してからやってください。" root-rename-alert: "You're in the root; it can't be renamed because it's not a folder. Navigate to a folder you want to rename and try again."
root-move-alert: "現在いる場所はルートで、フォルダではないため移動はできません。移動したいフォルダに移動してからやってください。" root-move-alert: "You're in the root; it can't be moved because it's not a folder. Navigate to a folder you want to move and try again."
url-prompt: "URL of file you want to upload" url-prompt: "URL of file you want to upload"
uploading: "アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。" uploading: "Upload requested. It may take some time for the upload to complete."
mobile/views/components/drive-file-detail.vue: mobile/views/components/drive-file-detail.vue:
rename: "Rename" rename: "Rename"
mobile/views/components/drive-file-chooser.vue: mobile/views/components/drive-file-chooser.vue:
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "Hash (md5)" hash: "Hash (md5)"
exif: "EXIF" exif: "EXIF"
mobile/views/components/follow-button.vue: mobile/views/components/follow-button.vue:
unfollow: "Following"
follow: "Follow" follow: "Follow"
unfollow: "Unfollow" request-pending: "フォロー許可待ち"
follow-request: "Follow request"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "Let's follow users" title: "Let's follow users"
empty: "Featured user was not found." empty: "Featured user was not found."
@@ -653,7 +672,7 @@ mobile/views/components/friends-maker.vue:
refresh: "See more" refresh: "See more"
close: "Close" close: "Close"
mobile/views/components/note.vue: mobile/views/components/note.vue:
reposted-by: "Renoted by {}" reposted-by: "Reposted by {}"
more: "See more" more: "See more"
less: "Hide" less: "Hide"
private: "this post is private" private: "this post is private"
@@ -662,7 +681,7 @@ mobile/views/components/note.vue:
mobile/views/components/note-detail.vue: mobile/views/components/note-detail.vue:
reply: "Reply" reply: "Reply"
reaction: "Reaction" reaction: "Reaction"
reposted-by: "Renoted by {}" reposted-by: "Reposted by {}"
private: "this post is private" private: "this post is private"
deleted: "this post has been deleted" deleted: "this post has been deleted"
location: "Location" location: "Location"
@@ -684,12 +703,11 @@ mobile/views/components/post-form.vue:
add-visible-user: "Add a user" add-visible-user: "Add a user"
submit: "Post" submit: "Post"
reply: "Reply" reply: "Reply"
renote: "Renote" renote: "Repost"
renote-placeholder: "Quote this post. (optional)" quote-placeholder: "Quote this post... (optional)"
reply-placeholder: "Reply to this note..." reply-placeholder: "Reply to this note..."
note-placeholder: "What's happening?" cw-placeholder: "Comments about content (optional)"
cw-placeholder: "内容への注釈 (オプション)" location-alert: "Your device does not support location services"
location-alert: "お使いの端末は位置情報に対応していません"
error: "Error" error: "Error"
username-prompt: "Enter user name" username-prompt: "Enter user name"
mobile/views/components/sub-note-content.vue: mobile/views/components/sub-note-content.vue:
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
empty: "No notes" empty: "No notes"
load-more: "More" load-more: "More"
mobile/views/components/ui.nav.vue: mobile/views/components/ui.nav.vue:
home: "Home" timeline: "Timeline"
notifications: "Notifications" notifications: "Notifications"
messaging: "Messages" messaging: "Messages"
follow-requests: "Follow requests"
search: "Search" search: "Search"
drive: "Drive" drive: "Drive"
favorites: "Favorites"
user-lists: "Lists"
widgets: "Widgets"
game: "Games"
darkmode: "Dark mode"
settings: "Settings" settings: "Settings"
about: "About Misskey" about: "About Misskey"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
all: "All" all: "All"
known: "You know" known: "You know"
load-more: "More" load-more: "More"
mobile/views/pages/favorites.vue:
title: "Favorites"
mobile/views/pages/user-lists.vue:
title: "Lists"
enter-list-name: "Enter list name"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "Drive" drive: "Drive"
more: "Load more"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
followers-of: "Followers of {}" followers-of: "Followers of {}"
mobile/views/pages/following.vue: mobile/views/pages/following.vue:
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
messaging: "Messaging" messaging: "Messaging"
mobile/views/pages/messaging-room.vue: mobile/views/pages/messaging-room.vue:
messaging: "Messaging" messaging: "Messaging"
mobile/views/pages/received-follow-requests.vue:
title: "Follow requests"
accept: "Accept"
reject: "Reject"
mobile/views/pages/note.vue: mobile/views/pages/note.vue:
title: "Post" title: "Post"
prev: "Previous note" prev: "Previous note"
@@ -769,8 +803,8 @@ mobile/views/pages/settings.vue:
circle-icons: "Use circle icons" circle-icons: "Use circle icons"
timeline: "Timeline" timeline: "Timeline"
show-reply-target: "Show reply target" show-reply-target: "Show reply target"
show-my-renotes: "Show my renotes" show-my-renotes: "Show my reposts"
show-renoted-my-notes: "Show renoted my notes" show-renoted-my-notes: "Show my reposted posts"
post-style: "Post design" post-style: "Post design"
post-style-standard: "Standard" post-style-standard: "Standard"
post-style-smart: "Smart" post-style-smart: "Smart"
+48 -14
View File
@@ -3,7 +3,9 @@ meta:
lang: "日本語" lang: "日本語"
divider: "" divider: ""
common: common:
misskey: "Misskeyで皆と共有しよう。" misskey: "A planet of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
time: time:
unknown: "なぞのじかん" unknown: "なぞのじかん"
future: "未来" future: "未来"
@@ -33,12 +35,20 @@ common:
angry: "おこ" angry: "おこ"
confused: "こまこまのこまり" confused: "こまこまのこまり"
pudding: "Pudding" pudding: "Pudding"
note-placeholders:
a: "今どうしてる?"
b: "何かありましたか?"
c: "何をお考えですか?"
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
delete: "削除" delete: "削除"
loading: "読み込み中" loading: "読み込み中"
ok: "わかった" ok: "わかった"
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。" update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
widgets: widgets:
analog-clock: "アナログ時計"
profile: "プロフィール" profile: "プロフィール"
calendar: "カレンダー" calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)" timemachine: "カレンダー(タイムマシン)"
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード" upload: "ファイルをアップロード"
url-upload: "URLからアップロード" url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue: desktop/views/components/follow-button.vue:
unfollow: "フォロー解除" unfollow: "フォロー"
follow: "フォローする" follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
location: "位置情報" location: "位置情報"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
detail: "詳細" detail: "詳細"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.vue: desktop/views/components/notes.vue:
error: "読み込みに失敗しました。" error: "読み込みに失敗しました。"
retry: "リトライ" retry: "リトライ"
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
more: "もっと見る" more: "もっと見る"
empty: "ありません!" empty: "ありません!"
desktop/views/components/post-form.vue: desktop/views/components/post-form.vue:
note-placeholder: "いまどうしてる?"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..." quote-placeholder: "この投稿を引用..."
note: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
posted: "投稿しました!" posted: "投稿しました!"
@@ -468,7 +478,7 @@ desktop/views/components/settings.api.vue:
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
drive: "ドライブ" drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請"
customize: "カスタマイズ" customize: "カスタマイズ"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
post: "新規投稿" post: "新規投稿"
desktop/views/components/ui.header.search.vue: desktop/views/components/ui.header.search.vue:
placeholder: "検索" placeholder: "検索"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
signin: "ログイン" signin: "ログイン"
signup: "新規登録" signup: "新規登録"
signin-button: "やってる" signin-button: "やってる"
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
desktop/views/widgets/post-form.vue: desktop/views/widgets/post-form.vue:
title: "投稿" title: "投稿"
note: "投稿" note: "投稿"
placeholder: "いまどうしてる?"
desktop/views/widgets/profile.vue: desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集" update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集" update-avatar: "クリックでアバター編集"
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
mobile/views/components/follow-button.vue: mobile/views/components/follow-button.vue:
unfollow: "フォロー中"
follow: "フォロー" follow: "フォロー"
unfollow: "フォロー解除" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。" empty: "おすすめのユーザーは見つかりませんでした。"
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
submit: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)" quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
note-placeholder: "いまどうしてる?"
cw-placeholder: "内容への注釈 (オプション)" cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません" location-alert: "お使いの端末は位置情報に対応していません"
error: "エラー" error: "エラー"
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
empty: "投稿がありません" empty: "投稿がありません"
load-more: "もっと" load-more: "もっと"
mobile/views/components/ui.nav.vue: mobile/views/components/ui.nav.vue:
home: "ホーム" timeline: "タイムライン"
notifications: "通知" notifications: "通知"
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ" drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定" settings: "設定"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
all: "すべて" all: "すべて"
known: "知り合い" known: "知り合い"
load-more: "もっと" load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ" drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー" followers-of: "{}のフォロワー"
mobile/views/pages/following.vue: mobile/views/pages/following.vue:
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
messaging: "メッセージ" messaging: "メッセージ"
mobile/views/pages/messaging-room.vue: mobile/views/pages/messaging-room.vue:
messaging: "メッセージ" messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue: mobile/views/pages/note.vue:
title: "投稿" title: "投稿"
prev: "前の投稿" prev: "前の投稿"
+49 -15
View File
@@ -3,7 +3,9 @@ meta:
lang: "Français" lang: "Français"
divider: "" divider: ""
common: common:
misskey: "Partagez avec les autres en utilisant Misskey" misskey: "A planet of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
time: time:
unknown: "inconnu" unknown: "inconnu"
future: "future" future: "future"
@@ -33,12 +35,20 @@ common:
angry: "En Colère" angry: "En Colère"
confused: "Confus" confused: "Confus"
pudding: "Pudding" pudding: "Pudding"
note-placeholders:
a: "今どうしてる?"
b: "何かありましたか?"
c: "何をお考えですか?"
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
delete: "Supprimer" delete: "Supprimer"
loading: "Chargement" loading: "Chargement"
ok: "OK" ok: "OK"
update-available: "Une nouvelle version de Misskey est disponible({newer}, version actuelle: {current}). Recharger la page pour appliquer la mise à jour." update-available: "Une nouvelle version de Misskey est disponible({newer}, version actuelle: {current}). Recharger la page pour appliquer la mise à jour."
my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté." my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté."
widgets: widgets:
analog-clock: "アナログ時計"
profile: "プロフィール" profile: "プロフィール"
calendar: "カレンダー" calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)" timemachine: "カレンダー(タイムマシン)"
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
upload: "Uploader un fichier" upload: "Uploader un fichier"
url-upload: "Uploader d'un URL" url-upload: "Uploader d'un URL"
desktop/views/components/follow-button.vue: desktop/views/components/follow-button.vue:
unfollow: "フォロー解除" unfollow: "フォロー"
follow: "フォローする" follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
location: "位置情報" location: "位置情報"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "Reposté par {}" reposted-by: "Reposté par {}"
reply: "Répondre" reply: "Répondre"
renote: "Renote" renote: "Renote"
add-reaction: "Ajouter votre reaction" add-reaction: "Ajouter votre reaction"
detail: "Afficher les détails" detail: "Afficher les détails"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.vue: desktop/views/components/notes.vue:
error: "読み込みに失敗しました。" error: "読み込みに失敗しました。"
retry: "リトライ" retry: "リトライ"
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
more: "Plus" more: "Plus"
empty: "Pas de notifications" empty: "Pas de notifications"
desktop/views/components/post-form.vue: desktop/views/components/post-form.vue:
note-placeholder: "Qu'est-ce qui se passe?"
reply-placeholder: "Répondre à cette note" reply-placeholder: "Répondre à cette note"
quote-placeholder: "Citer cette note" quote-placeholder: "Citer cette note"
note: "Poster" submit: "投稿"
reply: "Répondre" reply: "Répondre"
renote: "Renote" renote: "Renote"
posted: "Posté!" posted: "Posté!"
@@ -468,8 +478,8 @@ desktop/views/components/settings.api.vue:
regenerate-token: "Regenerer le token" regenerate-token: "Regenerer le token"
token: "Token:" token: "Token:"
enter-password: "Veuillez entrer le mot de passe" enter-password: "Veuillez entrer le mot de passe"
desktop/views/components/settings.app.vue: desktop/views/components/settings.apps.vue:
no-apps: "Aucune application authorisée" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "Aucun utilisateurs mis en sourdine" no-users: "Aucun utilisateurs mis en sourdine"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
drive: "Drive" drive: "Drive"
favorites: "Favorites" favorites: "Favorites"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請"
customize: "Modifications" customize: "Modifications"
settings: "Réglages" settings: "Réglages"
signout: "Déconnexion" signout: "Déconnexion"
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
post: "Composer un nouveau post" post: "Composer un nouveau post"
desktop/views/components/ui.header.search.vue: desktop/views/components/ui.header.search.vue:
placeholder: "Chercher" placeholder: "Chercher"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
signin: "ログイン" signin: "ログイン"
signup: "新規登録" signup: "新規登録"
signin-button: "やってる" signin-button: "やってる"
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
desktop/views/widgets/post-form.vue: desktop/views/widgets/post-form.vue:
title: "Post" title: "Post"
note: "Post" note: "Post"
placeholder: "Qu'est-ce qu'il se passe?"
desktop/views/widgets/profile.vue: desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集" update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集" update-avatar: "クリックでアバター編集"
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "Hash (md5)" hash: "Hash (md5)"
exif: "EXIF" exif: "EXIF"
mobile/views/components/follow-button.vue: mobile/views/components/follow-button.vue:
unfollow: "フォロー中"
follow: "Suivre" follow: "Suivre"
unfollow: "Ne plus suivre" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。" empty: "おすすめのユーザーは見つかりませんでした。"
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
submit: "Poster" submit: "Poster"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)" quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "Répondre à cette note" reply-placeholder: "Répondre à cette note"
note-placeholder: "Qu'est-ce qu'il se passe?"
cw-placeholder: "内容への注釈 (オプション)" cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません" location-alert: "お使いの端末は位置情報に対応していません"
error: "エラー" error: "エラー"
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
empty: "Pas de notes" empty: "Pas de notes"
load-more: "Afficher plus" load-more: "Afficher plus"
mobile/views/components/ui.nav.vue: mobile/views/components/ui.nav.vue:
home: "Accueil" timeline: "タイムライン"
notifications: "Notifications" notifications: "Notifications"
messaging: "Messages" messaging: "Messages"
follow-requests: "フォロー申請"
search: "Rechercher" search: "Rechercher"
drive: "Drive" drive: "Drive"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "Réglages" settings: "Réglages"
about: "À propose de Misskey" about: "À propose de Misskey"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
all: "Tout" all: "Tout"
known: "Vous connaissez" known: "Vous connaissez"
load-more: "Afficher plus" load-more: "Afficher plus"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "Drive" drive: "Drive"
more: "もっと見る"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
followers-of: "Abonnés de {}" followers-of: "Abonnés de {}"
mobile/views/pages/following.vue: mobile/views/pages/following.vue:
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
messaging: "Messagerie" messaging: "Messagerie"
mobile/views/pages/messaging-room.vue: mobile/views/pages/messaging-room.vue:
messaging: "Messagerie" messaging: "Messagerie"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue: mobile/views/pages/note.vue:
title: "Post" title: "Post"
prev: "Note précedante" prev: "Note précedante"
+48 -14
View File
@@ -3,7 +3,9 @@ meta:
lang: "日本語" lang: "日本語"
divider: "" divider: ""
common: common:
misskey: "Misskeyで皆と共有しよう。" misskey: "A planet of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
time: time:
unknown: "なぞのじかん" unknown: "なぞのじかん"
future: "未来" future: "未来"
@@ -33,12 +35,20 @@ common:
angry: "おこ" angry: "おこ"
confused: "こまこまのこまり" confused: "こまこまのこまり"
pudding: "Pudding" pudding: "Pudding"
note-placeholders:
a: "今どうしてる?"
b: "何かありましたか?"
c: "何をお考えですか?"
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
delete: "削除" delete: "削除"
loading: "読み込み中" loading: "読み込み中"
ok: "わかった" ok: "わかった"
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。" update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
widgets: widgets:
analog-clock: "アナログ時計"
profile: "プロフィール" profile: "プロフィール"
calendar: "カレンダー" calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)" timemachine: "カレンダー(タイムマシン)"
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード" upload: "ファイルをアップロード"
url-upload: "URLからアップロード" url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue: desktop/views/components/follow-button.vue:
unfollow: "フォロー解除" unfollow: "フォロー"
follow: "フォローする" follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
location: "位置情報" location: "位置情報"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
detail: "詳細" detail: "詳細"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.vue: desktop/views/components/notes.vue:
error: "読み込みに失敗しました。" error: "読み込みに失敗しました。"
retry: "リトライ" retry: "リトライ"
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
more: "もっと見る" more: "もっと見る"
empty: "ありません!" empty: "ありません!"
desktop/views/components/post-form.vue: desktop/views/components/post-form.vue:
note-placeholder: "いまどうしてる?"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..." quote-placeholder: "この投稿を引用..."
note: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
posted: "投稿しました!" posted: "投稿しました!"
@@ -468,7 +478,7 @@ desktop/views/components/settings.api.vue:
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
drive: "ドライブ" drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請"
customize: "カスタマイズ" customize: "カスタマイズ"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
post: "新規投稿" post: "新規投稿"
desktop/views/components/ui.header.search.vue: desktop/views/components/ui.header.search.vue:
placeholder: "検索" placeholder: "検索"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
signin: "ログイン" signin: "ログイン"
signup: "新規登録" signup: "新規登録"
signin-button: "やってる" signin-button: "やってる"
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
desktop/views/widgets/post-form.vue: desktop/views/widgets/post-form.vue:
title: "投稿" title: "投稿"
note: "投稿" note: "投稿"
placeholder: "いまどうしてる?"
desktop/views/widgets/profile.vue: desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集" update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集" update-avatar: "クリックでアバター編集"
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
mobile/views/components/follow-button.vue: mobile/views/components/follow-button.vue:
unfollow: "フォロー中"
follow: "フォロー" follow: "フォロー"
unfollow: "フォロー解除" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。" empty: "おすすめのユーザーは見つかりませんでした。"
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
submit: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)" quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
note-placeholder: "いまどうしてる?"
cw-placeholder: "内容への注釈 (オプション)" cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません" location-alert: "お使いの端末は位置情報に対応していません"
error: "エラー" error: "エラー"
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
empty: "投稿がありません" empty: "投稿がありません"
load-more: "もっと" load-more: "もっと"
mobile/views/components/ui.nav.vue: mobile/views/components/ui.nav.vue:
home: "ホーム" timeline: "タイムライン"
notifications: "通知" notifications: "通知"
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ" drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定" settings: "設定"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
all: "すべて" all: "すべて"
known: "知り合い" known: "知り合い"
load-more: "もっと" load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ" drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー" followers-of: "{}のフォロワー"
mobile/views/pages/following.vue: mobile/views/pages/following.vue:
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
messaging: "メッセージ" messaging: "メッセージ"
mobile/views/pages/messaging-room.vue: mobile/views/pages/messaging-room.vue:
messaging: "メッセージ" messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue: mobile/views/pages/note.vue:
title: "投稿" title: "投稿"
prev: "前の投稿" prev: "前の投稿"
+51 -15
View File
@@ -3,7 +3,9 @@ meta:
divider: "" divider: ""
common: common:
misskey: "Misskeyで皆と共有しよう。" misskey: "A planet of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
time: time:
unknown: "なぞのじかん" unknown: "なぞのじかん"
@@ -37,6 +39,14 @@ common:
confused: "こまこまのこまり" confused: "こまこまのこまり"
pudding: "Pudding" pudding: "Pudding"
note-placeholders:
a: "今どうしてる?"
b: "何かありましたか?"
c: "何をお考えですか?"
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
delete: "削除" delete: "削除"
loading: "読み込み中" loading: "読み込み中"
ok: "わかった" ok: "わかった"
@@ -44,6 +54,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
widgets: widgets:
analog-clock: "アナログ時計"
profile: "プロフィール" profile: "プロフィール"
calendar: "カレンダー" calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)" timemachine: "カレンダー(タイムマシン)"
@@ -320,8 +331,10 @@ desktop/views/components/drive.vue:
url-upload: "URLからアップロード" url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue: desktop/views/components/follow-button.vue:
unfollow: "フォロー解除" unfollow: "フォロー"
follow: "フォローする" follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
@@ -369,10 +382,6 @@ desktop/views/components/note-detail.vue:
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
reply: "返信" reply: "返信"
@@ -391,10 +400,9 @@ desktop/views/components/notifications.vue:
empty: "ありません!" empty: "ありません!"
desktop/views/components/post-form.vue: desktop/views/components/post-form.vue:
note-placeholder: "いまどうしてる?"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..." quote-placeholder: "この投稿を引用..."
note: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
posted: "投稿しました!" posted: "投稿しました!"
@@ -545,7 +553,7 @@ desktop/views/components/settings.api.vue:
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
@@ -590,6 +598,7 @@ desktop/views/components/ui.header.account.vue:
drive: "ドライブ" drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請"
customize: "カスタマイズ" customize: "カスタマイズ"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
@@ -609,7 +618,13 @@ desktop/views/components/ui.header.post.vue:
desktop/views/components/ui.header.search.vue: desktop/views/components/ui.header.search.vue:
placeholder: "検索" placeholder: "検索"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
@@ -631,6 +646,8 @@ desktop/views/components/window.vue:
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
signin: "ログイン" signin: "ログイン"
signup: "新規登録" signup: "新規登録"
signin-button: "やってる" signin-button: "やってる"
@@ -714,7 +731,6 @@ desktop/views/widgets/polls.vue:
desktop/views/widgets/post-form.vue: desktop/views/widgets/post-form.vue:
title: "投稿" title: "投稿"
note: "投稿" note: "投稿"
placeholder: "いまどうしてる?"
desktop/views/widgets/profile.vue: desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集" update-banner: "クリックでバナー編集"
@@ -764,8 +780,10 @@ mobile/views/components/drive.file-detail.vue:
exif: "EXIF" exif: "EXIF"
mobile/views/components/follow-button.vue: mobile/views/components/follow-button.vue:
unfollow: "フォロー中"
follow: "フォロー" follow: "フォロー"
unfollow: "フォロー解除" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
@@ -813,9 +831,8 @@ mobile/views/components/post-form.vue:
submit: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)" quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
note-placeholder: "いまどうしてる?"
cw-placeholder: "内容への注釈 (オプション)" cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません" location-alert: "お使いの端末は位置情報に対応していません"
error: "エラー" error: "エラー"
@@ -832,11 +849,17 @@ mobile/views/components/timeline.vue:
load-more: "もっと" load-more: "もっと"
mobile/views/components/ui.nav.vue: mobile/views/components/ui.nav.vue:
home: "ホーム" timeline: "タイムライン"
notifications: "通知" notifications: "通知"
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ" drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定" settings: "設定"
about: "Misskeyについて" about: "Misskeyについて"
@@ -850,8 +873,16 @@ mobile/views/components/users-list.vue:
known: "知り合い" known: "知り合い"
load-more: "もっと" load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ" drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー" followers-of: "{}のフォロワー"
@@ -870,6 +901,11 @@ mobile/views/pages/messaging.vue:
mobile/views/pages/messaging-room.vue: mobile/views/pages/messaging-room.vue:
messaging: "メッセージ" messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue: mobile/views/pages/note.vue:
title: "投稿" title: "投稿"
prev: "前の投稿" prev: "前の投稿"
+48 -14
View File
@@ -3,7 +3,9 @@ meta:
lang: "日本語" lang: "日本語"
divider: "" divider: ""
common: common:
misskey: "Misskeyで皆と共有しよう。" misskey: "A planet of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
time: time:
unknown: "なぞのじかん" unknown: "なぞのじかん"
future: "未来" future: "未来"
@@ -33,12 +35,20 @@ common:
angry: "おこ" angry: "おこ"
confused: "こまこまのこまり" confused: "こまこまのこまり"
pudding: "Pudding" pudding: "Pudding"
note-placeholders:
a: "今どうしてる?"
b: "何かありましたか?"
c: "何をお考えですか?"
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
delete: "削除" delete: "削除"
loading: "読み込み中" loading: "読み込み中"
ok: "わかった" ok: "わかった"
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。" update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
widgets: widgets:
analog-clock: "アナログ時計"
profile: "プロフィール" profile: "プロフィール"
calendar: "カレンダー" calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)" timemachine: "カレンダー(タイムマシン)"
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード" upload: "ファイルをアップロード"
url-upload: "URLからアップロード" url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue: desktop/views/components/follow-button.vue:
unfollow: "フォロー解除" unfollow: "フォロー"
follow: "フォローする" follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
location: "位置情報" location: "位置情報"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
detail: "詳細" detail: "詳細"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.vue: desktop/views/components/notes.vue:
error: "読み込みに失敗しました。" error: "読み込みに失敗しました。"
retry: "リトライ" retry: "リトライ"
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
more: "もっと見る" more: "もっと見る"
empty: "ありません!" empty: "ありません!"
desktop/views/components/post-form.vue: desktop/views/components/post-form.vue:
note-placeholder: "いまどうしてる?"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..." quote-placeholder: "この投稿を引用..."
note: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
posted: "投稿しました!" posted: "投稿しました!"
@@ -468,7 +478,7 @@ desktop/views/components/settings.api.vue:
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
drive: "ドライブ" drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請"
customize: "カスタマイズ" customize: "カスタマイズ"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
post: "新規投稿" post: "新規投稿"
desktop/views/components/ui.header.search.vue: desktop/views/components/ui.header.search.vue:
placeholder: "検索" placeholder: "検索"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
signin: "ログイン" signin: "ログイン"
signup: "新規登録" signup: "新規登録"
signin-button: "やってる" signin-button: "やってる"
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
desktop/views/widgets/post-form.vue: desktop/views/widgets/post-form.vue:
title: "投稿" title: "投稿"
note: "投稿" note: "投稿"
placeholder: "いまどうしてる?"
desktop/views/widgets/profile.vue: desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集" update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集" update-avatar: "クリックでアバター編集"
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
mobile/views/components/follow-button.vue: mobile/views/components/follow-button.vue:
unfollow: "フォロー中"
follow: "フォロー" follow: "フォロー"
unfollow: "フォロー解除" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。" empty: "おすすめのユーザーは見つかりませんでした。"
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
submit: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)" quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
note-placeholder: "いまどうしてる?"
cw-placeholder: "内容への注釈 (オプション)" cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません" location-alert: "お使いの端末は位置情報に対応していません"
error: "エラー" error: "エラー"
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
empty: "投稿がありません" empty: "投稿がありません"
load-more: "もっと" load-more: "もっと"
mobile/views/components/ui.nav.vue: mobile/views/components/ui.nav.vue:
home: "ホーム" timeline: "タイムライン"
notifications: "通知" notifications: "通知"
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ" drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定" settings: "設定"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
all: "すべて" all: "すべて"
known: "知り合い" known: "知り合い"
load-more: "もっと" load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ" drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー" followers-of: "{}のフォロワー"
mobile/views/pages/following.vue: mobile/views/pages/following.vue:
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
messaging: "メッセージ" messaging: "メッセージ"
mobile/views/pages/messaging-room.vue: mobile/views/pages/messaging-room.vue:
messaging: "メッセージ" messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue: mobile/views/pages/note.vue:
title: "投稿" title: "投稿"
prev: "前の投稿" prev: "前の投稿"
+72 -38
View File
@@ -3,7 +3,9 @@ meta:
lang: "język polski" lang: "język polski"
divider: "" divider: ""
common: common:
misskey: "Dziel się zawartością z innymi korzystając z Misskey." misskey: "Planeta Fediwersum"
about-title: "⭐ Fediwersum"
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
time: time:
unknown: "nieznany" unknown: "nieznany"
future: "w przyszłości" future: "w przyszłości"
@@ -33,12 +35,20 @@ common:
angry: "Wściekły" angry: "Wściekły"
confused: "Zmieszany" confused: "Zmieszany"
pudding: "Pudding" pudding: "Pudding"
note-placeholders:
a: "Co robisz?"
b: "Co się wydarzyło?"
c: "Co Ci chodzi po głowie?"
d: "Czy masz coś do powiedzenia?"
e: "Napisz coś tutaj!"
f: "Czekamy, aż coś napiszesz."
delete: "Usuń" delete: "Usuń"
loading: "Ładowanie" loading: "Ładowanie"
ok: "OK" ok: "OK"
update-available: "Nowa wersja Misskey jest dostępna ({newer}, obecna to {current}). Odśwież stronę, aby zastosować aktualizację." update-available: "Nowa wersja Misskey jest dostępna ({newer}, obecna to {current}). Odśwież stronę, aby zastosować aktualizację."
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany." my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
widgets: widgets:
analog-clock: "Zegar analogowy"
profile: "Profil" profile: "Profil"
calendar: "Kalendarz" calendar: "Kalendarz"
timemachine: "Kalendarz (wehikuł czasu)" timemachine: "Kalendarz (wehikuł czasu)"
@@ -113,8 +123,8 @@ common/views/components/nav.vue:
common/views/components/note-menu.vue: common/views/components/note-menu.vue:
favorite: "Dodaj do ulubionych" favorite: "Dodaj do ulubionych"
pin: "Przypnij do profilu" pin: "Przypnij do profilu"
delete: "削除" delete: "Usuń"
delete-confirm: "この投稿を削除しますか?" delete-confirm: "Czy na pewno chcesz usunąć ten wpis?"
remote: "Pokaż oryginał" remote: "Pokaż oryginał"
common/views/components/poll.vue: common/views/components/poll.vue:
vote-to: "Zagłosuj na '{}'" vote-to: "Zagłosuj na '{}'"
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
upload: "Wyślij plik" upload: "Wyślij plik"
url-upload: "Wyślij z adresu URL" url-upload: "Wyślij z adresu URL"
desktop/views/components/follow-button.vue: desktop/views/components/follow-button.vue:
unfollow: "Przestań śledzić" unfollow: "フォロー中"
follow: "Śledź" follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "Śledzący" followers: "Śledzący"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -311,21 +323,20 @@ desktop/views/components/messaging-window.vue:
title: "Wiadomości" title: "Wiadomości"
desktop/views/components/note-detail.vue: desktop/views/components/note-detail.vue:
more: "Załaduj więcej konwersacji" more: "Załaduj więcej konwersacji"
private: "この投稿は非公開です" private: "ten wpis jest prywatny"
deleted: "この投稿は削除されました" deleted: "ten wpis został usunięty"
reposted-by: "Udostępniono przez {}" reposted-by: "Udostępniono przez {}"
location: "Informacje o lokalizacji" location: "Informacje o lokalizacji"
renote: "Udostępnienie" renote: "Udostępnienie"
add-reaction: "Dodaj reakcję" add-reaction: "Dodaj reakcję"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "Udostępniono przez {}" reposted-by: "Udostępniono przez {}"
reply: "Odpowiedz" reply: "Odpowiedz"
renote: "Udostępnij" renote: "Udostępnij"
add-reaction: "Dodaj reakcję" add-reaction: "Dodaj reakcję"
detail: "Pokaż szczegóły" detail: "Pokaż szczegóły"
private: "ten wpis jest prywatny"
deleted: "ten wpis został usunięty"
desktop/views/components/notes.vue: desktop/views/components/notes.vue:
error: "Ładowanie nie powiodło się." error: "Ładowanie nie powiodło się."
retry: "Spróbuj ponownie" retry: "Spróbuj ponownie"
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
more: "Więcej" more: "Więcej"
empty: "Brak powiadomień" empty: "Brak powiadomień"
desktop/views/components/post-form.vue: desktop/views/components/post-form.vue:
note-placeholder: "Co się dzieje?"
reply-placeholder: "Odpowiedz na ten wpis…" reply-placeholder: "Odpowiedz na ten wpis…"
quote-placeholder: "Zacytuj ten wpis…" quote-placeholder: "Zacytuj ten wpis…"
note: "Wyślij" submit: "Wyślij"
reply: "Odpowiedz" reply: "Odpowiedz"
renote: "Udostępnienie" renote: "Udostępnienie"
posted: "Opublikowano!" posted: "Opublikowano!"
@@ -419,7 +429,7 @@ desktop/views/components/settings.vue:
cache-warn: "Pamięć podręczna informacji o koncie/wpisów/odpowiedzi/wiadomości/ustawień przechowywanych w przeglądarce zostanie usunięta. Będziesz musiał odświeżyć stronę po wyczyszczeniu." cache-warn: "Pamięć podręczna informacji o koncie/wpisów/odpowiedzi/wiadomości/ustawień przechowywanych w przeglądarce zostanie usunięta. Będziesz musiał odświeżyć stronę po wyczyszczeniu."
cache-cleared: "Wyczyszczono pamięć podręczną" cache-cleared: "Wyczyszczono pamięć podręczną"
cache-cleared-desc: "Proszę odświeżyć stronę." cache-cleared-desc: "Proszę odświeżyć stronę."
auto-watch: "投稿の自動ウォッチ" auto-watch: "Automatycznie nasłuchuj"
auto-watch-desc: "Otrzymuj natychmiastowo informacje o wpisach/odpowiedziach/reakcjach." auto-watch-desc: "Otrzymuj natychmiastowo informacje o wpisach/odpowiedziach/reakcjach."
about: "O Misskey" about: "O Misskey"
operator: "Administrator instancji" operator: "Administrator instancji"
@@ -442,7 +452,7 @@ desktop/views/components/settings.vue:
experimental-desc: "Aktywowanie eksperymentalnych funkcji może spowodować niestabilność Misskey. Opcja ta jest przechowywana w przeglądarce." experimental-desc: "Aktywowanie eksperymentalnych funkcji może spowodować niestabilność Misskey. Opcja ta jest przechowywana w przeglądarce."
tools: "Narzędzia" tools: "Narzędzia"
task-manager: "Menedżer zadań" task-manager: "Menedżer zadań"
third-parties: "サードパーティ" third-parties: "Autorzy trzeci"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "Jeżeli skonfigurujesz uwierzytelnianie dwuetapowe, aby zablokować się będziesz potrzebować (oprócz hasła) kodu ze skonfigurowanego urządzenia (np. smartfonu), co zwiększy bezpieczeństwo." intro: "Jeżeli skonfigurujesz uwierzytelnianie dwuetapowe, aby zablokować się będziesz potrzebować (oprócz hasła) kodu ze skonfigurowanego urządzenia (np. smartfonu), co zwiększy bezpieczeństwo."
detail: "Zobacz szczegóły…" detail: "Zobacz szczegóły…"
@@ -462,13 +472,13 @@ desktop/views/components/settings.2fa.vue:
failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token." failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token."
info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey." info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey."
desktop/views/components/settings.api.vue: desktop/views/components/settings.api.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" intro: "Aby uzyskać dostęp do API, ustaw ten token jako klucz 'i' parametrów żądań."
caution: "Nie pokazuj tego tokenu osobom trzecim (nie wprowadzaj go nigdzie indziej), aby konto nie trafiło w niepowołane ręce." caution: "Nie pokazuj tego tokenu osobom trzecim (nie wprowadzaj go nigdzie indziej), aby konto nie trafiło w niepowołane ręce."
regeneration-of-token: "W przypadku wycieku tokenu, możesz wygenerować nowy." regeneration-of-token: "W przypadku wycieku tokenu, możesz wygenerować nowy."
regenerate-token: "Wygeneruj nowy token" regenerate-token: "Wygeneruj nowy token"
token: "Token:" token: "Token:"
enter-password: "Wprowadź hasło" enter-password: "Wprowadź hasło"
desktop/views/components/settings.app.vue: desktop/views/components/settings.apps.vue:
no-apps: "Brak zautoryzowanych aplikacji" no-apps: "Brak zautoryzowanych aplikacji"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "Brak wyciszonych użytkowników" no-users: "Brak wyciszonych użytkowników"
@@ -490,9 +500,9 @@ desktop/views/components/settings.profile.vue:
is-bot: "To konto jest prowadzone przez bota" is-bot: "To konto jest prowadzone przez bota"
is-cat: "To konto jest prowadzone przez kota" is-cat: "To konto jest prowadzone przez kota"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "ten wpis jest prywatny"
deleted: "この投稿は削除されました" deleted: "ten wpis został usunięty"
media-count: "{}つのメディア" media-count: "{}zawartości multimedialnej"
poll: "Ankiety" poll: "Ankiety"
desktop/views/components/taskmanager.vue: desktop/views/components/taskmanager.vue:
title: "Menedżer zadań" title: "Menedżer zadań"
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
drive: "Dysk" drive: "Dysk"
favorites: "Ulubione" favorites: "Ulubione"
lists: "Listy" lists: "Listy"
follow-requests: "フォロー申請"
customize: "Dostosuj" customize: "Dostosuj"
settings: "Ustawienia" settings: "Ustawienia"
signout: "Wyloguj się" signout: "Wyloguj się"
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
post: "Utwórz nowy wpis" post: "Utwórz nowy wpis"
desktop/views/components/ui.header.search.vue: desktop/views/components/ui.header.search.vue:
placeholder: "Szukaj" placeholder: "Szukaj"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "Utwórz listę" create-list: "Utwórz listę"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "Wpisy" notes: "Wpisy"
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
popout: "Pop-out" popout: "Pop-out"
close: "Zamknij" close: "Zamknij"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "O Misskey"
gotit: "Rozumiem!"
signin: "Zaloguj się" signin: "Zaloguj się"
signup: "Zarejestruj się" signup: "Zarejestruj się"
signin-button: "Zaloguj się" signin-button: "Zaloguj się"
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
desktop/views/widgets/post-form.vue: desktop/views/widgets/post-form.vue:
title: "Wpis" title: "Wpis"
note: "Wpis" note: "Wpis"
placeholder: "Co się dzieje?"
desktop/views/widgets/profile.vue: desktop/views/widgets/profile.vue:
update-banner: "Naciśnij, aby zmienić baner" update-banner: "Naciśnij, aby zmienić baner"
update-avatar: "Naciśnij, aby zmienić awatar" update-avatar: "Naciśnij, aby zmienić awatar"
@@ -625,12 +642,12 @@ mobile/views/components/drive.vue:
nothing-in-drive: "Pusto" nothing-in-drive: "Pusto"
folder-is-empty: "Ten katalog jest pusty" folder-is-empty: "Ten katalog jest pusty"
prompt: "Co chcesz zrobić? (wprowadź odpowiednią cyfrę): <1 → Wysłać plik | 2 → Wysłać plik z adresu URL | 3 → Utworzyć katalog | 4 → Zmienić nazwę tego katalogu | 5 → Przenieść ten katalog | 6 → Usunąć ten katalog>" prompt: "Co chcesz zrobić? (wprowadź odpowiednią cyfrę): <1 → Wysłać plik | 2 → Wysłać plik z adresu URL | 3 → Utworzyć katalog | 4 → Zmienić nazwę tego katalogu | 5 → Przenieść ten katalog | 6 → Usunąć ten katalog>"
deletion-alert: "ごめんなさい!フォルダの削除は未実装です...。" deletion-alert: "Przepraszamy. Usuwanie katalogów nie zostało jeszcze zaimplementowane."
folder-name: "Nazwa katalogu" folder-name: "Nazwa katalogu"
root-rename-alert: "現在いる場所はルートで、フォルダではないため名前の変更はできません。名前を変更したいフォルダに移動してからやってください。" root-rename-alert: "Nie można zmienić nazwy katalogu głównego. Przejdź do katalogu, którego nazwę chcesz zmienić."
root-move-alert: "現在いる場所はルートで、フォルダではないため移動はできません。移動したいフォルダに移動してからやってください。" root-move-alert: "Nie można przenieść tego katalogu, ponieważ jest on katalogiem głównym. Przejdź do katalogu, który chcesz przenieść."
url-prompt: "Adres URL pliku, który chcesz wysłać" url-prompt: "Adres URL pliku, który chcesz wysłać"
uploading: "アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。" uploading: "Rozpoczęto wysyłanie. Może to trochę potrwać."
mobile/views/components/drive-file-detail.vue: mobile/views/components/drive-file-detail.vue:
rename: "Zmień nazwę" rename: "Zmień nazwę"
mobile/views/components/drive-file-chooser.vue: mobile/views/components/drive-file-chooser.vue:
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "Hash (md5)" hash: "Hash (md5)"
exif: "EXIF" exif: "EXIF"
mobile/views/components/follow-button.vue: mobile/views/components/follow-button.vue:
unfollow: "フォロー中"
follow: "Śledź" follow: "Śledź"
unfollow: "Przestań śledzić" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "Zacznij śledzić ludzi takich jak Ty" title: "Zacznij śledzić ludzi takich jak Ty"
empty: "Nie znaleziono podobnych użytkowników." empty: "Nie znaleziono podobnych użytkowników."
@@ -656,15 +675,15 @@ mobile/views/components/note.vue:
reposted-by: "Udostępniono przez {}" reposted-by: "Udostępniono przez {}"
more: "Rozwiń" more: "Rozwiń"
less: "Zwiń" less: "Zwiń"
private: "この投稿は非公開です" private: "ten wpis jest prywatny"
deleted: "この投稿は削除されました" deleted: "ten wpis został usunięty"
location: "Informacje o lokalizacji" location: "Informacje o lokalizacji"
mobile/views/components/note-detail.vue: mobile/views/components/note-detail.vue:
reply: "Odpowiedz" reply: "Odpowiedz"
reaction: "Reakcja" reaction: "Reakcja"
reposted-by: "Udostępniono przez {}" reposted-by: "Udostępniono przez {}"
private: "この投稿は非公開です" private: "ten wpis jest prywatny"
deleted: "この投稿は削除されました" deleted: "ten wpis został usunięty"
location: "Informacje o lokalizacji" location: "Informacje o lokalizacji"
mobile/views/components/note-preview.vue: mobile/views/components/note-preview.vue:
admin: "admin" admin: "admin"
@@ -685,27 +704,32 @@ mobile/views/components/post-form.vue:
submit: "Wyślij" submit: "Wyślij"
reply: "Odpowiedz" reply: "Odpowiedz"
renote: "Udostępnij" renote: "Udostępnij"
renote-placeholder: "Zacytuj wpis… (nieobowiązkowe)" quote-placeholder: "Zacytuj ten wpis… (nieobowiązkowe)"
reply-placeholder: "Odpowiedź na ten wpis…" reply-placeholder: "Odpowiedź na ten wpis…"
note-placeholder: "Co się dzieje?" cw-placeholder: "Treść ostrzeżenia (opcjonalnie)"
cw-placeholder: "内容への注釈 (オプション)" location-alert: "Twoje urządzenie nie pozwala na przekazywanie informacji o lokalizacji"
location-alert: "お使いの端末は位置情報に対応していません"
error: "Błąd" error: "Błąd"
username-prompt: "Wprowadź nazwę użytkownika" username-prompt: "Wprowadź nazwę użytkownika"
mobile/views/components/sub-note-content.vue: mobile/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "ten wpis jest prywatny"
deleted: "この投稿は削除されました" deleted: "ten wpis został usunięty"
media-count: "{}つのメディア" media-count: "{}zawartości multimedialnej"
poll: "Ankieta" poll: "Ankieta"
mobile/views/components/timeline.vue: mobile/views/components/timeline.vue:
empty: "Brak wpisów" empty: "Brak wpisów"
load-more: "Więcej" load-more: "Więcej"
mobile/views/components/ui.nav.vue: mobile/views/components/ui.nav.vue:
home: "Strona główna" timeline: "Oś czasu"
notifications: "Powiadomienia" notifications: "Powiadomienia"
messaging: "Wiadomości" messaging: "Wiadomości"
follow-requests: "フォロー申請"
search: "Szukaj" search: "Szukaj"
drive: "Dysk" drive: "Dysk"
favorites: "Ulubione"
user-lists: "Listy"
widgets: "Widżety"
game: "Gry"
darkmode: "Tryb ciemny"
settings: "Ustawienia" settings: "Ustawienia"
about: "O Misskey" about: "O Misskey"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
all: "Wszyscy" all: "Wszyscy"
known: "Znasz" known: "Znasz"
load-more: "Więcej" load-more: "Więcej"
mobile/views/pages/favorites.vue:
title: "Ulubione"
mobile/views/pages/user-lists.vue:
title: "Listy"
enter-list-name: "Wprowadź nazwę listy"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "Dysk" drive: "Dysk"
more: "Załaduj więcej"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
followers-of: "Śledzący {}" followers-of: "Śledzący {}"
mobile/views/pages/following.vue: mobile/views/pages/following.vue:
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
messaging: "Wiadomości" messaging: "Wiadomości"
mobile/views/pages/messaging-room.vue: mobile/views/pages/messaging-room.vue:
messaging: "Wiadomości" messaging: "Wiadomości"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue: mobile/views/pages/note.vue:
title: "Wpis" title: "Wpis"
prev: "Poprzedni wpis" prev: "Poprzedni wpis"
@@ -773,7 +807,7 @@ mobile/views/pages/settings.vue:
show-renoted-my-notes: "Pokazuj udostępnienia moich wpisów" show-renoted-my-notes: "Pokazuj udostępnienia moich wpisów"
post-style: "Styl wpisów" post-style: "Styl wpisów"
post-style-standard: "Standardowy" post-style-standard: "Standardowy"
post-style-smart: "スマート" post-style-smart: "Inteligentny"
behavior: "Zachowanie" behavior: "Zachowanie"
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół" fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”" disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”"
+48 -14
View File
@@ -3,7 +3,9 @@ meta:
lang: "Português" lang: "Português"
divider: "" divider: ""
common: common:
misskey: "Misskeyで皆と共有しよう。" misskey: "A planet of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
time: time:
unknown: "なぞのじかん" unknown: "なぞのじかん"
future: "未来" future: "未来"
@@ -33,12 +35,20 @@ common:
angry: "おこ" angry: "おこ"
confused: "こまこまのこまり" confused: "こまこまのこまり"
pudding: "Pudding" pudding: "Pudding"
note-placeholders:
a: "今どうしてる?"
b: "何かありましたか?"
c: "何をお考えですか?"
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
delete: "削除" delete: "削除"
loading: "読み込み中" loading: "読み込み中"
ok: "わかった" ok: "わかった"
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。" update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
widgets: widgets:
analog-clock: "アナログ時計"
profile: "プロフィール" profile: "プロフィール"
calendar: "カレンダー" calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)" timemachine: "カレンダー(タイムマシン)"
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード" upload: "ファイルをアップロード"
url-upload: "URLからアップロード" url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue: desktop/views/components/follow-button.vue:
unfollow: "フォロー解除" unfollow: "フォロー"
follow: "フォローする" follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
location: "位置情報" location: "位置情報"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
detail: "詳細" detail: "詳細"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.vue: desktop/views/components/notes.vue:
error: "読み込みに失敗しました。" error: "読み込みに失敗しました。"
retry: "リトライ" retry: "リトライ"
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
more: "もっと見る" more: "もっと見る"
empty: "ありません!" empty: "ありません!"
desktop/views/components/post-form.vue: desktop/views/components/post-form.vue:
note-placeholder: "いまどうしてる?"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..." quote-placeholder: "この投稿を引用..."
note: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
posted: "投稿しました!" posted: "投稿しました!"
@@ -468,7 +478,7 @@ desktop/views/components/settings.api.vue:
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
drive: "ドライブ" drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請"
customize: "カスタマイズ" customize: "カスタマイズ"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
post: "新規投稿" post: "新規投稿"
desktop/views/components/ui.header.search.vue: desktop/views/components/ui.header.search.vue:
placeholder: "検索" placeholder: "検索"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
signin: "ログイン" signin: "ログイン"
signup: "新規登録" signup: "新規登録"
signin-button: "やってる" signin-button: "やってる"
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
desktop/views/widgets/post-form.vue: desktop/views/widgets/post-form.vue:
title: "投稿" title: "投稿"
note: "投稿" note: "投稿"
placeholder: "いまどうしてる?"
desktop/views/widgets/profile.vue: desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集" update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集" update-avatar: "クリックでアバター編集"
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
mobile/views/components/follow-button.vue: mobile/views/components/follow-button.vue:
unfollow: "フォロー中"
follow: "フォロー" follow: "フォロー"
unfollow: "フォロー解除" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。" empty: "おすすめのユーザーは見つかりませんでした。"
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
submit: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)" quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
note-placeholder: "いまどうしてる?"
cw-placeholder: "内容への注釈 (オプション)" cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません" location-alert: "お使いの端末は位置情報に対応していません"
error: "エラー" error: "エラー"
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
empty: "投稿がありません" empty: "投稿がありません"
load-more: "もっと" load-more: "もっと"
mobile/views/components/ui.nav.vue: mobile/views/components/ui.nav.vue:
home: "ホーム" timeline: "タイムライン"
notifications: "通知" notifications: "通知"
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ" drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定" settings: "設定"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
all: "すべて" all: "すべて"
known: "知り合い" known: "知り合い"
load-more: "もっと" load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ" drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー" followers-of: "{}のフォロワー"
mobile/views/pages/following.vue: mobile/views/pages/following.vue:
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
messaging: "メッセージ" messaging: "メッセージ"
mobile/views/pages/messaging-room.vue: mobile/views/pages/messaging-room.vue:
messaging: "メッセージ" messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue: mobile/views/pages/note.vue:
title: "投稿" title: "投稿"
prev: "前の投稿" prev: "前の投稿"
+48 -14
View File
@@ -3,7 +3,9 @@ meta:
lang: "Русский язык" lang: "Русский язык"
divider: "" divider: ""
common: common:
misskey: "Misskeyで皆と共有しよう。" misskey: "A planet of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
time: time:
unknown: "なぞのじかん" unknown: "なぞのじかん"
future: "未来" future: "未来"
@@ -33,12 +35,20 @@ common:
angry: "おこ" angry: "おこ"
confused: "こまこまのこまり" confused: "こまこまのこまり"
pudding: "Pudding" pudding: "Pudding"
note-placeholders:
a: "今どうしてる?"
b: "何かありましたか?"
c: "何をお考えですか?"
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
delete: "削除" delete: "削除"
loading: "読み込み中" loading: "読み込み中"
ok: "わかった" ok: "わかった"
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。" update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
widgets: widgets:
analog-clock: "アナログ時計"
profile: "プロフィール" profile: "プロフィール"
calendar: "カレンダー" calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)" timemachine: "カレンダー(タイムマシン)"
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード" upload: "ファイルをアップロード"
url-upload: "URLからアップロード" url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue: desktop/views/components/follow-button.vue:
unfollow: "フォロー解除" unfollow: "フォロー"
follow: "フォローする" follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
location: "位置情報" location: "位置情報"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
detail: "詳細" detail: "詳細"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.vue: desktop/views/components/notes.vue:
error: "読み込みに失敗しました。" error: "読み込みに失敗しました。"
retry: "リトライ" retry: "リトライ"
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
more: "もっと見る" more: "もっと見る"
empty: "ありません!" empty: "ありません!"
desktop/views/components/post-form.vue: desktop/views/components/post-form.vue:
note-placeholder: "いまどうしてる?"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..." quote-placeholder: "この投稿を引用..."
note: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
posted: "投稿しました!" posted: "投稿しました!"
@@ -468,7 +478,7 @@ desktop/views/components/settings.api.vue:
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
drive: "ドライブ" drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請"
customize: "カスタマイズ" customize: "カスタマイズ"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
post: "新規投稿" post: "新規投稿"
desktop/views/components/ui.header.search.vue: desktop/views/components/ui.header.search.vue:
placeholder: "検索" placeholder: "検索"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
signin: "ログイン" signin: "ログイン"
signup: "新規登録" signup: "新規登録"
signin-button: "やってる" signin-button: "やってる"
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
desktop/views/widgets/post-form.vue: desktop/views/widgets/post-form.vue:
title: "投稿" title: "投稿"
note: "投稿" note: "投稿"
placeholder: "いまどうしてる?"
desktop/views/widgets/profile.vue: desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集" update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集" update-avatar: "クリックでアバター編集"
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
mobile/views/components/follow-button.vue: mobile/views/components/follow-button.vue:
unfollow: "フォロー中"
follow: "フォロー" follow: "フォロー"
unfollow: "フォロー解除" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。" empty: "おすすめのユーザーは見つかりませんでした。"
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
submit: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)" quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
note-placeholder: "いまどうしてる?"
cw-placeholder: "内容への注釈 (オプション)" cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません" location-alert: "お使いの端末は位置情報に対応していません"
error: "エラー" error: "エラー"
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
empty: "投稿がありません" empty: "投稿がありません"
load-more: "もっと" load-more: "もっと"
mobile/views/components/ui.nav.vue: mobile/views/components/ui.nav.vue:
home: "ホーム" timeline: "タイムライン"
notifications: "通知" notifications: "通知"
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ" drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定" settings: "設定"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
all: "すべて" all: "すべて"
known: "知り合い" known: "知り合い"
load-more: "もっと" load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ" drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー" followers-of: "{}のフォロワー"
mobile/views/pages/following.vue: mobile/views/pages/following.vue:
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
messaging: "メッセージ" messaging: "メッセージ"
mobile/views/pages/messaging-room.vue: mobile/views/pages/messaging-room.vue:
messaging: "メッセージ" messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue: mobile/views/pages/note.vue:
title: "投稿" title: "投稿"
prev: "前の投稿" prev: "前の投稿"
+48 -14
View File
@@ -3,7 +3,9 @@ meta:
lang: "中文(简体)" lang: "中文(简体)"
divider: "" divider: ""
common: common:
misskey: "Misskeyで皆と共有しよう。" misskey: "A planet of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
time: time:
unknown: "なぞのじかん" unknown: "なぞのじかん"
future: "未来" future: "未来"
@@ -33,12 +35,20 @@ common:
angry: "おこ" angry: "おこ"
confused: "こまこまのこまり" confused: "こまこまのこまり"
pudding: "Pudding" pudding: "Pudding"
note-placeholders:
a: "今どうしてる?"
b: "何かありましたか?"
c: "何をお考えですか?"
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
delete: "削除" delete: "削除"
loading: "読み込み中" loading: "読み込み中"
ok: "わかった" ok: "わかった"
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。" update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
widgets: widgets:
analog-clock: "アナログ時計"
profile: "プロフィール" profile: "プロフィール"
calendar: "カレンダー" calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)" timemachine: "カレンダー(タイムマシン)"
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード" upload: "ファイルをアップロード"
url-upload: "URLからアップロード" url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue: desktop/views/components/follow-button.vue:
unfollow: "フォロー解除" unfollow: "フォロー"
follow: "フォローする" follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
location: "位置情報" location: "位置情報"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
detail: "詳細" detail: "詳細"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.vue: desktop/views/components/notes.vue:
error: "読み込みに失敗しました。" error: "読み込みに失敗しました。"
retry: "リトライ" retry: "リトライ"
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
more: "もっと見る" more: "もっと見る"
empty: "ありません!" empty: "ありません!"
desktop/views/components/post-form.vue: desktop/views/components/post-form.vue:
note-placeholder: "いまどうしてる?"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..." quote-placeholder: "この投稿を引用..."
note: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
posted: "投稿しました!" posted: "投稿しました!"
@@ -468,7 +478,7 @@ desktop/views/components/settings.api.vue:
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "Token:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
drive: "ドライブ" drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請"
customize: "カスタマイズ" customize: "カスタマイズ"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
post: "新規投稿" post: "新規投稿"
desktop/views/components/ui.header.search.vue: desktop/views/components/ui.header.search.vue:
placeholder: "検索" placeholder: "検索"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
signin: "ログイン" signin: "ログイン"
signup: "新規登録" signup: "新規登録"
signin-button: "やってる" signin-button: "やってる"
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
desktop/views/widgets/post-form.vue: desktop/views/widgets/post-form.vue:
title: "投稿" title: "投稿"
note: "投稿" note: "投稿"
placeholder: "いまどうしてる?"
desktop/views/widgets/profile.vue: desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集" update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集" update-avatar: "クリックでアバター編集"
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
mobile/views/components/follow-button.vue: mobile/views/components/follow-button.vue:
unfollow: "フォロー中"
follow: "フォロー" follow: "フォロー"
unfollow: "フォロー解除" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。" empty: "おすすめのユーザーは見つかりませんでした。"
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
submit: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)" quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
note-placeholder: "いまどうしてる?"
cw-placeholder: "内容への注釈 (オプション)" cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません" location-alert: "お使いの端末は位置情報に対応していません"
error: "エラー" error: "エラー"
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
empty: "投稿がありません" empty: "投稿がありません"
load-more: "もっと" load-more: "もっと"
mobile/views/components/ui.nav.vue: mobile/views/components/ui.nav.vue:
home: "ホーム" timeline: "タイムライン"
notifications: "通知" notifications: "通知"
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ" drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定" settings: "設定"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
all: "すべて" all: "すべて"
known: "知り合い" known: "知り合い"
load-more: "もっと" load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ" drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー" followers-of: "{}のフォロワー"
mobile/views/pages/following.vue: mobile/views/pages/following.vue:
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
messaging: "メッセージ" messaging: "メッセージ"
mobile/views/pages/messaging-room.vue: mobile/views/pages/messaging-room.vue:
messaging: "メッセージ" messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue: mobile/views/pages/note.vue:
title: "投稿" title: "投稿"
prev: "前の投稿" prev: "前の投稿"
+2 -2
View File
@@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "2.20.1", "version": "2.25.1",
"clientVersion": "1.0.5871", "clientVersion": "1.0.6112",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,
+1
View File
@@ -20,6 +20,7 @@ init(launch => {
// Init router // Init router
const router = new VueRouter({ const router = new VueRouter({
mode: 'history', mode: 'history',
base: '/auth/',
routes: [ routes: [
{ path: '/:token', component: Index }, { path: '/:token', component: Index },
] ]
+5 -3
View File
@@ -3,6 +3,7 @@
<main v-if="$store.getters.isSignedIn"> <main v-if="$store.getters.isSignedIn">
<p class="fetching" v-if="fetching">読み込み中<mk-ellipsis/></p> <p class="fetching" v-if="fetching">読み込み中<mk-ellipsis/></p>
<x-form <x-form
class="form"
ref="form" ref="form"
v-if="state == 'waiting'" v-if="state == 'waiting'"
:session="session" :session="session"
@@ -51,7 +52,7 @@ export default Vue.extend({
} }
}, },
mounted() { mounted() {
if (!this.$root.$data.$store.getters.isSignedIn) return; if (!this.$store.getters.isSignedIn) return;
// Fetch session // Fetch session
(this as any).api('auth/session/show', { (this as any).api('auth/session/show', {
@@ -62,7 +63,7 @@ export default Vue.extend({
// //
if (this.session.app.isAuthorized) { if (this.session.app.isAuthorized) {
this.$root.$data.os.api('auth/accept', { (this as any).api('auth/accept', {
token: this.session.token token: this.session.token
}).then(() => { }).then(() => {
this.accepted(); this.accepted();
@@ -72,6 +73,7 @@ export default Vue.extend({
} }
}).catch(error => { }).catch(error => {
this.state = 'fetch-session-error'; this.state = 'fetch-session-error';
this.fetching = false;
}); });
}, },
methods: { methods: {
@@ -101,7 +103,7 @@ export default Vue.extend({
padding 32px padding 32px
color #555 color #555
> div > div:not(.form)
padding 64px padding 64px
> h1 > h1
+1 -1
View File
@@ -19,7 +19,7 @@ html
| Misskey | Misskey
block desc block desc
meta(name='description' content='A SNS') meta(name='description' content='A planet of fediverse')
block meta block meta
+3 -3
View File
@@ -32,9 +32,9 @@
//#region Detect app name //#region Detect app name
let app = null; let app = null;
if (url.pathname == '/docs') app = 'docs'; if (url.pathname == '/docs' || url.pathname.startsWith('/docs/')) app = 'docs';
if (url.pathname == '/dev') app = 'dev'; if (url.pathname == '/dev' || url.pathname.startsWith('/dev/')) app = 'dev';
if (url.pathname == '/auth') app = 'auth'; if (url.pathname == '/auth' || url.pathname.startsWith('/auth/')) app = 'auth';
//#endregion //#endregion
//#region Detect the user language //#region Detect the user language
@@ -20,7 +20,7 @@ export class HomeStream extends Stream {
}, 1000 * 60); }, 1000 * 60);
// 自分の情報が更新されたとき // 自分の情報が更新されたとき
this.on('i_updated', i => { this.on('meUpdated', i => {
if (os.debug) { if (os.debug) {
console.log('I updated:', i); console.log('I updated:', i);
} }
@@ -28,6 +28,30 @@ export class HomeStream extends Stream {
os.store.dispatch('mergeMe', i); os.store.dispatch('mergeMe', i);
}); });
this.on('read_all_notifications', () => {
os.store.dispatch('mergeMe', {
hasUnreadNotification: false
});
});
this.on('unread_notification', () => {
os.store.dispatch('mergeMe', {
hasUnreadNotification: true
});
});
this.on('read_all_messaging_messages', () => {
os.store.dispatch('mergeMe', {
hasUnreadMessagingMessage: false
});
});
this.on('unread_messaging_message', () => {
os.store.dispatch('mergeMe', {
hasUnreadMessagingMessage: true
});
});
this.on('clientSettingUpdated', x => { this.on('clientSettingUpdated', x => {
os.store.commit('settings/set', { os.store.commit('settings/set', {
key: x.key, key: x.key,
@@ -0,0 +1,127 @@
<template>
<svg class="mk-analog-clock" viewBox="0 0 10 10" preserveAspectRatio="none">
<circle v-for="angle, i in graduations"
:cx="5 + (Math.sin(angle) * (5 - graduationsPadding))"
:cy="5 - (Math.cos(angle) * (5 - graduationsPadding))"
:r="i % 5 == 0 ? 0.125 : 0.05"
:fill="i % 5 == 0 ? majorGraduationColor : minorGraduationColor"/>
<line
:x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))"
:y1="5 + (Math.cos(sAngle) * (sHandLengthRatio * handsTailLength))"
:x2="5 + (Math.sin(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
:y2="5 - (Math.cos(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
:stroke="sHandColor"
stroke-width="0.05"/>
<line
:x1="5 - (Math.sin(mAngle) * (mHandLengthRatio * handsTailLength))"
:y1="5 + (Math.cos(mAngle) * (mHandLengthRatio * handsTailLength))"
:x2="5 + (Math.sin(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
:y2="5 - (Math.cos(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
:stroke="mHandColor"
stroke-width="0.1"/>
<line
:x1="5 - (Math.sin(hAngle) * (hHandLengthRatio * handsTailLength))"
:y1="5 + (Math.cos(hAngle) * (hHandLengthRatio * handsTailLength))"
:x2="5 + (Math.sin(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
:y2="5 - (Math.cos(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
:stroke="hHandColor"
stroke-width="0.1"/>
</svg>
</template>
<script lang="ts">
import Vue from 'vue';
import { themeColor } from '../../../config';
export default Vue.extend({
props: {
dark: {
type: Boolean,
default: false
}
},
data() {
return {
now: new Date(),
clock: null,
graduationsPadding: 0.5,
handsPadding: 1,
handsTailLength: 0.7,
hHandLengthRatio: 0.75,
mHandLengthRatio: 1,
sHandLengthRatio: 1
};
},
computed: {
majorGraduationColor(): string {
return this.dark ? 'rgba(255, 255, 255, 0.3)' : 'rgba(0, 0, 0, 0.3)';
},
minorGraduationColor(): string {
return this.dark ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.2)';
},
sHandColor(): string {
return this.dark ? 'rgba(255, 255, 255, 0.5)' : 'rgba(0, 0, 0, 0.3)';
},
mHandColor(): string {
return this.dark ? '#fff' : '#777';
},
hHandColor(): string {
return themeColor;
},
s(): number {
return this.now.getSeconds();
},
m(): number {
return this.now.getMinutes();
},
h(): number {
return this.now.getHours();
},
hAngle(): number {
return Math.PI * (this.h % 12 + this.m / 60) / 6;
},
mAngle(): number {
return Math.PI * (this.m + this.s / 60) / 30;
},
sAngle(): number {
return Math.PI * this.s / 30;
},
graduations(): any {
const angles = [];
for (let i = 0; i < 60; i++) {
const angle = Math.PI * i / 30;
angles.push(angle);
}
return angles;
}
},
mounted() {
this.clock = setInterval(this.tick, 1000);
},
beforeDestroy() {
clearInterval(this.clock);
},
methods: {
tick() {
this.now = new Date();
}
}
});
</script>
<style lang="stylus" scoped>
.mk-analog-clock
display block
</style>
@@ -13,7 +13,7 @@
.a .a
display block display block
position absolute position fixed
top 0 top 0
right 0 right 0
@@ -1,5 +1,6 @@
import Vue from 'vue'; import Vue from 'vue';
import analogClock from './analog-clock.vue';
import signin from './signin.vue'; import signin from './signin.vue';
import signup from './signup.vue'; import signup from './signup.vue';
import forkit from './forkit.vue'; import forkit from './forkit.vue';
@@ -27,6 +28,7 @@ import Switch from './switch.vue';
import Othello from './othello.vue'; import Othello from './othello.vue';
import welcomeTimeline from './welcome-timeline.vue'; import welcomeTimeline from './welcome-timeline.vue';
Vue.component('mk-analog-clock', analogClock);
Vue.component('mk-signin', signin); Vue.component('mk-signin', signin);
Vue.component('mk-signup', signup); Vue.component('mk-signup', signup);
Vue.component('mk-forkit', forkit); Vue.component('mk-forkit', forkit);
@@ -1,9 +1,11 @@
<template> <template>
<div class="mk-media-list" :data-count="mediaList.length"> <div class="mk-media-list">
<template v-for="media in mediaList"> <div :data-count="mediaList.length" ref="grid">
<mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/> <template v-for="media in mediaList">
<mk-media-image :image="media" :key="media.id" v-else :raw="raw"/> <mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/>
</template> <mk-media-image :image="media" :key="media.id" v-else :raw="raw"/>
</template>
</div>
</div> </div>
</template> </template>
@@ -18,47 +20,60 @@ export default Vue.extend({
raw: { raw: {
default: false default: false
} }
},
mounted() {
// for Safari bug
this.$refs.grid.style.height = this.$refs.grid.clientHeight ? `${this.$refs.grid.clientHeight}px` : '128px';
} }
}); });
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
.mk-media-list .mk-media-list
display grid width 100%
grid-gap 4px
height 256px
@media (max-width 500px) &:before
height 192px content ''
display block
padding-top 56.25% // 16:9
> div
position absolute
top 0
right 0
bottom 0
left 0
display grid
grid-gap 4px
&[data-count="1"]
grid-template-rows 1fr
&[data-count="2"]
grid-template-columns 1fr 1fr
grid-template-rows 1fr
&[data-count="3"]
grid-template-columns 1fr 0.5fr
grid-template-rows 1fr 1fr
:nth-child(1)
grid-row 1 / 3
:nth-child(3)
grid-column 2 / 3
grid-row 2 / 3
&[data-count="4"]
grid-template-columns 1fr 1fr
grid-template-rows 1fr 1fr
&[data-count="1"]
grid-template-rows 1fr
&[data-count="2"]
grid-template-columns 1fr 1fr
grid-template-rows 1fr
&[data-count="3"]
grid-template-columns 1fr 0.5fr
grid-template-rows 1fr 1fr
:nth-child(1) :nth-child(1)
grid-row 1 / 3 grid-column 1 / 2
:nth-child(3) grid-row 1 / 2
:nth-child(2)
grid-column 2 / 3 grid-column 2 / 3
grid-row 2/3 grid-row 1 / 2
&[data-count="4"] :nth-child(3)
grid-template-columns 1fr 1fr grid-column 1 / 2
grid-template-rows 1fr 1fr grid-row 2 / 3
:nth-child(4)
:nth-child(1) grid-column 2 / 3
grid-column 1 / 2 grid-row 2 / 3
grid-row 1 / 2
:nth-child(2)
grid-column 2 / 3
grid-row 1 / 2
:nth-child(3)
grid-column 1 / 2
grid-row 2 / 3
:nth-child(4)
grid-column 2 / 3
grid-row 2 / 3
</style> </style>
@@ -0,0 +1,41 @@
<template>
<div class="mkw-analog-clock">
<mk-widget-container :naked="props.naked" :show-header="false">
<div class="mkw-analog-clock--body">
<mk-analog-clock :dark="$store.state.device.darkmode"/>
</div>
</mk-widget-container>
</div>
</template>
<script lang="ts">
import define from '../../../common/define-widget';
export default define({
name: 'analog-clock',
props: () => ({
naked: false
})
}).extend({
methods: {
func() {
this.props.naked = !this.props.naked;
this.save();
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
root(isDark)
.mkw-analog-clock--body
padding 8px
.mkw-analog-clock[data-darkmode]
root(true)
.mkw-analog-clock:not([data-darkmode])
root(false)
</style>
@@ -1,5 +1,6 @@
import Vue from 'vue'; import Vue from 'vue';
import wAnalogClock from './analog-clock.vue';
import wVersion from './version.vue'; import wVersion from './version.vue';
import wRss from './rss.vue'; import wRss from './rss.vue';
import wServer from './server.vue'; import wServer from './server.vue';
@@ -12,6 +13,7 @@ import wTips from './tips.vue';
import wDonation from './donation.vue'; import wDonation from './donation.vue';
import wNav from './nav.vue'; import wNav from './nav.vue';
Vue.component('mkw-analog-clock', wAnalogClock);
Vue.component('mkw-nav', wNav); Vue.component('mkw-nav', wNav);
Vue.component('mkw-calendar', wCalendar); Vue.component('mkw-calendar', wCalendar);
Vue.component('mkw-photo-stream', wPhotoStream); Vue.component('mkw-photo-stream', wPhotoStream);
@@ -73,6 +73,7 @@ root(isDark)
background isDark ? #282c37 : #fff background isDark ? #282c37 : #fff
border none border none
border-bottom solid 1px isDark ? #1c2023 : #eee border-bottom solid 1px isDark ? #1c2023 : #eee
border-radius 0
> button > button
display block display block
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1021 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 946 B

+16 -37
View File
@@ -6,44 +6,27 @@
*::input-placeholder *::input-placeholder
color #D8CBC5 color #D8CBC5
* *:focus
&:focus outline none
outline none
&::scrollbar
width 5px
background transparent
&:horizontal
height 5px
&::scrollbar-button
width 0
height 0
background rgba(0, 0, 0, 0.2)
&::scrollbar-piece
background transparent
&:start
background transparent
&::scrollbar-thumb
background rgba(0, 0, 0, 0.2)
&:hover
background rgba(0, 0, 0, 0.4)
&:active
background $theme-color
&::scrollbar-corner
background rgba(0, 0, 0, 0.2)
html html
height 100% height 100%
background #f7f7f7 background #f7f7f7
&, *
&::-webkit-scrollbar
width 6px
height 6px
&::-webkit-scrollbar-thumb
background rgba(0, 0, 0, 0.2)
&:hover
background rgba(0, 0, 0, 0.4)
&:active
background $theme-color
&[data-darkmode] &[data-darkmode]
background #191B22 background #191B22
@@ -51,10 +34,6 @@ html
&::-webkit-scrollbar-track &::-webkit-scrollbar-track
background-color #282C37 background-color #282C37
&::-webkit-scrollbar
width 6px
height 6px
&::-webkit-scrollbar-thumb &::-webkit-scrollbar-thumb
background-color #454954 background-color #454954
@@ -1,108 +0,0 @@
<template>
<canvas class="mk-analog-clock" ref="canvas" width="256" height="256"></canvas>
</template>
<script lang="ts">
import Vue from 'vue';
import { themeColor } from '../../../config';
const Vec2 = function(this: any, x, y) {
this.x = x;
this.y = y;
};
export default Vue.extend({
data() {
return {
clock: null
};
},
mounted() {
this.tick();
this.clock = setInterval(this.tick, 1000);
},
beforeDestroy() {
clearInterval(this.clock);
},
methods: {
tick() {
const canv = this.$refs.canvas as any;
const now = new Date();
const s = now.getSeconds();
const m = now.getMinutes();
const h = now.getHours();
const ctx = canv.getContext('2d');
const canvW = canv.width;
const canvH = canv.height;
ctx.clearRect(0, 0, canvW, canvH);
{ //
const center = Math.min((canvW / 2), (canvH / 2));
const lineStart = center * 0.90;
const shortLineEnd = center * 0.87;
const longLineEnd = center * 0.84;
for (let i = 0; i < 60; i++) {
const angle = Math.PI * i / 30;
const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
ctx.beginPath();
ctx.lineWidth = 1;
ctx.moveTo((canvW / 2) + uv.x * lineStart, (canvH / 2) + uv.y * lineStart);
if (i % 5 == 0) {
ctx.strokeStyle = 'rgba(255, 255, 255, 0.2)';
ctx.lineTo((canvW / 2) + uv.x * longLineEnd, (canvH / 2) + uv.y * longLineEnd);
} else {
ctx.strokeStyle = 'rgba(255, 255, 255, 0.1)';
ctx.lineTo((canvW / 2) + uv.x * shortLineEnd, (canvH / 2) + uv.y * shortLineEnd);
}
ctx.stroke();
}
}
{ //
const angle = Math.PI * (m + s / 60) / 30;
const length = Math.min(canvW, canvH) / 2.6;
const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
ctx.beginPath();
ctx.strokeStyle = '#ffffff';
ctx.lineWidth = 2;
ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5);
ctx.lineTo(canvW / 2 + uv.x * length, canvH / 2 + uv.y * length);
ctx.stroke();
}
{ //
const angle = Math.PI * (h % 12 + m / 60) / 6;
const length = Math.min(canvW, canvH) / 4;
const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
ctx.beginPath();
ctx.strokeStyle = themeColor;
ctx.lineWidth = 2;
ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5);
ctx.lineTo(canvW / 2 + uv.x * length, canvH / 2 + uv.y * length);
ctx.stroke();
}
{ //
const angle = Math.PI * s / 30;
const length = Math.min(canvW, canvH) / 2.6;
const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
ctx.beginPath();
ctx.strokeStyle = 'rgba(255, 255, 255, 0.5)';
ctx.lineWidth = 1;
ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5);
ctx.lineTo(canvW / 2 + uv.x * length, canvH / 2 + uv.y * length);
ctx.stroke();
}
}
}
});
</script>
<style lang="stylus" scoped>
.mk-analog-clock
display block
width 256px
height 256px
</style>
@@ -62,7 +62,7 @@ export default Vue.extend({
onContextmenu(e) { onContextmenu(e) {
this.isContextmenuShowing = true; this.isContextmenuShowing = true;
contextmenu(e, [{ contextmenu((this as any).os)(e, [{
type: 'item', type: 'item',
text: '%i18n:@contextmenu.rename%', text: '%i18n:@contextmenu.rename%',
icon: '%fa:i-cursor%', icon: '%fa:i-cursor%',
@@ -52,7 +52,7 @@ export default Vue.extend({
onContextmenu(e) { onContextmenu(e) {
this.isContextmenuShowing = true; this.isContextmenuShowing = true;
contextmenu(e, [{ contextmenu((this as any).os)(e, [{
type: 'item', type: 'item',
text: '%i18n:@contextmenu.move-to-this-folder%', text: '%i18n:@contextmenu.move-to-this-folder%',
icon: '%fa:arrow-right%', icon: '%fa:arrow-right%',
@@ -136,7 +136,7 @@ export default Vue.extend({
}, },
methods: { methods: {
onContextmenu(e) { onContextmenu(e) {
contextmenu(e, [{ contextmenu((this as any).os)(e, [{
type: 'item', type: 'item',
text: '%i18n:@contextmenu.create-folder%', text: '%i18n:@contextmenu.create-folder%',
icon: '%fa:R folder%', icon: '%fa:R folder%',
@@ -1,19 +1,16 @@
<template> <template>
<button class="mk-follow-button" <button class="mk-follow-button"
:class="{ wait, follow: !user.isFollowing, unfollow: user.isFollowing, big: size == 'big' }" :class="{ wait, active: u.isFollowing || u.hasPendingFollowRequestFromYou, big: size == 'big' }"
@click="onClick" @click="onClick"
:disabled="wait" :disabled="wait"
:title="user.isFollowing ? '%i18n:@unfollow%' : '%i18n:@follow%'"
> >
<template v-if="!wait && user.isFollowing"> <template v-if="!wait">
<template v-if="size == 'compact'">%fa:minus%</template> <template v-if="u.hasPendingFollowRequestFromYou">%fa:hourglass-half%<template v-if="size == 'big'"> %i18n:@request-pending%</template></template>
<template v-if="size == 'big'">%fa:minus%%i18n:@unfollow%</template> <template v-else-if="u.isFollowing">%fa:minus%<template v-if="size == 'big'"> %i18n:@unfollow%</template></template>
<template v-else-if="!u.isFollowing && u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow-request%</template></template>
<template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow%</template></template>
</template> </template>
<template v-if="!wait && !user.isFollowing"> <template v-else>%fa:spinner .pulse .fw%</template>
<template v-if="size == 'compact'">%fa:plus%</template>
<template v-if="size == 'big'">%fa:plus%%i18n:@follow%</template>
</template>
<template v-if="wait">%fa:spinner .pulse .fw%</template>
</button> </button>
</template> </template>
@@ -34,6 +31,7 @@ export default Vue.extend({
data() { data() {
return { return {
u: this.user,
wait: false, wait: false,
connection: null, connection: null,
connectionId: null connectionId: null
@@ -56,39 +54,44 @@ export default Vue.extend({
methods: { methods: {
onFollow(user) { onFollow(user) {
if (user.id == this.user.id) { if (user.id == this.u.id) {
this.user.isFollowing = user.isFollowing; this.user.isFollowing = user.isFollowing;
} }
}, },
onUnfollow(user) { onUnfollow(user) {
if (user.id == this.user.id) { if (user.id == this.u.id) {
this.user.isFollowing = user.isFollowing; this.user.isFollowing = user.isFollowing;
} }
}, },
onClick() { async onClick() {
this.wait = true; this.wait = true;
if (this.user.isFollowing) {
(this as any).api('following/delete', { try {
userId: this.user.id if (this.u.isFollowing) {
}).then(() => { this.u = await (this as any).api('following/delete', {
this.user.isFollowing = false; userId: this.u.id
}).catch(err => { });
console.error(err); } else {
}).then(() => { if (this.u.isLocked && this.u.hasPendingFollowRequestFromYou) {
this.wait = false; this.u = await (this as any).api('following/requests/cancel', {
}); userId: this.u.id
} else { });
(this as any).api('following/create', { } else if (this.u.isLocked) {
userId: this.user.id this.u = await (this as any).api('following/create', {
}).then(() => { userId: this.u.id
this.user.isFollowing = true; });
}).catch(err => { } else {
console.error(err); this.u = await (this as any).api('following/create', {
}).then(() => { userId: this.user.id
this.wait = false; });
}); }
}
} catch (e) {
console.error(e);
} finally {
this.wait = false;
} }
} }
} }
@@ -124,7 +127,7 @@ root(isDark)
border 2px solid rgba($theme-color, 0.3) border 2px solid rgba($theme-color, 0.3)
border-radius 8px border-radius 8px
&.follow &:not(.active)
color isDark ? #fff : #888 color isDark ? #fff : #888
background isDark ? linear-gradient(to bottom, #313543 0%, #282c37 100%) : linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%) background isDark ? linear-gradient(to bottom, #313543 0%, #282c37 100%) : linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%)
border solid 1px isDark ? #1c2023 : #e2e2e2 border solid 1px isDark ? #1c2023 : #e2e2e2
@@ -137,7 +140,7 @@ root(isDark)
background isDark ? #22262f : #ececec background isDark ? #22262f : #ececec
border-color isDark ? #151a1d : #dcdcdc border-color isDark ? #151a1d : #dcdcdc
&.unfollow &.active
color $theme-color-foreground color $theme-color-foreground
background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%) background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%)
border solid 1px lighten($theme-color, 15%) border solid 1px lighten($theme-color, 15%)
@@ -162,9 +165,6 @@ root(isDark)
height 38px height 38px
line-height 38px line-height 38px
i
margin-right 8px
.mk-follow-button[data-darkmode] .mk-follow-button[data-darkmode]
root(true) root(true)
@@ -7,6 +7,7 @@
<p>%i18n:@add-widget%</p> <p>%i18n:@add-widget%</p>
<select v-model="widgetAdderSelected"> <select v-model="widgetAdderSelected">
<option value="profile">%i18n:common.widgets.profile%</option> <option value="profile">%i18n:common.widgets.profile%</option>
<option value="analog-clock">%i18n:common.widgets.analog-clock%</option>
<option value="calendar">%i18n:common.widgets.calendar%</option> <option value="calendar">%i18n:common.widgets.calendar%</option>
<option value="timemachine">%i18n:common.widgets.timemachine%</option> <option value="timemachine">%i18n:common.widgets.timemachine%</option>
<option value="activity">%i18n:common.widgets.activity%</option> <option value="activity">%i18n:common.widgets.activity%</option>
@@ -62,9 +63,8 @@
<component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp"/> <component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp"/>
</div> </div>
<div class="main"> <div class="main">
<mk-post-form v-if="$store.state.settings.showPostFormOnTopOfTl"/> <mk-post-form class="form" v-if="$store.state.settings.showPostFormOnTopOfTl"/>
<mk-timeline ref="tl" @loaded="onTlLoaded" v-if="mode == 'timeline'"/> <mk-timeline class="tl" cref="tl" @loaded="onTlLoaded" v-if="mode == 'timeline'"/>
<mk-mentions @loaded="onTlLoaded" v-if="mode == 'mentions'"/>
</div> </div>
</template> </template>
</div> </div>
@@ -298,11 +298,18 @@ root(isDark)
width calc(100% - 275px * 2) width calc(100% - 275px * 2)
order 2 order 2
.mk-post-form > .form
margin-bottom 16px margin-bottom 16px
border solid 1px rgba(#000, 0.075) border solid 1px rgba(#000, 0.075)
border-radius 4px border-radius 4px
@media (max-width 700px)
padding 0
> .tl
border none
border-radius 0
> *:not(.main) > *:not(.main)
width 275px width 275px
padding 16px 0 16px 0 padding 16px 0 16px 0
@@ -9,7 +9,6 @@ import subNoteContent from './sub-note-content.vue';
import window from './window.vue'; import window from './window.vue';
import noteFormWindow from './post-form-window.vue'; import noteFormWindow from './post-form-window.vue';
import renoteFormWindow from './renote-form-window.vue'; import renoteFormWindow from './renote-form-window.vue';
import analogClock from './analog-clock.vue';
import ellipsisIcon from './ellipsis-icon.vue'; import ellipsisIcon from './ellipsis-icon.vue';
import mediaImage from './media-image.vue'; import mediaImage from './media-image.vue';
import mediaImageDialog from './media-image-dialog.vue'; import mediaImageDialog from './media-image-dialog.vue';
@@ -40,7 +39,6 @@ Vue.component('mk-sub-note-content', subNoteContent);
Vue.component('mk-window', window); Vue.component('mk-window', window);
Vue.component('mk-post-form-window', noteFormWindow); Vue.component('mk-post-form-window', noteFormWindow);
Vue.component('mk-renote-form-window', renoteFormWindow); Vue.component('mk-renote-form-window', renoteFormWindow);
Vue.component('mk-analog-clock', analogClock);
Vue.component('mk-ellipsis-icon', ellipsisIcon); Vue.component('mk-ellipsis-icon', ellipsisIcon);
Vue.component('mk-media-image', mediaImage); Vue.component('mk-media-image', mediaImage);
Vue.component('mk-media-image-dialog', mediaImageDialog); Vue.component('mk-media-image-dialog', mediaImageDialog);
@@ -1,124 +0,0 @@
<template>
<div class="sub" :title="title">
<mk-avatar class="avatar" :user="note.user"/>
<div class="main">
<header>
<div class="left">
<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
<span class="username"><mk-acct :user="note.user"/></span>
</div>
<div class="right">
<router-link class="time" :to="note | notePage">
<mk-time :time="note.createdAt"/>
</router-link>
</div>
</header>
<div class="body">
<div class="text">
<span v-if="note.isHidden" style="opacity: 0.5">%i18n:@private%</span>
<span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
<mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/>
</div>
<div class="media" v-if="note.mediaIds.length > 0">
<mk-media-list :media-list="note.media"/>
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import dateStringify from '../../../common/scripts/date-stringify';
export default Vue.extend({
props: ['note'],
computed: {
title(): string {
return dateStringify(this.note.createdAt);
}
}
});
</script>
<style lang="stylus" scoped>
root(isDark)
margin 0
padding 20px 32px
background isDark ? #21242d : #fdfdfd
&:after
content ""
display block
clear both
&:hover
> .main > footer > button
color #888
> .avatar
display block
float left
margin 0 16px 0 0
width 44px
height 44px
border-radius 4px
> .main
float left
width calc(100% - 60px)
> header
margin-bottom 4px
white-space nowrap
&:after
content ""
display block
clear both
> .left
float left
> .name
display inline
margin 0
padding 0
color isDark ? #fff : #777
font-size 1em
font-weight 700
text-align left
text-decoration none
&:hover
text-decoration underline
> .username
text-align left
margin 0 0 0 8px
color isDark ? #606984 : #ccc
> .right
float right
> .time
font-size 0.9em
color isDark ? #606984 : #c0c0c0
> .body
> .text
cursor default
display block
margin 0
padding 0
overflow-wrap break-word
font-size 1em
color isDark ? #959ba7 : #717171
.sub[data-darkmode]
root(true)
.sub:not([data-darkmode])
root(false)
</style>
@@ -89,7 +89,7 @@ import MkPostFormWindow from './post-form-window.vue';
import MkRenoteFormWindow from './renote-form-window.vue'; import MkRenoteFormWindow from './renote-form-window.vue';
import MkNoteMenu from '../../../common/views/components/note-menu.vue'; import MkNoteMenu from '../../../common/views/components/note-menu.vue';
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
import XSub from './note-detail.sub.vue'; import XSub from './notes.note.sub.vue';
export default Vue.extend({ export default Vue.extend({
components: { components: {
@@ -218,8 +218,6 @@ export default Vue.extend({
@import '~const.styl' @import '~const.styl'
root(isDark) root(isDark)
margin 0 auto
padding 0
overflow hidden overflow hidden
text-align left text-align left
background isDark ? #282C37 : #fff background isDark ? #282C37 : #fff
@@ -5,9 +5,18 @@
<header> <header>
<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link> <router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
<span class="username"><mk-acct :user="note.user"/></span> <span class="username"><mk-acct :user="note.user"/></span>
<router-link class="time" :to="note | notePage"> <div class="info">
<mk-time :time="note.createdAt"/> <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
</router-link> <router-link class="created-at" :to="note | notePage">
<mk-time :time="note.createdAt"/>
</router-link>
<span class="visibility" v-if="note.visibility != 'public'">
<template v-if="note.visibility == 'home'">%fa:home%</template>
<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
<template v-if="note.visibility == 'private'">%fa:lock%</template>
</span>
</div>
</header> </header>
<div class="body"> <div class="body">
<mk-sub-note-content class="text" :note="note"/> <mk-sub-note-content class="text" :note="note"/>
@@ -32,24 +41,20 @@ export default Vue.extend({
<style lang="stylus" scoped> <style lang="stylus" scoped>
root(isDark) root(isDark)
display flex
font-size 0.9em font-size 0.9em
&:after
content ""
display block
clear both
> .avatar > .avatar
flex-shrink 0
display block display block
float left
margin 0 12px 0 0 margin 0 12px 0 0
width 48px width 48px
height 48px height 48px
border-radius 8px border-radius 8px
> .main > .main
float left flex 1
width calc(100% - 60px) min-width 0
> header > header
display flex display flex
@@ -75,9 +80,18 @@ root(isDark)
text-overflow ellipsis text-overflow ellipsis
color isDark ? #606984 : #d1d8da color isDark ? #606984 : #d1d8da
> .time > .info
margin-left auto margin-left auto
color isDark ? #606984 : #b2b8bb font-size 0.9em
> *
color isDark ? #606984 : #b2b8bb
> .mobile
margin-right 6px
> .visibility
margin-left 6px
> .body > .body
@@ -44,27 +44,23 @@ export default Vue.extend({
<style lang="stylus" scoped> <style lang="stylus" scoped>
root(isDark) root(isDark)
display flex
margin 0 margin 0
padding 16px 32px padding 16px 32px
font-size 0.9em font-size 0.9em
background isDark ? #21242d : #fcfcfc background isDark ? #21242d : #fcfcfc
&:after
content ""
display block
clear both
> .avatar > .avatar
flex-shrink 0
display block display block
float left
margin 0 12px 0 0 margin 0 12px 0 0
width 48px width 48px
height 48px height 48px
border-radius 8px border-radius 8px
> .main > .main
float left flex 1
width calc(100% - 60px) min-width 0
> header > header
display flex display flex
@@ -119,8 +115,6 @@ root(isDark)
margin-left 6px margin-left 6px
> .body > .body
max-height 128px
overflow hidden
> .text > .text
cursor default cursor default
@@ -387,20 +387,16 @@ root(isDark)
padding-top 8px padding-top 8px
> article > article
display flex
padding 28px 32px 18px 32px padding 28px 32px 18px 32px
&:after
content ""
display block
clear both
&:hover &:hover
> .main > footer > button > .main > footer > button
color isDark ? #707b97 : #888 color isDark ? #707b97 : #888
> .avatar > .avatar
flex-shrink 0
display block display block
float left
margin 0 16px 10px 0 margin 0 16px 10px 0
width 58px width 58px
height 58px height 58px
@@ -410,8 +406,8 @@ root(isDark)
//top 74px //top 74px
> .main > .main
float left flex 1
width calc(100% - 74px) min-width 0
> header > header
display flex display flex
@@ -467,7 +463,7 @@ root(isDark)
> .app > .app
margin-right 8px margin-right 8px
padding-right 8px padding-right 8px
border-right solid 1px #eaeaea border-right solid 1px isDark ? #1c2023 : #eaeaea
> .visibility > .visibility
margin-left 8px margin-left 8px
@@ -556,7 +552,7 @@ root(isDark)
padding 2px 8px 2px 16px padding 2px 8px 2px 16px
font-size 90% font-size 90%
color #8d969e color #8d969e
background #edf0f3 background isDark ? #313543 : #edf0f3
border-radius 4px border-radius 4px
&:before &:before
@@ -569,7 +565,7 @@ root(isDark)
width 8px width 8px
height 8px height 8px
margin auto 0 margin auto 0
background #fff background isDark ? #282c37 : #fff
border-radius 100% border-radius 100%
&:hover &:hover
@@ -5,6 +5,7 @@
<template v-for="(notification, i) in _notifications"> <template v-for="(notification, i) in _notifications">
<div class="notification" :class="notification.type" :key="notification.id"> <div class="notification" :class="notification.type" :key="notification.id">
<mk-time :time="notification.createdAt"/> <mk-time :time="notification.createdAt"/>
<template v-if="notification.type == 'reaction'"> <template v-if="notification.type == 'reaction'">
<mk-avatar class="avatar" :user="notification.user"/> <mk-avatar class="avatar" :user="notification.user"/>
<div class="text"> <div class="text">
@@ -17,6 +18,7 @@
</router-link> </router-link>
</div> </div>
</template> </template>
<template v-if="notification.type == 'renote'"> <template v-if="notification.type == 'renote'">
<mk-avatar class="avatar" :user="notification.note.user"/> <mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text"> <div class="text">
@@ -28,6 +30,7 @@
</router-link> </router-link>
</div> </div>
</template> </template>
<template v-if="notification.type == 'quote'"> <template v-if="notification.type == 'quote'">
<mk-avatar class="avatar" :user="notification.note.user"/> <mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text"> <div class="text">
@@ -37,6 +40,7 @@
<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link> <router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
</div> </div>
</template> </template>
<template v-if="notification.type == 'follow'"> <template v-if="notification.type == 'follow'">
<mk-avatar class="avatar" :user="notification.user"/> <mk-avatar class="avatar" :user="notification.user"/>
<div class="text"> <div class="text">
@@ -45,6 +49,16 @@
</p> </p>
</div> </div>
</template> </template>
<template v-if="notification.type == 'receiveFollowRequest'">
<mk-avatar class="avatar" :user="notification.user"/>
<div class="text">
<p>%fa:user-clock%
<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
</p>
</div>
</template>
<template v-if="notification.type == 'reply'"> <template v-if="notification.type == 'reply'">
<mk-avatar class="avatar" :user="notification.note.user"/> <mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text"> <div class="text">
@@ -54,6 +68,7 @@
<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link> <router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
</div> </div>
</template> </template>
<template v-if="notification.type == 'mention'"> <template v-if="notification.type == 'mention'">
<mk-avatar class="avatar" :user="notification.note.user"/> <mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text"> <div class="text">
@@ -63,6 +78,7 @@
<a class="note-preview" :href="notification.note | notePage">{{ getNoteSummary(notification.note) }}</a> <a class="note-preview" :href="notification.note | notePage">{{ getNoteSummary(notification.note) }}</a>
</div> </div>
</template> </template>
<template v-if="notification.type == 'poll_vote'"> <template v-if="notification.type == 'poll_vote'">
<mk-avatar class="avatar" :user="notification.user"/> <mk-avatar class="avatar" :user="notification.user"/>
<div class="text"> <div class="text">
@@ -73,6 +89,7 @@
</div> </div>
</template> </template>
</div> </div>
<p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'"> <p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'">
<span>%fa:angle-up%{{ notification._datetext }}</span> <span>%fa:angle-up%{{ notification._datetext }}</span>
<span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span> <span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span>
@@ -251,6 +268,10 @@ root(isDark)
.text p i .text p i
color #53c7ce color #53c7ce
&.receiveFollowRequest
.text p i
color #888
&.reply, &.mention &.reply, &.mention
.text p i .text p i
color #555 color #555
@@ -1,21 +1,23 @@
<template> <template>
<mk-window ref="window" is-modal @closed="$destroy"> <mk-window class="mk-post-form-window" ref="window" is-modal @closed="$destroy">
<span slot="header"> <span slot="header" class="mk-post-form-window--header">
<span :class="$style.icon" v-if="geo">%fa:map-marker-alt%</span> <span class="icon" v-if="geo">%fa:map-marker-alt%</span>
<span v-if="!reply">%i18n:@note%</span> <span v-if="!reply">%i18n:@note%</span>
<span v-if="reply">%i18n:@reply%</span> <span v-if="reply">%i18n:@reply%</span>
<span :class="$style.count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span> <span class="count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span>
<span :class="$style.count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span> <span class="count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span>
</span> </span>
<mk-note-preview v-if="reply" :class="$style.notePreview" :note="reply"/> <div class="mk-post-form-window--body">
<mk-post-form ref="form" <mk-note-preview v-if="reply" class="notePreview" :note="reply"/>
:reply="reply" <mk-post-form ref="form"
@posted="onPosted" :reply="reply"
@change-uploadings="onChangeUploadings" @posted="onPosted"
@change-attached-media="onChangeMedia" @change-uploadings="onChangeUploadings"
@geo-attached="onGeoAttached" @change-attached-media="onChangeMedia"
@geo-dettached="onGeoDettached"/> @geo-attached="onGeoAttached"
@geo-dettached="onGeoDettached"/>
</div>
</mk-window> </mk-window>
</template> </template>
@@ -56,21 +58,33 @@ export default Vue.extend({
}); });
</script> </script>
<style lang="stylus" module> <style lang="stylus" scoped>
.icon root(isDark)
margin-right 8px .mk-post-form-window--header
.icon
margin-right 8px
.count .count
margin-left 8px margin-left 8px
opacity 0.8 opacity 0.8
&:before &:before
content '(' content '('
&:after &:after
content ')' content ')'
.notePreview .mk-post-form-window--body
margin 16px 22px 0 22px .notePreview
if isDark
margin 16px 22px 0 22px
else
margin 16px 22px
.mk-post-form-window[data-darkmode]
root(true)
.mk-post-form-window:not([data-darkmode])
root(false)
</style> </style>
@@ -86,11 +86,21 @@ export default Vue.extend({
}, },
placeholder(): string { placeholder(): string {
const xs = [
'%i18n:common.note-placeholders.a%',
'%i18n:common.note-placeholders.b%',
'%i18n:common.note-placeholders.c%',
'%i18n:common.note-placeholders.d%',
'%i18n:common.note-placeholders.e%',
'%i18n:common.note-placeholders.f%'
];
const x = xs[Math.floor(Math.random() * xs.length)];
return this.renote return this.renote
? '%i18n:@quote-placeholder%' ? '%i18n:@quote-placeholder%'
: this.reply : this.reply
? '%i18n:@reply-placeholder%' ? '%i18n:@reply-placeholder%'
: '%i18n:@note-placeholder%'; : x;
}, },
submitText(): string { submitText(): string {
@@ -98,7 +108,7 @@ export default Vue.extend({
? '%i18n:@renote%' ? '%i18n:@renote%'
: this.reply : this.reply
? '%i18n:@reply%' ? '%i18n:@reply%'
: '%i18n:@note%'; : '%i18n:@submit%';
}, },
canPost(): boolean { canPost(): boolean {
@@ -0,0 +1,72 @@
<template>
<mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy">
<span slot="header">%fa:envelope R% %i18n:@title%</span>
<div data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4" :data-darkmode="$store.state.device.darkmode">
<div v-for="req in requests">
<router-link :key="req.id" :to="req.follower | userPage">{{ req.follower | userName }}</router-link>
<span>
<a @click="accept(req.follower)">%i18n:@accept%</a>|<a @click="reject(req.follower)">%i18n:@reject%</a>
</span>
</div>
</div>
</mk-window>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
data() {
return {
fetching: true,
requests: []
};
},
mounted() {
(this as any).api('following/requests/list').then(requests => {
this.fetching = false;
this.requests = requests;
});
},
methods: {
accept(user) {
(this as any).api('following/requests/accept', { userId: user.id }).then(() => {
this.requests = this.requests.filter(r => r.follower.id != user.id);
});
},
reject(user) {
(this as any).api('following/requests/reject', { userId: user.id }).then(() => {
this.requests = this.requests.filter(r => r.follower.id != user.id);
});
},
close() {
(this as any).$refs.window.close();
}
}
});
</script>
<style lang="stylus" scoped>
root(isDark)
padding 16px
> button
margin-bottom 16px
> div
display flex
padding 16px
border solid 1px isDark ? #1c2023 : #eee
border-radius 4px
> span
margin 0 0 0 auto
[data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4"][data-darkmode]
root(true)
[data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4"]:not([data-darkmode])
root(false)
</style>
@@ -23,7 +23,11 @@
</label> </label>
<button class="ui primary" @click="save">%i18n:@save%</button> <button class="ui primary" @click="save">%i18n:@save%</button>
<section> <section>
<h2>その他</h2> <h2>%i18n:@locked-account%</h2>
<mk-switch v-model="$store.state.i.isLocked" @change="onChangeIsLocked" text="%i18n:@is-locked%"/>
</section>
<section>
<h2>%i18n:@other%</h2>
<mk-switch v-model="$store.state.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/> <mk-switch v-model="$store.state.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/>
<mk-switch v-model="$store.state.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/> <mk-switch v-model="$store.state.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/>
</section> </section>
@@ -62,6 +66,11 @@ export default Vue.extend({
(this as any).apis.notify('プロフィールを更新しました'); (this as any).apis.notify('プロフィールを更新しました');
}); });
}, },
onChangeIsLocked() {
(this as any).api('i/update', {
isLocked: this.$store.state.i.isLocked
});
},
onChangeIsBot() { onChangeIsBot() {
(this as any).api('i/update', { (this as any).api('i/update', {
isBot: this.$store.state.i.isBot isBot: this.$store.state.i.isBot
@@ -5,7 +5,7 @@
<span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span> <span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
<a class="reply" v-if="note.replyId">%fa:reply%</a> <a class="reply" v-if="note.replyId">%fa:reply%</a>
<mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/> <mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/>
<a class="rp" v-if="note.renoteId" :href="`/note:${note.renoteId}`">RP: ...</a> <a class="rp" v-if="note.renoteId" :href="`/notes/${note.renoteId}`">RP: ...</a>
</div> </div>
<details v-if="note.media.length > 0"> <details v-if="note.media.length > 0">
<summary>({{ '%i18n:@media-count%'.replace('{}', note.media.length) }})</summary> <summary>({{ '%i18n:@media-count%'.replace('{}', note.media.length) }})</summary>
@@ -36,7 +36,7 @@ export default Vue.extend({
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
.mk-ui-notification root(isDark)
display block display block
position fixed position fixed
z-index 10000 z-index 10000
@@ -46,10 +46,10 @@ export default Vue.extend({
margin 0 auto margin 0 auto
padding 128px 0 0 0 padding 128px 0 0 0
width 500px width 500px
color rgba(#000, 0.6) color rgba(isDark ? #fff : #000, 0.6)
background rgba(#fff, 0.9) background rgba(isDark ? #282C37 : #fff, 0.9)
border-radius 0 0 8px 8px border-radius 0 0 8px 8px
box-shadow 0 2px 4px rgba(#000, 0.2) box-shadow 0 2px 4px rgba(#000, isDark ? 0.4 : 0.2)
transform translateY(-64px) transform translateY(-64px)
opacity 0 opacity 0
@@ -58,4 +58,10 @@ export default Vue.extend({
line-height 64px line-height 64px
text-align center text-align center
.mk-ui-notification[data-darkmode]
root(true)
.mk-ui-notification:not([data-darkmode])
root(false)
</style> </style>
@@ -19,6 +19,9 @@
<li @click="list"> <li @click="list">
<p>%fa:list%<span>%i18n:@lists%</span>%fa:angle-right%</p> <p>%fa:list%<span>%i18n:@lists%</span>%fa:angle-right%</p>
</li> </li>
<li @click="followRequests" v-if="$store.state.i.isLocked">
<p>%fa:envelope R%<span>%i18n:@follow-requests%<i v-if="$store.state.i.pendingReceivedFollowRequestsCount">{{ $store.state.i.pendingReceivedFollowRequestsCount }}</i></span>%fa:angle-right%</p>
</li>
</ul> </ul>
<ul> <ul>
<li> <li>
@@ -46,6 +49,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import MkUserListsWindow from './user-lists-window.vue'; import MkUserListsWindow from './user-lists-window.vue';
import MkFollowRequestsWindow from './received-follow-requests-window.vue';
import MkSettingsWindow from './settings-window.vue'; import MkSettingsWindow from './settings-window.vue';
import MkDriveWindow from './drive-window.vue'; import MkDriveWindow from './drive-window.vue';
import contains from '../../../common/scripts/contains'; import contains from '../../../common/scripts/contains';
@@ -91,6 +95,10 @@ export default Vue.extend({
this.$router.push(`i/lists/${ list.id }`); this.$router.push(`i/lists/${ list.id }`);
}); });
}, },
followRequests() {
this.close();
(this as any).os.new(MkFollowRequestsWindow);
},
settings() { settings() {
this.close(); this.close();
(this as any).os.new(MkSettingsWindow); (this as any).os.new(MkSettingsWindow);
@@ -225,6 +233,16 @@ root(isDark)
> span:first-child > span:first-child
padding-left 22px padding-left 22px
> span:nth-child(2)
> i
margin-left 4px
padding 2px 8px
font-size 90%
font-style normal
background $theme-color
color $theme-color-foreground
border-radius 8px
> [data-fa]:first-child > [data-fa]:first-child
margin-right 6px margin-right 6px
width 16px width 16px
@@ -8,7 +8,7 @@
</time> </time>
</div> </div>
<div class="content"> <div class="content">
<mk-analog-clock/> <mk-analog-clock :dark="true"/>
</div> </div>
</div> </div>
</template> </template>
@@ -12,7 +12,7 @@
<a @click="messaging"> <a @click="messaging">
%fa:comments% %fa:comments%
<p>%i18n:@messaging%</p> <p>%i18n:@messaging%</p>
<template v-if="hasUnreadMessagingMessages">%fa:circle%</template> <template v-if="hasUnreadMessagingMessage">%fa:circle%</template>
</a> </a>
</li> </li>
<li class="game"> <li class="game">
@@ -35,48 +35,33 @@ import MkGameWindow from './game-window.vue';
export default Vue.extend({ export default Vue.extend({
data() { data() {
return { return {
hasUnreadMessagingMessages: false,
hasGameInvitations: false, hasGameInvitations: false,
connection: null, connection: null,
connectionId: null connectionId: null
}; };
}, },
computed: {
hasUnreadMessagingMessage(): boolean {
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage;
}
},
mounted() { mounted() {
if (this.$store.getters.isSignedIn) { if (this.$store.getters.isSignedIn) {
this.connection = (this as any).os.stream.getConnection(); this.connection = (this as any).os.stream.getConnection();
this.connectionId = (this as any).os.stream.use(); this.connectionId = (this as any).os.stream.use();
this.connection.on('read_all_messaging_messages', this.onReadAllMessagingMessages);
this.connection.on('unread_messaging_message', this.onUnreadMessagingMessage);
this.connection.on('othello_invited', this.onOthelloInvited); this.connection.on('othello_invited', this.onOthelloInvited);
this.connection.on('othello_no_invites', this.onOthelloNoInvites); this.connection.on('othello_no_invites', this.onOthelloNoInvites);
// Fetch count of unread messaging messages
(this as any).api('messaging/unread').then(res => {
if (res.count > 0) {
this.hasUnreadMessagingMessages = true;
}
});
} }
}, },
beforeDestroy() { beforeDestroy() {
if (this.$store.getters.isSignedIn) { if (this.$store.getters.isSignedIn) {
this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages);
this.connection.off('unread_messaging_message', this.onUnreadMessagingMessage);
this.connection.off('othello_invited', this.onOthelloInvited); this.connection.off('othello_invited', this.onOthelloInvited);
this.connection.off('othello_no_invites', this.onOthelloNoInvites); this.connection.off('othello_no_invites', this.onOthelloNoInvites);
(this as any).os.stream.dispose(this.connectionId); (this as any).os.stream.dispose(this.connectionId);
} }
}, },
methods: { methods: {
onUnreadMessagingMessage() {
this.hasUnreadMessagingMessages = true;
},
onReadAllMessagingMessages() {
this.hasUnreadMessagingMessages = false;
},
onOthelloInvited() { onOthelloInvited() {
this.hasGameInvitations = true; this.hasGameInvitations = true;
}, },
@@ -1,7 +1,7 @@
<template> <template>
<div class="notifications"> <div class="notifications">
<button :data-active="isOpen" @click="toggle" title="%i18n:@title%"> <button :data-active="isOpen" @click="toggle" title="%i18n:@title%">
%fa:R bell%<template v-if="hasUnreadNotifications">%fa:circle%</template> %fa:R bell%<template v-if="hasUnreadNotification">%fa:circle%</template>
</button> </button>
<div class="pop" v-if="isOpen"> <div class="pop" v-if="isOpen">
<mk-notifications/> <mk-notifications/>
@@ -16,44 +16,15 @@ import contains from '../../../common/scripts/contains';
export default Vue.extend({ export default Vue.extend({
data() { data() {
return { return {
isOpen: false, isOpen: false
hasUnreadNotifications: false,
connection: null,
connectionId: null
}; };
}, },
mounted() { computed: {
if (this.$store.getters.isSignedIn) { hasUnreadNotification(): boolean {
this.connection = (this as any).os.stream.getConnection(); return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification;
this.connectionId = (this as any).os.stream.use();
this.connection.on('read_all_notifications', this.onReadAllNotifications);
this.connection.on('unread_notification', this.onUnreadNotification);
// Fetch count of unread notifications
(this as any).api('notifications/get_unread_count').then(res => {
if (res.count > 0) {
this.hasUnreadNotifications = true;
}
});
}
},
beforeDestroy() {
if (this.$store.getters.isSignedIn) {
this.connection.off('read_all_notifications', this.onReadAllNotifications);
this.connection.off('unread_notification', this.onUnreadNotification);
(this as any).os.stream.dispose(this.connectionId);
} }
}, },
methods: { methods: {
onReadAllNotifications() {
this.hasUnreadNotifications = false;
},
onUnreadNotification() {
this.hasUnreadNotifications = true;
},
toggle() { toggle() {
this.isOpen ? this.close() : this.open(); this.isOpen ? this.close() : this.open();
}, },
@@ -150,8 +150,8 @@ root(isDark)
display block display block
width 100% width 100%
height 48px height 48px
background-image url(/assets/desktop/header-logo.svg) background-image isDark ? url('/assets/desktop/header-icon.dark.svg') : url('/assets/desktop/header-icon.light.svg')
background-size 46px background-size 24px
background-position center background-position center
background-repeat no-repeat background-repeat no-repeat
opacity 0.3 opacity 0.3
@@ -1,6 +1,6 @@
<template> <template>
<div> <div class="mk-ui">
<x-header/> <x-header class="header"/>
<div class="content"> <div class="content">
<slot></slot> <slot></slot>
</div> </div>
@@ -35,3 +35,9 @@ export default Vue.extend({
}); });
</script> </script>
<style lang="stylus" scoped>
.mk-ui
> .header
@media (max-width 1000px)
display none
</style>
@@ -1,6 +1,6 @@
<template> <template>
<mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy"> <mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy">
<span slot="header">%fa:list% リスト</span> <span slot="header">%fa:list% %i18n:@title%</span>
<div data-id="6e4caea3-d8f9-4ab7-96de-ab67fe8d5c82" :data-darkmode="$store.state.device.darkmode"> <div data-id="6e4caea3-d8f9-4ab7-96de-ab67fe8d5c82" :data-darkmode="$store.state.device.darkmode">
<button class="ui" @click="add">%i18n:@create-list%</button> <button class="ui" @click="add">%i18n:@create-list%</button>
@@ -2,7 +2,7 @@
<mk-ui> <mk-ui>
<main v-if="!fetching"> <main v-if="!fetching">
<template v-for="favorite in favorites"> <template v-for="favorite in favorites">
<mk-note-detail :note="favorite.note" :key="favorite.note.id"/> <mk-note-detail class="post" :note="favorite.note" :key="favorite.note.id"/>
</template> </template>
<a v-if="existMore" @click="more">%i18n:@more%</a> <a v-if="existMore" @click="more">%i18n:@more%</a>
</main> </main>
@@ -70,4 +70,7 @@ main
margin 0 auto margin 0 auto
padding 16px padding 16px
max-width 700px max-width 700px
> .post
margin-bottom 16px
</style> </style>
+120 -65
View File
@@ -4,9 +4,20 @@
<template v-if="$store.state.device.darkmode">%fa:moon%</template> <template v-if="$store.state.device.darkmode">%fa:moon%</template>
<template v-else>%fa:R moon%</template> <template v-else>%fa:R moon%</template>
</button> </button>
<main> <main v-if="about" class="about">
<img :src="$store.state.device.darkmode ? 'assets/title-dark.svg' : 'assets/title.svg'" alt="Misskey"> <article>
<p><button class="signup" @click="signup">%i18n:@signup-button%</button><button class="signin" @click="signin">%i18n:@signin-button%</button></p> <h1>%i18n:common.about-title%</h1>
<p v-html="'%i18n:common.about%'"></p>
<span class="gotit" @click="about = false">%i18n:@gotit%</span>
</article>
</main>
<main v-else class="index">
<img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="Misskey">
<p class="desc"><b>%i18n:common.misskey%</b> - <span @click="about = true">%i18n:@about%</span></p>
<p class="account">
<button class="signup" @click="signup">%i18n:@signup-button%</button>
<button class="signin" @click="signin">%i18n:@signin-button%</button>
</p>
<div class="tl"> <div class="tl">
<header>%fa:comments R% %i18n:@timeline%<div><span></span><span></span><span></span></div></header> <header>%fa:comments R% %i18n:@timeline%<div><span></span><span></span><span></span></div></header>
@@ -33,12 +44,12 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { docsUrl, copyright, lang } from '../../../config'; import { copyright } from '../../../config';
export default Vue.extend({ export default Vue.extend({
data() { data() {
return { return {
aboutUrl: `${docsUrl}/${lang}/about`, about: false,
copyright copyright
}; };
}, },
@@ -69,13 +80,18 @@ export default Vue.extend({
<style lang="stylus" scoped> <style lang="stylus" scoped>
@import '~const.styl' @import '~const.styl'
@import url(https://fonts.googleapis.com/earlyaccess/notosansjp.css);
root(isDark) root(isDark)
display flex display flex
flex-direction column flex-direction column
flex 1 flex 1
background-image isDark ? url('/assets/welcome-bg.dark.svg') : url('/assets/welcome-bg.light.svg')
background-size cover
background-position center
> button > button
position absolute position fixed
z-index 1 z-index 1
top 0 top 0
left 0 left 0
@@ -87,81 +103,120 @@ root(isDark)
flex 1 flex 1
padding 64px 0 0 0 padding 64px 0 0 0
text-align center text-align center
color isDark ? #9aa4b3 : #555
> img &.about
width 350px font-family 'Noto Sans JP'
color isDark ? #fff : #627574
> p > article
margin 8px 0 max-width 700px
line-height 2em margin 42px auto 0 auto
padding 64px 82px
background isDark ? #282C37 : #fff
box-shadow 0 8px 32px rgba(#000, 0.15)
button > h1
padding 8px 16px margin 0
font-size inherit font-weight 900
.signup > p
color $theme-color margin 20px 0
border solid 2px $theme-color line-height 2em
border-radius 4px
&:focus > .gotit
box-shadow 0 0 0 3px rgba($theme-color, 0.2) color $theme-color
cursor pointer
&:hover &:hover
color $theme-color-foreground text-decoration underline
background $theme-color
&:active &.index
color $theme-color-foreground color isDark ? #9aa4b3 : #555
background darken($theme-color, 10%)
border-color darken($theme-color, 10%)
.signin > img
&:hover width 350px
color isDark ? #fff : #000
> .tl > .desc
margin 32px auto 0 auto margin -12px 0 24px 0
width 410px color isDark ? #fff : #555
text-align left
background isDark ? #313543 : #fff
border-radius 8px
box-shadow 0 8px 32px rgba(#000, 0.15)
overflow hidden
> header > span
z-index 1 color $theme-color
padding 12px 16px cursor pointer
color isDark ? #e3e5e8 : #888d94
box-shadow 0 1px 0px rgba(#000, 0.1)
> div &:hover
position absolute text-decoration underline
top 0
right 0
padding inherit
> span > .account
display inline-block margin 8px 0
height 11px line-height 2em
width 11px
margin-left 6px
border-radius 100%
vertical-align middle
&:nth-child(1) button
background #5BCC8B padding 8px 16px
font-size inherit
&:nth-child(2) .signup
background #E6BB46 color $theme-color
border solid 2px $theme-color
border-radius 4px
&:nth-child(3) &:focus
background #DF7065 box-shadow 0 0 0 3px rgba($theme-color, 0.2)
> .mk-welcome-timeline &:hover
max-height 350px color $theme-color-foreground
overflow auto background $theme-color
&:active
color $theme-color-foreground
background darken($theme-color, 10%)
border-color darken($theme-color, 10%)
.signin
&:hover
color isDark ? #fff : #000
> .tl
margin 32px auto 0 auto
width 410px
text-align left
background isDark ? #313543 : #fff
border-radius 8px
box-shadow 0 8px 32px rgba(#000, 0.15)
overflow hidden
> header
z-index 1
padding 12px 16px
color isDark ? #e3e5e8 : #888d94
box-shadow 0 1px 0px rgba(#000, 0.1)
> div
position absolute
top 0
right 0
padding inherit
> span
display inline-block
height 11px
width 11px
margin-left 6px
border-radius 100%
vertical-align middle
&:nth-child(1)
background #5BCC8B
&:nth-child(2)
background #E6BB46
&:nth-child(3)
background #DF7065
> .mk-welcome-timeline
max-height 350px
overflow auto
> footer > footer
font-size 12px font-size 12px
@@ -3,7 +3,7 @@
<template v-if="props.design == 0"> <template v-if="props.design == 0">
<p class="title">%fa:pencil-alt%%i18n:@title%</p> <p class="title">%fa:pencil-alt%%i18n:@title%</p>
</template> </template>
<textarea :disabled="posting" v-model="text" @keydown="onKeydown" placeholder="%i18n:@placeholder%"></textarea> <textarea :disabled="posting" v-model="text" @keydown="onKeydown" :placeholder="placeholder"></textarea>
<button @click="post" :disabled="posting">%i18n:@note%</button> <button @click="post" :disabled="posting">%i18n:@note%</button>
</div> </div>
</template> </template>
@@ -22,6 +22,19 @@ export default define({
text: '' text: ''
}; };
}, },
computed: {
placeholder(): string {
const xs = [
'%i18n:common.note-placeholders.a%',
'%i18n:common.note-placeholders.b%',
'%i18n:common.note-placeholders.c%',
'%i18n:common.note-placeholders.d%',
'%i18n:common.note-placeholders.e%',
'%i18n:common.note-placeholders.f%'
];
return xs[Math.floor(Math.random() * xs.length)];
}
},
methods: { methods: {
func() { func() {
if (this.props.design == 1) { if (this.props.design == 1) {
-8
View File
@@ -67,14 +67,6 @@ const html = document.documentElement;
html.setAttribute('lang', lang); html.setAttribute('lang', lang);
//#endregion //#endregion
//#region Set description meta tag
const head = document.getElementsByTagName('head')[0];
const meta = document.createElement('meta');
meta.setAttribute('name', 'description');
meta.setAttribute('content', '%i18n:common.misskey%');
head.appendChild(meta);
//#endregion
// iOSでプライベートモードだとlocalStorageが使えないので既存のメソッドを上書きする // iOSでプライベートモードだとlocalStorageが使えないので既存のメソッドを上書きする
try { try {
localStorage.setItem('kyoppie', 'yuppie'); localStorage.setItem('kyoppie', 'yuppie');
+8
View File
@@ -32,10 +32,14 @@ import MkNotifications from './views/pages/notifications.vue';
import MkWidgets from './views/pages/widgets.vue'; import MkWidgets from './views/pages/widgets.vue';
import MkMessaging from './views/pages/messaging.vue'; import MkMessaging from './views/pages/messaging.vue';
import MkMessagingRoom from './views/pages/messaging-room.vue'; import MkMessagingRoom from './views/pages/messaging-room.vue';
import MkReceivedFollowRequests from './views/pages/received-follow-requests.vue';
import MkNote from './views/pages/note.vue'; import MkNote from './views/pages/note.vue';
import MkSearch from './views/pages/search.vue'; import MkSearch from './views/pages/search.vue';
import MkFollowers from './views/pages/followers.vue'; import MkFollowers from './views/pages/followers.vue';
import MkFollowing from './views/pages/following.vue'; import MkFollowing from './views/pages/following.vue';
import MkFavorites from './views/pages/favorites.vue';
import MkUserLists from './views/pages/user-lists.vue';
import MkUserList from './views/pages/user-list.vue';
import MkSettings from './views/pages/settings.vue'; import MkSettings from './views/pages/settings.vue';
import MkOthello from './views/pages/othello.vue'; import MkOthello from './views/pages/othello.vue';
@@ -72,6 +76,10 @@ init((launch) => {
{ path: '/signup', name: 'signup', component: MkSignup }, { path: '/signup', name: 'signup', component: MkSignup },
{ path: '/i/settings', name: 'settings', component: MkSettings }, { path: '/i/settings', name: 'settings', component: MkSettings },
{ path: '/i/notifications', name: 'notifications', component: MkNotifications }, { path: '/i/notifications', name: 'notifications', component: MkNotifications },
{ path: '/i/favorites', name: 'favorites', component: MkFavorites },
{ path: '/i/lists', name: 'user-lists', component: MkUserLists },
{ path: '/i/lists/:list', name: 'user-list', component: MkUserList },
{ path: '/i/received-follow-requests', name: 'received-follow-requests', component: MkReceivedFollowRequests },
{ path: '/i/widgets', name: 'widgets', component: MkWidgets }, { path: '/i/widgets', name: 'widgets', component: MkWidgets },
{ path: '/i/messaging', name: 'messaging', component: MkMessaging }, { path: '/i/messaging', name: 'messaging', component: MkMessaging },
{ path: '/i/messaging/:user', component: MkMessagingRoom }, { path: '/i/messaging/:user', component: MkMessagingRoom },
@@ -1,13 +1,16 @@
<template> <template>
<button class="mk-follow-button" <button class="mk-follow-button"
:class="{ wait: wait, follow: !user.isFollowing, unfollow: user.isFollowing }" :class="{ wait: wait, active: u.isFollowing || u.hasPendingFollowRequestFromYou }"
@click="onClick" @click="onClick"
:disabled="wait" :disabled="wait"
> >
<template v-if="!wait && user.isFollowing">%fa:minus%</template> <template v-if="!wait">
<template v-if="!wait && !user.isFollowing">%fa:plus%</template> <template v-if="u.hasPendingFollowRequestFromYou">%fa:hourglass-half% %i18n:@request-pending%</template>
<template v-if="wait">%fa:spinner .pulse .fw%</template> <template v-else-if="u.isFollowing">%fa:minus% %i18n:@unfollow%</template>
{{ user.isFollowing ? '%i18n:@unfollow%' : '%i18n:@follow%' }} <template v-else-if="!u.isFollowing && u.isLocked">%fa:plus% %i18n:@follow-request%</template>
<template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus% %i18n:@follow%</template>
</template>
<template v-else>%fa:spinner .pulse .fw%</template>
</button> </button>
</template> </template>
@@ -22,6 +25,7 @@ export default Vue.extend({
}, },
data() { data() {
return { return {
u: this.user,
wait: false, wait: false,
connection: null, connection: null,
connectionId: null connectionId: null
@@ -42,39 +46,44 @@ export default Vue.extend({
methods: { methods: {
onFollow(user) { onFollow(user) {
if (user.id == this.user.id) { if (user.id == this.u.id) {
this.user.isFollowing = user.isFollowing; this.u.isFollowing = user.isFollowing;
} }
}, },
onUnfollow(user) { onUnfollow(user) {
if (user.id == this.user.id) { if (user.id == this.u.id) {
this.user.isFollowing = user.isFollowing; this.u.isFollowing = user.isFollowing;
} }
}, },
onClick() { async onClick() {
this.wait = true; this.wait = true;
if (this.user.isFollowing) {
(this as any).api('following/delete', { try {
userId: this.user.id if (this.u.isFollowing) {
}).then(() => { this.u = await (this as any).api('following/delete', {
this.user.isFollowing = false; userId: this.u.id
}).catch(err => { });
console.error(err); } else {
}).then(() => { if (this.u.isLocked && this.u.hasPendingFollowRequestFromYou) {
this.wait = false; this.u = await (this as any).api('following/requests/cancel', {
}); userId: this.u.id
} else { });
(this as any).api('following/create', { } else if (this.u.isLocked) {
userId: this.user.id this.u = await (this as any).api('following/create', {
}).then(() => { userId: this.u.id
this.user.isFollowing = true; });
}).catch(err => { } else {
console.error(err); this.u = await (this as any).api('following/create', {
}).then(() => { userId: this.user.id
this.wait = false; });
}); }
}
} catch (e) {
console.error(e);
} finally {
this.wait = false;
} }
} }
} }
@@ -90,34 +99,38 @@ export default Vue.extend({
cursor pointer cursor pointer
padding 0 16px padding 0 16px
margin 0 margin 0
height inherit min-width 150px
font-size 16px line-height 36px
font-size 14px
color $theme-color
background transparent
outline none outline none
border solid 1px $theme-color border solid 1px $theme-color
border-radius 4px border-radius 36px
* &:hover
pointer-events none background rgba($theme-color, 0.1)
&.follow &:active
color $theme-color background rgba($theme-color, 0.2)
background transparent
&:hover &.active
background rgba($theme-color, 0.1)
&:active
background rgba($theme-color, 0.2)
&.unfollow
color $theme-color-foreground color $theme-color-foreground
background $theme-color background $theme-color
&:hover
background lighten($theme-color, 10%)
border-color lighten($theme-color, 10%)
&:active
background darken($theme-color, 10%)
border-color darken($theme-color, 10%)
&.wait &.wait
cursor wait !important cursor wait !important
opacity 0.7 opacity 0.7
> [data-fa] *
margin-right 4px pointer-events none
</style> </style>
@@ -1,101 +0,0 @@
<template>
<div class="root sub">
<mk-avatar class="avatar" :user="note.user"/>
<div class="main">
<header>
<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>
<span class="username"><mk-acct :user="note.user"/></span>
<router-link class="time" :to="note | notePage">
<mk-time :time="note.createdAt"/>
</router-link>
</header>
<div class="body">
<mk-sub-note-content class="text" :note="note"/>
</div>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: ['note']
});
</script>
<style lang="stylus" scoped>
root(isDark)
padding 8px
font-size 0.9em
background isDark ? #21242d : #fdfdfd
@media (min-width 500px)
padding 12px
@media (min-width 600px)
padding 24px 32px
&:after
content ""
display block
clear both
> .avatar
display block
float left
margin 0 12px 0 0
width 48px
height 48px
border-radius 8px
> .main
float left
width calc(100% - 60px)
> header
display flex
align-items baseline
margin-bottom 4px
white-space nowrap
> .name
display block
margin 0 .5em 0 0
padding 0
overflow hidden
color isDark ? #fff : #607073
font-size 1em
font-weight 700
text-align left
text-decoration none
text-overflow ellipsis
&:hover
text-decoration underline
> .username
text-align left
margin 0 .5em 0 0
color isDark ? #606984 : #d1d8da
> .time
margin-left auto
color isDark ? #606984 : #b2b8bb
> .body
> .text
cursor default
margin 0
padding 0
font-size 1.1em
color isDark ? #959ba7 : #717171
.root.sub[data-darkmode]
root(true)
.root.sub:not([data-darkmode])
root(false)
</style>
@@ -87,7 +87,7 @@ import parse from '../../../../../text/parse';
import MkNoteMenu from '../../../common/views/components/note-menu.vue'; import MkNoteMenu from '../../../common/views/components/note-menu.vue';
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
import XSub from './note-detail.sub.vue'; import XSub from './note.sub.vue';
export default Vue.extend({ export default Vue.extend({
components: { components: {
@@ -172,7 +172,7 @@ export default Vue.extend({
}, },
methods: { methods: {
fetchContext() { fetchConversation() {
this.conversationFetching = true; this.conversationFetching = true;
// Fetch conversation // Fetch conversation
@@ -216,8 +216,6 @@ export default Vue.extend({
root(isDark) root(isDark)
overflow hidden overflow hidden
margin 0 auto
padding 0
width 100% width 100%
text-align left text-align left
background isDark ? #282C37 : #fff background isDark ? #282C37 : #fff
@@ -9,9 +9,18 @@
<span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span> <span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span>
<span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span> <span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span>
<span class="username"><mk-acct :user="note.user"/></span> <span class="username"><mk-acct :user="note.user"/></span>
<router-link class="time" :to="note | notePage"> <div class="info">
<mk-time :time="note.createdAt"/> <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
</router-link> <router-link class="created-at" :to="note | notePage">
<mk-time :time="note.createdAt"/>
</router-link>
<span class="visibility" v-if="note.visibility != 'public'">
<template v-if="note.visibility == 'home'">%fa:home%</template>
<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
<template v-if="note.visibility == 'private'">%fa:lock%</template>
</span>
</div>
</header> </header>
<div class="body"> <div class="body">
<mk-sub-note-content class="text" :note="note"/> <mk-sub-note-content class="text" :note="note"/>
@@ -30,14 +39,16 @@ export default Vue.extend({
<style lang="stylus" scoped> <style lang="stylus" scoped>
root(isDark) root(isDark)
display flex
margin 0 margin 0
padding 0 padding 0
font-size 0.9em font-size 10px
&:after @media (min-width 350px)
content "" font-size 12px
display block
clear both @media (min-width 500px)
font-size 14px
&.smart &.smart
> .main > .main
@@ -47,24 +58,26 @@ root(isDark)
align-items center align-items center
> .avatar > .avatar
flex-shrink 0
display block display block
float left margin 0 10px 0 0
margin 0 12px 0 0 width 40px
width 48px height 40px
height 48px
border-radius 8px border-radius 8px
@media (max-width 500px) @media (min-width 350px)
margin 0 10px 0 0 margin 0 10px 0 0
width 44px width 44px
height 44px height 44px
> .main @media (min-width 500px)
float left margin 0 12px 0 0
width calc(100% - 60px) width 48px
height 48px
@media (max-width 500px) > .main
width calc(100% - 54px) flex 1
min-width 0
> header > header
display flex display flex
@@ -97,7 +110,7 @@ root(isDark)
align-self center align-self center
margin 0 0.5em 0 0 margin 0 0.5em 0 0
padding 1px 6px padding 1px 6px
font-size 10px font-size 0.8em
color isDark ? #758188 : #aaa color isDark ? #758188 : #aaa
border solid 1px isDark ? #57616f : #ddd border solid 1px isDark ? #57616f : #ddd
border-radius 3px border-radius 3px
@@ -112,9 +125,18 @@ root(isDark)
text-overflow ellipsis text-overflow ellipsis
color isDark ? #606984 : #d1d8da color isDark ? #606984 : #d1d8da
> .time > .info
margin-left auto margin-left auto
color isDark ? #606984 : #b2b8bb font-size 0.9em
> *
color isDark ? #606984 : #b2b8bb
> .mobile
margin-right 6px
> .visibility
margin-left 6px
> .body > .body
@@ -33,16 +33,33 @@
import Vue from 'vue'; import Vue from 'vue';
export default Vue.extend({ export default Vue.extend({
props: ['note'] props: {
note: {
type: Object,
required: true
},
// TODO
truncate: {
type: Boolean,
default: true
}
}
}); });
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
root(isDark) root(isDark)
display flex
padding 16px padding 16px
font-size 0.9em font-size 10px
background isDark ? #21242d : #fcfcfc background isDark ? #21242d : #fcfcfc
@media (min-width 350px)
font-size 12px
@media (min-width 500px)
font-size 14px
@media (min-width 600px) @media (min-width 600px)
padding 24px 32px padding 24px 32px
@@ -53,30 +70,27 @@ root(isDark)
> header > header
align-items center align-items center
&:after
content ""
display block
clear both
> .avatar > .avatar
flex-shrink 0
display block display block
float left margin 0 8px 0 0
margin 0 10px 0 0 width 38px
width 42px height 38px
height 42px
border-radius 8px border-radius 8px
@media (min-width 350px)
margin-right 10px
width 42px
height 42px
@media (min-width 500px) @media (min-width 500px)
margin-right 14px margin-right 14px
width 50px width 50px
height 50px height 50px
> .main > .main
float left flex 1
width calc(100% - 52px) min-width 0
@media (min-width 500px)
width calc(100% - 64px)
> header > header
display flex display flex
@@ -112,7 +126,7 @@ root(isDark)
align-self center align-self center
margin 0 0.5em 0 0 margin 0 0.5em 0 0
padding 1px 5px padding 1px 5px
font-size 10px font-size 0.8em
color isDark ? #758188 : #aaa color isDark ? #758188 : #aaa
border solid 1px isDark ? #57616f : #ddd border solid 1px isDark ? #57616f : #ddd
border-radius 3px border-radius 3px
@@ -140,11 +154,8 @@ root(isDark)
margin-left 6px margin-left 6px
> .body > .body
max-height 128px
overflow hidden
> .text > .text
cursor default
margin 0 margin 0
padding 0 padding 0
color isDark ? #959ba7 : #717171 color isDark ? #959ba7 : #717171
+16 -18
View File
@@ -269,8 +269,6 @@ root(isDark)
&.smart &.smart
> article > article
> .main > .main
width 100%
> header > header
align-items center align-items center
margin-bottom 4px margin-bottom 4px
@@ -328,27 +326,28 @@ root(isDark)
padding-top 8px padding-top 8px
> article > article
display flex
padding 16px 16px 9px padding 16px 16px 9px
@media (min-width 600px) @media (min-width 600px)
padding 32px 32px 22px padding 32px 32px 22px
&:after
content ""
display block
clear both
> .avatar > .avatar
flex-shrink 0
display block display block
float left
margin 0 10px 8px 0 margin 0 10px 8px 0
width 48px width 42px
height 48px height 42px
border-radius 6px border-radius 6px
//position -webkit-sticky //position -webkit-sticky
//position sticky //position sticky
//top 62px //top 62px
@media (min-width 350px)
width 48px
height 48px
border-radius 6px
@media (min-width 500px) @media (min-width 500px)
margin-right 16px margin-right 16px
width 58px width 58px
@@ -356,11 +355,8 @@ root(isDark)
border-radius 8px border-radius 8px
> .main > .main
float left flex 1
width calc(100% - 58px) min-width 0
@media (min-width 500px)
width calc(100% - 74px)
> header > header
display flex display flex
@@ -393,7 +389,7 @@ root(isDark)
align-self center align-self center
margin 0 0.5em 0 0 margin 0 0.5em 0 0
padding 1px 6px padding 1px 6px
font-size 12px font-size 0.8em
color isDark ? #758188 : #aaa color isDark ? #758188 : #aaa
border solid 1px isDark ? #57616f : #ddd border solid 1px isDark ? #57616f : #ddd
border-radius 3px border-radius 3px
@@ -422,6 +418,8 @@ root(isDark)
margin-left 6px margin-left 6px
> .body > .body
@media (min-width 700px)
font-size 1.1em
> .cw > .cw
cursor default cursor default
@@ -504,7 +502,7 @@ root(isDark)
padding 2px 8px 2px 16px padding 2px 8px 2px 16px
font-size 90% font-size 90%
color #8d969e color #8d969e
background #edf0f3 background isDark ? #313543 : #edf0f3
border-radius 4px border-radius 4px
&:before &:before
@@ -517,7 +515,7 @@ root(isDark)
width 8px width 8px
height 8px height 8px
margin auto 0 margin auto 0
background #fff background isDark ? #282c37 : #fff
border-radius 100% border-radius 100%
> .media > .media
@@ -1,7 +1,7 @@
<template> <template>
<div class="mk-notification-preview" :class="notification.type"> <div class="mk-notification-preview" :class="notification.type">
<template v-if="notification.type == 'reaction'"> <template v-if="notification.type == 'reaction'">
<img class="avatar" :src="`${notification.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/> <mk-avatar class="avatar" :user="notification.user"/>
<div class="text"> <div class="text">
<p><mk-reaction-icon :reaction="notification.reaction"/>{{ notification.user | userName }}</p> <p><mk-reaction-icon :reaction="notification.reaction"/>{{ notification.user | userName }}</p>
<p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%</p> <p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%</p>
@@ -9,7 +9,7 @@
</template> </template>
<template v-if="notification.type == 'renote'"> <template v-if="notification.type == 'renote'">
<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/> <mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text"> <div class="text">
<p>%fa:retweet%{{ notification.note.user | userName }}</p> <p>%fa:retweet%{{ notification.note.user | userName }}</p>
<p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note.renote) }}%fa:quote-right%</p> <p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note.renote) }}%fa:quote-right%</p>
@@ -17,7 +17,7 @@
</template> </template>
<template v-if="notification.type == 'quote'"> <template v-if="notification.type == 'quote'">
<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/> <mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text"> <div class="text">
<p>%fa:quote-left%{{ notification.note.user | userName }}</p> <p>%fa:quote-left%{{ notification.note.user | userName }}</p>
<p class="note-preview">{{ getNoteSummary(notification.note) }}</p> <p class="note-preview">{{ getNoteSummary(notification.note) }}</p>
@@ -25,14 +25,21 @@
</template> </template>
<template v-if="notification.type == 'follow'"> <template v-if="notification.type == 'follow'">
<img class="avatar" :src="`${notification.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/> <mk-avatar class="avatar" :user="notification.user"/>
<div class="text"> <div class="text">
<p>%fa:user-plus%{{ notification.user | userName }}</p> <p>%fa:user-plus%{{ notification.user | userName }}</p>
</div> </div>
</template> </template>
<template v-if="notification.type == 'receiveFollowRequest'">
<mk-avatar class="avatar" :user="notification.user"/>
<div class="text">
<p>%fa:user-clock%{{ notification.user | userName }}</p>
</div>
</template>
<template v-if="notification.type == 'reply'"> <template v-if="notification.type == 'reply'">
<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/> <mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text"> <div class="text">
<p>%fa:reply%{{ notification.note.user | userName }}</p> <p>%fa:reply%{{ notification.note.user | userName }}</p>
<p class="note-preview">{{ getNoteSummary(notification.note) }}</p> <p class="note-preview">{{ getNoteSummary(notification.note) }}</p>
@@ -40,7 +47,7 @@
</template> </template>
<template v-if="notification.type == 'mention'"> <template v-if="notification.type == 'mention'">
<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/> <mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text"> <div class="text">
<p>%fa:at%{{ notification.note.user | userName }}</p> <p>%fa:at%{{ notification.note.user | userName }}</p>
<p class="note-preview">{{ getNoteSummary(notification.note) }}</p> <p class="note-preview">{{ getNoteSummary(notification.note) }}</p>
@@ -48,7 +55,7 @@
</template> </template>
<template v-if="notification.type == 'poll_vote'"> <template v-if="notification.type == 'poll_vote'">
<img class="avatar" :src="`${notification.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/> <mk-avatar class="avatar" :user="notification.user"/>
<div class="text"> <div class="text">
<p>%fa:chart-pie%{{ notification.user | userName }}</p> <p>%fa:chart-pie%{{ notification.user | userName }}</p>
<p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%</p> <p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%</p>
@@ -83,16 +90,14 @@ export default Vue.extend({
display block display block
clear both clear both
img > .avatar
display block display block
float left float left
min-width 36px width 36px
min-height 36px height 36px
max-width 36px
max-height 36px
border-radius 6px border-radius 6px
.text > .text
float right float right
width calc(100% - 36px) width calc(100% - 36px)
padding-left 8px padding-left 8px
@@ -120,6 +125,10 @@ export default Vue.extend({
.text p i .text p i
color #53c7ce color #53c7ce
&.receiveFollowRequest
.text p i
color #888
&.reply, &.mention &.reply, &.mention
.text p i .text p i
color #fff color #fff
@@ -40,6 +40,17 @@
</div> </div>
</div> </div>
<div class="notification followRequest" v-if="notification.type == 'receiveFollowRequest'">
<mk-avatar class="avatar" :user="notification.user"/>
<div>
<header>
%fa:user-clock%
<router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link>
<mk-time :time="notification.createdAt"/>
</header>
</div>
</div>
<div class="notification poll_vote" v-if="notification.type == 'poll_vote'"> <div class="notification poll_vote" v-if="notification.type == 'poll_vote'">
<mk-avatar class="avatar" :user="notification.user"/> <mk-avatar class="avatar" :user="notification.user"/>
<div> <div>
@@ -55,15 +66,15 @@
</div> </div>
<template v-if="notification.type == 'quote'"> <template v-if="notification.type == 'quote'">
<mk-note :note="notification.note"/> <mk-note :note="notification.note" @update:note="onNoteUpdated"/>
</template> </template>
<template v-if="notification.type == 'reply'"> <template v-if="notification.type == 'reply'">
<mk-note :note="notification.note"/> <mk-note :note="notification.note" @update:note="onNoteUpdated"/>
</template> </template>
<template v-if="notification.type == 'mention'"> <template v-if="notification.type == 'mention'">
<mk-note :note="notification.note"/> <mk-note :note="notification.note" @update:note="onNoteUpdated"/>
</template> </template>
</div> </div>
</template> </template>
@@ -78,6 +89,17 @@ export default Vue.extend({
return { return {
getNoteSummary getNoteSummary
}; };
},
methods: {
onNoteUpdated(note) {
switch (this.notification.type) {
case 'quote':
case 'reply':
case 'mention':
Vue.set(this.notification, 'note', note);
break;
}
}
} }
}); });
</script> </script>
@@ -156,6 +178,10 @@ root(isDark)
> div > header i > div > header i
color #53c7ce color #53c7ce
&.receiveFollowRequest
> div > header i
color #888
.mk-notification[data-darkmode] .mk-notification[data-darkmode]
root(true) root(true)
@@ -5,11 +5,7 @@
<div> <div>
<span class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</span> <span class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</span>
<span class="geo" v-if="geo">%fa:map-marker-alt%</span> <span class="geo" v-if="geo">%fa:map-marker-alt%</span>
<button class="submit" :disabled="posting" @click="post"> <button class="submit" :disabled="posting" @click="post">{{ submitText }}</button>
<template v-if="reply">%i18n:@reply%</template>
<template v-else-if="renote">%i18n:@renote%</template>
<template v-else>%i18n:@submit%</template>
</button>
</div> </div>
</header> </header>
<div class="form"> <div class="form">
@@ -20,7 +16,7 @@
<a @click="addVisibleUser">+%i18n:@add-visible-user%</a> <a @click="addVisibleUser">+%i18n:@add-visible-user%</a>
</div> </div>
<input v-show="useCw" v-model="cw" placeholder="%i18n:@cw-placeholder%"> <input v-show="useCw" v-model="cw" placeholder="%i18n:@cw-placeholder%">
<textarea v-model="text" ref="text" :disabled="posting" :placeholder="reply ? '%i18n:@reply-placeholder%' : renote ? '%i18n:@renote-placeholder%' : '%i18n:@note-placeholder%'"></textarea> <textarea v-model="text" ref="text" :disabled="posting" :placeholder="placeholder"></textarea>
<div class="attaches" v-show="files.length != 0"> <div class="attaches" v-show="files.length != 0">
<x-draggable class="files" :list="files" :options="{ animation: 150 }"> <x-draggable class="files" :list="files" :options="{ animation: 150 }">
<div class="file" v-for="file in files" :key="file.id"> <div class="file" v-for="file in files" :key="file.id">
@@ -74,6 +70,46 @@ export default Vue.extend({
}; };
}, },
computed: {
draftId(): string {
return this.renote
? 'renote:' + this.renote.id
: this.reply
? 'reply:' + this.reply.id
: 'note';
},
placeholder(): string {
const xs = [
'%i18n:common.note-placeholders.a%',
'%i18n:common.note-placeholders.b%',
'%i18n:common.note-placeholders.c%',
'%i18n:common.note-placeholders.d%',
'%i18n:common.note-placeholders.e%',
'%i18n:common.note-placeholders.f%'
];
const x = xs[Math.floor(Math.random() * xs.length)];
return this.renote
? '%i18n:@quote-placeholder%'
: this.reply
? '%i18n:@reply-placeholder%'
: x;
},
submitText(): string {
return this.renote
? '%i18n:@renote%'
: this.reply
? '%i18n:@reply%'
: '%i18n:@submit%';
},
canPost(): boolean {
return !this.posting && (this.text.length != 0 || this.files.length != 0 || this.poll || this.renote);
}
},
mounted() { mounted() {
if (this.reply && this.reply.user.host != null) { if (this.reply && this.reply.user.host != null) {
this.text = `@${this.reply.user.username}@${this.reply.user.host} `; this.text = `@${this.reply.user.username}@${this.reply.user.host} `;
@@ -6,7 +6,7 @@
<p ref="welcomeback" v-if="$store.getters.isSignedIn">おかえりなさい<b>{{ $store.state.i | userName }}</b>さん</p> <p ref="welcomeback" v-if="$store.getters.isSignedIn">おかえりなさい<b>{{ $store.state.i | userName }}</b>さん</p>
<div class="content" ref="mainContainer"> <div class="content" ref="mainContainer">
<button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button> <button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button>
<template v-if="hasUnreadNotifications || hasUnreadMessagingMessages || hasGameInvitations">%fa:circle%</template> <template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template>
<h1> <h1>
<slot>Misskey</slot> <slot>Misskey</slot>
</h1> </h1>
@@ -25,13 +25,19 @@ export default Vue.extend({
props: ['func'], props: ['func'],
data() { data() {
return { return {
hasUnreadNotifications: false, hasGameInvitation: false,
hasUnreadMessagingMessages: false,
hasGameInvitations: false,
connection: null, connection: null,
connectionId: null connectionId: null
}; };
}, },
computed: {
hasUnreadNotification(): boolean {
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification;
},
hasUnreadMessagingMessage(): boolean {
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage;
}
},
mounted() { mounted() {
this.$store.commit('setUiHeaderHeight', 48); this.$store.commit('setUiHeaderHeight', 48);
@@ -39,27 +45,9 @@ export default Vue.extend({
this.connection = (this as any).os.stream.getConnection(); this.connection = (this as any).os.stream.getConnection();
this.connectionId = (this as any).os.stream.use(); this.connectionId = (this as any).os.stream.use();
this.connection.on('read_all_notifications', this.onReadAllNotifications);
this.connection.on('unread_notification', this.onUnreadNotification);
this.connection.on('read_all_messaging_messages', this.onReadAllMessagingMessages);
this.connection.on('unread_messaging_message', this.onUnreadMessagingMessage);
this.connection.on('othello_invited', this.onOthelloInvited); this.connection.on('othello_invited', this.onOthelloInvited);
this.connection.on('othello_no_invites', this.onOthelloNoInvites); this.connection.on('othello_no_invites', this.onOthelloNoInvites);
// Fetch count of unread notifications
(this as any).api('notifications/get_unread_count').then(res => {
if (res.count > 0) {
this.hasUnreadNotifications = true;
}
});
// Fetch count of unread messaging messages
(this as any).api('messaging/unread').then(res => {
if (res.count > 0) {
this.hasUnreadMessagingMessages = true;
}
});
const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000; const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000;
const isHisasiburi = ago >= 3600; const isHisasiburi = ago >= 3600;
this.$store.state.i.lastUsedAt = new Date(); this.$store.state.i.lastUsedAt = new Date();
@@ -110,33 +98,17 @@ export default Vue.extend({
}, },
beforeDestroy() { beforeDestroy() {
if (this.$store.getters.isSignedIn) { if (this.$store.getters.isSignedIn) {
this.connection.off('read_all_notifications', this.onReadAllNotifications);
this.connection.off('unread_notification', this.onUnreadNotification);
this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages);
this.connection.off('unread_messaging_message', this.onUnreadMessagingMessage);
this.connection.off('othello_invited', this.onOthelloInvited); this.connection.off('othello_invited', this.onOthelloInvited);
this.connection.off('othello_no_invites', this.onOthelloNoInvites); this.connection.off('othello_no_invites', this.onOthelloNoInvites);
(this as any).os.stream.dispose(this.connectionId); (this as any).os.stream.dispose(this.connectionId);
} }
}, },
methods: { methods: {
onReadAllNotifications() {
this.hasUnreadNotifications = false;
},
onUnreadNotification() {
this.hasUnreadNotifications = true;
},
onReadAllMessagingMessages() {
this.hasUnreadMessagingMessages = false;
},
onUnreadMessagingMessage() {
this.hasUnreadMessagingMessages = true;
},
onOthelloInvited() { onOthelloInvited() {
this.hasGameInvitations = true; this.hasGameInvitation = true;
}, },
onOthelloNoInvites() { onOthelloNoInvites() {
this.hasGameInvitations = false; this.hasGameInvitation = false;
} }
} }
}); });
@@ -15,21 +15,22 @@
</router-link> </router-link>
<div class="links"> <div class="links">
<ul> <ul>
<li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@home%%fa:angle-right%</router-link></li> <li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@timeline%%fa:angle-right%</router-link></li>
<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotifications">%fa:circle%</template>%fa:angle-right%</router-link></li> <li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li>
<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessages">%fa:circle%</template>%fa:angle-right%</router-link></li> <li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>%fa:angle-right%</router-link></li>
<li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%ゲーム<template v-if="hasGameInvitations">%fa:circle%</template>%fa:angle-right%</router-link></li> <li v-if="$store.getters.isSignedIn && $store.state.i.isLocked"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'">%fa:R envelope%%i18n:@follow-requests%<template v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount">%fa:circle%</template>%fa:angle-right%</router-link></li>
<li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%%i18n:@game%<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li>
</ul> </ul>
<ul> <ul>
<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:quidditch%%i18n:@widgets%%fa:angle-right%</router-link></li> <li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:R calendar-alt%%i18n:@widgets%%fa:angle-right%</router-link></li>
<li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'">%fa:star%%i18n:@favorites%%fa:angle-right%</router-link></li>
<li><router-link to="/i/lists" :data-active="$route.name == 'user-lists'">%fa:list%%i18n:@user-lists%%fa:angle-right%</router-link></li>
<li><router-link to="/i/drive" :data-active="$route.name == 'drive'">%fa:cloud%%i18n:@drive%%fa:angle-right%</router-link></li> <li><router-link to="/i/drive" :data-active="$route.name == 'drive'">%fa:cloud%%i18n:@drive%%fa:angle-right%</router-link></li>
</ul> </ul>
<ul> <ul>
<li><a @click="search">%fa:search%%i18n:@search%%fa:angle-right%</a></li> <li><a @click="search">%fa:search%%i18n:@search%%fa:angle-right%</a></li>
</ul>
<ul>
<li><router-link to="/i/settings" :data-active="$route.name == 'settings'">%fa:cog%%i18n:@settings%%fa:angle-right%</router-link></li> <li><router-link to="/i/settings" :data-active="$route.name == 'settings'">%fa:cog%%i18n:@settings%%fa:angle-right%</router-link></li>
<li @click="dark"><p><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template><span>ダークモード</span></p></li> <li @click="dark"><p><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template><span>%i18n:@darkmode%</span></p></li>
</ul> </ul>
</div> </div>
<a :href="aboutUrl"><p class="about">%i18n:@about%</p></a> <a :href="aboutUrl"><p class="about">%i18n:@about%</p></a>
@@ -46,47 +47,31 @@ export default Vue.extend({
props: ['isOpen'], props: ['isOpen'],
data() { data() {
return { return {
hasUnreadNotifications: false, hasGameInvitation: false,
hasUnreadMessagingMessages: false,
hasGameInvitations: false,
connection: null, connection: null,
connectionId: null, connectionId: null,
aboutUrl: `${docsUrl}/${lang}/about` aboutUrl: `${docsUrl}/${lang}/about`
}; };
}, },
computed: {
hasUnreadNotification(): boolean {
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification;
},
hasUnreadMessagingMessage(): boolean {
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage;
}
},
mounted() { mounted() {
if (this.$store.getters.isSignedIn) { if (this.$store.getters.isSignedIn) {
this.connection = (this as any).os.stream.getConnection(); this.connection = (this as any).os.stream.getConnection();
this.connectionId = (this as any).os.stream.use(); this.connectionId = (this as any).os.stream.use();
this.connection.on('read_all_notifications', this.onReadAllNotifications);
this.connection.on('unread_notification', this.onUnreadNotification);
this.connection.on('read_all_messaging_messages', this.onReadAllMessagingMessages);
this.connection.on('unread_messaging_message', this.onUnreadMessagingMessage);
this.connection.on('othello_invited', this.onOthelloInvited); this.connection.on('othello_invited', this.onOthelloInvited);
this.connection.on('othello_no_invites', this.onOthelloNoInvites); this.connection.on('othello_no_invites', this.onOthelloNoInvites);
// Fetch count of unread notifications
(this as any).api('notifications/get_unread_count').then(res => {
if (res.count > 0) {
this.hasUnreadNotifications = true;
}
});
// Fetch count of unread messaging messages
(this as any).api('messaging/unread').then(res => {
if (res.count > 0) {
this.hasUnreadMessagingMessages = true;
}
});
} }
}, },
beforeDestroy() { beforeDestroy() {
if (this.$store.getters.isSignedIn) { if (this.$store.getters.isSignedIn) {
this.connection.off('read_all_notifications', this.onReadAllNotifications);
this.connection.off('unread_notification', this.onUnreadNotification);
this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages);
this.connection.off('unread_messaging_message', this.onUnreadMessagingMessage);
this.connection.off('othello_invited', this.onOthelloInvited); this.connection.off('othello_invited', this.onOthelloInvited);
this.connection.off('othello_no_invites', this.onOthelloNoInvites); this.connection.off('othello_no_invites', this.onOthelloNoInvites);
(this as any).os.stream.dispose(this.connectionId); (this as any).os.stream.dispose(this.connectionId);
@@ -98,23 +83,11 @@ export default Vue.extend({
if (query == null || query == '') return; if (query == null || query == '') return;
this.$router.push('/search?q=' + encodeURIComponent(query)); this.$router.push('/search?q=' + encodeURIComponent(query));
}, },
onReadAllNotifications() {
this.hasUnreadNotifications = false;
},
onUnreadNotification() {
this.hasUnreadNotifications = true;
},
onReadAllMessagingMessages() {
this.hasUnreadMessagingMessages = false;
},
onUnreadMessagingMessage() {
this.hasUnreadMessagingMessages = true;
},
onOthelloInvited() { onOthelloInvited() {
this.hasGameInvitations = true; this.hasGameInvitation = true;
}, },
onOthelloNoInvites() { onOthelloNoInvites() {
this.hasGameInvitations = false; this.hasGameInvitation = false;
}, },
dark() { dark() {
this.$store.commit('device/set', { this.$store.commit('device/set', {
@@ -186,7 +159,10 @@ root(isDark)
&:first-child &:first-child
margin-top 0 margin-top 0
li &:last-child
margin-bottom 0
> li
display block display block
font-size 1em font-size 1em
line-height 1em line-height 1em
@@ -209,6 +185,8 @@ root(isDark)
> [data-fa]:first-child > [data-fa]:first-child
margin-right 0.5em margin-right 0.5em
width 20px
text-align center
> [data-fa].circle > [data-fa].circle
margin-left 6px margin-left 6px
@@ -226,7 +204,7 @@ root(isDark)
opacity 0.5 opacity 0.5
.about .about
margin 0 margin 0 0 8px 0
padding 1em 0 padding 1em 0
text-align center text-align center
font-size 0.8em font-size 0.8em
@@ -0,0 +1,94 @@
<template>
<mk-ui>
<span slot="header">%fa:star%%i18n:@title%</span>
<main>
<template v-for="favorite in favorites">
<mk-note-detail class="post" :note="favorite.note" :key="favorite.note.id"/>
</template>
<a v-if="existMore" @click="more">%i18n:@more%</a>
</main>
</mk-ui>
</template>
<script lang="ts">
import Vue from 'vue';
import Progress from '../../../common/scripts/loading';
export default Vue.extend({
data() {
return {
fetching: true,
favorites: [],
existMore: false,
moreFetching: false
};
},
created() {
this.fetch();
},
mounted() {
document.title = 'Misskey | %i18n:@notifications%';
},
methods: {
fetch() {
Progress.start();
this.fetching = true;
(this as any).api('i/favorites', {
limit: 11
}).then(favorites => {
if (favorites.length == 11) {
this.existMore = true;
favorites.pop();
}
this.favorites = favorites;
this.fetching = false;
Progress.done();
});
},
more() {
this.moreFetching = true;
(this as any).api('i/favorites', {
limit: 11,
maxId: this.favorites[this.favorites.length - 1].id
}).then(favorites => {
if (favorites.length == 11) {
this.existMore = true;
favorites.pop();
} else {
this.existMore = false;
}
this.favorites = this.favorites.concat(favorites);
this.moreFetching = false;
});
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
main
width 100%
max-width 680px
margin 0 auto
padding 8px
> .post
margin-bottom 8px
@media (min-width 500px)
padding 16px
> .post
margin-bottom 16px
@media (min-width 600px)
padding 32px
</style>
@@ -0,0 +1,78 @@
<template>
<mk-ui>
<span slot="header">%fa:envelope R%%i18n:@title%</span>
<main>
<div v-for="req in requests">
<router-link :key="req.id" :to="req.follower | userPage">{{ req.follower | userName }}</router-link>
<span>
<a @click="accept(req.follower)">%i18n:@accept%</a>|<a @click="reject(req.follower)">%i18n:@reject%</a>
</span>
</div>
</main>
</mk-ui>
</template>
<script lang="ts">
import Vue from 'vue';
import Progress from '../../../common/scripts/loading';
export default Vue.extend({
data() {
return {
fetching: true,
requests: []
};
},
mounted() {
document.title = 'Misskey | %i18n:@title%';
Progress.start();
(this as any).api('following/requests/list').then(requests => {
this.fetching = false;
this.requests = requests;
Progress.done();
});
},
methods: {
accept(user) {
(this as any).api('following/requests/accept', { userId: user.id }).then(() => {
this.requests = this.requests.filter(r => r.follower.id != user.id);
});
},
reject(user) {
(this as any).api('following/requests/reject', { userId: user.id }).then(() => {
this.requests = this.requests.filter(r => r.follower.id != user.id);
});
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
main
width 100%
max-width 680px
margin 0 auto
padding 8px
@media (min-width 500px)
padding 16px
@media (min-width 600px)
padding 32px
> div
display flex
padding 16px
border solid 1px isDark ? #1c2023 : #eee
border-radius 4px
> span
margin 0 0 0 auto
</style>
@@ -0,0 +1,70 @@
<template>
<mk-ui>
<span slot="header" v-if="!fetching">%fa:list%{{ list.title }}</span>
<main v-if="!fetching">
<ul>
<li v-for="user in users" :key="user.id"><router-link :to="user | userPage">{{ user | userName }}</router-link></li>
</ul>
</main>
</mk-ui>
</template>
<script lang="ts">
import Vue from 'vue';
import Progress from '../../../common/scripts/loading';
export default Vue.extend({
data() {
return {
fetching: true,
list: null,
users: null
};
},
watch: {
$route: 'fetch'
},
created() {
this.fetch();
},
methods: {
fetch() {
Progress.start();
this.fetching = true;
(this as any).api('users/lists/show', {
listId: this.$route.params.list
}).then(list => {
this.list = list;
this.fetching = false;
Progress.done();
(this as any).api('users/show', {
userIds: this.list.userIds
}).then(users => {
this.users = users;
});
});
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
main
width 100%
max-width 680px
margin 0 auto
padding 8px
@media (min-width 500px)
padding 16px
@media (min-width 600px)
padding 32px
</style>
@@ -0,0 +1,68 @@
<template>
<mk-ui>
<span slot="header">%fa:list%%i18n:@title%</span>
<template slot="func"><button @click="fn">%fa:plus%</button></template>
<main>
<ul>
<li v-for="list in lists" :key="list.id"><router-link :to="`/i/lists/${list.id}`">{{ list.title }}</router-link></li>
</ul>
</main>
</mk-ui>
</template>
<script lang="ts">
import Vue from 'vue';
import Progress from '../../../common/scripts/loading';
export default Vue.extend({
data() {
return {
fetching: true,
lists: []
};
},
mounted() {
document.title = 'Misskey | %i18n:@title%';
Progress.start();
(this as any).api('users/lists/list').then(lists => {
this.fetching = false;
this.lists = lists;
Progress.done();
});
},
methods: {
fn() {
(this as any).apis.input({
title: '%i18n:@enter-list-name%',
}).then(async title => {
const list = await (this as any).api('users/lists/create', {
title
});
this.$router.push('/i/lists/' + list.id);
});
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
main
width 100%
max-width 680px
margin 0 auto
padding 8px
@media (min-width 500px)
padding 16px
@media (min-width 600px)
padding 32px
</style>
@@ -184,7 +184,6 @@ root(isDark)
> .mk-follow-button > .mk-follow-button
float right float right
height 40px
> .title > .title
margin 8px 0 margin 8px 0
@@ -9,6 +9,7 @@
<header> <header>
<select v-model="widgetAdderSelected"> <select v-model="widgetAdderSelected">
<option value="profile">%i18n:common.widgets.profile%</option> <option value="profile">%i18n:common.widgets.profile%</option>
<option value="analog-clock">%i18n:common.widgets.analog-clock%</option>
<option value="calendar">%i18n:common.widgets.calendar%</option> <option value="calendar">%i18n:common.widgets.calendar%</option>
<option value="activity">%i18n:common.widgets.activity%</option> <option value="activity">%i18n:common.widgets.activity%</option>
<option value="rss">%i18n:common.widgets.rss%</option> <option value="rss">%i18n:common.widgets.rss%</option>

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

+87
View File
@@ -0,0 +1,87 @@
import * as mongo from 'mongodb';
import * as deepcopy from 'deepcopy';
import db from '../db/mongodb';
import { pack as packUser } from './user';
const FollowRequest = db.get<IFollowRequest>('followRequests');
FollowRequest.createIndex(['followerId', 'followeeId'], { unique: true });
export default FollowRequest;
export type IFollowRequest = {
_id: mongo.ObjectID;
createdAt: Date;
followeeId: mongo.ObjectID;
followerId: mongo.ObjectID;
// 非正規化
_followee: {
host: string;
inbox?: string;
},
_follower: {
host: string;
inbox?: string;
}
};
/**
* FollowRequestを物理削除します
*/
export async function deleteFollowRequest(followRequest: string | mongo.ObjectID | IFollowRequest) {
let f: IFollowRequest;
// Populate
if (mongo.ObjectID.prototype.isPrototypeOf(followRequest)) {
f = await FollowRequest.findOne({
_id: followRequest
});
} else if (typeof followRequest === 'string') {
f = await FollowRequest.findOne({
_id: new mongo.ObjectID(followRequest)
});
} else {
f = followRequest as IFollowRequest;
}
if (f == null) return;
// このFollowingを削除
await FollowRequest.remove({
_id: f._id
});
}
/**
* Pack a request for API response
*/
export const pack = (
request: any,
me?: any
) => new Promise<any>(async (resolve, reject) => {
let _request: any;
// Populate the request if 'request' is ID
if (mongo.ObjectID.prototype.isPrototypeOf(request)) {
_request = await FollowRequest.findOne({
_id: request
});
} else if (typeof request === 'string') {
_request = await FollowRequest.findOne({
_id: new mongo.ObjectID(request)
});
} else {
_request = deepcopy(request);
}
// Rename _id to id
_request.id = _request._id;
delete _request._id;
// Populate follower
_request.follower = await packUser(_request.followerId, me);
// Populate followee
_request.followee = await packUser(_request.followeeId, me);
resolve(_request);
});
+1
View File
@@ -77,6 +77,7 @@ export type INote = {
host: string; host: string;
inbox?: string; inbox?: string;
}; };
_replyIds?: mongo.ObjectID[];
}; };
/** /**
+1
View File
@@ -111,6 +111,7 @@ export const pack = (notification: any) => new Promise<any>(async (resolve, reje
switch (_notification.type) { switch (_notification.type) {
case 'follow': case 'follow':
case 'receiveFollowRequest':
// nope // nope
break; break;
case 'mention': case 'mention':
+42 -2
View File
@@ -22,6 +22,7 @@ import FollowedLog, { deleteFollowedLog } from './followed-log';
import SwSubscription, { deleteSwSubscription } from './sw-subscription'; import SwSubscription, { deleteSwSubscription } from './sw-subscription';
import Notification, { deleteNotification } from './notification'; import Notification, { deleteNotification } from './notification';
import UserList, { deleteUserList } from './user-list'; import UserList, { deleteUserList } from './user-list';
import FollowRequest, { deleteFollowRequest } from './follow-request';
const User = db.get<IUser>('users'); const User = db.get<IUser>('users');
@@ -50,7 +51,22 @@ type IUserBase = {
data: any; data: any;
description: string; description: string;
pinnedNoteId: mongo.ObjectID; pinnedNoteId: mongo.ObjectID;
/**
*
*/
isSuspended: boolean; isSuspended: boolean;
/**
*
*/
isLocked: boolean;
/**
*
*/
pendingReceivedFollowRequestsCount: number;
host: string; host: string;
}; };
@@ -84,6 +100,8 @@ export interface ILocalUser extends IUserBase {
twoFactorTempSecret?: string; twoFactorTempSecret?: string;
clientSettings: any; clientSettings: any;
settings: any; settings: any;
hasUnreadNotification: boolean;
hasUnreadMessagingMessage: boolean;
} }
export interface IRemoteUser extends IUserBase { export interface IRemoteUser extends IUserBase {
@@ -238,6 +256,16 @@ export async function deleteUser(user: string | mongo.ObjectID | IUser) {
await Following.find({ followeeId: u._id }) await Following.find({ followeeId: u._id })
).map(x => deleteFollowing(x))); ).map(x => deleteFollowing(x)));
// このユーザーのFollowRequestをすべて削除
await Promise.all((
await FollowRequest.find({ followerId: u._id })
).map(x => deleteFollowRequest(x)));
// このユーザーへのFollowRequestをすべて削除
await Promise.all((
await FollowRequest.find({ followeeId: u._id })
).map(x => deleteFollowRequest(x)));
// このユーザーのFollowingLogをすべて削除 // このユーザーのFollowingLogをすべて削除
await Promise.all(( await Promise.all((
await FollowingLog.find({ userId: u._id }) await FollowingLog.find({ userId: u._id })
@@ -387,12 +415,13 @@ export const pack = (
if (!meId || !meId.equals(_user.id) || !opts.detail) { if (!meId || !meId.equals(_user.id) || !opts.detail) {
delete _user.avatarId; delete _user.avatarId;
delete _user.bannerId; delete _user.bannerId;
delete _user.driveCapacity; delete _user.driveCapacity;
delete _user.hasUnreadMessagingMessage;
delete _user.hasUnreadNotification;
} }
if (meId && !meId.equals(_user.id)) { if (meId && !meId.equals(_user.id)) {
const [following1, following2, mute] = await Promise.all([ const [following1, following2, followReq1, followReq2, mute] = await Promise.all([
Following.findOne({ Following.findOne({
followerId: meId, followerId: meId,
followeeId: _user.id followeeId: _user.id
@@ -401,6 +430,14 @@ export const pack = (
followerId: _user.id, followerId: _user.id,
followeeId: meId followeeId: meId
}), }),
_user.isLocked ? FollowRequest.findOne({
followerId: meId,
followeeId: _user.id
}) : Promise.resolve(null),
FollowRequest.findOne({
followerId: _user.id,
followeeId: meId
}),
Mute.findOne({ Mute.findOne({
muterId: meId, muterId: meId,
muteeId: _user.id muteeId: _user.id
@@ -411,6 +448,9 @@ export const pack = (
_user.isFollowing = following1 !== null; _user.isFollowing = following1 !== null;
_user.isStalking = following1 && following1.stalk; _user.isStalking = following1 && following1.stalk;
_user.hasPendingFollowRequestFromYou = followReq1 !== null;
_user.hasPendingFollowRequestToYou = followReq2 !== null;
// Whether the user is followed // Whether the user is followed
_user.isFollowed = following2 !== null; _user.isFollowed = following2 !== null;
+8
View File
@@ -3,6 +3,7 @@ import Notification from '../models/notification';
import Mute from '../models/mute'; import Mute from '../models/mute';
import { pack } from '../models/notification'; import { pack } from '../models/notification';
import stream from './stream'; import stream from './stream';
import User from '../models/user';
export default ( export default (
notifiee: mongo.ObjectID, notifiee: mongo.ObjectID,
@@ -29,6 +30,13 @@ export default (
stream(notifiee, 'notification', stream(notifiee, 'notification',
await pack(notification)); await pack(notification));
// Update flag
User.update({ _id: notifiee }, {
$set: {
hasUnreadNotification: true
}
});
// 3秒経っても(今回作成した)通知が既読にならなかったら「未読の通知がありますよ」イベントを発行する // 3秒経っても(今回作成した)通知が既読にならなかったら「未読の通知がありますよ」イベントを発行する
setTimeout(async () => { setTimeout(async () => {
const fresh = await Notification.findOne({ _id: notification._id }, { isRead: true }); const fresh = await Notification.findOne({ _id: notification._id }, { isRead: true });
@@ -0,0 +1,27 @@
import * as mongo from 'mongodb';
import User, { IRemoteUser } from '../../../../models/user';
import config from '../../../../config';
import accept from '../../../../services/following/requests/accept';
import { IFollow } from '../../type';
export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
if (!id.startsWith(config.url + '/')) {
return null;
}
const follower = await User.findOne({
_id: new mongo.ObjectID(id.split('/').pop())
});
if (follower === null) {
throw new Error('follower not found');
}
if (follower.host != null) {
throw new Error('フォローリクエストしたユーザーはローカルユーザーではありません');
}
await accept(actor, follower);
};
@@ -0,0 +1,35 @@
import * as debug from 'debug';
import Resolver from '../../resolver';
import { IRemoteUser } from '../../../../models/user';
import acceptFollow from './follow';
import { IAccept } from '../../type';
const log = debug('misskey:activitypub');
export default async (actor: IRemoteUser, activity: IAccept): Promise<void> => {
const uri = activity.id || activity;
log(`Accept: ${uri}`);
const resolver = new Resolver();
let object;
try {
object = await resolver.resolve(activity.object);
} catch (e) {
log(`Resolution failed: ${e}`);
throw e;
}
switch (object.type) {
case 'Follow':
acceptFollow(actor, object);
break;
default:
console.warn(`Unknown accept type: ${object.type}`);
break;
}
};
+1 -1
View File
@@ -23,5 +23,5 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
throw new Error('フォローしようとしているユーザーはローカルユーザーではありません'); throw new Error('フォローしようとしているユーザーはローカルユーザーではありません');
} }
await follow(actor, followee, activity); await follow(actor, followee);
}; };
+7 -1
View File
@@ -6,6 +6,8 @@ import follow from './follow';
import undo from './undo'; import undo from './undo';
import like from './like'; import like from './like';
import announce from './announce'; import announce from './announce';
import accept from './accept';
import reject from './reject';
const self = async (actor: IRemoteUser, activity: Object): Promise<void> => { const self = async (actor: IRemoteUser, activity: Object): Promise<void> => {
switch (activity.type) { switch (activity.type) {
@@ -22,7 +24,11 @@ const self = async (actor: IRemoteUser, activity: Object): Promise<void> => {
break; break;
case 'Accept': case 'Accept':
// noop await accept(actor, activity);
break;
case 'Reject':
await reject(actor, activity);
break; break;
case 'Announce': case 'Announce':
@@ -0,0 +1,27 @@
import * as mongo from 'mongodb';
import User, { IRemoteUser } from '../../../../models/user';
import config from '../../../../config';
import reject from '../../../../services/following/requests/reject';
import { IFollow } from '../../type';
export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
if (!id.startsWith(config.url + '/')) {
return null;
}
const follower = await User.findOne({
_id: new mongo.ObjectID(id.split('/').pop())
});
if (follower === null) {
throw new Error('follower not found');
}
if (follower.host != null) {
throw new Error('フォローリクエストしたユーザーはローカルユーザーではありません');
}
await reject(actor, follower);
};
@@ -0,0 +1,35 @@
import * as debug from 'debug';
import Resolver from '../../resolver';
import { IRemoteUser } from '../../../../models/user';
import rejectFollow from './follow';
import { IReject } from '../../type';
const log = debug('misskey:activitypub');
export default async (actor: IRemoteUser, activity: IReject): Promise<void> => {
const uri = activity.id || activity;
log(`Reject: ${uri}`);
const resolver = new Resolver();
let object;
try {
object = await resolver.resolve(activity.object);
} catch (e) {
log(`Resolution failed: ${e}`);
throw e;
}
switch (object.type) {
case 'Follow':
rejectFollow(actor, object);
break;
default:
console.warn(`Unknown reject type: ${object.type}`);
break;
}
};
+12 -1
View File
@@ -2,7 +2,9 @@ import * as mongo from 'mongodb';
import User, { IRemoteUser } from '../../../../models/user'; import User, { IRemoteUser } from '../../../../models/user';
import config from '../../../../config'; import config from '../../../../config';
import unfollow from '../../../../services/following/delete'; import unfollow from '../../../../services/following/delete';
import cancelRequest from '../../../../services/following/requests/cancel';
import { IFollow } from '../../type'; import { IFollow } from '../../type';
import FollowRequest from '../../../../models/follow-request';
export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => { export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
const id = typeof activity.object == 'string' ? activity.object : activity.object.id; const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
@@ -23,5 +25,14 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
throw new Error('フォロー解除しようとしているユーザーはローカルユーザーではありません'); throw new Error('フォロー解除しようとしているユーザーはローカルユーザーではありません');
} }
await unfollow(actor, followee, activity); const req = await FollowRequest.findOne({
followerId: actor._id,
followeeId: followee._id
});
if (req) {
await cancelRequest(actor, followee);
} else {
await unfollow(actor, followee);
}
}; };
+1
View File
@@ -93,6 +93,7 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs
notesCount, notesCount,
name: person.name, name: person.name,
driveCapacity: 1024 * 1024 * 8, // 8MiB driveCapacity: 1024 * 1024 * 8, // 8MiB
isLocked: person.manuallyApprovesFollowers,
username: person.preferredUsername, username: person.preferredUsername,
usernameLower: person.preferredUsername.toLowerCase(), usernameLower: person.preferredUsername.toLowerCase(),
host, host,
+4 -4
View File
@@ -1,8 +1,8 @@
import config from '../../../config'; import config from '../../../config';
import { IRemoteUser, ILocalUser } from '../../../models/user'; import { IUser, isLocalUser } from '../../../models/user';
export default (follower: ILocalUser, followee: IRemoteUser) => ({ export default (follower: IUser, followee: IUser) => ({
type: 'Follow', type: 'Follow',
actor: `${config.url}/users/${follower._id}`, actor: isLocalUser(follower) ? `${config.url}/users/${follower._id}` : follower.uri,
object: followee.uri object: isLocalUser(followee) ? `${config.url}/users/${followee._id}` : followee.uri
}); });
+3 -1
View File
@@ -1,8 +1,9 @@
import renderImage from './image'; import renderImage from './image';
import renderKey from './key'; import renderKey from './key';
import config from '../../../config'; import config from '../../../config';
import { ILocalUser } from '../../../models/user';
export default user => { export default (user: ILocalUser) => {
const id = `${config.url}/users/${user._id}`; const id = `${config.url}/users/${user._id}`;
return { return {
@@ -17,6 +18,7 @@ export default user => {
summary: user.description, summary: user.description,
icon: user.avatarId && renderImage({ _id: user.avatarId }), icon: user.avatarId && renderImage({ _id: user.avatarId }),
image: user.bannerId && renderImage({ _id: user.bannerId }), image: user.bannerId && renderImage({ _id: user.bannerId }),
manuallyApprovesFollowers: user.isLocked,
publicKey: renderKey(user) publicKey: renderKey(user)
}; };
}; };

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