Compare commits

..

470 Commits

Author SHA1 Message Date
syuilo ae36bf301a Merge branch 'develop' 2018-08-30 22:16:04 +09:00
syuilo 6a5a9de795 8.16.0 2018-08-30 22:15:41 +09:00
syuilo f0abc46429 開発モードで警告を表示するようにするなど 2018-08-30 22:10:29 +09:00
syuilo 9fd4f5ee0a Merge pull request #2542 from syuilo/l10n_develop
New Crowdin translations
2018-08-30 21:44:00 +09:00
syuilo 5e202c3def Merge pull request #2547 from mei23/mei-0830-httpsignature
HTTP Signature 周辺の修正
2018-08-30 21:11:43 +09:00
mei23 48223c1c76 Validate host in activity 2018-08-30 20:53:41 +09:00
mei23 dddf7834cc Add host/digest to HTTP signature 2018-08-30 20:52:35 +09:00
syuilo 66ef30b2cc New translations ja-JP.yml (Japanese, Kansai) 2018-08-30 18:38:30 +09:00
syuilo f802fe57b9 Merge pull request #2539 from syuilo/greenkeeper/@types/websocket-0.0.40
Update @types/websocket to the latest version 🚀
2018-08-30 09:28:59 +09:00
syuilo ead884ce89 Merge pull request #2538 from syuilo/greenkeeper/@types/uuid-3.4.4
Update @types/uuid to the latest version 🚀
2018-08-30 09:28:50 +09:00
greenkeeper[bot] 6a87e9f690 fix(package): update @types/websocket to version 0.0.40 2018-08-30 00:18:42 +00:00
greenkeeper[bot] 5b943722fb fix(package): update @types/uuid to version 3.4.4 2018-08-30 00:16:12 +00:00
syuilo 4d92b14308 Merge pull request #2527 from syuilo/l10n_develop
New Crowdin translations
2018-08-30 08:44:33 +09:00
syuilo 167c96d14e New translations ja-JP.yml (English) 2018-08-30 04:01:04 +09:00
syuilo 8a42373753 Merge pull request #2534 from syuilo/greenkeeper/summaly-2.2.0
Update summaly to the latest version 🚀
2018-08-30 03:57:44 +09:00
syuilo c1751a9b84 Merge pull request #2535 from syuilo/greenkeeper/vue-js-modal-1.3.24
Update vue-js-modal to the latest version 🚀
2018-08-30 03:57:37 +09:00
syuilo 4e11da98d9 Merge branch 'develop' into l10n_develop 2018-08-30 03:56:51 +09:00
syuilo 1b7d98c17e 🎨 2018-08-30 03:56:04 +09:00
syuilo 3038434712 Fix bug 2018-08-30 03:53:26 +09:00
syuilo 117ab633a1 Improve API 2018-08-30 03:49:52 +09:00
syuilo e50fa4762d Clean up 2018-08-30 03:37:23 +09:00
syuilo aed1e839ba Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-30 03:32:45 +09:00
syuilo 00f2974a2a Refactoring 2018-08-30 03:32:42 +09:00
greenkeeper[bot] 073c96af47 fix(package): update vue-js-modal to version 1.3.24 2018-08-29 14:02:49 +00:00
syuilo 71da498364 New translations ja-JP.yml (French) 2018-08-29 22:04:54 +09:00
syuilo 8e9c11f160 New translations ja-JP.yml (French) 2018-08-29 21:54:19 +09:00
greenkeeper[bot] 98f6b23249 fix(package): update summaly to version 2.2.0 2018-08-29 12:27:33 +00:00
syuilo 89288d8e0d Merge pull request #2530 from mei23/mei-0829-apvalidate
ActivityPub Personのホストの検証等の修正
2018-08-29 17:32:33 +09:00
syuilo 724121eeaa New translations ja-JP.yml (Japanese, Kansai) 2018-08-29 17:32:12 +09:00
syuilo edee95a5ca New translations ja-JP.yml (Spanish) 2018-08-29 17:32:08 +09:00
syuilo 0c2361bf72 New translations ja-JP.yml (Russian) 2018-08-29 17:32:05 +09:00
syuilo 92f8dc48e3 New translations ja-JP.yml (Portuguese) 2018-08-29 17:32:02 +09:00
syuilo 06a0fff4b0 New translations ja-JP.yml (Polish) 2018-08-29 17:31:58 +09:00
syuilo d55e4621ac New translations ja-JP.yml (Korean) 2018-08-29 17:31:55 +09:00
syuilo bc6bda3714 New translations ja-JP.yml (Italian) 2018-08-29 17:31:53 +09:00
syuilo d3aafd3f13 New translations ja-JP.yml (German) 2018-08-29 17:31:50 +09:00
syuilo 1a508de1c4 New translations ja-JP.yml (French) 2018-08-29 17:31:46 +09:00
syuilo 768cc0aff5 New translations ja-JP.yml (English) 2018-08-29 17:31:42 +09:00
syuilo 67f4c1f429 New translations ja-JP.yml (Chinese Simplified) 2018-08-29 17:31:39 +09:00
syuilo 2d4ceec0a5 New translations ja-JP.yml (Catalan) 2018-08-29 17:31:35 +09:00
syuilo 3e2a0cd89a Add missing l10n 2018-08-29 17:20:51 +09:00
syuilo d1f4f2f663 New translations ja-JP.yml (French) 2018-08-29 17:11:12 +09:00
mei23 6e3bf26cad Validate host on Person 2018-08-29 16:10:03 +09:00
syuilo 672377f116 Merge pull request #2524 from l2dy/https-maps
Use https:// for maps.google.com links
2018-08-29 14:46:09 +09:00
syuilo 80ee5afba7 Merge pull request #2523 from syuilo/l10n_develop
New Crowdin translations
2018-08-29 13:35:37 +09:00
Zero King f55fcd3305 Use https:// for maps.google.com links 2018-08-29 04:34:53 +00:00
syuilo 64fc14ade5 New translations ja-JP.yml (English) 2018-08-29 13:31:12 +09:00
syuilo 807f245657 Merge pull request #2522 from syuilo/greenkeeper/@types/node-10.9.3
Update @types/node to the latest version 🚀
2018-08-29 12:50:11 +09:00
greenkeeper[bot] 62f966dc27 fix(package): update @types/node to version 10.9.3 2018-08-29 02:19:40 +00:00
syuilo 09f97bf7a7 Merge pull request #2521 from syuilo/greenkeeper/systeminformation-3.44.2
fix(package): update systeminformation to version 3.44.2
2018-08-29 10:35:14 +09:00
syuilo 69460e494c Merge pull request #2520 from syuilo/greenkeeper/vue-js-modal-1.3.23
fix(package): update vue-js-modal to version 1.3.23
2018-08-29 10:34:53 +09:00
greenkeeper[bot] 9bef723346 fix(package): update systeminformation to version 3.44.2
Closes #2519
2018-08-29 01:08:49 +00:00
greenkeeper[bot] b99eabb2cf fix(package): update vue-js-modal to version 1.3.23
Closes #2517
2018-08-29 00:57:08 +00:00
syuilo 17be3f3d0f Merge pull request #2470 from syuilo/l10n_develop
New Crowdin translations
2018-08-29 08:41:27 +09:00
syuilo 05fe2cb173 New translations ja-JP.yml (English) 2018-08-29 07:21:30 +09:00
syuilo 428be14c27 New translations ja-JP.yml (Japanese, Kansai) 2018-08-29 07:11:58 +09:00
syuilo a04fa8441e New translations ja-JP.yml (Spanish) 2018-08-29 07:11:55 +09:00
syuilo 7bcfa84e1a New translations ja-JP.yml (Russian) 2018-08-29 07:11:53 +09:00
syuilo 1cc5986df3 New translations ja-JP.yml (Portuguese) 2018-08-29 07:11:50 +09:00
syuilo 7aa5d03875 New translations ja-JP.yml (Polish) 2018-08-29 07:11:48 +09:00
syuilo a59fbfac19 New translations ja-JP.yml (Korean) 2018-08-29 07:11:46 +09:00
syuilo 677f9ee8f6 New translations ja-JP.yml (Italian) 2018-08-29 07:11:43 +09:00
syuilo f4a16be2b4 New translations ja-JP.yml (German) 2018-08-29 07:11:41 +09:00
syuilo 46b967ee4a New translations ja-JP.yml (French) 2018-08-29 07:11:39 +09:00
syuilo 78568accd1 New translations ja-JP.yml (English) 2018-08-29 07:11:36 +09:00
syuilo e9f20a0fad New translations ja-JP.yml (Chinese Simplified) 2018-08-29 07:11:34 +09:00
syuilo bbd9894e6b New translations ja-JP.yml (Catalan) 2018-08-29 07:11:31 +09:00
syuilo f92745e381 デフォルトで時計を表示するように 2018-08-29 07:10:42 +09:00
syuilo 2762b78bcc モバイルでもサウンドの設定を行えるように 2018-08-29 07:05:56 +09:00
syuilo 2d4ed2c8c2 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-29 07:00:02 +09:00
syuilo 2de8e8c358 Fix bug 2018-08-29 06:59:43 +09:00
syuilo eb7b638db3 Merge pull request #2516 from syuilo/greenkeeper/@types/elasticsearch-5.0.26
Update @types/elasticsearch to the latest version 🚀
2018-08-29 06:52:00 +09:00
syuilo 321e851b26 Fix bug 2018-08-29 06:46:05 +09:00
greenkeeper[bot] f8340be3bf fix(package): update @types/elasticsearch to version 5.0.26 2018-08-28 20:36:04 +00:00
syuilo 02341ceb6e Merge pull request #2512 from Hiramiya/avatarbannerfiletypes
Fix linting errors
2018-08-28 18:08:22 +09:00
Nasha Hiramiya 3dcdd7a5d7 Fix linting errors 2018-08-28 09:44:49 +01:00
syuilo b721d049c6 Merge pull request #2484 from syuilo/greenkeeper/nan-2.11.0
Update nan to the latest version 🚀
2018-08-28 08:09:41 +09:00
syuilo e518fff944 Merge pull request #2483 from syuilo/greenkeeper/systeminformation-3.44.0
Update systeminformation to the latest version 🚀
2018-08-28 08:09:22 +09:00
syuilo 048128c7e1 Merge pull request #2510 from syuilo/greenkeeper/style-loader-0.23.0
Update style-loader to the latest version 🚀
2018-08-28 08:09:09 +09:00
syuilo d3717449c2 Merge pull request #2508 from syuilo/greenkeeper/vue-js-modal-1.3.20
Update vue-js-modal to the latest version 🚀
2018-08-28 08:08:54 +09:00
syuilo 04de6218d3 Merge pull request #2495 from syuilo/greenkeeper/vue-loader-15.4.1
Update vue-loader to the latest version 🚀
2018-08-28 08:08:46 +09:00
syuilo 0082473d78 Merge pull request #2502 from acid-chicken/patch-autogen
[AUTOMATED] Update README.md
2018-08-28 08:07:54 +09:00
syuilo 77baca8e6e Merge pull request #2511 from Hiramiya/avatarbannerfiletypes
Prevent setting non-image files as avatar/banner
2018-08-28 07:41:50 +09:00
syuilo 6a7169630c Merge pull request #2509 from Hiramiya/updateavatarfix
Update update-avatar.ts to match update-banner.ts behaviour
2018-08-28 07:39:35 +09:00
syuilo 6b2089e043 Merge pull request #2507 from Hiramiya/darkmode
Fix various darkmode elements on user pages
2018-08-28 07:38:49 +09:00
Hiramiya 14ad3af30d Add "invalid-filetype" translation 2018-08-27 20:04:39 +01:00
Hiramiya e7e6d833b7 Restrict banner filetypes 2018-08-27 20:03:48 +01:00
Hiramiya d1a9561135 Restrict avatar filetypes 2018-08-27 20:03:28 +01:00
greenkeeper[bot] c7bda6f908 fix(package): update style-loader to version 0.23.0 2018-08-27 18:05:30 +00:00
Hiramiya ef43721e32 Update update-avatar.ts 2018-08-27 17:29:21 +01:00
greenkeeper[bot] ba6cd874aa fix(package): update vue-js-modal to version 1.3.20 2018-08-27 15:41:07 +00:00
Hiramiya f283d2423f Fix border-radius on friends 2018-08-27 16:06:31 +01:00
Hiramiya c07f668f14 Fix border-radius on photos 2018-08-27 16:06:04 +01:00
Hiramiya 596524a63c Merge pull request #1 from Hiramiya/develop
Changes to darkmode on user page
2018-08-27 15:58:22 +01:00
Hiramiya 975e4dd285 Remove temp border change 2018-08-27 15:51:31 +01:00
Hiramiya 09b05c8552 DarkMode user page bottom nav 2018-08-27 15:46:27 +01:00
Hiramiya 530ee6f80e DarkMode User Photos 2018-08-27 15:45:35 +01:00
Hiramiya 6ad31dca76 DarkMode user friends 2018-08-27 15:43:19 +01:00
syuilo d423f8ae57 Merge branch 'develop' 2018-08-27 04:56:57 +09:00
syuilo 8e5ce7f8e3 8.15.0 2018-08-27 04:56:38 +09:00
syuilo 33dfc21e4b Fix bug 2018-08-27 04:50:52 +09:00
Acid Chicken (硫酸鶏) 3266f3948a Update README.md [AUTOGEN] 2018-08-26 17:55:06 +09:00
syuilo 7259887124 Merge pull request #2500 from syuilo/delete-script
Remove delete-invalid-users.js
2018-08-26 14:30:24 +09:00
Aya Morisawa 800de03187 Remove delete-invalid-users.js 2018-08-26 14:29:12 +09:00
syuilo 78ba305e5c Merge pull request #2498 from syuilo/ends-with
Use endsWith for readability
2018-08-26 14:03:06 +09:00
Aya Morisawa bfed1475bb Use endsWith for readability 2018-08-26 13:55:39 +09:00
syuilo 3281d263c4 New translations ja-JP.yml (Portuguese) 2018-08-26 13:50:55 +09:00
syuilo a9a1798e3a New translations ja-JP.yml (Portuguese) 2018-08-26 13:40:51 +09:00
greenkeeper[bot] 6806eafaed fix(package): update vue-loader to version 15.4.1 2018-08-26 02:26:22 +00:00
syuilo 3e20ea5b2e Merge pull request #2494 from xps2/donation-from-config
donation、configのmaintainerを参照するよう変更
2018-08-26 10:32:41 +09:00
xps2 3f30a69b8b fix 2018-08-26 10:29:24 +09:00
xps2 2d2e16d9f6 donation、configのmaintainerを参照するよう変更 2018-08-26 10:14:43 +09:00
syuilo 9c32118b77 Merge branch 'develop' 2018-08-26 02:33:29 +09:00
syuilo ecf2eb4738 8.14.0 2018-08-26 02:33:04 +09:00
syuilo 3d754ea7eb New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 02:21:08 +09:00
syuilo f755f24560 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 02:11:06 +09:00
syuilo 699879d95d Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-26 02:05:46 +09:00
syuilo 6677508ba7 Fix #2428 2018-08-26 02:05:42 +09:00
syuilo 58da32358b Fix indent 2018-08-26 02:05:13 +09:00
syuilo 491bc75095 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 02:01:04 +09:00
syuilo b9eafeee3f Merge pull request #2486 from syuilo/fix-fa-pen
Use pencil-alt instead of pen
2018-08-26 01:57:39 +09:00
syuilo c56ff5d88d Add sunnaly proxy option 2018-08-26 01:56:21 +09:00
syuilo f5dd83a44a New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 01:51:08 +09:00
syuilo 9a295a85b1 Merge pull request #2491 from xps2/fix-repository-feedback-url
リポジトリとフィードバックのURLが設定ファイルから反映されないのを修正
2018-08-26 01:23:41 +09:00
syuilo 8e06d93c31 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 01:21:31 +09:00
syuilo 1a42200137 New translations ja-JP.yml (Spanish) 2018-08-26 01:21:29 +09:00
syuilo bbf33d2475 New translations ja-JP.yml (Russian) 2018-08-26 01:21:27 +09:00
syuilo 93203ebfd1 New translations ja-JP.yml (Portuguese) 2018-08-26 01:21:24 +09:00
syuilo 67053eeaa0 New translations ja-JP.yml (Polish) 2018-08-26 01:21:22 +09:00
syuilo 43baf4ad6a New translations ja-JP.yml (Korean) 2018-08-26 01:21:20 +09:00
syuilo 5b2a36e47b New translations ja-JP.yml (Italian) 2018-08-26 01:21:18 +09:00
syuilo 2a0862a24e New translations ja-JP.yml (German) 2018-08-26 01:21:16 +09:00
syuilo ce31027b2e New translations ja-JP.yml (French) 2018-08-26 01:21:13 +09:00
syuilo 3f66c77821 New translations ja-JP.yml (English) 2018-08-26 01:21:11 +09:00
syuilo bc713656ec New translations ja-JP.yml (Chinese Simplified) 2018-08-26 01:21:09 +09:00
syuilo 46d89faebc New translations ja-JP.yml (Catalan) 2018-08-26 01:21:07 +09:00
syuilo 7135c0e308 Merge pull request #2487 from syuilo/clock-visibility-option
Make clock on header optional
2018-08-26 01:20:29 +09:00
syuilo 1962bfb4a5 Merge pull request #2489 from mei23/mei-0825-apresolvekey
リモートユーザー解決時のURIがまちがっているのを修正
2018-08-26 01:19:07 +09:00
syuilo a1fca2550e Merge pull request #2488 from syuilo/refactor-string
Use startsWith and endsWith for readability
2018-08-26 01:18:34 +09:00
syuilo c17f99b7a5 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 01:11:06 +09:00
syuilo 7cd76d60c2 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 01:01:41 +09:00
xps2 fa7c8cfe5b リポジトリとフィードバックのURLが設定ファイルから反映されないのを修正 2018-08-26 01:00:13 +09:00
syuilo 05fb8d35af New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 00:51:24 +09:00
syuilo eaa827e2d9 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 00:41:40 +09:00
syuilo f365ea4585 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 00:34:44 +09:00
syuilo 5d2e43ffb9 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 00:21:08 +09:00
syuilo e9a97ed99a New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 00:11:42 +09:00
syuilo fe98102600 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 00:01:48 +09:00
syuilo aae8845664 New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 23:53:11 +09:00
syuilo 81a4388ecc New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 23:41:12 +09:00
syuilo be3ab026fd New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 23:31:03 +09:00
syuilo f92f9d8cb0 New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 23:11:12 +09:00
Aya Morisawa 08a59591ae Use startsWith and endsWith for readability 2018-08-25 22:42:26 +09:00
mei23 a09a244242 Fix resolvePerson key 2018-08-25 22:25:40 +09:00
Aya Morisawa 483a61d90d Make clock on header optional 2018-08-25 22:24:58 +09:00
Aya Morisawa 385fb7586b Use pencil-alt instead of pen 2018-08-25 22:07:10 +09:00
greenkeeper[bot] c624da70ef fix(package): update nan to version 2.11.0 2018-08-25 12:45:23 +00:00
syuilo 675668c395 New translations ja-JP.yml (French) 2018-08-25 20:41:14 +09:00
greenkeeper[bot] bc9c7efe85 fix(package): update systeminformation to version 3.44.0 2018-08-25 11:19:17 +00:00
syuilo 2488d40421 Merge pull request #2482 from syuilo/develop
8.13.0
2018-08-25 19:46:50 +09:00
syuilo bf7875bfaa Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-25 19:46:20 +09:00
syuilo a84fa30774 8.13.0 2018-08-25 19:46:12 +09:00
syuilo c19a763b3d Merge pull request #2481 from syuilo/greenkeeper/systeminformation-3.43.0
fix(package): update systeminformation to version 3.43.0
2018-08-25 19:45:31 +09:00
syuilo 0875460974 ユーザーのアイコンにサムネイルを使うように
Closes #2365
2018-08-25 19:44:47 +09:00
syuilo f0b08d3936 Add brackets 2018-08-25 19:39:06 +09:00
syuilo 16520c7b4c Merge pull request #2476 from acid-chicken/patch-4
Fix #2392
2018-08-25 19:37:35 +09:00
syuilo 65549d06d9 ✌️ 2018-08-25 19:34:54 +09:00
syuilo 52da66d550 New translations ja-JP.yml (English) 2018-08-25 18:12:08 +09:00
syuilo 251c3c3fe4 New translations ja-JP.yml (English) 2018-08-25 18:01:25 +09:00
greenkeeper[bot] ce2d2a10c1 fix(package): update systeminformation to version 3.43.0
Closes #2477
2018-08-25 08:56:01 +00:00
syuilo 3b6d242ef6 New translations ja-JP.yml (English) 2018-08-25 17:51:28 +09:00
Acid Chicken (硫酸鶏) 0ebe801af4 Update boot.js 2018-08-25 17:06:40 +09:00
syuilo 05daa7ac7d Merge pull request #2475 from syuilo/develop
8.12.0
2018-08-25 16:35:29 +09:00
syuilo 990a583e5e 8.12.0 2018-08-25 16:34:41 +09:00
syuilo d9b02a18bf Merge pull request #2474 from mei23/mei-0825-appleroma2
Pleromaとつながらないのを修正
2018-08-25 16:33:02 +09:00
syuilo 30aae79e5c Merge pull request #2473 from syuilo/develop
8.11.1
2018-08-25 15:41:06 +09:00
syuilo a149c121fb 8.11.1 2018-08-25 15:40:47 +09:00
syuilo 47f4b51207 Fix bug 2018-08-25 15:40:22 +09:00
syuilo 79f4d886d0 Merge pull request #2472 from syuilo/develop
8.11.0
2018-08-25 15:34:33 +09:00
syuilo 2b556aba03 8.11.0 2018-08-25 15:34:10 +09:00
syuilo 4f62043b0c New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 15:31:30 +09:00
syuilo b1ae304c51 New translations ja-JP.yml (Spanish) 2018-08-25 15:31:28 +09:00
syuilo 425bc032d0 New translations ja-JP.yml (Russian) 2018-08-25 15:31:26 +09:00
syuilo 0156b75bde New translations ja-JP.yml (Portuguese) 2018-08-25 15:31:23 +09:00
syuilo 8bc8fc58de New translations ja-JP.yml (Polish) 2018-08-25 15:31:21 +09:00
syuilo 9bf847b1fb New translations ja-JP.yml (Korean) 2018-08-25 15:31:18 +09:00
syuilo 0b078d203b New translations ja-JP.yml (Italian) 2018-08-25 15:31:16 +09:00
syuilo df59018b47 New translations ja-JP.yml (German) 2018-08-25 15:31:14 +09:00
syuilo b2681dcb5d New translations ja-JP.yml (French) 2018-08-25 15:31:12 +09:00
syuilo 46fa471636 New translations ja-JP.yml (English) 2018-08-25 15:31:10 +09:00
syuilo 5f2c441996 New translations ja-JP.yml (Chinese Simplified) 2018-08-25 15:31:08 +09:00
syuilo a79cc42b26 New translations ja-JP.yml (Catalan) 2018-08-25 15:31:05 +09:00
syuilo 739c993911 Fix #2466 2018-08-25 15:30:48 +09:00
syuilo cb180e00de Merge pull request #2471 from syuilo/greenkeeper/@types/node-10.9.2
Update @types/node to the latest version 🚀
2018-08-25 15:26:25 +09:00
syuilo 4d46a61051 ✌️ 2018-08-25 15:26:13 +09:00
syuilo 81969ea8b2 🎨 2018-08-25 15:25:16 +09:00
mei23 ac474f3884 Send actor in Delete 2018-08-25 14:52:35 +09:00
mei23 a39aaf6eb1 Send actor in Undo Follow 2018-08-25 14:46:47 +09:00
mei23 68a7661f08 Create Note activity にも toとcc 2018-08-25 14:23:51 +09:00
mei23 ffcb2f755c Send actor in CreateNote, Announce 2018-08-25 14:12:44 +09:00
greenkeeper[bot] 366e0d6bde fix(package): update @types/node to version 10.9.2 2018-08-25 04:40:46 +00:00
mei23 b3a3238e43 HTTP Signature検証対象ヘッダにDateが含まれてなくても許容する 2018-08-25 13:40:12 +09:00
mei23 92828028db Add Activity id if missing 2018-08-25 13:11:54 +09:00
syuilo bd97e315ff New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 12:51:37 +09:00
syuilo 51083419f5 New translations ja-JP.yml (Spanish) 2018-08-25 12:51:35 +09:00
syuilo b23bfd4d86 New translations ja-JP.yml (Russian) 2018-08-25 12:51:32 +09:00
syuilo 7de3e847bd New translations ja-JP.yml (Portuguese) 2018-08-25 12:51:30 +09:00
syuilo 0d1a541dba New translations ja-JP.yml (Polish) 2018-08-25 12:51:27 +09:00
syuilo 2717109fe2 New translations ja-JP.yml (Korean) 2018-08-25 12:51:25 +09:00
syuilo 60ca0626ce New translations ja-JP.yml (Italian) 2018-08-25 12:51:23 +09:00
syuilo 15dae0ae65 New translations ja-JP.yml (German) 2018-08-25 12:51:20 +09:00
syuilo 1c680118a0 New translations ja-JP.yml (French) 2018-08-25 12:51:18 +09:00
syuilo ad5efbba59 New translations ja-JP.yml (English) 2018-08-25 12:51:16 +09:00
syuilo 6dc7baa5e9 New translations ja-JP.yml (Chinese Simplified) 2018-08-25 12:51:14 +09:00
syuilo c2b886e750 New translations ja-JP.yml (Catalan) 2018-08-25 12:51:10 +09:00
mei23 edb61e52c5 Use resolvable ActivityPub keyId 2018-08-25 12:46:06 +09:00
syuilo ded297b04c Merge pull request #2469 from syuilo/develop
8.10.0
2018-08-25 12:44:37 +09:00
syuilo 65e1d5978a Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-25 12:44:15 +09:00
syuilo 86e76358b1 8.10.0 2018-08-25 12:44:06 +09:00
syuilo 435e0257a4 Merge pull request #2468 from syuilo/l10n_develop
New Crowdin translations
2018-08-25 12:43:35 +09:00
syuilo 1c45cc808b Improve stats page 2018-08-25 12:43:18 +09:00
syuilo ed27a2f963 New translations ja-JP.yml (English) 2018-08-25 12:41:07 +09:00
mei23 1f53d1a149 Send Content-Type in ActivityPub request 2018-08-25 12:32:31 +09:00
syuilo 8295f6d7a3 New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 12:31:41 +09:00
syuilo b02f6341c9 New translations ja-JP.yml (Spanish) 2018-08-25 12:31:39 +09:00
syuilo f6d577d411 New translations ja-JP.yml (Russian) 2018-08-25 12:31:37 +09:00
syuilo db3e73318e New translations ja-JP.yml (Portuguese) 2018-08-25 12:31:35 +09:00
syuilo 29c2071711 New translations ja-JP.yml (Polish) 2018-08-25 12:31:33 +09:00
syuilo 3acd524d09 New translations ja-JP.yml (Korean) 2018-08-25 12:31:30 +09:00
syuilo dae65cc123 New translations ja-JP.yml (Italian) 2018-08-25 12:31:28 +09:00
syuilo 695f154d87 New translations ja-JP.yml (German) 2018-08-25 12:31:26 +09:00
syuilo 59dca9a812 New translations ja-JP.yml (French) 2018-08-25 12:31:23 +09:00
syuilo b9f04f8f53 New translations ja-JP.yml (English) 2018-08-25 12:31:20 +09:00
syuilo 0985f14f18 New translations ja-JP.yml (Chinese Simplified) 2018-08-25 12:31:18 +09:00
syuilo 56684dd7c3 New translations ja-JP.yml (Catalan) 2018-08-25 12:31:16 +09:00
syuilo 47a5f3bc67 チャートコンポーネントを分離するなど 2018-08-25 12:28:05 +09:00
syuilo 1c1e3009e9 ✌️ 2018-08-25 12:14:36 +09:00
syuilo c7c3f6999b Merge pull request #2465 from syuilo/develop
8.9.2
2018-08-25 11:11:00 +09:00
syuilo fb4aa9bc1c 8.9.2 2018-08-25 11:10:38 +09:00
syuilo ef57f5907b Fix bug 2018-08-25 11:10:27 +09:00
syuilo eff44f9cd1 Merge pull request #2464 from syuilo/develop
8.9.1
2018-08-25 10:28:47 +09:00
syuilo d7fa92d58f 8.9.1 2018-08-25 10:28:28 +09:00
syuilo 4e8033d5a4 Fix bug 2018-08-25 10:28:09 +09:00
syuilo 8a207d8311 Merge pull request #2461 from syuilo/develop
8.9.0
2018-08-25 08:41:16 +09:00
syuilo 94ba9c8437 8.9.0 2018-08-25 08:40:16 +09:00
syuilo 88c71c2998 #2451 2018-08-25 08:39:12 +09:00
syuilo 7b6e55047f #2460 2018-08-25 08:35:41 +09:00
syuilo 9d85d0bb08 Merge pull request #2411 from syuilo/l10n_develop
New Crowdin translations
2018-08-25 07:22:34 +09:00
syuilo 27ac0bbc00 Merge pull request #2429 from syuilo/greenkeeper/vue-js-modal-1.3.19
Update vue-js-modal to the latest version 🚀
2018-08-25 07:21:44 +09:00
syuilo affde9b4e2 Merge pull request #2459 from syuilo/greenkeeper/@types/node-10.9.1
fix(package): update @types/node to version 10.9.1
2018-08-25 07:21:35 +09:00
syuilo 88324b6dd9 Merge pull request #2432 from syuilo/greenkeeper/@types/sharp-0.17.10
Update @types/sharp to the latest version 🚀
2018-08-25 07:21:16 +09:00
syuilo 9b95ffe6c6 Merge pull request #2433 from syuilo/greenkeeper/@types/webpack-4.4.11
Update @types/webpack to the latest version 🚀
2018-08-25 07:21:08 +09:00
syuilo 6b137f8d69 Merge pull request #2458 from syuilo/master
Master
2018-08-25 07:20:38 +09:00
syuilo e78b2b0ab8 Merge pull request #2457 from mei23/mei-0825-apresolveuri3
リモートからのActivityに添付されている投稿は使用しないように変更
2018-08-25 07:07:46 +09:00
mei23 8b51428347 ActivityPub resolve で 添付のNoteを使用しないように 2018-08-25 06:50:35 +09:00
syuilo b8d53a7b40 Merge pull request #2455 from mei23/mei-0824-apattchobj
ActivityPubで非公開投稿が添付されてしまう件の修正
2018-08-25 05:25:14 +09:00
syuilo b0d9e9caa2 New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 01:31:08 +09:00
syuilo 1fc4ec8dc1 New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 01:21:15 +09:00
syuilo a1e1e25800 New translations ja-JP.yml (English) 2018-08-24 23:57:28 +09:00
syuilo 3b020732ec New translations ja-JP.yml (English) 2018-08-24 23:41:35 +09:00
syuilo dcf92945fe New translations ja-JP.yml (English) 2018-08-24 23:31:52 +09:00
syuilo f9f33903d4 New translations ja-JP.yml (French) 2018-08-24 21:51:28 +09:00
syuilo d8bf06ab0f New translations ja-JP.yml (French) 2018-08-24 21:43:26 +09:00
syuilo 806dabe58b Merge pull request #2450 from syuilo/develop
8.8.0
2018-08-24 15:02:21 +09:00
syuilo a17b8c56d7 New translations ja-JP.yml (Japanese, Kansai) 2018-08-24 15:01:39 +09:00
syuilo 0eaaaba8f2 New translations ja-JP.yml (Spanish) 2018-08-24 15:01:36 +09:00
syuilo f359d79d36 New translations ja-JP.yml (Russian) 2018-08-24 15:01:34 +09:00
syuilo 1d84000d94 New translations ja-JP.yml (Portuguese) 2018-08-24 15:01:32 +09:00
syuilo b70e22c150 8.8.0 2018-08-24 15:01:30 +09:00
syuilo 0774ffe376 New translations ja-JP.yml (Polish) 2018-08-24 15:01:29 +09:00
syuilo 0096d7d8ac New translations ja-JP.yml (Korean) 2018-08-24 15:01:27 +09:00
syuilo 38db966b3d New translations ja-JP.yml (Italian) 2018-08-24 15:01:24 +09:00
syuilo cb7d313a66 New translations ja-JP.yml (German) 2018-08-24 15:01:21 +09:00
syuilo 91b7905f3f New translations ja-JP.yml (French) 2018-08-24 15:01:18 +09:00
syuilo 9a81fba992 New translations ja-JP.yml (English) 2018-08-24 15:01:16 +09:00
syuilo 43553d5c09 New translations ja-JP.yml (Chinese Simplified) 2018-08-24 15:01:14 +09:00
syuilo e0ca8ce173 New translations ja-JP.yml (Catalan) 2018-08-24 15:01:11 +09:00
syuilo 13624ea7c2 バグ修正など 2018-08-24 14:55:58 +09:00
mei23 9502586c8b ActivityPub Renote/Replyで 対象Noteを添付しないようにする 2018-08-24 14:53:40 +09:00
greenkeeper[bot] d6753f2cf2 fix(package): update @types/node to version 10.9.1
Closes #2431
2018-08-24 00:40:11 +00:00
syuilo 5ba36efcd2 Merge pull request #2446 from syuilo/develop
8.7.0
2018-08-24 09:39:57 +09:00
syuilo fd497ef105 8.7.0 2018-08-24 09:39:37 +09:00
syuilo 9c4a7bf94c Improve chart 2018-08-24 09:39:16 +09:00
syuilo 91f8adc138 Merge pull request #2445 from syuilo/develop
8.6.0
2018-08-24 08:57:54 +09:00
syuilo 69fa2373cb 8.6.0 2018-08-24 08:57:31 +09:00
syuilo 8b37fc4772 Improve chart 2018-08-24 08:56:57 +09:00
syuilo 81e4ed9591 Merge pull request #2444 from syuilo/develop
8.5.1
2018-08-24 08:36:01 +09:00
syuilo 9cda89ec04 8.5.1 2018-08-24 08:35:38 +09:00
syuilo fc180f030f Fix bug 2018-08-24 08:35:01 +09:00
syuilo a827b6028d Merge pull request #2442 from syuilo/develop
8.5.0
2018-08-24 07:24:08 +09:00
syuilo 4517bf7342 8.5.0 2018-08-24 07:23:42 +09:00
syuilo b21287262e チャート取得APIを誰でも利用できるようにするなど 2018-08-24 07:23:04 +09:00
syuilo a60ae130c1 New translations ja-JP.yml (Japanese, Kansai) 2018-08-24 07:21:28 +09:00
syuilo dd88acd411 New translations ja-JP.yml (Spanish) 2018-08-24 07:21:25 +09:00
syuilo b63fc1a9e5 New translations ja-JP.yml (Russian) 2018-08-24 07:21:23 +09:00
syuilo 17f143cfb2 New translations ja-JP.yml (Portuguese) 2018-08-24 07:21:20 +09:00
syuilo cf57d847d1 New translations ja-JP.yml (Polish) 2018-08-24 07:21:18 +09:00
syuilo 7c4c7bea14 New translations ja-JP.yml (Korean) 2018-08-24 07:21:16 +09:00
syuilo e5ec47fc75 New translations ja-JP.yml (Italian) 2018-08-24 07:21:14 +09:00
syuilo ad91dc2423 New translations ja-JP.yml (German) 2018-08-24 07:21:11 +09:00
syuilo 7acbe53948 New translations ja-JP.yml (French) 2018-08-24 07:21:08 +09:00
syuilo fe1b8ba0cb New translations ja-JP.yml (English) 2018-08-24 07:21:05 +09:00
syuilo b0a8a51b69 New translations ja-JP.yml (Chinese Simplified) 2018-08-24 07:21:03 +09:00
syuilo c3ca21e610 New translations ja-JP.yml (Catalan) 2018-08-24 07:21:00 +09:00
syuilo c1b47a2119 Add missing changelog 2018-08-24 07:20:26 +09:00
syuilo caf625afee Merge pull request #2441 from syuilo/develop
8.4.0
2018-08-24 07:18:00 +09:00
syuilo 2bad3865a3 8.4.0 2018-08-24 07:17:40 +09:00
syuilo 3f7d248684 Improve chart 2018-08-24 07:17:17 +09:00
syuilo 4e7382b793 New translations ja-JP.yml (Japanese, Kansai) 2018-08-24 07:12:36 +09:00
syuilo 552ff4a044 New translations ja-JP.yml (Spanish) 2018-08-24 07:12:33 +09:00
syuilo afb52a0cd5 New translations ja-JP.yml (Russian) 2018-08-24 07:12:31 +09:00
syuilo 1ac89b0f5b New translations ja-JP.yml (Portuguese) 2018-08-24 07:12:28 +09:00
syuilo 5039ca7ee1 New translations ja-JP.yml (Polish) 2018-08-24 07:12:26 +09:00
syuilo a48fd9ce18 New translations ja-JP.yml (Korean) 2018-08-24 07:12:24 +09:00
syuilo 58859c4811 New translations ja-JP.yml (Italian) 2018-08-24 07:12:22 +09:00
syuilo 5988fb3111 New translations ja-JP.yml (German) 2018-08-24 07:12:19 +09:00
syuilo 8dce821789 New translations ja-JP.yml (French) 2018-08-24 07:12:16 +09:00
syuilo 16fde0b507 New translations ja-JP.yml (English) 2018-08-24 07:12:13 +09:00
syuilo 9723662706 New translations ja-JP.yml (Chinese Simplified) 2018-08-24 07:12:11 +09:00
syuilo df4415b4fe New translations ja-JP.yml (Catalan) 2018-08-24 07:12:09 +09:00
syuilo 6e179e7cde Fix 2018-08-24 07:06:25 +09:00
syuilo 87f248b8ec Merge pull request #2440 from syuilo/develop
8.3.1
2018-08-24 07:03:49 +09:00
syuilo 027140eccc 8.3.1 2018-08-24 07:03:25 +09:00
syuilo 92cf205c66 Fix bug 2018-08-24 07:02:52 +09:00
syuilo fa3299840f Refactor 2018-08-24 07:02:27 +09:00
syuilo f54529d46f New translations ja-JP.yml (Japanese, Kansai) 2018-08-24 06:51:15 +09:00
syuilo b772add064 New translations ja-JP.yml (Spanish) 2018-08-24 06:51:13 +09:00
syuilo 231f2e77a4 New translations ja-JP.yml (Russian) 2018-08-24 06:51:10 +09:00
syuilo a000a9e607 New translations ja-JP.yml (Portuguese) 2018-08-24 06:51:08 +09:00
syuilo e8da15ab1e New translations ja-JP.yml (Polish) 2018-08-24 06:51:05 +09:00
syuilo e070ccb313 New translations ja-JP.yml (Korean) 2018-08-24 06:51:02 +09:00
syuilo 2b06579228 New translations ja-JP.yml (Italian) 2018-08-24 06:50:59 +09:00
syuilo 853c847ba1 New translations ja-JP.yml (German) 2018-08-24 06:50:57 +09:00
syuilo e852680b0a New translations ja-JP.yml (French) 2018-08-24 06:50:55 +09:00
syuilo 0b0ee915b3 New translations ja-JP.yml (English) 2018-08-24 06:50:52 +09:00
syuilo 516d1d093f New translations ja-JP.yml (Chinese Simplified) 2018-08-24 06:50:49 +09:00
syuilo aee9c79c0f New translations ja-JP.yml (Catalan) 2018-08-24 06:50:47 +09:00
syuilo 2d4b183c14 Merge pull request #2439 from syuilo/develop
8.3.0
2018-08-24 06:43:12 +09:00
syuilo 03b20e11ca 8.3.0 2018-08-24 06:42:40 +09:00
syuilo e0e006e284 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-24 06:41:56 +09:00
syuilo a294a881ec Improve chart 2018-08-24 06:41:53 +09:00
syuilo 53926082e7 Merge pull request #2438 from mei23/mei-0824-basehtmlcc
ベースHTMLは immutableキャッシュしないようにする
2018-08-24 05:47:53 +09:00
syuilo 2d185becc3 New translations ja-JP.yml (Japanese, Kansai) 2018-08-24 05:41:31 +09:00
syuilo 67fff324b0 New translations ja-JP.yml (Spanish) 2018-08-24 05:41:29 +09:00
syuilo f64b7fcabc New translations ja-JP.yml (Russian) 2018-08-24 05:41:27 +09:00
syuilo 4cefa16db6 New translations ja-JP.yml (Portuguese) 2018-08-24 05:41:25 +09:00
syuilo 22722379df New translations ja-JP.yml (Polish) 2018-08-24 05:41:22 +09:00
syuilo b2b83dc45d New translations ja-JP.yml (Korean) 2018-08-24 05:41:19 +09:00
syuilo ebf6f8bbfd New translations ja-JP.yml (Italian) 2018-08-24 05:41:17 +09:00
syuilo 3e1631d180 New translations ja-JP.yml (German) 2018-08-24 05:41:14 +09:00
syuilo 97cb3c8613 New translations ja-JP.yml (French) 2018-08-24 05:41:11 +09:00
syuilo 6dda3a5d8a New translations ja-JP.yml (English) 2018-08-24 05:41:09 +09:00
syuilo e50b0540f5 New translations ja-JP.yml (Chinese Simplified) 2018-08-24 05:41:06 +09:00
syuilo 63b4aee9bd New translations ja-JP.yml (Catalan) 2018-08-24 05:41:04 +09:00
mei23 5b5de6a89c ベースHTMLは immutableキャッシュしないようにする 2018-08-24 05:41:03 +09:00
syuilo a11c991f83 Merge pull request #2436 from mei23/mei-0824-api404
/api/ 下の存在しないにURL対しては404を返すようにする
2018-08-24 05:40:30 +09:00
syuilo a0adcf0d1a Merge pull request #2437 from syuilo/develop
8.2.0
2018-08-24 05:38:18 +09:00
syuilo 93b2b82993 8.2.0 2018-08-24 05:37:42 +09:00
syuilo 4dee7d91b1 Better charts 2018-08-24 05:37:19 +09:00
mei23 839be6477d Return 404 for unknown API 2018-08-24 05:26:26 +09:00
syuilo 59e2ed8ab0 Merge pull request #2435 from syuilo/master
Master
2018-08-24 03:48:05 +09:00
syuilo 83790004dd 8.1.0 (#2426) (#2434)
* Update url-preview.vue

* 一時間ごとのグラフも見れるように

* Merge pull request #2423 from syuilo/develop (#2425)

* 8.1.0
2018-08-24 03:47:36 +09:00
greenkeeper[bot] b70e9824ac fix(package): update @types/webpack to version 4.4.11 2018-08-23 18:26:42 +00:00
greenkeeper[bot] 155d49e8ac fix(package): update @types/sharp to version 0.17.10 2018-08-23 18:16:46 +00:00
greenkeeper[bot] 4ae10ab33d fix(package): update vue-js-modal to version 1.3.19 2018-08-23 14:46:37 +00:00
syuilo 7124586eb1 New translations ja-JP.yml (French) 2018-08-23 18:12:02 +09:00
syuilo 74f6ed1851 New translations ja-JP.yml (French) 2018-08-23 18:03:12 +09:00
syuilo efae7a7bce 8.1.0 (#2426)
* Update url-preview.vue

* 一時間ごとのグラフも見れるように

* Merge pull request #2423 from syuilo/develop (#2425)

* 8.1.0
2018-08-23 16:38:12 +09:00
syuilo e59f13e8ff Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-23 16:37:40 +09:00
syuilo 31ed8949b9 8.1.0 2018-08-23 16:37:32 +09:00
syuilo f1174a15e0 Merge pull request #2423 from syuilo/develop (#2425) 2018-08-23 16:37:07 +09:00
syuilo 912ffae600 Merge pull request #2424 from acid-chicken/patch-4
Fix #2421
2018-08-23 16:36:42 +09:00
syuilo 71a5662195 一時間ごとのグラフも見れるように 2018-08-23 16:36:23 +09:00
Acid Chicken (硫酸鶏) 774834a31f Update url-preview.vue 2018-08-23 16:25:36 +09:00
syuilo 91f1c3a10a Merge pull request #2423 from syuilo/develop
8.0.0
2018-08-23 15:42:14 +09:00
syuilo 8fc1e07136 1時間単位での集計を追加 2018-08-23 15:40:24 +09:00
syuilo a62e2b83ff Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-23 14:56:43 +09:00
syuilo e31a2f7e55 Fix bug: Check following request existance 2018-08-23 14:56:39 +09:00
syuilo 1598e996b1 Merge pull request #2419 from rinsuki/patch-1
https://misskey.xyz/notes/5b7e20bd248403003019b860 の修正
2018-08-23 12:00:46 +09:00
rinsuki 4fb7ee760a https://misskey.xyz/notes/5b7e20bd248403003019b860 の修正 2018-08-23 11:58:44 +09:00
syuilo 37865cb381 Merge pull request #2416 from syuilo/master
Master
2018-08-23 05:46:24 +09:00
syuilo ab8b882435 Merge pull request #2372 from syuilo/greenkeeper/vue-js-modal-1.3.18
Update vue-js-modal to the latest version 🚀
2018-08-23 05:46:04 +09:00
syuilo 1b2996947e Merge pull request #2400 from syuilo/greenkeeper/webpack-4.17.1
Update webpack to the latest version 🚀
2018-08-23 05:45:30 +09:00
syuilo 1d9c88e9a1 New translations ja-JP.yml (English) 2018-08-23 05:44:01 +09:00
syuilo ea56d368e3 Merge pull request #2414 from syuilo/develop
7.4.1
2018-08-23 03:45:25 +09:00
syuilo dbd3a750f5 7.4.1 2018-08-23 03:45:04 +09:00
syuilo f41818141f Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-23 03:44:42 +09:00
syuilo d2f576accd 互換性の修正 2018-08-23 03:44:32 +09:00
syuilo 4e483856d4 Merge pull request #2413 from syuilo/master
Master
2018-08-23 03:24:43 +09:00
syuilo 2997f26e3c Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-23 03:24:15 +09:00
syuilo cdab596240 7.4.0 2018-08-23 03:24:06 +09:00
syuilo fca7a9da94 Merge pull request #2412 from syuilo/develop
update
2018-08-23 03:23:31 +09:00
syuilo 8ba178f795 コントロールパネルから招待制のオンオフを切り替えられるように 2018-08-23 03:19:57 +09:00
syuilo 8eb8243153 New translations ja-JP.yml (Japanese, Kansai) 2018-08-23 03:01:33 +09:00
syuilo b4967b862c New translations ja-JP.yml (Spanish) 2018-08-23 03:01:31 +09:00
syuilo aee3517736 New translations ja-JP.yml (Russian) 2018-08-23 03:01:28 +09:00
syuilo 52ff8e84fa New translations ja-JP.yml (Portuguese) 2018-08-23 03:01:26 +09:00
syuilo 9bb6db649c New translations ja-JP.yml (Polish) 2018-08-23 03:01:24 +09:00
syuilo da99be9897 New translations ja-JP.yml (Korean) 2018-08-23 03:01:21 +09:00
syuilo 2d7ec8a471 New translations ja-JP.yml (Italian) 2018-08-23 03:01:19 +09:00
syuilo 4cbbfdad1a New translations ja-JP.yml (German) 2018-08-23 03:01:17 +09:00
syuilo 2924858311 New translations ja-JP.yml (French) 2018-08-23 03:01:14 +09:00
syuilo 85916bfea1 New translations ja-JP.yml (English) 2018-08-23 03:01:12 +09:00
syuilo 38ccd9e794 New translations ja-JP.yml (Chinese Simplified) 2018-08-23 03:01:10 +09:00
syuilo c64b6be915 New translations ja-JP.yml (Catalan) 2018-08-23 03:01:07 +09:00
syuilo d98c67e13c Add control panel link in nav 2018-08-23 02:47:12 +09:00
syuilo d129151fdf Fix #2410
なぜか .ts という拡張子で来るのかは不明
2018-08-23 02:28:58 +09:00
syuilo 1b9c69f793 Fix bug 2018-08-23 01:55:39 +09:00
syuilo 42dd092334 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-23 01:37:20 +09:00
syuilo 8dc9ec06f8 良い感じに 2018-08-23 01:37:05 +09:00
syuilo ae5da782e5 Merge pull request #2409 from syuilo/l10n_develop
New Crowdin translations
2018-08-23 01:36:40 +09:00
syuilo 313b0cec65 New translations ja-JP.yml (Japanese, Kansai) 2018-08-23 01:36:10 +09:00
syuilo 12a51972ed New translations ja-JP.yml (Spanish) 2018-08-23 01:36:07 +09:00
syuilo a2f3b2966f New translations ja-JP.yml (Russian) 2018-08-23 01:36:05 +09:00
syuilo 0c2627f08b New translations ja-JP.yml (Portuguese) 2018-08-23 01:36:03 +09:00
syuilo 9535df12dd New translations ja-JP.yml (Polish) 2018-08-23 01:36:00 +09:00
syuilo 2400471a0d New translations ja-JP.yml (Korean) 2018-08-23 01:35:57 +09:00
syuilo 784da8c37b New translations ja-JP.yml (Italian) 2018-08-23 01:35:55 +09:00
syuilo 3778f9c521 New translations ja-JP.yml (German) 2018-08-23 01:35:52 +09:00
syuilo e1cec85f1e New translations ja-JP.yml (French) 2018-08-23 01:35:49 +09:00
syuilo ca9c087060 New translations ja-JP.yml (English) 2018-08-23 01:35:47 +09:00
syuilo 5b2d91baad New translations ja-JP.yml (Chinese Simplified) 2018-08-23 01:35:44 +09:00
syuilo 08e099b88d New translations ja-JP.yml (Catalan) 2018-08-23 01:35:41 +09:00
syuilo 4153b0db38 Merge pull request #2408 from syuilo/l10n_develop
New Crowdin translations
2018-08-23 01:17:48 +09:00
syuilo 88701a21bb New translations ja-JP.yml (Japanese, Kansai) 2018-08-23 01:16:01 +09:00
syuilo 3ddc73ca94 New translations ja-JP.yml (Spanish) 2018-08-23 01:15:59 +09:00
syuilo 693d793265 New translations ja-JP.yml (Russian) 2018-08-23 01:15:57 +09:00
syuilo 5d685233dd New translations ja-JP.yml (Portuguese) 2018-08-23 01:15:54 +09:00
syuilo 16575751d9 New translations ja-JP.yml (Polish) 2018-08-23 01:15:52 +09:00
syuilo 1f6295f437 New translations ja-JP.yml (Korean) 2018-08-23 01:15:49 +09:00
syuilo 6737fe2ead New translations ja-JP.yml (Italian) 2018-08-23 01:15:47 +09:00
syuilo 4e77939fca New translations ja-JP.yml (German) 2018-08-23 01:15:44 +09:00
syuilo 21f528c07d New translations ja-JP.yml (French) 2018-08-23 01:15:41 +09:00
syuilo 23f835fac0 New translations ja-JP.yml (English) 2018-08-23 01:15:38 +09:00
syuilo f21343225c New translations ja-JP.yml (Chinese Simplified) 2018-08-23 01:15:36 +09:00
syuilo f13a59f7db New translations ja-JP.yml (Catalan) 2018-08-23 01:15:33 +09:00
syuilo 0315b9274c Merge pull request #2407 from syuilo/master
Master
2018-08-23 00:49:52 +09:00
syuilo da88043962 Merge pull request #2396 from Tosuke/fix-2354
Mute on mobile(#2354)
2018-08-23 00:47:50 +09:00
syuilo 0352bf0cc2 Merge pull request #2393 from acid-chicken/patch-autogen-shell
Add autogen.sh
2018-08-23 00:47:08 +09:00
syuilo baa71070a8 Merge pull request #2403 from syuilo/greenkeeper/summaly-2.1.4
Update summaly to the latest version 🚀
2018-08-23 00:45:44 +09:00
syuilo 2713064f27 Merge pull request #2405 from acid-chicken/patch-4
Migrate summaly to 2.1.4
2018-08-23 00:45:25 +09:00
syuilo f6387ac115 Merge pull request #2406 from syuilo/master
Master
2018-08-23 00:44:13 +09:00
Acid Chicken (硫酸鶏) d704aca035 Update url-preview.vue 2018-08-23 00:40:32 +09:00
Acid Chicken (硫酸鶏) 2b54b4ac06 Update url-preview.vue 2018-08-23 00:34:35 +09:00
greenkeeper[bot] 7410f2f4c0 fix(package): update summaly to version 2.1.4 2018-08-22 14:55:38 +00:00
syuilo 99c3c1258a Merge pull request #2402 from acid-chicken/patch-3
Update Crowdin configuration file
2018-08-22 23:54:03 +09:00
Acid Chicken (硫酸鶏) e51184931d Update crowdin.yml 2018-08-22 23:53:27 +09:00
greenkeeper[bot] 3bc9a40b48 fix(package): update webpack to version 4.17.1 2018-08-22 09:56:30 +00:00
Tosuke 9f49ca8fdb feature mute on mobile(#2354) 2018-08-22 15:54:22 +09:00
Acid Chicken (硫酸鶏) 550d1547b4 Add autogen.sh
refs: https://github.com/syuilo/misskey/pull/2391#issuecomment-414915763
2018-08-22 14:41:41 +09:00
syuilo ca0b56ee57 Merge pull request #2391 from acid-chicken/patch-autogen
[AUTOMATED] Update README.md
2018-08-22 14:26:05 +09:00
Acid Chicken (硫酸鶏) ef1d854f2c Update README.md [AUTOGEN] 2018-08-22 14:25:06 +09:00
syuilo a5023271ef 7.3.0 2018-08-22 09:40:54 +09:00
syuilo c3747db670 Fix doc 2018-08-22 09:36:42 +09:00
syuilo fe1e60a28c Fix #2334 2018-08-22 09:33:59 +09:00
syuilo f91d2e8c8d Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-22 09:31:51 +09:00
syuilo dccc2c60e3 Fix bugs
Closes #2367
2018-08-22 09:31:35 +09:00
syuilo 933e25804c Merge pull request #2389 from Tosuke/fix-2384
Fix login bug(#2384)
2018-08-22 09:27:09 +09:00
Tosuke 0b503661af fix login bug(#2384) 2018-08-22 09:26:06 +09:00
syuilo 58082431ff Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-22 09:16:55 +09:00
syuilo 2536bfb5f5 #2378 2018-08-22 09:16:52 +09:00
syuilo 6428066552 Merge pull request #2388 from mei23/mei-0822-dbcheck
起動時のDB接続チェックでエラーを検出できないのを修正
2018-08-22 09:12:59 +09:00
syuilo 4bf3827b73 Revert "#2387"
This reverts commit 3cad494404.
2018-08-22 09:12:37 +09:00
syuilo 3cad494404 #2387 2018-08-22 09:11:59 +09:00
syuilo ef0793311f リバーシのアイコンのコントラストのオプションを追加するなど 2018-08-22 09:10:39 +09:00
mei23 6f3e341e89 Fix DB connectivity check 2018-08-22 08:46:31 +09:00
syuilo 2fea3be7c0 Merge pull request #2364 from acid-chicken/patch-2
Resolve #2363
2018-08-22 08:41:47 +09:00
greenkeeper[bot] 67b28f9b6e fix(package): update vue-js-modal to version 1.3.18 2018-08-20 19:58:32 +00:00
Acid Chicken (硫酸鶏) 166c4ebda0 Update reversi.game.vue 2018-08-20 18:12:03 +09:00
Acid Chicken (硫酸鶏) 319eed029b Update reversi.game.vue 2018-08-20 18:10:51 +09:00
187 changed files with 3474 additions and 2058 deletions
+86
View File
@@ -0,0 +1,86 @@
#!/usr/bin/env bash
# BEARER_TOKEN=
# CAMPAIGN_ID=
# GITHUB_TOKEN=
# HEAD='acid-chicken:patch-autogen'
# REPO='syuilo/misskey'
test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$GITHUB_TOKEN" | jq -r '.[].head.label' | grep $HEAD)" && exit 1
cd "$(dirname $0)/.." && \
touch null.cache && \
rm *.cache && \
git checkout master && \
git pull origin master && \
git pull upstream master && \
git stash && \
git rebase -f upstream/master && \
git branch patch-autogen && \
git checkout patch-autogen && \
git reset --hard HEAD || \
exit 1
touch patreon.md.cache && \
rm patreon.md.cache && \
echo '<!-- PATREON_START -->' > patreon.md.cache && \
URL="https://www.patreon.com/api/oauth2/v2/campaigns/$CAMPAIGN_ID/members?include=currently_entitled_tiers,user&fields%5Btier%5D=title&fields%5Buser%5D=full_name,thumb_url,url,hide_pledges"
while :
do
touch patreon.raw.cache && \
rm patreon.raw.cache && \
curl -LSs -w '\n' -H "Authorization: Bearer $BEARER_TOKEN" -- $URL > patreon.raw.cache && \
touch patreon.cache && \
rm patreon.cache && \
cat patreon.raw.cache | \
jq -r '(.data|map(select(.relationships.currently_entitled_tiers.data[]))|map(.relationships.user.data.id))as$data|.included|map(select(.attributes.hide_pledges==false))|map(select(.id as$id|$data|contains([$id])))|map(.attributes|[.full_name,.thumb_url,.url]|@tsv)|.[]|@text' >> patreon.cache && \
echo '<table><tr>' >> patreon.md.cache && \
cat patreon.cache | \
awk -F'\t' '{print $2,$1}' | \
sed -e 's/ /\\" alt=\\"/' | \
xargs -I% echo '<td><img src="%"></td>' >> patreon.md.cache && \
echo '</tr><tr>' >> patreon.md.cache && \
cat patreon.cache | \
awk -F'\t' '{print $3,$1}' | \
sed -e 's/ /\\">/' | \
xargs -I% echo '<td><a href="%</a></td>' >> patreon.md.cache && \
echo '</tr></table>' >> patreon.md.cache || \
exit 1
NEW_URL="$(cat patreon.raw.cache | jq -r '.links.next')"
test "$NEW_URL" = 'null' && \
break || \
URL="$NEW_URL"
done
IGNORE= && \
echo -e "\n**Last updated:** $(date -uR | sed 's/\+0000/UTC/')\n<!-- PATREON_END -->" >> patreon.md.cache && \
touch README.md && \
touch .autogen/README.md && \
rm .autogen/README.md && \
mv README.md .autogen/README.md && \
cat .autogen/README.md | while IFS= read LINE;
do
if [[ -z "$IGNORE" ]]
then
if [[ "$LINE" = '<!-- PATREON_START -->' ]]
then
IGNORE='PATREON_INSIDE'
else
echo "$LINE" >> README.md
fi
else
if [[ "$LINE" = '<!-- PATREON_END -->' ]]
then
IGNORE=
cat patreon.md.cache >> README.md
fi
fi
done
cat patreon.md.cache
touch null.cache && \
rm *.cache && \
diff .autogen/README.md README.md > diff.cache
cat diff.cache && \
test 4 -lt $(cat diff.cache | wc -l) && \
git add README.md && \
git commit -m 'Update README.md [AUTOGEN]' && \
git push -f origin patch-autogen && \
curl -LSs -w '\n' -X POST -d '{"title":"[AUTOMATED] Update README.md","body":"*This pull request was created by a tool.*","head":"'$HEAD'","base":"master"}' -- "https://api.github.com/repos/$REPO/pulls?access_token=$GITHUB_TOKEN"
git stash
git checkout master
git branch -D patch-autogen
+3
View File
@@ -138,3 +138,6 @@ drive:
# Clustering # Clustering
# clusterLimit: 1 # clusterLimit: 1
# Summaly proxy
# summalyProxy: "http://example.com"
+10
View File
@@ -5,6 +5,16 @@ ChangeLog
This document describes breaking changes only. This document describes breaking changes only.
8.0.0
-----
### Migration
起動する前に、`node cli/migration/8.0.0`してください。
Please run `node cli/migration/8.0.0` before launch.
7.0.0 7.0.0
----- -----
+7 -3
View File
@@ -55,23 +55,26 @@ Misskey is using Crowdin for l10n.
<table><tr> <table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12378075/0156f769e20f412594fa6b87d85fe228/1?token-time=2145916800&token-hash=IsIJRUXszzoD6-7pDnRY8I05T9nSznc4GTaxj7C9SwU%3D" alt="39ff"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12378075/0156f769e20f412594fa6b87d85fe228/1?token-time=2145916800&token-hash=IsIJRUXszzoD6-7pDnRY8I05T9nSznc4GTaxj7C9SwU%3D" alt="39ff"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1?token-time=2145916800&token-hash=d6P5MWHHsCMxUuBAEPAoVc5wLUR19mIhqAq7Ma9h9rI%3D" alt="ne_moni"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/1?token-time=2145916800&token-hash=f03BFb4S2FUx9YEt87TnEmifb4h33OywGBW2akQVtQY%3D" alt="Melilot"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/1?token-time=2145916800&token-hash=f03BFb4S2FUx9YEt87TnEmifb4h33OywGBW2akQVtQY%3D" alt="Melilot"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/1?token-time=2145916800&token-hash=DVrSdOqQq2dufgNgWZ3XMnEtl_ZAktr8Lhf2tbHKtoA%3D" alt="Axella"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td>
<td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td> <td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=zwSu01tOtn5xTUucDZHuPsCxF2HBEMVs9ROJKTlEV_o%3D" alt="nemu"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=zwSu01tOtn5xTUucDZHuPsCxF2HBEMVs9ROJKTlEV_o%3D" alt="nemu"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D" alt="Naoki Kosaka"></td>
</tr><tr> </tr><tr>
<td><a href="https://www.patreon.com/user?u=12378075">39ff</a></td> <td><a href="https://www.patreon.com/user?u=12378075">39ff</a></td>
<td><a href="https://www.patreon.com/user?u=12731202">negao</a></td> <td><a href="https://www.patreon.com/user?u=12731202">negao</a></td>
<td><a href="https://www.patreon.com/user?u=13099460">ne_moni</a></td>
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td> <td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
<td><a href="https://www.patreon.com/AxellaMC">Axella</a></td>
<td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td> <td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td>
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td> <td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td> <td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td> <td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
<td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td>
</tr></table> </tr></table>
<table><tr> <table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D" alt="Naoki Kosaka"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12931605/ead494101f364dffa90efe49e36fb494/1?token-time=2145916800&token-hash=NzSFPjIlodXyv41rwK61aZWVZWfI4surJaNj8vWKvqM%3D" alt="Reiju"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12931605/ead494101f364dffa90efe49e36fb494/1?token-time=2145916800&token-hash=NzSFPjIlodXyv41rwK61aZWVZWfI4surJaNj8vWKvqM%3D" alt="Reiju"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=UERBN4OyP7Nh5XwwdDg0N0IE5cD6_qUQMO81Z5Wizso%3D" alt="Hiratake"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=UERBN4OyP7Nh5XwwdDg0N0IE5cD6_qUQMO81Z5Wizso%3D" alt="Hiratake"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td>
@@ -79,6 +82,7 @@ Misskey is using Crowdin for l10n.
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12959468/c249e15aebec4424b5c0f427173671b6/1?token-time=2145916800&token-hash=lubpCEdxAkxPlpR2O6bvZ7BIh8Q4nGf-U_mE1qpjVAQ%3D" alt="fujishan"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12959468/c249e15aebec4424b5c0f427173671b6/1?token-time=2145916800&token-hash=lubpCEdxAkxPlpR2O6bvZ7BIh8Q4nGf-U_mE1qpjVAQ%3D" alt="fujishan"></td>
</tr><tr> </tr><tr>
<td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td>
<td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td> <td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td>
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td> <td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
<td><a href="https://www.patreon.com/dansup">dansup</a></td> <td><a href="https://www.patreon.com/dansup">dansup</a></td>
@@ -87,7 +91,7 @@ Misskey is using Crowdin for l10n.
<td><a href="https://www.patreon.com/fujishan">fujishan</a></td> <td><a href="https://www.patreon.com/fujishan">fujishan</a></td>
</tr></table> </tr></table>
**Last updated:** Mon, 20 Aug 2018 10:02:31 UTC **Last updated:** Sun, 26 Aug 2018 08:55:06 UTC
<!-- PATREON_END --> <!-- PATREON_END -->
:four_leaf_clover: Copyright :four_leaf_clover: Copyright
-40
View File
@@ -1,40 +0,0 @@
const { default: User, deleteUser } = require('../built/models/user');
const { default: zip } = require('@prezzemolo/zip')
const migrate = async (user) => {
try {
await deleteUser(user._id);
return true;
} catch (e) {
return false;
}
}
async function main() {
const count = await User.count({
uri: /#/
});
const dop = 1
const idop = ((count - (count % dop)) / dop) + 1
return zip(
1,
async (time) => {
console.log(`${time} / ${idop}`)
const doc = await User.find({
uri: /#/
}, {
limit: dop, skip: time * dop
})
return Promise.all(doc.map(migrate))
},
idop
).then(a => {
const rv = []
a.forEach(e => rv.push(...e))
return rv
})
}
main().then(console.dir).catch(console.error)
+144
View File
@@ -0,0 +1,144 @@
const { default: Stats } = require('../../built/models/stats');
const { default: User } = require('../../built/models/user');
const { default: Note } = require('../../built/models/note');
const { default: DriveFile } = require('../../built/models/drive-file');
const now = new Date();
const y = now.getFullYear();
const m = now.getMonth();
const d = now.getDate();
const h = now.getHours();
const date = new Date(y, m, d, h);
async function main() {
await Stats.update({}, {
$set: {
span: 'day'
}
}, {
multi: true
});
const localUsersCount = await User.count({
host: null
});
const remoteUsersCount = await User.count({
host: { $ne: null }
});
const localNotesCount = await Note.count({
'_user.host': null
});
const remoteNotesCount = await Note.count({
'_user.host': { $ne: null }
});
const localDriveFilesCount = await DriveFile.count({
'metadata._user.host': null
});
const remoteDriveFilesCount = await DriveFile.count({
'metadata._user.host': { $ne: null }
});
const localDriveFilesSize = await DriveFile
.aggregate([{
$match: {
'metadata._user.host': null,
'metadata.deletedAt': { $exists: false }
}
}, {
$project: {
length: true
}
}, {
$group: {
_id: null,
usage: { $sum: '$length' }
}
}])
.then(aggregates => {
if (aggregates.length > 0) {
return aggregates[0].usage;
}
return 0;
});
const remoteDriveFilesSize = await DriveFile
.aggregate([{
$match: {
'metadata._user.host': { $ne: null },
'metadata.deletedAt': { $exists: false }
}
}, {
$project: {
length: true
}
}, {
$group: {
_id: null,
usage: { $sum: '$length' }
}
}])
.then(aggregates => {
if (aggregates.length > 0) {
return aggregates[0].usage;
}
return 0;
});
await Stats.insert({
date: date,
span: 'hour',
users: {
local: {
total: localUsersCount,
diff: 0
},
remote: {
total: remoteUsersCount,
diff: 0
}
},
notes: {
local: {
total: localNotesCount,
diff: 0,
diffs: {
normal: 0,
reply: 0,
renote: 0
}
},
remote: {
total: remoteNotesCount,
diff: 0,
diffs: {
normal: 0,
reply: 0,
renote: 0
}
}
},
drive: {
local: {
totalCount: localDriveFilesCount,
totalSize: localDriveFilesSize,
diffCount: 0,
diffSize: 0
},
remote: {
totalCount: remoteDriveFilesCount,
totalSize: remoteDriveFilesSize,
diffCount: 0,
diffSize: 0
}
}
});
console.log('done');
}
main();
+2 -2
View File
@@ -1,3 +1,3 @@
files: files:
- source: /locales/ja.yml - source: /locales/ja-JP.yml
translation: /locales/%two_letters_code%.yml translation: /locales/%locale%.yml
+10 -1
View File
@@ -59,7 +59,16 @@ gulp.task('build:copy:views', () =>
gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views')) gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
); );
gulp.task('build:copy', ['build:copy:views'], () => // 互換性のため
gulp.task('build:copy:lang', () =>
gulp.src(['./built/client/assets/*.*-*.js'])
.pipe(rename(path => {
path.basename = path.basename.replace(/\-(.*)$/, '');
}))
.pipe(gulp.dest('./built/client/assets/'))
);
gulp.task('build:copy', ['build:copy:views', 'build:copy:lang'], () =>
gulp.src([ gulp.src([
'./build/Release/crypto_key.node', './build/Release/crypto_key.node',
'./src/const.json', './src/const.json',
+32 -14
View File
@@ -84,6 +84,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
@@ -410,6 +411,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました" avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択" choose-avatar: "アバターにする画像を選択"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
@@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
@@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"
+33 -15
View File
@@ -58,7 +58,7 @@ common:
friday: "金曜日" friday: "金曜日"
saturday: "土曜日" saturday: "土曜日"
reactions: reactions:
like: "Gefällt mir" like: "いいね"
love: "Lieben" love: "Lieben"
laugh: "Lachen" laugh: "Lachen"
hmm: "Hmm...?" hmm: "Hmm...?"
@@ -84,6 +84,7 @@ common:
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet." my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
@@ -410,6 +411,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました" avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択" choose-avatar: "アバターにする画像を選択"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Schwarz ... komplett" total: "Schwarz ... komplett"
notes: "Blau ... Hinweise" notes: "Blau ... Hinweise"
@@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "Vorheriger Monat" prev: "Vorheriger Monat"
next: "Nächster Monat" next: "Nächster Monat"
go: "Klicke zur Navigation" go: "Klicke zur Navigation"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "Datei auswählen" choose-file: "Datei auswählen"
upload: "Dateien von deinem PC hochladen" upload: "Dateien von deinem PC hochladen"
@@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "Übergang in Fensterköpfen" gradient-window-header: "Übergang in Fensterköpfen"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "Zeige Antworten" show-reply-target: "Zeige Antworten"
show-my-renotes: "Zeige meine Reposts auf der Zeitleiste" show-my-renotes: "Zeige meine Reposts auf der Zeitleiste"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "Listen" lists: "Listen"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "Einstellungen" settings: "Einstellungen"
signout: "Ausloggen" signout: "Ausloggen"
dark: "Verdunkeln" dark: "Verdunkeln"
@@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
@@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"
+32 -14
View File
@@ -84,6 +84,7 @@ common:
my-token-regenerated: "Your token has been regenerated, so you will be signed out." my-token-regenerated: "Your token has been regenerated, so you will be signed out."
i-like-sushi: "I prefer sushi rather than pudding" i-like-sushi: "I prefer sushi rather than pudding"
show-reversi-board-labels: "Show row and column labels in Reversi" show-reversi-board-labels: "Show row and column labels in Reversi"
use-contrast-reversi-stones: "Make the stone color clear"
verified-user: "Verified account" verified-user: "Verified account"
disable-animated-mfm: "Disable animated texts in a post" disable-animated-mfm: "Disable animated texts in a post"
reversi: reversi:
@@ -410,6 +411,7 @@ desktop:
uploading-avatar: "Uploading a new avatar" uploading-avatar: "Uploading a new avatar"
avatar-updated: "Successfully updated the avatar" avatar-updated: "Successfully updated the avatar"
choose-avatar: "Select an image for the avatar" choose-avatar: "Select an image for the avatar"
invalid-filetype: "This filetype is not acceptable here"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "Previous month" prev: "Previous month"
next: "Next month" next: "Next month"
go: "Click to navigate" go: "Click to navigate"
desktop/views/components/charts.vue:
title: "Charts"
per-day: "per Day"
per-hour: "per Hour"
notes: "Posts"
users: "Users"
drive: "Drive"
charts:
notes: "The number of posts: increase/decrease (Combined)"
local-notes: "The number of posts: increase/decrease (Local)"
remote-notes: "The number of posts: increase/decrease (Remote)"
notes-total: "The number of posts: cumulative total"
users: "The number of users: increase/decrease"
users-total: "The number of users: cumulative total"
drive: "Capacity used as the storage: increase/decrease"
drive-total: "Capacity used as the storage: cumulative total"
drive-files: "The number of files on the storage: increase/decrease"
drive-files-total: "The number of files on the storage: cumulative total"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "Choose files" choose-file: "Choose files"
upload: "Upload files from your device" upload: "Upload files from your device"
@@ -630,6 +650,7 @@ 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"
suggest-recent-hashtags: "Show recent popular hashtags on the post form" suggest-recent-hashtags: "Show recent popular hashtags on the post form"
show-clock-on-header: "Show clock on upper-right"
show-reply-target: "Display reply target" show-reply-target: "Display reply target"
show-my-renotes: "Show my renotes in the timeline" show-my-renotes: "Show my renotes in the timeline"
show-renoted-my-notes: "Show renoted my posts in timelines" show-renoted-my-notes: "Show renoted my posts in timelines"
@@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "Lists" lists: "Lists"
follow-requests: "Follow requests" follow-requests: "Follow requests"
customize: "Customize home layout" customize: "Customize home layout"
admin: "Admin"
settings: "Settings" settings: "Settings"
signout: "Sign out" signout: "Sign out"
dark: "Submerge in dark" dark: "Submerge in dark"
@@ -799,7 +821,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "Dashboard" dashboard: "Dashboard"
all-users: "All Users" all-users: "All Users"
original-users: "Users on this instance" original-users: "Users on this instance"
all-notes: "All Posts" all-notes: "All the posts"
original-notes: "Posts on this instance" original-notes: "Posts on this instance"
invite: "Invite" invite: "Invite"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
@@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "User account unverification settings" unverify-user: "User account unverification settings"
unverify: "Unverify account" unverify: "Unverify account"
unverified: "The account is now being unverified" unverified: "The account is now being unverified"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "Posts"
local: "Local"
remote: "Remote"
desktop/views/pages/admin/admin.users-chart.vue:
title: "Users"
local: "Local"
remote: "Remote"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "Drive"
local: "Local"
remote: "Remote"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Only media posts" is-media-only: "Only media posts"
is-media-view: "Media view" is-media-view: "Media view"
@@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "Reposted 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"
desktop/views/pages/stats/stats.vue:
all-users: "All Users"
original-users: "Users on this instance"
all-notes: "All the posts"
original-notes: "Posts on this instance"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "More details..." about: "More details..."
gotit: "Got it!" gotit: "Got it!"
@@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "Games" game: "Games"
darkmode: "Dark theme" darkmode: "Dark theme"
settings: "Settings" settings: "Settings"
admin: "Admin"
about: "About Misskey" about: "About Misskey"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "It seems this user hasn't posted anything yet." no-notes: "It seems this user hasn't posted anything yet."
@@ -1057,7 +1073,7 @@ mobile/views/pages/favorites.vue:
title: "Favorites" title: "Favorites"
mobile/views/pages/user-lists.vue: mobile/views/pages/user-lists.vue:
title: "Lists" title: "Lists"
enter-list-name: "Enter list name" enter-list-name: "Enter a name of the list to make"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "Drive" drive: "Drive"
more: "Load more" more: "Load more"
@@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "Updates will be applied after reloading the page" update-available-desc: "Updates will be applied after reloading the page"
settings: "Settings" settings: "Settings"
signout: "Sign out" signout: "Sign out"
sound: "Sounds"
enableSounds: "Enable sounds"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "Follows you" follows-you: "Follows you"
following: "Following" following: "Following"
+33 -15
View File
@@ -58,7 +58,7 @@ common:
friday: "Viernes" friday: "Viernes"
saturday: "Sábado" saturday: "Sábado"
reactions: reactions:
like: "me gusta" like: "いいね"
love: "amor" love: "amor"
laugh: "risa" laugh: "risa"
hmm: "hmm" hmm: "hmm"
@@ -84,6 +84,7 @@ common:
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado." my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
i-like-sushi: "Prefiero sushi a pudín" i-like-sushi: "Prefiero sushi a pudín"
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi" show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "Desactivar texto animado en una publicación" disable-animated-mfm: "Desactivar texto animado en una publicación"
reversi: reversi:
@@ -410,6 +411,7 @@ desktop:
uploading-avatar: "Cargando un nuevo avatar" uploading-avatar: "Cargando un nuevo avatar"
avatar-updated: "Avatar actualizado" avatar-updated: "Avatar actualizado"
choose-avatar: "Escoge una imagen de avatar" choose-avatar: "Escoge una imagen de avatar"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Negro ... Total" total: "Negro ... Total"
notes: "Azul ... Notas" notes: "Azul ... Notas"
@@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "Mes anterior" prev: "Mes anterior"
next: "Próximo mes" next: "Próximo mes"
go: "Click para navegar" go: "Click para navegar"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "Escoger archivos" choose-file: "Escoger archivos"
upload: "Cargar archivos de tu dispositivo" upload: "Cargar archivos de tu dispositivo"
@@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "Usar degradados en las cabeceras de las páginas" gradient-window-header: "Usar degradados en las cabeceras de las páginas"
post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo" post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
@@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"
+51 -33
View File
@@ -30,7 +30,7 @@ common:
quoted-by: "Cité·e par {} :" quoted-by: "Cité·e par {} :"
time: time:
unknown: "inconnu" unknown: "inconnu"
future: "future" future: "à l'instant"
just_now: "à l'instant" just_now: "à l'instant"
seconds_ago: "Il y a {} seconde·s" seconds_ago: "Il y a {} seconde·s"
minutes_ago: "Il y a {} minute·s" minutes_ago: "Il y a {} minute·s"
@@ -58,10 +58,10 @@ common:
friday: "Vendredi" friday: "Vendredi"
saturday: "Samedi" saturday: "Samedi"
reactions: reactions:
like: "Aime" like: "J'aime"
love: "Adore" love: "Adore"
laugh: "Rire" laugh: "Rire"
hmm: "Hmm ... ?" hmm: "Hmm ?"
surprise: "Wow" surprise: "Wow"
congrats: "Félicitations !" congrats: "Félicitations !"
angry: "En colère" angry: "En colère"
@@ -69,10 +69,10 @@ common:
rip: "RIP" rip: "RIP"
pudding: "Pudding" pudding: "Pudding"
note-placeholders: note-placeholders:
a: "Que faites vous maintenant ?" a: "Que faites-vous maintenant ?"
b: "Quoi de neuf ?" b: "Quoi de neuf ?"
c: "Qu'avez-vous en tête ?" c: "Qu'avez-vous en tête ?"
d: "Voulez-vous exprimer quelque chose ?" d: "Désirez-vous publier quelques mots ?"
e: "Écrivez ici" e: "Écrivez ici"
f: "En attente de vos écrits" f: "En attente de vos écrits"
search: "Recherche" search: "Recherche"
@@ -84,6 +84,7 @@ common:
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é."
i-like-sushi: "Je préfère les sushis plutôt que le pudding" i-like-sushi: "Je préfère les sushis plutôt que le pudding"
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi" show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "Compte vérifié" verified-user: "Compte vérifié"
disable-animated-mfm: "Désactiver les textes animés dans les publications" disable-animated-mfm: "Désactiver les textes animés dans les publications"
reversi: reversi:
@@ -230,7 +231,7 @@ common/views/components/connect-failed.troubleshooter.vue:
flush: "Vider le cache" flush: "Vider le cache"
set-version: "Choisissez une version" set-version: "Choisissez une version"
common/views/components/messaging.vue: common/views/components/messaging.vue:
search-user: "Trouver un·e utilisateur·rice" search-user: "Trouver un·e utilisateur·trice"
you: "Vous" you: "Vous"
no-history: "Pas d'historique" no-history: "Pas d'historique"
common/views/components/messaging-room.vue: common/views/components/messaging-room.vue:
@@ -287,7 +288,7 @@ common/views/components/signin.vue:
signin: "Se connecter" signin: "Se connecter"
or: "Ou" or: "Ou"
signin-with-twitter: "Se connecter via Twitter" signin-with-twitter: "Se connecter via Twitter"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" login-failed: "Échec d'authentification. Veuillez vérifier que votre nom d'utilisateur et mot de passe sont corrects."
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "Code dinvitation" invitation-code: "Code dinvitation"
invitation-info: "Si vous navez pas de code dinvitation, contactez un·e <a href=\"{}\">administrateur·rice</a>." invitation-info: "Si vous navez pas de code dinvitation, contactez un·e <a href=\"{}\">administrateur·rice</a>."
@@ -378,7 +379,7 @@ common/views/widgets/tips.vue:
tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note" tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note"
tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note" tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note"
tips-line5: "Vous pouvez téléverser des fichiers sur le Drive en faisant un glisser-déposer" tips-line5: "Vous pouvez téléverser des fichiers sur le Drive en faisant un glisser-déposer"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます" tips-line6: "Vous pouvez déplacer un dossier en le glissant dans le Drive"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます" tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres" tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres"
tips-line9: "Misskey est sous licence AGPLv3" tips-line9: "Misskey est sous licence AGPLv3"
@@ -410,6 +411,7 @@ desktop:
uploading-avatar: "Téléversement du nouvel avatar" uploading-avatar: "Téléversement du nouvel avatar"
avatar-updated: "L'avatar est mis à jour" avatar-updated: "L'avatar est mis à jour"
choose-avatar: "Choisir un avatar" choose-avatar: "Choisir un avatar"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Noirs ... Total" total: "Noirs ... Total"
notes: "Bleu ... Notes" notes: "Bleu ... Notes"
@@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "Mois dernier" prev: "Mois dernier"
next: "Mois prochain" next: "Mois prochain"
go: "Cliquez pour naviguer" go: "Cliquez pour naviguer"
desktop/views/components/charts.vue:
title: "Graphiques"
per-day: "par jour"
per-hour: "par heure"
notes: "Publications"
users: "Utilisateurs"
drive: "Drive"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "Sélection de fichiers" choose-file: "Sélection de fichiers"
upload: "Téléverser des fichiers à partir de votre ordinateur" upload: "Téléverser des fichiers à partir de votre ordinateur"
@@ -443,7 +463,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "Avatar" avatar: "Avatar"
banner: "Bannière" banner: "Bannière"
nsfw: "閲覧注意" nsfw: "CW"
contextmenu: contextmenu:
rename: "Renommer" rename: "Renommer"
mark-as-sensitive: "Marquer comme sensible" mark-as-sensitive: "Marquer comme sensible"
@@ -512,7 +532,7 @@ desktop/views/components/following.vue:
empty: "Vous ne suivez aucun compte." empty: "Vous ne suivez aucun compte."
desktop/views/components/friends-maker.vue: desktop/views/components/friends-maker.vue:
title: "Utilisateurs recommandés :" title: "Utilisateurs recommandés :"
empty: "Impossible de trouver des utilisateurs à recommander." empty: "Impossible de trouver des utilisateurs·trices à recommander."
fetching: "Chargement" fetching: "Chargement"
refresh: "Plus" refresh: "Plus"
close: "Fermer" close: "Fermer"
@@ -629,7 +649,8 @@ desktop/views/components/settings.vue:
circle-icons: "Utiliser des icônes circulaires" circle-icons: "Utiliser des icônes circulaires"
gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre" gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie"
show-clock-on-header: "Afficher l'horloge à droite sur le coté supérieur"
show-reply-target: "Afficher les réponses" show-reply-target: "Afficher les réponses"
show-my-renotes: "Afficher mes republications dans le fil" show-my-renotes: "Afficher mes republications dans le fil"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@@ -638,7 +659,7 @@ desktop/views/components/settings.vue:
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。" show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "Son" sound: "Son"
enable-sounds: "Activer le son" enable-sounds: "Activer le son"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。" enable-sounds-desc: "Jouer un son lorsque vous recevez un message. Ce paramètre est sauvegardé dans le navigateur."
volume: "Volume" volume: "Volume"
test: "Test" test: "Test"
mobile: "Mobile" mobile: "Mobile"
@@ -699,7 +720,7 @@ desktop/views/components/settings.2fa.vue:
desktop/views/components/settings.api.vue: desktop/views/components/settings.api.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。" regeneration-of-token: "Si votre jeton est compromis, vous pouvez le régénérer."
regenerate-token: "Regenerer le token" regenerate-token: "Regenerer le token"
token: "Jeton :" token: "Jeton :"
enter-password: "Veuillez entrer le mot de passe" enter-password: "Veuillez entrer le mot de passe"
@@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "Listes" lists: "Listes"
follow-requests: "Demandes de suivi" follow-requests: "Demandes de suivi"
customize: "Personnaliser l'Accueil" customize: "Personnaliser l'Accueil"
admin: "Admin"
settings: "Réglages" settings: "Réglages"
signout: "Déconnexion" signout: "Déconnexion"
dark: "Fall in dark" dark: "Fall in dark"
@@ -791,14 +813,14 @@ desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "Fermer" close: "Fermer"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "Tableau de bord"
drive: "Drive" drive: "Drive"
users: "Utilisateur·rice·s" users: "Utilisateur·rice·s"
update: "Mises à jour" update: "Mises à jour"
desktop/views/pages/admin/admin.dashboard.vue: desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "Tableau de bord"
all-users: "Tou·te·s les utilisateur·rice·s" all-users: "Toutes les utilisateurrices"
original-users: "Utilisateur·rice·s sur cette instance" original-users: "Utilisateurrices sur cette instance"
all-notes: "Toutes les publications" all-notes: "Toutes les publications"
original-notes: "Publication sur cette instance" original-notes: "Publication sur cette instance"
invite: "Invitation" invite: "Invitation"
@@ -811,25 +833,13 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend: "Suspension levée" unsuspend: "Suspension levée"
unsuspended: "La suspension de lutilisateur·rice a été levée avec succès" unsuspended: "La suspension de lutilisateur·rice a été levée avec succès"
desktop/views/pages/admin/admin.verify-user.vue: desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "Paramètres de vérification du compte utilisateur"
verify: "Vérification du compte" verify: "Vérification du compte"
verified: "Le compte a été vérifié" verified: "Le compte a été vérifié"
desktop/views/pages/admin/admin.unverify-user.vue: desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "Ôter la vérification du compte"
unverified: "公式アカウントを解除しました" unverified: "Ce compte n'est pas vérifié"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Les publications médias uniquement" is-media-only: "Les publications médias uniquement"
is-media-view: "Vue média" is-media-view: "Vue média"
@@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "Reposté par {}" reposted-by: "Reposté par {}"
private: "cette publication est privée" private: "cette publication est privée"
deleted: "cette publication a été supprimée" deleted: "cette publication a été supprimée"
desktop/views/pages/stats/stats.vue:
all-users: "Toutes les utilisateurrices"
original-users: "Utilisateurrices sur cette instance"
all-notes: "Toutes les publications"
original-notes: "Publication sur cette instance"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "à propos" about: "à propos"
gotit: "J'ai compris !" gotit: "J'ai compris !"
@@ -977,7 +992,7 @@ mobile/views/components/follow-button.vue:
follow-request: "Demande d'abonnement" follow-request: "Demande d'abonnement"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "Abonnez-vous aux utilisateurs" title: "Abonnez-vous aux utilisateurs"
empty: "Impossible de trouver des utilisateurs à recommander." empty: "Impossible de trouver des utilisateurs·trices à recommander."
fetching: "Chargement" fetching: "Chargement"
refresh: "Voir plus" refresh: "Voir plus"
close: "Fermer" close: "Fermer"
@@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "Jeux" game: "Jeux"
darkmode: "Mode nuit" darkmode: "Mode nuit"
settings: "Réglages" settings: "Réglages"
admin: "Admin"
about: "À propose de Misskey" about: "À propose de Misskey"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "Cette utilisateur semble n'avoir rien poster pour le moment" no-notes: "Cette utilisateur semble n'avoir rien poster pour le moment"
@@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "Les mises à jour seront appliquées une fois la page est rechargée." update-available-desc: "Les mises à jour seront appliquées une fois la page est rechargée."
settings: "Réglages" settings: "Réglages"
signout: "Déconnexion" signout: "Déconnexion"
sound: "Sons"
enableSounds: "Activer le son"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "vous suit" follows-you: "vous suit"
following: "Abonnements" following: "Abonnements"
+6 -6
View File
@@ -11,13 +11,13 @@ const loadLang = lang => yaml.safeLoad(
const native = loadLang('ja-JP'); const native = loadLang('ja-JP');
const langs = { const langs = {
'de': loadLang('de'), 'de-DE': loadLang('de-DE'),
'en': loadLang('en'), 'en-US': loadLang('en-US'),
'fr': loadLang('fr'), 'fr-FR': loadLang('fr-FR'),
'ja': native, 'ja-JP': native,
'ja-KS': loadLang('ja-KS'), 'ja-KS': loadLang('ja-KS'),
'pl': loadLang('pl'), 'pl-PL': loadLang('pl-PL'),
'es': loadLang('es') 'es-ES': loadLang('es-ES')
}; };
Object.values(langs).forEach(locale => { Object.values(langs).forEach(locale => {
+32 -14
View File
@@ -84,6 +84,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
@@ -410,6 +411,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました" avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択" choose-avatar: "アバターにする画像を選択"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
@@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
@@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"
+36 -17
View File
@@ -90,9 +90,12 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
reversi: reversi:
drawn: "引き分け" drawn: "引き分け"
my-turn: "あなたのターンです" my-turn: "あなたのターンです"
@@ -455,6 +458,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました" avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択" choose-avatar: "アバターにする画像を選択"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
@@ -472,6 +476,25 @@ desktop/views/components/calendar.vue:
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
@@ -712,6 +735,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@@ -856,6 +880,7 @@ desktop/views/components/ui.header.account.vue:
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@@ -913,8 +938,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
@@ -937,21 +962,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@@ -962,6 +972,12 @@ desktop/views/pages/deck/deck.note.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@@ -1213,6 +1229,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
@@ -1354,6 +1371,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
+339 -513
View File
File diff suppressed because it is too large Load Diff
+33 -15
View File
@@ -58,7 +58,7 @@ common:
friday: "금요일" friday: "금요일"
saturday: "토요일" saturday: "토요일"
reactions: reactions:
like: "좋네" like: "いいね"
love: "좋아" love: "좋아"
laugh: "크크" laugh: "크크"
hmm: "음..." hmm: "음..."
@@ -84,6 +84,7 @@ common:
my-token-regenerated: "당신의 토큰이 업데이트되어 있기 때문에 로그 아웃합니다." my-token-regenerated: "당신의 토큰이 업데이트되어 있기 때문에 로그 아웃합니다."
i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아" i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아"
show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시" show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할" disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할"
reversi: reversi:
@@ -410,6 +411,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました" avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択" choose-avatar: "アバターにする画像を選択"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
@@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
@@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"
+33 -15
View File
@@ -58,7 +58,7 @@ common:
friday: "Piątek" friday: "Piątek"
saturday: "Sobota" saturday: "Sobota"
reactions: reactions:
like: "Lubię" like: "いいね"
love: "Kocham" love: "Kocham"
laugh: "Śmieszne" laugh: "Śmieszne"
hmm: "Hmm…?" hmm: "Hmm…?"
@@ -84,6 +84,7 @@ common:
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany." my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
i-like-sushi: "Wolę sushi od puddingu" i-like-sushi: "Wolę sushi od puddingu"
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi" show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "Wyłącz animowany tekst we wpisach" disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
reversi: reversi:
@@ -410,6 +411,7 @@ desktop:
uploading-avatar: "Wysyłanie awatara" uploading-avatar: "Wysyłanie awatara"
avatar-updated: "Wysłano awatar" avatar-updated: "Wysłano awatar"
choose-avatar: "Wybierz awatar" choose-avatar: "Wybierz awatar"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Czarny … Łącznie" total: "Czarny … Łącznie"
notes: "Niebieski … Wpisy" notes: "Niebieski … Wpisy"
@@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "Poprzedni miesiąc" prev: "Poprzedni miesiąc"
next: "Następny miesiąc" next: "Następny miesiąc"
go: "Naciśnij, aby przejść" go: "Naciśnij, aby przejść"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "Wybierz plik" choose-file: "Wybierz plik"
upload: "Wyślij pliki z Twojego komputera" upload: "Wyślij pliki z Twojego komputera"
@@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "Używaj gradientów na pasku tytułu okna" gradient-window-header: "Używaj gradientów na pasku tytułu okna"
post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu" post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "Pokazuj cel odpowiedzi" show-reply-target: "Pokazuj cel odpowiedzi"
show-my-renotes: "Pokazuj moje udostępnienia na osi czasu" show-my-renotes: "Pokazuj moje udostępnienia na osi czasu"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "Listy" lists: "Listy"
follow-requests: "Prośby o śledzenie" follow-requests: "Prośby o śledzenie"
customize: "Dostosuj stronę główną" customize: "Dostosuj stronę główną"
admin: "管理"
settings: "Ustawienia" settings: "Ustawienia"
signout: "Wyloguj się" signout: "Wyloguj się"
dark: "Sprowadź ciemność" dark: "Sprowadź ciemność"
@@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Tylko wpisy z zawartością multimedialną" is-media-only: "Tylko wpisy z zawartością multimedialną"
is-media-view: "Widok multimediów" is-media-view: "Widok multimediów"
@@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "Udostępniono przez {}" reposted-by: "Udostępniono przez {}"
private: "ten wpis jest prywatny" private: "ten wpis jest prywatny"
deleted: "ten wpis został usunięty" deleted: "ten wpis został usunięty"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "O Misskey" about: "O Misskey"
gotit: "Rozumiem!" gotit: "Rozumiem!"
@@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "Gry" game: "Gry"
darkmode: "Tryb ciemny" darkmode: "Tryb ciemny"
settings: "Ustawienia" settings: "Ustawienia"
admin: "管理"
about: "O Misskey" about: "O Misskey"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "Wygląda na to, że ten użytkownik nie opublikował jeszcze niczego" no-notes: "Wygląda na to, że ten użytkownik nie opublikował jeszcze niczego"
@@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "Odśwież stronę, aby zastosować aktualizację." update-available-desc: "Odśwież stronę, aby zastosować aktualizację."
settings: "Ustawienia" settings: "Ustawienia"
signout: "Wyloguj" signout: "Wyloguj"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "Śledzi Cię" follows-you: "Śledzi Cię"
following: "Śledzeni" following: "Śledzeni"
+212 -194
View File
@@ -3,165 +3,166 @@ meta:
lang: "Português" lang: "Português"
divider: "" divider: ""
common: common:
misskey: "A ⭐ of fediverse" misskey: "Umado fediverso"
about-title: "A ⭐ of fediverse." about-title: "Umado fediverso."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。" about: "Obrigado por encontrar Misskey. Uma <b>plataforma descentralizada de microblog</b> nascida na Terra. Já que ela existe no Fediverso (um universo onde várias plataformas de mídia social são organizadas), ela é ligada com outras plataformas.Por que você não tira uma folga do agito e confusão da cidade, e mergulha em uma nova internet?"
adblock: adblock:
detected: "広告ブロッカーを無効にしてください" detected: "Por favor, desative o bloqueador de anúncios."
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。" warning: "Alguns recursos podem não estar disponíveis ou apresentar mal funcionamento se o bloqueio de anúncios estiver ativado. <strong>Misskey não está usando anúncios</strong>"
application-authorization: "アプリの連携" application-authorization: "Aplicativos autorizados"
close: "閉じる" close: "Fechar"
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。" do-not-copy-paste: "Por favor, não digite ou copie o código aqui. A conta pode ser comprometida."
got-it: "わかった" got-it: "Entendi!"
customization-tips: customization-tips:
title: "カスタマイズのヒント" title: "Dicas de personalização"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。" paragraph1: "Personalização da página inicial permite adicionar/remover, arrastar e soltar e reorganizar widgets."
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。" paragraph2: "Você pode mudar a visualização de alguns widgets <strong>clicando com o botão <strong>direito.</strong></strong>"
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。" paragraph3: "Para apagar um widget, o arraste e solte <strong>na área chamada \"Lixo\"</strong> no cabeçalho."
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。" paragraph4: "Para terminar a personalização clique em \"Terminar\" acima e à direita."
gotit: "Got it!" gotit: "Entendi!"
notification: notification:
file-uploaded: "ファイルがアップロードされました" file-uploaded: "Arquivo enviado!"
message-from: "{}さんからメッセージ:" message-from: "Mensagem de {}:"
reversi-invited: "対局への招待があります" reversi-invited: "Convidado a jogar"
reversi-invited-by: "{}さんから" reversi-invited-by: "Convidado por {}:"
notified-by: "{}さんから" notified-by: "Notificado por {}:"
reply-from: "{}さんから返信:" reply-from: "Resposta de {}:"
quoted-by: "{}さんが引用:" quoted-by: "Citado por {}:"
time: time:
unknown: "なぞのじかん" unknown: "Desconhecido"
future: "未来" future: "futuro"
just_now: "たった今" just_now: "agora"
seconds_ago: "{}秒前" seconds_ago: "{} sec atrás"
minutes_ago: "{}分前" minutes_ago: "{} min atrás"
hours_ago: "{}時間前" hours_ago: "{} h atrás"
days_ago: "{}日前" days_ago: "{} d atrás"
weeks_ago: "{}週間前" weeks_ago: "{} sem atrás"
months_ago: "{}ヶ月前" months_ago: "{} m atrás"
years_ago: "{}年前" years_ago: "{} ano(s) atrás"
month-and-day: "{month}月 {day}日" month-and-day: "{day}/{month}"
trash: "ゴミ箱" trash: "Lixo"
weekday-short: weekday-short:
sunday: "" sunday: "Dom"
monday: "" monday: "Seg"
tuesday: "" tuesday: "Ter"
wednesday: "" wednesday: "Qua"
thursday: "" thursday: "Qui"
friday: "" friday: "Sex"
saturday: "" saturday: "Seb"
weekday: weekday:
sunday: "日曜日" sunday: "domingo"
monday: "月曜日" monday: "segunda"
tuesday: "火曜日" tuesday: "terça"
wednesday: "水曜日" wednesday: "quarta"
thursday: "木曜日" thursday: "quinta"
friday: "金曜日" friday: "sexta"
saturday: "土曜日" saturday: "sábado"
reactions: reactions:
like: "いいね" like: "Curtir"
love: "しゅき" love: "Amei"
laugh: "" laugh: "Riso"
hmm: "ふぅ~む" hmm: "Hmm...?"
surprise: "わお" surprise: "Uau"
congrats: "おめでとう" congrats: "Parabéns!"
angry: "おこ" angry: "Raiva"
confused: "こまこまのこまり" confused: "Confuso"
rip: "RIP" rip: "RIP"
pudding: "Pudding" pudding: "Pudim"
note-placeholders: note-placeholders:
a: "今どうしてる?" a: "O que está fazendo?"
b: "何かありましたか?" b: "O que está acontecendo?"
c: "何をお考えですか?" c: "No que está pensando?"
d: "言いたいことは?" d: "Quer postar algo?"
e: "ここに書いてください" e: "Escreva aqui"
f: "あなたが書くのを待っています..." f: "Esperando você escrever."
search: "検索" search: "Buscar"
delete: "削除" delete: "Apagar"
loading: "読み込み中" loading: "Carregando"
ok: "わかった" ok: "OK"
update-available-title: "更新があります" update-available-title: "Atualização disponível"
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。" update-available: "Uma nova versão de Misskey está disponível ({newer}). A versão atual é {current}. Recarregue a página para atualizar."
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "Seu token foi recriado, portanto você foi deslogado."
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "Eu prefiro sushi a pudim"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "Mostrar etiquetas de colunas e linhas no Reversi"
verified-user: "公式アカウント" use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" verified-user: "Conta verificada"
disable-animated-mfm: "Desativar texto animado nas publicações"
reversi: reversi:
drawn: "引き分け" drawn: "Empatado"
my-turn: "あなたのターンです" my-turn: "Seu turno"
opponent-turn: "相手のターンです" opponent-turn: "Turno do oponente"
turn-of: "{}のターンです" turn-of: "turno de {}"
past-turn-of: "{}のターン" past-turn-of: "turno de {}"
won: "{}の勝ち" won: "{} venceu"
black: "" black: "Pretas"
white: "" white: "Brancas"
total: "合計" total: "Total"
this-turn: "{}ターン目" this-turn: "Turno de {}"
widgets: widgets:
analog-clock: "アナログ時計" analog-clock: "Relógio analógico"
profile: "プロフィール" profile: "Perfil"
calendar: "カレンダー" calendar: "Calendário"
timemachine: "カレンダー(タイムマシン)" timemachine: "Calendário (máquina do tempo)"
activity: "アクティビティ" activity: "Atividade"
rss: "RSSリーダー" rss: "Leitor de RSS"
memo: "付箋" memo: "Nota adesiva"
trends: "トレンド" trends: "Tendências"
photo-stream: "フォトストリーム" photo-stream: "フォトストリーム"
posts-monitor: "投稿チャート" posts-monitor: "Gráfico de publicações"
slideshow: "スライドショー" slideshow: "スライドショー"
version: "バージョン" version: "Versão"
broadcast: "ブロードキャスト" broadcast: "ブロードキャスト"
notifications: "通知" notifications: "Notificações"
users: "おすすめユーザー" users: "Usuário sugeridos"
polls: "アンケート" polls: "Enquetes"
post-form: "投稿フォーム" post-form: "Formulário de publicação"
messaging: "メッセージ" messaging: "Mensagens"
server: "サーバー情報" server: "Informações do servidor"
donation: "寄付のお願い" donation: "Doações"
nav: "ナビゲーション" nav: "Navegação"
tips: "ヒント" tips: "Dicas"
hashtags: "ハッシュタグ" hashtags: "Hashtags"
deck: deck:
widgets: "ウィジェット" widgets: "Widgets"
home: "ホーム" home: "Início"
local: "ローカル" local: "Local"
hybrid: "ソーシャル" hybrid: "Social"
global: "グローバル" global: "Global"
notifications: "通知" notifications: "Notificações"
list: "リスト" list: "Listas"
swap-left: "左に移動" swap-left: "Mover para a esquerda"
swap-right: "右に移動" swap-right: "Mover para a direita"
swap-up: "上に移動" swap-up: "Mover para cima"
swap-down: "下に移動" swap-down: "Mover para baixo"
remove: "カラムを削除" remove: "Remover"
add-column: "カラムを追加" add-column: "Adicionar coluna"
rename: "名前を変更" rename: "Renomear"
stack-left: "左に重ねる" stack-left: "左に重ねる"
pop-right: "右に出す" pop-right: "Acoplar à direita"
auth/views/form.vue: auth/views/form.vue:
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?" share-access: "Você <b>permite</b> que <i>{{ app.name }}</i> acesse sua conta?"
permission-ask: "このアプリは次の権限を要求しています:" permission-ask: "Este aplicativo precisa das seguintes permissões:"
account-read: "アカウントの情報を見る。" account-read: "Ver informações da conta."
account-write: "アカウントの情報を操作する。" account-write: "Modificar informações da conta."
note-write: "投稿する。" note-write: "Publicar"
like-write: "いいねしたりいいね解除する。" like-write: "いいねしたりいいね解除する。"
following-write: "フォローしたりフォロー解除する。" following-write: "フォローしたりフォロー解除する。"
drive-read: "ドライブを見る。" drive-read: "ドライブを見る。"
drive-write: "ドライブを操作する。" drive-write: "ドライブを操作する。"
notification-read: "通知を見る。" notification-read: "通知を見る。"
notification-write: "通知を操作する。" notification-write: "通知を操作する。"
cancel: "キャンセル" cancel: "Cancelar"
accept: "アクセスを許可" accept: "Permitir acesso"
auth/views/index.vue: auth/views/index.vue:
loading: "読み込み中" loading: "Carregando"
denied: "アプリケーションの連携をキャンセルしました。" denied: "アプリケーションの連携をキャンセルしました。"
denied-paragraph: "このアプリがあなたのアカウントにアクセスすることはありません。" denied-paragraph: "このアプリがあなたのアカウントにアクセスすることはありません。"
already-authorized: "このアプリは既に連携済みです" already-authorized: "Este aplicativo já foi autorizado"
allowed: "アプリケーションの連携を許可しました" allowed: "Aplicativos com acesso autorizado"
callback-url: "アプリケーションに戻っています" callback-url: "Voltando ao aplicativo"
please-go-back: "アプリケーションに戻って、やっていってください。" please-go-back: "Por favor, volte ao aplicativo."
error: "セッションが存在しません。" error: "A sessão não existe."
sign-in: "サインインしてください" sign-in: "Por favor, entre."
common/views/components/games/reversi/reversi.vue: common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "{}を待っています" waiting-for: "{}を待っています"
@@ -175,17 +176,17 @@ common/views/components/games/reversi/reversi.game.vue:
common/views/components/games/reversi/reversi.index.vue: common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi" title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう" sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
invite: "招待" invite: "Convidar"
rule: "遊び方" rule: "Como jogar"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。" rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待" mode-invite: "Convidar"
mode-invite-desc: "指定したユーザーと対戦するモードです。" mode-invite-desc: "Convidar um usuário para jogar"
invitations: "対局の招待があります!" invitations: "Você foi convidado!"
my-games: "自分の対局" my-games: "Meu jogo"
all-games: "みんなの対局" all-games: "Todos os jogos"
enter-username: "ユーザー名を入力してください" enter-username: "Digite o nome de usuário."
game-state: game-state:
ended: "終了" ended: "Terminado"
playing: "進行中" playing: "進行中"
common/views/components/games/reversi/reversi.room.vue: common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定" settings-of-the-game: "ゲームの設定"
@@ -193,7 +194,7 @@ common/views/components/games/reversi/reversi.room.vue:
random: "ランダム" random: "ランダム"
black-or-white: "先手/後手" black-or-white: "先手/後手"
black-is: "{}が黒" black-is: "{}が黒"
rules: "ルール" rules: "Regras"
is-llotheo: "石の少ない方が勝ち(ロセオ)" is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ" looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード" can-put-everywhere: "どこでも置けるモード"
@@ -202,7 +203,7 @@ common/views/components/games/reversi/reversi.room.vue:
waiting-for-other: "相手の準備が完了するのを待っています" waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています" waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中" waiting-for-both: "準備中"
cancel: "キャンセル" cancel: "Cancelar"
ready: "準備完了" ready: "準備完了"
cancel-ready: "準備続行" cancel-ready: "準備続行"
common/views/components/connect-failed.vue: common/views/components/connect-failed.vue:
@@ -227,11 +228,11 @@ common/views/components/connect-failed.troubleshooter.vue:
no-server-desc: "お使いのPCのインターネット接続は正常ですが、Misskeyのサーバーには接続できませんでした。サーバーがダウンまたはメンテナンスしている可能性があるので、しばらくしてから再度御アクセスください。" no-server-desc: "お使いのPCのインターネット接続は正常ですが、Misskeyのサーバーには接続できませんでした。サーバーがダウンまたはメンテナンスしている可能性があるので、しばらくしてから再度御アクセスください。"
success: "Misskeyのサーバーに接続できました" success: "Misskeyのサーバーに接続できました"
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。" success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
flush: "キャッシュの削除" flush: "Limpar o cache"
set-version: "バージョン指定" set-version: "バージョン指定"
common/views/components/messaging.vue: common/views/components/messaging.vue:
search-user: "ユーザーを探す" search-user: "ユーザーを探す"
you: "あなた" you: "Você"
no-history: "履歴はありません" no-history: "履歴はありません"
common/views/components/messaging-room.vue: common/views/components/messaging-room.vue:
empty: "このユーザーと話したことはありません" empty: "このユーザーと話したことはありません"
@@ -410,6 +411,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました" avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択" choose-avatar: "アバターにする画像を選択"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
@@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@@ -779,7 +801,7 @@ desktop/views/components/user-lists-window.vue:
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
following: "フォロー" following: "フォロー"
followers: "フォロワー" followers: "Seguidores"
desktop/views/components/users-list.vue: desktop/views/components/users-list.vue:
all: "すべて" all: "すべて"
iknow: "知り合い" iknow: "知り合い"
@@ -793,14 +815,14 @@ desktop/views/components/window.vue:
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
drive: "ドライブ" drive: "ドライブ"
users: "ユーザー" users: "Usuários"
update: "更新" update: "Actualizações"
desktop/views/pages/admin/admin.dashboard.vue: desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "Todos os usuários"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@@ -845,24 +860,24 @@ desktop/views/pages/welcome.vue:
signup: "新規登録" signup: "新規登録"
signin-button: "やってる" signin-button: "やってる"
signup-button: "やる" signup-button: "やる"
timeline: "タイムライン" timeline: "Timeline"
powered-by-misskey: "Powered by <b>Misskey</b>." powered-by-misskey: "Desenvolvido por <b>Misskey</b>."
desktop/views/pages/drive.vue: desktop/views/pages/drive.vue:
title: "Misskey Drive" title: "Drive Misskey"
desktop/views/pages/favorites.vue: desktop/views/pages/favorites.vue:
more: "さらに読み込む" more: "Carregar mais"
desktop/views/pages/home-customize.vue: desktop/views/pages/home-customize.vue:
title: "ホームのカスタマイズ" title: "Personalizar a página inicial"
desktop/views/pages/note.vue: desktop/views/pages/note.vue:
prev: "前の投稿" prev: "Nota anterior"
next: "次の投稿" next: "Próxima nota"
desktop/views/pages/selectdrive.vue: desktop/views/pages/selectdrive.vue:
title: "ファイルを選択してください" title: "Selecione um arquivo"
ok: "決定" ok: "OK"
cancel: "キャンセル" cancel: "Cancelar"
upload: "PCからドライブにファイルをアップロード" upload: "Envie arquivos do seu dispositivo"
desktop/views/pages/search.vue: desktop/views/pages/search.vue:
not-available: "検索機能はインスタンスの設定で無効になっています。" not-available: "A pesquisa está desligada nas configurações desta instância."
not-found: "「{}」に関する投稿は見つかりませんでした。" not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue: desktop/views/pages/share.vue:
share-with: "{}で共有" share-with: "{}で共有"
@@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
@@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"
@@ -1170,29 +1188,29 @@ mobile/views/pages/user.vue:
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーは凍結されています。"
is-remote: "このユーザーはリモートユーザーです。" is-remote: "Este é uma usuário remoto. O perfil que vê aqui pode não estar completo."
view-remote: "正確な情報を見る" view-remote: "Ver o perfil completo."
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "Notas recentes"
images: "画像" images: "Imagens"
activity: "アクティビティ" activity: "Atividade"
keywords: "キーワード" keywords: "キーワード"
domains: "頻出ドメイン" domains: "頻出ドメイン"
frequently-replied-users: "よく会話するユーザー" frequently-replied-users: "よく会話するユーザー"
followers-you-know: "知り合いのフォロワー" followers-you-know: "Seguidores que você conhece"
last-used-at: "最終ログイン" last-used-at: "Ativo pela última vez:"
mobile/views/pages/user/home.followers-you-know.vue: mobile/views/pages/user/home.followers-you-know.vue:
loading: "読み込み中" loading: "Carregando"
no-users: "知り合いのユーザーはいません" no-users: "知り合いのユーザーはいません"
mobile/views/pages/user/home.friends.vue: mobile/views/pages/user/home.friends.vue:
loading: "読み込み中" loading: "読み込み中"
no-users: "よく会話するユーザーはいません" no-users: "よく会話するユーザーはいません"
mobile/views/pages/user/home.notes.vue: mobile/views/pages/user/home.notes.vue:
loading: "読み込み中" loading: "Carregando"
no-notes: "投稿はありません" no-notes: "Nenhuma mensagem"
mobile/views/pages/user/home.photos.vue: mobile/views/pages/user/home.photos.vue:
loading: "読み込み中" loading: "Carregando"
no-photos: "写真はありません" no-photos: "Sem fotos"
docs: docs:
edit-this-page-on-github: "間違いや改善点を見つけましたか?" edit-this-page-on-github: "間違いや改善点を見つけましたか?"
edit-this-page-on-github-link: "このページをGitHubで編集" edit-this-page-on-github-link: "このページをGitHubで編集"
@@ -1209,11 +1227,11 @@ docs:
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。" duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。" min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
show-src: "このエンドポイントのソースコードも閲覧できます。" show-src: "このエンドポイントのソースコードも閲覧できます。"
show-src-link: "コードをGitHubで見る" show-src-link: "Veja o código no GitHub"
generated: "このドキュメントはAPI定義に基づき自動生成されています。" generated: "Este documento foi gerado pelas definições da API."
props: props:
name: "名前" name: "Nome"
type: "" type: "Tipo"
description: "説明" description: "Descrição"
dev/views/index.vue: dev/views/index.vue:
manage-apps: "アプリの管理" manage-apps: "Gerenciar aplicativos"
+32 -14
View File
@@ -84,6 +84,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
@@ -410,6 +411,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました" avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択" choose-avatar: "アバターにする画像を選択"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
@@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
@@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"
+32 -14
View File
@@ -84,6 +84,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
@@ -410,6 +411,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました" avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択" choose-avatar: "アバターにする画像を選択"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
@@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
@@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"
+19 -15
View File
@@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "7.2.0", "version": "8.16.0",
"clientVersion": "1.0.8724", "clientVersion": "1.0.9191",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,
@@ -32,7 +32,7 @@
"@types/debug": "0.0.30", "@types/debug": "0.0.30",
"@types/deep-equal": "1.0.1", "@types/deep-equal": "1.0.1",
"@types/double-ended-queue": "2.1.0", "@types/double-ended-queue": "2.1.0",
"@types/elasticsearch": "5.0.25", "@types/elasticsearch": "5.0.26",
"@types/file-type": "5.2.1", "@types/file-type": "5.2.1",
"@types/gulp": "3.8.36", "@types/gulp": "3.8.36",
"@types/gulp-htmlmin": "1.3.32", "@types/gulp-htmlmin": "1.3.32",
@@ -60,7 +60,7 @@
"@types/mocha": "5.2.3", "@types/mocha": "5.2.3",
"@types/mongodb": "3.1.4", "@types/mongodb": "3.1.4",
"@types/ms": "0.7.30", "@types/ms": "0.7.30",
"@types/node": "10.7.1", "@types/node": "10.9.3",
"@types/portscanner": "2.1.0", "@types/portscanner": "2.1.0",
"@types/pug": "2.0.4", "@types/pug": "2.0.4",
"@types/qrcode": "1.2.0", "@types/qrcode": "1.2.0",
@@ -70,16 +70,16 @@
"@types/request-promise-native": "1.0.15", "@types/request-promise-native": "1.0.15",
"@types/rimraf": "2.0.2", "@types/rimraf": "2.0.2",
"@types/seedrandom": "2.4.27", "@types/seedrandom": "2.4.27",
"@types/sharp": "0.17.9", "@types/sharp": "0.17.10",
"@types/showdown": "1.7.5", "@types/showdown": "1.7.5",
"@types/single-line-log": "1.1.0", "@types/single-line-log": "1.1.0",
"@types/speakeasy": "2.0.2", "@types/speakeasy": "2.0.2",
"@types/systeminformation": "3.23.0", "@types/systeminformation": "3.23.0",
"@types/tmp": "0.0.33", "@types/tmp": "0.0.33",
"@types/uuid": "3.4.3", "@types/uuid": "3.4.4",
"@types/webpack": "4.4.10", "@types/webpack": "4.4.11",
"@types/webpack-stream": "3.2.10", "@types/webpack-stream": "3.2.10",
"@types/websocket": "0.0.39", "@types/websocket": "0.0.40",
"@types/ws": "6.0.0", "@types/ws": "6.0.0",
"animejs": "2.2.0", "animejs": "2.2.0",
"autosize": "4.0.2", "autosize": "4.0.2",
@@ -89,6 +89,7 @@
"bootstrap-vue": "2.0.0-rc.11", "bootstrap-vue": "2.0.0-rc.11",
"cafy": "11.3.0", "cafy": "11.3.0",
"chalk": "2.4.1", "chalk": "2.4.1",
"chart.js": "2.7.2",
"commander": "2.17.1", "commander": "2.17.1",
"crc-32": "1.2.0", "crc-32": "1.2.0",
"css-loader": "1.0.0", "css-loader": "1.0.0",
@@ -149,6 +150,7 @@
"loader-utils": "1.1.0", "loader-utils": "1.1.0",
"lodash.assign": "4.2.0", "lodash.assign": "4.2.0",
"mecab-async": "0.1.2", "mecab-async": "0.1.2",
"merge-options": "1.0.1",
"minio": "7.0.0", "minio": "7.0.0",
"mkdirp": "0.5.1", "mkdirp": "0.5.1",
"mocha": "5.2.0", "mocha": "5.2.0",
@@ -156,7 +158,8 @@
"mongodb": "3.1.1", "mongodb": "3.1.1",
"monk": "6.0.6", "monk": "6.0.6",
"ms": "2.1.1", "ms": "2.1.1",
"nan": "2.10.0", "nan": "2.11.0",
"nested-property": "0.0.7",
"node-sass": "4.9.3", "node-sass": "4.9.3",
"node-sass-json-importer": "3.3.1", "node-sass-json-importer": "3.3.1",
"nprogress": "0.2.0", "nprogress": "0.2.0",
@@ -187,11 +190,11 @@
"single-line-log": "1.1.2", "single-line-log": "1.1.2",
"speakeasy": "2.0.0", "speakeasy": "2.0.0",
"stringz": "1.0.0", "stringz": "1.0.0",
"style-loader": "0.22.1", "style-loader": "0.23.0",
"stylus": "0.54.5", "stylus": "0.54.5",
"stylus-loader": "3.0.2", "stylus-loader": "3.0.2",
"summaly": "2.1.3", "summaly": "2.2.0",
"systeminformation": "3.42.9", "systeminformation": "3.44.2",
"syuilo-password-strength": "0.0.1", "syuilo-password-strength": "0.0.1",
"textarea-caret": "3.1.0", "textarea-caret": "3.1.0",
"tmp": "0.0.33", "tmp": "0.0.33",
@@ -205,10 +208,11 @@
"uuid": "3.3.2", "uuid": "3.3.2",
"v-animate-css": "0.0.2", "v-animate-css": "0.0.2",
"vue": "2.5.17", "vue": "2.5.17",
"vue-chartjs": "3.4.0",
"vue-cropperjs": "2.2.1", "vue-cropperjs": "2.2.1",
"vue-js-modal": "1.3.17", "vue-js-modal": "1.3.24",
"vue-json-tree-view": "2.1.4", "vue-json-tree-view": "2.1.4",
"vue-loader": "15.4.0", "vue-loader": "15.4.1",
"vue-router": "3.0.1", "vue-router": "3.0.1",
"vue-style-loader": "4.1.2", "vue-style-loader": "4.1.2",
"vue-template-compiler": "2.5.17", "vue-template-compiler": "2.5.17",
@@ -217,7 +221,7 @@
"vuex-persistedstate": "2.5.4", "vuex-persistedstate": "2.5.4",
"web-push": "3.3.2", "web-push": "3.3.2",
"webfinger.js": "2.6.6", "webfinger.js": "2.6.6",
"webpack": "4.17.0", "webpack": "4.17.1",
"webpack-cli": "3.1.0", "webpack-cli": "3.1.0",
"websocket": "1.0.26", "websocket": "1.0.26",
"ws": "6.0.0", "ws": "6.0.0",
+13 -6
View File
@@ -38,15 +38,22 @@
//#endregion //#endregion
//#region Detect the user language //#region Detect the user language
let lang = navigator.language; let lang = null;
if (!LANGS.includes(lang)) lang = lang.split('-')[0]; if (LANGS.includes(navigator.language)) {
lang = navigator.language;
} else {
lang = LANGS.find(x => x.split('-')[0] == navigator.language);
// The default language is English if (lang == null) {
if (!LANGS.includes(lang)) lang = 'en'; // Fallback
lang = 'en-US';
}
}
if (settings) { if (settings && settings.device.lang &&
if (settings.device.lang) lang = settings.device.lang; LANGS.includes(settings.device.lang)) {
lang = settings.device.lang;
} }
//#endregion //#endregion
@@ -18,11 +18,11 @@
</div> </div>
<div class="board"> <div class="board">
<div class="labels-x" v-if="this.$store.state.settings.reversiBoardLabels"> <div class="labels-x" v-if="this.$store.state.settings.games.reversi.showBoardLabels">
<span v-for="i in game.settings.map[0].length">{{ String.fromCharCode(64 + i) }}</span> <span v-for="i in game.settings.map[0].length">{{ String.fromCharCode(64 + i) }}</span>
</div> </div>
<div class="flex"> <div class="flex">
<div class="labels-y" v-if="this.$store.state.settings.reversiBoardLabels"> <div class="labels-y" v-if="this.$store.state.settings.games.reversi.showBoardLabels">
<div v-for="i in game.settings.map.length">{{ i }}</div> <div v-for="i in game.settings.map.length">{{ i }}</div>
</div> </div>
<div class="cells" :style="cellsStyle"> <div class="cells" :style="cellsStyle">
@@ -30,15 +30,15 @@
:class="{ empty: stone == null, none: o.map[i] == 'null', isEnded: game.isEnded, myTurn: !game.isEnded && isMyTurn, can: turnUser ? o.canPut(turnUser.id == blackUser.id, i) : null, prev: o.prevPos == i }" :class="{ empty: stone == null, none: o.map[i] == 'null', isEnded: game.isEnded, myTurn: !game.isEnded && isMyTurn, can: turnUser ? o.canPut(turnUser.id == blackUser.id, i) : null, prev: o.prevPos == i }"
@click="set(i)" @click="set(i)"
:title="`${String.fromCharCode(65 + o.transformPosToXy(i)[0])}${o.transformPosToXy(i)[1] + 1}`"> :title="`${String.fromCharCode(65 + o.transformPosToXy(i)[0])}${o.transformPosToXy(i)[1] + 1}`">
<img v-if="stone === true" :src="blackUser.avatarUrl" alt=""> <img v-if="stone === true" :src="blackUser.avatarUrl" alt="black" :class="{ contrast: $store.state.settings.games.reversi.useContrastStones }">
<img v-if="stone === false" :src="whiteUser.avatarUrl" alt=""> <img v-if="stone === false" :src="whiteUser.avatarUrl" alt="white" :class="{ contrast: $store.state.settings.games.reversi.useContrastStones }">
</div> </div>
</div> </div>
<div class="labels-y" v-if="this.$store.state.settings.reversiBoardLabels"> <div class="labels-y" v-if="this.$store.state.settings.games.reversi.showBoardLabels">
<div v-for="i in game.settings.map.length">{{ i }}</div> <div v-for="i in game.settings.map.length">{{ i }}</div>
</div> </div>
</div> </div>
<div class="labels-x" v-if="this.$store.state.settings.reversiBoardLabels"> <div class="labels-x" v-if="this.$store.state.settings.games.reversi.showBoardLabels">
<span v-for="i in game.settings.map[0].length">{{ String.fromCharCode(64 + i) }}</span> <span v-for="i in game.settings.map[0].length">{{ String.fromCharCode(64 + i) }}</span>
</div> </div>
</div> </div>
@@ -421,6 +421,13 @@ root(isDark)
width 100% width 100%
height 100% height 100%
&.contrast
&[alt="black"]
filter brightness(.5)
&[alt="white"]
filter brightness(2)
> .graph > .graph
display grid display grid
grid-template-columns repeat(61, 1fr) grid-template-columns repeat(61, 1fr)
+11 -8
View File
@@ -6,7 +6,7 @@
<i></i> <i></i>
<a :href="feedbackUrl" target="_blank">%i18n:@feedback%</a> <a :href="feedbackUrl" target="_blank">%i18n:@feedback%</a>
<i></i> <i></i>
<a :href="devUrl">%i18n:@develop%</a> <a href="/dev">%i18n:@develop%</a>
<i></i> <i></i>
<a href="https://twitter.com/misskey_xyz" target="_blank">Follow us on %fa:B twitter%</a> <a href="https://twitter.com/misskey_xyz" target="_blank">Follow us on %fa:B twitter%</a>
</span> </span>
@@ -14,18 +14,21 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { docsUrl, statsUrl, statusUrl, devUrl, repositoryUrl, feedbackUrl, lang } from '../../../config'; import { lang } from '../../../config';
export default Vue.extend({ export default Vue.extend({
data() { data() {
return { return {
aboutUrl: `${docsUrl}/${lang}/about`, aboutUrl: `/docs/${lang}/about`,
statsUrl, repositoryUrl: 'https://github.com/syuilo/misskey',
statusUrl, feedbackUrl: 'https://github.com/syuilo/misskey/issues/new'
devUrl,
repositoryUrl: repositoryUrl || `https://github.com/syuilo/misskey`,
feedbackUrl: feedbackUrl || `https://github.com/syuilo/misskey/issues/new`
} }
},
created() {
(this as any).os.getMeta().then(meta => {
if (meta.maintainer.repository_url) this.repositoryUrl = meta.maintainer.repository_url;
if (meta.maintainer.feedback_url) this.feedbackUrl = meta.maintainer.feedback_url;
});
} }
}); });
</script> </script>
@@ -1,5 +1,7 @@
<template> <template>
<iframe v-if="player" :src="player" heigth="250" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen /> <div v-if="player.url" class="player" :style="`padding: ${(player.height || 0) / (player.width || 1) * 100}% 0 0`">
<iframe :src="player.url" :width="player.width || '100%'" :heigth="player.height || 250" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen />
</div>
<div v-else-if="tweetUrl && detail" class="twitter"> <div v-else-if="tweetUrl && detail" class="twitter">
<blockquote ref="tweet" class="twitter-tweet" :data-theme="$store.state.device.darkmode ? 'dark' : null"> <blockquote ref="tweet" class="twitter-tweet" :data-theme="$store.state.device.darkmode ? 'dark' : null">
<a :href="url"></a> <a :href="url"></a>
@@ -26,18 +28,99 @@
import Vue from 'vue'; import Vue from 'vue';
import { url as misskeyUrl } from '../../../config'; import { url as misskeyUrl } from '../../../config';
// THIS IS THE WHITELIST FOR THE EMBED PLAYER
const whiteList = [
'afreecatv.com',
'aparat.com',
'applemusic.com',
'amazon.com',
'awa.fm',
'bandcamp.com',
'bbc.co.uk',
'beatport.com',
'bilibili.com',
'boomstream.com',
'breakers.tv',
'cam4.com',
'cavelis.net',
'chaturbate.com',
'cnn.com',
'cybergame.tv',
'dailymotion.com',
'deezer.com',
'djlive.pl',
'e-onkyo.com',
'eventials.com',
'facebook.com',
'fc2.com',
'gameplank.tv',
'goodgame.ru',
'google.com',
'hardtunes.com',
'instagram.com',
'johnnylooch.com',
'kexp.org',
'lahzenegar.com',
'liveedu.tv',
'livetube.cc',
'livestream.com',
'meridix.com',
'mixcloud.com',
'mixer.com',
'mobcrush.com',
'mylive.in.th',
'myspace.com',
'netflix.com',
'newretrowave.com',
'nhk.or.jp',
'nicovideo.jp',
'nico.ms',
'noisetrade.com',
'nood.tv',
'npr.org',
'openrec.tv',
'pandora.com',
'pandora.tv',
'picarto.tv',
'pscp.tv',
'restream.io',
'reverbnation.com',
'sermonaudio.com',
'smashcast.tv',
'songkick.com',
'soundcloud.com',
'spinninrecords.com',
'spotify.com',
'stitcher.com',
'stream.me',
'switchboard.live',
'tunein.com',
'twitcasting.tv',
'twitch.tv',
'twitter.com',
'vaughnlive.tv',
'veoh.com',
'vimeo.com',
'watchpeoplecode.com',
'web.tv',
'youtube.com',
'youtu.be'
];
export default Vue.extend({ export default Vue.extend({
props: { props: {
url: { url: {
type: String, type: String,
require: true require: true
}, },
detail: { detail: {
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
} }
}, },
data() { data() {
return { return {
fetching: true, fetching: true,
@@ -46,11 +129,16 @@ export default Vue.extend({
thumbnail: null, thumbnail: null,
icon: null, icon: null,
sitename: null, sitename: null,
player: null, player: {
url: null,
width: null,
height: null
},
tweetUrl: null, tweetUrl: null,
misskeyUrl misskeyUrl
}; };
}, },
created() { created() {
const url = new URL(this.url); const url = new URL(this.url);
@@ -75,104 +163,37 @@ export default Vue.extend({
} }
return; return;
} }
fetch('/url?url=' + encodeURIComponent(this.url)).then(res => { fetch('/url?url=' + encodeURIComponent(this.url)).then(res => {
res.json().then(info => { res.json().then(info => {
if (info.url != null) { if (info.url == null) return;
this.title = info.title; this.title = info.title;
this.description = info.description; this.description = info.description;
this.thumbnail = info.thumbnail; this.thumbnail = info.thumbnail;
this.icon = info.icon; this.icon = info.icon;
this.sitename = info.sitename; this.sitename = info.sitename;
this.fetching = false; this.fetching = false;
if ([ // THIS IS THE WHITELIST FOR THE EMBED PLAYER if (whiteList.some(x => x == url.hostname || url.hostname.endsWith(`.${x}`))) {
'afreecatv.com', this.player = info.player;
'aparat.com', }
'applemusic.com', })
'amazon.com', });
'awa.fm', }
'bandcamp.com',
'bbc.co.uk',
'beatport.com',
'bilibili.com',
'boomstream.com',
'breakers.tv',
'cam4.com',
'cavelis.net',
'chaturbate.com',
'cnn.com',
'cybergame.tv',
'dailymotion.com',
'deezer.com',
'djlive.pl',
'e-onkyo.com',
'eventials.com',
'facebook.com',
'fc2.com',
'gameplank.tv',
'goodgame.ru',
'google.com',
'hardtunes.com',
'instagram.com',
'johnnylooch.com',
'kexp.org',
'lahzenegar.com',
'liveedu.tv',
'livetube.cc',
'livestream.com',
'meridix.com',
'mixcloud.com',
'mixer.com',
'mobcrush.com',
'mylive.in.th',
'myspace.com',
'netflix.com',
'newretrowave.com',
'nhk.or.jp',
'nicovideo.jp',
'nico.ms',
'noisetrade.com',
'nood.tv',
'npr.org',
'openrec.tv',
'pandora.com',
'pandora.tv',
'picarto.tv',
'pscp.tv',
'restream.io',
'reverbnation.com',
'sermonaudio.com',
'smashcast.tv',
'songkick.com',
'soundcloud.com',
'spinninrecords.com',
'spotify.com',
'stitcher.com',
'stream.me',
'switchboard.live',
'tunein.com',
'twitcasting.tv',
'twitch.tv',
'twitter.com',
'vaughnlive.tv',
'veoh.com',
'vimeo.com',
'watchpeoplecode.com',
'web.tv',
'youtube.com',
'youtu.be'
].some(x => x == url.hostname || url.hostname.endsWith(`.${x}`)))
this.player = info.player;
} // info.url
}) // json
}); // fetch
} // created
}); });
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
iframe .player
position relative
width 100% width 100%
> iframe
height 100%
left 0
position absolute
top 0
width 100%
root(isDark) root(isDark)
> a > a
display block display block
+5 -3
View File
@@ -1,8 +1,10 @@
import Vue from 'vue'; import Vue from 'vue';
Vue.filter('bytes', (v, digits = 0) => { Vue.filter('bytes', (v, digits = 0) => {
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
if (v == 0) return '0Byte'; if (v == 0) return '0';
const isMinus = v < 0;
if (isMinus) v = -v;
const i = Math.floor(Math.log(v) / Math.log(1024)); const i = Math.floor(Math.log(v) / Math.log(1024));
return (v / Math.pow(1024, i)).toFixed(digits).replace(/\.0+$/, '') + sizes[i]; return (isMinus ? '-' : '') + (v / Math.pow(1024, i)).toFixed(digits).replace(/\.0+$/, '') + sizes[i];
}); });
@@ -2,9 +2,9 @@
<div class="mkw-donation" :data-mobile="platform == 'mobile'"> <div class="mkw-donation" :data-mobile="platform == 'mobile'">
<article> <article>
<h1>%fa:heart%%i18n:@title%</h1> <h1>%fa:heart%%i18n:@title%</h1>
<p> <p v-if="meta">
{{ '%i18n:@text%'.substr(0, '%i18n:@text%'.indexOf('{')) }} {{ '%i18n:@text%'.substr(0, '%i18n:@text%'.indexOf('{')) }}
<a href="https://syuilo.com">@syuilo</a> <a :href="meta.maintainer.url">{{ meta.maintainer.name }}</a>
{{ '%i18n:@text%'.substr('%i18n:@text%'.indexOf('}') + 1) }} {{ '%i18n:@text%'.substr('%i18n:@text%'.indexOf('}') + 1) }}
</p> </p>
</article> </article>
@@ -15,6 +15,17 @@
import define from '../../../common/define-widget'; import define from '../../../common/define-widget';
export default define({ export default define({
name: 'donation' name: 'donation'
}).extend({
data() {
return {
meta: null
};
},
created() {
(this as any).os.getMeta().then(meta => {
this.meta = meta;
});
}
}); });
</script> </script>
+2
View File
@@ -4,6 +4,7 @@ declare const _THEME_COLOR_: string;
declare const _COPYRIGHT_: string; declare const _COPYRIGHT_: string;
declare const _VERSION_: string; declare const _VERSION_: string;
declare const _CODENAME_: string; declare const _CODENAME_: string;
declare const _ENV_: string;
const address = new URL(location.href); const address = new URL(location.href);
@@ -18,3 +19,4 @@ export const themeColor = _THEME_COLOR_;
export const copyright = _COPYRIGHT_; export const copyright = _COPYRIGHT_;
export const version = _VERSION_; export const version = _VERSION_;
export const codename = _CODENAME_; export const codename = _CODENAME_;
export const env = _ENV_;
+44 -25
View File
@@ -3,8 +3,21 @@ import { apiUrl } from '../../config';
import CropWindow from '../views/components/crop-window.vue'; import CropWindow from '../views/components/crop-window.vue';
import ProgressDialog from '../views/components/progress-dialog.vue'; import ProgressDialog from '../views/components/progress-dialog.vue';
export default (os: OS) => (cb, file = null) => { export default (os: OS) => {
const fileSelected = file => {
const cropImage = file => new Promise((resolve, reject) => {
const regex = RegExp('\.(jpg|jpeg|png|gif|webp|bmp|tiff)$');
if (!regex.test(file.name) ) {
os.apis.dialog({
title: '%fa:info-circle% %i18n:desktop.invalid-filetype%',
text: null,
actions: [{
text: '%i18n:common.got-it%'
}]
});
reject();
}
const w = os.new(CropWindow, { const w = os.new(CropWindow, {
image: file, image: file,
@@ -19,27 +32,29 @@ export default (os: OS) => (cb, file = null) => {
os.api('drive/folders/find', { os.api('drive/folders/find', {
name: '%i18n:desktop.avatar%' name: '%i18n:desktop.avatar%'
}).then(iconFolder => { }).then(avatarFolder => {
if (iconFolder.length === 0) { if (avatarFolder.length === 0) {
os.api('drive/folders/create', { os.api('drive/folders/create', {
name: '%i18n:desktop.avatar%' name: '%i18n:desktop.avatar%'
}).then(iconFolder => { }).then(iconFolder => {
upload(data, iconFolder); resolve(upload(data, iconFolder));
}); });
} else { } else {
upload(data, iconFolder[0]); resolve(upload(data, avatarFolder[0]));
} }
}); });
}); });
w.$once('skipped', () => { w.$once('skipped', () => {
set(file); resolve(file);
}); });
document.body.appendChild(w.$el); w.$once('cancelled', reject);
};
const upload = (data, folder) => { document.body.appendChild(w.$el);
});
const upload = (data, folder) => new Promise((resolve, reject) => {
const dialog = os.new(ProgressDialog, { const dialog = os.new(ProgressDialog, {
title: '%i18n:desktop.uploading-avatar%' title: '%i18n:desktop.uploading-avatar%'
}); });
@@ -52,18 +67,19 @@ export default (os: OS) => (cb, file = null) => {
xhr.onload = e => { xhr.onload = e => {
const file = JSON.parse((e.target as any).response); const file = JSON.parse((e.target as any).response);
(dialog as any).close(); (dialog as any).close();
set(file); resolve(file);
}; };
xhr.onerror = reject;
xhr.upload.onprogress = e => { xhr.upload.onprogress = e => {
if (e.lengthComputable) (dialog as any).update(e.loaded, e.total); if (e.lengthComputable) (dialog as any).update(e.loaded, e.total);
}; };
xhr.send(data); xhr.send(data);
}; });
const set = file => { const setAvatar = file => {
os.api('i/update', { return os.api('i/update', {
avatarId: file.id avatarId: file.id
}).then(i => { }).then(i => {
os.store.commit('updateIKeyValue', { os.store.commit('updateIKeyValue', {
@@ -83,18 +99,21 @@ export default (os: OS) => (cb, file = null) => {
}] }]
}); });
if (cb) cb(i); return i;
}); });
}; };
if (file) { return (file = null) => {
fileSelected(file); const selectedFile = file
} else { ? Promise.resolve(file)
os.apis.chooseDriveFile({ : os.apis.chooseDriveFile({
multiple: false, multiple: false,
title: '%fa:image% %i18n:desktop.choose-avatar%' title: '%fa:image% %i18n:desktop.choose-avatar%'
}).then(file => { });
fileSelected(file);
}); return selectedFile
} .then(cropImage)
.then(setAvatar)
.catch(err => err && console.warn(err));
};
}; };
@@ -6,6 +6,19 @@ import ProgressDialog from '../views/components/progress-dialog.vue';
export default (os: OS) => { export default (os: OS) => {
const cropImage = file => new Promise((resolve, reject) => { const cropImage = file => new Promise((resolve, reject) => {
const regex = RegExp('\.(jpg|jpeg|png|gif|webp|bmp|tiff)$');
if (!regex.test(file.name) ) {
os.apis.dialog({
title: '%fa:info-circle% %i18n:desktop.invalid-filetype%',
text: null,
actions: [{
text: '%i18n:common.got-it%'
}]
});
reject();
}
const w = os.new(CropWindow, { const w = os.new(CropWindow, {
image: file, image: file,
title: '%i18n:desktop.banner-crop-title%', title: '%i18n:desktop.banner-crop-title%',
+3 -1
View File
@@ -25,6 +25,7 @@ import updateBanner from './api/update-banner';
import MkIndex from './views/pages/index.vue'; import MkIndex from './views/pages/index.vue';
import MkDeck from './views/pages/deck/deck.vue'; import MkDeck from './views/pages/deck/deck.vue';
import MkAdmin from './views/pages/admin/admin.vue'; import MkAdmin from './views/pages/admin/admin.vue';
import MkStats from './views/pages/stats/stats.vue';
import MkUser from './views/pages/user/user.vue'; import MkUser from './views/pages/user/user.vue';
import MkFavorites from './views/pages/favorites.vue'; import MkFavorites from './views/pages/favorites.vue';
import MkSelectDrive from './views/pages/selectdrive.vue'; import MkSelectDrive from './views/pages/selectdrive.vue';
@@ -57,6 +58,7 @@ init(async (launch) => {
{ path: '/', name: 'index', component: MkIndex }, { path: '/', name: 'index', component: MkIndex },
{ path: '/deck', name: 'deck', component: MkDeck }, { path: '/deck', name: 'deck', component: MkDeck },
{ path: '/admin', name: 'admin', component: MkAdmin }, { path: '/admin', name: 'admin', component: MkAdmin },
{ path: '/stats', name: 'stats', component: MkStats },
{ path: '/i/customize-home', component: MkHomeCustomize }, { path: '/i/customize-home', component: MkHomeCustomize },
{ path: '/i/favorites', component: MkFavorites }, { path: '/i/favorites', component: MkFavorites },
{ path: '/i/messaging/:user', component: MkMessagingRoom }, { path: '/i/messaging/:user', component: MkMessagingRoom },
@@ -94,7 +96,7 @@ init(async (launch) => {
/** /**
* Init Notification * Init Notification
*/ */
if ('Notification' in window) { if ('Notification' in window && os.store.getters.isSignedIn) {
// 許可を得ていなかったらリクエスト // 許可を得ていなかったらリクエスト
if ((Notification as any).permission == 'default') { if ((Notification as any).permission == 'default') {
await Notification.requestPermission(); await Notification.requestPermission();
@@ -0,0 +1,42 @@
import Vue from 'vue';
import { Line } from 'vue-chartjs';
import * as mergeOptions from 'merge-options';
export default Vue.extend({
extends: Line,
props: {
data: {
required: true
},
opts: {
required: false
}
},
watch: {
data() {
this.render();
}
},
mounted() {
this.render();
},
methods: {
render() {
this.renderChart(this.data, mergeOptions({
responsive: true,
maintainAspectRatio: false,
scales: {
xAxes: [{
type: 'time',
distribution: 'series'
}]
},
tooltips: {
intersect: false,
mode: 'x',
position: 'nearest'
}
}, this.opts || {}));
}
}
});
@@ -0,0 +1,587 @@
<template>
<div class="gkgckalzgidaygcxnugepioremxvxvpt">
<header>
<b>%i18n:@title%:</b>
<select v-model="chartType">
<optgroup label="%i18n:@users%">
<option value="users">%i18n:@charts.users%</option>
<option value="users-total">%i18n:@charts.users-total%</option>
</optgroup>
<optgroup label="%i18n:@notes%">
<option value="notes">%i18n:@charts.notes%</option>
<option value="local-notes">%i18n:@charts.local-notes%</option>
<option value="remote-notes">%i18n:@charts.remote-notes%</option>
<option value="notes-total">%i18n:@charts.notes-total%</option>
</optgroup>
<optgroup label="%i18n:@drive%">
<option value="drive-files">%i18n:@charts.drive-files%</option>
<option value="drive-files-total">%i18n:@charts.drive-files-total%</option>
<option value="drive">%i18n:@charts.drive%</option>
<option value="drive-total">%i18n:@charts.drive-total%</option>
</optgroup>
</select>
<div>
<span @click="span = 'day'" :class="{ active: span == 'day' }">%i18n:@per-day%</span> | <span @click="span = 'hour'" :class="{ active: span == 'hour' }">%i18n:@per-hour%</span>
</div>
</header>
<div>
<x-chart v-if="chart" :data="data[0]" :opts="data[1]"/>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import XChart from './charts.chart.ts';
const colors = {
local: 'rgb(246, 88, 79)',
remote: 'rgb(65, 221, 222)',
localPlus: 'rgb(52, 178, 118)',
remotePlus: 'rgb(158, 255, 209)',
localMinus: 'rgb(255, 97, 74)',
remoteMinus: 'rgb(255, 149, 134)'
};
const rgba = (color: string): string => {
return color.replace('rgb', 'rgba').replace(')', ', 0.1)');
};
export default Vue.extend({
components: {
XChart
},
data() {
return {
chart: null,
chartType: 'notes',
span: 'hour'
};
},
computed: {
data(): any {
if (this.chart == null) return null;
switch (this.chartType) {
case 'users': return this.usersChart(false);
case 'users-total': return this.usersChart(true);
case 'notes': return this.notesChart('combined');
case 'local-notes': return this.notesChart('local');
case 'remote-notes': return this.notesChart('remote');
case 'notes-total': return this.notesTotalChart();
case 'drive': return this.driveChart();
case 'drive-total': return this.driveTotalChart();
case 'drive-files': return this.driveFilesChart();
case 'drive-files-total': return this.driveFilesTotalChart();
}
},
stats(): any[] {
return (
this.span == 'day' ? this.chart.perDay :
this.span == 'hour' ? this.chart.perHour :
null
);
}
},
created() {
(this as any).api('chart', {
limit: 32
}).then(chart => {
this.chart = chart;
});
},
methods: {
notesChart(type: string): any {
const data = this.stats.slice().reverse().map(x => ({
date: new Date(x.date),
normal: type == 'local' ? x.notes.local.diffs.normal : type == 'remote' ? x.notes.remote.diffs.normal : x.notes.local.diffs.normal + x.notes.remote.diffs.normal,
reply: type == 'local' ? x.notes.local.diffs.reply : type == 'remote' ? x.notes.remote.diffs.reply : x.notes.local.diffs.reply + x.notes.remote.diffs.reply,
renote: type == 'local' ? x.notes.local.diffs.renote : type == 'remote' ? x.notes.remote.diffs.renote : x.notes.local.diffs.renote + x.notes.remote.diffs.renote,
all: type == 'local' ? (x.notes.local.inc + -x.notes.local.dec) : type == 'remote' ? (x.notes.remote.inc + -x.notes.remote.dec) : (x.notes.local.inc + -x.notes.local.dec) + (x.notes.remote.inc + -x.notes.remote.dec)
}));
return [{
datasets: [{
label: 'All',
fill: false,
borderColor: '#555',
borderWidth: 2,
borderDash: [4, 4],
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.all }))
}, {
label: 'Renotes',
fill: true,
backgroundColor: 'rgba(161, 222, 65, 0.1)',
borderColor: '#a1de41',
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.renote }))
}, {
label: 'Replies',
fill: true,
backgroundColor: 'rgba(247, 121, 108, 0.1)',
borderColor: '#f7796c',
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.reply }))
}, {
label: 'Normal',
fill: true,
backgroundColor: 'rgba(65, 221, 222, 0.1)',
borderColor: '#41ddde',
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.normal }))
}]
}, {
scales: {
yAxes: [{
ticks: {
callback: value => {
return Vue.filter('number')(value);
}
}
}]
},
tooltips: {
callbacks: {
label: (tooltipItem, data) => {
const label = data.datasets[tooltipItem.datasetIndex].label || '';
return `${label}: ${Vue.filter('number')(tooltipItem.yLabel)}`;
}
}
}
}];
},
notesTotalChart(): any {
const data = this.stats.slice().reverse().map(x => ({
date: new Date(x.date),
localCount: x.notes.local.total,
remoteCount: x.notes.remote.total
}));
return [{
datasets: [{
label: 'Combined',
fill: false,
borderColor: '#555',
borderWidth: 2,
borderDash: [4, 4],
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteCount + x.localCount }))
}, {
label: 'Local',
fill: true,
backgroundColor: rgba(colors.local),
borderColor: colors.local,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.localCount }))
}, {
label: 'Remote',
fill: true,
backgroundColor: rgba(colors.remote),
borderColor: colors.remote,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteCount }))
}]
}, {
scales: {
yAxes: [{
ticks: {
callback: value => {
return Vue.filter('number')(value);
}
}
}]
},
tooltips: {
callbacks: {
label: (tooltipItem, data) => {
const label = data.datasets[tooltipItem.datasetIndex].label || '';
return `${label}: ${Vue.filter('number')(tooltipItem.yLabel)}`;
}
}
}
}];
},
usersChart(total: boolean): any {
const data = this.stats.slice().reverse().map(x => ({
date: new Date(x.date),
localCount: total ? x.users.local.total : (x.users.local.inc + -x.users.local.dec),
remoteCount: total ? x.users.remote.total : (x.users.remote.inc + -x.users.remote.dec)
}));
return [{
datasets: [{
label: 'Combined',
fill: false,
borderColor: '#555',
borderWidth: 2,
borderDash: [4, 4],
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteCount + x.localCount }))
}, {
label: 'Local',
fill: true,
backgroundColor: rgba(colors.local),
borderColor: colors.local,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.localCount }))
}, {
label: 'Remote',
fill: true,
backgroundColor: rgba(colors.remote),
borderColor: colors.remote,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteCount }))
}]
}, {
scales: {
yAxes: [{
ticks: {
callback: value => {
return Vue.filter('number')(value);
}
}
}]
},
tooltips: {
callbacks: {
label: (tooltipItem, data) => {
const label = data.datasets[tooltipItem.datasetIndex].label || '';
return `${label}: ${Vue.filter('number')(tooltipItem.yLabel)}`;
}
}
}
}];
},
driveChart(): any {
const data = this.stats.slice().reverse().map(x => ({
date: new Date(x.date),
localInc: x.drive.local.incSize,
localDec: -x.drive.local.decSize,
remoteInc: x.drive.remote.incSize,
remoteDec: -x.drive.remote.decSize,
}));
return [{
datasets: [{
label: 'All',
fill: false,
borderColor: '#555',
borderWidth: 2,
borderDash: [4, 4],
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.localInc + x.localDec + x.remoteInc + x.remoteDec }))
}, {
label: 'Local +',
fill: true,
backgroundColor: rgba(colors.localPlus),
borderColor: colors.localPlus,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.localInc }))
}, {
label: 'Local -',
fill: true,
backgroundColor: rgba(colors.localMinus),
borderColor: colors.localMinus,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.localDec }))
}, {
label: 'Remote +',
fill: true,
backgroundColor: rgba(colors.remotePlus),
borderColor: colors.remotePlus,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteInc }))
}, {
label: 'Remote -',
fill: true,
backgroundColor: rgba(colors.remoteMinus),
borderColor: colors.remoteMinus,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteDec }))
}]
}, {
scales: {
yAxes: [{
ticks: {
callback: value => {
return Vue.filter('bytes')(value, 1);
}
}
}]
},
tooltips: {
callbacks: {
label: (tooltipItem, data) => {
const label = data.datasets[tooltipItem.datasetIndex].label || '';
return `${label}: ${Vue.filter('bytes')(tooltipItem.yLabel, 1)}`;
}
}
}
}];
},
driveTotalChart(): any {
const data = this.stats.slice().reverse().map(x => ({
date: new Date(x.date),
localSize: x.drive.local.totalSize,
remoteSize: x.drive.remote.totalSize
}));
return [{
datasets: [{
label: 'Combined',
fill: false,
borderColor: '#555',
borderWidth: 2,
borderDash: [4, 4],
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteSize + x.localSize }))
}, {
label: 'Local',
fill: true,
backgroundColor: rgba(colors.local),
borderColor: colors.local,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.localSize }))
}, {
label: 'Remote',
fill: true,
backgroundColor: rgba(colors.remote),
borderColor: colors.remote,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteSize }))
}]
}, {
scales: {
yAxes: [{
ticks: {
callback: value => {
return Vue.filter('bytes')(value, 1);
}
}
}]
},
tooltips: {
callbacks: {
label: (tooltipItem, data) => {
const label = data.datasets[tooltipItem.datasetIndex].label || '';
return `${label}: ${Vue.filter('bytes')(tooltipItem.yLabel, 1)}`;
}
}
}
}];
},
driveFilesChart(): any {
const data = this.stats.slice().reverse().map(x => ({
date: new Date(x.date),
localInc: x.drive.local.incCount,
localDec: -x.drive.local.decCount,
remoteInc: x.drive.remote.incCount,
remoteDec: -x.drive.remote.decCount
}));
return [{
datasets: [{
label: 'All',
fill: false,
borderColor: '#555',
borderWidth: 2,
borderDash: [4, 4],
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.localInc + x.localDec + x.remoteInc + x.remoteDec }))
}, {
label: 'Local +',
fill: true,
backgroundColor: rgba(colors.localPlus),
borderColor: colors.localPlus,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.localInc }))
}, {
label: 'Local -',
fill: true,
backgroundColor: rgba(colors.localMinus),
borderColor: colors.localMinus,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.localDec }))
}, {
label: 'Remote +',
fill: true,
backgroundColor: rgba(colors.remotePlus),
borderColor: colors.remotePlus,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteInc }))
}, {
label: 'Remote -',
fill: true,
backgroundColor: rgba(colors.remoteMinus),
borderColor: colors.remoteMinus,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteDec }))
}]
}, {
scales: {
yAxes: [{
ticks: {
callback: value => {
return Vue.filter('number')(value);
}
}
}]
},
tooltips: {
callbacks: {
label: (tooltipItem, data) => {
const label = data.datasets[tooltipItem.datasetIndex].label || '';
return `${label}: ${Vue.filter('number')(tooltipItem.yLabel)}`;
}
}
}
}];
},
driveFilesTotalChart(): any {
const data = this.stats.slice().reverse().map(x => ({
date: new Date(x.date),
localCount: x.drive.local.totalCount,
remoteCount: x.drive.remote.totalCount,
}));
return [{
datasets: [{
label: 'Combined',
fill: false,
borderColor: '#555',
borderWidth: 2,
borderDash: [4, 4],
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.localCount + x.remoteCount }))
}, {
label: 'Local',
fill: true,
backgroundColor: rgba(colors.local),
borderColor: colors.local,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.localCount }))
}, {
label: 'Remote',
fill: true,
backgroundColor: rgba(colors.remote),
borderColor: colors.remote,
borderWidth: 2,
pointBackgroundColor: '#fff',
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteCount }))
}]
}, {
scales: {
yAxes: [{
ticks: {
callback: value => {
return Vue.filter('number')(value);
}
}
}]
},
tooltips: {
callbacks: {
label: (tooltipItem, data) => {
const label = data.datasets[tooltipItem.datasetIndex].label || '';
return `${label}: ${Vue.filter('number')(tooltipItem.yLabel)}`;
}
}
}
}];
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
.gkgckalzgidaygcxnugepioremxvxvpt
padding 32px
background #fff
box-shadow 0 2px 8px rgba(#000, 0.1)
*
user-select none
> header
display flex
margin 0 0 1em 0
padding 0 0 8px 0
font-size 1em
color #555
border-bottom solid 1px #eee
> b
margin-right 8px
> *:last-child
margin-left auto
*
&:not(.active)
color $theme-color
cursor pointer
> div
> *
display block
height 320px
</style>
@@ -47,7 +47,7 @@
</div> </div>
<mk-poll v-if="p.poll" :note="p"/> <mk-poll v-if="p.poll" :note="p"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/> <mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
<div class="map" v-if="p.geo" ref="map"></div> <div class="map" v-if="p.geo" ref="map"></div>
<div class="renote" v-if="p.renote"> <div class="renote" v-if="p.renote">
<mk-note-preview :note="p.renote"/> <mk-note-preview :note="p.renote"/>
@@ -32,7 +32,7 @@
<mk-media-list :media-list="p.media"/> <mk-media-list :media-list="p.media"/>
</div> </div>
<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> <mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a> <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a>
<div class="map" v-if="p.geo" ref="map"></div> <div class="map" v-if="p.geo" ref="map"></div>
<div class="renote" v-if="p.renote"> <div class="renote" v-if="p.renote">
<mk-note-preview :note="p.renote"/> <mk-note-preview :note="p.renote"/>
@@ -49,6 +49,7 @@
</div> </div>
<mk-switch v-model="$store.state.settings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/> <mk-switch v-model="$store.state.settings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/>
<mk-switch v-model="$store.state.settings.suggestRecentHashtags" @change="onChangeSuggestRecentHashtags" text="%i18n:@suggest-recent-hashtags%"/> <mk-switch v-model="$store.state.settings.suggestRecentHashtags" @change="onChangeSuggestRecentHashtags" text="%i18n:@suggest-recent-hashtags%"/>
<mk-switch v-model="$store.state.settings.showClockOnHeader" @change="onChangeShowClockOnHeader" text="%i18n:@show-clock-on-header%"/>
<mk-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/> <mk-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/>
<mk-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/> <mk-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/>
<mk-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/> <mk-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/>
@@ -56,8 +57,9 @@
<mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%"> <mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%">
<span>%i18n:@show-maps-desc%</span> <span>%i18n:@show-maps-desc%</span>
</mk-switch> </mk-switch>
<mk-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/>
<mk-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/> <mk-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/>
<mk-switch v-model="$store.state.settings.games.reversi.showBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/>
<mk-switch v-model="$store.state.settings.games.reversi.useContrastStones" @change="onChangeUseContrastReversiStones" text="%i18n:common.use-contrast-reversi-stones%"/>
</section> </section>
<section class="web" v-show="page == 'web'"> <section class="web" v-show="page == 'web'">
@@ -332,6 +334,12 @@ export default Vue.extend({
value: v value: v
}); });
}, },
onChangeShowClockOnHeader(v) {
this.$store.dispatch('settings/set', {
key: 'showClockOnHeader',
value: v
});
},
onChangeShowReplyTarget(v) { onChangeShowReplyTarget(v) {
this.$store.dispatch('settings/set', { this.$store.dispatch('settings/set', {
key: 'showReplyTarget', key: 'showReplyTarget',
@@ -376,7 +384,13 @@ export default Vue.extend({
}, },
onChangeReversiBoardLabels(v) { onChangeReversiBoardLabels(v) {
this.$store.dispatch('settings/set', { this.$store.dispatch('settings/set', {
key: 'reversiBoardLabels', key: 'games.reversi.showBoardLabels',
value: v
});
},
onChangeUseContrastReversiStones(v) {
this.$store.dispatch('settings/set', {
key: 'games.reversi.useContrastStones',
value: v value: v
}); });
}, },
@@ -30,10 +30,8 @@
<li @click="settings"> <li @click="settings">
<p>%fa:cog%<span>%i18n:@settings%</span>%fa:angle-right%</p> <p>%fa:cog%<span>%i18n:@settings%</span>%fa:angle-right%</p>
</li> </li>
</ul> <li v-if="$store.state.i.isAdmin">
<ul> <router-link to="/admin">%fa:terminal%<span>%i18n:@admin%</span>%fa:angle-right%</router-link>
<li @click="signout">
<p class="signout">%fa:power-off%<span>%i18n:@signout%</span></p>
</li> </li>
</ul> </ul>
<ul> <ul>
@@ -41,6 +39,11 @@
<p><span>%i18n:@dark%</span><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template></p> <p><span>%i18n:@dark%</span><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template></p>
</li> </li>
</ul> </ul>
<ul>
<li @click="signout">
<p class="signout">%fa:power-off%<span>%i18n:@signout%</span></p>
</li>
</ul>
</div> </div>
</transition> </transition>
</div> </div>
@@ -11,7 +11,7 @@
<li class="deck" :class="{ active: $route.name == 'deck' }" @click="goToTop"> <li class="deck" :class="{ active: $route.name == 'deck' }" @click="goToTop">
<router-link to="/deck"> <router-link to="/deck">
%fa:columns% %fa:columns%
<p>%i18n:@deck% <small>(beta)</small></p> <p>%i18n:@deck%</p>
</router-link> </router-link>
</li> </li>
<li class="messaging"> <li class="messaging">
@@ -1,5 +1,6 @@
<template> <template>
<div class="header"> <div class="header">
<p class="warn" v-if="env != 'production'">%i18n:common.do-not-use-in-production%</p>
<mk-special-message/> <mk-special-message/>
<div class="main" ref="main"> <div class="main" ref="main">
<div class="backdrop"></div> <div class="backdrop"></div>
@@ -17,7 +18,7 @@
<x-account v-if="$store.getters.isSignedIn"/> <x-account v-if="$store.getters.isSignedIn"/>
<x-notifications v-if="$store.getters.isSignedIn"/> <x-notifications v-if="$store.getters.isSignedIn"/>
<x-post v-if="$store.getters.isSignedIn"/> <x-post v-if="$store.getters.isSignedIn"/>
<x-clock/> <x-clock v-if="$store.state.settings.showClockOnHeader"/>
</div> </div>
</div> </div>
</div> </div>
@@ -28,6 +29,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import * as anime from 'animejs'; import * as anime from 'animejs';
import { env } from '../../../config';
import XNav from './ui.header.nav.vue'; import XNav from './ui.header.nav.vue';
import XSearch from './ui.header.search.vue'; import XSearch from './ui.header.search.vue';
@@ -43,7 +45,13 @@ export default Vue.extend({
XAccount, XAccount,
XNotifications, XNotifications,
XPost, XPost,
XClock, XClock
},
data() {
return {
env: env
};
}, },
mounted() { mounted() {
@@ -119,6 +127,15 @@ root(isDark)
width 100% width 100%
box-shadow 0 1px 1px rgba(#000, 0.075) box-shadow 0 1px 1px rgba(#000, 0.075)
> .warn
display block
margin 0
padding 4px
text-align center
font-size 12px
background #f00
color #fff
> .main > .main
height 48px height 48px
@@ -48,7 +48,7 @@ export default Vue.extend({
this.open(); this.open();
}); });
} else { } else {
const query = this.user[0] == '@' ? const query = this.user.startsWith('@') ?
parseAcct(this.user.substr(1)) : parseAcct(this.user.substr(1)) :
{ userId: this.user }; { userId: this.user };
@@ -1,16 +1,20 @@
<template> <template>
<div class="obdskegsannmntldydackcpzezagxqfy card"> <div class="obdskegsannmntldydackcpzezagxqfy mk-admin-card">
<header>%i18n:@dashboard%</header> <header>%i18n:@dashboard%</header>
<div v-if="stats" class="stats"> <div v-if="stats" class="stats">
<div><b>%fa:user% {{ stats.originalUsersCount | number }}</b><span>%i18n:@original-users%</span></div> <div><b>%fa:user% {{ stats.originalUsersCount | number }}</b><span>%i18n:@original-users%</span></div>
<div><span>%fa:user% {{ stats.usersCount | number }}</span><span>%i18n:@all-users%</span></div> <div><span>%fa:user% {{ stats.usersCount | number }}</span><span>%i18n:@all-users%</span></div>
<div><b>%fa:pen% {{ stats.originalNotesCount | number }}</b><span>%i18n:@original-notes%</span></div> <div><b>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</b><span>%i18n:@original-notes%</span></div>
<div><span>%fa:pen% {{ stats.notesCount | number }}</span><span>%i18n:@all-notes%</span></div> <div><span>%fa:pencil-alt% {{ stats.notesCount | number }}</span><span>%i18n:@all-notes%</span></div>
</div> </div>
<div class="cpu-memory"> <div class="cpu-memory">
<x-cpu-memory :connection="connection"/> <x-cpu-memory :connection="connection"/>
</div> </div>
<div> <div>
<label>
<input type="checkbox" v-model="disableRegistration" @change="updateMeta">
<span>disableRegistration</span>
</label>
<button class="ui" @click="invite">%i18n:@invite%</button> <button class="ui" @click="invite">%i18n:@invite%</button>
<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p> <p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p>
</div> </div>
@@ -28,6 +32,7 @@ export default Vue.extend({
data() { data() {
return { return {
stats: null, stats: null,
disableRegistration: false,
inviteCode: null, inviteCode: null,
connection: null, connection: null,
connectionId: null connectionId: null
@@ -37,6 +42,10 @@ export default Vue.extend({
this.connection = (this as any).os.streams.serverStatsStream.getConnection(); this.connection = (this as any).os.streams.serverStatsStream.getConnection();
this.connectionId = (this as any).os.streams.serverStatsStream.use(); this.connectionId = (this as any).os.streams.serverStatsStream.use();
(this as any).os.getMeta().then(meta => {
this.disableRegistration = meta.disableRegistration;
});
(this as any).api('stats').then(stats => { (this as any).api('stats').then(stats => {
this.stats = stats; this.stats = stats;
}); });
@@ -49,6 +58,11 @@ export default Vue.extend({
(this as any).api('admin/invite').then(x => { (this as any).api('admin/invite').then(x => {
this.inviteCode = x.code; this.inviteCode = x.code;
}); });
},
updateMeta() {
(this as any).api('admin/update-meta', {
disableRegistration: this.disableRegistration
});
} }
} }
}); });
@@ -1,51 +0,0 @@
<template>
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
<polyline
:points="points"
fill="none"
stroke-width="1"
stroke="#555"/>
</svg>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: {
chart: {
required: true
},
type: {
type: String,
required: true
}
},
data() {
return {
viewBoxX: 365,
viewBoxY: 70,
points: null
};
},
created() {
const peak = Math.max.apply(null, this.chart.map(d => this.type == 'local' ? d.drive.local.totalSize : d.drive.remote.totalSize));
if (peak != 0) {
const data = this.chart.slice().reverse().map(x => ({
size: this.type == 'local' ? x.drive.local.totalSize : x.drive.remote.totalSize
}));
this.points = data.map((d, i) => `${i},${(1 - (d.size / peak)) * this.viewBoxY}`).join(' ');
}
}
});
</script>
<style lang="stylus" scoped>
svg
display block
padding 10px
width 100%
</style>
@@ -1,34 +0,0 @@
<template>
<div class="card">
<header>%i18n:@title%</header>
<div class="card">
<header>%i18n:@local%</header>
<x-chart v-if="chart" :chart="chart" type="local"/>
</div>
<div class="card">
<header>%i18n:@remote%</header>
<x-chart v-if="chart" :chart="chart" type="remote"/>
</div>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import XChart from "./admin.drive-chart.chart.vue";
export default Vue.extend({
components: {
XChart
},
props: {
chart: {
required: true
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
</style>
@@ -1,76 +0,0 @@
<template>
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
<polyline
:points="pointsNote"
fill="none"
stroke-width="1"
stroke="#41ddde"/>
<polyline
:points="pointsReply"
fill="none"
stroke-width="1"
stroke="#f7796c"/>
<polyline
:points="pointsRenote"
fill="none"
stroke-width="1"
stroke="#a1de41"/>
<polyline
:points="pointsTotal"
fill="none"
stroke-width="1"
stroke="#555"
stroke-dasharray="2 2"/>
</svg>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: {
chart: {
required: true
},
type: {
type: String,
required: true
}
},
data() {
return {
viewBoxX: 365,
viewBoxY: 70,
pointsNote: null,
pointsReply: null,
pointsRenote: null,
pointsTotal: null
};
},
created() {
const peak = Math.max.apply(null, this.chart.map(d => this.type == 'local' ? d.notes.local.diff : d.notes.remote.diff));
if (peak != 0) {
const data = this.chart.slice().reverse().map(x => ({
normal: this.type == 'local' ? x.notes.local.diffs.normal : x.notes.remote.diffs.normal,
reply: this.type == 'local' ? x.notes.local.diffs.reply : x.notes.remote.diffs.reply,
renote: this.type == 'local' ? x.notes.local.diffs.renote : x.notes.remote.diffs.renote,
total: this.type == 'local' ? x.notes.local.diff : x.notes.remote.diff
}));
this.pointsNote = data.map((d, i) => `${i},${(1 - (d.normal / peak)) * this.viewBoxY}`).join(' ');
this.pointsReply = data.map((d, i) => `${i},${(1 - (d.reply / peak)) * this.viewBoxY}`).join(' ');
this.pointsRenote = data.map((d, i) => `${i},${(1 - (d.renote / peak)) * this.viewBoxY}`).join(' ');
this.pointsTotal = data.map((d, i) => `${i},${(1 - (d.total / peak)) * this.viewBoxY}`).join(' ');
}
}
});
</script>
<style lang="stylus" scoped>
svg
display block
padding 10px
width 100%
</style>
@@ -1,34 +0,0 @@
<template>
<div class="card">
<header>%i18n:@title%</header>
<div class="card">
<header>%i18n:@local%</header>
<x-chart v-if="chart" :chart="chart" type="local"/>
</div>
<div class="card">
<header>%i18n:@remote%</header>
<x-chart v-if="chart" :chart="chart" type="remote"/>
</div>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import XChart from "./admin.notes-chart.chart.vue";
export default Vue.extend({
components: {
XChart
},
props: {
chart: {
required: true
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
</style>
@@ -1,5 +1,5 @@
<template> <template>
<div class="card"> <div class="mk-admin-card">
<header>%i18n:@suspend-user%</header> <header>%i18n:@suspend-user%</header>
<input v-model="username" type="text" class="ui"/> <input v-model="username" type="text" class="ui"/>
<button class="ui" @click="suspendUser" :disabled="suspending">%i18n:@suspend%</button> <button class="ui" @click="suspendUser" :disabled="suspending">%i18n:@suspend%</button>
@@ -1,5 +1,5 @@
<template> <template>
<div class="card"> <div class="mk-admin-card">
<header>%i18n:@unsuspend-user%</header> <header>%i18n:@unsuspend-user%</header>
<input v-model="username" type="text" class="ui"/> <input v-model="username" type="text" class="ui"/>
<button class="ui" @click="unsuspendUser" :disabled="unsuspending">%i18n:@unsuspend%</button> <button class="ui" @click="unsuspendUser" :disabled="unsuspending">%i18n:@unsuspend%</button>
@@ -1,5 +1,5 @@
<template> <template>
<div class="card"> <div class="mk-admin-card">
<header>%i18n:@unverify-user%</header> <header>%i18n:@unverify-user%</header>
<input v-model="username" type="text" class="ui"/> <input v-model="username" type="text" class="ui"/>
<button class="ui" @click="unverifyUser" :disabled="unverifying">%i18n:@unverify%</button> <button class="ui" @click="unverifyUser" :disabled="unverifying">%i18n:@unverify%</button>
@@ -1,51 +0,0 @@
<template>
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
<polyline
:points="points"
fill="none"
stroke-width="1"
stroke="#555"/>
</svg>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: {
chart: {
required: true
},
type: {
type: String,
required: true
}
},
data() {
return {
viewBoxX: 365,
viewBoxY: 70,
points: null
};
},
created() {
const peak = Math.max.apply(null, this.chart.map(d => this.type == 'local' ? d.users.local.diff : d.users.remote.diff));
if (peak != 0) {
const data = this.chart.slice().reverse().map(x => ({
count: this.type == 'local' ? x.users.local.diff : x.users.remote.diff
}));
this.points = data.map((d, i) => `${i},${(1 - (d.count / peak)) * this.viewBoxY}`).join(' ');
}
}
});
</script>
<style lang="stylus" scoped>
svg
display block
padding 10px
width 100%
</style>
@@ -1,34 +0,0 @@
<template>
<div class="card">
<header>%i18n:@title%</header>
<div class="card">
<header>%i18n:@local%</header>
<x-chart v-if="chart" :chart="chart" type="local"/>
</div>
<div class="card">
<header>%i18n:@remote%</header>
<x-chart v-if="chart" :chart="chart" type="remote"/>
</div>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import XChart from "./admin.users-chart.chart.vue";
export default Vue.extend({
components: {
XChart
},
props: {
chart: {
required: true
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
</style>
@@ -1,5 +1,5 @@
<template> <template>
<div class="card"> <div class="mk-admin-card">
<header>%i18n:@verify-user%</header> <header>%i18n:@verify-user%</header>
<input v-model="username" type="text" class="ui"/> <input v-model="username" type="text" class="ui"/>
<button class="ui" @click="verifyUser" :disabled="verifying">%i18n:@verify%</button> <button class="ui" @click="verifyUser" :disabled="verifying">%i18n:@verify%</button>
@@ -11,9 +11,7 @@
<main> <main>
<div v-show="page == 'dashboard'"> <div v-show="page == 'dashboard'">
<x-dashboard/> <x-dashboard/>
<x-users-chart :chart="chart"/> <x-charts/>
<x-notes-chart :chart="chart"/>
<x-drive-chart :chart="chart"/>
</div> </div>
<div v-if="page == 'users'"> <div v-if="page == 'users'">
<x-suspend-user/> <x-suspend-user/>
@@ -34,9 +32,7 @@ import XSuspendUser from "./admin.suspend-user.vue";
import XUnsuspendUser from "./admin.unsuspend-user.vue"; import XUnsuspendUser from "./admin.unsuspend-user.vue";
import XVerifyUser from "./admin.verify-user.vue"; import XVerifyUser from "./admin.verify-user.vue";
import XUnverifyUser from "./admin.unverify-user.vue"; import XUnverifyUser from "./admin.unverify-user.vue";
import XUsersChart from "./admin.users-chart.vue"; import XCharts from "../../components/charts.vue";
import XNotesChart from "./admin.notes-chart.vue";
import XDriveChart from "./admin.drive-chart.vue";
export default Vue.extend({ export default Vue.extend({
components: { components: {
@@ -45,21 +41,13 @@ export default Vue.extend({
XUnsuspendUser, XUnsuspendUser,
XVerifyUser, XVerifyUser,
XUnverifyUser, XUnverifyUser,
XUsersChart, XCharts
XNotesChart,
XDriveChart
}, },
data() { data() {
return { return {
page: 'dashboard', page: 'dashboard'
chart: null
}; };
}, },
created() {
(this as any).api('admin/chart').then(chart => {
this.chart = chart;
});
},
methods: { methods: {
nav(page: string) { nav(page: string) {
this.page = page; this.page = page;
@@ -115,7 +103,7 @@ export default Vue.extend({
> div > div
max-width 800px max-width 800px
.card .mk-admin-card
padding 32px padding 32px
background #fff background #fff
box-shadow 0 2px 8px rgba(#000, 0.1) box-shadow 0 2px 8px rgba(#000, 0.1)
@@ -32,7 +32,7 @@
<mk-media-list :media-list="p.media"/> <mk-media-list :media-list="p.media"/>
</div> </div>
<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> <mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
<div class="renote" v-if="p.renote"> <div class="renote" v-if="p.renote">
<mk-note-preview :note="p.renote" :mini="true"/> <mk-note-preview :note="p.renote" :mini="true"/>
</div> </div>
+6 -1
View File
@@ -16,7 +16,7 @@ import Vue from 'vue';
export default Vue.extend({ export default Vue.extend({
data() { data() {
return { return {
name: (this as any).os.instanceName, name: null,
posted: false, posted: false,
text: new URLSearchParams(location.search).get('text') text: new URLSearchParams(location.search).get('text')
}; };
@@ -25,6 +25,11 @@ export default Vue.extend({
close() { close() {
window.close(); window.close();
} }
},
mounted() {
(this as any).os.getMeta().then(meta => {
this.name = meta.name;
});
} }
}); });
</script> </script>
@@ -0,0 +1,64 @@
<template>
<div class="tcrwdhwpuxrwmcttxjcsehgpagpstqey">
<div v-if="stats" class="stats">
<div><b>%fa:user% {{ stats.originalUsersCount | number }}</b><span>%i18n:@original-users%</span></div>
<div><span>%fa:user% {{ stats.usersCount | number }}</span><span>%i18n:@all-users%</span></div>
<div><b>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</b><span>%i18n:@original-notes%</span></div>
<div><span>%fa:pencil-alt% {{ stats.notesCount | number }}</span><span>%i18n:@all-notes%</span></div>
</div>
<div>
<x-charts/>
</div>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import XCharts from "../../components/charts.vue";
export default Vue.extend({
components: {
XCharts
},
data() {
return {
stats: null
};
},
created() {
(this as any).api('stats').then(stats => {
this.stats = stats;
});
},
});
</script>
<style lang="stylus">
@import '~const.styl'
.tcrwdhwpuxrwmcttxjcsehgpagpstqey
width 100%
padding 16px
> .stats
display flex
justify-content center
margin-bottom 16px
padding 32px
background #fff
box-shadow 0 2px 8px rgba(#000, 0.1)
> div
flex 1
text-align center
> *:first-child
display block
color $theme-color
> *:last-child
font-size 70%
> div
max-width 850px
</style>
@@ -40,10 +40,12 @@ export default Vue.extend({
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
root(isDark)
.friends .friends
background #fff background isDark ? #282C37 : #fff
border solid 1px rgba(#000, 0.075) border solid 1px rgba(#000, 0.075)
border-radius 6px border-radius 6px
overflow hidden
> .title > .title
z-index 1 z-index 1
@@ -52,7 +54,8 @@ export default Vue.extend({
line-height 42px line-height 42px
font-size 0.9em font-size 0.9em
font-weight bold font-weight bold
color #888 background isDark ? #313543 : inherit
color isDark ? #e3e5e8 : #888
box-shadow 0 1px rgba(#000, 0.07) box-shadow 0 1px rgba(#000, 0.07)
> i > i
@@ -70,7 +73,7 @@ export default Vue.extend({
> .user > .user
padding 16px padding 16px
border-bottom solid 1px #eee border-bottom solid 1px isDark ? #21242f : #eee
&:last-child &:last-child
border-bottom none border-bottom none
@@ -96,18 +99,24 @@ export default Vue.extend({
margin 0 margin 0
font-size 16px font-size 16px
line-height 24px line-height 24px
color #555 color isDark ? #ccc : #555
> .username > .username
display block display block
margin 0 margin 0
font-size 15px font-size 15px
line-height 16px line-height 16px
color #ccc color isDark ? #555 : #ccc
> .mk-follow-button > .mk-follow-button
position absolute position absolute
top 16px top 16px
right 16px right 16px
.friends[data-darkmode]
root(true)
.friends:not([data-darkmode])
root(false)
</style> </style>
@@ -39,10 +39,12 @@ export default Vue.extend({
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
root(isDark)
.photos .photos
background #fff background isDark ? #282C37 : #fff
border solid 1px rgba(#000, 0.075) border solid 1px rgba(#000, 0.075)
border-radius 6px border-radius 6px
overflow hidden
> .title > .title
z-index 1 z-index 1
@@ -51,7 +53,8 @@ export default Vue.extend({
line-height 42px line-height 42px
font-size 0.9em font-size 0.9em
font-weight bold font-weight bold
color #888 background: isDark ? #313543 : inherit
color isDark ? #e3e5e8 : #888
box-shadow 0 1px rgba(#000, 0.07) box-shadow 0 1px rgba(#000, 0.07)
> i > i
@@ -85,4 +88,10 @@ export default Vue.extend({
> i > i
margin-right 4px margin-right 4px
.photos[data-darkmode]
root(true)
.photos:not([data-darkmode])
root(false)
</style> </style>
@@ -138,7 +138,7 @@ root(isDark)
padding 16px padding 16px
font-size 12px font-size 12px
color #aaa color #aaa
background #fff background isDark ? #21242f : #fff
border solid 1px rgba(#000, 0.075) border solid 1px rgba(#000, 0.075)
border-radius 6px border-radius 6px
+2 -2
View File
@@ -19,8 +19,8 @@ import { version, codename, lang } from './config';
let elementLocale; let elementLocale;
switch (lang) { switch (lang) {
case 'ja': elementLocale = ElementLocaleJa; break; case 'ja-JP': elementLocale = ElementLocaleJa; break;
case 'en': elementLocale = ElementLocaleEn; break; case 'en-US': elementLocale = ElementLocaleEn; break;
default: elementLocale = ElementLocaleEn; break; default: elementLocale = ElementLocaleEn; break;
} }
@@ -99,7 +99,7 @@ export default Vue.extend({
cursor pointer cursor pointer
padding 0 16px padding 0 16px
margin 0 margin 0
min-width 150px min-width 100px
line-height 36px line-height 36px
font-size 14px font-size 14px
font-weight bold font-weight bold
@@ -12,6 +12,7 @@ import noteCard from './note-card.vue';
import userCard from './user-card.vue'; import userCard from './user-card.vue';
import noteDetail from './note-detail.vue'; import noteDetail from './note-detail.vue';
import followButton from './follow-button.vue'; import followButton from './follow-button.vue';
import muteButton from './mute-button.vue';
import friendsMaker from './friends-maker.vue'; import friendsMaker from './friends-maker.vue';
import notification from './notification.vue'; import notification from './notification.vue';
import notifications from './notifications.vue'; import notifications from './notifications.vue';
@@ -36,6 +37,7 @@ Vue.component('mk-note-card', noteCard);
Vue.component('mk-user-card', userCard); Vue.component('mk-user-card', userCard);
Vue.component('mk-note-detail', noteDetail); Vue.component('mk-note-detail', noteDetail);
Vue.component('mk-follow-button', followButton); Vue.component('mk-follow-button', followButton);
Vue.component('mk-mute-button', muteButton);
Vue.component('mk-friends-maker', friendsMaker); Vue.component('mk-friends-maker', friendsMaker);
Vue.component('mk-notification', notification); Vue.component('mk-notification', notification);
Vue.component('mk-notifications', notifications); Vue.component('mk-notifications', notifications);
@@ -0,0 +1,79 @@
<template>
<button
class="mk-mute-button"
:class="{ active: user.isMuted }"
@click="onClick">
<span v-if="!user.isMuted">%fa:eye-slash% %i18n:@mute%</span>
<span v-else>%fa:eye% %i18n:@unmute%</span>
</button>
</template>
<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
props: {
user: {
type: Object,
required: true
}
},
methods: {
onClick() {
if (!this.user.isMuted) {
this.mute();
} else {
this.unmute();
}
},
mute() {
(this as any).api('mute/create', { userId: this.user.id})
.then(() => { this.user.isMuted = true })
.catch(() => { alert('error')})
},
unmute() {
(this as any).api('mute/delete', { userId: this.user.id })
.then(() => { this.user.isMuted = false })
.catch(() => { alert('error') })
}
},
})
</script>
<style lang="stylus" scoped>
@import '~const.styl'
.mk-mute-button
display block
user-select none
cursor pointer
padding 0 16px
margin 0
min-width 100px
line-height 36px
font-size 14px
font-weight bold
color $theme-color
background transparent
outline none
border solid 1px $theme-color
border-radius 36px
&:hover
background rgba($theme-color, 0.1)
&:active
background rgba($theme-color, 0.2)
&.active
color $theme-color-foreground
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%)
</style>
@@ -45,7 +45,7 @@
</div> </div>
<mk-poll v-if="p.poll" :note="p"/> <mk-poll v-if="p.poll" :note="p"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/> <mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
<div class="map" v-if="p.geo" ref="map"></div> <div class="map" v-if="p.geo" ref="map"></div>
<div class="renote" v-if="p.renote"> <div class="renote" v-if="p.renote">
<mk-note-preview :note="p.renote"/> <mk-note-preview :note="p.renote"/>
@@ -33,7 +33,7 @@
</div> </div>
<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> <mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url"/> <mk-url-preview v-for="url in urls" :url="url" :key="url"/>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
<div class="map" v-if="p.geo" ref="map"></div> <div class="map" v-if="p.geo" ref="map"></div>
<div class="renote" v-if="p.renote"> <div class="renote" v-if="p.renote">
<mk-note-preview :note="p.renote"/> <mk-note-preview :note="p.renote"/>
@@ -1,5 +1,6 @@
<template> <template>
<div class="header"> <div class="header" ref="root">
<p class="warn" v-if="env != 'production'">%i18n:common.do-not-use-in-production%</p>
<mk-special-message/> <mk-special-message/>
<div class="main" ref="main"> <div class="main" ref="main">
<div class="backdrop"></div> <div class="backdrop"></div>
@@ -20,6 +21,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import * as anime from 'animejs'; import * as anime from 'animejs';
import { env } from '../../../config';
export default Vue.extend({ export default Vue.extend({
props: ['func'], props: ['func'],
@@ -27,7 +29,8 @@ export default Vue.extend({
return { return {
hasGameInvitation: false, hasGameInvitation: false,
connection: null, connection: null,
connectionId: null connectionId: null,
env: env
}; };
}, },
computed: { computed: {
@@ -39,7 +42,7 @@ export default Vue.extend({
} }
}, },
mounted() { mounted() {
this.$store.commit('setUiHeaderHeight', 48); this.$store.commit('setUiHeaderHeight', this.$refs.root.offsetHeight);
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();
@@ -133,6 +136,15 @@ root(isDark)
height 3px height 3px
background $theme-color background $theme-color
> .warn
display block
margin 0
padding 4px
text-align center
font-size 12px
background #f00
color #fff
> .main > .main
color rgba(#fff, 0.9) color rgba(#fff, 0.9)
@@ -30,6 +30,7 @@
<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>
<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 v-if="$store.getters.isSignedIn && $store.state.i.isAdmin"><router-link to="/admin">%fa:terminal%<span>%i18n:@admin%</span>%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>%i18n:@darkmode%</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>
@@ -41,7 +42,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { docsUrl, lang } from '../../../config'; import { lang } from '../../../config';
export default Vue.extend({ export default Vue.extend({
props: ['isOpen'], props: ['isOpen'],
@@ -50,7 +51,7 @@ export default Vue.extend({
hasGameInvitation: false, hasGameInvitation: false,
connection: null, connection: null,
connectionId: null, connectionId: null,
aboutUrl: `${docsUrl}/${lang}/about` aboutUrl: `/docs/${lang}/about`
}; };
}, },
computed: { computed: {
@@ -31,7 +31,14 @@ export default Vue.extend({
connectionId: null connectionId: null
}; };
}, },
watch: {
'$store.state.uiHeaderHeight'() {
this.$el.style.paddingTop = this.$store.state.uiHeaderHeight + 'px';
}
},
mounted() { mounted() {
this.$el.style.paddingTop = this.$store.state.uiHeaderHeight + 'px';
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();
+21 -2
View File
@@ -13,8 +13,9 @@
<ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch> <ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch>
<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch> <ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch>
<ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch> <ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch>
<ui-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch>
<ui-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch> <ui-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch>
<ui-switch v-model="$store.state.settings.games.reversi.showBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch>
<ui-switch v-model="$store.state.settings.games.reversi.useContrastStones" @change="onChangeUseContrastReversiStones">%i18n:common.use-contrast-reversi-stones%</ui-switch>
<div> <div>
<div>%i18n:@timeline%</div> <div>%i18n:@timeline%</div>
@@ -40,6 +41,12 @@
<ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch> <ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch>
</ui-card> </ui-card>
<ui-card>
<div slot="title">%fa:volume-up% %i18n:@sound%</div>
<ui-switch v-model="enableSounds">%i18n:@enable-sounds%</ui-switch>
</ui-card>
<ui-card> <ui-card>
<div slot="title">%fa:language% %i18n:@lang%</div> <div slot="title">%fa:language% %i18n:@lang%</div>
@@ -141,6 +148,11 @@ export default Vue.extend({
get() { return this.$store.state.device.lang; }, get() { return this.$store.state.device.lang; },
set(value) { this.$store.commit('device/set', { key: 'lang', value }); } set(value) { this.$store.commit('device/set', { key: 'lang', value }); }
}, },
enableSounds: {
get() { return this.$store.state.device.enableSounds; },
set(value) { this.$store.commit('device/set', { key: 'enableSounds', value }); }
},
}, },
mounted() { mounted() {
@@ -189,7 +201,14 @@ export default Vue.extend({
onChangeReversiBoardLabels(v) { onChangeReversiBoardLabels(v) {
this.$store.dispatch('settings/set', { this.$store.dispatch('settings/set', {
key: 'reversiBoardLabels', key: 'games.reversi.showBoardLabels',
value: v
});
},
onChangeUseContrastReversiStones(v) {
this.$store.dispatch('settings/set', {
key: 'games.reversi.useContrastStones',
value: v value: v
}); });
}, },
+6 -1
View File
@@ -16,7 +16,7 @@ import Vue from 'vue';
export default Vue.extend({ export default Vue.extend({
data() { data() {
return { return {
name: (this as any).os.instanceName, name: null,
posted: false, posted: false,
text: new URLSearchParams(location.search).get('text') text: new URLSearchParams(location.search).get('text')
}; };
@@ -25,6 +25,11 @@ export default Vue.extend({
close() { close() {
window.close(); window.close();
} }
},
mounted() {
(this as any).os.getMeta().then(meta => {
this.name = meta.name;
});
} }
}); });
</script> </script>
@@ -11,6 +11,7 @@
<a class="avatar"> <a class="avatar">
<img :src="user.avatarUrl" alt="avatar"/> <img :src="user.avatarUrl" alt="avatar"/>
</a> </a>
<mk-mute-button v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/>
<mk-follow-button v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/> <mk-follow-button v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/>
</div> </div>
<div class="title"> <div class="title">
@@ -184,6 +185,9 @@ root(isDark)
border 4px solid $bg border 4px solid $bg
border-radius 12px border-radius 12px
> .mk-mute-button
float right
> .mk-follow-button > .mk-follow-button
float right float right
+9 -2
View File
@@ -1,5 +1,6 @@
import Vuex from 'vuex'; import Vuex from 'vuex';
import createPersistedState from 'vuex-persistedstate'; import createPersistedState from 'vuex-persistedstate';
import * as nestedProperty from 'nested-property';
import MiOS from './mios'; import MiOS from './mios';
import { hostname } from './config'; import { hostname } from './config';
@@ -12,6 +13,7 @@ const defaultSettings = {
showMaps: true, showMaps: true,
showPostFormOnTopOfTl: false, showPostFormOnTopOfTl: false,
suggestRecentHashtags: true, suggestRecentHashtags: true,
showClockOnHeader: true,
circleIcons: true, circleIcons: true,
gradientWindowHeader: false, gradientWindowHeader: false,
showReplyTarget: true, showReplyTarget: true,
@@ -22,7 +24,12 @@ const defaultSettings = {
disableViaMobile: false, disableViaMobile: false,
memo: null, memo: null,
iLikeSushi: false, iLikeSushi: false,
reversiBoardLabels: false games: {
reversi: {
showBoardLabels: false,
useContrastStones: false
}
}
}; };
const defaultDeviceSettings = { const defaultDeviceSettings = {
@@ -125,7 +132,7 @@ export default (os: MiOS) => new Vuex.Store({
mutations: { mutations: {
set(state, x: { key: string; value: any }) { set(state, x: { key: string; value: any }) {
state[x.key] = x.value; nestedProperty.set(state, x.key, x.value);
}, },
setHome(state, data) { setHome(state, data) {
+1 -1
View File
@@ -53,5 +53,5 @@ export default function load() {
} }
function normalizeUrl(url: string) { function normalizeUrl(url: string) {
return url[url.length - 1] === '/' ? url.substr(0, url.length - 1) : url; return url.endsWith('/') ? url.substr(0, url.length - 1) : url;
} }
+2
View File
@@ -62,6 +62,8 @@ export type Source = {
*/ */
ghost?: string; ghost?: string;
summalyProxy?: string;
accesslog?: string; accesslog?: string;
twitter?: { twitter?: {
consumer_key: string; consumer_key: string;
+1 -1
View File
@@ -15,7 +15,7 @@ block main
span.path= endpointUrl.path span.path= endpointUrl.path
if endpoint.desc if endpoint.desc
p#desc= endpoint.desc[lang] || endpoint.desc['ja'] p#desc= endpoint.desc[lang] || endpoint.desc['ja-JP']
if endpoint.requireCredential if endpoint.requireCredential
div.ui.info: p div.ui.info: p
+27 -27
View File
@@ -1,90 +1,90 @@
name: "DriveFile" name: "DriveFile"
desc: desc:
ja: "ドライブのファイル。" ja-JP: "ドライブのファイル。"
en: "A file of Drive." en-US: "A file of Drive."
props: props:
id: id:
type: "id" type: "id"
optional: false optional: false
desc: desc:
ja: "ファイルID" ja-JP: "ファイルID"
en: "The ID of this file" en-US: "The ID of this file"
createdAt: createdAt:
type: "date" type: "date"
optional: false optional: false
desc: desc:
ja: "アップロード日時" ja-JP: "アップロード日時"
en: "The upload date of this file" en-US: "The upload date of this file"
userId: userId:
type: "id(User)" type: "id(User)"
optional: false optional: false
desc: desc:
ja: "所有者ID" ja-JP: "所有者ID"
en: "The ID of the owner of this file" en-US: "The ID of the owner of this file"
user: user:
type: "entity(User)" type: "entity(User)"
optional: true optional: true
desc: desc:
ja: "所有者" ja-JP: "所有者"
en: "The owner of this file" en-US: "The owner of this file"
name: name:
type: "string" type: "string"
optional: false optional: false
desc: desc:
ja: "ファイル名" ja-JP: "ファイル名"
en: "The name of this file" en-US: "The name of this file"
md5: md5:
type: "string" type: "string"
optional: false optional: false
desc: desc:
ja: "ファイルのMD5ハッシュ値" ja-JP: "ファイルのMD5ハッシュ値"
en: "The md5 hash value of this file" en-US: "The md5 hash value of this file"
type: type:
type: "string" type: "string"
optional: false optional: false
desc: desc:
ja: "ファイルの種類" ja-JP: "ファイルの種類"
en: "The type of this file" en-US: "The type of this file"
datasize: datasize:
type: "number" type: "number"
optional: false optional: false
desc: desc:
ja: "ファイルサイズ(bytes)" ja-JP: "ファイルサイズ(bytes)"
en: "The size of this file (bytes)" en-US: "The size of this file (bytes)"
url: url:
type: "string" type: "string"
optional: false optional: false
desc: desc:
ja: "ファイルのURL" ja-JP: "ファイルのURL"
en: "The URL of this file" en-US: "The URL of this file"
folderId: folderId:
type: "id(DriveFolder)" type: "id(DriveFolder)"
optional: true optional: true
desc: desc:
ja: "フォルダID" ja-JP: "フォルダID"
en: "The ID of the folder of this file" en-US: "The ID of the folder of this file"
folder: folder:
type: "entity(DriveFolder)" type: "entity(DriveFolder)"
optional: true optional: true
desc: desc:
ja: "フォルダ" ja-JP: "フォルダ"
en: "The folder of this file" en-US: "The folder of this file"
sensitive: isSensitive:
type: "boolean" type: "boolean"
optional: true optional: true
desc: desc:
ja: "このメディアが「閲覧注意」(NSFW)かどうか" ja-JP: "このメディアが「閲覧注意」(NSFW)かどうか"
en: "Whether this media is NSFW" en-US: "Whether this media is NSFW"
+12 -12
View File
@@ -1,41 +1,41 @@
name: "DriveFolder" name: "DriveFolder"
desc: desc:
ja: "ドライブのフォルダを表します。" ja-JP: "ドライブのフォルダを表します。"
en: "A folder of Drive." en-US: "A folder of Drive."
props: props:
id: id:
type: "id" type: "id"
optional: false optional: false
desc: desc:
ja: "フォルダID" ja-JP: "フォルダID"
en: "The ID of this folder" en-US: "The ID of this folder"
createdAt: createdAt:
type: "date" type: "date"
optional: false optional: false
desc: desc:
ja: "作成日時" ja-JP: "作成日時"
en: "The created date of this folder" en-US: "The created date of this folder"
userId: userId:
type: "id(User)" type: "id(User)"
optional: false optional: false
desc: desc:
ja: "所有者ID" ja-JP: "所有者ID"
en: "The ID of the owner of this folder" en-US: "The ID of the owner of this folder"
parentId: parentId:
type: "entity(DriveFolder)" type: "entity(DriveFolder)"
optional: false optional: false
desc: desc:
ja: "親フォルダのID (ルートなら null)" ja-JP: "親フォルダのID (ルートなら null)"
en: "The ID of parent folder" en-US: "The ID of parent folder"
name: name:
type: "string" type: "string"
optional: false optional: false
desc: desc:
ja: "フォルダ名" ja-JP: "フォルダ名"
en: "The name of this folder" en-US: "The name of this folder"
+49 -49
View File
@@ -1,190 +1,190 @@
name: "Note" name: "Note"
desc: desc:
ja: "投稿。" ja-JP: "投稿。"
en: "A note." en-US: "A note."
props: props:
id: id:
type: "id" type: "id"
optional: false optional: false
desc: desc:
ja: "投稿ID" ja-JP: "投稿ID"
en: "The ID of this note" en-US: "The ID of this note"
createdAt: createdAt:
type: "date" type: "date"
optional: false optional: false
desc: desc:
ja: "投稿日時" ja-JP: "投稿日時"
en: "The posted date of this note" en-US: "The posted date of this note"
viaMobile: viaMobile:
type: "boolean" type: "boolean"
optional: true optional: true
desc: desc:
ja: "モバイル端末から投稿したか否か(自己申告であることに留意)" ja-JP: "モバイル端末から投稿したか否か(自己申告であることに留意)"
en: "Whether this note sent via a mobile device" en-US: "Whether this note sent via a mobile device"
text: text:
type: "string" type: "string"
optional: true optional: true
desc: desc:
ja: "投稿の本文" ja-JP: "投稿の本文"
en: "The text of this note" en-US: "The text of this note"
mediaIds: mediaIds:
type: "id(DriveFile)[]" type: "id(DriveFile)[]"
optional: true optional: true
desc: desc:
ja: "添付されているメディアのID (なければレスポンスでは空配列)" ja-JP: "添付されているメディアのID (なければレスポンスでは空配列)"
en: "The IDs of the attached media (empty array for response if no media is attached)" en-US: "The IDs of the attached media (empty array for response if no media is attached)"
media: media:
type: "entity(DriveFile)[]" type: "entity(DriveFile)[]"
optional: true optional: true
desc: desc:
ja: "添付されているメディア" ja-JP: "添付されているメディア"
en: "The attached media" en-US: "The attached media"
userId: userId:
type: "id(User)" type: "id(User)"
optional: false optional: false
desc: desc:
ja: "投稿者ID" ja-JP: "投稿者ID"
en: "The ID of author of this note" en-US: "The ID of author of this note"
user: user:
type: "entity(User)" type: "entity(User)"
optional: true optional: true
desc: desc:
ja: "投稿者" ja-JP: "投稿者"
en: "The author of this note" en-US: "The author of this note"
myReaction: myReaction:
type: "string" type: "string"
optional: true optional: true
desc: desc:
ja: "この投稿に対する自分の<a href='/docs/api/reactions'>リアクション</a>" ja-JP: "この投稿に対する自分の<a href='/docs/api/reactions'>リアクション</a>"
en: "The your <a href='/docs/api/reactions'>reaction</a> of this note" en-US: "The your <a href='/docs/api/reactions'>reaction</a> of this note"
reactionCounts: reactionCounts:
type: "object" type: "object"
optional: false optional: false
desc: desc:
ja: "<a href='/docs/api/reactions'>リアクション</a>をキーとし、この投稿に対するそのリアクションの数を値としたオブジェクト" ja-JP: "<a href='/docs/api/reactions'>リアクション</a>をキーとし、この投稿に対するそのリアクションの数を値としたオブジェクト"
replyId: replyId:
type: "id(Note)" type: "id(Note)"
optional: true optional: true
desc: desc:
ja: "返信した投稿のID" ja-JP: "返信した投稿のID"
en: "The ID of the replyed note" en-US: "The ID of the replyed note"
reply: reply:
type: "entity(Note)" type: "entity(Note)"
optional: true optional: true
desc: desc:
ja: "返信した投稿" ja-JP: "返信した投稿"
en: "The replyed note" en-US: "The replyed note"
renoteId: renoteId:
type: "id(Note)" type: "id(Note)"
optional: true optional: true
desc: desc:
ja: "引用した投稿のID" ja-JP: "引用した投稿のID"
en: "The ID of the quoted note" en-US: "The ID of the quoted note"
renote: renote:
type: "entity(Note)" type: "entity(Note)"
optional: true optional: true
desc: desc:
ja: "引用した投稿" ja-JP: "引用した投稿"
en: "The quoted note" en-US: "The quoted note"
poll: poll:
type: "object" type: "object"
optional: true optional: true
desc: desc:
ja: "投票" ja-JP: "投票"
en: "The poll" en-US: "The poll"
props: props:
choices: choices:
type: "object[]" type: "object[]"
optional: false optional: false
desc: desc:
ja: "投票の選択肢" ja-JP: "投票の選択肢"
en: "The choices of this poll" en-US: "The choices of this poll"
props: props:
id: id:
type: "number" type: "number"
optional: false optional: false
desc: desc:
ja: "選択肢ID" ja-JP: "選択肢ID"
en: "The ID of this choice" en-US: "The ID of this choice"
isVoted: isVoted:
type: "boolean" type: "boolean"
optional: true optional: true
desc: desc:
ja: "自分がこの選択肢に投票したかどうか" ja-JP: "自分がこの選択肢に投票したかどうか"
en: "Whether you voted to this choice" en-US: "Whether you voted to this choice"
text: text:
type: "string" type: "string"
optional: false optional: false
desc: desc:
ja: "選択肢本文" ja-JP: "選択肢本文"
en: "The text of this choice" en-US: "The text of this choice"
votes: votes:
type: "number" type: "number"
optional: false optional: false
desc: desc:
ja: "この選択肢に投票された数" ja-JP: "この選択肢に投票された数"
en: "The number voted for this choice" en-US: "The number voted for this choice"
geo: geo:
type: "object" type: "object"
optional: true optional: true
desc: desc:
ja: "位置情報" ja-JP: "位置情報"
en: "Geo location" en-US: "Geo location"
props: props:
coordinates: coordinates:
type: "number[]" type: "number[]"
optional: false optional: false
desc: desc:
ja: "座標。最初に経度:-180〜180で表す。最後に緯度:-90〜90で表す。" ja-JP: "座標。最初に経度:-180〜180で表す。最後に緯度:-90〜90で表す。"
altitude: altitude:
type: "number" type: "number"
optional: false optional: false
desc: desc:
ja: "高度。メートル単位で表す。" ja-JP: "高度。メートル単位で表す。"
accuracy: accuracy:
type: "number" type: "number"
optional: false optional: false
desc: desc:
ja: "緯度、経度の精度。メートル単位で表す。" ja-JP: "緯度、経度の精度。メートル単位で表す。"
altitudeAccuracy: altitudeAccuracy:
type: "number" type: "number"
optional: false optional: false
desc: desc:
ja: "高度の精度。メートル単位で表す。" ja-JP: "高度の精度。メートル単位で表す。"
heading: heading:
type: "number" type: "number"
optional: false optional: false
desc: desc:
ja: "方角。0〜360の角度で表す。0が北、90が東、180が南、270が西。" ja-JP: "方角。0〜360の角度で表す。0が北、90が東、180が南、270が西。"
speed: speed:
type: "number" type: "number"
optional: false optional: false
desc: desc:
ja: "速度。メートル / 秒数で表す。" ja-JP: "速度。メートル / 秒数で表す。"
+48 -48
View File
@@ -1,174 +1,174 @@
name: "User" name: "User"
desc: desc:
ja: "ユーザー。" ja-JP: "ユーザー。"
en: "A user." en-US: "A user."
props: props:
id: id:
type: "id" type: "id"
optional: false optional: false
desc: desc:
ja: "ユーザーID" ja-JP: "ユーザーID"
en: "The ID of this user" en-US: "The ID of this user"
createdAt: createdAt:
type: "date" type: "date"
optional: false optional: false
desc: desc:
ja: "アカウント作成日時" ja-JP: "アカウント作成日時"
en: "The registered date of this user" en-US: "The registered date of this user"
username: username:
type: "string" type: "string"
optional: false optional: false
desc: desc:
ja: "ユーザー名" ja-JP: "ユーザー名"
en: "The username of this user" en-US: "The username of this user"
description: description:
type: "string" type: "string"
optional: false optional: false
desc: desc:
ja: "アカウントの説明(自己紹介)" ja-JP: "アカウントの説明(自己紹介)"
en: "The description of this user" en-US: "The description of this user"
avatarId: avatarId:
type: "id(DriveFile)" type: "id(DriveFile)"
optional: true optional: true
desc: desc:
ja: "アバターのID" ja-JP: "アバターのID"
en: "The ID of the avatar of this user" en-US: "The ID of the avatar of this user"
avatarUrl: avatarUrl:
type: "string" type: "string"
optional: false optional: false
desc: desc:
ja: "アバターのURL" ja-JP: "アバターのURL"
en: "The URL of the avatar of this user" en-US: "The URL of the avatar of this user"
bannerId: bannerId:
type: "id(DriveFile)" type: "id(DriveFile)"
optional: true optional: true
desc: desc:
ja: "バナーのID" ja-JP: "バナーのID"
en: "The ID of the banner of this user" en-US: "The ID of the banner of this user"
bannerUrl: bannerUrl:
type: "string" type: "string"
optional: false optional: false
desc: desc:
ja: "バナーのURL" ja-JP: "バナーのURL"
en: "The URL of the banner of this user" en-US: "The URL of the banner of this user"
followersCount: followersCount:
type: "number" type: "number"
optional: false optional: false
desc: desc:
ja: "フォロワーの数" ja-JP: "フォロワーの数"
en: "The number of the followers for this user" en-US: "The number of the followers for this user"
followingCount: followingCount:
type: "number" type: "number"
optional: false optional: false
desc: desc:
ja: "フォローしているユーザーの数" ja-JP: "フォローしているユーザーの数"
en: "The number of the following users for this user" en-US: "The number of the following users for this user"
isFollowing: isFollowing:
type: "boolean" type: "boolean"
optional: true optional: true
desc: desc:
ja: "自分がこのユーザーをフォローしているか" ja-JP: "自分がこのユーザーをフォローしているか"
isFollowed: isFollowed:
type: "boolean" type: "boolean"
optional: true optional: true
desc: desc:
ja: "自分がこのユーザーにフォローされているか" ja-JP: "自分がこのユーザーにフォローされているか"
isMuted: isMuted:
type: "boolean" type: "boolean"
optional: true optional: true
desc: desc:
ja: "自分がこのユーザーをミュートしているか" ja-JP: "自分がこのユーザーをミュートしているか"
en: "Whether you muted this user" en-US: "Whether you muted this user"
notesCount: notesCount:
type: "number" type: "number"
optional: false optional: false
desc: desc:
ja: "投稿の数" ja-JP: "投稿の数"
en: "The number of the notes of this user" en-US: "The number of the notes of this user"
pinnedNote: pinnedNote:
type: "entity(Note)" type: "entity(Note)"
optional: true optional: true
desc: desc:
ja: "ピン留めされた投稿" ja-JP: "ピン留めされた投稿"
en: "The pinned note of this user" en-US: "The pinned note of this user"
pinnedNoteId: pinnedNoteId:
type: "id(Note)" type: "id(Note)"
optional: true optional: true
desc: desc:
ja: "ピン留めされた投稿のID" ja-JP: "ピン留めされた投稿のID"
en: "The ID of the pinned note of this user" en-US: "The ID of the pinned note of this user"
host: host:
type: "string | null" type: "string | null"
optional: false optional: false
desc: desc:
ja: "ホスト (例: example.com:3000)" ja-JP: "ホスト (例: example.com:3000)"
en: "Host (e.g. example.com:3000)" en-US: "Host (e.g. example.com:3000)"
twitter: twitter:
type: "object" type: "object"
optional: true optional: true
desc: desc:
ja: "連携されているTwitterアカウント情報" ja-JP: "連携されているTwitterアカウント情報"
en: "The info of the connected twitter account of this user" en-US: "The info of the connected twitter account of this user"
props: props:
userId: userId:
type: "string" type: "string"
optional: false optional: false
desc: desc:
ja: "ユーザーID" ja-JP: "ユーザーID"
en: "The user ID" en-US: "The user ID"
screenName: screenName:
type: "string" type: "string"
optional: false optional: false
desc: desc:
ja: "ユーザー名" ja-JP: "ユーザー名"
en: "The screen name of this user" en-US: "The screen name of this user"
isBot: isBot:
type: "boolean" type: "boolean"
optional: true optional: true
desc: desc:
ja: "botか否か(自己申告であることに留意)" ja-JP: "botか否か(自己申告であることに留意)"
en: "Whether is bot or not" en-US: "Whether is bot or not"
profile: profile:
type: "object" type: "object"
optional: false optional: false
desc: desc:
ja: "プロフィール" ja-JP: "プロフィール"
en: "The profile of this user" en-US: "The profile of this user"
props: props:
location: location:
type: "string" type: "string"
optional: true optional: true
desc: desc:
ja: "場所" ja-JP: "場所"
en: "The location of this user" en-US: "The location of this user"
birthday: birthday:
type: "string" type: "string"
optional: true optional: true
desc: desc:
ja: "誕生日 (YYYY-MM-DD)" ja-JP: "誕生日 (YYYY-MM-DD)"
en: "The birthday of this user (YYYY-MM-DD)" en-US: "The birthday of this user (YYYY-MM-DD)"
+1 -1
View File
@@ -7,7 +7,7 @@ block meta
block main block main
h1= name h1= name
p#desc= desc[lang] || desc['ja'] p#desc= desc[lang] || desc['ja-JP']
section section
h2= i18n('docs.api.entities.properties') h2= i18n('docs.api.entities.properties')
+1 -1
View File
@@ -31,4 +31,4 @@ mixin propTable(props)
td.name= prop.name td.name= prop.name
td.type td.type
+type(prop) +type(prop)
td.desc!= prop.desc ? prop.desc[lang] || prop.desc['ja'] : null td.desc!= prop.desc ? prop.desc[lang] || prop.desc['ja-JP'] : null
+1 -1
View File
@@ -16,7 +16,7 @@ html(lang= lang)
nav nav
ul ul
each doc in docs each doc in docs
li: a(href=`/docs/${lang}/${doc.name}`)= doc.title[lang] || doc.title['ja'] li: a(href=`/docs/${lang}/${doc.name}`)= doc.title[lang] || doc.title['ja-JP']
section section
h2 API h2 API
ul ul
+8 -2
View File
@@ -14,6 +14,7 @@ import * as portscanner from 'portscanner';
import isRoot = require('is-root'); import isRoot = require('is-root');
import Xev from 'xev'; import Xev from 'xev';
import * as program from 'commander'; import * as program from 'commander';
import mongo from './db/mongodb';
import Logger from './misc/logger'; import Logger from './misc/logger';
import ProgressBar from './misc/cli/progressbar'; import ProgressBar from './misc/cli/progressbar';
@@ -158,8 +159,13 @@ function checkMongoDb(config: Config) {
const p = config.mongodb.pass ? encodeURIComponent(config.mongodb.pass) : null; const p = config.mongodb.pass ? encodeURIComponent(config.mongodb.pass) : null;
const uri = `mongodb://${u && p ? `${u}:****@` : ''}${config.mongodb.host}:${config.mongodb.port}/${config.mongodb.db}`; const uri = `mongodb://${u && p ? `${u}:****@` : ''}${config.mongodb.host}:${config.mongodb.port}/${config.mongodb.db}`;
mongoDBLogger.info(`Connecting to ${uri}`); mongoDBLogger.info(`Connecting to ${uri}`);
require('./db/mongodb');
mongoDBLogger.succ('Connectivity confirmed'); mongo.then(() => {
mongoDBLogger.succ('Connectivity confirmed');
})
.catch(err => {
mongoDBLogger.error(err.message);
});
} }
function spawnWorkers(limit: number) { function spawnWorkers(limit: number) {
+1 -1
View File
@@ -197,7 +197,7 @@ const elements: Element[] = [
if (thisIsNotARegexp) return null; if (thisIsNotARegexp) return null;
if (regexp == '') return null; if (regexp == '') return null;
if (regexp[0] == ' ' && regexp[regexp.length - 1] == ' ') return null; if (regexp.startsWith(' ') && regexp.endsWith(' ')) return null;
return { return {
html: `<span class="regexp">/${escape(regexp)}/</span>`, html: `<span class="regexp">/${escape(regexp)}/</span>`,
+1 -1
View File
@@ -10,7 +10,7 @@ export type TextElementHashtag = {
export default function(text: string, i: number) { export default function(text: string, i: number) {
if (!(/^\s#[^\s]+/.test(text) || (i == 0 && /^#[^\s]+/.test(text)))) return null; if (!(/^\s#[^\s]+/.test(text) || (i == 0 && /^#[^\s]+/.test(text)))) return null;
const isHead = text[0] == '#'; const isHead = text.startsWith('#');
const hashtag = text.match(/^\s?#[^\s]+/)[0]; const hashtag = text.match(/^\s?#[^\s]+/)[0];
const res: any[] = !isHead ? [{ const res: any[] = !isHead ? [{
type: 'text', type: 'text',
+1 -1
View File
@@ -13,7 +13,7 @@ export type TextElementLink = {
export default function(text: string) { export default function(text: string) {
const match = text.match(/^\??\[([^\[\]]+?)\]\((https?:\/\/[\w\/:%#@\$&\?!\(\)\[\]~\.=\+\-]+?)\)/); const match = text.match(/^\??\[([^\[\]]+?)\]\((https?:\/\/[\w\/:%#@\$&\?!\(\)\[\]~\.=\+\-]+?)\)/);
if (!match) return null; if (!match) return null;
const silent = text[0] == '?'; const silent = text.startsWith('?');
const link = match[0]; const link = match[0];
const title = match[1]; const title = match[1];
const url = match[2]; const url = match[2];
+2 -2
View File
@@ -25,9 +25,9 @@ export const replacement = (match: string, key: string) => {
arg == 'S' ? 'fas' : arg == 'S' ? 'fas' :
arg == 'B' ? 'fab' : arg == 'B' ? 'fab' :
''; '';
} else if (arg[0] == '.') { } else if (arg.startsWith('.')) {
classes.push('fa-' + arg.substr(1)); classes.push('fa-' + arg.substr(1));
} else if (arg[0] == '-') { } else if (arg.startsWith('-')) {
transform = arg.substr(1).split('|').join(' '); transform = arg.substr(1).split('|').join(' ');
} else { } else {
name = arg; name = arg;
+5 -3
View File
@@ -27,10 +27,12 @@ export default class Replacer {
let text = texts; let text = texts;
if (path) { if (path) {
path = path.replace('.ts', '');
if (text.hasOwnProperty(path)) { if (text.hasOwnProperty(path)) {
text = text[path]; text = text[path];
} else { } else {
if (this.lang === 'ja') console.warn(`path '${path}' not found`); if (this.lang === 'ja-JP') console.warn(`path '${path}' not found`);
return key; // Fallback return key; // Fallback
} }
} }
@@ -46,10 +48,10 @@ export default class Replacer {
}); });
if (error) { if (error) {
if (this.lang === 'ja') console.warn(`key '${key}' not found in '${path}'`); if (this.lang === 'ja-JP') console.warn(`key '${key}' not found in '${path}'`);
return key; // Fallback return key; // Fallback
} else if (typeof text !== 'string') { } else if (typeof text !== 'string') {
if (this.lang === 'ja') console.warn(`key '${key}' is not string in '${path}'`); if (this.lang === 'ja-JP') console.warn(`key '${key}' is not string in '${path}'`);
return key; // Fallback return key; // Fallback
} else { } else {
return text; return text;
+80 -31
View File
@@ -2,40 +2,59 @@ import * as mongo from 'mongodb';
import db from '../db/mongodb'; import db from '../db/mongodb';
const Stats = db.get<IStats>('stats'); const Stats = db.get<IStats>('stats');
Stats.createIndex({ date: -1 }, { unique: true }); Stats.dropIndex({ date: -1 }); // 後方互換性のため
Stats.createIndex({ span: -1, date: -1 }, { unique: true });
export default Stats; export default Stats;
export interface IStats { export interface IStats {
_id: mongo.ObjectID; _id: mongo.ObjectID;
/**
*
*/
date: Date; date: Date;
/**
*
*/
span: 'day' | 'hour';
/** /**
* *
*/ */
users: { users: {
local: { local: {
/** /**
* * ()
*/ */
total: number; total: number;
/** /**
* * ()
*/ */
diff: number; inc: number;
/**
* ()
*/
dec: number;
}; };
remote: { remote: {
/** /**
* * ()
*/ */
total: number; total: number;
/** /**
* * ()
*/ */
diff: number; inc: number;
/**
* ()
*/
dec: number;
}; };
}; };
@@ -45,28 +64,33 @@ export interface IStats {
notes: { notes: {
local: { local: {
/** /**
* 稿 * 稿 ()
*/ */
total: number; total: number;
/** /**
* 稿 * 稿 ()
*/ */
diff: number; inc: number;
/**
* 稿 ()
*/
dec: number;
diffs: { diffs: {
/** /**
* 稿 * 稿 ()
*/ */
normal: number; normal: number;
/** /**
* 稿 * 稿 ()
*/ */
reply: number; reply: number;
/** /**
* Renoteの投稿数の前日比 * Renoteの投稿数の差分 ()
*/ */
renote: number; renote: number;
}; };
@@ -74,28 +98,33 @@ export interface IStats {
remote: { remote: {
/** /**
* 稿 * 稿 ()
*/ */
total: number; total: number;
/** /**
* 稿 * 稿 ()
*/ */
diff: number; inc: number;
/**
* 稿 ()
*/
dec: number;
diffs: { diffs: {
/** /**
* 稿 * 稿 ()
*/ */
normal: number; normal: number;
/** /**
* 稿 * 稿 ()
*/ */
reply: number; reply: number;
/** /**
* Renoteの投稿数の前日比 * Renoteの投稿数の差分 ()
*/ */
renote: number; renote: number;
}; };
@@ -108,46 +137,66 @@ export interface IStats {
drive: { drive: {
local: { local: {
/** /**
* * ()
*/ */
totalCount: number; totalCount: number;
/** /**
* * ()
*/ */
totalSize: number; totalSize: number;
/** /**
* * ()
*/ */
diffCount: number; incCount: number;
/** /**
* * 使 ()
*/ */
diffSize: number; incSize: number;
/**
* ()
*/
decCount: number;
/**
* 使 ()
*/
decSize: number;
}; };
remote: { remote: {
/** /**
* * ()
*/ */
totalCount: number; totalCount: number;
/** /**
* * ()
*/ */
totalSize: number; totalSize: number;
/** /**
* * ()
*/ */
diffCount: number; incCount: number;
/** /**
* * 使 ()
*/ */
diffSize: number; incSize: number;
/**
* ()
*/
decCount: number;
/**
* 使 ()
*/
decSize: number;
}; };
}; };
} }
+56 -1
View File
@@ -6,6 +6,8 @@ import parseAcct from '../../../misc/acct/parse';
import User, { IRemoteUser } from '../../../models/user'; import User, { IRemoteUser } from '../../../models/user';
import perform from '../../../remote/activitypub/perform'; import perform from '../../../remote/activitypub/perform';
import { resolvePerson } from '../../../remote/activitypub/models/person'; import { resolvePerson } from '../../../remote/activitypub/models/person';
import { toUnicode } from 'punycode';
import { URL } from 'url';
const log = debug('misskey:queue:inbox'); const log = debug('misskey:queue:inbox');
@@ -32,6 +34,15 @@ export default async (job: bq.Job, done: any): Promise<void> => {
return; return;
} }
// アクティビティ内のホストの検証
try {
ValidateActivity(activity, host);
} catch (e) {
console.warn(e);
done();
return;
}
user = await User.findOne({ usernameLower: username, host: host.toLowerCase() }) as IRemoteUser; user = await User.findOne({ usernameLower: username, host: host.toLowerCase() }) as IRemoteUser;
// アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する // アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する
@@ -39,6 +50,16 @@ export default async (job: bq.Job, done: any): Promise<void> => {
user = await resolvePerson(activity.actor) as IRemoteUser; user = await resolvePerson(activity.actor) as IRemoteUser;
} }
} else { } else {
// アクティビティ内のホストの検証
const host = toUnicode(new URL(signature.keyId).hostname.toLowerCase());
try {
ValidateActivity(activity, host);
} catch (e) {
console.warn(e);
done();
return;
}
user = await User.findOne({ user = await User.findOne({
host: { $ne: null }, host: { $ne: null },
'publicKey.id': signature.keyId 'publicKey.id': signature.keyId
@@ -46,7 +67,7 @@ export default async (job: bq.Job, done: any): Promise<void> => {
// アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する // アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する
if (user === null) { if (user === null) {
user = await resolvePerson(signature.keyId) as IRemoteUser; user = await resolvePerson(activity.actor) as IRemoteUser;
} }
} }
@@ -69,3 +90,37 @@ export default async (job: bq.Job, done: any): Promise<void> => {
done(e); done(e);
} }
}; };
/**
* Validate host in activity
* @param activity Activity
* @param host Expect host
*/
function ValidateActivity(activity: any, host: string) {
// id (if exists)
if (typeof activity.id === 'string') {
const uriHost = toUnicode(new URL(activity.id).hostname.toLowerCase());
if (host !== uriHost) throw new Error('activity.id has different host');
}
// actor (if exists)
if (typeof activity.actor === 'string') {
const uriHost = toUnicode(new URL(activity.actor).hostname.toLowerCase());
if (host !== uriHost) throw new Error('activity.actor has different host');
}
// For Create activity
if (activity.type === 'Create' && activity.object) {
// object.id (if exists)
if (typeof activity.object.id === 'string') {
const uriHost = toUnicode(new URL(activity.object.id).hostname.toLowerCase());
if (host !== uriHost) throw new Error('activity.object.id has different host');
}
// object.attributedTo (if exists)
if (typeof activity.object.attributedTo === 'string') {
const uriHost = toUnicode(new URL(activity.object.attributedTo).hostname.toLowerCase());
if (host !== uriHost) throw new Error('activity.object.attributedTo has different host');
}
}
}
+3 -1
View File
@@ -131,5 +131,7 @@ export async function resolveNote(value: string | IObject, resolver?: Resolver):
//#endregion //#endregion
// リモートサーバーからフェッチしてきて登録 // リモートサーバーからフェッチしてきて登録
return await createNote(value, resolver); // ここでuriの代わりに添付されてきたNote Objectが指定されていると、サーバーフェッチを経ずにノートが生成されるが
// 添付されてきたNote Objectは偽装されている可能性があるため、常にuriを指定してサーバーフェッチを行う。
return await createNote(uri, resolver);
} }

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