Compare commits

...

582 Commits

Author SHA1 Message Date
f3499b787c 8.20.0 2018-09-01 20:49:06 +09:00
5209a584a2 Better post form 2018-09-01 20:47:49 +09:00
70ac668474 Merge pull request #2568 from syuilo/fix-drop-index
Fix drop index
2018-09-01 19:13:49 +09:00
1004e0d6e8 Merge pull request #2567 from syuilo/update-setup-docs
Update setup docs
2018-09-01 19:13:22 +09:00
52aa64fcb6 Fix drop index 2018-09-01 19:12:07 +09:00
7860d97a10 Add type annotation 2018-09-01 18:47:02 +09:00
409b37b271 Update setup docs 2018-09-01 18:42:46 +09:00
ad9b9964fa Update contribution guide 2018-09-01 18:15:25 +09:00
d2b5276f43 Merge pull request #2565 from syuilo/contribution-guide
Update contribution guide
2018-09-01 18:06:19 +09:00
7204e2a84c Update contribution guide 2018-09-01 18:05:13 +09:00
1377fa3332 Merge pull request #2564 from syuilo/readme
Update README.md
2018-09-01 17:28:13 +09:00
bf087bfccf Update README.md 2018-09-01 17:27:33 +09:00
e846e3d571 Update .npmrc 2018-09-01 16:48:22 +09:00
d646e62888 Merge pull request #2559 from acid-chicken/patch-4
Update autogen.sh
2018-09-01 16:34:57 +09:00
c008154d18 8.19.1 2018-09-01 16:26:31 +09:00
29bd4de26a Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-09-01 16:23:40 +09:00
7559b8da6c ✌️ 2018-09-01 16:23:23 +09:00
35218e84fc Merge pull request #2561 from syuilo/refactor-lang-loader
Refactor languages loader
2018-09-01 16:13:50 +09:00
2c135fa2f6 Not fallback to native locale 2018-09-01 16:12:50 +09:00
21da6bd047 Refactor languages loader 2018-09-01 16:05:10 +09:00
f1d65a66b4 Fix bug 2018-09-01 15:38:03 +09:00
63e2dbbb0d Fix bug 2018-09-01 15:22:28 +09:00
a228c522f1 Update autogen.sh 2018-09-01 14:54:40 +09:00
8ee771ca77 8.19.0 2018-09-01 13:12:52 +09:00
488bbc9651 DeckでもURLプレビュー 2018-09-01 13:08:43 +09:00
29b2bdf613 Fix bug 2018-09-01 12:58:04 +09:00
7e35048829 8.18.0 2018-09-01 12:06:15 +09:00
4d6b9f62e5 モバイルのドライブをダークモード対応した 2018-09-01 12:05:25 +09:00
359da9a5a1 8.17.0 2018-09-01 09:44:15 +09:00
2a235151ed #2236 #2237 2018-09-01 09:42:25 +09:00
9e318d5ebc Fix bug 2018-09-01 09:29:59 +09:00
6819eb3b4d Improve usability 2018-09-01 09:16:25 +09:00
4c6fb60dd2 #2541 2018-09-01 08:13:18 +09:00
bffb9a5c45 #2447 #1958 2018-09-01 08:09:21 +09:00
dca4053a67 Merge branch 'master' into develop 2018-09-01 07:33:34 +09:00
fd07f00d14 #2551 2018-09-01 07:33:04 +09:00
bbeb6d534e Merge pull request #2557 from Hiramiya/darkmode
Fix darkmode on followers-you-may-know
2018-09-01 07:15:22 +09:00
63b8af4531 Fix darkmode on followers-you-may-know 2018-08-31 20:42:20 +01:00
e89e76076a Merge pull request #2555 from mei23/mei-0831-vali3
HTTP Signature ホスト検証エラーメッセージの調整
2018-08-31 18:07:08 +09:00
18b4f74cdb Improve validation error message 2018-08-31 16:46:24 +09:00
e53dde385c Merge pull request #2549 from syuilo/greenkeeper/@types/node-10.9.4
Update @types/node to the latest version 🚀
2018-08-31 07:00:46 +09:00
6a7a4c20e6 Merge pull request #2550 from Hiramiya/fix-invalidfiletype
Fix broken invalid-filetype behaviour
2018-08-31 07:00:31 +09:00
6434dac04d Add return for invalid filetypes, fixes wrong behaviour 2018-08-30 21:04:20 +01:00
5deb1bf40e Merge remote-tracking branch 'upstream/develop' into develop 2018-08-30 21:03:00 +01:00
9cd334576c fix(package): update @types/node to version 10.9.4 2018-08-30 16:41:33 +00:00
ae36bf301a Merge branch 'develop' 2018-08-30 22:16:04 +09:00
6a5a9de795 8.16.0 2018-08-30 22:15:41 +09:00
f0abc46429 開発モードで警告を表示するようにするなど 2018-08-30 22:10:29 +09:00
9fd4f5ee0a Merge pull request #2542 from syuilo/l10n_develop
New Crowdin translations
2018-08-30 21:44:00 +09:00
5e202c3def Merge pull request #2547 from mei23/mei-0830-httpsignature
HTTP Signature 周辺の修正
2018-08-30 21:11:43 +09:00
48223c1c76 Validate host in activity 2018-08-30 20:53:41 +09:00
dddf7834cc Add host/digest to HTTP signature 2018-08-30 20:52:35 +09:00
66ef30b2cc New translations ja-JP.yml (Japanese, Kansai) 2018-08-30 18:38:30 +09:00
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
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
6a87e9f690 fix(package): update @types/websocket to version 0.0.40 2018-08-30 00:18:42 +00:00
5b943722fb fix(package): update @types/uuid to version 3.4.4 2018-08-30 00:16:12 +00:00
4d92b14308 Merge pull request #2527 from syuilo/l10n_develop
New Crowdin translations
2018-08-30 08:44:33 +09:00
167c96d14e New translations ja-JP.yml (English) 2018-08-30 04:01:04 +09:00
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
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
4e11da98d9 Merge branch 'develop' into l10n_develop 2018-08-30 03:56:51 +09:00
1b7d98c17e 🎨 2018-08-30 03:56:04 +09:00
3038434712 Fix bug 2018-08-30 03:53:26 +09:00
117ab633a1 Improve API 2018-08-30 03:49:52 +09:00
e50fa4762d Clean up 2018-08-30 03:37:23 +09:00
aed1e839ba Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-30 03:32:45 +09:00
00f2974a2a Refactoring 2018-08-30 03:32:42 +09:00
073c96af47 fix(package): update vue-js-modal to version 1.3.24 2018-08-29 14:02:49 +00:00
71da498364 New translations ja-JP.yml (French) 2018-08-29 22:04:54 +09:00
8e9c11f160 New translations ja-JP.yml (French) 2018-08-29 21:54:19 +09:00
98f6b23249 fix(package): update summaly to version 2.2.0 2018-08-29 12:27:33 +00:00
89288d8e0d Merge pull request #2530 from mei23/mei-0829-apvalidate
ActivityPub Personのホストの検証等の修正
2018-08-29 17:32:33 +09:00
724121eeaa New translations ja-JP.yml (Japanese, Kansai) 2018-08-29 17:32:12 +09:00
edee95a5ca New translations ja-JP.yml (Spanish) 2018-08-29 17:32:08 +09:00
0c2361bf72 New translations ja-JP.yml (Russian) 2018-08-29 17:32:05 +09:00
92f8dc48e3 New translations ja-JP.yml (Portuguese) 2018-08-29 17:32:02 +09:00
06a0fff4b0 New translations ja-JP.yml (Polish) 2018-08-29 17:31:58 +09:00
d55e4621ac New translations ja-JP.yml (Korean) 2018-08-29 17:31:55 +09:00
bc6bda3714 New translations ja-JP.yml (Italian) 2018-08-29 17:31:53 +09:00
d3aafd3f13 New translations ja-JP.yml (German) 2018-08-29 17:31:50 +09:00
1a508de1c4 New translations ja-JP.yml (French) 2018-08-29 17:31:46 +09:00
768cc0aff5 New translations ja-JP.yml (English) 2018-08-29 17:31:42 +09:00
67f4c1f429 New translations ja-JP.yml (Chinese Simplified) 2018-08-29 17:31:39 +09:00
2d4ceec0a5 New translations ja-JP.yml (Catalan) 2018-08-29 17:31:35 +09:00
3e2a0cd89a Add missing l10n 2018-08-29 17:20:51 +09:00
d1f4f2f663 New translations ja-JP.yml (French) 2018-08-29 17:11:12 +09:00
6e3bf26cad Validate host on Person 2018-08-29 16:10:03 +09:00
672377f116 Merge pull request #2524 from l2dy/https-maps
Use https:// for maps.google.com links
2018-08-29 14:46:09 +09:00
80ee5afba7 Merge pull request #2523 from syuilo/l10n_develop
New Crowdin translations
2018-08-29 13:35:37 +09:00
f55fcd3305 Use https:// for maps.google.com links 2018-08-29 04:34:53 +00:00
64fc14ade5 New translations ja-JP.yml (English) 2018-08-29 13:31:12 +09:00
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
62f966dc27 fix(package): update @types/node to version 10.9.3 2018-08-29 02:19:40 +00:00
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
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
9bef723346 fix(package): update systeminformation to version 3.44.2
Closes #2519
2018-08-29 01:08:49 +00:00
b99eabb2cf fix(package): update vue-js-modal to version 1.3.23
Closes #2517
2018-08-29 00:57:08 +00:00
17be3f3d0f Merge pull request #2470 from syuilo/l10n_develop
New Crowdin translations
2018-08-29 08:41:27 +09:00
05fe2cb173 New translations ja-JP.yml (English) 2018-08-29 07:21:30 +09:00
428be14c27 New translations ja-JP.yml (Japanese, Kansai) 2018-08-29 07:11:58 +09:00
a04fa8441e New translations ja-JP.yml (Spanish) 2018-08-29 07:11:55 +09:00
7bcfa84e1a New translations ja-JP.yml (Russian) 2018-08-29 07:11:53 +09:00
1cc5986df3 New translations ja-JP.yml (Portuguese) 2018-08-29 07:11:50 +09:00
7aa5d03875 New translations ja-JP.yml (Polish) 2018-08-29 07:11:48 +09:00
a59fbfac19 New translations ja-JP.yml (Korean) 2018-08-29 07:11:46 +09:00
677f9ee8f6 New translations ja-JP.yml (Italian) 2018-08-29 07:11:43 +09:00
f4a16be2b4 New translations ja-JP.yml (German) 2018-08-29 07:11:41 +09:00
46b967ee4a New translations ja-JP.yml (French) 2018-08-29 07:11:39 +09:00
78568accd1 New translations ja-JP.yml (English) 2018-08-29 07:11:36 +09:00
e9f20a0fad New translations ja-JP.yml (Chinese Simplified) 2018-08-29 07:11:34 +09:00
bbd9894e6b New translations ja-JP.yml (Catalan) 2018-08-29 07:11:31 +09:00
f92745e381 デフォルトで時計を表示するように 2018-08-29 07:10:42 +09:00
2762b78bcc モバイルでもサウンドの設定を行えるように 2018-08-29 07:05:56 +09:00
2d4ed2c8c2 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-29 07:00:02 +09:00
2de8e8c358 Fix bug 2018-08-29 06:59:43 +09:00
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
321e851b26 Fix bug 2018-08-29 06:46:05 +09:00
f8340be3bf fix(package): update @types/elasticsearch to version 5.0.26 2018-08-28 20:36:04 +00:00
02341ceb6e Merge pull request #2512 from Hiramiya/avatarbannerfiletypes
Fix linting errors
2018-08-28 18:08:22 +09:00
3dcdd7a5d7 Fix linting errors 2018-08-28 09:44:49 +01:00
85188b5de2 Merge pull request #3 from syuilo/develop
match main repo
2018-08-28 09:08:15 +01:00
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
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
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
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
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
0082473d78 Merge pull request #2502 from acid-chicken/patch-autogen
[AUTOMATED] Update README.md
2018-08-28 08:07:54 +09:00
77baca8e6e Merge pull request #2511 from Hiramiya/avatarbannerfiletypes
Prevent setting non-image files as avatar/banner
2018-08-28 07:41:50 +09:00
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
6b2089e043 Merge pull request #2507 from Hiramiya/darkmode
Fix various darkmode elements on user pages
2018-08-28 07:38:49 +09:00
14ad3af30d Add "invalid-filetype" translation 2018-08-27 20:04:39 +01:00
e7e6d833b7 Restrict banner filetypes 2018-08-27 20:03:48 +01:00
d1a9561135 Restrict avatar filetypes 2018-08-27 20:03:28 +01:00
c7bda6f908 fix(package): update style-loader to version 0.23.0 2018-08-27 18:05:30 +00:00
ef43721e32 Update update-avatar.ts 2018-08-27 17:29:21 +01:00
ba6cd874aa fix(package): update vue-js-modal to version 1.3.20 2018-08-27 15:41:07 +00:00
f283d2423f Fix border-radius on friends 2018-08-27 16:06:31 +01:00
c07f668f14 Fix border-radius on photos 2018-08-27 16:06:04 +01:00
596524a63c Merge pull request #1 from Hiramiya/develop
Changes to darkmode on user page
2018-08-27 15:58:22 +01:00
975e4dd285 Remove temp border change 2018-08-27 15:51:31 +01:00
09b05c8552 DarkMode user page bottom nav 2018-08-27 15:46:27 +01:00
530ee6f80e DarkMode User Photos 2018-08-27 15:45:35 +01:00
6ad31dca76 DarkMode user friends 2018-08-27 15:43:19 +01:00
d423f8ae57 Merge branch 'develop' 2018-08-27 04:56:57 +09:00
8e5ce7f8e3 8.15.0 2018-08-27 04:56:38 +09:00
33dfc21e4b Fix bug 2018-08-27 04:50:52 +09:00
3266f3948a Update README.md [AUTOGEN] 2018-08-26 17:55:06 +09:00
7259887124 Merge pull request #2500 from syuilo/delete-script
Remove delete-invalid-users.js
2018-08-26 14:30:24 +09:00
800de03187 Remove delete-invalid-users.js 2018-08-26 14:29:12 +09:00
78ba305e5c Merge pull request #2498 from syuilo/ends-with
Use endsWith for readability
2018-08-26 14:03:06 +09:00
bfed1475bb Use endsWith for readability 2018-08-26 13:55:39 +09:00
3281d263c4 New translations ja-JP.yml (Portuguese) 2018-08-26 13:50:55 +09:00
a9a1798e3a New translations ja-JP.yml (Portuguese) 2018-08-26 13:40:51 +09:00
6806eafaed fix(package): update vue-loader to version 15.4.1 2018-08-26 02:26:22 +00:00
3e20ea5b2e Merge pull request #2494 from xps2/donation-from-config
donation、configのmaintainerを参照するよう変更
2018-08-26 10:32:41 +09:00
3f30a69b8b fix 2018-08-26 10:29:24 +09:00
2d2e16d9f6 donation、configのmaintainerを参照するよう変更 2018-08-26 10:14:43 +09:00
9c32118b77 Merge branch 'develop' 2018-08-26 02:33:29 +09:00
ecf2eb4738 8.14.0 2018-08-26 02:33:04 +09:00
3d754ea7eb New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 02:21:08 +09:00
f755f24560 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 02:11:06 +09:00
699879d95d Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-26 02:05:46 +09:00
6677508ba7 Fix #2428 2018-08-26 02:05:42 +09:00
58da32358b Fix indent 2018-08-26 02:05:13 +09:00
491bc75095 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 02:01:04 +09:00
b9eafeee3f Merge pull request #2486 from syuilo/fix-fa-pen
Use pencil-alt instead of pen
2018-08-26 01:57:39 +09:00
c56ff5d88d Add sunnaly proxy option 2018-08-26 01:56:21 +09:00
f5dd83a44a New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 01:51:08 +09:00
9a295a85b1 Merge pull request #2491 from xps2/fix-repository-feedback-url
リポジトリとフィードバックのURLが設定ファイルから反映されないのを修正
2018-08-26 01:23:41 +09:00
8e06d93c31 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 01:21:31 +09:00
1a42200137 New translations ja-JP.yml (Spanish) 2018-08-26 01:21:29 +09:00
bbf33d2475 New translations ja-JP.yml (Russian) 2018-08-26 01:21:27 +09:00
93203ebfd1 New translations ja-JP.yml (Portuguese) 2018-08-26 01:21:24 +09:00
67053eeaa0 New translations ja-JP.yml (Polish) 2018-08-26 01:21:22 +09:00
43baf4ad6a New translations ja-JP.yml (Korean) 2018-08-26 01:21:20 +09:00
5b2a36e47b New translations ja-JP.yml (Italian) 2018-08-26 01:21:18 +09:00
2a0862a24e New translations ja-JP.yml (German) 2018-08-26 01:21:16 +09:00
ce31027b2e New translations ja-JP.yml (French) 2018-08-26 01:21:13 +09:00
3f66c77821 New translations ja-JP.yml (English) 2018-08-26 01:21:11 +09:00
bc713656ec New translations ja-JP.yml (Chinese Simplified) 2018-08-26 01:21:09 +09:00
46d89faebc New translations ja-JP.yml (Catalan) 2018-08-26 01:21:07 +09:00
7135c0e308 Merge pull request #2487 from syuilo/clock-visibility-option
Make clock on header optional
2018-08-26 01:20:29 +09:00
1962bfb4a5 Merge pull request #2489 from mei23/mei-0825-apresolvekey
リモートユーザー解決時のURIがまちがっているのを修正
2018-08-26 01:19:07 +09:00
a1fca2550e Merge pull request #2488 from syuilo/refactor-string
Use startsWith and endsWith for readability
2018-08-26 01:18:34 +09:00
c17f99b7a5 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 01:11:06 +09:00
7cd76d60c2 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 01:01:41 +09:00
fa7c8cfe5b リポジトリとフィードバックのURLが設定ファイルから反映されないのを修正 2018-08-26 01:00:13 +09:00
05fb8d35af New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 00:51:24 +09:00
eaa827e2d9 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 00:41:40 +09:00
f365ea4585 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 00:34:44 +09:00
5d2e43ffb9 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 00:21:08 +09:00
e9a97ed99a New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 00:11:42 +09:00
fe98102600 New translations ja-JP.yml (Japanese, Kansai) 2018-08-26 00:01:48 +09:00
aae8845664 New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 23:53:11 +09:00
81a4388ecc New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 23:41:12 +09:00
be3ab026fd New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 23:31:03 +09:00
f92f9d8cb0 New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 23:11:12 +09:00
08a59591ae Use startsWith and endsWith for readability 2018-08-25 22:42:26 +09:00
a09a244242 Fix resolvePerson key 2018-08-25 22:25:40 +09:00
483a61d90d Make clock on header optional 2018-08-25 22:24:58 +09:00
385fb7586b Use pencil-alt instead of pen 2018-08-25 22:07:10 +09:00
c624da70ef fix(package): update nan to version 2.11.0 2018-08-25 12:45:23 +00:00
675668c395 New translations ja-JP.yml (French) 2018-08-25 20:41:14 +09:00
bc9c7efe85 fix(package): update systeminformation to version 3.44.0 2018-08-25 11:19:17 +00:00
2488d40421 Merge pull request #2482 from syuilo/develop
8.13.0
2018-08-25 19:46:50 +09:00
bf7875bfaa Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-25 19:46:20 +09:00
a84fa30774 8.13.0 2018-08-25 19:46:12 +09:00
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
0875460974 ユーザーのアイコンにサムネイルを使うように
Closes #2365
2018-08-25 19:44:47 +09:00
f0b08d3936 Add brackets 2018-08-25 19:39:06 +09:00
16520c7b4c Merge pull request #2476 from acid-chicken/patch-4
Fix #2392
2018-08-25 19:37:35 +09:00
65549d06d9 ✌️ 2018-08-25 19:34:54 +09:00
52da66d550 New translations ja-JP.yml (English) 2018-08-25 18:12:08 +09:00
251c3c3fe4 New translations ja-JP.yml (English) 2018-08-25 18:01:25 +09:00
ce2d2a10c1 fix(package): update systeminformation to version 3.43.0
Closes #2477
2018-08-25 08:56:01 +00:00
3b6d242ef6 New translations ja-JP.yml (English) 2018-08-25 17:51:28 +09:00
0ebe801af4 Update boot.js 2018-08-25 17:06:40 +09:00
05daa7ac7d Merge pull request #2475 from syuilo/develop
8.12.0
2018-08-25 16:35:29 +09:00
990a583e5e 8.12.0 2018-08-25 16:34:41 +09:00
d9b02a18bf Merge pull request #2474 from mei23/mei-0825-appleroma2
Pleromaとつながらないのを修正
2018-08-25 16:33:02 +09:00
30aae79e5c Merge pull request #2473 from syuilo/develop
8.11.1
2018-08-25 15:41:06 +09:00
a149c121fb 8.11.1 2018-08-25 15:40:47 +09:00
47f4b51207 Fix bug 2018-08-25 15:40:22 +09:00
79f4d886d0 Merge pull request #2472 from syuilo/develop
8.11.0
2018-08-25 15:34:33 +09:00
2b556aba03 8.11.0 2018-08-25 15:34:10 +09:00
4f62043b0c New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 15:31:30 +09:00
b1ae304c51 New translations ja-JP.yml (Spanish) 2018-08-25 15:31:28 +09:00
425bc032d0 New translations ja-JP.yml (Russian) 2018-08-25 15:31:26 +09:00
0156b75bde New translations ja-JP.yml (Portuguese) 2018-08-25 15:31:23 +09:00
8bc8fc58de New translations ja-JP.yml (Polish) 2018-08-25 15:31:21 +09:00
9bf847b1fb New translations ja-JP.yml (Korean) 2018-08-25 15:31:18 +09:00
0b078d203b New translations ja-JP.yml (Italian) 2018-08-25 15:31:16 +09:00
df59018b47 New translations ja-JP.yml (German) 2018-08-25 15:31:14 +09:00
b2681dcb5d New translations ja-JP.yml (French) 2018-08-25 15:31:12 +09:00
46fa471636 New translations ja-JP.yml (English) 2018-08-25 15:31:10 +09:00
5f2c441996 New translations ja-JP.yml (Chinese Simplified) 2018-08-25 15:31:08 +09:00
a79cc42b26 New translations ja-JP.yml (Catalan) 2018-08-25 15:31:05 +09:00
739c993911 Fix #2466 2018-08-25 15:30:48 +09:00
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
4d46a61051 ✌️ 2018-08-25 15:26:13 +09:00
81969ea8b2 🎨 2018-08-25 15:25:16 +09:00
ac474f3884 Send actor in Delete 2018-08-25 14:52:35 +09:00
a39aaf6eb1 Send actor in Undo Follow 2018-08-25 14:46:47 +09:00
68a7661f08 Create Note activity にも toとcc 2018-08-25 14:23:51 +09:00
ffcb2f755c Send actor in CreateNote, Announce 2018-08-25 14:12:44 +09:00
366e0d6bde fix(package): update @types/node to version 10.9.2 2018-08-25 04:40:46 +00:00
b3a3238e43 HTTP Signature検証対象ヘッダにDateが含まれてなくても許容する 2018-08-25 13:40:12 +09:00
92828028db Add Activity id if missing 2018-08-25 13:11:54 +09:00
bd97e315ff New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 12:51:37 +09:00
51083419f5 New translations ja-JP.yml (Spanish) 2018-08-25 12:51:35 +09:00
b23bfd4d86 New translations ja-JP.yml (Russian) 2018-08-25 12:51:32 +09:00
7de3e847bd New translations ja-JP.yml (Portuguese) 2018-08-25 12:51:30 +09:00
0d1a541dba New translations ja-JP.yml (Polish) 2018-08-25 12:51:27 +09:00
2717109fe2 New translations ja-JP.yml (Korean) 2018-08-25 12:51:25 +09:00
60ca0626ce New translations ja-JP.yml (Italian) 2018-08-25 12:51:23 +09:00
15dae0ae65 New translations ja-JP.yml (German) 2018-08-25 12:51:20 +09:00
1c680118a0 New translations ja-JP.yml (French) 2018-08-25 12:51:18 +09:00
ad5efbba59 New translations ja-JP.yml (English) 2018-08-25 12:51:16 +09:00
6dc7baa5e9 New translations ja-JP.yml (Chinese Simplified) 2018-08-25 12:51:14 +09:00
c2b886e750 New translations ja-JP.yml (Catalan) 2018-08-25 12:51:10 +09:00
edb61e52c5 Use resolvable ActivityPub keyId 2018-08-25 12:46:06 +09:00
ded297b04c Merge pull request #2469 from syuilo/develop
8.10.0
2018-08-25 12:44:37 +09:00
65e1d5978a Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-25 12:44:15 +09:00
86e76358b1 8.10.0 2018-08-25 12:44:06 +09:00
435e0257a4 Merge pull request #2468 from syuilo/l10n_develop
New Crowdin translations
2018-08-25 12:43:35 +09:00
1c45cc808b Improve stats page 2018-08-25 12:43:18 +09:00
ed27a2f963 New translations ja-JP.yml (English) 2018-08-25 12:41:07 +09:00
1f53d1a149 Send Content-Type in ActivityPub request 2018-08-25 12:32:31 +09:00
8295f6d7a3 New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 12:31:41 +09:00
b02f6341c9 New translations ja-JP.yml (Spanish) 2018-08-25 12:31:39 +09:00
f6d577d411 New translations ja-JP.yml (Russian) 2018-08-25 12:31:37 +09:00
db3e73318e New translations ja-JP.yml (Portuguese) 2018-08-25 12:31:35 +09:00
29c2071711 New translations ja-JP.yml (Polish) 2018-08-25 12:31:33 +09:00
3acd524d09 New translations ja-JP.yml (Korean) 2018-08-25 12:31:30 +09:00
dae65cc123 New translations ja-JP.yml (Italian) 2018-08-25 12:31:28 +09:00
695f154d87 New translations ja-JP.yml (German) 2018-08-25 12:31:26 +09:00
59dca9a812 New translations ja-JP.yml (French) 2018-08-25 12:31:23 +09:00
b9f04f8f53 New translations ja-JP.yml (English) 2018-08-25 12:31:20 +09:00
0985f14f18 New translations ja-JP.yml (Chinese Simplified) 2018-08-25 12:31:18 +09:00
56684dd7c3 New translations ja-JP.yml (Catalan) 2018-08-25 12:31:16 +09:00
47a5f3bc67 チャートコンポーネントを分離するなど 2018-08-25 12:28:05 +09:00
1c1e3009e9 ✌️ 2018-08-25 12:14:36 +09:00
c7c3f6999b Merge pull request #2465 from syuilo/develop
8.9.2
2018-08-25 11:11:00 +09:00
fb4aa9bc1c 8.9.2 2018-08-25 11:10:38 +09:00
ef57f5907b Fix bug 2018-08-25 11:10:27 +09:00
eff44f9cd1 Merge pull request #2464 from syuilo/develop
8.9.1
2018-08-25 10:28:47 +09:00
d7fa92d58f 8.9.1 2018-08-25 10:28:28 +09:00
4e8033d5a4 Fix bug 2018-08-25 10:28:09 +09:00
8a207d8311 Merge pull request #2461 from syuilo/develop
8.9.0
2018-08-25 08:41:16 +09:00
94ba9c8437 8.9.0 2018-08-25 08:40:16 +09:00
88c71c2998 #2451 2018-08-25 08:39:12 +09:00
7b6e55047f #2460 2018-08-25 08:35:41 +09:00
9d85d0bb08 Merge pull request #2411 from syuilo/l10n_develop
New Crowdin translations
2018-08-25 07:22:34 +09:00
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
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
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
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
6b137f8d69 Merge pull request #2458 from syuilo/master
Master
2018-08-25 07:20:38 +09:00
e78b2b0ab8 Merge pull request #2457 from mei23/mei-0825-apresolveuri3
リモートからのActivityに添付されている投稿は使用しないように変更
2018-08-25 07:07:46 +09:00
8b51428347 ActivityPub resolve で 添付のNoteを使用しないように 2018-08-25 06:50:35 +09:00
b8d53a7b40 Merge pull request #2455 from mei23/mei-0824-apattchobj
ActivityPubで非公開投稿が添付されてしまう件の修正
2018-08-25 05:25:14 +09:00
b0d9e9caa2 New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 01:31:08 +09:00
1fc4ec8dc1 New translations ja-JP.yml (Japanese, Kansai) 2018-08-25 01:21:15 +09:00
a1e1e25800 New translations ja-JP.yml (English) 2018-08-24 23:57:28 +09:00
3b020732ec New translations ja-JP.yml (English) 2018-08-24 23:41:35 +09:00
dcf92945fe New translations ja-JP.yml (English) 2018-08-24 23:31:52 +09:00
f9f33903d4 New translations ja-JP.yml (French) 2018-08-24 21:51:28 +09:00
d8bf06ab0f New translations ja-JP.yml (French) 2018-08-24 21:43:26 +09:00
806dabe58b Merge pull request #2450 from syuilo/develop
8.8.0
2018-08-24 15:02:21 +09:00
a17b8c56d7 New translations ja-JP.yml (Japanese, Kansai) 2018-08-24 15:01:39 +09:00
0eaaaba8f2 New translations ja-JP.yml (Spanish) 2018-08-24 15:01:36 +09:00
f359d79d36 New translations ja-JP.yml (Russian) 2018-08-24 15:01:34 +09:00
1d84000d94 New translations ja-JP.yml (Portuguese) 2018-08-24 15:01:32 +09:00
b70e22c150 8.8.0 2018-08-24 15:01:30 +09:00
0774ffe376 New translations ja-JP.yml (Polish) 2018-08-24 15:01:29 +09:00
0096d7d8ac New translations ja-JP.yml (Korean) 2018-08-24 15:01:27 +09:00
38db966b3d New translations ja-JP.yml (Italian) 2018-08-24 15:01:24 +09:00
cb7d313a66 New translations ja-JP.yml (German) 2018-08-24 15:01:21 +09:00
91b7905f3f New translations ja-JP.yml (French) 2018-08-24 15:01:18 +09:00
9a81fba992 New translations ja-JP.yml (English) 2018-08-24 15:01:16 +09:00
43553d5c09 New translations ja-JP.yml (Chinese Simplified) 2018-08-24 15:01:14 +09:00
e0ca8ce173 New translations ja-JP.yml (Catalan) 2018-08-24 15:01:11 +09:00
13624ea7c2 バグ修正など 2018-08-24 14:55:58 +09:00
9502586c8b ActivityPub Renote/Replyで 対象Noteを添付しないようにする 2018-08-24 14:53:40 +09:00
d6753f2cf2 fix(package): update @types/node to version 10.9.1
Closes #2431
2018-08-24 00:40:11 +00:00
5ba36efcd2 Merge pull request #2446 from syuilo/develop
8.7.0
2018-08-24 09:39:57 +09:00
fd497ef105 8.7.0 2018-08-24 09:39:37 +09:00
9c4a7bf94c Improve chart 2018-08-24 09:39:16 +09:00
91f8adc138 Merge pull request #2445 from syuilo/develop
8.6.0
2018-08-24 08:57:54 +09:00
69fa2373cb 8.6.0 2018-08-24 08:57:31 +09:00
8b37fc4772 Improve chart 2018-08-24 08:56:57 +09:00
81e4ed9591 Merge pull request #2444 from syuilo/develop
8.5.1
2018-08-24 08:36:01 +09:00
9cda89ec04 8.5.1 2018-08-24 08:35:38 +09:00
fc180f030f Fix bug 2018-08-24 08:35:01 +09:00
a827b6028d Merge pull request #2442 from syuilo/develop
8.5.0
2018-08-24 07:24:08 +09:00
4517bf7342 8.5.0 2018-08-24 07:23:42 +09:00
b21287262e チャート取得APIを誰でも利用できるようにするなど 2018-08-24 07:23:04 +09:00
a60ae130c1 New translations ja-JP.yml (Japanese, Kansai) 2018-08-24 07:21:28 +09:00
dd88acd411 New translations ja-JP.yml (Spanish) 2018-08-24 07:21:25 +09:00
b63fc1a9e5 New translations ja-JP.yml (Russian) 2018-08-24 07:21:23 +09:00
17f143cfb2 New translations ja-JP.yml (Portuguese) 2018-08-24 07:21:20 +09:00
cf57d847d1 New translations ja-JP.yml (Polish) 2018-08-24 07:21:18 +09:00
7c4c7bea14 New translations ja-JP.yml (Korean) 2018-08-24 07:21:16 +09:00
e5ec47fc75 New translations ja-JP.yml (Italian) 2018-08-24 07:21:14 +09:00
ad91dc2423 New translations ja-JP.yml (German) 2018-08-24 07:21:11 +09:00
7acbe53948 New translations ja-JP.yml (French) 2018-08-24 07:21:08 +09:00
fe1b8ba0cb New translations ja-JP.yml (English) 2018-08-24 07:21:05 +09:00
b0a8a51b69 New translations ja-JP.yml (Chinese Simplified) 2018-08-24 07:21:03 +09:00
c3ca21e610 New translations ja-JP.yml (Catalan) 2018-08-24 07:21:00 +09:00
c1b47a2119 Add missing changelog 2018-08-24 07:20:26 +09:00
caf625afee Merge pull request #2441 from syuilo/develop
8.4.0
2018-08-24 07:18:00 +09:00
2bad3865a3 8.4.0 2018-08-24 07:17:40 +09:00
3f7d248684 Improve chart 2018-08-24 07:17:17 +09:00
4e7382b793 New translations ja-JP.yml (Japanese, Kansai) 2018-08-24 07:12:36 +09:00
552ff4a044 New translations ja-JP.yml (Spanish) 2018-08-24 07:12:33 +09:00
afb52a0cd5 New translations ja-JP.yml (Russian) 2018-08-24 07:12:31 +09:00
1ac89b0f5b New translations ja-JP.yml (Portuguese) 2018-08-24 07:12:28 +09:00
5039ca7ee1 New translations ja-JP.yml (Polish) 2018-08-24 07:12:26 +09:00
a48fd9ce18 New translations ja-JP.yml (Korean) 2018-08-24 07:12:24 +09:00
58859c4811 New translations ja-JP.yml (Italian) 2018-08-24 07:12:22 +09:00
5988fb3111 New translations ja-JP.yml (German) 2018-08-24 07:12:19 +09:00
8dce821789 New translations ja-JP.yml (French) 2018-08-24 07:12:16 +09:00
16fde0b507 New translations ja-JP.yml (English) 2018-08-24 07:12:13 +09:00
9723662706 New translations ja-JP.yml (Chinese Simplified) 2018-08-24 07:12:11 +09:00
df4415b4fe New translations ja-JP.yml (Catalan) 2018-08-24 07:12:09 +09:00
6e179e7cde Fix 2018-08-24 07:06:25 +09:00
87f248b8ec Merge pull request #2440 from syuilo/develop
8.3.1
2018-08-24 07:03:49 +09:00
027140eccc 8.3.1 2018-08-24 07:03:25 +09:00
92cf205c66 Fix bug 2018-08-24 07:02:52 +09:00
fa3299840f Refactor 2018-08-24 07:02:27 +09:00
f54529d46f New translations ja-JP.yml (Japanese, Kansai) 2018-08-24 06:51:15 +09:00
b772add064 New translations ja-JP.yml (Spanish) 2018-08-24 06:51:13 +09:00
231f2e77a4 New translations ja-JP.yml (Russian) 2018-08-24 06:51:10 +09:00
a000a9e607 New translations ja-JP.yml (Portuguese) 2018-08-24 06:51:08 +09:00
e8da15ab1e New translations ja-JP.yml (Polish) 2018-08-24 06:51:05 +09:00
e070ccb313 New translations ja-JP.yml (Korean) 2018-08-24 06:51:02 +09:00
2b06579228 New translations ja-JP.yml (Italian) 2018-08-24 06:50:59 +09:00
853c847ba1 New translations ja-JP.yml (German) 2018-08-24 06:50:57 +09:00
e852680b0a New translations ja-JP.yml (French) 2018-08-24 06:50:55 +09:00
0b0ee915b3 New translations ja-JP.yml (English) 2018-08-24 06:50:52 +09:00
516d1d093f New translations ja-JP.yml (Chinese Simplified) 2018-08-24 06:50:49 +09:00
aee9c79c0f New translations ja-JP.yml (Catalan) 2018-08-24 06:50:47 +09:00
2d4b183c14 Merge pull request #2439 from syuilo/develop
8.3.0
2018-08-24 06:43:12 +09:00
03b20e11ca 8.3.0 2018-08-24 06:42:40 +09:00
e0e006e284 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-24 06:41:56 +09:00
a294a881ec Improve chart 2018-08-24 06:41:53 +09:00
53926082e7 Merge pull request #2438 from mei23/mei-0824-basehtmlcc
ベースHTMLは immutableキャッシュしないようにする
2018-08-24 05:47:53 +09:00
2d185becc3 New translations ja-JP.yml (Japanese, Kansai) 2018-08-24 05:41:31 +09:00
67fff324b0 New translations ja-JP.yml (Spanish) 2018-08-24 05:41:29 +09:00
f64b7fcabc New translations ja-JP.yml (Russian) 2018-08-24 05:41:27 +09:00
4cefa16db6 New translations ja-JP.yml (Portuguese) 2018-08-24 05:41:25 +09:00
22722379df New translations ja-JP.yml (Polish) 2018-08-24 05:41:22 +09:00
b2b83dc45d New translations ja-JP.yml (Korean) 2018-08-24 05:41:19 +09:00
ebf6f8bbfd New translations ja-JP.yml (Italian) 2018-08-24 05:41:17 +09:00
3e1631d180 New translations ja-JP.yml (German) 2018-08-24 05:41:14 +09:00
97cb3c8613 New translations ja-JP.yml (French) 2018-08-24 05:41:11 +09:00
6dda3a5d8a New translations ja-JP.yml (English) 2018-08-24 05:41:09 +09:00
e50b0540f5 New translations ja-JP.yml (Chinese Simplified) 2018-08-24 05:41:06 +09:00
63b4aee9bd New translations ja-JP.yml (Catalan) 2018-08-24 05:41:04 +09:00
5b5de6a89c ベースHTMLは immutableキャッシュしないようにする 2018-08-24 05:41:03 +09:00
a11c991f83 Merge pull request #2436 from mei23/mei-0824-api404
/api/ 下の存在しないにURL対しては404を返すようにする
2018-08-24 05:40:30 +09:00
a0adcf0d1a Merge pull request #2437 from syuilo/develop
8.2.0
2018-08-24 05:38:18 +09:00
93b2b82993 8.2.0 2018-08-24 05:37:42 +09:00
4dee7d91b1 Better charts 2018-08-24 05:37:19 +09:00
839be6477d Return 404 for unknown API 2018-08-24 05:26:26 +09:00
59e2ed8ab0 Merge pull request #2435 from syuilo/master
Master
2018-08-24 03:48:05 +09:00
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
b70e9824ac fix(package): update @types/webpack to version 4.4.11 2018-08-23 18:26:42 +00:00
155d49e8ac fix(package): update @types/sharp to version 0.17.10 2018-08-23 18:16:46 +00:00
4ae10ab33d fix(package): update vue-js-modal to version 1.3.19 2018-08-23 14:46:37 +00:00
7124586eb1 New translations ja-JP.yml (French) 2018-08-23 18:12:02 +09:00
74f6ed1851 New translations ja-JP.yml (French) 2018-08-23 18:03:12 +09:00
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
e59f13e8ff Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-23 16:37:40 +09:00
31ed8949b9 8.1.0 2018-08-23 16:37:32 +09:00
f1174a15e0 Merge pull request #2423 from syuilo/develop (#2425) 2018-08-23 16:37:07 +09:00
912ffae600 Merge pull request #2424 from acid-chicken/patch-4
Fix #2421
2018-08-23 16:36:42 +09:00
71a5662195 一時間ごとのグラフも見れるように 2018-08-23 16:36:23 +09:00
774834a31f Update url-preview.vue 2018-08-23 16:25:36 +09:00
91f1c3a10a Merge pull request #2423 from syuilo/develop
8.0.0
2018-08-23 15:42:14 +09:00
8fc1e07136 1時間単位での集計を追加 2018-08-23 15:40:24 +09:00
a62e2b83ff Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-23 14:56:43 +09:00
e31a2f7e55 Fix bug: Check following request existance 2018-08-23 14:56:39 +09:00
1598e996b1 Merge pull request #2419 from rinsuki/patch-1
https://misskey.xyz/notes/5b7e20bd248403003019b860 の修正
2018-08-23 12:00:46 +09:00
4fb7ee760a https://misskey.xyz/notes/5b7e20bd248403003019b860 の修正 2018-08-23 11:58:44 +09:00
37865cb381 Merge pull request #2416 from syuilo/master
Master
2018-08-23 05:46:24 +09:00
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
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
1d9c88e9a1 New translations ja-JP.yml (English) 2018-08-23 05:44:01 +09:00
ea56d368e3 Merge pull request #2414 from syuilo/develop
7.4.1
2018-08-23 03:45:25 +09:00
dbd3a750f5 7.4.1 2018-08-23 03:45:04 +09:00
f41818141f Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-23 03:44:42 +09:00
d2f576accd 互換性の修正 2018-08-23 03:44:32 +09:00
4e483856d4 Merge pull request #2413 from syuilo/master
Master
2018-08-23 03:24:43 +09:00
2997f26e3c Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-23 03:24:15 +09:00
cdab596240 7.4.0 2018-08-23 03:24:06 +09:00
fca7a9da94 Merge pull request #2412 from syuilo/develop
update
2018-08-23 03:23:31 +09:00
8ba178f795 コントロールパネルから招待制のオンオフを切り替えられるように 2018-08-23 03:19:57 +09:00
8eb8243153 New translations ja-JP.yml (Japanese, Kansai) 2018-08-23 03:01:33 +09:00
b4967b862c New translations ja-JP.yml (Spanish) 2018-08-23 03:01:31 +09:00
aee3517736 New translations ja-JP.yml (Russian) 2018-08-23 03:01:28 +09:00
52ff8e84fa New translations ja-JP.yml (Portuguese) 2018-08-23 03:01:26 +09:00
9bb6db649c New translations ja-JP.yml (Polish) 2018-08-23 03:01:24 +09:00
da99be9897 New translations ja-JP.yml (Korean) 2018-08-23 03:01:21 +09:00
2d7ec8a471 New translations ja-JP.yml (Italian) 2018-08-23 03:01:19 +09:00
4cbbfdad1a New translations ja-JP.yml (German) 2018-08-23 03:01:17 +09:00
2924858311 New translations ja-JP.yml (French) 2018-08-23 03:01:14 +09:00
85916bfea1 New translations ja-JP.yml (English) 2018-08-23 03:01:12 +09:00
38ccd9e794 New translations ja-JP.yml (Chinese Simplified) 2018-08-23 03:01:10 +09:00
c64b6be915 New translations ja-JP.yml (Catalan) 2018-08-23 03:01:07 +09:00
d98c67e13c Add control panel link in nav 2018-08-23 02:47:12 +09:00
d129151fdf Fix #2410
なぜか .ts という拡張子で来るのかは不明
2018-08-23 02:28:58 +09:00
1b9c69f793 Fix bug 2018-08-23 01:55:39 +09:00
42dd092334 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-08-23 01:37:20 +09:00
8dc9ec06f8 良い感じに 2018-08-23 01:37:05 +09:00
ae5da782e5 Merge pull request #2409 from syuilo/l10n_develop
New Crowdin translations
2018-08-23 01:36:40 +09:00
313b0cec65 New translations ja-JP.yml (Japanese, Kansai) 2018-08-23 01:36:10 +09:00
12a51972ed New translations ja-JP.yml (Spanish) 2018-08-23 01:36:07 +09:00
a2f3b2966f New translations ja-JP.yml (Russian) 2018-08-23 01:36:05 +09:00
0c2627f08b New translations ja-JP.yml (Portuguese) 2018-08-23 01:36:03 +09:00
9535df12dd New translations ja-JP.yml (Polish) 2018-08-23 01:36:00 +09:00
2400471a0d New translations ja-JP.yml (Korean) 2018-08-23 01:35:57 +09:00
784da8c37b New translations ja-JP.yml (Italian) 2018-08-23 01:35:55 +09:00
3778f9c521 New translations ja-JP.yml (German) 2018-08-23 01:35:52 +09:00
e1cec85f1e New translations ja-JP.yml (French) 2018-08-23 01:35:49 +09:00
ca9c087060 New translations ja-JP.yml (English) 2018-08-23 01:35:47 +09:00
5b2d91baad New translations ja-JP.yml (Chinese Simplified) 2018-08-23 01:35:44 +09:00
08e099b88d New translations ja-JP.yml (Catalan) 2018-08-23 01:35:41 +09:00
4153b0db38 Merge pull request #2408 from syuilo/l10n_develop
New Crowdin translations
2018-08-23 01:17:48 +09:00
88701a21bb New translations ja-JP.yml (Japanese, Kansai) 2018-08-23 01:16:01 +09:00
3ddc73ca94 New translations ja-JP.yml (Spanish) 2018-08-23 01:15:59 +09:00
693d793265 New translations ja-JP.yml (Russian) 2018-08-23 01:15:57 +09:00
5d685233dd New translations ja-JP.yml (Portuguese) 2018-08-23 01:15:54 +09:00
16575751d9 New translations ja-JP.yml (Polish) 2018-08-23 01:15:52 +09:00
1f6295f437 New translations ja-JP.yml (Korean) 2018-08-23 01:15:49 +09:00
6737fe2ead New translations ja-JP.yml (Italian) 2018-08-23 01:15:47 +09:00
4e77939fca New translations ja-JP.yml (German) 2018-08-23 01:15:44 +09:00
21f528c07d New translations ja-JP.yml (French) 2018-08-23 01:15:41 +09:00
23f835fac0 New translations ja-JP.yml (English) 2018-08-23 01:15:38 +09:00
f21343225c New translations ja-JP.yml (Chinese Simplified) 2018-08-23 01:15:36 +09:00
f13a59f7db New translations ja-JP.yml (Catalan) 2018-08-23 01:15:33 +09:00
0315b9274c Merge pull request #2407 from syuilo/master
Master
2018-08-23 00:49:52 +09:00
da88043962 Merge pull request #2396 from Tosuke/fix-2354
Mute on mobile(#2354)
2018-08-23 00:47:50 +09:00
0352bf0cc2 Merge pull request #2393 from acid-chicken/patch-autogen-shell
Add autogen.sh
2018-08-23 00:47:08 +09:00
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
2713064f27 Merge pull request #2405 from acid-chicken/patch-4
Migrate summaly to 2.1.4
2018-08-23 00:45:25 +09:00
f6387ac115 Merge pull request #2406 from syuilo/master
Master
2018-08-23 00:44:13 +09:00
d704aca035 Update url-preview.vue 2018-08-23 00:40:32 +09:00
2b54b4ac06 Update url-preview.vue 2018-08-23 00:34:35 +09:00
7410f2f4c0 fix(package): update summaly to version 2.1.4 2018-08-22 14:55:38 +00:00
99c3c1258a Merge pull request #2402 from acid-chicken/patch-3
Update Crowdin configuration file
2018-08-22 23:54:03 +09:00
e51184931d Update crowdin.yml 2018-08-22 23:53:27 +09:00
3bc9a40b48 fix(package): update webpack to version 4.17.1 2018-08-22 09:56:30 +00:00
9f49ca8fdb feature mute on mobile(#2354) 2018-08-22 15:54:22 +09:00
550d1547b4 Add autogen.sh
refs: https://github.com/syuilo/misskey/pull/2391#issuecomment-414915763
2018-08-22 14:41:41 +09:00
ca0b56ee57 Merge pull request #2391 from acid-chicken/patch-autogen
[AUTOMATED] Update README.md
2018-08-22 14:26:05 +09:00
ef1d854f2c Update README.md [AUTOGEN] 2018-08-22 14:25:06 +09:00
a5023271ef 7.3.0 2018-08-22 09:40:54 +09:00
c3747db670 Fix doc 2018-08-22 09:36:42 +09:00
fe1e60a28c Fix #2334 2018-08-22 09:33:59 +09:00
f91d2e8c8d Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-22 09:31:51 +09:00
dccc2c60e3 Fix bugs
Closes #2367
2018-08-22 09:31:35 +09:00
933e25804c Merge pull request #2389 from Tosuke/fix-2384
Fix login bug(#2384)
2018-08-22 09:27:09 +09:00
0b503661af fix login bug(#2384) 2018-08-22 09:26:06 +09:00
58082431ff Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-22 09:16:55 +09:00
2536bfb5f5 #2378 2018-08-22 09:16:52 +09:00
6428066552 Merge pull request #2388 from mei23/mei-0822-dbcheck
起動時のDB接続チェックでエラーを検出できないのを修正
2018-08-22 09:12:59 +09:00
4bf3827b73 Revert "#2387"
This reverts commit 3cad494404.
2018-08-22 09:12:37 +09:00
3cad494404 #2387 2018-08-22 09:11:59 +09:00
ef0793311f リバーシのアイコンのコントラストのオプションを追加するなど 2018-08-22 09:10:39 +09:00
6f3e341e89 Fix DB connectivity check 2018-08-22 08:46:31 +09:00
2fea3be7c0 Merge pull request #2364 from acid-chicken/patch-2
Resolve #2363
2018-08-22 08:41:47 +09:00
82059d4fd9 7.2.0 2018-08-22 05:24:16 +09:00
07ddeae2f1 Clean up 2018-08-22 04:53:02 +09:00
f2279758b2 Merge pull request #2366 from acid-chicken/patch-autogen
[AUTOMATED] Update README.md
2018-08-22 03:30:12 +09:00
1ed189a518 Merge pull request #2386 from acid-chicken/patch-3
Update boot.js
2018-08-22 02:25:41 +09:00
137741d307 Update index.js 2018-08-22 01:52:13 +09:00
d702f6e090 Rename ja-ks.yml to ja-KS.yml 2018-08-22 01:51:42 +09:00
f33701233c Update boot.js 2018-08-22 01:50:13 +09:00
70003269e5 Update boot.js 2018-08-22 01:48:08 +09:00
61896d2386 Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-22 01:46:13 +09:00
52d640c5a7 Fix 2018-08-22 01:46:10 +09:00
c65f5761e1 Merge pull request #2385 from mei23/mei-0821-aptype
ActivityPub で Content-Type を正しく扱う
2018-08-22 01:23:43 +09:00
3016ac4805 Fix bug 2018-08-22 01:02:56 +09:00
28a47cd331 Fix 2018-08-22 00:59:07 +09:00
6ecb88b0d1 #2338 2018-08-22 00:52:00 +09:00
8df1278c8e Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-22 00:44:26 +09:00
52bec430d4 use ja-JP 2018-08-22 00:44:07 +09:00
da4cec8767 Merge pull request #2362 from syuilo/greenkeeper/vue-loader-15.4.0
Update vue-loader to the latest version 🚀
2018-08-22 00:11:24 +09:00
ad0087d7dd Merge pull request #2382 from syuilo/greenkeeper/webpack-4.17.0
Update webpack to the latest version 🚀
2018-08-22 00:11:12 +09:00
9630860035 Merge pull request #2383 from syuilo/greenkeeper/sharp-0.20.7
fix(package): update sharp to version 0.20.7
2018-08-22 00:11:01 +09:00
75e4c8d74d Better reponse 2018-08-21 23:56:15 +09:00
1a5ee81e7e fix(package): update sharp to version 0.20.7
Closes #2368
2018-08-21 11:18:21 +00:00
3476be16ab Merge pull request #2381 from mei23/mei-0821-apnote
ActivityPub Note/Outbox の公開範囲の修正
2018-08-21 20:07:33 +09:00
c42f61a0f4 fix(package): update webpack to version 4.17.0 2018-08-21 08:48:10 +00:00
b42a9e1c4e Set ActivityPub Content-Type 2018-08-21 13:48:03 +09:00
4495525705 Respect visibility in ActivityPub Note/Outbox 2018-08-21 13:22:30 +09:00
a603602f32 Clean up 2018-08-21 05:42:31 +09:00
67b28f9b6e fix(package): update vue-js-modal to version 1.3.18 2018-08-20 19:58:32 +00:00
fd947407af Revert "Fix bug?"
This reverts commit 2c9bacfcea.
2018-08-21 01:23:39 +09:00
30444e5f1a #2359 など 2018-08-21 01:03:58 +09:00
f0d818de24 Fix bug 2018-08-21 00:12:45 +09:00
3fb98e808f 7.1.2 2018-08-20 23:49:27 +09:00
2c9bacfcea Fix bug? 2018-08-20 23:49:00 +09:00
ae0284b1b1 Update README.md [AUTOGEN] 2018-08-20 19:03:01 +09:00
166c4ebda0 Update reversi.game.vue 2018-08-20 18:12:03 +09:00
319eed029b Update reversi.game.vue 2018-08-20 18:10:51 +09:00
ec5aa10167 fix(package): update vue-loader to version 15.4.0 2018-08-20 00:44:56 +00:00
a542765cf8 Merge pull request #2352 from acid-chicken/patch-2
Update README.md
2018-08-20 07:45:35 +09:00
fd3f8d43db Merge pull request #2356 from acid-chicken/patch-3
Fix z-index
2018-08-20 07:44:57 +09:00
4f4496078a Update user.vue 2018-08-20 02:05:57 +09:00
8f4f5b4ce0 7.1.1 2018-08-20 01:42:56 +09:00
bdc6718ae5 Fix bug 2018-08-20 01:41:53 +09:00
09d1f1c20d Update README.md 2018-08-19 23:14:22 +09:00
0efb7af17b 7.1.0 2018-08-19 23:11:55 +09:00
a45a78b94f Merge pull request #2336 from syuilo/l10n_master
New Crowdin translations
2018-08-19 23:06:47 +09:00
6337c26cf0 Merge pull request #2347 from syuilo/greenkeeper/html-minifier-3.5.20
Update html-minifier to the latest version 🚀
2018-08-19 23:06:34 +09:00
208dec25d9 Merge pull request #2349 from syuilo/configress-build
設定ファイルなしでビルドできるように
2018-08-19 22:32:58 +09:00
7d65a0c3d5 wip 2018-08-19 22:32:25 +09:00
bb925e5de3 wip 2018-08-19 21:07:18 +09:00
c9de5b65d4 wip 2018-08-19 19:15:29 +09:00
9bc3fcf74f Merge pull request #2348 from mei23/mei-0819-nsfw3
リモートにNSFWが効かないのを修正
2018-08-19 18:46:47 +09:00
19d979c330 Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-19 18:38:15 +09:00
bb7b335491 nameId廃止 & アプリ作成時にシークレットを返すように 2018-08-19 18:38:02 +09:00
be5a0b4794 Fix リモートにNSFWが効かない 2018-08-19 18:08:29 +09:00
48eea03386 fix(package): update html-minifier to version 3.5.20 2018-08-19 09:03:23 +00:00
566317dc83 Fix bug 2018-08-19 13:32:02 +09:00
d4334645c2 New translations ja.yml (Japanese (Kansai-ben)) 2018-08-19 12:41:16 +09:00
8cc017354a New translations ja.yml (English) 2018-08-19 04:11:04 +09:00
7caa083612 New translations ja.yml (Japanese (Kansai-ben)) 2018-08-19 04:01:58 +09:00
68e1b00eb1 New translations ja.yml (Catalan) 2018-08-19 04:01:55 +09:00
1d904c756a New translations ja.yml (Portuguese) 2018-08-19 04:01:53 +09:00
0a1db1f595 New translations ja.yml (Korean) 2018-08-19 04:01:50 +09:00
e30e8267dd New translations ja.yml (Polish) 2018-08-19 04:01:48 +09:00
288a881817 New translations ja.yml (Chinese Simplified) 2018-08-19 04:01:46 +09:00
f593790872 New translations ja.yml (Italian) 2018-08-19 04:01:43 +09:00
1044ad8589 New translations ja.yml (Russian) 2018-08-19 04:01:41 +09:00
6e24015e68 New translations ja.yml (English) 2018-08-19 04:01:39 +09:00
b9a2c449ff New translations ja.yml (Spanish) 2018-08-19 04:01:37 +09:00
7c390cbf7b New translations ja.yml (German) 2018-08-19 04:01:35 +09:00
a657d1c774 New translations ja.yml (French) 2018-08-19 04:01:33 +09:00
247 changed files with 5194 additions and 3420 deletions

87
.autogen/autogen.sh Executable file
View File

@ -0,0 +1,87 @@
#!/usr/bin/env bash
# __MISSKEY_BEARER_TOKEN=
# __MISSKEY_CAMPAIGN_ID=
# __MISSKEY_GITHUB_TOKEN=
# __MISSKEY_HEAD=acid-chicken:patch-autogen
# __MISSKEY_REPO=syuilo/misskey
# __MISSKEY_BRANCH=develop
test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN" | jq -r '.[].head.label' | grep $__MISSKEY_HEAD)" && exit 1
cd "$(dirname $0)/.." && \
touch null.cache && \
rm *.cache && \
git checkout $__MISSKEY_BRANCH && \
git pull origin $__MISSKEY_BRANCH && \
git pull upstream $__MISSKEY_BRANCH && \
git stash && \
git rebase -f upstream/$__MISSKEY_BRANCH && \
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/$__MISSKEY_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 $__MISSKEY_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="$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":"'$__MISSKEY_HEAD'","base":"'$__MISSKEY_BRANCH'"}' -- "https://api.github.com/repos/$__MISSKEY_REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN"
git stash
git checkout $__MISSKEY_BRANCH
git branch -D patch-autogen

View File

@ -138,3 +138,6 @@ drive:
# Clustering # Clustering
# clusterLimit: 1 # clusterLimit: 1
# Summaly proxy
# summalyProxy: "http://example.com"

2
.npmrc
View File

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

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
----- -----

View File

@ -1,27 +1,27 @@
# Contribution guide # Contribution guide
:v: Misskeyへの貢献ありがとうございます。 :v: :v: Thanks for your contributions :v:
## Issueの報告 ## Issues
新機能の提案や不具合の報告は https://github.com/syuilo/misskey/issues で管理しています。 Feature suggestions and bug reports are filed in https://github.com/syuilo/misskey/issues .
Issueを作成する前に、既に同じIssueが作成されていないかご確認ください。 Before creating a new issue, please search existing issues to avoid duplication.
もし既にIssueが作成されている場合は、既存のIssueにコメントをしたりリアクションをするようお願いします。 If you find the existing issue, please add your reaction or comment to the issue.
## Issueの解決 ## Internationalization (i18n)
[pr-welcomeのラベルがついているIssue](https://github.com/syuilo/misskey/labels/pr-welcome) Please see [Translation guide](./docs/translate.en.md).
の解決を目的としたPull Requestを作成してくださると非常にありがたいです。
## 翻訳の改善 ## Localization (l10n)
ソースコード中の `%i18n:id%` という形の文字列は、言語ファイルの対応するテキストに置換されます。 Please use [Crowdin](https://crowdin.com/project/misskey) for localization.
言語ファイルは /locales ディレクトリに存在します。
## ドキュメントの編集 ![Crowdin](https://d322cqt584bo4o.cloudfront.net/misskey/localized.svg)
現在Misskeyはドキュメントが大きく不足しています。
ドキュメントは /docs ディレクトリに存在します。
## テストの追加 ## Documentation
現在Misskeyはテストが大きく不足しています。 * Documents for contributors are located in `/docs`.
テストコードは /test ディレクトリに存在します。 * Documents for instance admins are located in `/docs`.
* Documents for end users are located in `src/docs`.
## 自動テスト及び自動リリース ## Test
Travis CIで行っています。 * Test codes are located in `/test`.
設定ファイルは /.travis に存在します。
## Continuous integration
Misskey uses Travis for automated test.
Configuration files are located in `/.travis`.

View File

@ -24,7 +24,7 @@ Why don't you take a short break from the hustle and bustle of the city, and div
* Reactions * Reactions
* User lists * User lists
* Customizable column view (called MisskeyDeck) * Customizable column view (called MisskeyDeck)
* and widgets! * Customizable widgets
* Private messages * Private messages
* ActivityPub support * ActivityPub support
@ -32,16 +32,11 @@ and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz
:package: Create your own instance :package: Create your own instance
---------------------------------------------------------------- ----------------------------------------------------------------
If you want to run your own instance of Misskey, Please see [Setup and installation guide](./docs/setup.en.md).
please see [Setup and installation guide](./docs/setup.en.md).
:wrench: Contribute :wrench: Contribution
---------------------------------------------------------------- ----------------------------------------------------------------
**[PR](https://github.com/syuilo/misskey/pulls)s welcome!** Please see [Contribution guide](./CONTRIBUTING.md).
If you want to...
* i18n ... please see [Translation guide](./docs/translate.en.md).
* l10n ... please visit https://crowdin.com/project/misskey
:heart: Backers & Sponsors :heart: Backers & Sponsors
---------------------------------------------------------------- ----------------------------------------------------------------
@ -49,35 +44,43 @@ If you want to...
<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/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D" alt="Naoki Kosaka"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=zwSu01tOtn5xTUucDZHuPsCxF2HBEMVs9ROJKTlEV_o%3D" alt="nemu"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12931605/ead494101f364dffa90efe49e36fb494/1?token-time=2145916800&token-hash=NzSFPjIlodXyv41rwK61aZWVZWfI4surJaNj8vWKvqM%3D" alt="Reiju"></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=5881381">Naoki Kosaka</a></td> <td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
<td><a href="https://www.patreon.com/user?u=12931605">Reiju</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/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>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4950409/28e7d016209243759d9316be2e21381d/2?token-time=2145916800&token-hash=LuEaDkchH3GQWUcTOhBQ8xfKQYF0s5FjlZRd7Yduia8%3D" alt="mikan54951"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4950409/28e7d016209243759d9316be2e21381d/2?token-time=2145916800&token-hash=LuEaDkchH3GQWUcTOhBQ8xfKQYF0s5FjlZRd7Yduia8%3D" alt="mikan54951"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td>
<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/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>
<td><a href="https://www.patreon.com/user?u=4950409">mikan54951</a></td> <td><a href="https://www.patreon.com/user?u=4950409">mikan54951</a></td>
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td> <td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
<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:** Sat, 18 Aug 2018 02:02:58 UTC **Last updated:** Sun, 26 Aug 2018 08:55:06 UTC
<!-- PATREON_END --> <!-- PATREON_END -->
:four_leaf_clover: Copyright :four_leaf_clover: Copyright

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
cli/migration/8.0.0.js Normal file
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();

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

View File

@ -131,6 +131,7 @@ You can check if the service is running with `systemctl status misskey`.
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` 2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
3. `npm install` 3. `npm install`
4. `npm run build` 4. `npm run build`
5. Check [ChangeLog](../CHANGELOG.md) for migration information
---------------------------------------------------------------- ----------------------------------------------------------------

View File

@ -120,6 +120,7 @@ WantedBy=multi-user.target
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` 2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
3. `npm install` 3. `npm install`
4. `npm run build` 4. `npm run build`
5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
---------------------------------------------------------------- ----------------------------------------------------------------

View File

@ -11,12 +11,12 @@ If you find an untranslated part on Misskey:
- In fact, `foo` should be a word that is appropriate for the situation and is easy to understand in English. - In fact, `foo` should be a word that is appropriate for the situation and is easy to understand in English.
- For example, if the untranslated portion is the following "タイムライン" you must write: `%i18n:@timeline%`. - For example, if the untranslated portion is the following "タイムライン" you must write: `%i18n:@timeline%`.
3. Open the `locales/ja.yml`, check whether the <strong>file name (path)</strong> found in step 1 exists, if not, create it. 3. Open the `locales/ja-JP.yml`, check whether the <strong>file name (path)</strong> found in step 1 exists, if not, create it.
- Do not put the beginning of the path `src/client/app/` in the locale file. - Do not put the beginning of the path `src/client/app/` in the locale file.
- For example, in this case we want to modify untranslated parts of `src/client/app/mobile/views/pages/home.vue`, so the key is `mobile/views/pages/home.vue`. - For example, in this case we want to modify untranslated parts of `src/client/app/mobile/views/pages/home.vue`, so the key is `mobile/views/pages/home.vue`.
4. Add the text property using the `foo` keyword below the path that you found or created in step 2. Make sure to type your text in quotation marks. Text should always be inside of quotes. 4. Add the text property using the `foo` keyword below the path that you found or created in step 2. Make sure to type your text in quotation marks. Text should always be inside of quotes.
- For example, in this case we add timeline: `timeline: "タイムライン"` to `locales/ja.yml`. - For example, in this case we add timeline: `timeline: "タイムライン"` to `locales/ja-JP.yml`.
5. And done 5. And done

View File

@ -16,7 +16,7 @@ Si vous trouvez un segment non-traduit sur Misskey :
- Par exemple, dans ce cas de figure, nous voulons modifier le segment non-traduit de : `src/client/app/mobile/views/pages/home.vue`donc il faut juste écrire : `mobile/views/pages/home.vue` dans les fichiers linguistiques. - Par exemple, dans ce cas de figure, nous voulons modifier le segment non-traduit de : `src/client/app/mobile/views/pages/home.vue`donc il faut juste écrire : `mobile/views/pages/home.vue` dans les fichiers linguistiques.
4. Ajoutez la propriété du texte traduit grâce à la clef `foo`, en-dessous du chemin correspondant à votre modification que vous avez trouvé ou créé dans l'étape 2. À côté, veuillez indiquer entre "guillemets" la valeur de votre traduction. 4. Ajoutez la propriété du texte traduit grâce à la clef `foo`, en-dessous du chemin correspondant à votre modification que vous avez trouvé ou créé dans l'étape 2. À côté, veuillez indiquer entre "guillemets" la valeur de votre traduction.
- Par exemple, dans ce cas de figure, nous ajoutons la propriété et la traduction `timeline: "Timeline"` à `locales/fr.yml`, mais aussi la propriété et la version originale `timeline: "タイムライン"` à `locales/ja.yml`. - Par exemple, dans ce cas de figure, nous ajoutons la propriété et la traduction `timeline: "Timeline"` à `locales/fr.yml`, mais aussi la propriété et la version originale `timeline: "タイムライン"` à `locales/ja-JP.yml`.
5. Vous avez réussi à traduire une portion de misskey 5. Vous avez réussi à traduire une portion de misskey

View File

@ -11,12 +11,12 @@ Misskey内の未翻訳箇所を見つけたら
- `foo`は実際にはその場に適したわかりやすい(英語の)名前にしてください。 - `foo`は実際にはその場に適したわかりやすい(英語の)名前にしてください。
- 例えば未翻訳箇所が「タイムライン」というテキストだった場合、`%i18n:@timeline%`のようにします。 - 例えば未翻訳箇所が「タイムライン」というテキストだった場合、`%i18n:@timeline%`のようにします。
3. `locales/ja.yml`を開き、1.で見つけた<strong>ファイル名(パス)</strong>のキーが存在するか確認し、無ければ作成してください。 3. `locales/ja-JP.yml`を開き、1.で見つけた<strong>ファイル名(パス)</strong>のキーが存在するか確認し、無ければ作成してください。
- パスの`src/client/app/`は省略してください。 - パスの`src/client/app/`は省略してください。
- 例えば、今回の例では`src/client/app/mobile/views/pages/home.vue`の未翻訳箇所を修正したいので、キーは`mobile/views/pages/home.vue`になります。 - 例えば、今回の例では`src/client/app/mobile/views/pages/home.vue`の未翻訳箇所を修正したいので、キーは`mobile/views/pages/home.vue`になります。
4. そのキーの直下に2.で置換した`foo`の部分をキーとし、テキストを値とするプロパティを追加します。 4. そのキーの直下に2.で置換した`foo`の部分をキーとし、テキストを値とするプロパティを追加します。
- 例えば、今回の例で言うと`locales/ja.yml``timeline: "タイムライン"`を追加します。 - 例えば、今回の例で言うと`locales/ja-JP.yml``timeline: "タイムライン"`を追加します。
5. 完了です! 5. 完了です!

View File

@ -23,7 +23,6 @@ const uglifyes = require('uglify-es');
const locales = require('./locales'); const locales = require('./locales');
import { fa } from './src/misc/fa'; import { fa } from './src/misc/fa';
import config from './src/config';
const uglify = uglifyComposer(uglifyes, console); const uglify = uglifyComposer(uglifyes, console);
@ -60,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',
@ -118,7 +126,6 @@ gulp.task('build:client:script', () => {
const client = require('./built/client/meta.json'); const client = require('./built/client/meta.json');
return gulp.src(['./src/client/app/boot.js', './src/client/app/safe.js']) return gulp.src(['./src/client/app/boot.js', './src/client/app/safe.js'])
.pipe(replace('VERSION', JSON.stringify(client.version))) .pipe(replace('VERSION', JSON.stringify(client.version)))
.pipe(replace('API', JSON.stringify(config.api_url)))
.pipe(replace('ENV', JSON.stringify(env))) .pipe(replace('ENV', JSON.stringify(env)))
.pipe(replace('LANGS', JSON.stringify(Object.keys(locales)))) .pipe(replace('LANGS', JSON.stringify(Object.keys(locales))))
.pipe(isProduction ? uglify({ .pipe(isProduction ? uglify({

View File

@ -1,5 +1,3 @@
# **Please DO NOT edit these files** except `ja.yml`. # **DO NOT edit locale files** except `ja-JP.yml`.
If you want to... Please see [Contribution guide](../CONTRIBUTING.md) for more information.
* i18n ... please see [Translation guide](../docs/translate.en.md).
* l10n ... please visit https://crowdin.com/project/misskey

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: "フォロー"

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"
@ -443,6 +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: "Banner" banner: "Banner"
nsfw: "閲覧注意"
contextmenu: contextmenu:
rename: "Umbenennen" rename: "Umbenennen"
mark-as-sensitive: "閲覧注意に設定" mark-as-sensitive: "閲覧注意に設定"
@ -629,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をタイムラインに表示する"
@ -753,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"
@ -798,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: "ユーザーの凍結"
@ -817,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: "メディアビュー"
@ -837,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: "わかった"
@ -954,12 +970,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択" select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue: mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択" select-folder: "フォルダーを選択"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue: mobile/views/components/drive.file-detail.vue:
download: "ダウンロード" download: "ダウンロード"
rename: "名前を変更" rename: "名前を変更"
move: "移動" move: "移動"
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1040,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: "このユーザーは投稿していないようです。"
@ -1157,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: "フォロー"

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"
@ -443,6 +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: "Banner" banner: "Banner"
nsfw: "NSFW"
contextmenu: contextmenu:
rename: "Rename" rename: "Rename"
mark-as-sensitive: "Mark as 'sensitive'" mark-as-sensitive: "Mark as 'sensitive'"
@ -629,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"
@ -753,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"
@ -798,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:
@ -817,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"
@ -837,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!"
@ -954,12 +970,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "Choose files" select-file: "Choose files"
mobile/views/components/drive-folder-chooser.vue: mobile/views/components/drive-folder-chooser.vue:
select-folder: "Choose a folder" select-folder: "Choose a folder"
mobile/views/components/drive.file.vue:
nsfw: "NSFW"
mobile/views/components/drive.file-detail.vue: mobile/views/components/drive.file-detail.vue:
download: "Download" download: "Download"
rename: "Rename" rename: "Rename"
move: "Move" move: "Move"
hash: "Hash (md5)" hash: "Hash (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "NSFW"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "NSFW" sensitive: "NSFW"
click-to-show: "Click to show" click-to-show: "Click to show"
@ -1040,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."
@ -1053,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"
@ -1157,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"

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"
@ -443,6 +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: "Banner" banner: "Banner"
nsfw: "閲覧注意"
contextmenu: contextmenu:
rename: "Renombrar" rename: "Renombrar"
mark-as-sensitive: "Marcar como 'sensible'" mark-as-sensitive: "Marcar como 'sensible'"
@ -629,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をタイムラインに表示する"
@ -753,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: "闇に飲まれる"
@ -798,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: "ユーザーの凍結"
@ -817,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: "メディアビュー"
@ -837,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: "わかった"
@ -954,12 +970,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択" select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue: mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択" select-folder: "フォルダーを選択"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue: mobile/views/components/drive.file-detail.vue:
download: "ダウンロード" download: "ダウンロード"
rename: "名前を変更" rename: "名前を変更"
move: "移動" move: "移動"
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1040,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: "このユーザーは投稿していないようです。"
@ -1157,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: "フォロー"

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,6 +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: "CW"
contextmenu: contextmenu:
rename: "Renommer" rename: "Renommer"
mark-as-sensitive: "Marquer comme sensible" mark-as-sensitive: "Marquer comme sensible"
@ -511,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"
@ -628,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をタイムラインに表示する"
@ -637,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"
@ -698,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"
@ -753,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"
@ -790,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"
@ -810,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"
@ -837,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 !"
@ -954,12 +970,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "Choisissez un fichier" select-file: "Choisissez un fichier"
mobile/views/components/drive-folder-chooser.vue: mobile/views/components/drive-folder-chooser.vue:
select-folder: "Choisissez un dossier" select-folder: "Choisissez un dossier"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue: mobile/views/components/drive.file-detail.vue:
download: "Télécharger" download: "Télécharger"
rename: "Renommer" rename: "Renommer"
move: "Déplacer" move: "Déplacer"
hash: "Hash (md5)" hash: "Hash (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "Le contenu est NSFW" sensitive: "Le contenu est NSFW"
click-to-show: "Cliquer pour afficher" click-to-show: "Cliquer pour afficher"
@ -973,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"
@ -1040,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"
@ -1157,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"

View File

@ -5,24 +5,9 @@
const fs = require('fs'); const fs = require('fs');
const yaml = require('js-yaml'); const yaml = require('js-yaml');
const loadLang = lang => yaml.safeLoad( const langs = ['de-DE', 'en-US', 'fr-FR', 'ja-JP', 'ja-KS', 'pl-PL', 'es-ES'];
fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8'));
const native = loadLang('ja'); const loadLocale = lang => yaml.safeLoad(fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8'));
const locales = langs.map(lang => ({ [lang]: loadLocale(lang) }));
const langs = { module.exports = locales.reduce((a, b) => ({ ...a, ...b }));
'de': loadLang('de'),
'en': loadLang('en'),
'fr': loadLang('fr'),
'ja': native,
'ja-ks': loadLang('ja-ks'),
'pl': loadLang('pl'),
'es': loadLang('es')
};
Object.values(langs).forEach(locale => {
// Extend native language (Japanese)
locale = Object.assign({}, native, locale);
});
module.exports = langs;

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からドライブにファイルをアップロード"
@ -443,6 +463,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
nsfw: "閲覧注意"
contextmenu: contextmenu:
rename: "名前を変更" rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定" mark-as-sensitive: "閲覧注意に設定"
@ -629,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をタイムラインに表示する"
@ -753,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: "闇に飲まれる"
@ -798,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: "ユーザーの凍結"
@ -817,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: "メディアビュー"
@ -837,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: "わかった"
@ -954,12 +970,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択" select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue: mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択" select-folder: "フォルダーを選択"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue: mobile/views/components/drive.file-detail.vue:
download: "ダウンロード" download: "ダウンロード"
rename: "名前を変更" rename: "名前を変更"
move: "移動" move: "移動"
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1040,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: "このユーザーは投稿していないようです。"
@ -1157,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: "フォロー"

File diff suppressed because it is too large Load Diff

1237
locales/ja-KS.yml Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

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からドライブにファイルをアップロード"
@ -443,6 +463,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
nsfw: "閲覧注意"
contextmenu: contextmenu:
rename: "名前を変更" rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定" mark-as-sensitive: "閲覧注意に設定"
@ -629,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をタイムラインに表示する"
@ -753,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: "闇に飲まれる"
@ -798,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: "ユーザーの凍結"
@ -817,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: "メディアビュー"
@ -837,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: "わかった"
@ -954,12 +970,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択" select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue: mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択" select-folder: "フォルダーを選択"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue: mobile/views/components/drive.file-detail.vue:
download: "ダウンロード" download: "ダウンロード"
rename: "名前を変更" rename: "名前を変更"
move: "移動" move: "移動"
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1040,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: "このユーザーは投稿していないようです。"
@ -1157,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: "フォロー"

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"
@ -443,6 +463,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "Awatar" avatar: "Awatar"
banner: "Baner" banner: "Baner"
nsfw: "閲覧注意"
contextmenu: contextmenu:
rename: "Zmień nazwę" rename: "Zmień nazwę"
mark-as-sensitive: "Oznacz jako zawartość wrażliwą" mark-as-sensitive: "Oznacz jako zawartość wrażliwą"
@ -629,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をタイムラインに表示する"
@ -753,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ść"
@ -798,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: "ユーザーの凍結"
@ -817,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"
@ -837,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!"
@ -954,12 +970,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "Wybierz plik" select-file: "Wybierz plik"
mobile/views/components/drive-folder-chooser.vue: mobile/views/components/drive-folder-chooser.vue:
select-folder: "Wybierz katalog" select-folder: "Wybierz katalog"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue: mobile/views/components/drive.file-detail.vue:
download: "Pobierz" download: "Pobierz"
rename: "Zmień nazwę" rename: "Zmień nazwę"
move: "Przenieś" move: "Przenieś"
hash: "Hash (md5)" hash: "Hash (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "To jest zawartość NSFW" sensitive: "To jest zawartość NSFW"
click-to-show: "Naciśnij aby wyświetlić" click-to-show: "Naciśnij aby wyświetlić"
@ -1040,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"
@ -1157,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"

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からドライブにファイルをアップロード"
@ -443,6 +463,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
nsfw: "閲覧注意"
contextmenu: contextmenu:
rename: "名前を変更" rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定" mark-as-sensitive: "閲覧注意に設定"
@ -629,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をタイムラインに表示する"
@ -753,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: "闇に飲まれる"
@ -778,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: "知り合い"
@ -792,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: "ユーザーの凍結"
@ -817,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: "メディアビュー"
@ -837,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: "わかった"
@ -844,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: "{}で共有"
@ -954,12 +970,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択" select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue: mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択" select-folder: "フォルダーを選択"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue: mobile/views/components/drive.file-detail.vue:
download: "ダウンロード" download: "ダウンロード"
rename: "名前を変更" rename: "名前を変更"
move: "移動" move: "移動"
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1040,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: "このユーザーは投稿していないようです。"
@ -1157,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: "フォロー"
@ -1166,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で編集"
@ -1205,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"

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からドライブにファイルをアップロード"
@ -443,6 +463,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
nsfw: "閲覧注意"
contextmenu: contextmenu:
rename: "名前を変更" rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定" mark-as-sensitive: "閲覧注意に設定"
@ -629,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をタイムラインに表示する"
@ -753,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: "闇に飲まれる"
@ -798,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: "ユーザーの凍結"
@ -817,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: "メディアビュー"
@ -837,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: "わかった"
@ -954,12 +970,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択" select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue: mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択" select-folder: "フォルダーを選択"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue: mobile/views/components/drive.file-detail.vue:
download: "ダウンロード" download: "ダウンロード"
rename: "名前を変更" rename: "名前を変更"
move: "移動" move: "移動"
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1040,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: "このユーザーは投稿していないようです。"
@ -1157,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: "フォロー"

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からドライブにファイルをアップロード"
@ -443,6 +463,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
nsfw: "閲覧注意"
contextmenu: contextmenu:
rename: "名前を変更" rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定" mark-as-sensitive: "閲覧注意に設定"
@ -629,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をタイムラインに表示する"
@ -753,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: "闇に飲まれる"
@ -798,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: "ユーザーの凍結"
@ -817,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: "メディアビュー"
@ -837,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: "わかった"
@ -954,12 +970,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択" select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue: mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択" select-folder: "フォルダーを選択"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue: mobile/views/components/drive.file-detail.vue:
download: "ダウンロード" download: "ダウンロード"
rename: "名前を変更" rename: "名前を変更"
move: "移動" move: "移動"
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1040,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: "このユーザーは投稿していないようです。"
@ -1157,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: "フォロー"

View File

@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "7.0.2", "version": "8.20.0",
"clientVersion": "1.0.8654", "clientVersion": "1.0.9240",
"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.4",
"@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",
@ -126,7 +127,7 @@
"gulp-util": "3.0.8", "gulp-util": "3.0.8",
"hard-source-webpack-plugin": "0.12.0", "hard-source-webpack-plugin": "0.12.0",
"highlight.js": "9.12.0", "highlight.js": "9.12.0",
"html-minifier": "3.5.19", "html-minifier": "3.5.20",
"http-signature": "1.2.0", "http-signature": "1.2.0",
"insert-text-at-cursor": "0.1.1", "insert-text-at-cursor": "0.1.1",
"is-root": "2.0.0", "is-root": "2.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",
@ -181,17 +184,17 @@
"s-age": "1.1.2", "s-age": "1.1.2",
"sass-loader": "7.1.0", "sass-loader": "7.1.0",
"seedrandom": "2.4.4", "seedrandom": "2.4.4",
"sharp": "0.20.5", "sharp": "0.20.7",
"showdown": "1.8.6", "showdown": "1.8.6",
"showdown-highlightjs-extension": "0.1.2", "showdown-highlightjs-extension": "0.1.2",
"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.25",
"vue-json-tree-view": "2.1.4", "vue-json-tree-view": "2.1.4",
"vue-loader": "15.3.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.16.5", "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",

View File

@ -6,6 +6,10 @@ html
&, * &, *
cursor progress !important cursor progress !important
html
// iOS
overflow auto
body body
overflow-wrap break-word overflow-wrap break-word

View File

@ -7,7 +7,7 @@
<div class="app"> <div class="app">
<section> <section>
<h2>{{ app.name }}</h2> <h2>{{ app.name }}</h2>
<p class="nid">{{ app.nameId }}</p> <p class="id">{{ app.id }}</p>
<p class="description">{{ app.description }}</p> <p class="description">{{ app.description }}</p>
</section> </section>
<section> <section>

View File

@ -32,19 +32,28 @@
//#region Detect app name //#region Detect app name
let app = null; let app = null;
if (url.pathname == '/docs' || url.pathname.startsWith('/docs/')) app = 'docs'; if (`${url.pathname}/`.startsWith('/docs/')) app = 'docs';
if (url.pathname == '/dev' || url.pathname.startsWith('/dev/')) app = 'dev'; if (`${url.pathname}/`.startsWith('/dev/')) app = 'dev';
if (url.pathname == '/auth' || url.pathname.startsWith('/auth/')) app = 'auth'; if (`${url.pathname}/`.startsWith('/auth/')) app = 'auth';
//#endregion //#endregion
//#region Detect the user language //#region Detect the user language
let lang = navigator.language.split('-')[0]; let lang = null;
// The default language is English if (LANGS.includes(navigator.language)) {
if (!LANGS.includes(lang)) lang = 'en'; lang = navigator.language;
} else {
lang = LANGS.find(x => x.split('-')[0] == navigator.language);
if (settings) { if (lang == null) {
if (settings.device.lang) lang = settings.device.lang; // Fallback
lang = 'en-US';
}
}
if (settings && settings.device.lang &&
LANGS.includes(settings.device.lang)) {
lang = settings.device.lang;
} }
//#endregion //#endregion
@ -104,7 +113,7 @@
// グローバルにタイマーIDを代入しておく // グローバルにタイマーIDを代入しておく
window.mkBootTimer = window.setTimeout(async () => { window.mkBootTimer = window.setTimeout(async () => {
// Fetch meta // Fetch meta
const res = await fetch(API + '/meta', { const res = await fetch('/api/meta', {
method: 'POST', method: 'POST',
cache: 'no-cache' cache: 'no-cache'
}); });

View File

@ -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)

View File

@ -3,7 +3,7 @@
@dragover.prevent.stop="onDragover" @dragover.prevent.stop="onDragover"
@drop.prevent.stop="onDrop" @drop.prevent.stop="onDrop"
> >
<div class="stream"> <div class="body">
<p class="init" v-if="init">%fa:spinner .spin%%i18n:common.loading%</p> <p class="init" v-if="init">%fa:spinner .spin%%i18n:common.loading%</p>
<p class="empty" v-if="!init && messages.length == 0">%fa:info-circle%%i18n:@empty%</p> <p class="empty" v-if="!init && messages.length == 0">%fa:info-circle%%i18n:@empty%</p>
<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages">%fa:flag%%i18n:@no-history%</p> <p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages">%fa:flag%%i18n:@no-history%</p>
@ -77,6 +77,12 @@ export default Vue.extend({
this.connection.on('message', this.onMessage); this.connection.on('message', this.onMessage);
this.connection.on('read', this.onRead); this.connection.on('read', this.onRead);
if (this.isNaked) {
window.addEventListener('scroll', this.onScroll, { passive: true });
} else {
this.$el.addEventListener('scroll', this.onScroll, { passive: true });
}
document.addEventListener('visibilitychange', this.onVisibilitychange); document.addEventListener('visibilitychange', this.onVisibilitychange);
this.fetchMessages().then(() => { this.fetchMessages().then(() => {
@ -90,6 +96,12 @@ export default Vue.extend({
this.connection.off('read', this.onRead); this.connection.off('read', this.onRead);
this.connection.close(); this.connection.close();
if (this.isNaked) {
window.removeEventListener('scroll', this.onScroll);
} else {
this.$el.removeEventListener('scroll', this.onScroll);
}
document.removeEventListener('visibilitychange', this.onVisibilitychange); document.removeEventListener('visibilitychange', this.onVisibilitychange);
}, },
@ -226,6 +238,14 @@ export default Vue.extend({
}, 4000); }, 4000);
}, },
onScroll() {
const el = this.isNaked ? window.document.documentElement : this.$el;
const current = el.scrollTop + el.clientHeight;
if (current > el.scrollHeight - 1) {
this.showIndicator = false;
}
},
onVisibilitychange() { onVisibilitychange() {
if (document.hidden) return; if (document.hidden) return;
this.messages.forEach(message => { this.messages.forEach(message => {
@ -251,7 +271,7 @@ root(isDark)
height 100% height 100%
background isDark ? #191b22 : #fff background isDark ? #191b22 : #fff
> .stream > .body
width 100% width 100%
max-width 600px max-width 600px
margin 0 auto margin 0 auto

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>

View File

@ -6,17 +6,27 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { url } from '../../../config';
import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
export default Vue.extend({ export default Vue.extend({
props: ['note', 'source', 'compact'], props: ['note', 'source', 'compact'],
computed: { computed: {
items() { items() {
const items = []; const items = [{
items.push({ icon: '%fa:info-circle%',
text: '%i18n:@detail%',
action: this.detail
}, {
icon: '%fa:link%',
text: '%i18n:@copy-link%',
action: this.copyLink
}, null, {
icon: '%fa:star%', icon: '%fa:star%',
text: '%i18n:@favorite%', text: '%i18n:@favorite%',
action: this.favorite action: this.favorite
}); }];
if (this.note.userId == this.$store.state.i.id) { if (this.note.userId == this.$store.state.i.id) {
items.push({ items.push({
icon: '%fa:thumbtack%', icon: '%fa:thumbtack%',
@ -42,6 +52,14 @@ export default Vue.extend({
} }
}, },
methods: { methods: {
detail() {
this.$router.push(`/notes/${ this.note.id }`);
},
copyLink() {
copyToClipboard(`${url}/notes/${ this.note.id }`);
},
pin() { pin() {
(this as any).api('i/pin', { (this as any).api('i/pin', {
noteId: this.note.id noteId: this.note.id

View File

@ -12,13 +12,13 @@
</ui-input> </ui-input>
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/> <ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/>
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button> <ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
<p style="margin: 8px 0;" v-if="twitterIntegration">%i18n:@or% <a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p> <p style="margin: 8px 0;">%i18n:@or% <a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
</form> </form>
</template> </template>
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { apiUrl, host, twitterIntegration } from '../../../config'; import { apiUrl, host } from '../../../config';
export default Vue.extend({ export default Vue.extend({
props: { props: {
@ -36,8 +36,7 @@ export default Vue.extend({
password: '', password: '',
token: '', token: '',
apiUrl, apiUrl,
host, host
twitterIntegration
}; };
}, },
methods: { methods: {

View File

@ -1,48 +1,50 @@
<template> <template>
<form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()"> <form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()">
<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required> <template v-if="meta">
<span>%i18n:@invitation-code%</span> <ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required>
<span slot="prefix">%fa:id-card-alt%</span> <span>%i18n:@invitation-code%</span>
<p slot="text" v-html="'%i18n:@invitation-info%'.replace('{}', meta.maintainer.url)"></p> <span slot="prefix">%fa:id-card-alt%</span>
</ui-input> <p slot="text" v-html="'%i18n:@invitation-info%'.replace('{}', meta.maintainer.url)"></p>
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername"> </ui-input>
<span>%i18n:@username%</span> <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername">
<span slot="prefix">@</span> <span>%i18n:@username%</span>
<span slot="suffix">@{{ host }}</span> <span slot="prefix">@</span>
<p slot="text" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw% %i18n:@checking%</p> <span slot="suffix">@{{ host }}</span>
<p slot="text" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw% %i18n:@available%</p> <p slot="text" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw% %i18n:@checking%</p>
<p slot="text" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@unavailable%</p> <p slot="text" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw% %i18n:@available%</p>
<p slot="text" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@error%</p> <p slot="text" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@unavailable%</p>
<p slot="text" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@invalid-format%</p> <p slot="text" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@error%</p>
<p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-short%</p> <p slot="text" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@invalid-format%</p>
<p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-long%</p> <p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-short%</p>
</ui-input> <p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-long%</p>
<ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true"> </ui-input>
<span>%i18n:@password%</span> <ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true">
<span slot="prefix">%fa:lock%</span> <span>%i18n:@password%</span>
<div slot="text"> <span slot="prefix">%fa:lock%</span>
<p slot="text" v-if="passwordStrength == 'low'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@weak-password%</p> <div slot="text">
<p slot="text" v-if="passwordStrength == 'medium'" style="color:#3CB7B5">%fa:check .fw% %i18n:@normal-password%</p> <p slot="text" v-if="passwordStrength == 'low'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@weak-password%</p>
<p slot="text" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw% %i18n:@strong-password%</p> <p slot="text" v-if="passwordStrength == 'medium'" style="color:#3CB7B5">%fa:check .fw% %i18n:@normal-password%</p>
</div> <p slot="text" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw% %i18n:@strong-password%</p>
</ui-input> </div>
<ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype"> </ui-input>
<span>%i18n:@password% (%i18n:@retype%)</span> <ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype">
<span slot="prefix">%fa:lock%</span> <span>%i18n:@password% (%i18n:@retype%)</span>
<div slot="text"> <span slot="prefix">%fa:lock%</span>
<p slot="text" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5">%fa:check .fw% %i18n:@password-matched%</p> <div slot="text">
<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p> <p slot="text" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5">%fa:check .fw% %i18n:@password-matched%</p>
</div> <p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p>
</ui-input> </div>
<div v-if="recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="recaptchaSitekey" style="margin: 16px 0;"></div> </ui-input>
<ui-button type="submit">%i18n:@create%</ui-button> <div v-if="meta.recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="meta.recaptchaSitekey" style="margin: 16px 0;"></div>
<ui-button type="submit">%i18n:@create%</ui-button>
</template>
</form> </form>
</template> </template>
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
const getPasswordStrength = require('syuilo-password-strength'); const getPasswordStrength = require('syuilo-password-strength');
import { host, url, recaptchaSitekey } from '../../../config'; import { host, url } from '../../../config';
export default Vue.extend({ export default Vue.extend({
data() { data() {
@ -53,7 +55,6 @@ export default Vue.extend({
retypedPassword: '', retypedPassword: '',
invitationCode: '', invitationCode: '',
url, url,
recaptchaSitekey,
usernameState: null, usernameState: null,
passwordStrength: '', passwordStrength: '',
passwordRetypeState: null, passwordRetypeState: null,
@ -73,6 +74,12 @@ export default Vue.extend({
this.meta = meta; this.meta = meta;
}); });
}, },
mounted() {
const head = document.getElementsByTagName('head')[0];
const script = document.createElement('script');
script.setAttribute('src', 'https://www.google.com/recaptcha/api.js');
head.appendChild(script);
},
methods: { methods: {
onChangeUsername() { onChangeUsername() {
if (this.username == '') { if (this.username == '') {
@ -123,7 +130,7 @@ export default Vue.extend({
username: this.username, username: this.username,
password: this.password, password: this.password,
invitationCode: this.invitationCode, invitationCode: this.invitationCode,
'g-recaptcha-response': recaptchaSitekey != null ? (window as any).grecaptcha.getResponse() : null 'g-recaptcha-response': this.meta.recaptchaSitekey != null ? (window as any).grecaptcha.getResponse() : null
}).then(() => { }).then(() => {
(this as any).api('signin', { (this as any).api('signin', {
username: this.username, username: this.username,
@ -134,19 +141,11 @@ export default Vue.extend({
}).catch(() => { }).catch(() => {
alert('%i18n:@some-error%'); alert('%i18n:@some-error%');
if (recaptchaSitekey != null) { if (this.meta.recaptchaSitekey != null) {
(window as any).grecaptcha.reset(); (window as any).grecaptcha.reset();
} }
}); });
} }
},
mounted() {
if (recaptchaSitekey != null) {
const head = document.getElementsByTagName('head')[0];
const script = document.createElement('script');
script.setAttribute('src', 'https://www.google.com/recaptcha/api.js');
head.appendChild(script);
}
} }
}); });
</script> </script>

View File

@ -1,12 +1,14 @@
<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>
</blockquote> </blockquote>
</div> </div>
<div v-else class="mk-url-preview"> <div v-else class="mk-url-preview">
<a :href="url" target="_blank" :title="url" v-if="!fetching"> <a :class="{ mini }" :href="url" target="_blank" :title="url" v-if="!fetching">
<div class="thumbnail" v-if="thumbnail" :style="`background-image: url(${thumbnail})`"></div> <div class="thumbnail" v-if="thumbnail" :style="`background-image: url(${thumbnail})`"></div>
<article> <article>
<header> <header>
@ -26,18 +28,105 @@
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
},
mini: {
type: Boolean,
required: false,
default: false
} }
}, },
data() { data() {
return { return {
fetching: true, fetching: true,
@ -46,11 +135,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 +169,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
@ -272,6 +299,29 @@ root(isDark)
width 12px width 12px
height 12px height 12px
&.mini
font-size 10px
> .thumbnail
position relative
width 100%
height 60px
> article
left 0
width 100%
padding 8px
> header
margin-bottom 4px
> footer
margin-top 4px
> img
width 12px
height 12px
.mk-url-preview[data-darkmode] .mk-url-preview[data-darkmode]
root(true) root(true)

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];
}); });

View File

@ -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>

View File

@ -1,51 +1,22 @@
declare const _HOST_: string;
declare const _HOSTNAME_: string;
declare const _URL_: string;
declare const _NAME_: string;
declare const _DESCRIPTION_: string;
declare const _API_URL_: string;
declare const _WS_URL_: string;
declare const _DOCS_URL_: string;
declare const _STATS_URL_: string;
declare const _STATUS_URL_: string;
declare const _DEV_URL_: string;
declare const _REPOSITORY_URL_: string;
declare const _FEEDBACK_URL_: string;
declare const _LANG_: string; declare const _LANG_: string;
declare const _LANGS_: string; declare const _LANGS_: string;
declare const _RECAPTCHA_SITEKEY_: string;
declare const _SW_PUBLICKEY_: string;
declare const _THEME_COLOR_: string; 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 _LICENSE_: string; declare const _ENV_: string;
declare const _GOOGLE_MAPS_API_KEY_: string;
declare const _WELCOME_BG_URL_: string;
declare const _TWITTER_INTEGRATION_: boolean;
export const host = _HOST_; const address = new URL(location.href);
export const hostname = _HOSTNAME_;
export const url = _URL_; export const host = address.host;
export const name = _NAME_; export const hostname = address.hostname;
export const description = _DESCRIPTION_; export const url = address.origin;
export const apiUrl = _API_URL_; export const apiUrl = url + '/api';
export const wsUrl = _WS_URL_; export const wsUrl = url.replace('http://', 'ws://').replace('https://', 'wss://');
export const docsUrl = _DOCS_URL_;
export const statsUrl = _STATS_URL_;
export const statusUrl = _STATUS_URL_;
export const devUrl = _DEV_URL_;
export const repositoryUrl = _REPOSITORY_URL_;
export const feedbackUrl = _FEEDBACK_URL_;
export const lang = _LANG_; export const lang = _LANG_;
export const langs = _LANGS_; export const langs = _LANGS_;
export const recaptchaSitekey = _RECAPTCHA_SITEKEY_;
export const swPublickey = _SW_PUBLICKEY_;
export const themeColor = _THEME_COLOR_; 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 license = _LICENSE_; export const env = _ENV_;
export const googleMapsApiKey = _GOOGLE_MAPS_API_KEY_;
export const welcomeBgUrl = _WELCOME_BG_URL_;
export const twitterIntegration = _TWITTER_INTEGRATION_;

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%'
}]
});
return reject('invalid-filetype');
}
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));
};
}; };

View File

@ -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%'
}]
});
return reject('invalid-filetype');
}
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%',

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();

View File

@ -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 || {}));
}
}
});

View File

@ -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>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -193,7 +193,7 @@ export default Vue.extend({
clearNotification() { clearNotification() {
this.unreadCount = 0; this.unreadCount = 0;
document.title = config.name; document.title = (this as any).os.instanceName;
}, },
onVisibilitychange() { onVisibilitychange() {

View File

@ -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'">
@ -191,12 +193,6 @@
<button class="ui button block" @click="taskmngr">%i18n:@task-manager%</button> <button class="ui button block" @click="taskmngr">%i18n:@task-manager%</button>
</details> </details>
</section> </section>
<section class="other" v-show="page == 'other'">
<h1>%i18n:@license%</h1>
<div v-html="license"></div>
<a :href="licenseUrl" target="_blank">%i18n:@third-parties%</a>
</section>
</div> </div>
</div> </div>
</template> </template>
@ -211,7 +207,7 @@ import XApi from './settings.api.vue';
import XApps from './settings.apps.vue'; import XApps from './settings.apps.vue';
import XSignins from './settings.signins.vue'; import XSignins from './settings.signins.vue';
import XDrive from './settings.drive.vue'; import XDrive from './settings.drive.vue';
import { url, docsUrl, license, lang, langs, version } from '../../../config'; import { url, langs, version } from '../../../config';
import checkForUpdate from '../../../common/scripts/check-for-update'; import checkForUpdate from '../../../common/scripts/check-for-update';
import MkTaskManager from './taskmanager.vue'; import MkTaskManager from './taskmanager.vue';
@ -230,7 +226,6 @@ export default Vue.extend({
return { return {
page: 'profile', page: 'profile',
meta: null, meta: null,
license,
version, version,
langs, langs,
latestVersion: undefined, latestVersion: undefined,
@ -238,10 +233,6 @@ export default Vue.extend({
}; };
}, },
computed: { computed: {
licenseUrl(): string {
return `${docsUrl}/${lang}/license`;
},
apiViaStream: { apiViaStream: {
get() { return this.$store.state.device.apiViaStream; }, get() { return this.$store.state.device.apiViaStream; },
set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); } set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); }
@ -343,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',
@ -387,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
}); });
}, },

View File

@ -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>

View File

@ -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">

View File

@ -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

View File

@ -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 };

View File

@ -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
});
} }
} }
}); });

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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)

View File

@ -3,18 +3,20 @@
@dragover.prevent.stop="onDragover" @dragover.prevent.stop="onDragover"
@dragenter.prevent="onDragenter" @dragenter.prevent="onDragenter"
@dragleave="onDragleave" @dragleave="onDragleave"
@drop.prevent.stop="onDrop" @drop.prevent.stop="onDrop">
>
<header :class="{ indicate: count > 0 }" <header :class="{ indicate: count > 0 }"
draggable="true" draggable="true"
@click="toggleActive" @click="goTop"
@dragstart="onDragstart" @dragstart="onDragstart"
@dragend="onDragend" @dragend="onDragend"
@contextmenu.prevent.stop="onContextmenu" @contextmenu.prevent.stop="onContextmenu">
> <button class="toggleActive" @click="toggleActive" v-if="isStacked">
<template v-if="active">%fa:angle-up%</template>
<template v-else>%fa:angle-down%</template>
</button>
<slot name="header"></slot> <slot name="header"></slot>
<span class="count" v-if="count > 0">({{ count }})</span> <span class="count" v-if="count > 0">({{ count }})</span>
<button ref="menu" @click.stop="showMenu">%fa:caret-down%</button> <button class="menu" ref="menu" @click.stop="showMenu">%fa:caret-down%</button>
</header> </header>
<div ref="body" v-show="active"> <div ref="body" v-show="active">
<slot></slot> <slot></slot>
@ -211,6 +213,13 @@ export default Vue.extend({
}); });
}, },
goTop() {
this.$refs.body.scrollTo({
top: 0,
behavior: 'smooth'
});
},
onDragstart(e) { onDragstart(e) {
e.dataTransfer.effectAllowed = 'move'; e.dataTransfer.effectAllowed = 'move';
e.dataTransfer.setData('mk-deck-column', this.column.id); e.dataTransfer.setData('mk-deck-column', this.column.id);
@ -302,6 +311,7 @@ root(isDark)
color #bbb color #bbb
> header > header
display flex
z-index 1 z-index 1
line-height $header-height line-height $header-height
padding 0 16px padding 0 16px
@ -328,10 +338,8 @@ root(isDark)
margin-left 4px margin-left 4px
opacity 0.5 opacity 0.5
> button > .toggleActive
position absolute > .menu
top 0
right 0
width $header-height width $header-height
line-height $header-height line-height $header-height
font-size 16px font-size 16px
@ -343,6 +351,13 @@ root(isDark)
&:active &:active
color isDark ? #b2c1d5 : #999 color isDark ? #b2c1d5 : #999
> .toggleActive
margin-left -16px
> .menu
margin-left auto
margin-right -16px
> div > div
height "calc(100% - %s)" % $header-height height "calc(100% - %s)" % $header-height
overflow auto overflow auto

View File

@ -32,10 +32,11 @@
<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>
<mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="false" :mini="true"/>
</div> </div>
<span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span> <span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span>
</div> </div>

View File

@ -4,11 +4,10 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
mounted() { mounted() {
document.title = `${config.name} - %i18n:@title%`; document.title = `${(this as any).os.instanceName} - %i18n:@title%`;
} }
}); });
</script> </script>

View File

@ -7,7 +7,6 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import Progress from '../../../common/scripts/loading'; import Progress from '../../../common/scripts/loading';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
props: { props: {
@ -17,7 +16,7 @@ export default Vue.extend({
} }
}, },
mounted() { mounted() {
document.title = config.name; document.title = (this as any).os.instanceName;
Progress.start(); Progress.start();
}, },

View File

@ -12,12 +12,11 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
data() { data() {
return { return {
name: config.name, name: null,
posted: false, posted: false,
text: new URLSearchParams(location.search).get('text') text: new URLSearchParams(location.search).get('text')
}; };
@ -26,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>

View File

@ -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>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="followers-you-know"> <div class="vahgrswmbzfdlmomxnqftuueyvwaafth">
<p class="title">%fa:users%%i18n:@title%</p> <p class="title">%fa:users%%i18n:@title%</p>
<p class="initializing" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@loading%<mk-ellipsis/></p> <p class="initializing" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@loading%<mk-ellipsis/></p>
<div v-if="!fetching && users.length > 0"> <div v-if="!fetching && users.length > 0">
@ -36,8 +36,8 @@ export default Vue.extend({
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
.followers-you-know root(isDark)
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
@ -48,7 +48,7 @@ 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 color isDark ? #e3e5e8 : #888
box-shadow 0 1px rgba(#000, 0.07) box-shadow 0 1px rgba(#000, 0.07)
> i > i
@ -77,4 +77,10 @@ export default Vue.extend({
> i > i
margin-right 4px margin-right 4px
.vahgrswmbzfdlmomxnqftuueyvwaafth[data-darkmode]
root(true)
.vahgrswmbzfdlmomxnqftuueyvwaafth:not([data-darkmode])
root(false)
</style> </style>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="friends"> <div class="hozptpaliadatkehcmcayizwzwwctpbc">
<p class="title">%fa:users%%i18n:@title%</p> <p class="title">%fa:users%%i18n:@title%</p>
<p class="initializing" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@loading%<mk-ellipsis/></p> <p class="initializing" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@loading%<mk-ellipsis/></p>
<template v-if="!fetching && users.length != 0"> <template v-if="!fetching && users.length != 0">
@ -40,10 +40,11 @@ export default Vue.extend({
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
.friends root(isDark)
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 +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
@ -70,7 +72,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 +98,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
.hozptpaliadatkehcmcayizwzwwctpbc[data-darkmode]
root(true)
.hozptpaliadatkehcmcayizwzwwctpbc:not([data-darkmode])
root(false)
</style> </style>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="photos"> <div class="dzsuvbsrrrwobdxifudxuefculdfiaxd">
<p class="title">%fa:camera%%i18n:@title%</p> <p class="title">%fa:camera%%i18n:@title%</p>
<p class="initializing" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@loading%<mk-ellipsis/></p> <p class="initializing" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@loading%<mk-ellipsis/></p>
<div class="stream" v-if="!fetching && images.length > 0"> <div class="stream" v-if="!fetching && images.length > 0">
@ -39,10 +39,11 @@ export default Vue.extend({
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
.photos root(isDark)
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 +52,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 +87,10 @@ export default Vue.extend({
> i > i
margin-right 4px margin-right 4px
.dzsuvbsrrrwobdxifudxuefculdfiaxd[data-darkmode]
root(true)
.dzsuvbsrrrwobdxifudxuefculdfiaxd:not([data-darkmode])
root(false)
</style> </style>

View File

@ -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

View File

@ -5,7 +5,7 @@
<template v-if="$store.state.device.darkmode">%fa:moon%</template> <template v-if="$store.state.device.darkmode">%fa:moon%</template>
<template v-else>%fa:R moon%</template> <template v-else>%fa:R moon%</template>
</button> </button>
<div class="body" :style="{ backgroundImage: `url('${ welcomeBgUrl }')` }"> <div class="body">
<div class="container"> <div class="container">
<div class="info"> <div class="info">
<span><b>{{ host }}</b></span> <span><b>{{ host }}</b></span>
@ -37,6 +37,7 @@
<div class="tl"> <div class="tl">
<mk-welcome-timeline :max="20"/> <mk-welcome-timeline :max="20"/>
</div> </div>
<modal name="signup" width="500px" height="auto" scrollable> <modal name="signup" width="500px" height="auto" scrollable>
<header :class="$style.signupFormHeader">%i18n:@signup%</header> <header :class="$style.signupFormHeader">%i18n:@signup%</header>
<mk-signup :class="$style.signupForm"/> <mk-signup :class="$style.signupForm"/>
@ -46,22 +47,26 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { host, name, description, copyright, welcomeBgUrl } from '../../../config'; import { host, copyright } from '../../../config';
export default Vue.extend({ export default Vue.extend({
data() { data() {
return { return {
stats: null, stats: null,
copyright, copyright,
welcomeBgUrl,
host, host,
name, name: 'Misskey',
description, description: '',
pointerInterval: null, pointerInterval: null,
tags: [] tags: []
}; };
}, },
created() { created() {
(this as any).os.getMeta().then(meta => {
this.name = meta.name;
this.description = meta.description;
});
(this as any).api('stats').then(stats => { (this as any).api('stats').then(stats => {
this.stats = stats; this.stats = stats;
}); });

View File

@ -5,16 +5,6 @@
<b-form-group label="アプリケーション名" description="あなたのアプリの名称。"> <b-form-group label="アプリケーション名" description="あなたのアプリの名称。">
<b-form-input v-model="name" type="text" placeholder="ex) Misskey for iOS" autocomplete="off" required/> <b-form-input v-model="name" type="text" placeholder="ex) Misskey for iOS" autocomplete="off" required/>
</b-form-group> </b-form-group>
<b-form-group label="ID" description="あなたのアプリのID。">
<b-input v-model="nid" type="text" pattern="^[a-zA-Z0-9_]{1,30}$" placeholder="ex) misskey-for-ios" autocomplete="off" required/>
<p class="info" v-if="nidState == 'wait'" style="color:#999">%fa:spinner .pulse .fw%確認しています...</p>
<p class="info" v-if="nidState == 'ok'" style="color:#3CB7B5">%fa:fw check%利用できます</p>
<p class="info" v-if="nidState == 'unavailable'" style="color:#FF1161">%fa:fw exclamation-triangle%既に利用されています</p>
<p class="info" v-if="nidState == 'error'" style="color:#FF1161">%fa:fw exclamation-triangle%通信エラー</p>
<p class="info" v-if="nidState == 'invalid-format'" style="color:#FF1161">%fa:fw exclamation-triangle%a~zA~Z0~9_が使えます</p>
<p class="info" v-if="nidState == 'min-range'" style="color:#FF1161">%fa:fw exclamation-triangle%1文字以上でお願いします</p>
<p class="info" v-if="nidState == 'max-range'" style="color:#FF1161">%fa:fw exclamation-triangle%30文字以内でお願いします</p>
</b-form-group>
<b-form-group label="アプリの概要" description="あなたのアプリの簡単な説明や紹介。"> <b-form-group label="アプリの概要" description="あなたのアプリの簡単な説明や紹介。">
<b-textarea v-model="description" placeholder="ex) Misskey iOSクライアント。" autocomplete="off" required></b-textarea> <b-textarea v-model="description" placeholder="ex) Misskey iOSクライアント。" autocomplete="off" required></b-textarea>
</b-form-group> </b-form-group>
@ -50,47 +40,16 @@ export default Vue.extend({
data() { data() {
return { return {
name: '', name: '',
nid: '',
description: '', description: '',
cb: '', cb: '',
nidState: null, nidState: null,
permission: [] permission: []
}; };
}, },
watch: {
nid() {
if (this.nid == null || this.nid == '') {
this.nidState = null;
return;
}
const err =
!this.nid.match(/^[a-zA-Z0-9_]+$/) ? 'invalid-format' :
this.nid.length < 1 ? 'min-range' :
this.nid.length > 30 ? 'max-range' :
null;
if (err) {
this.nidState = err;
return;
}
this.nidState = 'wait';
(this as any).api('app/name_id/available', {
nameId: this.nid
}).then(result => {
this.nidState = result.available ? 'ok' : 'unavailable';
}).catch(err => {
this.nidState = 'error';
});
}
},
methods: { methods: {
onSubmit() { onSubmit() {
(this as any).api('app/create', { (this as any).api('app/create', {
name: this.name, name: this.name,
nameId: this.nid,
description: this.description, description: this.description,
callbackUrl: this.cb, callbackUrl: this.cb,
permission: this.permission permission: this.permission

View File

@ -5,12 +5,12 @@
import Vue from 'vue'; import Vue from 'vue';
import Vuex from 'vuex'; import Vuex from 'vuex';
import VueRouter from 'vue-router'; import VueRouter from 'vue-router';
import VModal from 'vue-js-modal';
import * as TreeView from 'vue-json-tree-view'; import * as TreeView from 'vue-json-tree-view';
import VAnimateCss from 'v-animate-css'; import VAnimateCss from 'v-animate-css';
import Element from 'element-ui'; import Element from 'element-ui';
import ElementLocaleEn from 'element-ui/lib/locale/lang/en'; import ElementLocaleEn from 'element-ui/lib/locale/lang/en';
import ElementLocaleJa from 'element-ui/lib/locale/lang/ja'; import ElementLocaleJa from 'element-ui/lib/locale/lang/ja';
import VModal from 'vue-js-modal';
import App from './app.vue'; import App from './app.vue';
import checkForUpdate from './common/scripts/check-for-update'; import checkForUpdate from './common/scripts/check-for-update';
@ -19,17 +19,17 @@ 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;
} }
Vue.use(Vuex); Vue.use(Vuex);
Vue.use(VueRouter); Vue.use(VueRouter);
Vue.use(VModal);
Vue.use(TreeView); Vue.use(TreeView);
Vue.use(VAnimateCss); Vue.use(VAnimateCss);
Vue.use(Element, { locale: elementLocale }); Vue.use(Element, { locale: elementLocale });
Vue.use(VModal);
// Register global directives // Register global directives
require('./common/views/directives'); require('./common/views/directives');

View File

@ -70,6 +70,10 @@ export default class MiOS extends EventEmitter {
chachedAt: Date; chachedAt: Date;
}; };
public get instanceName() {
return this.meta ? this.meta.data.name : 'Misskey';
}
private isMetaFetching = false; private isMetaFetching = false;
public app: Vue; public app: Vue;

View File

@ -1,13 +1,12 @@
import PostForm from '../views/components/post-form.vue'; import PostForm from '../views/components/post-form-dialog.vue';
export default (os) => (opts) => { export default (os) => (opts) => {
const o = opts || {}; const o = opts || {};
const app = document.getElementById('app'); document.documentElement.style.overflow = 'hidden';
app.style.display = 'none';
function recover() { function recover() {
app.style.display = 'block'; document.documentElement.style.overflow = 'auto';
} }
const vm = new PostForm({ const vm = new PostForm({

View File

@ -48,7 +48,7 @@ export default Vue.extend({
<style lang="stylus" scoped> <style lang="stylus" scoped>
.mk-drive-file-chooser .mk-drive-file-chooser
position fixed position fixed
z-index 2048 z-index 20000
top 0 top 0
left 0 left 0
width 100% width 100%

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="file-detail"> <div class="pyvicwrksnfyhpfgkjwqknuururpaztw">
<div class="preview"> <div class="preview">
<img v-if="kind == 'image'" ref="img" <img v-if="kind == 'image'" ref="img"
:src="file.url" :src="file.url"
@ -25,7 +25,7 @@
</div> </div>
<div class="info"> <div class="info">
<div> <div>
<span class="type"><mk-file-type-icon :type="file.type"/>{{ file.type }}</span> <span class="type"><mk-file-type-icon :type="file.type"/> {{ file.type }}</span>
<span class="separator"></span> <span class="separator"></span>
<span class="data-size">{{ file.datasize | bytes }}</span> <span class="data-size">{{ file.datasize | bytes }}</span>
<span class="separator"></span> <span class="separator"></span>
@ -134,11 +134,10 @@ export default Vue.extend({
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
.file-detail root(isDark)
> .preview > .preview
padding 8px padding 8px
background #f0f0f0 background isDark ? #191b22 : #f0f0f0
> img > img
display block display block
@ -150,7 +149,7 @@ export default Vue.extend({
> footer > footer
padding 8px 8px 0 8px padding 8px 8px 0 8px
font-size 0.8em font-size 0.8em
color #888 color isDark ? #606984 : #888
text-align center text-align center
> .separator > .separator
@ -179,25 +178,17 @@ export default Vue.extend({
> .info > .info
padding 14px padding 14px
font-size 0.8em font-size 0.8em
border-top solid 1px #dfdfdf border-top solid 1px isDark ? #1c2023 : #dfdfdf
> div > div
max-width 500px max-width 500px
margin 0 auto margin 0 auto
color isDark ? #9397a2 : #9d9d9d
> .separator > .separator
padding 0 4px padding 0 4px
color #cdcdcd
> .type
> .data-size
color #9d9d9d
> mk-file-type-icon
margin-right 4px
> .created-at > .created-at
color #bdbdbd
> [data-fa] > [data-fa]
margin-right 2px margin-right 2px
@ -207,7 +198,7 @@ export default Vue.extend({
> .menu > .menu
padding 14px padding 14px
border-top solid 1px #dfdfdf border-top solid 1px isDark ? #1c2023 : #dfdfdf
> div > div
max-width 500px max-width 500px
@ -218,14 +209,14 @@ export default Vue.extend({
width 100% width 100%
padding 10px 16px padding 10px 16px
margin 0 0 12px 0 margin 0 0 12px 0
color #333 color isDark ? #dfe3e8 : #333
font-size 0.9em font-size 0.9em
text-align center text-align center
text-decoration none text-decoration none
text-shadow 0 1px 0 rgba(255, 255, 255, 0.9) text-shadow 0 1px 0 isDark ? rgba(0, 0, 0, 0.9) : rgba(255, 255, 255, 0.9)
background-image linear-gradient(#fafafa, #eaeaea) background-image isDark ? linear-gradient(#292f3c, #1b2025) : linear-gradient(#fafafa, #eaeaea)
border 1px solid #ddd border 1px solid isDark ? #121417 : #ddd
border-bottom-color #cecece border-bottom-color isDark ? #060606 : #cecece
border-radius 3px border-radius 3px
&:last-child &:last-child
@ -242,7 +233,7 @@ export default Vue.extend({
> .hash > .hash
padding 14px padding 14px
border-top solid 1px #dfdfdf border-top solid 1px isDark ? #1c2023 : #dfdfdf
> div > div
max-width 500px max-width 500px
@ -252,7 +243,7 @@ export default Vue.extend({
display block display block
margin 0 margin 0
padding 0 padding 0
color #555 color isDark ? #a8b7d0 : #555
font-size 0.9em font-size 0.9em
> [data-fa] > [data-fa]
@ -273,7 +264,7 @@ export default Vue.extend({
> .exif > .exif
padding 14px padding 14px
border-top solid 1px #dfdfdf border-top solid 1px isDark ? #1c2023 : #dfdfdf
> div > div
max-width 500px max-width 500px
@ -283,7 +274,7 @@ export default Vue.extend({
display block display block
margin 0 margin 0
padding 0 padding 0
color #555 color isDark ? #a8b7d0 : #555
font-size 0.9em font-size 0.9em
> [data-fa] > [data-fa]
@ -301,4 +292,10 @@ export default Vue.extend({
border-radius 2px border-radius 2px
background #f5f5f5 background #f5f5f5
.pyvicwrksnfyhpfgkjwqknuururpaztw[data-darkmode]
root(true)
.pyvicwrksnfyhpfgkjwqknuururpaztw:not([data-darkmode])
root(false)
</style> </style>

View File

@ -1,5 +1,5 @@
<template> <template>
<a class="file" @click.prevent="onClick" :href="`/i/drive/file/${ file.id }`" :data-is-selected="isSelected"> <a class="vupkuhvjnjyqaqhsiogfbywvjxynrgsm" @click.prevent="onClick" :href="`/i/drive/file/${ file.id }`" :data-is-selected="isSelected">
<div class="container"> <div class="container">
<div class="thumbnail" :style="thumbnail"></div> <div class="thumbnail" :style="thumbnail"></div>
<div class="body"> <div class="body">
@ -7,20 +7,12 @@
<span>{{ file.name.lastIndexOf('.') != -1 ? file.name.substr(0, file.name.lastIndexOf('.')) : file.name }}</span> <span>{{ file.name.lastIndexOf('.') != -1 ? file.name.substr(0, file.name.lastIndexOf('.')) : file.name }}</span>
<span class="ext" v-if="file.name.lastIndexOf('.') != -1">{{ file.name.substr(file.name.lastIndexOf('.')) }}</span> <span class="ext" v-if="file.name.lastIndexOf('.') != -1">{{ file.name.substr(file.name.lastIndexOf('.')) }}</span>
</p> </p>
<!--
if file.tags.length > 0
ul.tags
each tag in file.tags
li.tag(style={background: tag.color, color: contrast(tag.color)})= tag.name
-->
<footer> <footer>
<span class="type"><mk-file-type-icon :type="file.type"/>{{ file.type }}</span> <span class="type"><mk-file-type-icon :type="file.type"/>{{ file.type }}</span>
<span class="separator"></span> <span class="separator"></span>
<span class="data-size">{{ file.datasize | bytes }}</span> <span class="data-size">{{ file.datasize | bytes }}</span>
<span class="separator"></span> <span class="separator"></span>
<span class="created-at"> <span class="created-at">%fa:R clock%<mk-time :time="file.createdAt"/></span>
%fa:R clock%<mk-time :time="file.createdAt"/>
</span>
<template v-if="file.isSensitive"> <template v-if="file.isSensitive">
<span class="separator"></span> <span class="separator"></span>
<span class="nsfw">%fa:eye-slash% %i18n:@nsfw%</span> <span class="nsfw">%fa:eye-slash% %i18n:@nsfw%</span>
@ -73,7 +65,7 @@ export default Vue.extend({
<style lang="stylus" scoped> <style lang="stylus" scoped>
@import '~const.styl' @import '~const.styl'
.file root(isDark)
display block display block
text-decoration none !important text-decoration none !important
@ -111,7 +103,7 @@ export default Vue.extend({
padding 0 padding 0
font-size 0.9em font-size 0.9em
font-weight bold font-weight bold
color #555 color isDark ? #fff : #555
text-overflow ellipsis text-overflow ellipsis
overflow-wrap break-word overflow-wrap break-word
@ -138,7 +130,6 @@ export default Vue.extend({
> .separator > .separator
padding 0 4px padding 0 4px
color #CDCDCD
> .type > .type
color #9D9D9D color #9D9D9D
@ -164,4 +155,10 @@ export default Vue.extend({
&, * &, *
color #fff !important color #fff !important
.vupkuhvjnjyqaqhsiogfbywvjxynrgsm[data-darkmode]
root(true)
.vupkuhvjnjyqaqhsiogfbywvjxynrgsm:not([data-darkmode])
root(false)
</style> </style>

View File

@ -1,5 +1,5 @@
<template> <template>
<a class="root folder" @click.prevent="onClick" :href="`/i/drive/folder/${ folder.id }`"> <a class="jvwxssxsytqlqvrpiymarjlzlsxskqsr" @click.prevent="onClick" :href="`/i/drive/folder/${ folder.id }`">
<div class="container"> <div class="container">
<p class="name">%fa:folder%{{ folder.name }}</p>%fa:angle-right% <p class="name">%fa:folder%{{ folder.name }}</p>%fa:angle-right%
</div> </div>
@ -24,9 +24,9 @@ export default Vue.extend({
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
.root.folder root(isDark)
display block display block
color #777 color isDark ? #fff : #777
text-decoration none !important text-decoration none !important
* *
@ -55,4 +55,10 @@ export default Vue.extend({
> * > *
height 100% height 100%
.jvwxssxsytqlqvrpiymarjlzlsxskqsr[data-darkmode]
root(true)
.jvwxssxsytqlqvrpiymarjlzlsxskqsr:not([data-darkmode])
root(false)
</style> </style>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="mk-drive"> <div class="kmmwchoexgckptowjmjgfsygeltxfeqs">
<nav ref="nav"> <nav ref="nav">
<a @click.prevent="goRoot()" href="/i/drive">%fa:cloud%%i18n:@drive%</a> <a @click.prevent="goRoot()" href="/i/drive">%fa:cloud%%i18n:@drive%</a>
<template v-for="folder in hierarchyFolders"> <template v-for="folder in hierarchyFolders">
@ -26,11 +26,11 @@
</p> </p>
</div> </div>
<div class="folders" v-if="folders.length > 0"> <div class="folders" v-if="folders.length > 0">
<x-folder v-for="folder in folders" :key="folder.id" :folder="folder"/> <x-folder class="folder" v-for="folder in folders" :key="folder.id" :folder="folder"/>
<p v-if="moreFolders">%i18n:@load-more%</p> <p v-if="moreFolders">%i18n:@load-more%</p>
</div> </div>
<div class="files" v-if="files.length > 0"> <div class="files" v-if="files.length > 0">
<x-file v-for="file in files" :key="file.id" :file="file"/> <x-file class="file" v-for="file in files" :key="file.id" :file="file"/>
<button class="more" v-if="moreFiles" @click="fetchMoreFiles"> <button class="more" v-if="moreFiles" @click="fetchMoreFiles">
{{ fetchingMoreFiles ? '%i18n:common.loading%' : '%i18n:@load-more%' }} {{ fetchingMoreFiles ? '%i18n:common.loading%' : '%i18n:@load-more%' }}
</button> </button>
@ -94,6 +94,13 @@ export default Vue.extend({
return this.selectFile; return this.selectFile;
} }
}, },
watch: {
top() {
if (this.isNaked) {
(this.$refs.nav as any).style.top = `${this.top}px`;
}
}
},
mounted() { mounted() {
this.connection = (this as any).os.streams.driveStream.getConnection(); this.connection = (this as any).os.streams.driveStream.getConnection();
this.connectionId = (this as any).os.streams.driveStream.use(); this.connectionId = (this as any).os.streams.driveStream.use();
@ -466,8 +473,8 @@ export default Vue.extend({
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
.mk-drive root(isDark)
background #fff background isDark ? #282c37 : #fff
> nav > nav
display block display block
@ -480,10 +487,10 @@ export default Vue.extend({
overflow auto overflow auto
white-space nowrap white-space nowrap
font-size 0.9em font-size 0.9em
color rgba(#000, 0.67) color rgba(isDark ? #fff : #000, 0.67)
-webkit-backdrop-filter blur(12px) -webkit-backdrop-filter blur(12px)
backdrop-filter blur(12px) backdrop-filter blur(12px)
background-color rgba(#fff, 0.75) background-color rgba(isDark ? #313543 : #fff, 0.75)
border-bottom solid 1px rgba(#000, 0.13) border-bottom solid 1px rgba(#000, 0.13)
> p > p
@ -509,7 +516,7 @@ export default Vue.extend({
opacity 0.5 opacity 0.5
> .info > .info
border-bottom solid 1px #eee border-bottom solid 1px isDark ? #1c2023 : #eee
&:empty &:empty
display none display none
@ -520,15 +527,15 @@ export default Vue.extend({
margin 0 auto margin 0 auto
padding 4px 16px padding 4px 16px
font-size 10px font-size 10px
color #777 color isDark ? #606984 : #777
> .folders > .folders
> .folder > .folder
border-bottom solid 1px #eee border-bottom solid 1px isDark ? #1c2023 : #eee
> .files > .files
> .file > .file
border-bottom solid 1px #eee border-bottom solid 1px isDark ? #1c2023 : #eee
> .more > .more
display block display block
@ -584,4 +591,10 @@ export default Vue.extend({
> .file > .file
display none display none
.kmmwchoexgckptowjmjgfsygeltxfeqs[data-darkmode]
root(true)
.kmmwchoexgckptowjmjgfsygeltxfeqs:not([data-darkmode])
root(false)
</style> </style>

View File

@ -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

View File

@ -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);

View File

@ -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>

View File

@ -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"/>
@ -116,9 +116,11 @@ export default Vue.extend({
this.note.mediaIds.length == 0 && this.note.mediaIds.length == 0 &&
this.note.poll == null); this.note.poll == null);
}, },
p(): any { p(): any {
return this.isRenote ? this.note.renote : this.note; return this.isRenote ? this.note.renote : this.note;
}, },
reactionsCount(): number { reactionsCount(): number {
return this.p.reactionCounts return this.p.reactionCounts
? Object.keys(this.p.reactionCounts) ? Object.keys(this.p.reactionCounts)
@ -126,6 +128,7 @@ export default Vue.extend({
.reduce((a, b) => a + b) .reduce((a, b) => a + b)
: 0; : 0;
}, },
urls(): string[] { urls(): string[] {
if (this.p.text) { if (this.p.text) {
const ast = parse(this.p.text); const ast = parse(this.p.text);
@ -180,16 +183,19 @@ export default Vue.extend({
this.conversation = conversation.reverse(); this.conversation = conversation.reverse();
}); });
}, },
reply() { reply() {
(this as any).apis.post({ (this as any).apis.post({
reply: this.p reply: this.p
}); });
}, },
renote() { renote() {
(this as any).apis.post({ (this as any).apis.post({
renote: this.p renote: this.p
}); });
}, },
react() { react() {
(this as any).os.new(MkReactionPicker, { (this as any).os.new(MkReactionPicker, {
source: this.$refs.reactButton, source: this.$refs.reactButton,
@ -198,6 +204,7 @@ export default Vue.extend({
big: true big: true
}); });
}, },
menu() { menu() {
(this as any).os.new(MkNoteMenu, { (this as any).os.new(MkNoteMenu, {
source: this.$refs.menuButton, source: this.$refs.menuButton,

View File

@ -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"/>

View File

@ -38,7 +38,6 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import getNoteSummary from '../../../../../misc/get-note-summary'; import getNoteSummary from '../../../../../misc/get-note-summary';
import * as config from '../../../config';
const displayLimit = 30; const displayLimit = 30;
@ -190,7 +189,7 @@ export default Vue.extend({
clearNotification() { clearNotification() {
this.unreadCount = 0; this.unreadCount = 0;
document.title = config.name; document.title = (this as any).os.instanceName;
}, },
onVisibilitychange() { onVisibilitychange() {

View File

@ -0,0 +1,131 @@
<template>
<div class="ulveipglmagnxfgvitaxyszerjwiqmwl">
<div class="bg" ref="bg" @click="onBgClick"></div>
<div class="main" ref="main" @click.self="onBgClick">
<mk-post-form ref="form"
:reply="reply"
:renote="renote"
:initial-text="initialText"
:instant="instant"
@posted="onPosted"
@cancel="onCanceled"/>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import * as anime from 'animejs';
export default Vue.extend({
props: {
reply: {
type: Object,
required: false
},
renote: {
type: Object,
required: false
},
initialText: {
type: String,
required: false
},
instant: {
type: Boolean,
required: false,
default: false
}
},
mounted() {
this.$nextTick(() => {
(this.$refs.bg as any).style.pointerEvents = 'auto';
anime({
targets: this.$refs.bg,
opacity: 1,
duration: 100,
easing: 'linear'
});
anime({
targets: this.$refs.main,
opacity: 1,
translateY: [-16, 0],
duration: 300,
easing: 'easeOutQuad'
});
});
},
methods: {
focus() {
this.$refs.form.focus();
},
close() {
(this.$refs.bg as any).style.pointerEvents = 'none';
anime({
targets: this.$refs.bg,
opacity: 0,
duration: 300,
easing: 'linear'
});
(this.$refs.main as any).style.pointerEvents = 'none';
anime({
targets: this.$refs.main,
opacity: 0,
translateY: 16,
duration: 300,
easing: 'easeOutQuad',
complete: () => this.$destroy()
});
},
onBgClick() {
this.$emit('cancel');
this.close();
},
onPosted() {
this.$emit('posted');
this.close();
},
onCanceled() {
this.$emit('cancel');
this.close();
}
}
});
</script>
<style lang="stylus" scoped>
.ulveipglmagnxfgvitaxyszerjwiqmwl
> .bg
display block
position fixed
z-index 10000
top 0
left 0
width 100%
height 100%
background rgba(#000, 0.7)
opacity 0
pointer-events none
> .main
display block
position fixed
z-index 10000
top 0
left 0
right 0
height 100%
overflow auto
margin 0 auto 0 auto
opacity 0
transform translateY(-16px)
</style>

View File

@ -170,6 +170,8 @@ export default Vue.extend({
}); });
} }
this.focus();
this.$nextTick(() => { this.$nextTick(() => {
this.focus(); this.focus();
}); });
@ -293,9 +295,6 @@ export default Vue.extend({
viaMobile: viaMobile viaMobile: viaMobile
}).then(data => { }).then(data => {
this.$emit('posted'); this.$emit('posted');
this.$nextTick(() => {
this.$destroy();
});
}).catch(err => { }).catch(err => {
this.posting = false; this.posting = false;
}); });
@ -309,7 +308,6 @@ export default Vue.extend({
cancel() { cancel() {
this.$emit('cancel'); this.$emit('cancel');
this.$destroy();
}, },
kao() { kao() {

View File

@ -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>
@ -8,7 +9,7 @@
<button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button> <button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button>
<template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template> <template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template>
<h1> <h1>
<slot>config.name</slot> <slot>{{ os.instanceName }}</slot>
</h1> </h1>
<slot name="func"></slot> <slot name="func"></slot>
</div> </div>
@ -20,16 +21,16 @@
<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 * as config from '../../../config'; import { env } from '../../../config';
export default Vue.extend({ export default Vue.extend({
props: ['func'], props: ['func'],
data() { data() {
return { return {
config,
hasGameInvitation: false, hasGameInvitation: false,
connection: null, connection: null,
connectionId: null connectionId: null,
env: env
}; };
}, },
computed: { computed: {
@ -41,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();
@ -135,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)

View File

@ -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: {

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