Compare commits

...

480 Commits

Author SHA1 Message Date
ba38f64353 8.23.0 2018-09-03 23:25:35 +09:00
db3ae303cb Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-09-03 23:23:55 +09:00
66f3a155e6 なんかもうめっちゃやった 2018-09-03 23:23:50 +09:00
09843a409b Fix typo: Wroker -> Worker (#2597) 2018-09-03 18:58:26 +09:00
d94b3757be Merge branch 'master' into develop 2018-09-02 22:41:10 +09:00
13e822cba6 Trim text
Closes #2595
2018-09-02 22:40:27 +09:00
c57bf87f52 Make poll button togglable (#2592) 2018-09-02 21:39:47 +09:00
99fbd60265 Improve url visual (#2591)
* Use string interpolation

* improve url visual

* fix lint
2018-09-02 20:19:59 +09:00
ea9b48db3c Merge branch 'develop' 2018-09-02 19:27:33 +09:00
c145c994a9 8.22.0 2018-09-02 19:27:09 +09:00
d033998b56 Update README.md [AUTOGEN] (#2586) 2018-09-02 19:10:12 +09:00
3136c714bf Fix users/list/update API (#2590) 2018-09-02 19:03:00 +09:00
c0ee134f19 Add users/lists/delete API (#2589) 2018-09-02 18:59:42 +09:00
d15ebe5732 Improve usability 2018-09-02 18:27:43 +09:00
ef630195fa モバイルのドライブダイアログがおかしいのを修正 & ダークモード対応 2018-09-02 18:23:47 +09:00
e31921151e Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-09-02 17:56:39 +09:00
f94992abbe 🎨 2018-09-02 17:56:20 +09:00
b00060c09c Clean up 2018-09-02 17:44:49 +09:00
f6217d96d2 add an endpoint users/lists/update (#2585)
* add an endpoint users/lists/update

* add meta params

* fix packing
2018-09-02 11:25:32 +09:00
3a6947c7ed Update README.md [AUTOGEN] 2018-09-02 09:45:28 +09:00
0fb528ddf8 Merge branch 'develop' 2018-09-02 09:34:26 +09:00
14c03f226d 8.21.1 2018-09-02 09:33:55 +09:00
4f0d844b43 Remove needless properties 2018-09-02 09:31:11 +09:00
b93395fc4c Update README.md [AUTOGEN] 2018-09-02 09:05:34 +09:00
34eacb7e2d Update README.md [AUTOGEN] 2018-09-02 08:03:27 +09:00
0177023ead Use Tombstone for Delete 2018-09-02 08:02:43 +09:00
a4678e45de Not check dependencies 2018-09-02 08:02:10 +09:00
f24869625e fix 2018-09-02 01:10:55 +09:00
01beb705a2 8.21.0 2018-09-02 00:07:23 +09:00
ce28c70c35 Clean up 2018-09-01 23:57:05 +09:00
5e0f5c31e7 Merge branch 'string-interpolation' into develop 2018-09-01 23:30:16 +09:00
b28dd4be52 Use typeof 2018-09-01 23:29:22 +09:00
291beb45fc Use string interpolation 2018-09-01 23:12:51 +09:00
ffb345ccb5 fix #2315 (#2339)
* improve MFM to html

* improve html to MFM

* missing semicolon

* missing semicolon

* fix html to MFM

タグのリンクは解除するように

* fix bug

* misssing semicolon

* Update html-to-mfm.ts

* Update html-to-mfm.ts
2018-09-01 22:45:27 +09:00
d2abe2cd81 Merge pull request #2573 from syuilo/refactor-mfm
Refactor mfm component
2018-09-01 22:39:30 +09:00
acffc3e522 Refactor mfm component 2018-09-01 22:38:50 +09:00
0962e62b8c Merge pull request #2572 from syuilo/refactor-reversi-game
Refactor reversi game
2018-09-01 22:20:32 +09:00
91ebd310b7 Refactor reversi game 2018-09-01 22:18:07 +09:00
2974c74b4e Merge pull request #2571 from syuilo/refactor-reversi-engine
Refactor reversi engine
2018-09-01 22:11:33 +09:00
3d24112d2d Refactor reversi engine 2018-09-01 22:09:54 +09:00
4a977cd523 Update CHANGELOG.md 2018-09-01 21:42:07 +09:00
4b1886990f Merge pull request #2570 from mei23/mei-0901-update2b
Implement ActivityPub Update(Person)
2018-09-01 21:38:49 +09:00
f3499b787c 8.20.0 2018-09-01 20:49:06 +09:00
5209a584a2 Better post form 2018-09-01 20:47:49 +09:00
57a63d38aa Send Update activity 2018-09-01 20:23:01 +09:00
3efffbcf22 Receive Update activity 2018-09-01 20:23:01 +09:00
15eaebe522 updatePersonで再割り当てを考慮する 2018-09-01 20:23:01 +09:00
eee98358ac Add missing updatePerson properties 2018-09-01 20:23:01 +09:00
795fc5e7bc Set Person.updatedAt at first 2018-09-01 20:23:01 +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
1d9c88e9a1 New translations ja-JP.yml (English) 2018-08-23 05:44:01 +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
240 changed files with 3464 additions and 1940 deletions

View File

@ -1,18 +1,19 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# BEARER_TOKEN= # __MISSKEY_BEARER_TOKEN=
# CAMPAIGN_ID= # __MISSKEY_CAMPAIGN_ID=
# GITHUB_TOKEN= # __MISSKEY_GITHUB_TOKEN=
# HEAD='acid-chicken:patch-autogen' # __MISSKEY_HEAD=acid-chicken:patch-autogen
# REPO='syuilo/misskey' # __MISSKEY_REPO=syuilo/misskey
test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$GITHUB_TOKEN" | jq -r '.[].head.label' | grep $HEAD)" && exit 1 # __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)/.." && \ cd "$(dirname $0)/.." && \
touch null.cache && \ touch null.cache && \
rm *.cache && \ rm *.cache && \
git checkout master && \ git checkout $__MISSKEY_BRANCH && \
git pull origin master && \ git pull origin $__MISSKEY_BRANCH && \
git pull upstream master && \ git pull upstream $__MISSKEY_BRANCH && \
git stash && \ git stash && \
git rebase -f upstream/master && \ git rebase -f upstream/$__MISSKEY_BRANCH && \
git branch patch-autogen && \ git branch patch-autogen && \
git checkout patch-autogen && \ git checkout patch-autogen && \
git reset --hard HEAD || \ git reset --hard HEAD || \
@ -20,12 +21,12 @@ exit 1
touch patreon.md.cache && \ touch patreon.md.cache && \
rm patreon.md.cache && \ rm patreon.md.cache && \
echo '<!-- PATREON_START -->' > patreon.md.cache && \ echo '<!-- PATREON_START -->' > patreon.md.cache && \
URL="https://www.patreon.com/api/oauth2/v2/campaigns/$CAMPAIGN_ID/members?include=currently_entitled_tiers,user&fields%5Btier%5D=title&fields%5Buser%5D=full_name,thumb_url,url,hide_pledges" 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 : while :
do do
touch patreon.raw.cache && \ touch patreon.raw.cache && \
rm patreon.raw.cache && \ rm patreon.raw.cache && \
curl -LSs -w '\n' -H "Authorization: Bearer $BEARER_TOKEN" -- $URL > patreon.raw.cache && \ curl -LSs -w '\n' -H "Authorization: Bearer $__MISSKEY_BEARER_TOKEN" -- $url > patreon.raw.cache && \
touch patreon.cache && \ touch patreon.cache && \
rm patreon.cache && \ rm patreon.cache && \
cat patreon.raw.cache | \ cat patreon.raw.cache | \
@ -42,31 +43,31 @@ while :
xargs -I% echo '<td><a href="%</a></td>' >> patreon.md.cache && \ xargs -I% echo '<td><a href="%</a></td>' >> patreon.md.cache && \
echo '</tr></table>' >> patreon.md.cache || \ echo '</tr></table>' >> patreon.md.cache || \
exit 1 exit 1
NEW_URL="$(cat patreon.raw.cache | jq -r '.links.next')" new_url="$(cat patreon.raw.cache | jq -r '.links.next')"
test "$NEW_URL" = 'null' && \ test "$new_url" = 'null' && \
break || \ break || \
URL="$NEW_URL" URL="$url"
done done
IGNORE= && \ ignore= && \
echo -e "\n**Last updated:** $(date -uR | sed 's/\+0000/UTC/')\n<!-- PATREON_END -->" >> patreon.md.cache && \ echo -e "\n**Last updated:** $(date -uR | sed 's/\+0000/UTC/')\n<!-- PATREON_END -->" >> patreon.md.cache && \
touch README.md && \ touch README.md && \
touch .autogen/README.md && \ touch .autogen/README.md && \
rm .autogen/README.md && \ rm .autogen/README.md && \
mv README.md .autogen/README.md && \ mv README.md .autogen/README.md && \
cat .autogen/README.md | while IFS= read LINE; cat .autogen/README.md | while IFS= read line;
do do
if [[ -z "$IGNORE" ]] if [[ -z "$ignore" ]]
then then
if [[ "$LINE" = '<!-- PATREON_START -->' ]] if [[ "$line" = '<!-- PATREON_START -->' ]]
then then
IGNORE='PATREON_INSIDE' ignore='PATREON_INSIDE'
else else
echo "$LINE" >> README.md echo "$line" >> README.md
fi fi
else else
if [[ "$LINE" = '<!-- PATREON_END -->' ]] if [[ "$LINE" = '<!-- PATREON_END -->' ]]
then then
IGNORE= ignore=
cat patreon.md.cache >> README.md cat patreon.md.cache >> README.md
fi fi
fi fi
@ -80,7 +81,7 @@ test 4 -lt $(cat diff.cache | wc -l) && \
git add README.md && \ git add README.md && \
git commit -m 'Update README.md [AUTOGEN]' && \ git commit -m 'Update README.md [AUTOGEN]' && \
git push -f origin patch-autogen && \ git push -f origin patch-autogen && \
curl -LSs -w '\n' -X POST -d '{"title":"[AUTOMATED] Update README.md","body":"*This pull request was created by a tool.*","head":"'$HEAD'","base":"master"}' -- "https://api.github.com/repos/$REPO/pulls?access_token=$GITHUB_TOKEN" 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 stash
git checkout master git checkout $__MISSKEY_BRANCH
git branch -D patch-autogen 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
----- -----
@ -37,13 +47,13 @@ Please run `node cli/migration/5.0.0` before launch.
オセロがリバーシに変更されました。 オセロがリバーシに変更されました。
Othello is now Reversi. Othello is rename to Reversi.
### Migration ### Migration
MongoDBの、`othelloGames``othelloMatchings`コレクションをそれぞれ`reversiGames``reversiMatchings`にリネームしてください。 MongoDBの、`othelloGames``othelloMatchings`コレクションをそれぞれ`reversiGames``reversiMatchings`にリネームしてください。
You need to rename `othelloGames` and `othelloMatchings` MongoDB collections to `reversiGames` and `reversiMatchings`. Please rename `othelloGames` and `othelloMatchings` MongoDB collections to `reversiGames` and `reversiMatchings` respectively.
3.0.0 3.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,40 +32,29 @@ 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).
### i18n
Please see [Translation guide](./docs/translate.en.md).
### l10n
Misskey is using Crowdin for l10n.
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/misskey/localized.svg)](https://crowdin.com/project/misskey)
:heart: Backers & Sponsors :heart: Backers & Sponsors
---------------------------------------------------------------- ----------------------------------------------------------------
<!-- PATREON_START --> <!-- PATREON_START -->
<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/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/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/2?token-time=2145916800&token-hash=rwZ8qvbm_kpA4ib3kc07tVKupXeySpY5ATQFGxfL9v0%3D" alt="Axella"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td>
<td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td> <td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=zwSu01tOtn5xTUucDZHuPsCxF2HBEMVs9ROJKTlEV_o%3D" alt="nemu"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=zwSu01tOtn5xTUucDZHuPsCxF2HBEMVs9ROJKTlEV_o%3D" alt="nemu"></td>
</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=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=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>
@ -76,20 +65,16 @@ Misskey is using Crowdin for l10n.
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12931605/ead494101f364dffa90efe49e36fb494/1?token-time=2145916800&token-hash=NzSFPjIlodXyv41rwK61aZWVZWfI4surJaNj8vWKvqM%3D" alt="Reiju"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12931605/ead494101f364dffa90efe49e36fb494/1?token-time=2145916800&token-hash=NzSFPjIlodXyv41rwK61aZWVZWfI4surJaNj8vWKvqM%3D" alt="Reiju"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=UERBN4OyP7Nh5XwwdDg0N0IE5cD6_qUQMO81Z5Wizso%3D" alt="Hiratake"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=UERBN4OyP7Nh5XwwdDg0N0IE5cD6_qUQMO81Z5Wizso%3D" alt="Hiratake"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td>
<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>
</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=5881381">Naoki Kosaka</a></td>
<td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td> <td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td>
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td> <td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
<td><a href="https://www.patreon.com/dansup">dansup</a></td> <td><a href="https://www.patreon.com/dansup">dansup</a></td>
<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>
</tr></table> </tr></table>
**Last updated:** Wed, 22 Aug 2018 05:25:06 UTC **Last updated:** Sun, 02 Sep 2018 05:30: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)

View File

@ -54,7 +54,7 @@ Please visit https://www.google.com/recaptcha/intro/ and generate keys.
*(optional)* Generating VAPID keys *(optional)* Generating VAPID keys
---------------------------------------------------------------- ----------------------------------------------------------------
If you want to enable ServiceWroker, you need to generate VAPID keys: If you want to enable ServiceWorker, you need to generate VAPID keys:
Unless you have set your global node_modules location elsewhere, you need to run this in root. Unless you have set your global node_modules location elsewhere, you need to run this in root.
``` shell ``` shell
@ -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

@ -1,5 +1,3 @@
# **Please DO NOT edit these files** except `ja-JP.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

@ -58,7 +58,7 @@ common:
friday: "金曜日" friday: "金曜日"
saturday: "土曜日" saturday: "土曜日"
reactions: reactions:
like: "ええやん" like: "いいね"
love: "しゅき" love: "しゅき"
laugh: "笑" laugh: "笑"
hmm: "ふぅ~む" hmm: "ふぅ~む"
@ -84,6 +84,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
@ -410,6 +411,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました" avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択" choose-avatar: "アバターにする画像を選択"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"

View File

@ -58,7 +58,7 @@ common:
friday: "金曜日" friday: "金曜日"
saturday: "土曜日" saturday: "土曜日"
reactions: reactions:
like: "ええやん" like: "いいね"
love: "Lieben" love: "Lieben"
laugh: "Lachen" laugh: "Lachen"
hmm: "Hmm...?" hmm: "Hmm...?"
@ -84,6 +84,7 @@ common:
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet." my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
@ -410,6 +411,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました" avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択" choose-avatar: "アバターにする画像を選択"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Schwarz ... komplett" total: "Schwarz ... komplett"
notes: "Blau ... Hinweise" notes: "Blau ... Hinweise"
@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "Vorheriger Monat" prev: "Vorheriger Monat"
next: "Nächster Monat" next: "Nächster Monat"
go: "Klicke zur Navigation" go: "Klicke zur Navigation"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "Datei auswählen" choose-file: "Datei auswählen"
upload: "Dateien von deinem PC hochladen" upload: "Dateien von deinem PC hochladen"
@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "Übergang in Fensterköpfen" gradient-window-header: "Übergang in Fensterköpfen"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "Zeige Antworten" show-reply-target: "Zeige Antworten"
show-my-renotes: "Zeige meine Reposts auf der Zeitleiste" show-my-renotes: "Zeige meine Reposts auf der Zeitleiste"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "Listen" lists: "Listen"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "Einstellungen" settings: "Einstellungen"
signout: "Ausloggen" signout: "Ausloggen"
dark: "Verdunkeln" dark: "Verdunkeln"
@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"

View File

@ -84,6 +84,7 @@ common:
my-token-regenerated: "Your token has been regenerated, so you will be signed out." my-token-regenerated: "Your token has been regenerated, so you will be signed out."
i-like-sushi: "I prefer sushi rather than pudding" i-like-sushi: "I prefer sushi rather than pudding"
show-reversi-board-labels: "Show row and column labels in Reversi" show-reversi-board-labels: "Show row and column labels in Reversi"
use-contrast-reversi-stones: "Make the stone color clear"
verified-user: "Verified account" verified-user: "Verified account"
disable-animated-mfm: "Disable animated texts in a post" disable-animated-mfm: "Disable animated texts in a post"
reversi: reversi:
@ -410,6 +411,7 @@ desktop:
uploading-avatar: "Uploading a new avatar" uploading-avatar: "Uploading a new avatar"
avatar-updated: "Successfully updated the avatar" avatar-updated: "Successfully updated the avatar"
choose-avatar: "Select an image for the avatar" choose-avatar: "Select an image for the avatar"
invalid-filetype: "This filetype is not acceptable here"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "Previous month" prev: "Previous month"
next: "Next month" next: "Next month"
go: "Click to navigate" go: "Click to navigate"
desktop/views/components/charts.vue:
title: "Charts"
per-day: "per Day"
per-hour: "per Hour"
notes: "Posts"
users: "Users"
drive: "Drive"
charts:
notes: "The number of posts: increase/decrease (Combined)"
local-notes: "The number of posts: increase/decrease (Local)"
remote-notes: "The number of posts: increase/decrease (Remote)"
notes-total: "The number of posts: cumulative total"
users: "The number of users: increase/decrease"
users-total: "The number of users: cumulative total"
drive: "Capacity used as the storage: increase/decrease"
drive-total: "Capacity used as the storage: cumulative total"
drive-files: "The number of files on the storage: increase/decrease"
drive-files-total: "The number of files on the storage: cumulative total"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "Choose files" choose-file: "Choose files"
upload: "Upload files from your device" upload: "Upload files from your device"
@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "Use gradients on window headers" gradient-window-header: "Use gradients on window headers"
post-form-on-timeline: "Display post form at the top of the timeline" post-form-on-timeline: "Display post form at the top of the timeline"
suggest-recent-hashtags: "Show recent popular hashtags on the post form" suggest-recent-hashtags: "Show recent popular hashtags on the post form"
show-clock-on-header: "Show clock on upper-right"
show-reply-target: "Display reply target" show-reply-target: "Display reply target"
show-my-renotes: "Show my renotes in the timeline" show-my-renotes: "Show my renotes in the timeline"
show-renoted-my-notes: "Show renoted my posts in timelines" show-renoted-my-notes: "Show renoted my posts in timelines"
@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "Lists" lists: "Lists"
follow-requests: "Follow requests" follow-requests: "Follow requests"
customize: "Customize home layout" customize: "Customize home layout"
admin: "Admin"
settings: "Settings" settings: "Settings"
signout: "Sign out" signout: "Sign out"
dark: "Submerge in dark" dark: "Submerge in dark"
@ -799,7 +821,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "Dashboard" dashboard: "Dashboard"
all-users: "All Users" all-users: "All Users"
original-users: "Users on this instance" original-users: "Users on this instance"
all-notes: "All Posts" all-notes: "All the posts"
original-notes: "Posts on this instance" original-notes: "Posts on this instance"
invite: "Invite" invite: "Invite"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "User account unverification settings" unverify-user: "User account unverification settings"
unverify: "Unverify account" unverify: "Unverify account"
unverified: "The account is now being unverified" unverified: "The account is now being unverified"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "Posts"
local: "Local"
remote: "Remote"
desktop/views/pages/admin/admin.users-chart.vue:
title: "Users"
local: "Local"
remote: "Remote"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "Drive"
local: "Local"
remote: "Remote"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Only media posts" is-media-only: "Only media posts"
is-media-view: "Media view" is-media-view: "Media view"
@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "Reposted by {}" reposted-by: "Reposted by {}"
private: "This post is private" private: "This post is private"
deleted: "This post has been deleted" deleted: "This post has been deleted"
desktop/views/pages/stats/stats.vue:
all-users: "All Users"
original-users: "Users on this instance"
all-notes: "All the posts"
original-notes: "Posts on this instance"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "More details..." about: "More details..."
gotit: "Got it!" gotit: "Got it!"
@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "Games" game: "Games"
darkmode: "Dark theme" darkmode: "Dark theme"
settings: "Settings" settings: "Settings"
admin: "Admin"
about: "About Misskey" about: "About Misskey"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "It seems this user hasn't posted anything yet." no-notes: "It seems this user hasn't posted anything yet."
@ -1057,7 +1073,7 @@ mobile/views/pages/favorites.vue:
title: "Favorites" title: "Favorites"
mobile/views/pages/user-lists.vue: mobile/views/pages/user-lists.vue:
title: "Lists" title: "Lists"
enter-list-name: "Enter list name" enter-list-name: "Enter a name of the list to make"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "Drive" drive: "Drive"
more: "Load more" more: "Load more"
@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "Updates will be applied after reloading the page" update-available-desc: "Updates will be applied after reloading the page"
settings: "Settings" settings: "Settings"
signout: "Sign out" signout: "Sign out"
sound: "Sounds"
enableSounds: "Enable sounds"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "Follows you" follows-you: "Follows you"
following: "Following" following: "Following"

View File

@ -58,7 +58,7 @@ common:
friday: "Viernes" friday: "Viernes"
saturday: "Sábado" saturday: "Sábado"
reactions: reactions:
like: "ええやん" like: "いいね"
love: "amor" love: "amor"
laugh: "risa" laugh: "risa"
hmm: "hmm" hmm: "hmm"
@ -84,6 +84,7 @@ common:
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado." my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
i-like-sushi: "Prefiero sushi a pudín" i-like-sushi: "Prefiero sushi a pudín"
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi" show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "Desactivar texto animado en una publicación" disable-animated-mfm: "Desactivar texto animado en una publicación"
reversi: reversi:
@ -410,6 +411,7 @@ desktop:
uploading-avatar: "Cargando un nuevo avatar" uploading-avatar: "Cargando un nuevo avatar"
avatar-updated: "Avatar actualizado" avatar-updated: "Avatar actualizado"
choose-avatar: "Escoge una imagen de avatar" choose-avatar: "Escoge una imagen de avatar"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Negro ... Total" total: "Negro ... Total"
notes: "Azul ... Notas" notes: "Azul ... Notas"
@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "Mes anterior" prev: "Mes anterior"
next: "Próximo mes" next: "Próximo mes"
go: "Click para navegar" go: "Click para navegar"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "Escoger archivos" choose-file: "Escoger archivos"
upload: "Cargar archivos de tu dispositivo" upload: "Cargar archivos de tu dispositivo"
@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "Usar degradados en las cabeceras de las páginas" gradient-window-header: "Usar degradados en las cabeceras de las páginas"
post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo" post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"

View File

@ -58,10 +58,10 @@ common:
friday: "Vendredi" friday: "Vendredi"
saturday: "Samedi" saturday: "Samedi"
reactions: reactions:
like: "ええやん" 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:
@ -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"
@ -512,7 +532,7 @@ desktop/views/components/following.vue:
empty: "Vous ne suivez aucun compte." empty: "Vous ne suivez aucun compte."
desktop/views/components/friends-maker.vue: desktop/views/components/friends-maker.vue:
title: "Utilisateurs recommandés :" title: "Utilisateurs recommandés :"
empty: "Impossible de trouver des utilisateurs à recommander." empty: "Impossible de trouver des utilisateurs·trices à recommander."
fetching: "Chargement" fetching: "Chargement"
refresh: "Plus" refresh: "Plus"
close: "Fermer" close: "Fermer"
@ -629,7 +649,8 @@ desktop/views/components/settings.vue:
circle-icons: "Utiliser des icônes circulaires" circle-icons: "Utiliser des icônes circulaires"
gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre" gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie"
show-clock-on-header: "Afficher l'horloge à droite sur le coté supérieur"
show-reply-target: "Afficher les réponses" show-reply-target: "Afficher les réponses"
show-my-renotes: "Afficher mes republications dans le fil" show-my-renotes: "Afficher mes republications dans le fil"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "Listes" lists: "Listes"
follow-requests: "Demandes de suivi" follow-requests: "Demandes de suivi"
customize: "Personnaliser l'Accueil" customize: "Personnaliser l'Accueil"
admin: "Admin"
settings: "Réglages" settings: "Réglages"
signout: "Déconnexion" signout: "Déconnexion"
dark: "Fall in dark" dark: "Fall in dark"
@ -791,14 +813,14 @@ desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "Fermer" close: "Fermer"
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "Tableau de bord"
drive: "Drive" drive: "Drive"
users: "Utilisateur·rice·s" users: "Utilisateur·rice·s"
update: "Mises à jour" update: "Mises à jour"
desktop/views/pages/admin/admin.dashboard.vue: desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "Tableau de bord"
all-users: "Tou·te·s les utilisateur·rice·s" all-users: "Toutes les utilisateurrices"
original-users: "Utilisateur·rice·s sur cette instance" original-users: "Utilisateurrices sur cette instance"
all-notes: "Toutes les publications" all-notes: "Toutes les publications"
original-notes: "Publication sur cette instance" original-notes: "Publication sur cette instance"
invite: "Invitation" invite: "Invitation"
@ -811,25 +833,13 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend: "Suspension levée" unsuspend: "Suspension levée"
unsuspended: "La suspension de lutilisateur·rice a été levée avec succès" unsuspended: "La suspension de lutilisateur·rice a été levée avec succès"
desktop/views/pages/admin/admin.verify-user.vue: desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "Paramètres de vérification du compte utilisateur"
verify: "Vérification du compte" verify: "Vérification du compte"
verified: "Le compte a été vérifié" verified: "Le compte a été vérifié"
desktop/views/pages/admin/admin.unverify-user.vue: desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "Ôter la vérification du compte"
unverified: "公式アカウントを解除しました" unverified: "Ce compte n'est pas vérifié"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Les publications médias uniquement" is-media-only: "Les publications médias uniquement"
is-media-view: "Vue média" is-media-view: "Vue média"
@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "Reposté par {}" reposted-by: "Reposté par {}"
private: "cette publication est privée" private: "cette publication est privée"
deleted: "cette publication a été supprimée" deleted: "cette publication a été supprimée"
desktop/views/pages/stats/stats.vue:
all-users: "Toutes les utilisateurrices"
original-users: "Utilisateurrices sur cette instance"
all-notes: "Toutes les publications"
original-notes: "Publication sur cette instance"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "à propos" about: "à propos"
gotit: "J'ai compris !" gotit: "J'ai compris !"
@ -977,7 +992,7 @@ mobile/views/components/follow-button.vue:
follow-request: "Demande d'abonnement" follow-request: "Demande d'abonnement"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "Abonnez-vous aux utilisateurs" title: "Abonnez-vous aux utilisateurs"
empty: "Impossible de trouver des utilisateurs à recommander." empty: "Impossible de trouver des utilisateurs·trices à recommander."
fetching: "Chargement" fetching: "Chargement"
refresh: "Voir plus" refresh: "Voir plus"
close: "Fermer" close: "Fermer"
@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "Jeux" game: "Jeux"
darkmode: "Mode nuit" darkmode: "Mode nuit"
settings: "Réglages" settings: "Réglages"
admin: "Admin"
about: "À propose de Misskey" about: "À propose de Misskey"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "Cette utilisateur semble n'avoir rien poster pour le moment" no-notes: "Cette utilisateur semble n'avoir rien poster pour le moment"
@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "Les mises à jour seront appliquées une fois la page est rechargée." update-available-desc: "Les mises à jour seront appliquées une fois la page est rechargée."
settings: "Réglages" settings: "Réglages"
signout: "Déconnexion" signout: "Déconnexion"
sound: "Sons"
enableSounds: "Activer le son"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "vous suit" follows-you: "vous suit"
following: "Abonnements" following: "Abonnements"

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-JP'); 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-DE': loadLang('de-DE'),
'en-US': loadLang('en-US'),
'fr-FR': loadLang('fr-FR'),
'ja-JP': native,
'ja-KS': loadLang('ja-KS'),
'pl-PL': loadLang('pl-PL'),
'es-ES': loadLang('es-ES')
};
Object.values(langs).forEach(locale => {
// Extend native language (Japanese)
locale = Object.assign({}, native, locale);
});
module.exports = langs;

View File

@ -58,7 +58,7 @@ common:
friday: "金曜日" friday: "金曜日"
saturday: "土曜日" saturday: "土曜日"
reactions: reactions:
like: "ええやん" like: "いいね"
love: "しゅき" love: "しゅき"
laugh: "笑" laugh: "笑"
hmm: "ふぅ~む" hmm: "ふぅ~む"
@ -84,6 +84,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
@ -410,6 +411,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました" avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択" choose-avatar: "アバターにする画像を選択"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"

View File

@ -94,6 +94,8 @@ common:
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
reversi: reversi:
drawn: "引き分け" drawn: "引き分け"
my-turn: "あなたのターンです" my-turn: "あなたのターンです"
@ -283,6 +285,8 @@ common/views/components/nav.vue:
feedback: "フィードバック" feedback: "フィードバック"
common/views/components/note-menu.vue: common/views/components/note-menu.vue:
detail: "詳細"
copy-link: "リンクをコピー"
favorite: "お気に入り" favorite: "お気に入り"
pin: "ピン留め" pin: "ピン留め"
delete: "削除" delete: "削除"
@ -456,6 +460,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"
@ -473,6 +478,25 @@ desktop/views/components/calendar.vue:
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
@ -713,6 +737,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をタイムラインに表示する"
@ -915,8 +940,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:
@ -939,21 +964,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@ -964,6 +974,12 @@ desktop/views/pages/deck/deck.note.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@ -1357,6 +1373,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: "フォローされています"

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:
@ -190,25 +191,25 @@ common/views/components/games/reversi/reversi.index.vue:
common/views/components/games/reversi/reversi.room.vue: common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定" settings-of-the-game: "ゲームの設定"
choose-map: "マップを選択" choose-map: "マップを選択"
random: "ランダム" random: "いんじゃんほい"
black-or-white: "先手/後手" black-or-white: "先手/後手"
black-is: "{}が黒" black-is: "{}が黒"
rules: "ルール" rules: "ルール"
is-llotheo: "石の少ない方が勝ち(ロセオ)" is-llotheo: "石の少ない方が勝ちや!(ロセオ)"
looped-map: "ループマップ" looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード" can-put-everywhere: "どこに置いてもええモード"
settings-of-the-bot: "Botの設定" settings-of-the-bot: "Botの設定"
this-game-is-started-soon: "ゲームは数秒後に開始されます" this-game-is-started-soon: "ゲームは数秒後に開始されんで"
waiting-for-other: "相手の準備が完了すのを待っています" waiting-for-other: "相手の準備が完了すのを待ってんで"
waiting-for-me: "あなたの準備が完了すのを待っています" waiting-for-me: "あんさんの準備が完了すのを待ってんで"
waiting-for-both: "準備中" waiting-for-both: "準備中"
cancel: "やめとくわ" cancel: "やめとくわ"
ready: "準備完了" ready: "準備完了"
cancel-ready: "準備続行" cancel-ready: "準備続行"
common/views/components/connect-failed.vue: common/views/components/connect-failed.vue:
title: "サーバーに接続できません" title: "サーバーに接続でけへんわ"
description: "インターネット回線に問題がるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。" description: "インターネット回線に問題が起きとるか、サーバーがダウンまたはメンテナンスしとるっぽいわ。知らんけど。とりあえずあとで{再試行}してや。"
thanks: "いつもMisskeyをご利用いただきありがとうございます。" thanks: "いつもMisskeyをつこてくれてほんまありがとな。"
troubleshoot: "トラブルシュート" troubleshoot: "トラブルシュート"
common/views/components/connect-failed.troubleshooter.vue: common/views/components/connect-failed.troubleshooter.vue:
title: "トラブルシューティング" title: "トラブルシューティング"
@ -218,99 +219,99 @@ common/views/components/connect-failed.troubleshooter.vue:
checking-internet: "インターネット接続を確認中" checking-internet: "インターネット接続を確認中"
server: "サーバー接続" server: "サーバー接続"
checking-server: "サーバー接続を確認中" checking-server: "サーバー接続を確認中"
finding: "問題を調べています" finding: "問題を調べとるで"
no-network: "ネットワークに接続されていません" no-network: "ネットワークに接続されとらんで"
no-network-desc: "お使いのPCのネットワーク接続が正常か確認してください。" no-network-desc: "つこてるPCのネットワーク接続が正常か確認して。"
no-internet: "インターネットに接続されていません" no-internet: "インターネットに接続されとらんで"
no-internet-desc: "ネットワークには接続されていますが、インターネットには接続されていないようです。お使いのPCのインターネット接続が正常か確認してください。" no-internet-desc: "ネットワークには接続されとるけど、インターネットには接続されとらんようやわ。つこてるPCのインターネット接続が正常か確認して。"
no-server: "Misskeyのサーバーに接続できません" no-server: "Misskeyのサーバーに接続でけへんわ"
no-server-desc: "お使いのPCのインターネット接続は正常ですが、Misskeyのサーバーには接続できませんでした。サーバーがダウンまたはメンテナンスしている可能性があるので、しばらくしてから再度アクセスください。" no-server-desc: "つこてるPCのインターネット接続は正常やけど、Misskeyのサーバーにはつながらんわ。多分サーバーがダウンまたはメンテナンスしとるわ、知らんけど。すまんけどしばらくしてから再度アクセスしてみてや。"
success: "Misskeyのサーバーに接続できました" success: "Misskeyのサーバーに接続できた"
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。" success-desc: "正常に接続できるようやわ。ページを再度読み込みして。"
flush: "キャッシュの削除" flush: "キャッシュの削除"
set-version: "バージョン指定" set-version: "バージョン指定"
common/views/components/messaging.vue: common/views/components/messaging.vue:
search-user: "ユーザーを探す" search-user: "ユーザーを探す"
you: "あなた" you: "あんさん"
no-history: "履歴はありません" no-history: "履歴はあらへんで"
common/views/components/messaging-room.vue: common/views/components/messaging-room.vue:
empty: "このユーザーと話したことはありません" empty: "このユーザーと話したことはあらへんで"
more: "もっと読む" more: "もっと読む"
no-history: "これより過去の履歴はありません" no-history: "これより過去の履歴はあらへんで"
resize-form: "ドラッグしてフォームの広さを調整" resize-form: "ドラッグしてフォームの広さを調整"
new-message: "新しいメッセージがあります" new-message: "新しいメッセージがあるで"
only-one-file-attached: "メッセージに添付できのはひとつのファイルのみで" only-one-file-attached: "メッセージに添付できのはひとつのファイルのみで"
common/views/components/messaging-room.form.vue: common/views/components/messaging-room.form.vue:
input-message-here: "ここにメッセージを入力" input-message-here: "ここにメッセージ書いてや"
send: "送信" send: "送信"
attach-from-local: "PCからファイルを添付する" attach-from-local: "PCからファイルを添付する"
attach-from-drive: "ドライブからファイルを添付する" attach-from-drive: "ドライブからファイルを添付する"
only-one-file-attached: "メッセージに添付できのはひとつのファイルのみで" only-one-file-attached: "メッセージに添付できのはひとつのファイルのみで"
common/views/components/messaging-room.message.vue: common/views/components/messaging-room.message.vue:
is-read: "既読" is-read: "既読"
deleted: "このメッセージは削除されました" deleted: "このメッセージは削除された"
common/views/components/nav.vue: common/views/components/nav.vue:
about: "Misskeyについて" about: "Misskeyについて"
stats: "統計" stats: "統計"
status: "ステータス" status: "ステータス"
wiki: "Wiki" wiki: "Wiki"
donors: "ドナー" donors: "支援者"
repository: "リポジトリ" repository: "リポジトリ"
develop: "開発者" develop: "開発者"
feedback: "フィードバック" feedback: "フィードバック"
common/views/components/note-menu.vue: common/views/components/note-menu.vue:
favorite: "お気に入り" favorite: "お気に入り"
pin: "ピン留め" pin: "ピン留め"
delete: "削除" delete: "ほかす"
delete-confirm: "この投稿を削除しますか?" delete-confirm: "この投稿を削除してもええか?"
remote: "投稿元で見る" remote: "投稿元で見る"
common/views/components/poll.vue: common/views/components/poll.vue:
vote-to: "「{}」に投票する" vote-to: "「{}」に投票や!"
vote-count: "{}票" vote-count: "{}票"
total-users: "{}人が投票" total-users: "{}人が投票"
vote: "投票する" vote: "投票する"
show-result: "結果を見" show-result: "結果を見よか"
voted: "投票済み" voted: "投票済み"
common/views/components/poll-editor.vue: common/views/components/poll-editor.vue:
no-only-one-choice: "アンケートには、選択肢が最低2つ必要で" no-only-one-choice: "選択肢が最低2つ必要で"
choice-n: "選択肢{}" choice-n: "選択肢{}"
remove: "この選択肢を削除" remove: "この選択肢を消すで"
add: "+選択肢を追加" add: "+選択肢を追加"
destroy: "アンケートを破棄" destroy: "アンケートをほかそ"
common/views/components/reaction-picker.vue: common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択" choose-reaction: "リアクションを選択"
common/views/components/signin.vue: common/views/components/signin.vue:
username: "ユーザー名" username: "ユーザー名"
password: "パスワード" password: "パスワード"
token: "トークン" token: "トークン"
signing-in: "やってます..." signing-in: "サインイン中や..."
signin: "サインイン" signin: "サインイン"
or: "または" or: "または"
signin-with-twitter: "Twitterでログイン" signin-with-twitter: "Twitterでサインイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" login-failed: "なんかログインできんかったわ。ユーザー名とパスワードとかを確認して。"
common/views/components/signup.vue: common/views/components/signup.vue:
invitation-code: "招待コード" invitation-code: "招待コード"
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。" invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
username: "ユーザー名" username: "ユーザー名"
checking: "確認しています..." checking: "確認中や…"
available: "利用できます" available: "使えるで"
unavailable: "既に利用されています" unavailable: "もう使われとるで"
error: "通信エラー" error: "通信エラー"
invalid-format: "a~z、A~Z、0~9、_が使えます" invalid-format: "a~z、A~Z、0~9、_が使えるで"
too-short: "1文字以上でお願いします" too-short: "1文字以上でお願いします"
too-long: "20文字以内でお願いします" too-long: "20文字以内でお願いします"
password: "パスワード" password: "パスワード"
password-placeholder: "8文字以上を推奨します" password-placeholder: "8文字以上を推奨します"
weak-password: "いパスワード" weak-password: "へぼいパスワード"
normal-password: "まあまあのパスワード" normal-password: "ぼちぼちなパスワード"
strong-password: "強いパスワード" strong-password: "良さげなパスワード"
retype: "再入力" retype: "もっかい入力頼むで"
retype-placeholder: "確認のため再入力してください" retype-placeholder: "確認のためもっぺん入力してや"
password-matched: "確認されました" password-matched: "一致しとるで"
password-not-matched: "一致していません" password-not-matched: "一致しとらんで"
recaptcha: "認証" recaptcha: "認証"
create: "アカウント作成" create: "アカウント作成"
some-error: "何らかの原因によりアカウントの作成に失敗しました。再度お試しください。" some-error: "何かよう分からんけど、アカウントの作成に失敗してしもたわ。すまんがもっぺん試してくれへんか?"
common/views/components/special-message.vue: common/views/components/special-message.vue:
new-year: "Happy New Year!" new-year: "Happy New Year!"
christmas: "Merry Christmas!" christmas: "Merry Christmas!"
@ -319,8 +320,8 @@ common/views/components/stream-indicator.vue:
reconnecting: "再接続中" reconnecting: "再接続中"
connected: "接続完了" connected: "接続完了"
common/views/components/twitter-setting.vue: common/views/components/twitter-setting.vue:
description: "お使いのTwitterアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールTwitterアカウント情報が表示されるようになったり、Twitterを用いた便利なサインインを利用できるようになります。" description: "あんさんがつことるTwitterアカウントをMisskeyアカウントに接続しくと、あんさんのプロフィールTwitterアカウント情報が表示されるようになったり、Twitterをつこた便利なサインインが使えるようになったりすんで。"
connected-to: "次のTwitterアカウントに接続されています" connected-to: "次のTwitterアカウントに接続されとるで"
detail: "詳細..." detail: "詳細..."
reconnect: "再接続する" reconnect: "再接続する"
connect: "Twitterと接続する" connect: "Twitterと接続する"
@ -338,7 +339,7 @@ common/views/components/visibility-chooser.vue:
private: "非公開" private: "非公開"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "確認中" fetching: "確認中"
no-broadcasts: "お知らせはありません" no-broadcasts: "お知らせはあらへんで"
have-a-nice-day: "良い一日を!" have-a-nice-day: "良い一日を!"
next: "次" next: "次"
common/views/widgets/calendar.vue: common/views/widgets/calendar.vue:
@ -350,17 +351,17 @@ common/views/widgets/calendar.vue:
this-year: "今年:" this-year: "今年:"
common/views/widgets/donation.vue: common/views/widgets/donation.vue:
title: "寄付のお願い" title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼ってます。もし興味があれば、{}までご連絡ください。ご協力ありがとうございます。" text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かるんや。Misskeyは広告を掲載したりせんから、収入を皆様からの寄付に頼ってますねん。もし興味があるなら、{}までご連絡よろしゅう頼んます。ご協力おおきに。"
common/views/widgets/photo-stream.vue: common/views/widgets/photo-stream.vue:
title: "フォトストリーム" title: "フォトストリーム"
no-photos: "写真はありません" no-photos: "写真はあらへんで"
common/views/widgets/posts-monitor.vue: common/views/widgets/posts-monitor.vue:
title: "投稿チャート" title: "投稿チャート"
toggle: "表示を切り替え" toggle: "表示を切り替え"
common/views/widgets/hashtags.vue: common/views/widgets/hashtags.vue:
title: "ハッシュタグ" title: "ハッシュタグ"
count: "{}人が投稿" count: "{}人が投稿"
empty: "トレンドなし" empty: "流行は自分で作るんや"
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "サーバー情報" title: "サーバー情報"
toggle: "表示を切り替え" toggle: "表示を切り替え"
@ -369,30 +370,30 @@ common/views/widgets/memo.vue:
memo: "ここに書いて!" memo: "ここに書いて!"
save: "保存" save: "保存"
common/views/widgets/slideshow.vue: common/views/widgets/slideshow.vue:
folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください" folder-customize-mode: "フォルダを指定するんやったら、一旦カスタマイズモードを終了して"
folder: "クリックしてフォルダを指定してください" folder: "クリックしてフォルダを指定してください"
no-image: "このフォルダには画像がありません" no-image: "このフォルダには画像がありません"
common/views/widgets/tips.vue: common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます" tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできんで"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます" tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開くで"
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます" tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできんで"
tips-line4: "投稿フォームにクリップボードにる画像データをペーストできます" tips-line4: "投稿フォームにクリップボードにる画像データをペーストできんで"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます" tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできんで"
tips-line6: "ドライブファイルをドラッグしてフォルダ移動できます" tips-line6: "ドライブやと、ファイルをドラッグしてフォルダ移動できんで"
tips-line7: "ドライブフォルダをドラッグしてフォルダ移動できます" tips-line7: "ドライブやと、フォルダをドラッグしてフォルダ移動できんで"
tips-line8: "ホームは設定からカスタマイズできます" tips-line8: "ホームは設定からカスタマイズできんで"
tips-line9: "MisskeyはAGPLv3で" tips-line9: "MisskeyはAGPLv3で"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます" tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れんで"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます" tips-line11: "投稿の ... をクリックして、ピン留めから投稿をユーザーページにピン留めできんで"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます" tips-line13: "投稿に添付したファイルは全てドライブに保存されんで"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます" tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できんで"
tips-line17: "「**」でテキストを囲と**強調表示**されます" tips-line17: "「**」でテキストを囲ったると**強調表示**されんで"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます" tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができんで"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています" tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示してんねん"
tips-line21: "APIを利用してbotの開発なども行えます" tips-line21: "APIをつこてbotの開発なども行えるで"
tips-line23: "まゆかわいいよまゆ" tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました" tips-line24: "Misskeyは2014年にサービスを開始したんよ"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます" tips-line25: "対応ブラウザやったらMisskeyを開いとらんでも通知を受け取れんで"
common/views/pages/follow.vue: common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中" signed-in-as: "{}としてサインイン中"
following: "フォロー中" following: "フォロー中"
@ -402,14 +403,15 @@ common/views/pages/follow.vue:
desktop: desktop:
banner-crop-title: "バナーとして表示する部分を選択" banner-crop-title: "バナーとして表示する部分を選択"
banner: "バナー" banner: "バナー"
uploading-banner: "新しいバナーをアップロードしています" uploading-banner: "新しいバナーをアップロードしとるで"
banner-updated: "バナーを更新しました" banner-updated: "バナーを更新した"
choose-banner: "バナーにする画像を選択" choose-banner: "バナーにする画像を選択"
avatar-crop-title: "アバターとして表示する部分を選択" avatar-crop-title: "アバターとして表示する部分を選択"
avatar: "アバター" avatar: "アバター"
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"
@ -419,10 +421,28 @@ desktop/views/components/activity.vue:
title: "アクティビティ" title: "アクティビティ"
toggle: "表示を切り替え" toggle: "表示を切り替え"
desktop/views/components/calendar.vue: desktop/views/components/calendar.vue:
title: "{1}年 {2}月" title: "{1}年 {2} 月"
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からドライブにファイルをアップロード"
@ -445,7 +465,7 @@ desktop/views/components/drive.file.vue:
banner: "バナー" banner: "バナー"
nsfw: "閲覧注意" nsfw: "閲覧注意"
contextmenu: contextmenu:
rename: "名前を変" rename: "名前を変えるで"
mark-as-sensitive: "閲覧注意に設定" mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除" unmark-as-sensitive: "閲覧注意を解除"
copy-url: "URLをコピー" copy-url: "URLをコピー"
@ -456,26 +476,26 @@ desktop/views/components/drive.file.vue:
open-in-app: "アプリで開く" open-in-app: "アプリで開く"
add-app: "アプリを追加" add-app: "アプリを追加"
rename-file: "ファイル名の変更" rename-file: "ファイル名の変更"
input-new-file-name: "新しいファイル名を入力してください" input-new-file-name: "新しいファイル名を入力して"
copied: "コピー完了" copied: "コピー完了"
copied-url-to-clipboard: "URLをクリップボードにコピーしました" copied-url-to-clipboard: "URLをクリップボードにコピーしました"
desktop/views/components/drive.folder.vue: desktop/views/components/drive.folder.vue:
unable-to-process: "操作を完了できません" unable-to-process: "操作を完了できません"
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。" circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
unhandled-error: "不明なエラー" unhandled-error: "ようわからん"
contextmenu: contextmenu:
move-to-this-folder: "このフォルダへ移動" move-to-this-folder: "このフォルダへ移動"
show-in-new-window: "新しいウィンドウで表示" show-in-new-window: "新しいウィンドウで表示"
rename: "名前を変" rename: "名前を変えるで"
rename-folder: "フォルダ名の変更" rename-folder: "フォルダ名を変えるで"
input-new-folder-name: "新しいフォルダ名を入力してください" input-new-folder-name: "新しいフォルダ名を入力して"
desktop/views/components/drive.nav-folder.vue: desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ" drive: "ドライブ"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "検索" search: "検索"
load-more: "もっと読み込む" load-more: "もっと読み込む"
empty-draghover: "ドロップですか?いいですよ、ボクはカワイイですからね" empty-draghover: "ドロップですか?いいですよ、ボクはカワイイですからね"
empty-drive: "ドライブには何もありません。" empty-drive: "ドライブには何もあらへんで。"
empty-drive-description: "右クリックして「ファイルをアップロード」を選んだり、ファイルをドラッグ&ドロップすることでもアップロードできます。" empty-drive-description: "右クリックして「ファイルをアップロード」を選んだり、ファイルをドラッグ&ドロップすることでもアップロードできます。"
empty-folder: "このフォルダーは空です" empty-folder: "このフォルダーは空です"
unable-to-process: "操作を完了できません" unable-to-process: "操作を完了できません"
@ -492,11 +512,11 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード" upload: "ファイルをアップロード"
url-upload: "URLからアップロード" url-upload: "URLからアップロード"
desktop/views/components/media-image.vue: desktop/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "ちょっと見せられへんわ"
click-to-show: "クリックして表示" click-to-show: "クリックして見せるで"
desktop/views/components/media-video.vue: desktop/views/components/media-video.vue:
sensitive: "閲覧注意" sensitive: "ちょっと見せられへんわ"
click-to-show: "クリックして表示" click-to-show: "クリックして見せるで"
desktop/views/components/follow-button.vue: desktop/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
@ -517,7 +537,7 @@ desktop/views/components/friends-maker.vue:
refresh: "もっと見る" refresh: "もっと見る"
close: "閉じる" close: "閉じる"
desktop/views/components/game-window.vue: desktop/views/components/game-window.vue:
game: "リバーシ" game: "ゲーム"
desktop/views/components/home.vue: desktop/views/components/home.vue:
done: "完了" done: "完了"
add-widget: "ウィジェットを追加:" add-widget: "ウィジェットを追加:"
@ -556,32 +576,32 @@ desktop/views/components/notifications.vue:
empty: "ありません!" empty: "ありません!"
desktop/views/components/post-form.vue: desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加" add-visible-user: "+ユーザーを追加"
attach-location-information: "位置情報を添付する" attach-location-information: "いる場所くっつけるで"
hide-contents: "内容を隠す" hide-contents: "内容を隠す"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..." quote-placeholder: "この投稿を引用..."
submit: "投稿" submit: "投稿"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
posted: "投稿しました!" posted: "投稿した"
replied: "返信しました!" replied: "返信した"
reposted: "Renoteしました" reposted: "Renoteしました"
note-failed: "投稿に失敗しました" note-failed: "投稿に失敗した"
reply-failed: "返信に失敗しました" reply-failed: "返信に失敗した"
renote-failed: "Renoteに失敗しました" renote-failed: "Renoteに失敗しました"
posting: "投稿中" posting: "投稿中"
attach-media-from-local: "PCからメディアを添付" attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付" attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し" attach-cancel: "くっつけるのやめよか"
insert-a-kao: "v('ω')v" insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成" create-poll: "アンケートを作成"
text-remain: "残り{}文字" text-remain: "残り{}文字"
recent-tags: "最近" recent-tags: "最近のタグ"
click-to-tagging: "クリックでタグ付け" click-to-tagging: "クリックでタグ付け"
visibility: "公開範囲" visibility: "公開範囲"
geolocation-alert: "お使いの端末は位置情報に対応していません" geolocation-alert: "あんさんのつことる端末は位置情報に対応しとらんみたいやわ、知らんけど。"
error: "エラー" error: "エラー"
enter-username: "ユーザー名を入力してください" enter-username: "ユーザー名を入力して"
annotations: "内容への注釈 (オプション)" annotations: "内容への注釈 (オプション)"
desktop/views/components/post-form-window.vue: desktop/views/components/post-form-window.vue:
note: "新規投稿" note: "新規投稿"
@ -620,7 +640,7 @@ desktop/views/components/settings.vue:
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。" auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "詳細設定" advanced: "詳細設定"
api-via-stream: "ストリームを経由したAPIリクエスト" api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効で。" api-via-stream-desc: "この設定をオンにすると、WebSocket接続を経由してAPIリクエストが行われんで(パフォーマンス向上するかも、知らんけど)。オフにすると、ネイティブの fetch API が利用されるで。この設定はこのデバイスのみ有効で。"
display: "デザインと表示" display: "デザインと表示"
customize: "ホームをカスタマイズ" customize: "ホームをカスタマイズ"
choose-wallpaper: "壁紙を選択" choose-wallpaper: "壁紙を選択"
@ -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をタイムラインに表示する"
@ -667,9 +688,9 @@ desktop/views/components/settings.vue:
prevent-update: "アップデートを延期する(非推奨)" prevent-update: "アップデートを延期する(非推奨)"
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。" prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
no-updates: "利用可能な更新はありません" no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。" no-updates-desc: "つこてるMisskeyは最新や!"
update-available: "新しいバージョンが利用可能です" update-available: "新しいバージョンが利用可能"
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されるで。"
advanced-settings: "高度な設定" advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする" debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。" debug-mode-desc: "この設定はブラウザに記憶されます。"
@ -688,28 +709,28 @@ desktop/views/components/settings.2fa.vue:
unregister: "設定を解除" unregister: "設定を解除"
unregistered: "二段階認証が無効になりました。" unregistered: "二段階認証が無効になりました。"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力してください"
authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:" authenticator: "まず、Google Authenticatorとかのをつこてるデバイスにインストールしてや:"
howtoinstall: "インストール方法はこちら" howtoinstall: "インストール方法はここやで"
scan: "次に、表示されているQRコードをスキャンします:" scan: "んで、ここに出とるQRコードをスキャンしてな:"
done: "お使いのデバイスに表示されているトークンを入力して完了します:" done: "最後にデバイスに表示されるトークンを入力して:"
submit: "完了" submit: "送信"
success: "設定が完了しました!" success: "設定が完了した"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。" failed: "なんか設定に失敗した。トークンを間違えとらんか確認してや。"
info: "次サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。" info: "次サインインからは、パスワードに加えてデバイスに出とるトークンを入力してな。"
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: "万が一このトークンが漏れたとかその可能性があったらトークンを再生成できるで。"
regenerate-token: "トークンを再生成" regenerate-token: "トークンを再生成"
token: "Token:" token: "トークン:"
enter-password: "パスワードを入力してください" enter-password: "パスワードを入力して"
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはあらへんで"
desktop/views/components/settings.drive.vue: desktop/views/components/settings.drive.vue:
max: "中" max: "中"
in-use: "使用中" in-use: "使用中"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはおらんで"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
reset: "パスワードを変更する" reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください" enter-current-password: "現在のパスワードを入力してください"
@ -745,7 +766,7 @@ desktop/views/components/timeline.vue:
global: "グローバル" global: "グローバル"
list: "リスト" list: "リスト"
desktop/views/components/ui.header.vue: desktop/views/components/ui.header.vue:
welcome-back: "おかえりなさい、" welcome-back: "おかえり、"
adjective: "さん" adjective: "さん"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "プロフィール" profile: "プロフィール"
@ -753,7 +774,8 @@ desktop/views/components/ui.header.account.vue:
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームカスタマイズ" customize: "ホームカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@ -774,7 +796,7 @@ desktop/views/components/received-follow-requests-window.vue:
reject: "拒否" reject: "拒否"
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト" title: "リスト"
create-list: "リストを作成" create-list: "新しいリストを作成"
list-name: "リスト名" list-name: "リスト名"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
@ -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: "ユーザーの凍結"
@ -809,27 +831,15 @@ desktop/views/pages/admin/admin.suspend-user.vue:
desktop/views/pages/admin/admin.unsuspend-user.vue: desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除" unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除" unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました" unsuspended: "凍結を解除した"
desktop/views/pages/admin/admin.verify-user.vue: desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定" verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする" verify: "公式アカウントにする"
verified: "公式アカウントにしました" verified: "公式アカウントにした"
desktop/views/pages/admin/admin.unverify-user.vue: 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,21 +848,26 @@ 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: "わかった"
signin: "ログイン" signin: "サインイン"
signup: "新規登録" signup: "サインアップ"
signin-button: "やってる" signin-button: "サインイン中…"
signup-button: "やる" signup-button: "サインアップ"
timeline: "タイムライン" timeline: "タイムライン"
powered-by-misskey: "Powered by <b>Misskey</b>." powered-by-misskey: "Powered by <b>Misskey</b>."
desktop/views/pages/drive.vue: desktop/views/pages/drive.vue:
title: "Misskey Drive" title: "ドライブ"
desktop/views/pages/favorites.vue: desktop/views/pages/favorites.vue:
more: "さらに読み込む" more: "もっと読み込んでくで"
desktop/views/pages/home-customize.vue: desktop/views/pages/home-customize.vue:
title: "ホームカスタマイズ" title: "ホームカスタマイズ"
desktop/views/pages/note.vue: desktop/views/pages/note.vue:
prev: "前の投稿" prev: "前の投稿"
next: "次の投稿" next: "次の投稿"
@ -887,19 +902,19 @@ desktop/views/pages/user/user.vue:
desktop/views/pages/user/user.home.vue: desktop/views/pages/user/user.home.vue:
last-used-at: "最終アクセス" last-used-at: "最終アクセス"
desktop/views/pages/user/user.photos.vue: desktop/views/pages/user/user.photos.vue:
title: "フォト" title: "写真"
loading: "読み込み中" loading: "読み込み中"
no-photos: "写真はありません" no-photos: "写真はあらへんで"
desktop/views/pages/user/user.profile.vue: desktop/views/pages/user/user.profile.vue:
follows-you: "フォローされています" follows-you: "フォローされとるで"
stalk: "ストークする" stalk: "ストークする"
stalking: "ストーキングしています" stalking: "ストーキングしとるで"
unstalk: "ストーク解除" unstalk: "ストーク解除"
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしとるで"
unmute: "ミュート解除" unmute: "ミュート解除"
push-to-a-list: "リストに追加" push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。" list-pushed: "{user}を{list}に追加した。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
posts: "投稿" posts: "投稿"
following: "フォロー" following: "フォロー"
@ -918,7 +933,7 @@ desktop/views/widgets/notifications.vue:
desktop/views/widgets/polls.vue: desktop/views/widgets/polls.vue:
title: "アンケート" title: "アンケート"
refresh: "他を見る" refresh: "他を見る"
nothing: "ありません!" nothing: "あらへん!"
desktop/views/widgets/post-form.vue: desktop/views/widgets/post-form.vue:
title: "投稿" title: "投稿"
note: "投稿" note: "投稿"
@ -940,7 +955,7 @@ mobile/views/components/drive.vue:
count-separator: "、" count-separator: "、"
file-count: "ファイル" file-count: "ファイル"
load-more: "もっと読み込む" load-more: "もっと読み込む"
nothing-in-drive: "ドライブには何もありません" nothing-in-drive: "ドライブには何もあらへんで。"
folder-is-empty: "このフォルダは空です" folder-is-empty: "このフォルダは空です"
prompt: "何をしますか?(数字を入力してください): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>" prompt: "何をしますか?(数字を入力してください): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>"
deletion-alert: "ごめんなさい!フォルダの削除は未実装です...。" deletion-alert: "ごめんなさい!フォルダの削除は未実装です...。"
@ -1017,9 +1032,9 @@ mobile/views/components/post-form.vue:
quote-placeholder: "この投稿を引用... (オプション)" quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..." reply-placeholder: "この投稿への返信..."
cw-placeholder: "内容への注釈 (オプション)" cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません" location-alert: "あんさんのつことる端末は位置情報に対応しとらんみたいやわ、知らんけど。"
error: "エラー" error: "エラー"
username-prompt: "ユーザー名を入力してください" username-prompt: "ユーザー名を入力して"
mobile/views/components/sub-note-content.vue: mobile/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
@ -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: "このユーザーは投稿していないようです。"
@ -1057,7 +1073,7 @@ mobile/views/pages/favorites.vue:
title: "お気に入り" title: "お気に入り"
mobile/views/pages/user-lists.vue: mobile/views/pages/user-lists.vue:
title: "リスト" title: "リスト"
enter-list-name: "リスト名を入力してください" enter-list-name: "リスト名を入力して"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ" drive: "ドライブ"
more: "もっと見る" more: "もっと見る"
@ -1073,7 +1089,7 @@ mobile/views/pages/home.vue:
hybrid: "ソーシャル" hybrid: "ソーシャル"
global: "グローバル" global: "グローバル"
mobile/views/pages/tag.vue: mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。" no-posts-found: "ハッシュタグ「{}」が付けられた投稿はあらへんで。"
mobile/views/pages/welcome.vue: mobile/views/pages/welcome.vue:
signup: "新規登録" signup: "新規登録"
mobile/views/pages/widgets.vue: mobile/views/pages/widgets.vue:
@ -1140,7 +1156,7 @@ mobile/views/pages/settings.vue:
show-local-renotes: "ローカルの投稿のRenoteを表示する" show-local-renotes: "ローカルの投稿のRenoteを表示する"
post-style: "投稿の表示スタイル" post-style: "投稿の表示スタイル"
post-style-standard: "標準" post-style-standard: "標準"
post-style-smart: "スマート" post-style-smart: "べっぴんさん"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない" disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
@ -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: "ええやん" like: "いいね"
love: "좋아" love: "좋아"
laugh: "크크" laugh: "크크"
hmm: "음..." hmm: "음..."
@ -84,6 +84,7 @@ common:
my-token-regenerated: "당신의 토큰이 업데이트되어 있기 때문에 로그 아웃합니다." my-token-regenerated: "당신의 토큰이 업데이트되어 있기 때문에 로그 아웃합니다."
i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아" i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아"
show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시" show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할" disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할"
reversi: reversi:
@ -410,6 +411,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました" avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択" choose-avatar: "アバターにする画像を選択"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"

View File

@ -58,7 +58,7 @@ common:
friday: "Piątek" friday: "Piątek"
saturday: "Sobota" saturday: "Sobota"
reactions: reactions:
like: "ええやん" like: "いいね"
love: "Kocham" love: "Kocham"
laugh: "Śmieszne" laugh: "Śmieszne"
hmm: "Hmm…?" hmm: "Hmm…?"
@ -84,6 +84,7 @@ common:
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany." my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
i-like-sushi: "Wolę sushi od puddingu" i-like-sushi: "Wolę sushi od puddingu"
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi" show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "Wyłącz animowany tekst we wpisach" disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
reversi: reversi:
@ -410,6 +411,7 @@ desktop:
uploading-avatar: "Wysyłanie awatara" uploading-avatar: "Wysyłanie awatara"
avatar-updated: "Wysłano awatar" avatar-updated: "Wysłano awatar"
choose-avatar: "Wybierz awatar" choose-avatar: "Wybierz awatar"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Czarny … Łącznie" total: "Czarny … Łącznie"
notes: "Niebieski … Wpisy" notes: "Niebieski … Wpisy"
@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "Poprzedni miesiąc" prev: "Poprzedni miesiąc"
next: "Następny miesiąc" next: "Następny miesiąc"
go: "Naciśnij, aby przejść" go: "Naciśnij, aby przejść"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "Wybierz plik" choose-file: "Wybierz plik"
upload: "Wyślij pliki z Twojego komputera" upload: "Wyślij pliki z Twojego komputera"
@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "Używaj gradientów na pasku tytułu okna" gradient-window-header: "Używaj gradientów na pasku tytułu okna"
post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu" post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "Pokazuj cel odpowiedzi" show-reply-target: "Pokazuj cel odpowiedzi"
show-my-renotes: "Pokazuj moje udostępnienia na osi czasu" show-my-renotes: "Pokazuj moje udostępnienia na osi czasu"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "Listy" lists: "Listy"
follow-requests: "Prośby o śledzenie" follow-requests: "Prośby o śledzenie"
customize: "Dostosuj stronę główną" customize: "Dostosuj stronę główną"
admin: "管理"
settings: "Ustawienia" settings: "Ustawienia"
signout: "Wyloguj się" signout: "Wyloguj się"
dark: "Sprowadź ciemność" dark: "Sprowadź ciemność"
@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Tylko wpisy z zawartością multimedialną" is-media-only: "Tylko wpisy z zawartością multimedialną"
is-media-view: "Widok multimediów" is-media-view: "Widok multimediów"
@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "Udostępniono przez {}" reposted-by: "Udostępniono przez {}"
private: "ten wpis jest prywatny" private: "ten wpis jest prywatny"
deleted: "ten wpis został usunięty" deleted: "ten wpis został usunięty"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "O Misskey" about: "O Misskey"
gotit: "Rozumiem!" gotit: "Rozumiem!"
@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "Gry" game: "Gry"
darkmode: "Tryb ciemny" darkmode: "Tryb ciemny"
settings: "Ustawienia" settings: "Ustawienia"
admin: "管理"
about: "O Misskey" about: "O Misskey"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "Wygląda na to, że ten użytkownik nie opublikował jeszcze niczego" no-notes: "Wygląda na to, że ten użytkownik nie opublikował jeszcze niczego"
@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "Odśwież stronę, aby zastosować aktualizację." update-available-desc: "Odśwież stronę, aby zastosować aktualizację."
settings: "Ustawienia" settings: "Ustawienia"
signout: "Wyloguj" signout: "Wyloguj"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "Śledzi Cię" follows-you: "Śledzi Cię"
following: "Śledzeni" following: "Śledzeni"

View File

@ -58,7 +58,7 @@ common:
friday: "sexta" friday: "sexta"
saturday: "sábado" saturday: "sábado"
reactions: reactions:
like: "Legal..." like: "Curtir"
love: "Amei" love: "Amei"
laugh: "Riso" laugh: "Riso"
hmm: "Hmm...?" hmm: "Hmm...?"
@ -81,9 +81,10 @@ common:
ok: "OK" ok: "OK"
update-available-title: "Atualização disponível" update-available-title: "Atualização disponível"
update-available: "Uma nova versão de Misskey está disponível ({newer}). A versão atual é {current}. Recarregue a página para atualizar." 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: "Eu prefiro sushi a pudim" i-like-sushi: "Eu prefiro sushi a pudim"
show-reversi-board-labels: "Mostrar etiquetas de colunas e linhas no Reversi" show-reversi-board-labels: "Mostrar etiquetas de colunas e linhas no Reversi"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "Conta verificada" verified-user: "Conta verificada"
disable-animated-mfm: "Desativar texto animado nas publicações" disable-animated-mfm: "Desativar texto animado nas publicações"
reversi: reversi:
@ -96,7 +97,7 @@ common:
black: "Pretas" black: "Pretas"
white: "Brancas" white: "Brancas"
total: "Total" total: "Total"
this-turn: "{}ターン目" this-turn: "Turno de {}"
widgets: widgets:
analog-clock: "Relógio analógico" analog-clock: "Relógio analógico"
profile: "Perfil" profile: "Perfil"
@ -105,16 +106,16 @@ common:
activity: "Atividade" activity: "Atividade"
rss: "Leitor de RSS" rss: "Leitor de RSS"
memo: "Nota adesiva" memo: "Nota adesiva"
trends: "トレンド" trends: "Tendências"
photo-stream: "フォトストリーム" photo-stream: "フォトストリーム"
posts-monitor: "投稿チャート" posts-monitor: "Gráfico de publicações"
slideshow: "スライドショー" slideshow: "スライドショー"
version: "Versão" version: "Versão"
broadcast: "ブロードキャスト" broadcast: "ブロードキャスト"
notifications: "Notificações" notifications: "Notificações"
users: "Usuário sugeridos" users: "Usuário sugeridos"
polls: "Enquetes" polls: "Enquetes"
post-form: "投稿フォーム" post-form: "Formulário de publicação"
messaging: "Mensagens" messaging: "Mensagens"
server: "Informações do servidor" server: "Informações do servidor"
donation: "Doações" donation: "Doações"
@ -134,10 +135,10 @@ common:
swap-up: "Mover para cima" swap-up: "Mover para cima"
swap-down: "Mover para baixo" swap-down: "Mover para baixo"
remove: "Remover" remove: "Remover"
add-column: "カラムを追加" add-column: "Adicionar coluna"
rename: "Renomear" rename: "Renomear"
stack-left: "左に重ねる" stack-left: "左に重ねる"
pop-right: "右に出す" pop-right: "Acoplar à direita"
auth/views/form.vue: auth/views/form.vue:
share-access: "Você <b>permite</b> que <i>{{ app.name }}</i> acesse sua conta?" share-access: "Você <b>permite</b> que <i>{{ app.name }}</i> acesse sua conta?"
permission-ask: "Este aplicativo precisa das seguintes permissões:" permission-ask: "Este aplicativo precisa das seguintes permissões:"
@ -150,18 +151,18 @@ auth/views/form.vue:
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: "ゲームの設定"
@ -227,11 +228,11 @@ common/views/components/connect-failed.troubleshooter.vue:
no-server-desc: "お使いのPCのインターネット接続は正常ですが、Misskeyのサーバーには接続できませんでした。サーバーがダウンまたはメンテナンスしている可能性があるので、しばらくしてから再度御アクセスください。" no-server-desc: "お使いのPCのインターネット接続は正常ですが、Misskeyのサーバーには接続できませんでした。サーバーがダウンまたはメンテナンスしている可能性があるので、しばらくしてから再度御アクセスください。"
success: "Misskeyのサーバーに接続できました" success: "Misskeyのサーバーに接続できました"
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。" success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
flush: "キャッシュの削除" flush: "Limpar o cache"
set-version: "バージョン指定" set-version: "バージョン指定"
common/views/components/messaging.vue: common/views/components/messaging.vue:
search-user: "ユーザーを探す" search-user: "ユーザーを探す"
you: "あなた" you: "Você"
no-history: "履歴はありません" no-history: "履歴はありません"
common/views/components/messaging-room.vue: common/views/components/messaging-room.vue:
empty: "このユーザーと話したことはありません" empty: "このユーザーと話したことはありません"
@ -410,6 +411,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました" avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択" choose-avatar: "アバターにする画像を選択"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "Todos os usuários" all-users: "Todos os usuários"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "Todas as notas" 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: "ええやん" like: "いいね"
love: "しゅき" love: "しゅき"
laugh: "笑" laugh: "笑"
hmm: "ふぅ~む" hmm: "ふぅ~む"
@ -84,6 +84,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
@ -410,6 +411,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました" avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択" choose-avatar: "アバターにする画像を選択"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"

View File

@ -58,7 +58,7 @@ common:
friday: "金曜日" friday: "金曜日"
saturday: "土曜日" saturday: "土曜日"
reactions: reactions:
like: "ええやん" like: "いいね"
love: "しゅき" love: "しゅき"
laugh: "笑" laugh: "笑"
hmm: "ふぅ~む" hmm: "ふぅ~む"
@ -84,6 +84,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
@ -410,6 +411,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています" uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました" avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択" choose-avatar: "アバターにする画像を選択"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -423,6 +425,24 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/charts.vue:
title: "チャート"
per-day: "1日ごと"
per-hour: "1時間ごと"
notes: "投稿"
users: "ユーザー"
drive: "ドライブ"
charts:
notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計"
users: "ユーザーの増減"
users-total: "ユーザーの累計"
drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計"
drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
@ -630,6 +650,7 @@ desktop/views/components/settings.vue:
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
@ -754,6 +775,7 @@ desktop/views/components/ui.header.account.vue:
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
customize: "ホームのカスタマイズ" customize: "ホームのカスタマイズ"
admin: "管理"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
dark: "闇に飲まれる" dark: "闇に飲まれる"
@ -799,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
all-notes: "全てのノート" all-notes: "全ての投稿"
original-notes: "このインスタンスのノート" original-notes: "このインスタンスの投稿"
invite: "招待" invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結" suspend-user: "ユーザーの凍結"
@ -818,18 +840,6 @@ desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除" unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する" unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました" unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue: desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
@ -838,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全ての投稿"
original-notes: "このインスタンスの投稿"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."
gotit: "わかった" gotit: "わかった"
@ -1044,6 +1059,7 @@ mobile/views/components/ui.nav.vue:
game: "ゲーム" game: "ゲーム"
darkmode: "ダークモード" darkmode: "ダークモード"
settings: "設定" settings: "設定"
admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
@ -1161,6 +1177,8 @@ mobile/views/pages/settings.vue:
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
sound: "サウンド"
enableSounds: "サウンドを有効にする"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされています"
following: "フォロー" following: "フォロー"

View File

@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "8.0.0", "version": "8.23.0",
"clientVersion": "1.0.8790", "clientVersion": "1.0.9287",
"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",
@ -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,7 @@
"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", "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",
@ -188,11 +190,11 @@
"single-line-log": "1.1.2", "single-line-log": "1.1.2",
"speakeasy": "2.0.0", "speakeasy": "2.0.0",
"stringz": "1.0.0", "stringz": "1.0.0",
"style-loader": "0.22.1", "style-loader": "0.23.0",
"stylus": "0.54.5", "stylus": "0.54.5",
"stylus-loader": "3.0.2", "stylus-loader": "3.0.2",
"summaly": "2.1.4", "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",
@ -206,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.18", "vue-js-modal": "1.3.25",
"vue-json-tree-view": "2.1.4", "vue-json-tree-view": "2.1.4",
"vue-loader": "15.4.0", "vue-loader": "15.4.1",
"vue-router": "3.0.1", "vue-router": "3.0.1",
"vue-style-loader": "4.1.2", "vue-style-loader": "4.1.2",
"vue-template-compiler": "2.5.17", "vue-template-compiler": "2.5.17",

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

@ -80,7 +80,7 @@ export default Vue.extend({
accepted() { accepted() {
this.state = 'accepted'; this.state = 'accepted';
if (this.session.app.callbackUrl) { if (this.session.app.callbackUrl) {
location.href = this.session.app.callbackUrl + '?token=' + this.session.token; location.href = `${this.session.app.callbackUrl}?token=${this.session.token}`;
} }
} }
} }

View File

@ -51,8 +51,9 @@
} }
} }
if (settings) { if (settings && settings.device.lang &&
if (settings.device.lang) lang = settings.device.lang; LANGS.includes(settings.device.lang)) {
lang = settings.device.lang;
} }
//#endregion //#endregion
@ -93,7 +94,7 @@
// Get salt query // Get salt query
const salt = localStorage.getItem('salt') const salt = localStorage.getItem('salt')
? '?salt=' + localStorage.getItem('salt') ? `?salt=${localStorage.getItem('salt')}`
: ''; : '';
// Load an app script // Load an app script

View File

@ -44,11 +44,11 @@ export default class Connection extends EventEmitter {
const query = params const query = params
? Object.keys(params) ? Object.keys(params)
.map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k])) .map(k => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`)
.join('&') .join('&')
: null; : null;
this.socket = new ReconnectingWebsocket(`${wsUrl}/${endpoint}${query ? '?' + query : ''}`); this.socket = new ReconnectingWebsocket(`${wsUrl}/${endpoint}${query ? `?${query}` : ''}`);
this.socket.addEventListener('open', this.onOpen); this.socket.addEventListener('open', this.onOpen);
this.socket.addEventListener('close', this.onClose); this.socket.addEventListener('close', this.onClose);
this.socket.addEventListener('message', this.onMessage); this.socket.addEventListener('message', this.onMessage);

View File

@ -125,7 +125,7 @@ export default Vue.extend({
} }
if (this.type == 'user') { if (this.type == 'user') {
const cacheKey = 'autocomplete:user:' + this.q; const cacheKey = `autocomplete:user:${this.q}`;
const cache = sessionStorage.getItem(cacheKey); const cache = sessionStorage.getItem(cacheKey);
if (cache) { if (cache) {
const users = JSON.parse(cache); const users = JSON.parse(cache);
@ -148,7 +148,7 @@ export default Vue.extend({
this.hashtags = JSON.parse(localStorage.getItem('hashtags') || '[]'); this.hashtags = JSON.parse(localStorage.getItem('hashtags') || '[]');
this.fetching = false; this.fetching = false;
} else { } else {
const cacheKey = 'autocomplete:hashtag:' + this.q; const cacheKey = `autocomplete:hashtag:${this.q}`;
const cache = sessionStorage.getItem(cacheKey); const cache = sessionStorage.getItem(cacheKey);
if (cache) { if (cache) {
const hashtags = JSON.parse(cache); const hashtags = JSON.parse(cache);

View File

@ -57,7 +57,7 @@ export default Vue.extend({
} }
// Check internet connection // Check internet connection
fetch('https://google.com?rand=' + Math.random(), { fetch(`https://google.com?rand=${Math.random()}`, {
mode: 'no-cors' mode: 'no-cors'
}).then(() => { }).then(() => {
this.internet = true; this.internet = true;

View File

@ -159,11 +159,9 @@ export default Vue.extend({
canPutEverywhere: this.game.settings.canPutEverywhere, canPutEverywhere: this.game.settings.canPutEverywhere,
loopedBoard: this.game.settings.loopedBoard loopedBoard: this.game.settings.loopedBoard
}); });
this.logs.forEach((log, i) => { for (const log of this.logs.slice(0, v)) {
if (i < v) { this.o.put(log.color, log.pos);
this.o.put(log.color, log.pos); }
}
});
this.$forceUpdate(); this.$forceUpdate();
} }
}, },

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="mk-menu"> <div class="onchrpzrvnoruiaenfcqvccjfuupzzwv">
<div class="backdrop" ref="backdrop" @click="close"></div> <div class="backdrop" ref="backdrop" @click="close"></div>
<div class="popover" :class="{ hukidasi }" ref="popover"> <div class="popover" :class="{ hukidasi }" ref="popover">
<template v-for="item in items"> <template v-for="item in items">
@ -119,9 +119,10 @@ export default Vue.extend({
<style lang="stylus" scoped> <style lang="stylus" scoped>
@import '~const.styl' @import '~const.styl'
$border-color = rgba(27, 31, 35, 0.15) root(isDark)
$bg-color = isDark ? #2c303c : #fff
$border-color = rgba(27, 31, 35, 0.15)
.mk-menu
position initial position initial
> .backdrop > .backdrop
@ -131,14 +132,14 @@ $border-color = rgba(27, 31, 35, 0.15)
z-index 10000 z-index 10000
width 100% width 100%
height 100% height 100%
background rgba(#000, 0.1) background rgba(#000, isDark ? 0.5 : 0.1)
opacity 0 opacity 0
> .popover > .popover
position absolute position absolute
z-index 10001 z-index 10001
padding 8px 0 padding 8px 0
background #fff background $bg-color
border 1px solid $border-color border 1px solid $border-color
border-radius 4px border-radius 4px
box-shadow 0 3px 12px rgba(27, 31, 35, 0.15) box-shadow 0 3px 12px rgba(27, 31, 35, 0.15)
@ -172,12 +173,13 @@ $border-color = rgba(27, 31, 35, 0.15)
border-top solid $balloon-size transparent border-top solid $balloon-size transparent
border-left solid $balloon-size transparent border-left solid $balloon-size transparent
border-right solid $balloon-size transparent border-right solid $balloon-size transparent
border-bottom solid $balloon-size #fff border-bottom solid $balloon-size $bg-color
> button > button
display block display block
padding 8px 16px padding 8px 16px
width 100% width 100%
color isDark ? #d6dce2 : #111
&:hover &:hover
color $theme-color-foreground color $theme-color-foreground
@ -191,6 +193,12 @@ $border-color = rgba(27, 31, 35, 0.15)
> div > div
margin 8px 0 margin 8px 0
height 1px height 1px
background #eee background isDark ? #1c2023 : #eee
.onchrpzrvnoruiaenfcqvccjfuupzzwv[data-darkmode]
root(true)
.onchrpzrvnoruiaenfcqvccjfuupzzwv:not([data-darkmode])
root(false)
</style> </style>

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

@ -205,17 +205,8 @@ export default Vue.component('misskey-flavored-markdown', {
} }
})); }));
const _els = []; // el.tag === 'br' のとき i !== 0 が保証されるため、短絡評価により els[i - 1] は配列外参照しない
els.forEach((el, i) => { const _els = els.filter((el, i) => !(el.tag === 'br' && ['div', 'pre'].includes(els[i - 1].tag)));
if (el.tag == 'br') {
if (!['div', 'pre'].includes(els[i - 1].tag)) {
_els.push(el);
}
} else {
_els.push(el);
}
});
return createElement('span', _els); return createElement('span', _els);
} }
}); });

View File

@ -26,8 +26,8 @@ export default Vue.extend({
}, },
created() { created() {
(this as any).os.getMeta().then(meta => { (this as any).os.getMeta().then(meta => {
if (meta.repositoryUrl) this.repositoryUrl = meta.repositoryUrl; if (meta.maintainer.repository_url) this.repositoryUrl = meta.maintainer.repository_url;
if (meta.feedbackUrl) this.feedbackUrl = meta.feedbackUrl; if (meta.maintainer.feedback_url) this.feedbackUrl = meta.maintainer.feedback_url;
}); });
} }
}); });

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

@ -78,7 +78,7 @@ export default Vue.extend({
cursor wait !important cursor wait !important
> .avatar > .avatar
margin 16px auto 0 auto margin 0 auto 0 auto
width 64px width 64px
height 64px height 64px
background #ddd background #ddd

View File

@ -8,7 +8,7 @@
</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>
@ -28,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,
@ -57,6 +144,7 @@ export default Vue.extend({
misskeyUrl misskeyUrl
}; };
}, },
created() { created() {
const url = new URL(this.url); const url = new URL(this.url);
@ -81,102 +169,27 @@ 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>
.twitter .player
position relative position relative
width 100% width 100%
@ -286,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

@ -12,6 +12,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { toUnicode as decodePunycode } from 'punycode';
export default Vue.extend({ export default Vue.extend({
props: ['url', 'target'], props: ['url', 'target'],
data() { data() {
@ -27,11 +28,11 @@ export default Vue.extend({
created() { created() {
const url = new URL(this.url); const url = new URL(this.url);
this.schema = url.protocol; this.schema = url.protocol;
this.hostname = url.hostname; this.hostname = decodePunycode(url.hostname);
this.port = url.port; this.port = url.port;
this.pathname = url.pathname; this.pathname = decodeURIComponent(url.pathname);
this.query = url.search; this.query = decodeURIComponent(url.search);
this.hash = url.hash; this.hash = decodeURIComponent(url.hash);
} }
}); });
</script> </script>

View File

@ -191,7 +191,7 @@ class Autocomplete {
const acct = renderAcct(value); const acct = renderAcct(value);
// 挿入 // 挿入
this.text = trimmedBefore + '@' + acct + ' ' + after; this.text = `${trimmedBefore}@${acct} ${after}`;
// キャレットを戻す // キャレットを戻す
this.vm.$nextTick(() => { this.vm.$nextTick(() => {
@ -207,7 +207,7 @@ class Autocomplete {
const after = source.substr(caret); const after = source.substr(caret);
// 挿入 // 挿入
this.text = trimmedBefore + '#' + value + ' ' + after; this.text = `${trimmedBefore}#${value} ${after}`;
// キャレットを戻す // キャレットを戻す
this.vm.$nextTick(() => { this.vm.$nextTick(() => {

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

@ -1,5 +1,5 @@
import Vue from 'vue'; import Vue from 'vue';
Vue.filter('notePage', note => { Vue.filter('notePage', note => {
return '/notes/' + note.id; return `/notes/${note.id}`;
}); });

View File

@ -11,5 +11,5 @@ Vue.filter('userName', user => {
}); });
Vue.filter('userPage', (user, path?) => { Vue.filter('userPage', (user, path?) => {
return '/@' + Vue.filter('acct')(user) + (path ? '/' + path : ''); return `/@${Vue.filter('acct')(user)}${(path ? `/${path}` : '')}`;
}); });

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="syxhndwprovvuqhmyvveewmbqayniwkv" v-if="!fetching" :data-darkmode="$store.state.device.darkmode"> <div class="syxhndwprovvuqhmyvveewmbqayniwkv" v-if="!fetching" :data-darkmode="$store.state.device.darkmode">
<div class="signed-in-as" v-html="'%i18n:@signed-in-as%'.replace('{}', '<b>' + myName + '</b>')"></div> <div class="signed-in-as" v-html="'%i18n:@signed-in-as%'.replace('{}', `<b>${myName}`)"></div>
<main> <main>
<div class="banner" :style="bannerStyle"></div> <div class="banner" :style="bannerStyle"></div>

View File

@ -42,15 +42,7 @@ export default define({
}, },
mounted() { mounted() {
(this as any).os.getMeta().then(meta => { (this as any).os.getMeta().then(meta => {
let broadcasts = []; this.broadcasts = meta.broadcasts;
if (meta.broadcasts) {
meta.broadcasts.forEach(broadcast => {
if (broadcast[lang]) {
broadcasts.push(broadcast[lang]);
}
});
}
this.broadcasts = broadcasts;
this.fetching = false; this.fetching = false;
}); });
}, },

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

@ -4,6 +4,7 @@ declare const _THEME_COLOR_: string;
declare const _COPYRIGHT_: string; declare const _COPYRIGHT_: string;
declare const _VERSION_: string; declare const _VERSION_: string;
declare const _CODENAME_: string; declare const _CODENAME_: string;
declare const _ENV_: string;
const address = new URL(location.href); const address = new URL(location.href);
@ -18,3 +19,4 @@ export const themeColor = _THEME_COLOR_;
export const copyright = _COPYRIGHT_; export const copyright = _COPYRIGHT_;
export const version = _VERSION_; export const version = _VERSION_;
export const codename = _CODENAME_; export const codename = _CODENAME_;
export const env = _ENV_;

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

@ -163,7 +163,7 @@ export default Vue.extend({
}); });
break; break;
default: default:
alert('%i18n:@unhandled-error% ' + err); alert(`%i18n:@unhandled-error% ${err}`);
} }
}); });
} }

View File

@ -323,7 +323,7 @@ export default Vue.extend({
}); });
break; break;
default: default:
alert('%i18n:@unhandled-error% ' + err); alert(`%i18n:@unhandled-error% ${err}`);
} }
}); });
} }
@ -404,7 +404,7 @@ export default Vue.extend({
folder: folder folder: folder
}); });
} else { } else {
window.open(url + '/i/drive/folder/' + folder.id, window.open(`${url}/i/drive/folder/${folder.id}`,
'drive_window', 'drive_window',
'height=500, width=800'); 'height=500, width=800');
} }

View File

@ -48,7 +48,7 @@ export default Vue.extend({
const mouseY = e.clientY - rect.top; const mouseY = e.clientY - rect.top;
const xp = mouseX / this.$el.offsetWidth * 100; const xp = mouseX / this.$el.offsetWidth * 100;
const yp = mouseY / this.$el.offsetHeight * 100; const yp = mouseY / this.$el.offsetHeight * 100;
this.$el.style.backgroundPosition = xp + '% ' + yp + '%'; this.$el.style.backgroundPosition = `${xp}% ${yp}%`;
this.$el.style.backgroundImage = `url("${this.image.url}")`; this.$el.style.backgroundImage = `url("${this.image.url}")`;
}, },

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

@ -35,7 +35,7 @@
<button class="upload" title="%i18n:@attach-media-from-local%" @click="chooseFile">%fa:upload%</button> <button class="upload" title="%i18n:@attach-media-from-local%" @click="chooseFile">%fa:upload%</button>
<button class="drive" title="%i18n:@attach-media-from-drive%" @click="chooseFileFromDrive">%fa:cloud%</button> <button class="drive" title="%i18n:@attach-media-from-drive%" @click="chooseFileFromDrive">%fa:cloud%</button>
<button class="kao" title="%i18n:@insert-a-kao%" @click="kao">%fa:R smile%</button> <button class="kao" title="%i18n:@insert-a-kao%" @click="kao">%fa:R smile%</button>
<button class="poll" title="%i18n:@create-poll%" @click="poll = true">%fa:chart-pie%</button> <button class="poll" title="%i18n:@create-poll%" @click="poll = !poll">%fa:chart-pie%</button>
<button class="poll" title="%i18n:@hide-contents%" @click="useCw = !useCw">%fa:eye-slash%</button> <button class="poll" title="%i18n:@hide-contents%" @click="useCw = !useCw">%fa:eye-slash%</button>
<button class="geo" title="%i18n:@attach-location-information%" @click="geo ? removeGeo() : setGeo()">%fa:map-marker-alt%</button> <button class="geo" title="%i18n:@attach-location-information%" @click="geo ? removeGeo() : setGeo()">%fa:map-marker-alt%</button>
<button class="visibility" title="%i18n:@visibility%" @click="setVisibility" ref="visibilityButton"> <button class="visibility" title="%i18n:@visibility%" @click="setVisibility" ref="visibilityButton">
@ -110,9 +110,9 @@ export default Vue.extend({
computed: { computed: {
draftId(): string { draftId(): string {
return this.renote return this.renote
? 'renote:' + this.renote.id ? `renote:${this.renote.id}`
: this.reply : this.reply
? 'reply:' + this.reply.id ? `reply:${this.reply.id}`
: 'note'; : 'note';
}, },
@ -313,7 +313,7 @@ export default Vue.extend({
this.geo = pos.coords; this.geo = pos.coords;
this.$emit('geo-attached', this.geo); this.$emit('geo-attached', this.geo);
}, err => { }, err => {
alert('%i18n:@error%: ' + err.message); alert(`%i18n:@error%: ${err.message}`);
}, { }, {
enableHighAccuracy: true enableHighAccuracy: true
}); });

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%"/>
@ -333,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',

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

@ -0,0 +1,41 @@
<template>
<div class="qldxjjsrseehkusjuoooapmsprvfrxyl mk-admin-card">
<header>%i18n:@announcements%</header>
<textarea v-model="broadcasts"></textarea>
<button class="ui" @click="save">%i18n:@save%</button>
</div>
</template>
<script lang="ts">
import Vue from "vue";
export default Vue.extend({
data() {
return {
broadcasts: '',
};
},
created() {
(this as any).os.getMeta().then(meta => {
this.broadcasts = JSON.stringify(meta.broadcasts, null, ' ');
});
},
methods: {
save() {
(this as any).api('admin/update-meta', {
broadcasts: JSON.parse(this.broadcasts)
});
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
.qldxjjsrseehkusjuoooapmsprvfrxyl
textarea
width 100%
min-height 300px
</style>

View File

@ -1,11 +1,11 @@
<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"/>

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

@ -4,6 +4,7 @@
<ul> <ul>
<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }">%fa:chalkboard .fw%%i18n:@dashboard%</li> <li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }">%fa:chalkboard .fw%%i18n:@dashboard%</li>
<li @click="nav('users')" :class="{ active: page == 'users' }">%fa:users .fw%%i18n:@users%</li> <li @click="nav('users')" :class="{ active: page == 'users' }">%fa:users .fw%%i18n:@users%</li>
<li @click="nav('announcements')" :class="{ active: page == 'announcements' }">%fa:broadcast-tower .fw%%i18n:@announcements%</li>
<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:@drive%</li> --> <!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:@drive%</li> -->
<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> --> <!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> -->
</ul> </ul>
@ -11,9 +12,10 @@
<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"/> </div>
<x-drive-chart :chart="chart"/> <div v-show="page == 'announcements'">
<x-announcements/>
</div> </div>
<div v-if="page == 'users'"> <div v-if="page == 'users'">
<x-suspend-user/> <x-suspend-user/>
@ -30,36 +32,28 @@
<script lang="ts"> <script lang="ts">
import Vue from "vue"; import Vue from "vue";
import XDashboard from "./admin.dashboard.vue"; import XDashboard from "./admin.dashboard.vue";
import XAnnouncements from "./admin.announcements.vue";
import XSuspendUser from "./admin.suspend-user.vue"; 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: {
XDashboard, XDashboard,
XAnnouncements,
XSuspendUser, XSuspendUser,
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 +109,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

@ -31,7 +31,7 @@ export default Vue.extend({
const title = folder.name + ' | %i18n:@title%'; const title = folder.name + ' | %i18n:@title%';
// Rewrite URL // Rewrite URL
history.pushState(null, title, '/i/drive/folder/' + folder.id); history.pushState(null, title, `/i/drive/folder/${folder.id}`);
document.title = title; document.title = title;
} }

View File

@ -16,10 +16,10 @@ export default Vue.extend({
methods: { methods: {
nav(game, actualNav) { nav(game, actualNav) {
if (actualNav) { if (actualNav) {
this.$router.push('/reversi/' + game.id); this.$router.push(`/reversi/${game.id}`);
} else { } else {
// TODO: https://github.com/vuejs/vue-router/issues/703 // TODO: https://github.com/vuejs/vue-router/issues/703
this.$router.push('/reversi/' + game.id); this.$router.push(`/reversi/${game.id}`);
} }
} }
} }

View File

@ -46,7 +46,7 @@ export default Vue.extend({
this.user = user; this.user = user;
this.fetching = false; this.fetching = false;
document.title = 'メッセージ: ' + getUserName(this.user); document.title = `メッセージ: ${getUserName(this.user)}`;
Progress.done(); Progress.done();
}); });

View File

@ -16,7 +16,7 @@ import Vue from 'vue';
export default Vue.extend({ export default Vue.extend({
data() { data() {
return { return {
name: (this as any).os.instanceName, name: null,
posted: false, posted: false,
text: new URLSearchParams(location.search).get('text') text: new URLSearchParams(location.search).get('text')
}; };
@ -25,6 +25,11 @@ export default Vue.extend({
close() { close() {
window.close(); window.close();
} }
},
mounted() {
(this as any).os.getMeta().then(meta => {
this.name = meta.name;
});
} }
}); });
</script> </script>

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

@ -1,45 +1,60 @@
<template> <template>
<div class="mk-welcome"> <div class="mk-welcome">
<img ref="pointer" class="pointer" src="/assets/pointer.png" alt="">
<button @click="dark"> <button @click="dark">
<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>
<mk-forkit class="forkit"/>
<div class="body"> <div class="body">
<div class="container"> <div class="main">
<h1 v-if="name != 'Misskey'">{{ name }}</h1>
<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1>
<div class="info"> <div class="info">
<span><b>{{ host }}</b></span> <span><b>{{ host }}</b> - <span v-html="'%i18n:@powered-by-misskey%'"></span></span>
<span class="stats" v-if="stats"> <span class="stats" v-if="stats">
<span>%fa:user% {{ stats.originalUsersCount | number }}</span> <span>%fa:user% {{ stats.originalUsersCount | number }}</span>
<span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span> <span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span>
</span> </span>
</div> </div>
<main>
<div class="about"> <p class="desc" v-html="description || '%i18n:common.about%'"></p>
<h1 v-if="name != 'Misskey'">{{ name }}</h1>
<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1> <p class="sign">
<p class="powerd-by" v-if="name != 'Misskey'" v-html="'%i18n:@powered-by-misskey%'"></p> <span class="signup" @click="signup">%i18n:@signup%</span>
<p class="desc" v-html="description || '%i18n:common.about%'"></p> <span class="divider">|</span>
<a ref="signup" @click="signup">📦 %i18n:@signup%</a> <span class="signin" @click="signin">%i18n:@signin%</span>
</div> </p>
<div class="login">
<mk-signin/>
</div>
</main>
<div class="hashtags"> <div class="hashtags">
<router-link v-for="tag in tags" :key="tag" :to="`/tags/${ tag }`" :title="tag">#{{ tag }}</router-link> <router-link v-for="tag in tags" :key="tag" :to="`/tags/${ tag }`" :title="tag">#{{ tag }}</router-link>
</div> </div>
</div>
<div class="broadcasts">
<div v-for="broadcast in broadcasts">
<h1 v-html="broadcast.title"></h1>
<div v-html="broadcast.text"></div>
</div>
</div>
<div class="nav">
<mk-nav class="nav"/> <mk-nav class="nav"/>
</div> </div>
<mk-forkit class="forkit"/>
<img src="assets/title.dark.svg" :alt="name"> <mk-welcome-timeline class="tl" :max="20"/>
</div> </div>
<div class="tl">
<mk-welcome-timeline :max="20"/> <modal name="signup" :class="$store.state.device.darkmode ? 'modal-dark' : 'modal-light'" width="450px" height="auto" scrollable>
</div> <header class="formHeader">%i18n:@signup%</header>
<modal name="signup" width="500px" height="auto" scrollable> <mk-signup class="form"/>
<header :class="$style.signupFormHeader">%i18n:@signup%</header> </modal>
<mk-signup :class="$style.signupForm"/>
<modal name="signin" :class="$store.state.device.darkmode ? 'modal-dark' : 'modal-light'" width="450px" height="auto" scrollable>
<header class="formHeader">%i18n:@signin%</header>
<mk-signin class="form"/>
</modal> </modal>
</div> </div>
</template> </template>
@ -56,7 +71,7 @@ export default Vue.extend({
host, host,
name: 'Misskey', name: 'Misskey',
description: '', description: '',
pointerInterval: null, broadcasts: [],
tags: [] tags: []
}; };
}, },
@ -64,6 +79,7 @@ export default Vue.extend({
(this as any).os.getMeta().then(meta => { (this as any).os.getMeta().then(meta => {
this.name = meta.name; this.name = meta.name;
this.description = meta.description; this.description = meta.description;
this.broadcasts = meta.broadcasts;
}); });
(this as any).api('stats').then(stats => { (this as any).api('stats').then(stats => {
@ -74,19 +90,7 @@ export default Vue.extend({
this.tags = stats.map(x => x.tag); this.tags = stats.map(x => x.tag);
}); });
}, },
mounted() {
this.point();
this.pointerInterval = setInterval(this.point, 100);
},
beforeDestroy() {
clearInterval(this.pointerInterval);
},
methods: { methods: {
point() {
const x = this.$refs.signup.getBoundingClientRect();
this.$refs.pointer.style.top = x.top + x.height + 'px';
this.$refs.pointer.style.left = x.left + 'px';
},
signup() { signup() {
this.$modal.show('signup'); this.$modal.show('signup');
}, },
@ -103,11 +107,40 @@ export default Vue.extend({
}); });
</script> </script>
<style> <style lang="stylus">
#wait { #wait
right: auto; right auto
left: 15px; left 15px
}
.v--modal-overlay
background rgba(0, 0, 0, 0.4)
.modal-light
.v--modal-box
color #777
.formHeader
border-bottom solid 1px #eee
.modal-dark
.v--modal-box
background #313543
color #fff
.formHeader
border-bottom solid 1px rgba(#000, 0.2)
.modal-light
.modal-dark
.form
padding 24px 48px 48px 48px
.formHeader
text-align center
padding 48px 0 12px 0
margin 0 48px
font-size 1.5em
</style> </style>
<style lang="stylus" scoped> <style lang="stylus" scoped>
@ -116,122 +149,85 @@ export default Vue.extend({
root(isDark) root(isDark)
display flex display flex
min-height 100vh min-height 100vh
//background-color #00070F
//background-image url('/assets/bg.jpg')
//background-position center
//background-size cover
> .pointer > .forkit
display block
position absolute position absolute
z-index 1
top 0 top 0
right 0 right 0
width 180px
margin 0 0 0 -180px
transform rotateY(180deg) translateX(-10px) translateY(-48px)
pointer-events none
> button > button
position fixed position fixed
z-index 1 z-index 1
top 0 bottom 64px
left 0 left 64px
padding 16px padding 16px
font-size 18px font-size 18px
color #fff color isDark ? #fff : #444
display none // TODO
> .body > .body
flex 1 display grid
padding 64px 0 0 0 grid-template-rows 0.5fr 0.5fr 64px
text-align center grid-template-columns 1fr 350px
background #578394 gap 16px
background-position center width 100%
background-size cover max-width 1200px
height 100vh
margin 0 auto
padding 64px
&:before > *
content '' color isDark ? #fff : #444
display block background isDark ? #313543 : #fff
position absolute box-shadow 0 3px 8px rgba(0, 0, 0, 0.2)
top 0 //border-radius 8px
left 0 overflow auto
right 0
bottom 0
background rgba(#000, 0.5)
> .forkit > .main
position absolute grid-row 1
top 0 grid-column 1
right 0 padding 32px
> img > h1
position absolute margin 0
bottom 16px
right 16px
width 150px
> .container > img
$aboutWidth = 380px margin -8px 0 0 -16px
$loginWidth = 340px max-width 280px
$width = $aboutWidth + $loginWidth
> .info > .info
margin 0 auto 16px auto margin 0 auto 16px auto
width $width width $width
font-size 14px font-size 14px
color #fff
> .stats > .stats
margin-left 16px margin-left 16px
padding-left 16px padding-left 16px
border-left solid 1px #fff border-left solid 1px isDark ? #fff : #444
> * > *
margin-right 16px margin-right 16px
> main > .sign
display flex font-size 120%
margin auto
width $width
border-radius 8px
overflow hidden
box-shadow 0 2px 8px rgba(#000, 0.3)
> .about > .divider
width $aboutWidth margin 0 16px
color #444
background #fff
> h1 > .signin
margin 0 0 16px 0 > .signup
padding 32px 32px 0 32px cursor pointer
color #444
> img &:hover
width 170px color $theme-color
vertical-align bottom
> .powerd-by
margin 16px
opacity 0.7
> .desc
margin 0
padding 0 32px 16px 32px
> a
display inline-block
margin 0 0 32px 0
font-weight bold
> .login
width $loginWidth
padding 16px 32px 32px 32px
background isDark ? #2e3440 : #f5f5f5
> .hashtags > .hashtags
margin 16px auto margin 16px auto
width $width width $width
font-size 14px font-size 14px
color #fff
background rgba(#000, 0.3) background rgba(#000, 0.3)
border-radius 8px border-radius 8px
@ -239,20 +235,32 @@ root(isDark)
display inline-block display inline-block
margin 14px margin 14px
> .nav > .broadcasts
display block grid-row 2
margin 16px 0 grid-column 1
font-size 14px padding 32px
color #fff
> .tl > div
margin 0 padding 0 0 16px 0
width 410px margin 0 0 16px 0
height 100vh border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05)
text-align left
background isDark ? #313543 : #fff
> * > h1
margin 0
font-size 1.5em
> .nav
display flex
justify-content center
align-items center
grid-row 3
grid-column 1
font-size 14px
> .tl
grid-row 1 / 4
grid-column 2
text-align left
max-height 100% max-height 100%
overflow auto overflow auto
@ -263,29 +271,3 @@ root(isDark)
root(false) root(false)
</style> </style>
<style lang="stylus" module>
.signupForm
padding 24px 48px 48px 48px
.signupFormHeader
padding 48px 0 12px 0
margin: 0 48px
font-size 1.5em
color #777
border-bottom solid 1px #eee
.signinForm
padding 24px 48px 48px 48px
.signinFormHeader
padding 48px 0 12px 0
margin: 0 48px
font-size 1.5em
color #777
border-bottom solid 1px #eee
.nav
a
color #666
</style>

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

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

@ -1,12 +1,12 @@
<template> <template>
<div class="mk-drive-file-chooser"> <div class="cdxzvcfawjxdyxsekbxbfgtplebnoneb">
<div class="body"> <div class="body">
<header> <header>
<h1>%i18n:@select-file%<span class="count" v-if="files.length > 0">({{ files.length }})</span></h1> <h1>%i18n:@select-file%<span class="count" v-if="files.length > 0">({{ files.length }})</span></h1>
<button class="close" @click="cancel">%fa:times%</button> <button class="close" @click="cancel">%fa:times%</button>
<button v-if="multiple" class="ok" @click="ok">%fa:check%</button> <button v-if="multiple" class="ok" @click="ok">%fa:check%</button>
</header> </header>
<mk-drive ref="browser" <mk-drive class="drive" ref="browser"
:select-file="true" :select-file="true"
:multiple="multiple" :multiple="multiple"
@change-selection="onChangeSelection" @change-selection="onChangeSelection"
@ -46,9 +46,9 @@ export default Vue.extend({
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
.mk-drive-file-chooser root(isDark)
position fixed position fixed
z-index 2048 z-index 20000
top 0 top 0
left 0 left 0
width 100% width 100%
@ -59,10 +59,11 @@ export default Vue.extend({
> .body > .body
width 100% width 100%
height 100% height 100%
background #fff background isDark ? #282c37 : #fff
> header > header
border-bottom solid 1px #eee border-bottom solid 1px isDark ? #1b1f29 : #eee
color isDark ? #fff : #111
> h1 > h1
margin 0 margin 0
@ -90,9 +91,15 @@ export default Vue.extend({
line-height 42px line-height 42px
width 42px width 42px
> .mk-drive > .drive
height calc(100% - 42px) height calc(100% - 42px)
overflow scroll overflow scroll
-webkit-overflow-scrolling touch -webkit-overflow-scrolling touch
.cdxzvcfawjxdyxsekbxbfgtplebnoneb[data-darkmode]
root(true)
.cdxzvcfawjxdyxsekbxbfgtplebnoneb:not([data-darkmode])
root(false)
</style> </style>

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

@ -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"/>
@ -471,10 +471,6 @@ root(isDark)
&.reacted &.reacted
color $theme-color color $theme-color
&.menu
@media (max-width 350px)
display none
.note[data-darkmode] .note[data-darkmode]
root(true) root(true)

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

@ -105,9 +105,9 @@ export default Vue.extend({
computed: { computed: {
draftId(): string { draftId(): string {
return this.renote return this.renote
? 'renote:' + this.renote.id ? `renote:${this.renote.id}`
: this.reply : this.reply
? 'reply:' + this.reply.id ? `reply:${this.reply.id}`
: 'note'; : 'note';
}, },
@ -170,6 +170,8 @@ export default Vue.extend({
}); });
} }
this.focus();
this.$nextTick(() => { this.$nextTick(() => {
this.focus(); this.focus();
}); });
@ -227,7 +229,7 @@ export default Vue.extend({
navigator.geolocation.getCurrentPosition(pos => { navigator.geolocation.getCurrentPosition(pos => {
this.geo = pos.coords; this.geo = pos.coords;
}, err => { }, err => {
alert('%i18n:@error%: ' + err.message); alert(`%i18n:@error%: ${err.message}`);
}, { }, {
enableHighAccuracy: true enableHighAccuracy: true
}); });
@ -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>
@ -20,6 +21,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import * as anime from 'animejs'; import * as anime from 'animejs';
import { env } from '../../../config';
export default Vue.extend({ export default Vue.extend({
props: ['func'], props: ['func'],
@ -27,7 +29,8 @@ export default Vue.extend({
return { return {
hasGameInvitation: false, hasGameInvitation: false,
connection: null, connection: null,
connectionId: null connectionId: null,
env: env
}; };
}, },
computed: { computed: {
@ -39,7 +42,7 @@ export default Vue.extend({
} }
}, },
mounted() { mounted() {
this.$store.commit('setUiHeaderHeight', 48); this.$store.commit('setUiHeaderHeight', this.$refs.root.offsetHeight);
if (this.$store.getters.isSignedIn) { if (this.$store.getters.isSignedIn) {
this.connection = (this as any).os.stream.getConnection(); this.connection = (this as any).os.stream.getConnection();
@ -133,6 +136,15 @@ root(isDark)
height 3px height 3px
background $theme-color background $theme-color
> .warn
display block
margin 0
padding 4px
text-align center
font-size 12px
background #f00
color #fff
> .main > .main
color rgba(#fff, 0.9) color rgba(#fff, 0.9)

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