Compare commits

...

649 Commits

Author SHA1 Message Date
16ad232c40 10.23.0 2018-10-19 07:06:41 +09:00
4d235a2be5 Merge pull request #2931 from syuilo/l10n_develop
New Crowdin translations
2018-10-19 07:05:44 +09:00
aadf6fa9b1 UI整理 2018-10-19 07:03:29 +09:00
a72e9bc8b2 New translations ja-JP.yml (English) 2018-10-19 07:02:12 +09:00
f11ef93a81 🎨 2018-10-19 06:57:57 +09:00
9136556218 New translations ja-JP.yml (Norwegian) 2018-10-19 06:52:58 +09:00
3ead008295 New translations ja-JP.yml (Dutch) 2018-10-19 06:52:54 +09:00
9ff5693442 New translations ja-JP.yml (Japanese, Kansai) 2018-10-19 06:52:48 +09:00
ac84b42394 New translations ja-JP.yml (Spanish) 2018-10-19 06:52:44 +09:00
a79361c71f New translations ja-JP.yml (Russian) 2018-10-19 06:52:38 +09:00
85e17d5dc7 New translations ja-JP.yml (Portuguese) 2018-10-19 06:52:35 +09:00
45493fd093 New translations ja-JP.yml (Polish) 2018-10-19 06:52:29 +09:00
6f987a2391 New translations ja-JP.yml (Korean) 2018-10-19 06:52:24 +09:00
ddf785a393 New translations ja-JP.yml (Italian) 2018-10-19 06:52:18 +09:00
b8e20fe717 New translations ja-JP.yml (German) 2018-10-19 06:52:15 +09:00
82555bf9b6 New translations ja-JP.yml (French) 2018-10-19 06:52:11 +09:00
ffe6f6c168 New translations ja-JP.yml (English) 2018-10-19 06:52:05 +09:00
6b11f5bb7d New translations ja-JP.yml (Chinese Simplified) 2018-10-19 06:52:01 +09:00
1a65d14864 New translations ja-JP.yml (Catalan) 2018-10-19 06:51:57 +09:00
6c1f1ffdb1 デッキのカラムを左揃えか中央揃えか選べるように 2018-10-19 06:47:55 +09:00
61cdbd5dd2 New translations ja-JP.yml (English) 2018-10-19 06:41:45 +09:00
e7e321e2b3 fix(package): update vue-sweetalert2 to version 1.5.6 (#2932) 2018-10-19 06:38:46 +09:00
fb5f6fdc10 未読の投稿をすべて既読にできるように 2018-10-19 06:36:59 +09:00
00290fbf75 Fix bug 2018-10-19 06:29:25 +09:00
ff02dc723b 🎨 2018-10-19 06:24:15 +09:00
67521c0d2a New translations ja-JP.yml (Norwegian) 2018-10-19 06:23:12 +09:00
da8765150b New translations ja-JP.yml (Dutch) 2018-10-19 06:23:06 +09:00
ea7f51bc12 New translations ja-JP.yml (Japanese, Kansai) 2018-10-19 06:23:02 +09:00
1b34b3b7e2 New translations ja-JP.yml (Spanish) 2018-10-19 06:22:59 +09:00
bca4ceb7ae New translations ja-JP.yml (Russian) 2018-10-19 06:22:53 +09:00
5648cd53d0 New translations ja-JP.yml (Portuguese) 2018-10-19 06:22:49 +09:00
8dab37539f New translations ja-JP.yml (Polish) 2018-10-19 06:22:45 +09:00
2dd42c0061 New translations ja-JP.yml (Korean) 2018-10-19 06:22:39 +09:00
dfafed504a New translations ja-JP.yml (Italian) 2018-10-19 06:22:35 +09:00
9fcd2bcb0a New translations ja-JP.yml (German) 2018-10-19 06:22:29 +09:00
4c701b91a6 New translations ja-JP.yml (French) 2018-10-19 06:22:25 +09:00
84f7aa6d09 New translations ja-JP.yml (English) 2018-10-19 06:22:21 +09:00
82f0c64dee New translations ja-JP.yml (Chinese Simplified) 2018-10-19 06:22:18 +09:00
4b7c6b124b New translations ja-JP.yml (Catalan) 2018-10-19 06:22:14 +09:00
e043b678d4 i18n 2018-10-19 06:21:11 +09:00
fef4f7fce8 #2930 (#2933)
* wip

* wip

* Clean up

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* 🎨

* wip

* wip
2018-10-19 06:18:33 +09:00
9732b3521a New translations ja-JP.yml (French) 2018-10-18 07:13:01 +09:00
a59fcc4aec New translations ja-JP.yml (French) 2018-10-18 07:03:14 +09:00
979e1e78fb New translations ja-JP.yml (French) 2018-10-18 06:51:20 +09:00
c1a929022f Merge pull request #2929 from syuilo/l10n_develop
New Crowdin translations
2018-10-18 05:15:59 +09:00
611bb81032 Merge pull request #2928 from syuilo/greenkeeper/webpack-4.21.0
Update webpack to the latest version 🚀
2018-10-18 05:15:43 +09:00
5047020e6d New translations ja-JP.yml (German) 2018-10-18 05:12:23 +09:00
fb74a6a689 New translations ja-JP.yml (German) 2018-10-18 05:03:26 +09:00
a14a216c8d New translations ja-JP.yml (English) 2018-10-18 05:03:19 +09:00
549e212a59 New translations ja-JP.yml (English) 2018-10-18 04:52:34 +09:00
1bdc91ad47 New translations ja-JP.yml (German) 2018-10-18 04:42:28 +09:00
67f288479c New translations ja-JP.yml (English) 2018-10-18 04:42:22 +09:00
496e45c2bb New translations ja-JP.yml (German) 2018-10-18 04:32:18 +09:00
e458bd3cc7 New translations ja-JP.yml (English) 2018-10-18 04:32:12 +09:00
031911c463 New translations ja-JP.yml (German) 2018-10-18 04:21:47 +09:00
4aa7f638f9 New translations ja-JP.yml (German) 2018-10-18 04:20:03 +09:00
f6f4ea69ae fix(package): update webpack to version 4.21.0 2018-10-17 17:54:09 +00:00
ef945597f2 Merge pull request #2926 from syuilo/l10n_develop
New Crowdin translations
2018-10-17 22:43:47 +09:00
3ab4e1d368 fix(package): update showdown to version 1.8.7 (#2925) 2018-10-17 22:43:23 +09:00
c6216f5b5f fix(package): update @types/elasticsearch to version 5.0.28 (#2924) 2018-10-17 22:43:04 +09:00
4f24d58a79 Make clear elasticsearch is required and not optional for the search to work (#2927) 2018-10-17 22:42:45 +09:00
73d6e7ba66 New translations ja-JP.yml (Japanese, Kansai) 2018-10-17 13:21:23 +09:00
949707e18e New translations ja-JP.yml (Japanese, Kansai) 2018-10-17 13:12:49 +09:00
f51b299c17 10.22.1 2018-10-17 05:54:52 +09:00
d2e0faa533 Disable secure cookie 2018-10-17 05:54:31 +09:00
22015044a5 10.22.0 2018-10-17 04:17:19 +09:00
61f86dcb2b Resolve #2923
Allow option to disable sending HSTS headers even if https:// is used in url
2018-10-17 04:15:41 +09:00
8f3bce6b11 Add some messaging API tests 2018-10-17 04:01:13 +09:00
ee736e73a9 Merge pull request #2922 from syuilo/greenkeeper/reconnecting-websocket-4.1.9
Update reconnecting-websocket to the latest version 🚀
2018-10-17 03:54:08 +09:00
99f867897e fix(package): update reconnecting-websocket to version 4.1.9 2018-10-16 18:53:19 +00:00
c66c5b6e75 Fix bug 2018-10-17 03:47:32 +09:00
f25ecc19b9 🎨 2018-10-17 03:41:55 +09:00
48e09970f3 Merge pull request #2921 from syuilo/l10n_develop
New Crowdin translations
2018-10-16 22:46:43 +09:00
f05cb79604 10.21.3 2018-10-16 22:26:43 +09:00
46d3293edd Fix #2920 2018-10-16 22:21:08 +09:00
9703d613cf 10.21.2 2018-10-16 20:59:49 +09:00
704e217dbb オブジェクトストレージのURLに拡張子を含めるように 2018-10-16 20:59:36 +09:00
a103032d94 10.21.1 2018-10-16 20:34:32 +09:00
c7207a4bd7 Fix #2919 2018-10-16 20:33:13 +09:00
35c65fe589 Clean up 2018-10-16 20:29:35 +09:00
6d5bd0c484 10.21.0 2018-10-16 20:19:55 +09:00
cfbb6e8092 オブジェクトストレージのURLにファイル名を含めるのを廃止 2018-10-16 20:14:06 +09:00
feef4a933e Update src/tools/clean-remote-files.ts 2018-10-16 20:10:46 +09:00
468bc67569 Improve test 2018-10-16 19:52:14 +09:00
0d517fa52f Greenkeeper/monorepo.fortawesome 5.4.1 (#2917)
* fix(package): update @fortawesome/fontawesome-svg-core to version 1.2.6

Closes #2861

* fix(package): update @fortawesome/free-regular-svg-icons to version 5.4.1

Closes #2861

* fix(package): update @fortawesome/free-solid-svg-icons to version 5.4.1

Closes #2861
2018-10-16 12:28:45 +09:00
d9054367c1 fix(package): update @fortawesome/free-brands-svg-icons to version 5.4.1 (#2916)
Closes #2859
2018-10-16 12:27:03 +09:00
1213373027 Use cache with RSS (#2915) 2018-10-16 12:24:54 +09:00
100a525507 Update autogen.sh (#2914)
refs: 8b98c08a81 (commitcomment-30911933)
2018-10-16 11:45:11 +09:00
1bec4e2d12 10.20.0 2018-10-16 11:44:35 +09:00
03cd1d27bf New Crowdin translations (#2910)
* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)
2018-10-16 11:38:43 +09:00
9427a756c9 Update mongodb 2018-10-16 11:38:09 +09:00
d32b2a8ce5 fix(package): update @types/node to version 10.12.0 (#2912) 2018-10-16 10:46:45 +09:00
15473b4368 fix(package): update @types/webpack to version 4.4.17 (#2911) 2018-10-16 10:46:38 +09:00
54de0dc4a7 Update config for CI 2018-10-16 10:36:27 +09:00
0162eaf826 Update signin.ts 2018-10-16 10:33:05 +09:00
572cfafbe1 Add some API tests 2018-10-16 10:18:47 +09:00
4d6335ce9a Add some tests and fix 2018-10-16 09:45:36 +09:00
1c9c4af9f1 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-10-16 08:58:54 +09:00
a6844ebc9d Add some tests 2018-10-16 08:58:45 +09:00
072492c29b Implement /api/v1/instance/peers (#2913)
* Implement /api/v1/instance/peers

* Use punycode

* Remove Cache-Control

* Rename
2018-10-16 08:55:55 +09:00
99da4f9839 Add some tests and some fixes 2018-10-16 08:54:36 +09:00
88664486af Refactor 2018-10-16 08:27:20 +09:00
80daf7c749 Implement API tests 2018-10-16 06:37:21 +09:00
92ba64c35c New translations ja-JP.yml (German) 2018-10-16 06:11:24 +09:00
a8ee51ffd6 New translations ja-JP.yml (German) 2018-10-16 05:51:14 +09:00
5538afc61d New translations ja-JP.yml (German) 2018-10-16 05:42:36 +09:00
beb2f7e558 fix(package): update @types/sharp to version 0.21.0 (#2908) 2018-10-16 05:21:07 +09:00
6243184c95 fix(package): update @types/gulp-uglify to version 3.0.6 (#2906) 2018-10-16 05:20:57 +09:00
1b3baef966 Merge pull request #2898 from syuilo/l10n_develop
New Crowdin translations
2018-10-16 05:20:40 +09:00
98f38ee29b fix(package): update vue-svg-inline-loader to version 1.2.1 (#2909) 2018-10-16 05:20:17 +09:00
09b82bfea4 fix(package): update chart.js to version 2.7.3 (#2907) 2018-10-16 05:20:02 +09:00
937f686264 New translations ja-JP.yml (Russian) 2018-10-15 20:53:38 +09:00
9bc9cbac21 New translations ja-JP.yml (English) 2018-10-15 18:22:42 +09:00
6024550158 New translations ja-JP.yml (Norwegian) 2018-10-15 18:14:29 +09:00
4ae5f82171 New translations ja-JP.yml (Dutch) 2018-10-15 18:14:23 +09:00
6d2c9dcee9 New translations ja-JP.yml (Japanese, Kansai) 2018-10-15 18:14:18 +09:00
0f1b0e1870 New translations ja-JP.yml (Spanish) 2018-10-15 18:14:11 +09:00
81c682cdc8 New translations ja-JP.yml (Russian) 2018-10-15 18:14:05 +09:00
ab9fa67d9f New translations ja-JP.yml (Portuguese) 2018-10-15 18:14:00 +09:00
9537fce335 New translations ja-JP.yml (Polish) 2018-10-15 18:13:53 +09:00
9d97e7e348 New translations ja-JP.yml (Korean) 2018-10-15 18:13:48 +09:00
ebe7939412 New translations ja-JP.yml (Italian) 2018-10-15 18:13:43 +09:00
807e3e8ca7 New translations ja-JP.yml (German) 2018-10-15 18:13:37 +09:00
a59faf9117 New translations ja-JP.yml (French) 2018-10-15 18:13:32 +09:00
d786036155 New translations ja-JP.yml (English) 2018-10-15 18:13:25 +09:00
61d6ed5489 New translations ja-JP.yml (Chinese Simplified) 2018-10-15 18:13:21 +09:00
b38200d48a New translations ja-JP.yml (Catalan) 2018-10-15 18:13:16 +09:00
a0c396a842 10.19.0 2018-10-15 18:03:28 +09:00
88fbc53e37 Resolve #2314 2018-10-15 18:02:57 +09:00
a2206b2d52 🎨 2018-10-15 17:55:59 +09:00
a95ff447d7 🎨 2018-10-15 17:43:25 +09:00
49dbd7f9d2 Fix following from Preroma does not complete (#2905)
* In Follow Accept/Reject, send previous received id

* In Follow Accept/Reject, send Activity.actor
2018-10-15 16:51:22 +09:00
2ad2779096 10.18.0 2018-10-15 06:03:50 +09:00
23045369aa 🎨 2018-10-15 06:03:15 +09:00
116faf26e6 10.17.0 2018-10-15 05:29:58 +09:00
2582b8d132 🎨 2018-10-15 05:28:35 +09:00
63f7941073 🎨 2018-10-15 05:18:39 +09:00
676f026085 🎨 2018-10-15 04:36:31 +09:00
a13319fd86 New translations ja-JP.yml (Norwegian) 2018-10-14 19:52:13 +09:00
be8765278c New translations ja-JP.yml (Dutch) 2018-10-14 19:52:08 +09:00
c8bb3dc209 New translations ja-JP.yml (Japanese, Kansai) 2018-10-14 19:52:03 +09:00
ea16befb73 New translations ja-JP.yml (Spanish) 2018-10-14 19:51:59 +09:00
20b1bb7681 New translations ja-JP.yml (Russian) 2018-10-14 19:51:55 +09:00
bd10eb50eb New translations ja-JP.yml (Portuguese) 2018-10-14 19:51:50 +09:00
d47c0eb31a New translations ja-JP.yml (Polish) 2018-10-14 19:51:45 +09:00
177e8bb19f New translations ja-JP.yml (Korean) 2018-10-14 19:51:41 +09:00
d156111637 New translations ja-JP.yml (Italian) 2018-10-14 19:51:37 +09:00
8c13d3e50b New translations ja-JP.yml (German) 2018-10-14 19:51:33 +09:00
6ff01016f0 New translations ja-JP.yml (French) 2018-10-14 19:51:30 +09:00
5d659da012 New translations ja-JP.yml (English) 2018-10-14 19:51:26 +09:00
28e7552a1a New translations ja-JP.yml (Chinese Simplified) 2018-10-14 19:51:21 +09:00
53d264814b New translations ja-JP.yml (Catalan) 2018-10-14 19:51:15 +09:00
2d6b20d34b 10.16.0 2018-10-14 19:45:51 +09:00
99073b56df Resolve #2900 2018-10-14 19:44:30 +09:00
5dce81c0db 非ASCIIなドメインへのメンションの修正 (#2903)
* punycodeでされたmentionのラベルをunicodeとして表示する

* post-form mentionはpunycodeにする

* mentionの表示はURLもAPI向けもunicodeにする
2018-10-14 16:56:19 +09:00
be82d845a4 expose user recommendation config in /api/meta (#2902) 2018-10-14 16:54:09 +09:00
f49ccd0cd3 10.15.0 2018-10-14 10:17:04 +09:00
69d83f535d Clean up 2018-10-14 10:16:07 +09:00
c7988fb6f5 🎨 2018-10-14 10:16:02 +09:00
3961fd08c9 Fix #2901 2018-10-14 10:06:10 +09:00
e3faf64061 10.14.0 2018-10-14 09:49:16 +09:00
ed83993e15 Fix 2018-10-14 09:48:47 +09:00
0f8847bb74 Resolve #2618 2018-10-14 09:47:38 +09:00
a72cfa7535 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-10-14 06:46:49 +09:00
514b74a19d Clean up 2018-10-14 06:44:20 +09:00
a2c124306f Update mios.ts 2018-10-14 05:26:36 +09:00
273f67e268 Fix bug 2018-10-13 23:12:48 +09:00
2870a7e463 10.13.0 2018-10-13 20:12:28 +09:00
935b074a7a New translations ja-JP.yml (Norwegian) 2018-10-13 20:12:19 +09:00
9d9c609bfb New translations ja-JP.yml (Dutch) 2018-10-13 20:12:15 +09:00
f6a664f181 New translations ja-JP.yml (Japanese, Kansai) 2018-10-13 20:12:10 +09:00
fce68d1f75 New translations ja-JP.yml (Spanish) 2018-10-13 20:12:06 +09:00
88739c2444 New translations ja-JP.yml (Russian) 2018-10-13 20:12:02 +09:00
7e2f10fce3 New translations ja-JP.yml (Portuguese) 2018-10-13 20:11:58 +09:00
a494c3a5cc New translations ja-JP.yml (Polish) 2018-10-13 20:11:53 +09:00
d6bb702883 New translations ja-JP.yml (Korean) 2018-10-13 20:11:48 +09:00
d15a972c68 New translations ja-JP.yml (Italian) 2018-10-13 20:11:44 +09:00
2ae7d31725 New translations ja-JP.yml (German) 2018-10-13 20:11:40 +09:00
2e329b1888 New translations ja-JP.yml (French) 2018-10-13 20:11:36 +09:00
522d40328b New translations ja-JP.yml (English) 2018-10-13 20:11:32 +09:00
2ecbff45bf New translations ja-JP.yml (Chinese Simplified) 2018-10-13 20:11:28 +09:00
b6f7282c13 New translations ja-JP.yml (Catalan) 2018-10-13 20:11:24 +09:00
65e5cfa68e Resolve #2853 2018-10-13 20:11:00 +09:00
10e59957d1 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-10-13 19:26:22 +09:00
4f74373df3 Better id 2018-10-13 19:25:59 +09:00
2d414bbf86 Merge pull request #2897 from syuilo/greenkeeper/reconnecting-websocket-4.1.8
Update reconnecting-websocket to the latest version 🚀
2018-10-13 19:25:23 +09:00
a199969b81 fix(package): update reconnecting-websocket to version 4.1.8 2018-10-13 10:22:45 +00:00
3aef5e6748 Better id 2018-10-13 19:16:47 +09:00
2b536a7443 connectedイベントはpongパラメータがtrueの時だけ発行するように 2018-10-13 19:14:05 +09:00
20fe68de05 10.12.1 2018-10-13 18:11:24 +09:00
c7684b59de 🎨 2018-10-13 18:08:30 +09:00
a7237d157a Resolve #2600 2018-10-13 17:57:40 +09:00
35f91fa280 10.12.0 2018-10-13 13:25:48 +09:00
299ac32225 🎨 2018-10-13 13:25:07 +09:00
a038738d72 🎨 2018-10-13 13:22:14 +09:00
2b0a919fb5 Resolve #2894 2018-10-13 13:13:15 +09:00
946c706913 Better design 2018-10-13 12:51:01 +09:00
89b5d976ee Add some keyboard shortcuts of note 2018-10-13 12:48:33 +09:00
6f679bb6b4 Merge pull request #2896 from syuilo/greenkeeper/reconnecting-websocket-4.1.7
Update reconnecting-websocket to the latest version 🚀
2018-10-13 11:11:31 +09:00
db4e7b0e16 Merge pull request #2893 from syuilo/l10n_develop
New Crowdin translations
2018-10-13 11:11:16 +09:00
9ca942490d New translations ja-JP.yml (English) 2018-10-13 10:50:54 +09:00
ebcf249c8b New translations ja-JP.yml (Japanese, Kansai) 2018-10-13 10:41:05 +09:00
939c487503 New translations ja-JP.yml (English) 2018-10-13 10:41:01 +09:00
981a8b267e New translations ja-JP.yml (Japanese, Kansai) 2018-10-13 10:31:22 +09:00
9531da80a0 fix(package): update reconnecting-websocket to version 4.1.7 2018-10-12 23:51:14 +00:00
e1109b168c Clean up 2018-10-13 04:48:09 +09:00
b7c70039aa Merge pull request #2895 from syuilo/greenkeeper/reconnecting-websocket-4.1.6
Update reconnecting-websocket to the latest version 🚀
2018-10-13 02:13:32 +09:00
17b6f6cf2a fix(package): update reconnecting-websocket to version 4.1.6 2018-10-12 17:09:56 +00:00
dd88483ba4 10.11.1 2018-10-13 01:33:20 +09:00
0ff27f65b3 Fix bug 2018-10-13 01:33:00 +09:00
b1655740df Improve perforance 2018-10-13 01:17:23 +09:00
6d562aece1 New translations ja-JP.yml (Norwegian) 2018-10-13 01:05:49 +09:00
2182c3372b New translations ja-JP.yml (Dutch) 2018-10-13 01:05:44 +09:00
d3331bfe82 New translations ja-JP.yml (Japanese, Kansai) 2018-10-13 01:05:39 +09:00
cfc4a2e8b4 New translations ja-JP.yml (Spanish) 2018-10-13 01:05:35 +09:00
36c41c8eb3 New translations ja-JP.yml (Russian) 2018-10-13 01:05:31 +09:00
d255157e6e New translations ja-JP.yml (Portuguese) 2018-10-13 01:05:27 +09:00
c12e07277d New translations ja-JP.yml (Polish) 2018-10-13 01:05:21 +09:00
06b4fb5095 New translations ja-JP.yml (Korean) 2018-10-13 01:05:17 +09:00
8fafdcb428 New translations ja-JP.yml (Italian) 2018-10-13 01:05:10 +09:00
537a606bb6 New translations ja-JP.yml (German) 2018-10-13 01:05:06 +09:00
3dc7a4463c New translations ja-JP.yml (French) 2018-10-13 01:05:02 +09:00
fd6ff05b60 New translations ja-JP.yml (English) 2018-10-13 01:04:58 +09:00
1a159e41b8 New translations ja-JP.yml (Chinese Simplified) 2018-10-13 01:04:53 +09:00
23533cdd16 New translations ja-JP.yml (Catalan) 2018-10-13 01:04:47 +09:00
2f598b8fa1 10.11.0 2018-10-13 01:04:29 +09:00
bca349fec1 Improve performance 2018-10-13 01:00:43 +09:00
719fac6480 お気に入りを解除できるように 2018-10-13 00:54:30 +09:00
1012b2b2c7 10.10.1 2018-10-12 21:44:39 +09:00
5149be4b1b Fix bug 2018-10-12 21:44:04 +09:00
d12deeb0d8 Merge pull request #2889 from syuilo/greenkeeper/@types/elasticsearch-5.0.27
Update @types/elasticsearch to the latest version 🚀
2018-10-12 20:08:14 +09:00
9df81d1939 10.10.0 2018-10-12 14:38:21 +09:00
3be0079868 Merge pull request #2890 from syuilo/l10n_develop
New Crowdin translations
2018-10-12 14:36:54 +09:00
9b253ccb3a Refactor 2018-10-12 14:34:54 +09:00
dded76099c Refactor and usability improvements 2018-10-12 14:28:48 +09:00
41a7ec7d3d Fix bug 2018-10-12 13:53:40 +09:00
168c773ba0 Fix user recommendation query (last activity) (#2892) 2018-10-12 13:48:26 +09:00
9abed92196 New translations ja-JP.yml (French) 2018-10-12 05:26:16 +09:00
4a75e3602a New translations ja-JP.yml (French) 2018-10-12 05:13:53 +09:00
1a689f6641 削除された投稿はタイムライン上で表示しないようにする (#2887)
* Excepts deleted notes on query

* Hide deleted notes

* Use v-show
2018-10-12 05:10:40 +09:00
08d7ae11d6 fix(package): update @types/elasticsearch to version 5.0.27 2018-10-11 19:58:29 +00:00
9535759787 trim filename 2018-10-12 04:01:45 +09:00
f8fc31f14a スクロール時に新着情報を取得した際に、アイコンが被るのを修正 (#2888) 2018-10-12 03:28:37 +09:00
b74bf97761 10.9.2 2018-10-11 23:52:18 +09:00
a090b908bd Fix bug 2018-10-11 23:52:11 +09:00
3046821026 10.9.1 2018-10-11 23:09:12 +09:00
e94c73efe2 Fix 2018-10-11 23:07:20 +09:00
e85f9f4aa5 共有可能チャンネルに接続しようとしていて、かつそのチャンネルに既に接続していたら無意味なので無視するように 2018-10-11 23:01:57 +09:00
ad67886f96 Resolve #543 2018-10-11 22:35:34 +09:00
5df0e102fd Fix 2018-10-11 22:17:27 +09:00
a04f0e3545 10.9.0 2018-10-11 21:27:33 +09:00
dff9c7ac48 Clean up and fix 2018-10-11 21:25:55 +09:00
3a80b59986 並列に処理するように 2018-10-11 21:14:20 +09:00
07560a4fdd 10.8.0 2018-10-11 18:38:31 +09:00
7edca21c05 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-10-11 18:35:50 +09:00
34105abd9d Fix 2018-10-11 18:35:19 +09:00
1bbca48a0b Update setup.ja.md 2018-10-11 18:20:27 +09:00
21f6a86772 Update setup.ja.md 2018-10-11 18:18:15 +09:00
6559197c55 Clean up 2018-10-11 18:10:41 +09:00
05f9ad11bb Redisがインストールされているときはイベントの共有にRedisのpub/subを使うように 2018-10-11 18:09:41 +09:00
f06d586680 10.7.2 2018-10-11 17:27:39 +09:00
4f45e8125c Fix 2018-10-11 17:25:53 +09:00
cc2843503d 10.7.1 2018-10-11 17:00:48 +09:00
324a974dec Fix bug 2018-10-11 17:00:22 +09:00
4d4ffd70ac 10.7.0 2018-10-11 15:58:39 +09:00
bf98a11b65 Reduce memory usage in file migration tool 2018-10-11 15:56:18 +09:00
1117ce4b54 Redisをオプションにしたり 2018-10-11 15:50:27 +09:00
57e93b9b4e fix(package): update @types/node to version 10.11.7 (#2885) 2018-10-11 05:41:01 +09:00
9e4b061ed0 Fix bug 2018-10-11 05:26:51 +09:00
1067bef7d6 Fix bug 2018-10-11 05:26:09 +09:00
8bff529acd Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-10-11 02:48:32 +09:00
4b08677839 ✌️ 2018-10-11 02:48:19 +09:00
70997cb551 fix(package): update vue-color to version 2.7.0 (#2884) 2018-10-11 02:22:57 +09:00
bf0ef17e23 Improve error logs 2018-10-11 02:19:21 +09:00
7dae5107f8 Improve fault tolerance 2018-10-11 02:11:12 +09:00
2dea88a147 Update stream.ts 2018-10-10 22:13:32 +09:00
f44c2a3e4f 10.6.0 2018-10-10 21:24:32 +09:00
1fad3cbaae 🎨 2018-10-10 21:23:38 +09:00
40d2e3e97c 🎨 2018-10-10 21:04:53 +09:00
2efabe612e fix(package): update @types/node to version 10.11.6 (#2876) 2018-10-10 21:01:25 +09:00
3107cbd6b9 fix(package): update @types/koa-logger to version 3.1.1 (#2877) 2018-10-10 21:01:18 +09:00
3a061ed1c3 New Crowdin translations (#2878)
* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)
2018-10-10 21:01:08 +09:00
d4f0e6461a fix(package): update @types/webpack to version 4.4.16 (#2880) 2018-10-10 21:01:00 +09:00
3285687652 fix(package): update url-loader to version 1.1.2 (#2883) 2018-10-10 21:00:47 +09:00
51c53f64d0 Fix #2881, Fix #2879 2018-10-10 20:59:10 +09:00
1d582f5ad2 Fix syntax error 2018-10-10 20:58:42 +09:00
8a62748e39 🎨 2018-10-10 20:02:56 +09:00
b9290a021b New translations ja-JP.yml (French) 2018-10-10 07:51:07 +09:00
129ce93868 New translations ja-JP.yml (French) 2018-10-10 07:41:10 +09:00
5f41e5d6d0 New translations ja-JP.yml (French) 2018-10-10 07:31:22 +09:00
c706d030ea New translations ja-JP.yml (French) 2018-10-10 07:21:14 +09:00
34716a34f8 New translations ja-JP.yml (French) 2018-10-10 07:02:04 +09:00
6db3d6dfb6 fix(package): update @types/mongodb to version 3.1.12 (#2874) 2018-10-10 03:47:12 +09:00
38e2853dcf 10.5.0 2018-10-10 03:38:39 +09:00
ba5a540ca3 Log misskey version 2018-10-10 03:37:51 +09:00
fb1e05c2e9 ストリーミングAPIでチャンネルに接続したときにconnectedメッセージを返すように 2018-10-10 03:28:11 +09:00
aba84612a7 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-10-10 03:24:18 +09:00
9bebbf4e03 Add alias 2018-10-10 03:24:09 +09:00
e41b3f9c10 Merge pull request #2873 from mei23/mei-1010-pull-recquery
Fix users recommendation query
2018-10-10 02:18:31 +09:00
890dc05022 lint fix 2018-10-10 02:08:26 +09:00
375f86ec82 Fix users recommendation query 2018-10-10 02:04:16 +09:00
db248a69c8 10.4.0 2018-10-09 23:02:38 +09:00
5951288159 Merge pull request #2863 from syuilo/l10n_develop
New Crowdin translations
2018-10-09 23:01:51 +09:00
17b92c9db2 Fix bug 2018-10-09 22:48:45 +09:00
962d1060d9 New translations ja-JP.yml (Korean) 2018-10-09 22:32:14 +09:00
cb2640d961 New translations ja-JP.yml (Korean) 2018-10-09 22:11:31 +09:00
29aeb0f082 fix(package): update @types/webpack to version 4.4.15 (#2868) 2018-10-09 15:14:22 +09:00
990347f856 Fix 2018-10-09 15:13:06 +09:00
7a406c1f13 Docker (#2867)
* Dockerize Misskey

* Add a new line at EOF

* Add support Elasticsearch

* /

* Add setup document for docker

* Add english document

* Edit docs

* docker -> Docker

* Arrange format

* Update docker.en.md

* Modify title
2018-10-09 15:09:50 +09:00
9432af2ab5 10.3.0 2018-10-09 15:09:24 +09:00
136b13e7ca Fix bug and refactor 2018-10-09 15:08:31 +09:00
ba1c823fb1 🎨 2018-10-09 14:58:37 +09:00
f1301a4780 fix(package): update @types/redis to version 2.8.7 (#2866) 2018-10-09 09:38:47 +09:00
7957cd4963 fix(package): update @types/node to version 10.11.5 (#2865) 2018-10-09 09:38:40 +09:00
ee6590d03f fix(package): update @types/mongodb to version 3.1.11 (#2864) 2018-10-09 09:38:31 +09:00
f2a1238b20 fix(package): update commander to version 2.19.0 (#2862) 2018-10-09 09:38:21 +09:00
e9ce84f368 New translations ja-JP.yml (Norwegian) 2018-10-09 07:04:09 +09:00
52e84decb4 New translations ja-JP.yml (Dutch) 2018-10-09 07:04:03 +09:00
e893002bb6 New translations ja-JP.yml (Japanese, Kansai) 2018-10-09 07:03:59 +09:00
3792103e80 New translations ja-JP.yml (Spanish) 2018-10-09 07:03:54 +09:00
7a861c9481 New translations ja-JP.yml (Russian) 2018-10-09 07:03:47 +09:00
942b565224 New translations ja-JP.yml (Portuguese) 2018-10-09 07:03:43 +09:00
88390d7a9a New translations ja-JP.yml (Polish) 2018-10-09 07:03:39 +09:00
966fc4c5d7 New translations ja-JP.yml (Korean) 2018-10-09 07:03:34 +09:00
84dbdf1196 New translations ja-JP.yml (Italian) 2018-10-09 07:03:29 +09:00
211e7f90d9 New translations ja-JP.yml (German) 2018-10-09 07:03:23 +09:00
e54b8e3fb2 New translations ja-JP.yml (French) 2018-10-09 07:03:18 +09:00
836c89ed33 New translations ja-JP.yml (English) 2018-10-09 07:03:12 +09:00
c7c73afea1 New translations ja-JP.yml (Chinese Simplified) 2018-10-09 07:03:06 +09:00
7b9ca63b1e New translations ja-JP.yml (Catalan) 2018-10-09 07:02:59 +09:00
c464183329 Improve theme manager 2018-10-09 06:46:52 +09:00
389f420cad Update src/tools/move-drive-files.ts 2018-10-09 05:46:21 +09:00
6b2888383c 10.2.1 2018-10-09 05:36:39 +09:00
3c38a867b4 Fix bug 2018-10-09 05:35:40 +09:00
7f5a69f4d8 Fix bug 2018-10-09 05:31:26 +09:00
bb9ab31d5e Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-10-09 05:15:48 +09:00
9def80af8a 10.2.0 2018-10-09 05:15:31 +09:00
9256bcdbe4 fix(package): update debug to version 4.1.0 (#2857) 2018-10-09 05:12:19 +09:00
9b775022bc Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-10-09 05:11:55 +09:00
32371ed2bd Fix #2858 2018-10-09 05:11:42 +09:00
8b98c08a81 Update README.md 2018-10-09 05:07:59 +09:00
7cf72f7447 Merge pull request #2860 from mei23/mei-1009-v10d
互換ストリーム / に main streamの内容も流す
2018-10-09 04:35:08 +09:00
913385b10d / に main stream も流す 2018-10-09 03:29:11 +09:00
7306468d08 Merge pull request #2856 from syuilo/greenkeeper/typescript-eslint-parser-20.0.0
Update typescript-eslint-parser to the latest version 🚀
2018-10-09 02:59:13 +09:00
11e5667778 fix(package): update typescript-eslint-parser to version 20.0.0 2018-10-08 17:15:23 +00:00
38cc02e261 Add tool 2018-10-09 02:14:03 +09:00
d52cf46cc1 10.1.0 2018-10-09 01:52:18 +09:00
c6110dd996 Fix bug
Closes #2855
2018-10-09 01:50:49 +09:00
51d8de2c38 Improve readability 2018-10-09 01:33:40 +09:00
4455a1aa9d Fix bug 2018-10-09 01:33:31 +09:00
040d395ddb 🎨 2018-10-09 01:26:04 +09:00
8296cac636 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-10-09 01:02:04 +09:00
3eafe8b87d Better api definition 2018-10-09 01:01:48 +09:00
c01512e261 Merge pull request #2854 from syuilo/greenkeeper/style-loader-0.23.1
Update style-loader to the latest version 🚀
2018-10-09 00:56:03 +09:00
e5cf3aecd5 Merge pull request #2830 from sei0o/fix-2346
fix #2346
2018-10-09 00:55:47 +09:00
a8f90b41b7 fix(package): update style-loader to version 0.23.1 2018-10-08 13:43:10 +00:00
b79169b975 Deleted dump.rdb 2018-10-08 22:26:26 +09:00
437d52e2ed Improve theme 2018-10-08 18:42:19 +09:00
1329721440 Merge pull request #2828 from hakaba-hitoyo/feature/external-user-recommendation
External user recommendation
2018-10-08 18:31:00 +09:00
6affb4fe97 Merge pull request #2851 from mei23/mei-1008-fix-apshow2
ap/showが返ってこないことがあるのを修正
2018-10-08 17:33:46 +09:00
15395686aa ap/showが返ってこないことがあるのを修正 2018-10-08 16:01:38 +09:00
047bcc78ad 10.0.0 2018-10-08 15:52:37 +09:00
9df68618f2 Merge pull request #2850 from syuilo/greenkeeper/sharp-0.21.0
fix(package): update sharp to version 0.21.0
2018-10-08 15:49:38 +09:00
732db087ab Merge pull request #2754 from syuilo/l10n_develop
New Crowdin translations
2018-10-08 15:48:30 +09:00
0e95b33b6a Improve theme 2018-10-08 15:47:41 +09:00
816ae7eb7e 🎨 2018-10-08 15:43:43 +09:00
5a5ff194fa New translations ja-JP.yml (English) 2018-10-08 15:43:00 +09:00
a60edf9cff Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-10-08 15:42:37 +09:00
1c2dbb914e Improve usability 2018-10-08 15:42:21 +09:00
9c170c426b Merge branch 'develop' into l10n_develop 2018-10-08 15:37:24 +09:00
c6239c8ad9 fix(package): update @types/mongodb to version 3.1.10 (#2849)
Closes #2752
2018-10-08 15:36:33 +09:00
159b361bac New translations ja-JP.yml (Norwegian) 2018-10-08 15:32:29 +09:00
160f64c18e New translations ja-JP.yml (Dutch) 2018-10-08 15:32:25 +09:00
e5916b3789 New translations ja-JP.yml (Japanese, Kansai) 2018-10-08 15:32:20 +09:00
70982b33c5 New translations ja-JP.yml (Spanish) 2018-10-08 15:32:15 +09:00
b4d614ad45 New translations ja-JP.yml (Russian) 2018-10-08 15:32:10 +09:00
6d2ef41b37 New translations ja-JP.yml (Portuguese) 2018-10-08 15:32:05 +09:00
e102237aab New translations ja-JP.yml (Polish) 2018-10-08 15:32:00 +09:00
665af87031 New translations ja-JP.yml (Korean) 2018-10-08 15:31:56 +09:00
6f4e439697 New translations ja-JP.yml (Italian) 2018-10-08 15:31:51 +09:00
742dcf35c9 New translations ja-JP.yml (German) 2018-10-08 15:31:45 +09:00
9cd70c568c New translations ja-JP.yml (French) 2018-10-08 15:31:39 +09:00
facabf274f New translations ja-JP.yml (English) 2018-10-08 15:31:35 +09:00
e3ab51022f New translations ja-JP.yml (Chinese Simplified) 2018-10-08 15:31:30 +09:00
d278367cf9 New translations ja-JP.yml (Catalan) 2018-10-08 15:31:25 +09:00
a70ced8e90 Add new theme 2018-10-08 15:23:20 +09:00
567cedc7cc Improve usability 2018-10-08 15:23:10 +09:00
9b3af6efcd fix(package): update jsdom to version 12.2.0 (#2848) 2018-10-08 14:50:32 +09:00
d9edc1eb1d Improve theme 2018-10-08 09:08:02 +09:00
65e46b5cec oops 2018-10-08 09:02:11 +09:00
e00b5f11cb 互換性を追加 2018-10-08 08:58:12 +09:00
6b53d5f269 New translations ja-JP.yml (Norwegian) 2018-10-08 08:10:57 +09:00
59c80ab140 New translations ja-JP.yml (Norwegian) 2018-10-08 08:01:13 +09:00
da323aad36 New translations ja-JP.yml (Norwegian) 2018-10-08 07:51:37 +09:00
7c1611c939 New translations ja-JP.yml (Norwegian) 2018-10-08 07:41:01 +09:00
ab861beabe New translations ja-JP.yml (Norwegian) 2018-10-08 07:31:50 +09:00
d260e93161 New translations ja-JP.yml (Norwegian) 2018-10-08 07:21:50 +09:00
65a1855606 New translations ja-JP.yml (Norwegian) 2018-10-08 07:01:37 +09:00
c0e08e44a4 New translations ja-JP.yml (Norwegian) 2018-10-08 06:51:21 +09:00
5c1cebcef4 New translations ja-JP.yml (Norwegian) 2018-10-08 06:41:23 +09:00
af25d3a85e New translations ja-JP.yml (Norwegian) 2018-10-08 06:31:14 +09:00
8cb7183107 New translations ja-JP.yml (Norwegian) 2018-10-08 06:21:40 +09:00
1bf228d73e New translations ja-JP.yml (Norwegian) 2018-10-08 06:11:47 +09:00
d952b996e6 New translations ja-JP.yml (Norwegian) 2018-10-08 06:02:03 +09:00
1e407c4059 New translations ja-JP.yml (Norwegian) 2018-10-08 05:51:22 +09:00
b56d1fa60e New translations ja-JP.yml (Norwegian) 2018-10-08 05:41:23 +09:00
6340f95bfc New translations ja-JP.yml (Norwegian) 2018-10-08 05:30:57 +09:00
3c08dacf6c New translations ja-JP.yml (Norwegian) 2018-10-08 05:21:23 +09:00
2908124ad8 New translations ja-JP.yml (Norwegian) 2018-10-08 05:11:24 +09:00
3d62faaaf2 New translations ja-JP.yml (Norwegian) 2018-10-08 05:03:18 +09:00
b1efa9700d New translations ja-JP.yml (Norwegian) 2018-10-08 04:52:30 +09:00
1d08af5747 New translations ja-JP.yml (Norwegian) 2018-10-08 04:41:56 +09:00
2f82d0db87 New translations ja-JP.yml (Norwegian) 2018-10-08 04:33:10 +09:00
d88159907d New translations ja-JP.yml (Norwegian) 2018-10-08 04:21:47 +09:00
9ed9fbef65 New translations ja-JP.yml (Norwegian) 2018-10-08 04:11:43 +09:00
86c2e5bb91 New translations ja-JP.yml (Norwegian) 2018-10-08 04:01:04 +09:00
d9b548de1a New translations ja-JP.yml (Norwegian) 2018-10-08 03:51:11 +09:00
2271c6cbd8 New translations ja-JP.yml (Norwegian) 2018-10-08 03:45:38 +09:00
c4d4293c46 fix(package): update file-type to version 10.0.0 (#2846) 2018-10-08 02:31:42 +09:00
39bdfb6e0d Improve usability 2018-10-08 02:10:46 +09:00
1003fd393e Fix bug 2018-10-08 01:56:36 +09:00
2ede3c0864 Clean up 2018-10-08 01:25:34 +09:00
674764a035 Fix 2018-10-08 01:16:32 +09:00
a780e7b936 Clean up 2018-10-08 01:14:46 +09:00
03d0ce1f89 Improve theme 2018-10-08 01:10:30 +09:00
4182a0cf4c Fix 2018-10-08 01:03:07 +09:00
305915611e Fix bug 2018-10-08 00:58:10 +09:00
b0cd59bed9 New translations ja-JP.yml (Norwegian) 2018-10-08 00:41:33 +09:00
599dcbaa48 New translations ja-JP.yml (Norwegian) 2018-10-08 00:01:35 +09:00
2806dc98bd New translations ja-JP.yml (Norwegian) 2018-10-07 23:51:37 +09:00
bdc52dc114 New translations ja-JP.yml (Norwegian) 2018-10-07 23:41:46 +09:00
3f6b9e554c New translations ja-JP.yml (Norwegian) 2018-10-07 23:32:04 +09:00
f47ad7bf31 New translations ja-JP.yml (Norwegian) 2018-10-07 23:02:43 +09:00
f992f72d31 New translations ja-JP.yml (Norwegian) 2018-10-07 22:51:32 +09:00
a26f1db2cb New translations ja-JP.yml (Norwegian) 2018-10-07 22:41:27 +09:00
361ab00c61 fix(package): update @types/debug to version 0.0.31 (#2822) 2018-10-07 20:31:57 +09:00
f5cbcf3452 fix(package): update vue-svg-inline-loader to version 1.2.0 (#2844) 2018-10-07 20:29:43 +09:00
599386190a fix(package): update file-loader to version 2.0.0 (#2827) 2018-10-07 20:27:05 +09:00
ec541d3cd0 fix(package): update systeminformation to version 3.45.7 (#2825) 2018-10-07 20:26:47 +09:00
3199819ded fix(package): update reconnecting-websocket to version 4.1.5 (#2845)
Closes #2785
2018-10-07 20:26:35 +09:00
ccf04d63ec fix(package): update ws to version 6.1.0 (#2823) 2018-10-07 20:23:13 +09:00
b9f5fca333 ActivityPubオブジェクト採番API (#2832)
* Show ActivityPub object API

* Add missing return
2018-10-07 20:20:55 +09:00
b6a330928d 投稿の削除イベントを受け取るように 2018-10-07 20:08:42 +09:00
1c65cb3e36 Resolve #2843 2018-10-07 19:58:00 +09:00
dbb8c99efb New translations ja-JP.yml (French) 2018-10-07 19:41:39 +09:00
0adcb646fe Fix bug 2018-10-07 19:35:25 +09:00
a1ef70c0bf New translations ja-JP.yml (French) 2018-10-07 19:32:31 +09:00
75cd580c3a Improve theming 2018-10-07 19:30:24 +09:00
e05acb8d18 後方互換性を追加 2018-10-07 17:19:52 +09:00
10af684804 Improve readability a little 2018-10-07 17:06:28 +09:00
3e897727ca Fix #2773 (#2841)
* Added an API endpoint to check the existence of the file

* fix #2773: Now we can prevent users from posting the same images

* bug fix
2018-10-07 16:51:46 +09:00
d0570d7fe3 V10 (#2826)
* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Update CHANGELOG.md

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Update CHANGELOG.md

* Update CHANGELOG.md

* wip

* Update CHANGELOG.md

* wip

* wip

* wip

* wip
2018-10-07 11:06:17 +09:00
5cf1956135 Added CSS variables for background of reactions-viewer 2018-10-06 22:14:30 +09:00
0b98a2364b Fix お知らせが確認中...のままになる(Announcement Fetching...) (#2831) 2018-10-06 20:36:11 +09:00
fff307d4bb fix #2346 2018-10-06 17:51:59 +09:00
2b7782ba03 replace var by const 2018-10-06 17:38:57 +09:00
96d961ee80 better readable code 2018-10-06 17:23:32 +09:00
9f064d76d9 better readable code 2018-10-06 17:21:27 +09:00
2e39106c4b better config handling 2018-10-06 17:19:41 +09:00
1305006391 New translations ja-JP.yml (English) 2018-10-06 17:01:11 +09:00
04650464f3 debug 2018-10-06 16:34:52 +09:00
3bc7e1e35c remove follow buttons in the friends-maker component/widget 2018-10-06 16:31:21 +09:00
7019ddbfc7 external user recommendation 2018-10-06 16:03:18 +09:00
106d990bd2 New translations ja-JP.yml (Norwegian) 2018-10-05 19:23:15 +09:00
b29eb29556 New translations ja-JP.yml (Dutch) 2018-10-05 19:23:11 +09:00
aeac1854ed New translations ja-JP.yml (Japanese, Kansai) 2018-10-05 19:23:07 +09:00
dbc57dd0d3 New translations ja-JP.yml (Spanish) 2018-10-05 19:23:01 +09:00
328a87609e New translations ja-JP.yml (Russian) 2018-10-05 19:22:57 +09:00
5d848f3900 New translations ja-JP.yml (Portuguese) 2018-10-05 19:22:53 +09:00
cf4ed45fe4 New translations ja-JP.yml (Polish) 2018-10-05 19:22:49 +09:00
07293094d5 New translations ja-JP.yml (Korean) 2018-10-05 19:22:43 +09:00
0917696c86 New translations ja-JP.yml (Italian) 2018-10-05 19:22:39 +09:00
030a027366 New translations ja-JP.yml (German) 2018-10-05 19:22:35 +09:00
372c488585 New translations ja-JP.yml (French) 2018-10-05 19:22:31 +09:00
738b8ff1ee New translations ja-JP.yml (English) 2018-10-05 19:22:25 +09:00
1561fc5994 New translations ja-JP.yml (Chinese Simplified) 2018-10-05 19:22:20 +09:00
c84f18545e New translations ja-JP.yml (Catalan) 2018-10-05 19:22:15 +09:00
48e4dc75f4 Better japanese 2018-10-05 19:13:59 +09:00
63a8d556e5 🎨 2018-10-05 12:10:00 +09:00
e5591618ee 9.7.1 2018-10-05 04:50:50 +09:00
4794748c73 Fix bug 2018-10-05 04:50:23 +09:00
02e7e3b971 Clean up 2018-10-05 03:21:45 +09:00
d2aca3c28b fix(package): update vue-svg-inline-loader to version 1.1.4 (#2821) 2018-10-05 02:43:54 +09:00
11b84a04b3 9.7.0 2018-10-05 01:59:26 +09:00
f243ce66e7 ActivityPubのHTTPリクエストの強化 (#2820)
* Fix error handling in AP deliver

* Set timeout to resolver

* Tune looks
2018-10-05 01:58:41 +09:00
baf9b65801 Improve error handling of packaging functions 2018-10-05 01:43:47 +09:00
55419d2524 fix(package): update sharp to version 0.21.0
Closes #2619
2018-10-04 13:01:32 +00:00
401d0b1298 9.5.0 2018-10-04 13:55:25 +09:00
fce7dc0f4e Improve error handling of pack function of notification 2018-10-04 13:53:48 +09:00
35489ef5b7 Improve default theme definition (dark) 2018-10-04 13:48:26 +09:00
546d494587 Improve default theme definition (light) 2018-10-04 13:40:13 +09:00
e8afa2c940 Improve pack function of favorite 2018-10-04 13:33:59 +09:00
c1ef1bf605 fix(package): update typescript-eslint-parser to version 19.0.2 (#2819)
Closes #2772
2018-10-04 12:53:50 +09:00
4ab0dbe7e3 fix(package): update @types/webpack to version 4.4.14 (#2818)
Closes #2778
2018-10-04 12:53:17 +09:00
44f86a94f4 fix(package): update @types/node to version 10.11.4 (#2817)
Closes #2765
2018-10-04 12:52:57 +09:00
a0278154a3 fix(package): update webpack-cli to version 3.1.2 (#2816)
Closes #2757
2018-10-04 12:52:27 +09:00
8b7e6b200e fix(package): update jsdom to version 12.1.0 (#2788) 2018-10-04 12:51:19 +09:00
d6f6c26725 fix(package): update @types/qrcode to version 1.3.0 (#2813) 2018-10-04 12:50:32 +09:00
cf66343b31 fix(package): update qrcode to version 1.3.0 (#2799) 2018-10-04 12:50:25 +09:00
d53689332f fix(package): update diskusage to version 0.2.5 (#2767) 2018-10-04 12:49:56 +09:00
4105237027 fix(package): update koa-mount to version 4.0.0 (#2776) 2018-10-04 12:49:38 +09:00
436962e4b8 fix(package): update nan to version 2.11.1 (#2784) 2018-10-04 12:49:05 +09:00
a85efa1392 fix(package): update gulp-htmlmin to version 5.0.1 (#2815)
Closes #2669
2018-10-04 12:48:52 +09:00
f0115a5e21 fix(package): update webpack to version 4.20.2 (#2814)
Closes #2768
2018-10-04 12:45:47 +09:00
80105239dc 9.4.0 2018-10-04 00:39:48 +09:00
baad11288a ドキュメントが見つからなくてもエラーにせずnullを返すように 2018-10-04 00:39:11 +09:00
7e50646ede 9.3.1 2018-10-03 23:01:58 +09:00
d4b8e47bcb Fix 2018-10-03 23:01:47 +09:00
0eefd2922c 9.3.0 2018-10-03 22:55:08 +09:00
30c0f98691 Fix bug 2018-10-03 22:54:10 +09:00
06a7c2e138 Revert "Enable JSON5 syntax"
This reverts commit 6e04549a9b.
2018-10-03 22:14:05 +09:00
3537b3de8e Clean up 2018-10-03 22:05:17 +09:00
ed6450244d Feature flags feature (#2803) 2018-10-03 12:39:03 +09:00
e813880392 6個ピン留めできてしまうの修正 (#2804) 2018-10-03 12:37:23 +09:00
9a57efa6d9 ✌️ 2018-10-03 03:13:10 +09:00
03ee5eba3b New translations ja-JP.yml (Norwegian) 2018-10-03 03:12:34 +09:00
295ea79231 New translations ja-JP.yml (Dutch) 2018-10-03 03:12:30 +09:00
a5486176c1 New translations ja-JP.yml (Japanese, Kansai) 2018-10-03 03:12:24 +09:00
de58325fd0 New translations ja-JP.yml (Spanish) 2018-10-03 03:12:19 +09:00
1e7932d9c7 New translations ja-JP.yml (Russian) 2018-10-03 03:12:13 +09:00
8ba76df409 New translations ja-JP.yml (Portuguese) 2018-10-03 03:12:07 +09:00
a8f9d20229 New translations ja-JP.yml (Polish) 2018-10-03 03:12:02 +09:00
5e6d1b9ae8 New translations ja-JP.yml (Korean) 2018-10-03 03:11:55 +09:00
c5afbaef35 New translations ja-JP.yml (Italian) 2018-10-03 03:11:50 +09:00
3b5a36a09f New translations ja-JP.yml (German) 2018-10-03 03:11:46 +09:00
fcb20d05d7 New translations ja-JP.yml (French) 2018-10-03 03:11:41 +09:00
9e6990c44b New translations ja-JP.yml (English) 2018-10-03 03:11:37 +09:00
8f3fd9b0dc New translations ja-JP.yml (Chinese Simplified) 2018-10-03 03:11:33 +09:00
5b1b4a02d8 New translations ja-JP.yml (Catalan) 2018-10-03 03:11:27 +09:00
31de530497 9.2.0 2018-10-03 03:09:04 +09:00
16b6b1f2b3 テーマ関連機能の強化 2018-10-03 03:07:46 +09:00
dba83aa50d New translations ja-JP.yml (Norwegian) 2018-10-03 03:02:59 +09:00
bade054a6a New translations ja-JP.yml (Dutch) 2018-10-03 03:02:55 +09:00
34d3485dc9 New translations ja-JP.yml (Japanese, Kansai) 2018-10-03 03:02:50 +09:00
a84d066daa New translations ja-JP.yml (Spanish) 2018-10-03 03:02:46 +09:00
3360cf27cd New translations ja-JP.yml (Russian) 2018-10-03 03:02:41 +09:00
c1a13af611 New translations ja-JP.yml (Portuguese) 2018-10-03 03:02:36 +09:00
47274a658b New translations ja-JP.yml (Polish) 2018-10-03 03:02:32 +09:00
b194334031 New translations ja-JP.yml (Korean) 2018-10-03 03:02:27 +09:00
4136c4a807 New translations ja-JP.yml (Italian) 2018-10-03 03:02:23 +09:00
f1c212fe75 New translations ja-JP.yml (German) 2018-10-03 03:02:18 +09:00
d08cbff4b7 New translations ja-JP.yml (French) 2018-10-03 03:02:13 +09:00
0b774475fa New translations ja-JP.yml (English) 2018-10-03 03:02:09 +09:00
c4f6195df3 New translations ja-JP.yml (Chinese Simplified) 2018-10-03 03:02:06 +09:00
192cdbe322 New translations ja-JP.yml (Catalan) 2018-10-03 03:02:01 +09:00
a2a25eb5f8 Improve usability 2018-10-03 03:00:55 +09:00
274cf1af1c テーマ関連の機能を強化 2018-10-03 02:57:31 +09:00
7d11c8b767 Improve admin UI (#2802) 2018-10-02 23:42:46 +09:00
abef6bafe3 New translations ja-JP.yml (French) 2018-10-02 23:14:27 +09:00
da237a5e2d New translations ja-JP.yml (French) 2018-10-02 22:56:58 +09:00
7e50e03cfb Update README.md [AUTOGEN] (#2801) 2018-10-02 20:23:27 +09:00
89d5df20a5 9.1.0 2018-10-02 16:29:05 +09:00
c09a2a37fe リモートのピン留め投稿取得対応 (#2798)
* Fetch featured

* Handle featured change

* Fix typo
2018-10-02 16:27:36 +09:00
b5745877ca 🎨 2018-10-02 16:23:55 +09:00
c0ac15cad7 New translations ja-JP.yml (Norwegian) 2018-10-02 16:13:29 +09:00
90ce09be2e New translations ja-JP.yml (Dutch) 2018-10-02 16:13:25 +09:00
fd39afb374 New translations ja-JP.yml (Japanese, Kansai) 2018-10-02 16:13:20 +09:00
6e04549a9b Enable JSON5 syntax 2018-10-02 16:13:14 +09:00
80e56fddd9 New translations ja-JP.yml (Spanish) 2018-10-02 16:13:14 +09:00
4daf9e1180 New translations ja-JP.yml (Russian) 2018-10-02 16:13:09 +09:00
f72abc0e47 New translations ja-JP.yml (Portuguese) 2018-10-02 16:13:04 +09:00
9c177f3df2 New translations ja-JP.yml (Polish) 2018-10-02 16:13:00 +09:00
a279b32c93 New translations ja-JP.yml (Korean) 2018-10-02 16:12:36 +09:00
51465ba026 New translations ja-JP.yml (Italian) 2018-10-02 16:12:31 +09:00
6a7bdcc533 New translations ja-JP.yml (German) 2018-10-02 16:12:25 +09:00
fddb3a5f10 New translations ja-JP.yml (French) 2018-10-02 16:12:19 +09:00
643c7abc12 New translations ja-JP.yml (English) 2018-10-02 16:12:15 +09:00
5715afd44c New translations ja-JP.yml (Chinese Simplified) 2018-10-02 16:12:10 +09:00
d65c1c420e New translations ja-JP.yml (Catalan) 2018-10-02 16:12:05 +09:00
38139ee6c9 テーマに関して強化 2018-10-02 16:10:45 +09:00
6b96bd0185 テーマに関して強化 2018-10-02 16:04:31 +09:00
f2b9863eea Better deployment option descriptions. (#2800) 2018-10-02 11:59:12 +09:00
35598c8064 New translations ja-JP.yml (Norwegian) 2018-10-01 19:32:26 +09:00
a5e716eb5d New translations ja-JP.yml (Dutch) 2018-10-01 19:32:24 +09:00
e8073b7484 New translations ja-JP.yml (Japanese, Kansai) 2018-10-01 19:32:21 +09:00
d6a5fc20bb New translations ja-JP.yml (Spanish) 2018-10-01 19:32:18 +09:00
e763d43085 New translations ja-JP.yml (Russian) 2018-10-01 19:32:15 +09:00
a6904d5249 New translations ja-JP.yml (Portuguese) 2018-10-01 19:32:12 +09:00
7bcb91d3ca New translations ja-JP.yml (Polish) 2018-10-01 19:32:09 +09:00
fb0c1efa41 New translations ja-JP.yml (Korean) 2018-10-01 19:32:06 +09:00
03d243d444 New translations ja-JP.yml (Italian) 2018-10-01 19:32:04 +09:00
b91585d1fe New translations ja-JP.yml (German) 2018-10-01 19:32:00 +09:00
d1fa318cda New translations ja-JP.yml (French) 2018-10-01 19:31:58 +09:00
42decae424 New translations ja-JP.yml (English) 2018-10-01 19:31:55 +09:00
78bc7c20ed New translations ja-JP.yml (Chinese Simplified) 2018-10-01 19:31:52 +09:00
e6616bdf57 New translations ja-JP.yml (Catalan) 2018-10-01 19:31:49 +09:00
cefe1f34be New translations ja-JP.yml (Norwegian) 2018-09-30 23:12:05 +09:00
d469e2152c New translations ja-JP.yml (Dutch) 2018-09-30 23:12:03 +09:00
35c2d47518 New translations ja-JP.yml (Japanese, Kansai) 2018-09-30 23:12:00 +09:00
c00634a2cf New translations ja-JP.yml (Spanish) 2018-09-30 23:11:58 +09:00
d1835e262d New translations ja-JP.yml (Russian) 2018-09-30 23:11:55 +09:00
d0f304f0ce New translations ja-JP.yml (Portuguese) 2018-09-30 23:11:53 +09:00
154abe06a7 New translations ja-JP.yml (Polish) 2018-09-30 23:11:51 +09:00
ac41cd378c New translations ja-JP.yml (Korean) 2018-09-30 23:11:48 +09:00
d59afda2c9 New translations ja-JP.yml (Italian) 2018-09-30 23:11:45 +09:00
4d213833e2 New translations ja-JP.yml (German) 2018-09-30 23:11:42 +09:00
e9214d4330 New translations ja-JP.yml (French) 2018-09-30 23:11:40 +09:00
6b41bb95b2 New translations ja-JP.yml (English) 2018-09-30 23:11:38 +09:00
36de13d543 New translations ja-JP.yml (Chinese Simplified) 2018-09-30 23:11:35 +09:00
3893def9f4 New translations ja-JP.yml (Catalan) 2018-09-30 23:11:32 +09:00
b91b0d17c3 New translations ja-JP.yml (French) 2018-09-30 22:31:59 +09:00
ab7d4fa2a2 New translations ja-JP.yml (French) 2018-09-29 16:11:06 +09:00
f30c8b8a47 New translations ja-JP.yml (French) 2018-09-29 16:01:08 +09:00
fdaebc6315 New translations ja-JP.yml (Norwegian) 2018-09-29 00:52:53 +09:00
f1a05c214e New translations ja-JP.yml (Dutch) 2018-09-29 00:52:50 +09:00
9ad32ffee9 New translations ja-JP.yml (Japanese, Kansai) 2018-09-29 00:52:48 +09:00
70f83ab019 New translations ja-JP.yml (Spanish) 2018-09-29 00:52:45 +09:00
07e64631f2 New translations ja-JP.yml (Russian) 2018-09-29 00:52:42 +09:00
498416e2e3 New translations ja-JP.yml (Portuguese) 2018-09-29 00:52:40 +09:00
87c4f908fe New translations ja-JP.yml (Polish) 2018-09-29 00:52:38 +09:00
27e6eaacde New translations ja-JP.yml (Korean) 2018-09-29 00:52:35 +09:00
ada47920ca New translations ja-JP.yml (Italian) 2018-09-29 00:52:32 +09:00
f2606d62ff New translations ja-JP.yml (German) 2018-09-29 00:52:29 +09:00
35032152b3 New translations ja-JP.yml (French) 2018-09-29 00:52:27 +09:00
90b545fd69 New translations ja-JP.yml (English) 2018-09-29 00:52:24 +09:00
4f7776d1f9 New translations ja-JP.yml (Chinese Simplified) 2018-09-29 00:52:21 +09:00
03bd0c4c9e New translations ja-JP.yml (Catalan) 2018-09-29 00:52:18 +09:00
5734221c8f New translations ja-JP.yml (French) 2018-09-26 23:31:56 +09:00
d17280b341 New translations ja-JP.yml (Japanese, Kansai) 2018-09-25 22:21:23 +09:00
f523d3f3bc New translations ja-JP.yml (Japanese, Kansai) 2018-09-25 21:55:37 +09:00
d23bc1e02a New translations ja-JP.yml (Norwegian) 2018-09-24 16:32:48 +09:00
86fcd9208e New translations ja-JP.yml (Dutch) 2018-09-24 16:32:45 +09:00
f2b97a889c New translations ja-JP.yml (Japanese, Kansai) 2018-09-24 16:32:43 +09:00
97f91102fe New translations ja-JP.yml (Spanish) 2018-09-24 16:32:39 +09:00
07b04578c8 New translations ja-JP.yml (Russian) 2018-09-24 16:32:37 +09:00
31f3c1996b New translations ja-JP.yml (Portuguese) 2018-09-24 16:32:35 +09:00
f4116e7300 New translations ja-JP.yml (Polish) 2018-09-24 16:32:31 +09:00
5e5239c16e New translations ja-JP.yml (Korean) 2018-09-24 16:32:28 +09:00
3adfcd1d13 New translations ja-JP.yml (Italian) 2018-09-24 16:32:25 +09:00
3eb43a5413 New translations ja-JP.yml (German) 2018-09-24 16:32:22 +09:00
80f41e2ac1 New translations ja-JP.yml (French) 2018-09-24 16:32:19 +09:00
9e0b0b4210 New translations ja-JP.yml (English) 2018-09-24 16:32:17 +09:00
f3380d3184 New translations ja-JP.yml (Chinese Simplified) 2018-09-24 16:32:14 +09:00
54bc91ea2b New translations ja-JP.yml (Catalan) 2018-09-24 16:32:11 +09:00
7bb25917f8 New translations ja-JP.yml (French) 2018-09-23 20:11:14 +09:00
c5ff6df7e6 New translations ja-JP.yml (Norwegian) 2018-09-22 20:41:35 +09:00
e2b2982f95 New translations ja-JP.yml (Dutch) 2018-09-22 20:41:33 +09:00
a6e307010f New translations ja-JP.yml (Japanese, Kansai) 2018-09-22 20:41:31 +09:00
c636e35467 New translations ja-JP.yml (Spanish) 2018-09-22 20:41:28 +09:00
3d26bd0532 New translations ja-JP.yml (Russian) 2018-09-22 20:41:26 +09:00
16130e46dd New translations ja-JP.yml (Portuguese) 2018-09-22 20:41:23 +09:00
9f703085ba New translations ja-JP.yml (Polish) 2018-09-22 20:41:20 +09:00
0af09f13cf New translations ja-JP.yml (Korean) 2018-09-22 20:41:18 +09:00
cd8619113a New translations ja-JP.yml (Italian) 2018-09-22 20:41:16 +09:00
4bf6d9f80b New translations ja-JP.yml (German) 2018-09-22 20:41:14 +09:00
a559b2c20c New translations ja-JP.yml (French) 2018-09-22 20:41:11 +09:00
72411abfcd New translations ja-JP.yml (English) 2018-09-22 20:41:08 +09:00
491c3f1dc0 New translations ja-JP.yml (Chinese Simplified) 2018-09-22 20:41:06 +09:00
d2ffc4df6c New translations ja-JP.yml (Catalan) 2018-09-22 20:41:04 +09:00
330 changed files with 9834 additions and 6445 deletions

View File

@ -30,7 +30,7 @@ while :
touch patreon.cache && \ touch patreon.cache && \
rm patreon.cache && \ rm patreon.cache && \
cat patreon.raw.cache | \ cat patreon.raw.cache | \
jq -r '(.data|map(select(.relationships.currently_entitled_tiers.data[]))|map(.relationships.user.data.id))as$data|.included|map(select(.attributes.hide_pledges==false))|map(select(.id as$id|$data|contains([$id])))|map(.attributes|[.full_name,.thumb_url,.url]|@tsv)|.[]|@text' >> patreon.cache && \ jq -r '(.data|map(select(.relationships.currently_entitled_tiers.data[]))|map(.relationships.user.data.id))as$data|.included|map(select(.id as$id|$data|contains([$id])))|map(.attributes|[.full_name,.thumb_url,.url]|@tsv)|.[]|@text' >> patreon.cache && \
echo '<table><tr>' >> patreon.md.cache && \ echo '<table><tr>' >> patreon.md.cache && \
cat patreon.cache | \ cat patreon.cache | \
awk -F'\t' '{print $2,$1}' | \ awk -F'\t' '{print $2,$1}' | \

View File

@ -7,27 +7,51 @@ maintainer:
repository_url: https://github.com/syuilo/misskey # Repository URL repository_url: https://github.com/syuilo/misskey # Repository URL
feedback_url: https://github.com/syuilo/misskey/issues # Feedback URL (e.g. github issue) feedback_url: https://github.com/syuilo/misskey/issues # Feedback URL (e.g. github issue)
# URL and Port settings overview
# e.g., If you want to realize following structure:
#
# +--- https://example.com:123 ----------+
# +------+ |+-------------+ +---------------+|
# | User | ---> || Proxy (123) | ---> | Misskey (456) ||
# +------+ |+-------------+ +---------------+|
# +--------------------------------------+
#
# You need to set 'https://example.com:123' to 'url' prop and
# You need to set 456 to 'port' prop.
#
# In other words, the 'url' prop should be the final accessible URL seen by a user.
# 'port' prop is a port that the Misskey server should actually listen
# on and it is not necessarily the port that a user accesses.
url: http://localhost/ # Final accessible URL seen by a user.
url: https://example.tld/
### Port and TLS settings ######################################
#
# Misskey supports two deployment options for public.
#
# Option 1: With Reverse Proxy
#
# +----- https://example.tld/ ------------+
# +------+ |+-------------+ +----------------+|
# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
# +------+ |+-------------+ +----------------+|
# +---------------------------------------+
#
# You need to setup reverse proxy. (eg. Nginx)
# You do not define 'https' section.
# Option 2: Standalone
#
# +- https://example.tld/ -+
# +------+ | +---------------+ |
# | User | ---> | | Misskey (443) | |
# +------+ | +---------------+ |
# +------------------------+
#
# You need to run Misskey as root.
# You need to set Certificate in 'https' section.
# To use option 1, uncomment below line.
# port: 3000 # A port that your Misskey server should listen.
# To use option 2, uncomment below lines.
# port: 443
#
# https:
# # path for certification
# key: /etc/letsencrypt/live/example.tld/privkey.pem
# cert: /etc/letsencrypt/live/example.tld/fullchain.pem
################################################################
# A port that your Misskey server should listen.
# This value is not a port to use when accessing with a browser.
port: 80
mongodb: mongodb:
host: localhost host: localhost
@ -36,11 +60,6 @@ mongodb:
user: example-misskey-user user: example-misskey-user
pass: example-misskey-pass pass: example-misskey-pass
redis:
host: localhost
port: 6379
pass: example-pass
# Drive capacity of a local user (MB) # Drive capacity of a local user (MB)
localDriveCapacityMb: 256 localDriveCapacityMb: 256
@ -98,46 +117,50 @@ drive:
# Below settings are optional # Below settings are optional
# #
# TLS # Redis
# https: #redis:
# # path for certification # host: localhost
# key: /etc/letsencrypt/live/example.tld/privkey.pem # port: 6379
# cert: /etc/letsencrypt/live/example.tld/fullchain.pem # pass: example-pass
# Elasticsearch # Elasticsearch
# elasticsearch: #elasticsearch:
# host: localhost # host: localhost
# port: 9200 # port: 9200
# pass: null # pass: null
# reCAPTCHA # reCAPTCHA
# recaptcha: #recaptcha:
# site_key: example-site-key # site_key: example-site-key
# secret_key: example-secret-key # secret_key: example-secret-key
# ServiceWorker # ServiceWorker
# sw: #sw:
# # Public key of VAPID # # Public key of VAPID
# public_key: example-sw-public-key # public_key: example-sw-public-key
#
# # Private key of VAPID # # Private key of VAPID
# private_key: example-sw-private-key # private_key: example-sw-private-key
# google_maps_api_key: example-google-maps-api-key
# Twitter integration # Twitter integration
# You need to set the oauth callback url as : https://<your-misskey-instance>/api/tw/cb # You need to set the oauth callback url as : https://<your-misskey-instance>/api/tw/cb
# twitter: #twitter:
# consumer_key: example-twitter-consumer-key # consumer_key: example-twitter-consumer-key
# consumer_secret: example-twitter-consumer-secret-key # consumer_secret: example-twitter-consumer-secret-key
# Ghost # Ghost
# Ghost account is an account used for the purpose of delegating # Ghost account is an account used for the purpose of delegating
# followers when putting users in the list. # followers when putting users in the list.
# ghost: user-id-of-your-ghost-account #ghost: user-id-of-your-ghost-account
# Clustering # Clustering
# clusterLimit: 1 #clusterLimit: 1
# Summaly proxy # Summaly proxy
# summalyProxy: "http://example.com" #summalyProxy: "http://example.com"
# User recommendation
#user_recommendation:
# external: true
# engine: http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}
# timeout: 300000

View File

@ -0,0 +1,13 @@
var user = {
user: 'example-misskey-user',
pwd: 'example-misskey-pass',
roles: [
{
role: 'readWrite',
db: 'misskey'
}
]
};
db.createUser(user);

12
.dockerignore Executable file
View File

@ -0,0 +1,12 @@
.autogen
.git
.github
.travis
.vscode
Dockerfile
build/
docker-compose.yml
node_modules/
mongo/
redis/
elasticsearch/

4
.gitignore vendored
View File

@ -1,5 +1,6 @@
/.config/* /.config/*
!/.config/example.yml !/.config/example.yml
!/.config/mongo_initdb_example.js
/.vscode /.vscode
/node_modules /node_modules
/build /build
@ -12,3 +13,6 @@ npm-debug.log
run.bat run.bat
api-docs.json api-docs.json
*.log *.log
/redis
/mongo
/elasticsearch

View File

@ -1,12 +1,8 @@
maintainer: '@syuilo' maintainer:
url: 'https://misskey.xyz' name: syuilo
secondary_url: 'https://himasaku.net' url: 'https://syuilo.com'
url: 'http://misskey.local'
port: 80 port: 80
https:
enable: false
key: null
cert: null
ca: null
mongodb: mongodb:
host: localhost host: localhost
port: 27017 port: 27017
@ -21,6 +17,3 @@ elasticsearch:
host: localhost host: localhost
port: 9200 port: 9200
pass: '' pass: ''
recaptcha:
site_key: hima
secret_key: saku

View File

@ -1,12 +1,8 @@
maintainer: '@syuilo' maintainer:
url: 'https://misskey.xyz' name: syuilo
secondary_url: 'https://himasaku.net' url: 'https://syuilo.com'
url: 'http://misskey.local'
port: 80 port: 80
https:
enable: false
key: null
cert: null
ca: null
mongodb: mongodb:
host: localhost host: localhost
port: 27017 port: 27017
@ -21,6 +17,3 @@ elasticsearch:
host: localhost host: localhost
port: 9200 port: 9200
pass: '' pass: ''
recaptcha:
site_key: hima
secret_key: saku

View File

@ -5,6 +5,88 @@ ChangeLog
This document describes breaking changes only. This document describes breaking changes only.
10.0.0
------
ストリーミングAPIに破壊的変更があります。運営者がすべきことはありません。
変更は以下の通りです
* ストリーミングでやり取りする際の snake_case が全て camelCase に
* リバーシのストリームエンドポイント名が reversi → gamesReversi、reversiGame → gamesReversiGame に
* ストリーミングの個々のエンドポイントが廃止され、一旦元となるストリームに接続してから、個々のチャンネル(今までのエンドポイント)に接続します。詳細は後述します。
* ストリームから流れてくる、キャプチャした投稿の更新イベントに投稿自体のデータは含まれず、代わりにアクションが設定されるようになります。詳細は後述します。
* ストリームに接続する際に追加で指定していたパラメータ(トークン除く)が、URLにクエリとして含むのではなくチャンネル接続時にパラメータ指定するように
### 個々のエンドポイントが廃止されることによる新しいストリーミングAPIの利用方法
具体的には、まず https://example.misskey/streaming にwebsocket接続します。
次に、例えば「messaging」ストリーム(チャンネルと呼びます)に接続したいときは、ストリームに次のようなデータを送信します:
``` javascript
{
type: 'connect',
body: {
channel: 'messaging',
id: 'foobar',
params: {
otherparty: 'xxxxxxxxxxxx'
}
}
}
```
ここで、`id`にはそのチャンネルとやり取りするための任意のIDを設定します。
IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。
`params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
チャンネルにメッセージを送信するには、次のようなデータを送信します:
``` javascript
{
type: 'channel',
body: {
id: 'foobar',
type: 'something',
body: {
some: 'thing'
}
}
}
```
ここで、`id`にはチャンネルに接続するときに指定したIDを設定します。
逆に、チャンネルからメッセージが流れてくると、次のようなデータが受信されます:
``` javascript
{
type: 'channel',
body: {
id: 'foobar',
type: 'something',
body: {
some: 'thing'
}
}
}
```
ここで、`id`にはチャンネルに接続するときに指定したIDが設定されています。
### 投稿のキャプチャに関する変更
投稿の更新イベントに投稿情報は含まれなくなりました。代わりに、その投稿が「リアクションされた」「アンケートに投票された」「削除された」といったアクション情報が設定されます。
具体的には次のようなデータが受信されます:
``` javascript
{
type: 'noteUpdated',
body: {
id: 'xxxxxxxxxxx',
type: 'reacted',
body: {
reaction: 'hmm'
}
}
}
```
* reacted ... 投稿にリアクションされた。`reaction`プロパティにリアクションコードが含まれます。
* pollVoted ... アンケートに投票された。`choice`プロパティに選択肢ID、`userId`に投票者IDが含まれます。
9.0.0 9.0.0
----- -----

28
Dockerfile Normal file
View File

@ -0,0 +1,28 @@
FROM alpine:latest AS base
ENV NODE_ENV=production
RUN apk add --no-cache nodejs nodejs-npm
RUN apk add vips fftw --update-cache --repository https://dl-3.alpinelinux.org/alpine/edge/testing/
WORKDIR /misskey
COPY . ./
FROM base AS builder
RUN apk add --no-cache gcc g++ python autoconf automake file make nasm
RUN apk add vips-dev fftw-dev --update-cache --repository https://dl-3.alpinelinux.org/alpine/edge/testing/
RUN npm install \
&& npm install -g node-gyp \
&& node-gyp configure \
&& node-gyp build \
&& npm run build
FROM base AS runner
COPY --from=builder /misskey/built ./built
COPY --from=builder /misskey/node_modules ./node_modules
RUN apk add --no-cache tini
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["npm", "start"]

View File

@ -71,19 +71,21 @@ Please see [Contribution guide](./CONTRIBUTING.md).
---------------------------------------------------------------- ----------------------------------------------------------------
<!-- PATREON_START --> <!-- PATREON_START -->
<table><tr> <table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=CXe9AqlZy9AsYfiWd3OBYVOzvODoN47Litz0Tu4BFpU%3D" alt="Gargron"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1?token-time=2145916800&token-hash=d6P5MWHHsCMxUuBAEPAoVc5wLUR19mIhqAq7Ma9h9rI%3D" alt="ne_moni"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/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/2?token-time=2145916800&token-hash=mgPdX9TqZxEg4TTPuc477dxhIgYk9246qafjWZEqZ7g%3D" alt="Melilot"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/2?token-time=2145916800&token-hash=rwZ8qvbm_kpA4ib3kc07tVKupXeySpY5ATQFGxfL9v0%3D" alt="Axella"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/2?token-time=2145916800&token-hash=rwZ8qvbm_kpA4ib3kc07tVKupXeySpY5ATQFGxfL9v0%3D" alt="Xeltica"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td>
<td><img src="https://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=12731202">negao</a></td> <td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
<td><a href="https://www.patreon.com/negao">negao</a></td>
<td><a href="https://www.patreon.com/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/AxellaMC">Xeltica</a></td>
<td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td> <td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td>
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td> <td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td> <td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
@ -91,19 +93,17 @@ Please see [Contribution guide](./CONTRIBUTING.md).
</tr></table> </tr></table>
<table><tr> <table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D" alt="Naoki Kosaka"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D" alt="Naoki Kosaka"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12931605/ead494101f364dffa90efe49e36fb494/1?token-time=2145916800&token-hash=NzSFPjIlodXyv41rwK61aZWVZWfI4surJaNj8vWKvqM%3D" alt="Reiju"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=UERBN4OyP7Nh5XwwdDg0N0IE5cD6_qUQMO81Z5Wizso%3D" alt="Hiratake"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/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/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td>
</tr><tr> </tr><tr>
<td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td> <td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td>
<td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td>
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td> <td><a href="https://www.patreon.com/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=12531784">Takashi Shibuya</a></td> <td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
</tr></table> </tr></table>
**Last updated:** Sun, 02 Sep 2018 05:30:06 UTC **Last updated:** Tue, 02 Oct 2018 09:25:07 UTC
<!-- PATREON_END --> <!-- PATREON_END -->
:four_leaf_clover: Copyright :four_leaf_clover: Copyright

52
docker-compose.yml Normal file
View File

@ -0,0 +1,52 @@
version: "3"
services:
web:
build: .
restart: always
links:
- mongo
- redis
# - es
ports:
- "127.0.0.1:3000:3000"
networks:
- internal_network
- external_network
redis:
restart: always
image: redis:4.0-alpine
networks:
- internal_network
### Uncomment to enable Redis persistance
# volumes:
# - ./redis:/data
mongo:
restart: always
image: mongo:4.1-bionic
networks:
- internal_network
environment:
MONGO_INITDB_DATABASE: "misskey"
volumes:
- ./.config/mongo_initdb.js:/docker-entrypoint-initdb.d/mongo_initdb.js:ro
### Uncomment to enable MongoDB persistance
# - ./mongo:/data
# es:
# restart: always
# image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.2
# environment:
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
# networks:
# - internal_network
#### Uncomment to enable ES persistence
## volumes:
## - ./elasticsearch:/usr/share/elasticsearch/data
networks:
internal_network:
internal: true
external_network:

47
docs/docker.en.md Normal file
View File

@ -0,0 +1,47 @@
Docker Guide
================================================================
This guide describes how to install and setup Misskey with Docker.
[Japanese version also available - 日本語版もあります](./docker.ja.md)
----------------------------------------------------------------
*1.* Make configuration files
----------------------------------------------------------------
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` Copy the `.config/mongo_initdb_example.js` and rename it to `mongo_initdb.js`.
2. Edit `default.yml` and `mongo_initdb.js`.
*2.* Configure Docker
----------------------------------------------------------------
Edit `docker-compose.yml`.
*3.* Build Misskey
----------------------------------------------------------------
Build misskey with the following:
`docker-compose build`
*4.* That is it.
----------------------------------------------------------------
Well done! Now, you have an environment that run to Misskey.
### Launch normally
Just `docker-compose up -d`. GLHF!
### Way to Update to latest version of your Misskey
1. `git fetch`
2. `git stash`
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
4. `git stash pop`
5. `docker-compose build`
6. Check [ChangeLog](../CHANGELOG.md) for migration information
7. `docker-compose stop && docker-compose up -d`
### Way to execute cli command:
`docker-compose run --rm web node cli/mark-admin @example`
----------------------------------------------------------------
If you have any questions or troubles, feel free to contact us!

48
docs/docker.ja.md Normal file
View File

@ -0,0 +1,48 @@
Dockerを使ったMisskey構築方法
================================================================
このガイドはDockerを使ったMisskeyセットアップ方法について解説します。
[英語版もあります - English version also available](./docker.en.md)
----------------------------------------------------------------
*1.* 設定ファイルを作成する
----------------------------------------------------------------
1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` `.config/mongo_initdb_example.js`をコピーし名前を`mongo_initdb.js`にする
3. `default.yml``mongo_initdb.js`を編集する
*2.* Dockerの設定
----------------------------------------------------------------
`docker-compose.yml`を編集してください。
*3.* Misskeyのビルド
----------------------------------------------------------------
次のコマンドでMisskeyをビルドしてください:
`docker-compose build`
*4.* 以上です!
----------------------------------------------------------------
お疲れ様でした。これでMisskeyを動かす準備は整いました。
### 通常起動
`docker-compose up -d`するだけです。GLHF!
### Misskeyを最新バージョンにアップデートする方法:
1. `git fetch`
2. `git stash`
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
4. `git stash pop`
5. `docker-compose build`
6. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
7. `docker-compose stop && docker-compose up -d`
### cliコマンドを実行する方法:
`docker-compose run --rm web node cli/mark-admin @example`
----------------------------------------------------------------
なにかお困りのことがありましたらお気軽にご連絡ください。

View File

@ -24,11 +24,11 @@ Please install and setup these softwares:
#### Dependencies :package: #### Dependencies :package:
* **[Node.js](https://nodejs.org/en/)** * **[Node.js](https://nodejs.org/en/)**
* **[MongoDB](https://www.mongodb.com/)** >= 3.6 * **[MongoDB](https://www.mongodb.com/)** >= 3.6
* **[Redis](https://redis.io/)**
##### Optional ##### Optional
* [Elasticsearch](https://www.elastic.co/) - used to provide searching feature instead of MongoDB * [Redis](https://redis.io/)
* Redis is optional, but we strongly recommended to install it
* [Elasticsearch](https://www.elastic.co/) - required to enable the search feature
*3.* Setup MongoDB *3.* Setup MongoDB
---------------------------------------------------------------- ----------------------------------------------------------------

View File

@ -24,10 +24,17 @@ adduser --disabled-password --disabled-login misskey
#### 依存関係 :package: #### 依存関係 :package:
* **[Node.js](https://nodejs.org/en/)** * **[Node.js](https://nodejs.org/en/)**
* **[MongoDB](https://www.mongodb.com/)** (3.6以上) * **[MongoDB](https://www.mongodb.com/)** (3.6以上)
* **[Redis](https://redis.io/)**
##### オプション ##### オプション
* [Elasticsearch](https://www.elastic.co/) - 検索機能を向上させるために用います。 * [Redis](https://redis.io/)
* Redisはオプションですが、インストールすることを強く推奨します。
* インストールしなくていいのは、あなたのインスタンスが自分専用のときだけとお考えください。
* 具体的には、Redisをインストールしないと、次の事が出来なくなります:
* Misskeyプロセスを複数起動しての負荷分散
* レートリミット
* Twitter連携
* [Elasticsearch](https://www.elastic.co/)
* 検索機能を有効にするためにはインストールが必要です。
*3.* MongoDBの設定 *3.* MongoDBの設定
---------------------------------------------------------------- ----------------------------------------------------------------

View File

@ -2,7 +2,6 @@
* Gulp tasks * Gulp tasks
*/ */
import * as fs from 'fs';
import * as gulp from 'gulp'; import * as gulp from 'gulp';
import * as gutil from 'gulp-util'; import * as gutil from 'gulp-util';
import * as ts from 'gulp-typescript'; import * as ts from 'gulp-typescript';
@ -166,9 +165,7 @@ gulp.task('build:client:pug', [
.pipe(pug({ .pipe(pug({
locals: { locals: {
themeColor: constants.themeColor, themeColor: constants.themeColor,
facss: fa.dom.css(), facss: fa.dom.css()
//hljscss: fs.readFileSync('./node_modules/highlight.js/styles/default.css', 'utf8')
hljscss: fs.readFileSync('./src/client/assets/code-highlight.css', 'utf8')
} }
})) }))
.pipe(htmlmin({ .pipe(htmlmin({

View File

@ -264,6 +264,41 @@ common/views/components/connect-failed.troubleshooter.vue:
common/views/components/media-banner.vue: common/views/components/media-banner.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
common/views/components/theme.vue:
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
dark-themes: "暗いテーマ"
install-a-theme: "テーマのインストール"
theme-code: "テーマコード"
install: "インストール"
installed: "「{}」をインストールしました"
create-a-theme: "テーマの作成"
save-created-theme: "テーマを保存"
primary-color: "プライマリ カラー"
secondary-color: "セカンダリ カラー"
text-color: "文字色"
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Dark"
theme-name: "テーマ名"
preview-created-theme: "プレビュー"
invalid-theme: "テーマが正しくありません。"
already-installed: "既にそのテーマはインストールされています。"
saved: "保存しました"
manage-themes: "テーマの管理"
builtin-themes: "標準テーマ"
my-themes: "マイテーマ"
installed-themes: "インストールされたテーマ"
select-theme: "テーマを選択してください"
uninstall: "アンインストール"
uninstalled: "「{}」をアンインストールしました"
author: "作者"
desc: "説明"
export: "エクスポート"
import: "インポート"
import-by-code: "またはコードをペースト"
theme-name-required: "テーマ名は必須です。"
common/views/components/cw-button.vue: common/views/components/cw-button.vue:
hide: "隠す" hide: "隠す"
show: "もっと見る" show: "もっと見る"
@ -300,7 +335,9 @@ common/views/components/note-menu.vue:
detail: "詳細" detail: "詳細"
copy-link: "リンクをコピー" copy-link: "リンクをコピー"
favorite: "お気に入り" favorite: "お気に入り"
unfavorite: "お気に入り解除"
pin: "ピン留め" pin: "ピン留め"
unpin: "ピン留め解除"
delete: "削除" delete: "削除"
delete-confirm: "この投稿を削除しますか?" delete-confirm: "この投稿を削除しますか?"
remote: "投稿元で見る" remote: "投稿元で見る"
@ -379,6 +416,25 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue: common/views/components/trends.vue:
count: "{}人が投稿" count: "{}人が投稿"
empty: "トレンドなし" empty: "トレンドなし"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-bot: "このアカウントはBotです"
is-locked: "フォローを承認制にする"
careful-bot: "Botからのフォローだけ承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "確認中" fetching: "確認中"
no-broadcasts: "お知らせはありません" no-broadcasts: "お知らせはありません"
@ -439,6 +495,7 @@ common/views/pages/follow.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop: desktop:
banner-crop-title: "バナーとして表示する部分を選択" banner-crop-title: "バナーとして表示する部分を選択"
@ -477,13 +534,13 @@ desktop/views/components/charts.vue:
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計" notes-total: "投稿の積算"
users: "ユーザーの増減" users: "ユーザーの増減"
users-total: "ユーザーの累計" users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減" drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計" drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減" drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計" drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト" network-requests: "リクエスト"
network-time: "応答時間" network-time: "応答時間"
network-usage: "通信量" network-usage: "通信量"
@ -565,6 +622,7 @@ desktop/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
@ -675,6 +733,7 @@ desktop/views/components/settings.vue:
2fa: "二段階認証" 2fa: "二段階認証"
other: "その他" other: "その他"
license: "ライセンス" license: "ライセンス"
theme: "テーマ"
behaviour: "動作" behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。" fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
@ -686,14 +745,18 @@ desktop/views/components/settings.vue:
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が利用されます。この設定はこのデバイスのみ有効です。"
deck-nav: "デッキ内ナビゲーション"
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
display: "デザインと表示" display: "デザインと表示"
customize: "ホームをカスタマイズ" customize: "ホームをカスタマイズ"
wallpaper: "壁紙"
choose-wallpaper: "壁紙を選択" choose-wallpaper: "壁紙を選択"
delete-wallpaper: "壁紙を削除" delete-wallpaper: "壁紙を削除"
dark-mode: "ダークモード" dark-mode: "ダークモード"
use-shadow: "UIに影を使用"
rounded-corners: "UIの角を丸める"
circle-icons: "円形のアイコンを使用" circle-icons: "円形のアイコンを使用"
contrasted-acct: "ユーザー名にコントラストを付ける" contrasted-acct: "ユーザー名にコントラストを付ける"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する" show-clock-on-header: "右上に時計を表示する"
@ -702,14 +765,14 @@ desktop/views/components/settings.vue:
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する" show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開" show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。" deck-column-align: "デッキのカラムの位置"
deck-column-align-center: "中央"
deck-column-align-left: "左"
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。" enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム" volume: "ボリューム"
test: "テスト" test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語" language: "言語"
pick-language: "言語を選択" pick-language: "言語を選択"
recommended: "推奨" recommended: "推奨"
@ -745,6 +808,10 @@ desktop/views/components/settings.vue:
tools: "ツール" tools: "ツール"
task-manager: "タスクマネージャ" task-manager: "タスクマネージャ"
third-parties: "サードパーティ" third-parties: "サードパーティ"
navbar-position: "ナビゲーションバーの位置"
navbar-position-top: "上"
navbar-position-left: "左"
navbar-position-right: "右"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "詳細..."
@ -784,20 +851,6 @@ desktop/views/components/settings.password.vue:
enter-new-password-again: "もう一度新しいパスワードを入力してください" enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません" not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました" changed: "パスワードを変更しました"
desktop/views/components/settings.profile.vue:
avatar: "アイコン"
choice-avatar: "画像を選択"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
save: "保存"
locked-account: "アカウントの保護"
is-locked: "フォローを承認制にする"
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
@ -896,10 +949,8 @@ desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
edit: "オプション" edit: "オプション"
desktop/views/pages/deck/deck.note.vue: desktop/views/pages/deck/deck.user-column.vue:
reposted-by: "{}がRenote" pinned-notes: "ピン留めされた投稿"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
@ -1034,6 +1085,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意" nsfw: "閲覧注意"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1044,6 +1097,7 @@ mobile/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
@ -1173,23 +1227,6 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "リバーシ" reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-locked: "フォローを承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"
@ -1219,6 +1256,7 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示" notification-position: "通知の表示"
notification-position-bottom: "下" notification-position-bottom: "下"
notification-position-top: "上" notification-position-top: "上"
theme: "テーマ"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
note-visibility: "投稿の公開範囲" note-visibility: "投稿の公開範囲"

View File

@ -3,44 +3,44 @@ meta:
lang: "Deutsch" lang: "Deutsch"
divider: "" divider: ""
common: common:
misskey: "A ⭐ of fediverse" misskey: "Ein ⭐ des Fediversums"
about-title: "A ⭐ of fediverse." about-title: "Ein ⭐ des Fediversums."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。" about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
intro: intro:
title: "Misskeyって?" title: "Was ist Misskey?"
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。" about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
features: "特徴" features: "Funktionen"
rich-contents: "投稿" rich-contents: "Notizen"
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。" rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
reaction: "リアクション" reaction: "Reaktionen"
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。" reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
ui: "インターフェース" ui: "Benutzeroberfläche"
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。" ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
drive: "ドライブ" drive: "Drive"
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんかもしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんかMisskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。" drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんかもしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんかMisskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!" outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
adblock: adblock:
detected: "広告ブロッカーを無効にしてください" detected: "Bitte deaktivieren Sie den Werbeblocker."
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。" warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
application-authorization: "アプリの連携" application-authorization: "Autorisierte Anwendungen"
close: "閉じる" close: "Schließen"
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。" do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
got-it: "わかった" got-it: "Verstanden!"
customization-tips: customization-tips:
title: "カスタマイズのヒント" title: "Anpassung-Tipps"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。" paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。" paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。" paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。" paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
gotit: "Got it!" gotit: "Got it!"
notification: notification:
file-uploaded: "ファイルがアップロードされました" file-uploaded: "Datei hochgeladen!"
message-from: "{}さんからメッセージ:" message-from: "Nachricht von {}:"
reversi-invited: "対局への招待があります" reversi-invited: "対局への招待があります"
reversi-invited-by: "{}さんから" reversi-invited-by: "Eingeladen von {}:"
notified-by: "{}さんから" notified-by: "Benachrichtigt von {}:"
reply-from: "{}さんから返信:" reply-from: "Antwort von {}:"
quoted-by: "{}さんが引用:" quoted-by: "Zitiert von {}:"
time: time:
unknown: "Unbekannt" unknown: "Unbekannt"
future: "Zukunft" future: "Zukunft"
@ -52,8 +52,8 @@ common:
weeks_ago: "vor {0} Woche{0:n}" weeks_ago: "vor {0} Woche{0:n}"
months_ago: "vor {0} Monat{0:en}" months_ago: "vor {0} Monat{0:en}"
years_ago: "vor {} Jahr{0:en}" years_ago: "vor {} Jahr{0:en}"
month-and-day: "{month}月 {day}日" month-and-day: "{day}/{month}"
trash: "ゴミ箱" trash: "Papierkorb"
weekday-short: weekday-short:
sunday: "So" sunday: "So"
monday: "Mo" monday: "Mo"
@ -63,15 +63,15 @@ common:
friday: "Fr" friday: "Fr"
saturday: "Sa" saturday: "Sa"
weekday: weekday:
sunday: "日曜日" sunday: "Sonntag"
monday: "月曜日" monday: "Montag"
tuesday: "火曜日" tuesday: "Dienstag"
wednesday: "水曜日" wednesday: "Mittwoch"
thursday: "木曜日" thursday: "Donnerstag"
friday: "金曜日" friday: "Freitag"
saturday: "土曜日" saturday: "Samstag"
reactions: reactions:
like: "いいね" like: "Gefällt mir"
love: "Lieben" love: "Lieben"
laugh: "Lachen" laugh: "Lachen"
hmm: "Hmm...?" hmm: "Hmm...?"
@ -82,14 +82,14 @@ common:
rip: "RIP" rip: "RIP"
pudding: "Pudding" pudding: "Pudding"
note-visibility: note-visibility:
public: "公開" public: "Öffentlich"
home: "ホーム" home: "Startseite"
home-desc: "ホームタイムラインにのみ公開" home-desc: "Nur auf die Startseite posten"
followers: "フォロワー" followers: "Abonnenten"
followers-desc: "自分のフォロワーにのみ公開" followers-desc: "Nur für diejenigen sichtbar, die dir folgen"
specified: "ダイレクト" specified: "Direkt"
specified-desc: "指定したユーザーにのみ公開" specified-desc: "Nur für bestimmte Benutzer posten"
private: "非公開" private: "Privat"
note-placeholders: note-placeholders:
a: "Was machst du gerade?" a: "Was machst du gerade?"
b: "Was ist so passiert?" b: "Was ist so passiert?"
@ -97,34 +97,34 @@ common:
d: "Willst du etwas sagen?" d: "Willst du etwas sagen?"
e: "Schreib hier etwas!" e: "Schreib hier etwas!"
f: "Warte darauf, das du schreibst." f: "Warte darauf, das du schreibst."
search: "検索" search: "Suche"
delete: "Löschen" delete: "Löschen"
loading: "Laden" loading: "Laden"
ok: "OK" ok: "OK"
update-available-title: "更新があります" update-available-title: "Aktualisierung verfügbar"
update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden" update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden"
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet." my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "Ich bevorzuge Sushi anstelle von Pudding"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "Verifizierter Benutzer"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
always-show-nsfw: "常に閲覧注意のメディアを表示する" always-show-nsfw: "常に閲覧注意のメディアを表示する"
always-mark-nsfw: "常にメディアを閲覧注意として投稿" always-mark-nsfw: "常にメディアを閲覧注意として投稿"
show-full-acct: "ユーザー名のホストを省略しない" show-full-acct: "ユーザー名のホストを省略しない"
reduce-motion: "UIの動きを減らす" reduce-motion: "Animationen der Benutzeroberfläche reduzieren"
this-setting-is-this-device-only: "このデバイスのみ" this-setting-is-this-device-only: "Nur auf diesem Gerät"
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' do-not-use-in-production: 'Dies ist eine Entwicklungsversion. Nicht in einer Produktionsumgebung verwenden.'
reversi: reversi:
drawn: "引き分け" drawn: "Unentschieden"
my-turn: "あなたのターンです" my-turn: "Du bist am Zug"
opponent-turn: "相手のターンです" opponent-turn: "Dein Gegner ist an der Reihe"
turn-of: "{}のターンです" turn-of: "{} ist am Zug"
past-turn-of: "{}のターン" past-turn-of: "Zug von {}"
won: "{}の勝ち" won: "{} hat gewonnen!"
black: "" black: "Schwarz"
white: "" white: "Weiß"
total: "合計" total: "Gesamt"
this-turn: "{}ターン目" this-turn: "{}ターン目"
widgets: widgets:
analog-clock: "Analoge Uhr" analog-clock: "Analoge Uhr"
@ -142,23 +142,23 @@ common:
broadcast: "ブロードキャスト" broadcast: "ブロードキャスト"
notifications: "Benachrichtigungen" notifications: "Benachrichtigungen"
users: "Empfohlene Benutzer" users: "Empfohlene Benutzer"
polls: "アンケート" polls: "Umfrage"
post-form: "Beitragsform" post-form: "Beitragsform"
messaging: "Nachrichten" messaging: "Nachrichten"
server: "Server-Info" server: "Server-Info"
donation: "Spenden" donation: "Spenden"
nav: "Navigation" nav: "Navigation"
tips: "Tipps" tips: "Tipps"
hashtags: "ハッシュタグ" hashtags: "Hashtags"
deck: deck:
widgets: "Widget hinzufügen:" widgets: "Widget hinzufügen:"
home: "Startseite" home: "Startseite"
local: "Lokal" local: "Lokal"
hybrid: "ソーシャル" hybrid: "ソーシャル"
hashtag: "ハッシュタグ" hashtag: "Hashtag"
global: "Global" global: "Global"
mentions: "あなた宛て" mentions: "Erwähnungen"
direct: "ダイレクト投稿" direct: "Direktnachrichten"
notifications: "Mitteilungen" notifications: "Mitteilungen"
list: "Listen" list: "Listen"
swap-left: "Nach links" swap-left: "Nach links"
@ -182,10 +182,10 @@ auth/views/form.vue:
drive-write: "ドライブを操作する。" drive-write: "ドライブを操作する。"
notification-read: "通知を見る。" notification-read: "通知を見る。"
notification-write: "通知を操作する。" notification-write: "通知を操作する。"
cancel: "キャンセル" cancel: "Abbrechen"
accept: "アクセスを許可" accept: "Zugriff erlauben."
auth/views/index.vue: auth/views/index.vue:
loading: "読み込み中" loading: "Lädt"
denied: "アプリケーションの連携をキャンセルしました。" denied: "アプリケーションの連携をキャンセルしました。"
denied-paragraph: "このアプリがあなたのアカウントにアクセスすることはありません。" denied-paragraph: "このアプリがあなたのアカウントにアクセスすることはありません。"
already-authorized: "このアプリは既に連携済みです" already-authorized: "このアプリは既に連携済みです"
@ -196,46 +196,46 @@ auth/views/index.vue:
sign-in: "サインインしてください" sign-in: "サインインしてください"
common/views/components/games/reversi/reversi.vue: common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "{}を待っています" waiting-for: "Warten auf {}"
cancel: "キャンセル" cancel: "Abbrechen"
common/views/components/games/reversi/reversi.game.vue: common/views/components/games/reversi/reversi.game.vue:
surrender: "投了" surrender: "Aufgeben"
surrendered: "投了により" surrendered: "投了により"
is-llotheo: "石の少ない方が勝ち(ロセオ)" is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ" looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード" can-put-everywhere: "どこでも置けるモード"
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: "Spiele Reversi mit deinen Freunden!"
invite: "招待" invite: "Einladen"
rule: "遊び方" rule: "Spielanleitung"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。" rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待" mode-invite: "Einladen"
mode-invite-desc: "指定したユーザーと対戦するモードです。" mode-invite-desc: "指定したユーザーと対戦するモードです。"
invitations: "対局の招待があります!" invitations: "対局の招待があります!"
my-games: "自分の対局" my-games: "自分の対局"
all-games: "みんなの対局" all-games: "Alle Spiele"
enter-username: "ユーザー名を入力してください" enter-username: "Bitte gib einen Benutzernamen ein"
game-state: game-state:
ended: "終了" ended: "Fertig"
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: "Spieleinstellungen"
choose-map: "マップを選択" choose-map: "Wähle eine Karte"
random: "ランダム" random: "Zufällige Auswahl"
black-or-white: "先手/後手" black-or-white: "Schwarz/Weiß"
black-is: "{}が黒" black-is: "Schwarz ist {}"
rules: "ルール" rules: "Regeln"
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: "Warte auf den Gegner"
waiting-for-me: "あなたの準備が完了するのを待っています" waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中" waiting-for-both: "準備中"
cancel: "キャンセル" cancel: "Abbrechen"
ready: "準備完了" ready: "Bereit"
cancel-ready: "準備続行" cancel-ready: "準備続行"
common/views/components/connect-failed.vue: common/views/components/connect-failed.vue:
title: "Verbindung zum Server ist fehlgeschlagen" title: "Verbindung zum Server ist fehlgeschlagen"
@ -262,8 +262,43 @@ common/views/components/connect-failed.troubleshooter.vue:
flush: "Cache leeren" flush: "Cache leeren"
set-version: "Version angeben" set-version: "Version angeben"
common/views/components/media-banner.vue: common/views/components/media-banner.vue:
sensitive: "閲覧注意" sensitive: "Dieser Inhalt ist NSFW"
click-to-show: "クリックして表示" click-to-show: "Klicke zum den Inhalt anzusehen"
common/views/components/theme.vue:
light-theme: "Thema"
dark-theme: "Thema während des Nachtmodus"
light-themes: "Helles Thema"
dark-themes: "Dunkles Thema"
install-a-theme: "テーマのインストール"
theme-code: "テーマコード"
install: "Anwenden"
installed: "\"{}\" wurde installiert"
create-a-theme: "Thema erstellen"
save-created-theme: "Thema speichern"
primary-color: "Primäre Farbe"
secondary-color: "Sekundäre Farbe"
text-color: "Textfarbe"
base-theme: "Basisthema"
base-theme-light: "Hell"
base-theme-dark: "Dunkel"
theme-name: "Name des Themas"
preview-created-theme: "Vorschau"
invalid-theme: "Thema ist ungültig"
already-installed: "Thema ist bereits installiert"
saved: "保存しました"
manage-themes: "テーマの管理"
builtin-themes: "標準テーマ"
my-themes: "マイテーマ"
installed-themes: "インストールされたテーマ"
select-theme: "テーマを選択してください"
uninstall: "アンインストール"
uninstalled: "「{}」をアンインストールしました"
author: "Autor"
desc: "説明"
export: "Exportieren"
import: "Importieren"
import-by-code: "またはコードをペースト"
theme-name-required: "テーマ名は必須です。"
common/views/components/cw-button.vue: common/views/components/cw-button.vue:
hide: "隠す" hide: "隠す"
show: "もっと見る" show: "もっと見る"
@ -300,7 +335,9 @@ common/views/components/note-menu.vue:
detail: "詳細" detail: "詳細"
copy-link: "リンクをコピー" copy-link: "リンクをコピー"
favorite: "Diese Anmerkung favorisieren" favorite: "Diese Anmerkung favorisieren"
unfavorite: "Entfavorisieren"
pin: "An die Profilseite pinnen" pin: "An die Profilseite pinnen"
unpin: "ピン留め解除"
delete: "Löschen" delete: "Löschen"
delete-confirm: "Diesen Post löschen?" delete-confirm: "Diesen Post löschen?"
remote: "Auf Quelle anzeigen" remote: "Auf Quelle anzeigen"
@ -325,7 +362,7 @@ common/views/components/signin.vue:
token: "Token" token: "Token"
signing-in: "Melde an..." signing-in: "Melde an..."
signin: "Anmelden" signin: "Anmelden"
or: "または" or: "Oder"
signin-with-twitter: "Twitterでログイン" signin-with-twitter: "Twitterでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue: common/views/components/signup.vue:
@ -379,6 +416,25 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue: common/views/components/trends.vue:
count: "{}人が投稿" count: "{}人が投稿"
empty: "トレンドなし" empty: "トレンドなし"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-bot: "このアカウントはBotです"
is-locked: "フォローを承認制にする"
careful-bot: "Botからのフォローだけ承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "Laden" fetching: "Laden"
no-broadcasts: "Keine Broadcasts" no-broadcasts: "Keine Broadcasts"
@ -439,6 +495,7 @@ common/views/pages/follow.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop: desktop:
banner-crop-title: "バナーとして表示する部分を選択" banner-crop-title: "バナーとして表示する部分を選択"
@ -472,21 +529,21 @@ desktop/views/components/charts.vue:
notes: "投稿" notes: "投稿"
users: "ユーザー" users: "ユーザー"
drive: "ドライブ" drive: "ドライブ"
network: "ネットワーク" network: "Netzwerk"
charts: charts:
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計" notes-total: "投稿の積算"
users: "ユーザーの増減" users: "ユーザーの増減"
users-total: "ユーザーの累計" users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減" drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計" drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減" drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計" drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト" network-requests: "Anfragen"
network-time: "応答時間" network-time: "Antwortzeit"
network-usage: "通信量" network-usage: "Datenverkehr"
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"
@ -565,6 +622,7 @@ desktop/views/components/follow-button.vue:
following: "Folge ich" following: "Folge ich"
follow: "Folgen" follow: "Folgen"
request-pending: "Ausstehend" request-pending: "Ausstehend"
follow-processing: "フォロー処理中"
follow-request: "Follower-Anfragen" follow-request: "Follower-Anfragen"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
@ -612,14 +670,14 @@ desktop/views/components/notes.note.vue:
desktop/views/components/notes.vue: desktop/views/components/notes.vue:
error: "Laden fehlgeschlagen." error: "Laden fehlgeschlagen."
retry: "Erneut versuchen" retry: "Erneut versuchen"
load-more: "もっと読み込む" load-more: "Mehr laden"
desktop/views/components/notifications.vue: desktop/views/components/notifications.vue:
more: "Mehr" more: "Mehr"
empty: "Keine Benachrichtigungen" empty: "Keine Benachrichtigungen"
desktop/views/components/post-form.vue: desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加" add-visible-user: "+Nutzer hinzufügen"
attach-location-information: "位置情報を添付する" attach-location-information: "位置情報を添付する"
hide-contents: "内容を隠す" hide-contents: "Inhalt verstecken"
reply-placeholder: "Antworte auf diese Anmerkung..." reply-placeholder: "Antworte auf diese Anmerkung..."
quote-placeholder: "Zitiere diese Anmerkung..." quote-placeholder: "Zitiere diese Anmerkung..."
submit: "Beitragsform" submit: "Beitragsform"
@ -640,10 +698,10 @@ desktop/views/components/post-form.vue:
text-remain: "{} Zeichen verbleibend" text-remain: "{} Zeichen verbleibend"
recent-tags: "最近" recent-tags: "最近"
click-to-tagging: "クリックでタグ付け" click-to-tagging: "クリックでタグ付け"
visibility: "公開範囲" visibility: "Sichtbarkeit"
geolocation-alert: "お使いの端末は位置情報に対応していません" geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー" error: "Fehler"
enter-username: "ユーザー名を入力してください" enter-username: "Bitte gib einen Benutzernamen ein..."
annotations: "内容への注釈 (オプション)" annotations: "内容への注釈 (オプション)"
desktop/views/components/post-form-window.vue: desktop/views/components/post-form-window.vue:
note: "Neue Notiz" note: "Neue Notiz"
@ -675,6 +733,7 @@ desktop/views/components/settings.vue:
2fa: "Zwei-Faktor-Authentifizierung" 2fa: "Zwei-Faktor-Authentifizierung"
other: "Anderes" other: "Anderes"
license: "Lizenz" license: "Lizenz"
theme: "テーマ"
behaviour: "Verhalten" behaviour: "Verhalten"
fetch-on-scroll: "Aktualisieren beim scrollen" fetch-on-scroll: "Aktualisieren beim scrollen"
fetch-on-scroll-desc: "Wenn du runterscrollst empfängt die Seite automatisch zusätzliche Inhalte." fetch-on-scroll-desc: "Wenn du runterscrollst empfängt die Seite automatisch zusätzliche Inhalte."
@ -686,14 +745,18 @@ desktop/views/components/settings.vue:
advanced: "Erweiterte Einstellungen" advanced: "Erweiterte Einstellungen"
api-via-stream: "API-Anfrage via stream" api-via-stream: "API-Anfrage via stream"
api-via-stream-desc: "API-Anfrage über WebSocket statt native Aktualisierungs-API (für bessere Leistung). Diese Einstellung wird im Browser gespeichert." api-via-stream-desc: "API-Anfrage über WebSocket statt native Aktualisierungs-API (für bessere Leistung). Diese Einstellung wird im Browser gespeichert."
deck-nav: "デッキ内ナビゲーション"
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
display: "Erscheinungsbild und Anzeige" display: "Erscheinungsbild und Anzeige"
customize: "Startseite anpassen" customize: "Startseite anpassen"
wallpaper: "壁紙"
choose-wallpaper: "壁紙を選択" choose-wallpaper: "壁紙を選択"
delete-wallpaper: "壁紙を削除" delete-wallpaper: "壁紙を削除"
dark-mode: "Nacht Modus" dark-mode: "Nacht Modus"
use-shadow: "UIに影を使用"
rounded-corners: "Abgerundete Ecken"
circle-icons: "Kreisförmige Icons" circle-icons: "Kreisförmige Icons"
contrasted-acct: "ユーザー名にコントラストを付ける" contrasted-acct: "ユーザー名にコントラストを付ける"
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-clock-on-header: "右上に時計を表示する"
@ -702,14 +765,14 @@ desktop/views/components/settings.vue:
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する" show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "Karte anzeigen" show-maps: "Karte anzeigen"
show-maps-desc: "Zeige den Standort zu diesem Beitrag automatisch an." deck-column-align: "デッキのカラムの位置"
deck-column-align-center: "中央"
deck-column-align-left: "左"
sound: "Ton" sound: "Ton"
enable-sounds: "Ton aktivieren" enable-sounds: "Ton aktivieren"
enable-sounds-desc: "Spiel einen Ton ab beim Erhalten eines Beitrags bzw. einer Nachricht. Diese Einstellung wird im Browser gespeichert." enable-sounds-desc: "Spiel einen Ton ab beim Erhalten eines Beitrags bzw. einer Nachricht. Diese Einstellung wird im Browser gespeichert."
volume: "Lautstärke" volume: "Lautstärke"
test: "Test" test: "Test"
mobile: "Mobil"
disable-via-mobile: "Diesen Beitrag nicht mit 'vom Handy' absenden"
language: "Sprache" language: "Sprache"
pick-language: "Sprache auswählen" pick-language: "Sprache auswählen"
recommended: "Empfohlen" recommended: "Empfohlen"
@ -745,6 +808,10 @@ desktop/views/components/settings.vue:
tools: "Werkzeuge" tools: "Werkzeuge"
task-manager: "Taskmanager" task-manager: "Taskmanager"
third-parties: "サードパーティ" third-parties: "サードパーティ"
navbar-position: "ナビゲーションバーの位置"
navbar-position-top: "上"
navbar-position-left: "左"
navbar-position-right: "右"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "詳細..."
@ -778,26 +845,12 @@ desktop/views/components/settings.drive.vue:
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: "Passwort ändern"
enter-current-password: "Derzeitiges Passwort eingeben" enter-current-password: "Derzeitiges Passwort eingeben"
enter-new-password: "Neues Passwort eingeben" enter-new-password: "Neues Passwort eingeben"
enter-new-password-again: "Neues Passwort erneut eingeben" enter-new-password-again: "Neues Passwort erneut eingeben"
not-match: "新しいパスワードが一致しません" not-match: "Passwörter stimmen nicht überein."
changed: "パスワードを変更しました" changed: "Passwort geändert"
desktop/views/components/settings.profile.vue:
avatar: "アイコン"
choice-avatar: "画像を選択"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
save: "Profil aktualisieren"
locked-account: "アカウントの保護"
is-locked: "フォローを承認制にする"
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
@ -857,7 +910,7 @@ desktop/views/components/user-preview.vue:
desktop/views/components/users-list.vue: desktop/views/components/users-list.vue:
all: "すべて" all: "すべて"
iknow: "知り合い" iknow: "知り合い"
load-more: "もっと" load-more: "Mehr"
fetching: "Lade…" fetching: "Lade…"
desktop/views/components/users-list-item.vue: desktop/views/components/users-list-item.vue:
followed: "フォローされています" followed: "フォローされています"
@ -896,10 +949,8 @@ desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
edit: "オプション" edit: "オプション"
desktop/views/pages/deck/deck.note.vue: desktop/views/pages/deck/deck.user-column.vue:
reposted-by: "{}がRenote" pinned-notes: "ピン留めされた投稿"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
@ -1034,6 +1085,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意" nsfw: "閲覧注意"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1044,6 +1097,7 @@ mobile/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
@ -1117,19 +1171,19 @@ mobile/views/components/ui.nav.vue:
mobile/views/components/user-timeline.vue: mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。" no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。" no-notes-with-media: "メディア付き投稿はありません。"
load-more: "もっと" load-more: "Mehr"
mobile/views/components/users-list.vue: mobile/views/components/users-list.vue:
all: "すべて" all: "すべて"
known: "知り合い" known: "知り合い"
load-more: "もっと" load-more: "Mehr"
mobile/views/pages/favorites.vue: mobile/views/pages/favorites.vue:
title: "お気に入り" title: "Favoriten"
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: "Mehr laden"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう" lets-start: "📦 始めましょう"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
@ -1173,23 +1227,6 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "リバーシ" reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "Profil"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-locked: "フォローを承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "Profil wurde aktualisiert"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"
@ -1219,6 +1256,7 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示" notification-position: "通知の表示"
notification-position-bottom: "下" notification-position-bottom: "下"
notification-position-top: "上" notification-position-top: "上"
theme: "テーマ"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
note-visibility: "投稿の公開範囲" note-visibility: "投稿の公開範囲"
@ -1259,7 +1297,7 @@ mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近の投稿"
images: "画像" images: "画像"
activity: "アクティビティ" activity: "アクティビティ"
keywords: "キーワード" keywords: "Schlagwörter"
domains: "頻出ドメイン" domains: "頻出ドメイン"
frequently-replied-users: "よく会話するユーザー" frequently-replied-users: "よく会話するユーザー"
followers-you-know: "知り合いのフォロワー" followers-you-know: "知り合いのフォロワー"

View File

@ -109,8 +109,8 @@ common:
use-contrast-reversi-stones: "Make the stone color clear in reversi" use-contrast-reversi-stones: "Make the stone color clear in reversi"
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"
always-show-nsfw: "常に閲覧注意のメディアを表示する" always-show-nsfw: "Always show NSFW contents"
always-mark-nsfw: "Always post with a warning about media attachment" always-mark-nsfw: "Always mark posts with media attachments as NSFW"
show-full-acct: "Do not omit the hostname from the username" show-full-acct: "Do not omit the hostname from the username"
reduce-motion: "Reduce motion in UI" reduce-motion: "Reduce motion in UI"
this-setting-is-this-device-only: "Only for this device" this-setting-is-this-device-only: "Only for this device"
@ -158,7 +158,7 @@ common:
hashtag: "Hashtag" hashtag: "Hashtag"
global: "Global" global: "Global"
mentions: "Mentions" mentions: "Mentions"
direct: "ダイレクト投稿" direct: "Direct post"
notifications: "Notifications" notifications: "Notifications"
list: "Lists" list: "Lists"
swap-left: "Move to the left" swap-left: "Move to the left"
@ -264,6 +264,41 @@ common/views/components/connect-failed.troubleshooter.vue:
common/views/components/media-banner.vue: common/views/components/media-banner.vue:
sensitive: "NSFW" sensitive: "NSFW"
click-to-show: "Click to show" click-to-show: "Click to show"
common/views/components/theme.vue:
light-theme: "Theme"
dark-theme: "Theme during dark mode"
light-themes: "Light theme"
dark-themes: "Dark theme"
install-a-theme: "Install a theme"
theme-code: "Theme code"
install: "Install"
installed: "\"{}\" has been installed"
create-a-theme: "Create a theme"
save-created-theme: "Save a theme"
primary-color: "Primary color"
secondary-color: "Secondary color"
text-color: "Text color"
base-theme: "Base theme"
base-theme-light: "Light"
base-theme-dark: "Dark"
theme-name: "Theme name"
preview-created-theme: "Preview"
invalid-theme: "Not valid theme"
already-installed: "This theme is already installed."
saved: "Saved"
manage-themes: "Themes manager"
builtin-themes: "Standard themes"
my-themes: "My themes"
installed-themes: "Installed themes"
select-theme: "Select your theme"
uninstall: "Uninstall"
uninstalled: "\"{}\" has been uninstalled"
author: "Author"
desc: "Description"
export: "Export"
import: "Import"
import-by-code: "or paste code"
theme-name-required: "Theme name is required"
common/views/components/cw-button.vue: common/views/components/cw-button.vue:
hide: "Hide" hide: "Hide"
show: "See more" show: "See more"
@ -300,7 +335,9 @@ common/views/components/note-menu.vue:
detail: "Details" detail: "Details"
copy-link: "Copy link" copy-link: "Copy link"
favorite: "Favorite this note" favorite: "Favorite this note"
unfavorite: "Unfavorite"
pin: "Pin to your profile" pin: "Pin to your profile"
unpin: "Unpin"
delete: "Delete" delete: "Delete"
delete-confirm: "Delete this post?" delete-confirm: "Delete this post?"
remote: "Show original note" remote: "Show original note"
@ -379,6 +416,25 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue: common/views/components/trends.vue:
count: "{} users mentioned" count: "{} users mentioned"
empty: "No popular hashtag trends" empty: "No popular hashtag trends"
common/views/components/profile-editor.vue:
title: "Profile"
name: "Name"
account: "Account"
location: "Location"
description: "About me"
birthday: "Birthday"
avatar: "Avatar"
banner: "Banner"
is-cat: "This account is a Cat"
is-bot: "This account is a Bot"
is-locked: "Follower requests require approval"
careful-bot: "Follower requests from bots require approval"
advanced: "Advanced"
privacy: "Privacy"
save: "Update profile"
saved: "Profile updated successfully"
uploading: "Uploading"
upload-failed: "Failed to upload"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "Fetching" fetching: "Fetching"
no-broadcasts: "No announcements" no-broadcasts: "No announcements"
@ -426,7 +482,7 @@ common/views/widgets/tips.vue:
tips-line10: "Using the Time Machine widget makes it easy to trace back to the past timeline." tips-line10: "Using the Time Machine widget makes it easy to trace back to the past timeline."
tips-line11: "You can pin posts to user page by clicking on \"...\"" tips-line11: "You can pin posts to user page by clicking on \"...\""
tips-line13: "All the files attached to the post are saved to Drive." tips-line13: "All the files attached to the post are saved to Drive."
tips-line14: "While customizing the home, you can right click on the widget and change the design." tips-line14: "While customizing your home layout, you can right click on a widget to change its design."
tips-line17: "Surrounding the text with ** ** will highlight it." tips-line17: "Surrounding the text with ** ** will highlight it."
tips-line19: "Several windows can be detached outside the browser." tips-line19: "Several windows can be detached outside the browser."
tips-line20: "The percentage of the calendar widget shows the percentage of time elapsed." tips-line20: "The percentage of the calendar widget shows the percentage of time elapsed."
@ -478,13 +534,13 @@ desktop/views/components/charts.vue:
notes: "The number of posts: increase/decrease (Combined)" notes: "The number of posts: increase/decrease (Combined)"
local-notes: "The number of posts: increase/decrease (Local)" local-notes: "The number of posts: increase/decrease (Local)"
remote-notes: "The number of posts: increase/decrease (Remote)" remote-notes: "The number of posts: increase/decrease (Remote)"
notes-total: "The number of posts: cumulative total" notes-total: "Total posts"
users: "The number of users: increase/decrease" users: "The number of users: increase/decrease"
users-total: "The number of users: cumulative total" users-total: "Total users"
drive: "Capacity used as the storage: increase/decrease" drive: "Capacity used as the storage: increase/decrease"
drive-total: "Capacity used as the storage: cumulative total" drive-total: "Total usage of Drive"
drive-files: "The number of files on the storage: increase/decrease" drive-files: "The number of files on the storage: increase/decrease"
drive-files-total: "The number of files on the storage: cumulative total" drive-files-total: "Total number of files on Drive"
network-requests: "Requests" network-requests: "Requests"
network-time: "Response time" network-time: "Response time"
network-usage: "Traffic" network-usage: "Traffic"
@ -677,6 +733,7 @@ desktop/views/components/settings.vue:
2fa: "Two-factor authentication" 2fa: "Two-factor authentication"
other: "Other" other: "Other"
license: "License" license: "License"
theme: "Theme"
behaviour: "Behavior" behaviour: "Behavior"
fetch-on-scroll: "Endless loading on scroll" fetch-on-scroll: "Endless loading on scroll"
fetch-on-scroll-desc: "When you scroll down the page, it automatically fetches additional content." fetch-on-scroll-desc: "When you scroll down the page, it automatically fetches additional content."
@ -688,14 +745,18 @@ desktop/views/components/settings.vue:
advanced: "Advanced settings" advanced: "Advanced settings"
api-via-stream: "API request via stream" api-via-stream: "API request via stream"
api-via-stream-desc: "API request is performed via the WebSocket connection instead of native fetch API (for better performance). This setting is stored in the browser." api-via-stream-desc: "API request is performed via the WebSocket connection instead of native fetch API (for better performance). This setting is stored in the browser."
deck-nav: "デッキ内ナビゲーション"
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
display: "Design and display" display: "Design and display"
customize: "Customize home layout" customize: "Customize home layout"
wallpaper: "Wallpaper"
choose-wallpaper: "Choose a background" choose-wallpaper: "Choose a background"
delete-wallpaper: "Remove background" delete-wallpaper: "Remove background"
dark-mode: "Dark Mode" dark-mode: "Dark Mode"
use-shadow: "Use shadows in the UI"
rounded-corners: "Round corners of UI"
circle-icons: "Use circle icons" circle-icons: "Use circle icons"
contrasted-acct: "Add contrast to username" contrasted-acct: "Add contrast to username"
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-clock-on-header: "Show clock on upper-right"
@ -704,14 +765,14 @@ desktop/views/components/settings.vue:
show-renoted-my-notes: "Show renoted my posts in timelines" show-renoted-my-notes: "Show renoted my posts in timelines"
show-local-renotes: "Show renoted local posts in timelines" show-local-renotes: "Show renoted local posts in timelines"
show-maps: "Display a map to show the location" show-maps: "Display a map to show the location"
show-maps-desc: "If there comes a post contains location information, show a map to display the location." deck-column-align: "Deck column alignment"
deck-column-align-center: "Center"
deck-column-align-left: "Left"
sound: "Sound" sound: "Sound"
enable-sounds: "Enable sound" enable-sounds: "Enable sound"
enable-sounds-desc: "Play a sound when you receive a post/message. This setting is stored in the browser." enable-sounds-desc: "Play a sound when you receive a post/message. This setting is stored in the browser."
volume: "Volume" volume: "Volume"
test: "Test" test: "Test"
mobile: "Mobile"
disable-via-mobile: "Don't mark the post as 'from mobile'"
language: "Language" language: "Language"
pick-language: "Select a language" pick-language: "Select a language"
recommended: "Recommended" recommended: "Recommended"
@ -747,6 +808,10 @@ desktop/views/components/settings.vue:
tools: "Tools" tools: "Tools"
task-manager: "Task Manager" task-manager: "Task Manager"
third-parties: "Third-parties" third-parties: "Third-parties"
navbar-position: "Navigation bar position"
navbar-position-top: "Top"
navbar-position-left: "Left"
navbar-position-right: "Right"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "If you set up 2-step verification, you will not only need a password at sign-in, but also a pre-registered physical device (such as your smartphone), which will improve security." intro: "If you set up 2-step verification, you will not only need a password at sign-in, but also a pre-registered physical device (such as your smartphone), which will improve security."
detail: "Details…" detail: "Details…"
@ -786,20 +851,6 @@ desktop/views/components/settings.password.vue:
enter-new-password-again: "Enter new password again" enter-new-password-again: "Enter new password again"
not-match: "The new passwords do not match" not-match: "The new passwords do not match"
changed: "Password updated" changed: "Password updated"
desktop/views/components/settings.profile.vue:
avatar: "Avatar"
choice-avatar: "Select an image"
name: "Name"
location: "Location"
description: "Description"
birthday: "Birthday"
save: "Update profile"
locked-account: "Protect your account"
is-locked: "Follow request needs approval"
other: "Other"
is-bot: "This account is a Bot"
is-cat: "This account is a Cat"
profile-updated: "Your profile has been updated"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "This post is private" private: "This post is private"
deleted: "This post has been deleted" deleted: "This post has been deleted"
@ -898,10 +949,8 @@ 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"
edit: "Options" edit: "Options"
desktop/views/pages/deck/deck.note.vue: desktop/views/pages/deck/deck.user-column.vue:
reposted-by: "Reposted by {}" pinned-notes: "Pinned posts"
private: "This post is private"
deleted: "This post has been deleted"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "All Users" all-users: "All Users"
original-users: "Users on this instance" original-users: "Users on this instance"
@ -916,7 +965,7 @@ desktop/views/pages/welcome.vue:
signup-button: "Sign up" signup-button: "Sign up"
timeline: "Timeline" timeline: "Timeline"
announcements: "Announcements" announcements: "Announcements"
photos: "Recent uploaded" photos: "Recent Images"
powered-by-misskey: "Powered by <b>Misskey</b>." powered-by-misskey: "Powered by <b>Misskey</b>."
info: "Information" info: "Information"
desktop/views/pages/drive.vue: desktop/views/pages/drive.vue:
@ -1036,6 +1085,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "Hash (md5)" hash: "Hash (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "NSFW" nsfw: "NSFW"
mark-as-sensitive: "Mark as 'sensitive'"
unmark-as-sensitive: "Unmark as 'sensitive'"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "NSFW" sensitive: "NSFW"
click-to-show: "Click to show" click-to-show: "Click to show"
@ -1119,7 +1170,7 @@ mobile/views/components/ui.nav.vue:
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."
no-notes-with-media: "There are no posts attaching media" no-notes-with-media: "There are no notes with media attachments"
load-more: "More" load-more: "More"
mobile/views/components/users-list.vue: mobile/views/components/users-list.vue:
all: "All" all: "All"
@ -1176,23 +1227,6 @@ mobile/views/pages/notifications.vue:
read-all: "Do you wish to mark all notifications as read?" read-all: "Do you wish to mark all notifications as read?"
mobile/views/pages/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "Reversi" reversi: "Reversi"
mobile/views/pages/settings/settings.profile.vue:
title: "Profile"
name: "Name"
account: "Account"
location: "Location"
description: "Biography"
birthday: "Birthday"
avatar: "Avatar"
banner: "Banner"
is-cat: "This account is a Cat"
is-locked: "Follow request needs approval"
advanced: "Advanced"
privacy: "Privacy"
save: "Update profile"
saved: "Profile updated"
uploading: "Uploading"
upload-failed: "Failed to upload"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "Search" search: "Search"
empty: "No posts were found for '{}'" empty: "No posts were found for '{}'"
@ -1222,6 +1256,7 @@ mobile/views/pages/settings.vue:
notification-position: "Notification style" notification-position: "Notification style"
notification-position-bottom: "Bottom" notification-position-bottom: "Bottom"
notification-position-top: "Top" notification-position-top: "Top"
theme: "Theme"
behavior: "Behavior" behavior: "Behavior"
fetch-on-scroll: "Endless loading on scroll" fetch-on-scroll: "Endless loading on scroll"
note-visibility: "Post visibility" note-visibility: "Post visibility"

View File

@ -264,6 +264,41 @@ common/views/components/connect-failed.troubleshooter.vue:
common/views/components/media-banner.vue: common/views/components/media-banner.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
common/views/components/theme.vue:
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
dark-themes: "暗いテーマ"
install-a-theme: "テーマのインストール"
theme-code: "テーマコード"
install: "インストール"
installed: "「{}」をインストールしました"
create-a-theme: "テーマの作成"
save-created-theme: "テーマを保存"
primary-color: "プライマリ カラー"
secondary-color: "セカンダリ カラー"
text-color: "文字色"
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Dark"
theme-name: "テーマ名"
preview-created-theme: "プレビュー"
invalid-theme: "テーマが正しくありません。"
already-installed: "既にそのテーマはインストールされています。"
saved: "保存しました"
manage-themes: "テーマの管理"
builtin-themes: "標準テーマ"
my-themes: "マイテーマ"
installed-themes: "インストールされたテーマ"
select-theme: "テーマを選択してください"
uninstall: "アンインストール"
uninstalled: "「{}」をアンインストールしました"
author: "作者"
desc: "説明"
export: "エクスポート"
import: "インポート"
import-by-code: "またはコードをペースト"
theme-name-required: "テーマ名は必須です。"
common/views/components/cw-button.vue: common/views/components/cw-button.vue:
hide: "隠す" hide: "隠す"
show: "もっと見る" show: "もっと見る"
@ -300,7 +335,9 @@ common/views/components/note-menu.vue:
detail: "Detalles" detail: "Detalles"
copy-link: "Copiar enlace" copy-link: "Copiar enlace"
favorite: "Me gusta esta nota" favorite: "Me gusta esta nota"
unfavorite: "お気に入り解除"
pin: "Fijar en el perfil" pin: "Fijar en el perfil"
unpin: "ピン留め解除"
delete: "Borrar" delete: "Borrar"
delete-confirm: "¿Seguro que quieres borrar la publicación?" delete-confirm: "¿Seguro que quieres borrar la publicación?"
remote: "Ver el original" remote: "Ver el original"
@ -379,6 +416,25 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue: common/views/components/trends.vue:
count: "{}人が投稿" count: "{}人が投稿"
empty: "トレンドなし" empty: "トレンドなし"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-bot: "このアカウントはBotです"
is-locked: "フォローを承認制にする"
careful-bot: "Botからのフォローだけ承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "Recuperando" fetching: "Recuperando"
no-broadcasts: "Sin emisión" no-broadcasts: "Sin emisión"
@ -439,6 +495,7 @@ common/views/pages/follow.vue:
following: "Siguiendo" following: "Siguiendo"
follow: "Seguir" follow: "Seguir"
request-pending: "Solicitud pendiente" request-pending: "Solicitud pendiente"
follow-processing: "フォロー処理中"
follow-request: "Solicitar suscripción" follow-request: "Solicitar suscripción"
desktop: desktop:
banner-crop-title: "Corta la parte que aparece como un banner" banner-crop-title: "Corta la parte que aparece como un banner"
@ -477,13 +534,13 @@ desktop/views/components/charts.vue:
notes: "Número de publicaciones: aumentar/disminuir (Combinado)" notes: "Número de publicaciones: aumentar/disminuir (Combinado)"
local-notes: "Número de publicaciones: aumentar/disminuir (Local)" local-notes: "Número de publicaciones: aumentar/disminuir (Local)"
remote-notes: "Número de publicaciones: aumentar/disminuir (Remoto)" remote-notes: "Número de publicaciones: aumentar/disminuir (Remoto)"
notes-total: "Número de publicaciones: Acumulativo total" notes-total: "投稿の積算"
users: "Número de usuarios: aumentar/disminuir" users: "Número de usuarios: aumentar/disminuir"
users-total: "Número de usuarios: Acumulativo total" users-total: "ユーザーの積算"
drive: "Capacidad de almacenamiento usada: aumentar/disminuir" drive: "Capacidad de almacenamiento usada: aumentar/disminuir"
drive-total: "Capacidad de almacenamiento usada: Acumulativa total" drive-total: "ドライブ使用量の積算"
drive-files: "Número de archivos almacenados: aumentar/disminuir" drive-files: "Número de archivos almacenados: aumentar/disminuir"
drive-files-total: "Número de archivos almacenados: Acumulativo total" drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト" network-requests: "リクエスト"
network-time: "応答時間" network-time: "応答時間"
network-usage: "通信量" network-usage: "通信量"
@ -565,6 +622,7 @@ desktop/views/components/follow-button.vue:
following: "Siguiendo" following: "Siguiendo"
follow: "Sigue" follow: "Sigue"
request-pending: "Pendiente de aprobación" request-pending: "Pendiente de aprobación"
follow-processing: "フォロー処理中"
follow-request: "Solicitud de seguir" follow-request: "Solicitud de seguir"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} seguidores" followers: "{} seguidores"
@ -675,6 +733,7 @@ desktop/views/components/settings.vue:
2fa: "Autenticación de Doble-Factor" 2fa: "Autenticación de Doble-Factor"
other: "Otros" other: "Otros"
license: "Licencia" license: "Licencia"
theme: "テーマ"
behaviour: "Acciones" behaviour: "Acciones"
fetch-on-scroll: "Desplazamiento infinito" fetch-on-scroll: "Desplazamiento infinito"
fetch-on-scroll-desc: "Cuando te deslizas al final de la página nuevo contenido se carga automáticamente." fetch-on-scroll-desc: "Cuando te deslizas al final de la página nuevo contenido se carga automáticamente."
@ -686,14 +745,18 @@ desktop/views/components/settings.vue:
advanced: "Configuración avanzada" advanced: "Configuración avanzada"
api-via-stream: "Solicitar API por medio de un stream" api-via-stream: "Solicitar API por medio de un stream"
api-via-stream-desc: "Las peticiones de las API se realizan por conexiones WebSocket en lugar de las tradicionales (para una mejora en el rendimiento). Esta función depende del navegador." api-via-stream-desc: "Las peticiones de las API se realizan por conexiones WebSocket en lugar de las tradicionales (para una mejora en el rendimiento). Esta función depende del navegador."
deck-nav: "デッキ内ナビゲーション"
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
display: "Diseño y pantalla" display: "Diseño y pantalla"
customize: "Personaliza la página principal" customize: "Personaliza la página principal"
wallpaper: "壁紙"
choose-wallpaper: "Elije un fondo" choose-wallpaper: "Elije un fondo"
delete-wallpaper: "Suprimir fondo" delete-wallpaper: "Suprimir fondo"
dark-mode: "Modo Nocturno" dark-mode: "Modo Nocturno"
use-shadow: "UIに影を使用"
rounded-corners: "UIの角を丸める"
circle-icons: "Usar iconos circulares" circle-icons: "Usar iconos circulares"
contrasted-acct: "ユーザー名にコントラストを付ける" contrasted-acct: "ユーザー名にコントラストを付ける"
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-clock-on-header: "右上に時計を表示する"
@ -702,14 +765,14 @@ desktop/views/components/settings.vue:
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する" show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開" show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。" deck-column-align: "デッキのカラムの位置"
deck-column-align-center: "中央"
deck-column-align-left: "左"
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。" enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム" volume: "ボリューム"
test: "テスト" test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語" language: "言語"
pick-language: "言語を選択" pick-language: "言語を選択"
recommended: "推奨" recommended: "推奨"
@ -745,6 +808,10 @@ desktop/views/components/settings.vue:
tools: "Herramientas" tools: "Herramientas"
task-manager: "Navegador de tareas" task-manager: "Navegador de tareas"
third-parties: "Servicios externos" third-parties: "Servicios externos"
navbar-position: "ナビゲーションバーの位置"
navbar-position-top: "上"
navbar-position-left: "左"
navbar-position-right: "右"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "Ver detalles..." detail: "Ver detalles..."
@ -784,20 +851,6 @@ desktop/views/components/settings.password.vue:
enter-new-password-again: "Ingresar nueva contraseña de nuevo" enter-new-password-again: "Ingresar nueva contraseña de nuevo"
not-match: "Las nuevas contraseñas no se corresponden consigo mismas" not-match: "Las nuevas contraseñas no se corresponden consigo mismas"
changed: "Contraseña actualizada" changed: "Contraseña actualizada"
desktop/views/components/settings.profile.vue:
avatar: "Avatar"
choice-avatar: "Escoger una imagen"
name: "Nombre"
location: "Localización"
description: "Descripción"
birthday: "Fecha de nacimiento"
save: "Perfil actualizado"
locked-account: "Protege tu cuenta"
is-locked: "フォローを承認制にする"
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
@ -896,10 +949,8 @@ desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
edit: "オプション" edit: "オプション"
desktop/views/pages/deck/deck.note.vue: desktop/views/pages/deck/deck.user-column.vue:
reposted-by: "{}がRenote" pinned-notes: "ピン留めされた投稿"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
@ -1034,6 +1085,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意" nsfw: "閲覧注意"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1044,6 +1097,7 @@ mobile/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
@ -1173,23 +1227,6 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "リバーシ" reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-locked: "フォローを承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"
@ -1219,6 +1256,7 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示" notification-position: "通知の表示"
notification-position-bottom: "下" notification-position-bottom: "下"
notification-position-top: "上" notification-position-top: "上"
theme: "テーマ"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
note-visibility: "投稿の公開範囲" note-visibility: "投稿の公開範囲"

View File

@ -5,11 +5,11 @@ meta:
common: common:
misskey: "Une ⭐ du fédiverse" misskey: "Une ⭐ du fédiverse"
about-title: "Une ⭐ du fédivers." about-title: "Une ⭐ du fédivers."
about: "Merci d'avoir découvert Misskey. Misskey est une <b>plateforme de microblogage distribuée</b> née sur Terre. Parce qu'il fait partie du Fédivers (un univers composé de diverses plateformes de réseaux sociaux organisées), il est mutuellement connecté avec d'autres plateformes de réseaux sociaux. Désirez-vous prendre une pause, pendant un instant, loin de l'agitation de la ville et plonger dans un nouvel Internet ?" about: "Merci davoir choisis Misskey. Misskey est une <b>plateforme de micro-blogging distribuée</b> née sur Terre et fait partie du Fédiverse (un univers composé de diverses plateformes de réseaux sociaux organisées), elle est connectée mutuellement avec dautres plateformes de réseaux sociaux. Désirez-vous prendre une pause, un court instant, loin de lagitation de la ville et plonger dans un Internet dun nouveau genre ?"
intro: intro:
title: "Cest quoi Misskey ?" title: "Cest quoi Misskey ?"
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。" about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
features: "Fonctionnalités" features: "Options"
rich-contents: "Notes" rich-contents: "Notes"
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。" rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
reaction: "Réactions" reaction: "Réactions"
@ -32,9 +32,9 @@ common:
paragraph2: "Vous pouvez changer l'affichage en <strong>cliquant droit</strong> sur certains widgets." paragraph2: "Vous pouvez changer l'affichage en <strong>cliquant droit</strong> sur certains widgets."
paragraph3: "Pour supprimer un widget, <strong>glissez et déposez le widget sur la zone étiquetée « Corbeille »</strong> dans l'en-tête." paragraph3: "Pour supprimer un widget, <strong>glissez et déposez le widget sur la zone étiquetée « Corbeille »</strong> dans l'en-tête."
paragraph4: "Pour terminer la personnalisation, cliquez sur \"Terminer\" dans le coin supérieur droit." paragraph4: "Pour terminer la personnalisation, cliquez sur \"Terminer\" dans le coin supérieur droit."
gotit: "Compris!" gotit: "Compris !"
notification: notification:
file-uploaded: "Le fichier a été téléversé !" file-uploaded: "Le fichier a été transféré !"
message-from: "Message de {} :" message-from: "Message de {} :"
reversi-invited: "Invité à jouer" reversi-invited: "Invité à jouer"
reversi-invited-by: "Invité par {} :" reversi-invited-by: "Invité par {} :"
@ -43,7 +43,7 @@ common:
quoted-by: "Cité·e par {} :" quoted-by: "Cité·e par {} :"
time: time:
unknown: "inconnu" unknown: "inconnu"
future: "à l'instant" future: "à linstant"
just_now: "à l'instant" just_now: "à l'instant"
seconds_ago: "Il y a {} seconde·s" seconds_ago: "Il y a {} seconde·s"
minutes_ago: "Il y a {} minute·s" minutes_ago: "Il y a {} minute·s"
@ -52,7 +52,7 @@ common:
weeks_ago: "Il y a {} semaines·s" weeks_ago: "Il y a {} semaines·s"
months_ago: "Il y a {} mois" months_ago: "Il y a {} mois"
years_ago: "Il y a {} an·s" years_ago: "Il y a {} an·s"
month-and-day: "{month}/{day}" month-and-day: "{month} mois/{day} jour"
trash: "Corbeille" trash: "Corbeille"
weekday-short: weekday-short:
sunday: "D" sunday: "D"
@ -83,17 +83,17 @@ common:
pudding: "Pudding" pudding: "Pudding"
note-visibility: note-visibility:
public: "Public" public: "Public"
home: "Accueil" home: "Principal"
home-desc: "Publier sur le fil local uniquement" home-desc: "Publier sur le fil principal uniquement"
followers: "Abonnés·es" followers: "Abonnés·es"
followers-desc: "Publier à vos abonnés·es uniquement" followers-desc: "Publier à vos abonnés·es uniquement"
specified: "Direct" specified: "Direct"
specified-desc: "Publier aux utilisateurs·trices mentionnés·es" specified-desc: "Publier uniquement aux utilisateurs·rices mentionnés·es"
private: "Privé" private: "Privé"
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: "Quavez-vous en tête ?"
d: "Désirez-vous publier quelques mots ?" 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"
@ -103,7 +103,7 @@ common:
ok: "OK" ok: "OK"
update-available-title: "Mise à jour disponible" update-available-title: "Mise à jour disponible"
update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour." update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour."
my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté." my-token-regenerated: "Votre jeton 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: "リバーシのアイコンにコントラストを付ける" use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
@ -111,7 +111,7 @@ common:
disable-animated-mfm: "Désactiver les textes animés dans les publications" disable-animated-mfm: "Désactiver les textes animés dans les publications"
always-show-nsfw: "常に閲覧注意のメディアを表示する" always-show-nsfw: "常に閲覧注意のメディアを表示する"
always-mark-nsfw: "常にメディアを閲覧注意として投稿" always-mark-nsfw: "常にメディアを閲覧注意として投稿"
show-full-acct: "ユーザー名のホストを省略しない" show-full-acct: "Afficher ladresse complète de lutilisateur"
reduce-motion: "Réduire les animations dans linterface utilisateur" reduce-motion: "Réduire les animations dans linterface utilisateur"
this-setting-is-this-device-only: "Uniquement sur cet appareil" this-setting-is-this-device-only: "Uniquement sur cet appareil"
do-not-use-in-production: 'Il sagit dune version de développement. Ne pas utiliser dans un environnement de production.' do-not-use-in-production: 'Il sagit dune version de développement. Ne pas utiliser dans un environnement de production.'
@ -120,7 +120,7 @@ common:
my-turn: "Cest votre tour" my-turn: "Cest votre tour"
opponent-turn: "Tour de ladversaire" opponent-turn: "Tour de ladversaire"
turn-of: "Cest le tour de {}" turn-of: "Cest le tour de {}"
past-turn-of: "C'est au tour de {}" past-turn-of: "Cest au tour de {}"
won: "{} a gagné" won: "{} a gagné"
black: "Noirs" black: "Noirs"
white: "Blancs" white: "Blancs"
@ -136,7 +136,7 @@ common:
memo: "Pense-bête" memo: "Pense-bête"
trends: "Tendances" trends: "Tendances"
photo-stream: "Flux de photos" photo-stream: "Flux de photos"
posts-monitor: "Graphe des publications" posts-monitor: "Graph des publications"
slideshow: "Diaporama" slideshow: "Diaporama"
version: "Version" version: "Version"
broadcast: "Diffusion" broadcast: "Diffusion"
@ -149,16 +149,16 @@ common:
donation: "Dons" donation: "Dons"
nav: "Navigation" nav: "Navigation"
tips: "Conseils" tips: "Conseils"
hashtags: "Étiquettes" hashtags: "Hashtags"
deck: deck:
widgets: "Widgets" widgets: "Widgets"
home: "Accueil" home: "Accueil"
local: "Local" local: "Local"
hybrid: "Social" hybrid: "Social"
hashtag: "ハッシュタグ" hashtag: "Hashtag"
global: "Global" global: "Global"
mentions: "Mentions" mentions: "Mentions"
direct: "ダイレクト投稿" direct: "Messages directs"
notifications: "Notifications" notifications: "Notifications"
list: "Liste" list: "Liste"
swap-left: "Déplacer à gauche" swap-left: "Déplacer à gauche"
@ -189,7 +189,7 @@ auth/views/index.vue:
denied: "L'autorisation de l'application a été refusée." denied: "L'autorisation de l'application a été refusée."
denied-paragraph: "Cette application ne va pas accéder à votre compte." denied-paragraph: "Cette application ne va pas accéder à votre compte."
already-authorized: "Cette application est déjà autorisée" already-authorized: "Cette application est déjà autorisée"
allowed: "アプリケーションの連携を許可しました" allowed: "Permissions autorisées de lapplication."
callback-url: "Retour vers l'application" callback-url: "Retour vers l'application"
please-go-back: "Veillez retourner à l'application." please-go-back: "Veillez retourner à l'application."
error: "La session n'existe pas." error: "La session n'existe pas."
@ -254,7 +254,7 @@ common/views/components/connect-failed.troubleshooter.vue:
no-network: "Aucune connexion au réseau" no-network: "Aucune connexion au réseau"
no-network-desc: "Veuillez vérifier que vous êtes bien connecté au réseau." no-network-desc: "Veuillez vérifier que vous êtes bien connecté au réseau."
no-internet: "Aucune connexion internet." no-internet: "Aucune connexion internet."
no-internet-desc: "Veuillez vérifier que vous êtes bien connecté à internet." no-internet-desc: "Assurez-vous que vous êtes bien connectés à internet."
no-server: "Impossible de se connecter au serveur" no-server: "Impossible de se connecter au serveur"
no-server-desc: "Votre connexion semble correcte, mais il a été impossible de vous connecter au serveur de Misskey. Il se peut que le serveur soit hors-ligne ou en maintenance, veuillez ressayer plus tard." no-server-desc: "Votre connexion semble correcte, mais il a été impossible de vous connecter au serveur de Misskey. Il se peut que le serveur soit hors-ligne ou en maintenance, veuillez ressayer plus tard."
success: "Connexion au serveur de Misskey réussie !" success: "Connexion au serveur de Misskey réussie !"
@ -264,6 +264,41 @@ common/views/components/connect-failed.troubleshooter.vue:
common/views/components/media-banner.vue: common/views/components/media-banner.vue:
sensitive: "Contenu sensible" sensitive: "Contenu sensible"
click-to-show: "Cliquer pour afficher" click-to-show: "Cliquer pour afficher"
common/views/components/theme.vue:
light-theme: "Thème durant le mode clair"
dark-theme: "Thème durant le mode sombre"
light-themes: "Thème clair"
dark-themes: "Thème sombre"
install-a-theme: "Installer un thème"
theme-code: "Code du thème"
install: "Installation"
installed: "« {} » a été installé"
create-a-theme: "Créer un thème"
save-created-theme: "Enregistrer le thème"
primary-color: "Couleur primaire"
secondary-color: "Couleur secondaire"
text-color: "Couleur du texte"
base-theme: "Thème de base"
base-theme-light: "Clair"
base-theme-dark: "Sombre"
theme-name: "Nom du Thème"
preview-created-theme: "Prévisualisation"
invalid-theme: "Thème nest pas valide."
already-installed: "Le thème est déjà installé."
saved: "enregistré"
manage-themes: "Gestion des thèmes"
builtin-themes: "Thèmes standards"
my-themes: "Mes thèmes"
installed-themes: "Thèmes installés"
select-theme: "Veuillez sélectionner un thème"
uninstall: "Désinstaller"
uninstalled: "« {} » a été désinstallé"
author: "Auteur"
desc: "Description"
export: "Exporter"
import: "Importer"
import-by-code: "Ou coller du code"
theme-name-required: "Nom du thème est obligatoire."
common/views/components/cw-button.vue: common/views/components/cw-button.vue:
hide: "Masquer" hide: "Masquer"
show: "Voir plus" show: "Voir plus"
@ -294,13 +329,15 @@ common/views/components/nav.vue:
wiki: "Wiki" wiki: "Wiki"
donors: "Donateur·rice·s" donors: "Donateur·rice·s"
repository: "Dépôt" repository: "Dépôt"
develop: "Développeur·se·s" develop: "Développeurs"
feedback: "Remarques" feedback: "Suggestions"
common/views/components/note-menu.vue: common/views/components/note-menu.vue:
detail: "Détails" detail: "Détails"
copy-link: "Copier le lien" copy-link: "Copier le lien"
favorite: "Mettre cette note en favoris" favorite: "Mettre cette note en favoris"
unfavorite: "Retirer des favoris"
pin: "Épingler sur votre profil" pin: "Épingler sur votre profil"
unpin: "Désépingler"
delete: "Supprimer" delete: "Supprimer"
delete-confirm: "Supprimer cette publication ?" delete-confirm: "Supprimer cette publication ?"
remote: "Afficher la note originale" remote: "Afficher la note originale"
@ -374,11 +411,30 @@ common/views/components/visibility-chooser.vue:
followers: "Abonné·e·s" followers: "Abonné·e·s"
followers-desc: "Publier à vos abonné·e·s uniquement" followers-desc: "Publier à vos abonné·e·s uniquement"
specified: "Direct" specified: "Direct"
specified-desc: "Publier aux utilisateur·rice·s mentionné·e·s" specified-desc: "Publier uniquement aux utilisateurs·rices mentionné·e·s"
private: "Privé" private: "Privé"
common/views/components/trends.vue: common/views/components/trends.vue:
count: "{} utilisateurs·trices mentionnés·es" count: "{} utilisateurs·rices mentionnés·es"
empty: "Aucune tendance" empty: "Aucune tendance"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-bot: "このアカウントはBotです"
is-locked: "フォローを承認制にする"
careful-bot: "Botからのフォローだけ承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "Récupération" fetching: "Récupération"
no-broadcasts: "Aucune annonce" no-broadcasts: "Aucune annonce"
@ -398,10 +454,10 @@ common/views/widgets/photo-stream.vue:
title: "Flux de photos" title: "Flux de photos"
no-photos: "Pas de photo" no-photos: "Pas de photo"
common/views/widgets/posts-monitor.vue: common/views/widgets/posts-monitor.vue:
title: "Graphe des publications" title: "Graph des publications"
toggle: "Basculer entre les vues" toggle: "Basculer entre les vues"
common/views/widgets/hashtags.vue: common/views/widgets/hashtags.vue:
title: "Étiquettes" title: "Hashtags"
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "Informations sur le serveur" title: "Informations sur le serveur"
toggle: "Afficher les vues" toggle: "Afficher les vues"
@ -420,7 +476,7 @@ common/views/widgets/tips.vue:
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: "Vous pouvez déplacer un dossier en le glissant dans le Drive" tips-line6: "Vous pouvez déplacer un dossier en le glissant dans le Drive"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます" tips-line7: "Vous pouvez déplacer des dossiers en les glissant dans le Drive"
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"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます" tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
@ -428,7 +484,7 @@ common/views/widgets/tips.vue:
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive" tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます" tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "Vous pouvez mettre un texte en surbrillance en le mettant entre ** **" tips-line17: "Vous pouvez mettre un texte en surbrillance en le mettant entre ** **"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます" tips-line19: "Plusieurs fenêtres peuvent être détachées en dehors du navigateur."
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています" tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "Vous pouvez aussi utiliser l'API pour développer des Bots." tips-line21: "Vous pouvez aussi utiliser l'API pour développer des Bots."
tips-line23: "Mayu est mignone avec ses sourcils." tips-line23: "Mayu est mignone avec ses sourcils."
@ -439,6 +495,7 @@ common/views/pages/follow.vue:
following: "Suit" following: "Suit"
follow: "Suivre" follow: "Suivre"
request-pending: "Demande d'abonnement en attente" request-pending: "Demande d'abonnement en attente"
follow-processing: "フォロー処理中"
follow-request: "Demande d'abonnement" follow-request: "Demande d'abonnement"
desktop: desktop:
banner-crop-title: "Découpez la partie qui apparaitra comme bannière" banner-crop-title: "Découpez la partie qui apparaitra comme bannière"
@ -451,7 +508,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: "この形式のファイルはサポートされていません" invalid-filetype: "Ce format de fichier nest pas pris en charge"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Noirs ... Total" total: "Noirs ... Total"
notes: "Bleu ... Notes" notes: "Bleu ... Notes"
@ -477,13 +534,13 @@ desktop/views/components/charts.vue:
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計" notes-total: "Total des notes"
users: "Nombre dutilisateurs·trices : augmentation/diminution" users: "Nombre dutilisateurs·trices : augmentation/diminution"
users-total: "Nombre total dutilisateurs·trices : total cumulé" users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減" drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計" drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減" drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計" drive-files-total: "ドライブのファイル数の積算"
network-requests: "Requêtes" network-requests: "Requêtes"
network-time: "Temps de réponse" network-time: "Temps de réponse"
network-usage: "Traffic" network-usage: "Traffic"
@ -545,7 +602,7 @@ desktop/views/components/drive.vue:
unable-to-process: "L'opération n'a pas pu être complétée" unable-to-process: "L'opération n'a pas pu être complétée"
circular-reference-detected: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer." circular-reference-detected: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer."
unhandled-error: "Erreur inconnue" unhandled-error: "Erreur inconnue"
url-upload: "Uploader d'un URL" url-upload: "Téléverser via une URL"
url-of-file: "URL de l'image que vous souhaitez uploader." url-of-file: "URL de l'image que vous souhaitez uploader."
url-upload-requested: "Upload requested" url-upload-requested: "Upload requested"
may-take-time: "L'upload de votre fichier peut prendre un certain temps." may-take-time: "L'upload de votre fichier peut prendre un certain temps."
@ -553,8 +610,8 @@ desktop/views/components/drive.vue:
folder-name: "Nom du dossier" folder-name: "Nom du dossier"
contextmenu: contextmenu:
create-folder: "Créer un dossier" create-folder: "Créer un dossier"
upload: "Uploader un fichier" upload: "Transférer un fichier"
url-upload: "Uploader d'un URL" url-upload: "Transférer à partir dune URL"
desktop/views/components/media-image.vue: desktop/views/components/media-image.vue:
sensitive: "Le contenu est NSFW" sensitive: "Le contenu est NSFW"
click-to-show: "Cliquer pour afficher" click-to-show: "Cliquer pour afficher"
@ -565,6 +622,7 @@ desktop/views/components/follow-button.vue:
following: "Abonnements" following: "Abonnements"
follow: "Suivre" follow: "Suivre"
request-pending: "En attente d'approbation" request-pending: "En attente d'approbation"
follow-processing: "フォロー処理中"
follow-request: "Demande d'abonnement" follow-request: "Demande d'abonnement"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} abonné·e·s" followers: "{} abonné·e·s"
@ -620,21 +678,21 @@ desktop/views/components/post-form.vue:
add-visible-user: "+Ajouter un utilisateur" add-visible-user: "+Ajouter un utilisateur"
attach-location-information: "Attacher des informations de localisation" attach-location-information: "Attacher des informations de localisation"
hide-contents: "Masquer les contenus" hide-contents: "Masquer les contenus"
reply-placeholder: "Répondre à cette note" reply-placeholder: "Répondre à cette note"
quote-placeholder: "Citer cette note" quote-placeholder: "Citer cette note"
submit: "Poster" submit: "Publier"
reply: "Répondre" reply: "Répondre"
renote: "Republier" renote: "Republier"
posted: "Posté!" posted: "Publié !"
replied: "Répondu!" replied: "Répondu !"
reposted: "Reposté!" reposted: "Reposté !"
note-failed: "La note à échoué" note-failed: "La note à échoué"
reply-failed: "La réponse à échoué" reply-failed: "La réponse à échoué"
renote-failed: "La renote à échoué" renote-failed: "Échec lors de la republication"
posting: "Publication..." posting: "Publication"
attach-media-from-local: "Joindre un media depuis votre PC" attach-media-from-local: "Joindre un média depuis votre appareil"
attach-media-from-drive: "Joindre un media depuis votre Drive" attach-media-from-drive: "Joindre un média depuis votre Drive"
attach-cancel: "Annuler la jointure de fichier" attach-cancel: "Annuler le fichier attaché"
insert-a-kao: "v('ω')v" insert-a-kao: "v('ω')v"
create-poll: "Créer un sondage" create-poll: "Créer un sondage"
text-remain: "{} charactères restants" text-remain: "{} charactères restants"
@ -649,15 +707,15 @@ desktop/views/components/post-form-window.vue:
note: "Nouvelle note" note: "Nouvelle note"
reply: "Répondre" reply: "Répondre"
attaches: "{} media joint(s)" attaches: "{} media joint(s)"
uploading-media: "Upload du media {}" uploading-media: "Transfert du média {}"
desktop/views/components/progress-dialog.vue: desktop/views/components/progress-dialog.vue:
waiting: "En attente" waiting: "En attente"
desktop/views/components/renote-form.vue: desktop/views/components/renote-form.vue:
quote: "Citer..." quote: "Citer..."
cancel: "Annuler" cancel: "Annuler"
renote: "Republier" renote: "Republier"
reposting: "Repost en cours..." reposting: "Republication en cours"
success: "Reposté!" success: "Republié !"
failure: "La renote a échoué" failure: "La renote a échoué"
desktop/views/components/renote-form-window.vue: desktop/views/components/renote-form-window.vue:
title: "Êtes vous sûr de vouloir renote cette note?" title: "Êtes vous sûr de vouloir renote cette note?"
@ -675,6 +733,7 @@ desktop/views/components/settings.vue:
2fa: "Vérification en deux étapes" 2fa: "Vérification en deux étapes"
other: "Autres" other: "Autres"
license: "License" license: "License"
theme: "Thèmes"
behaviour: "Comportement" behaviour: "Comportement"
fetch-on-scroll: "Chargement lors du défilement" fetch-on-scroll: "Chargement lors du défilement"
fetch-on-scroll-desc: "Chargement automatique du contenu lors du défilement de la page." fetch-on-scroll-desc: "Chargement automatique du contenu lors du défilement de la page."
@ -686,30 +745,34 @@ desktop/views/components/settings.vue:
advanced: "Paramètres avancés" advanced: "Paramètres avancés"
api-via-stream: "Requête API via le flux" api-via-stream: "Requête API via le flux"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。" api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
deck-nav: "デッキ内ナビゲーション"
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
display: "Affichage et design" display: "Affichage et design"
customize: "Personnaliser l'Accueil" customize: "Personnaliser l'Accueil"
wallpaper: "壁紙"
choose-wallpaper: "Sélectionner un fond d'écran" choose-wallpaper: "Sélectionner un fond d'écran"
delete-wallpaper: "Supprimer le fond d'écran" delete-wallpaper: "Supprimer le fond d'écran"
dark-mode: "Mode nuit" dark-mode: "Mode nuit"
use-shadow: "Utiliser les ombres dans l'interface utilisateur"
rounded-corners: "Coins arrondis"
circle-icons: "Utiliser des icônes circulaires" circle-icons: "Utiliser des icônes circulaires"
contrasted-acct: "Nom dutilisateur contrasté" contrasted-acct: "Nom dutilisateur contrasté"
gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre"
post-form-on-timeline: "Afficher le formulaire en haut du fil" post-form-on-timeline: "Afficher le formulaire en haut du fil"
suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie" suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie"
show-clock-on-header: "Afficher l'horloge à droite sur le coté supérieur" show-clock-on-header: "Afficher l'horloge à droite sur le coté supérieur"
show-reply-target: "Afficher les réponses" show-reply-target: "Afficher les réponses"
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: "Afficher mes republications dans les fils"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する" show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "Afficher la carte" show-maps: "Afficher la carte"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。" deck-column-align: "デッキのカラムの位置"
deck-column-align-center: "中央"
deck-column-align-left: "左"
sound: "Son" sound: "Son"
enable-sounds: "Activer le son" enable-sounds: "Activer le son"
enable-sounds-desc: "Jouer un son lorsque vous recevez un message. Ce paramètre est sauvegardé dans le navigateur." enable-sounds-desc: "Jouer un son lorsque vous recevez un message. Ce paramètre est sauvegardé dans le navigateur."
volume: "Volume" volume: "Volume"
test: "Test" test: "Test"
mobile: "Mobile"
disable-via-mobile: "Enlever la mention publié via 'un périphérique mobile'"
language: "Langue" language: "Langue"
pick-language: "Sélectionner une langue" pick-language: "Sélectionner une langue"
recommended: "Recommandé" recommended: "Recommandé"
@ -741,10 +804,14 @@ desktop/views/components/settings.vue:
debug-mode: "Activer le mode debug" debug-mode: "Activer le mode debug"
debug-mode-desc: "Ce paramètre est stocké dans le navigateur." debug-mode-desc: "Ce paramètre est stocké dans le navigateur."
experimental: "Activer les fonctionnalités expérimentales" experimental: "Activer les fonctionnalités expérimentales"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。" experimental-desc: "Lactivation des fonctionnalités expérimentales peuvent rendre le client Misskey instable. Ce paramètre est stocké dans le navigateur."
tools: "Outils" tools: "Outils"
task-manager: "Gestionnaire de tâches" task-manager: "Gestionnaire de tâches"
third-parties: "Services tiers" third-parties: "Services tiers"
navbar-position: "ナビゲーションバーの位置"
navbar-position-top: "En haut"
navbar-position-left: "à gauche"
navbar-position-right: "à droite"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "Si vous configurez la vérication en deux étapes vous aurez non seulement besoin de votre mot de passe mais aussi un appareil déjà pré-enregistré(tel que votre smartphone) ce qui ameliora grandement la sécurité de votre compte." intro: "Si vous configurez la vérication en deux étapes vous aurez non seulement besoin de votre mot de passe mais aussi un appareil déjà pré-enregistré(tel que votre smartphone) ce qui ameliora grandement la sécurité de votre compte."
detail: "Voir les détails..." detail: "Voir les détails..."
@ -784,20 +851,6 @@ desktop/views/components/settings.password.vue:
enter-new-password-again: "Entrez à nouveau le nouveau mot de passe" enter-new-password-again: "Entrez à nouveau le nouveau mot de passe"
not-match: "Le nouveau mot de passe ne correspond pas." not-match: "Le nouveau mot de passe ne correspond pas."
changed: "Mot de passe modifié avec succès" changed: "Mot de passe modifié avec succès"
desktop/views/components/settings.profile.vue:
avatar: "Avatar"
choice-avatar: "Choose an image"
name: "Nom"
location: "Localisation"
description: "Description"
birthday: "Date de naissance"
save: "Mettre à jour le profil"
locked-account: "Protéger votre compte"
is-locked: "Demande dabonnement en attente dapprobation"
other: "Autre"
is-bot: "Ce compte est un Bot"
is-cat: "Ce compte est un Chat"
profile-updated: "Profil mis à jour"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "cette publication est privée" private: "cette publication est privée"
deleted: "cette publication a été supprimée" deleted: "cette publication a été supprimée"
@ -811,15 +864,15 @@ desktop/views/components/timeline.vue:
hybrid: "Social" hybrid: "Social"
global: "Global" global: "Global"
mentions: "Mentions" mentions: "Mentions"
messages: "メッセージ" messages: "Messages"
list: "Listes" list: "Listes"
hashtag: "ハッシュタグ" hashtag: "Hashtag"
add-tag-timeline: "ハッシュタグを追加" add-tag-timeline: "Ajouter un fil de hashtags"
add-list: "リストを追加" add-list: "Ajouter une nouvelle liste"
list-name: "リスト名" list-name: "Nom de la liste"
desktop/views/components/ui.header.vue: desktop/views/components/ui.header.vue:
welcome-back: "Content de vous revoir !" welcome-back: "Content de vous revoir !"
adjective: "さん" adjective: "M."
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "Votre profil" profile: "Votre profil"
drive: "Drive" drive: "Drive"
@ -839,7 +892,7 @@ desktop/views/components/ui.header.nav.vue:
desktop/views/components/ui.header.notifications.vue: desktop/views/components/ui.header.notifications.vue:
title: "Notifications" title: "Notifications"
desktop/views/components/ui.header.post.vue: desktop/views/components/ui.header.post.vue:
post: "Composer un nouveau post" post: "Rédiger une nouvelle publication"
desktop/views/components/ui.header.search.vue: desktop/views/components/ui.header.search.vue:
placeholder: "Chercher" placeholder: "Chercher"
desktop/views/components/received-follow-requests-window.vue: desktop/views/components/received-follow-requests-window.vue:
@ -872,9 +925,9 @@ desktop/views/pages/admin/admin.vue:
desktop/views/pages/admin/admin.dashboard.vue: desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "Tableau de bord" dashboard: "Tableau de bord"
all-users: "Toutes les utilisateurrices" all-users: "Toutes les utilisateurrices"
original-users: "Utilisateurrices sur cette instance" original-users: "Utilisateur·rice·s sur cette instance"
all-notes: "Toutes les publications" all-notes: "Toutes les publications"
original-notes: "Publication sur cette instance" original-notes: "Publications sur cette instance"
invite: "Invitation" invite: "Invitation"
desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "Suspendre un·e utilisateur·rice" suspend-user: "Suspendre un·e utilisateur·rice"
@ -896,15 +949,13 @@ desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Les publications médias uniquement" is-media-only: "Les publications médias uniquement"
is-media-view: "Vue média" is-media-view: "Vue média"
edit: "Options" edit: "Options"
desktop/views/pages/deck/deck.note.vue: desktop/views/pages/deck/deck.user-column.vue:
reposted-by: "Reposté par {}" pinned-notes: "ピン留めされた投稿"
private: "cette publication est privée"
deleted: "cette publication a été supprimée"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "Toutes les utilisateurrices" all-users: "Toutes les utilisateurrices"
original-users: "Utilisateurrices sur cette instance" original-users: "Utilisateur·rice·s sur cette instance"
all-notes: "Toutes les publications" all-notes: "Toutes les publications"
original-notes: "Publication sur cette instance" original-notes: "Publications 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 !"
@ -930,9 +981,9 @@ desktop/views/pages/selectdrive.vue:
title: "Choisir fichier(s)" title: "Choisir fichier(s)"
ok: "OK" ok: "OK"
cancel: "Annuler" cancel: "Annuler"
upload: "Uploader un ou plusieurs fichier(s) depuis votre PC" upload: "Téléverser des fichiers à partir de votre ordinateur"
desktop/views/pages/search.vue: desktop/views/pages/search.vue:
not-available: "検索機能はインスタンスの設定で無効になっています。" not-available: "La fonction de recherche est désactivée dans les paramètres de linstance."
not-found: "Aucun message trouvé pour '{}'" not-found: "Aucun message trouvé pour '{}'"
desktop/views/pages/share.vue: desktop/views/pages/share.vue:
share-with: "Partager avec {}" share-with: "Partager avec {}"
@ -947,13 +998,13 @@ desktop/views/pages/user/user.followers-you-know.vue:
loading: "Chargement en cours" loading: "Chargement en cours"
no-users: "Pas d'utilisateurs" no-users: "Pas d'utilisateurs"
desktop/views/pages/user/user.friends.vue: desktop/views/pages/user/user.friends.vue:
title: "Personnes qui répondent le plus" title: "Mentions fréquentes"
loading: "Chargement en cours" loading: "Chargement en cours"
no-users: "Pas d'utilisateurs" no-users: "Pas d'utilisateurs"
desktop/views/pages/user/user.vue: desktop/views/pages/user/user.vue:
is-suspended: "Ce compte a été suspendu." is-suspended: "Ce compte a été suspendu."
is-remote: "Cet utilisateur n'est pas un utilisateur de Misskey. Certaines informations peuvent être erronées" is-remote: "Cet utilisateur n'est pas un utilisateur Misskey. Certaines informations peuvent ne pas refléter ce profil dans sa totalité."
view-remote: "Voir les informations détaillées" view-remote: "Consulter le profil complet"
desktop/views/pages/user/user.home.vue: desktop/views/pages/user/user.home.vue:
last-used-at: "Last used at" last-used-at: "Last used at"
desktop/views/pages/user/user.photos.vue: desktop/views/pages/user/user.photos.vue:
@ -961,7 +1012,7 @@ desktop/views/pages/user/user.photos.vue:
loading: "Chargement en cours" loading: "Chargement en cours"
no-photos: "Pas de photos" no-photos: "Pas de photos"
desktop/views/pages/user/user.profile.vue: desktop/views/pages/user/user.profile.vue:
follows-you: "Vous suis" follows-you: "Vous suit"
stalk: "Traquer" stalk: "Traquer"
stalking: "ストーキングしています" stalking: "ストーキングしています"
unstalk: "ストーク解除" unstalk: "ストーク解除"
@ -990,8 +1041,8 @@ desktop/views/widgets/polls.vue:
refresh: "Afficher d'autres" refresh: "Afficher d'autres"
nothing: "Rien" nothing: "Rien"
desktop/views/widgets/post-form.vue: desktop/views/widgets/post-form.vue:
title: "Post" title: "Publication"
note: "Post" note: "Publication"
desktop/views/widgets/profile.vue: desktop/views/widgets/profile.vue:
update-banner: "Cliquer pour éditer votre bannière" update-banner: "Cliquer pour éditer votre bannière"
update-avatar: "Cliquer pour éditer votre avatar" update-avatar: "Cliquer pour éditer votre avatar"
@ -1034,6 +1085,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "Hash (md5)" hash: "Hash (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "CW" nsfw: "CW"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "Le contenu est NSFW" sensitive: "Le contenu est NSFW"
click-to-show: "Cliquer pour afficher" click-to-show: "Cliquer pour afficher"
@ -1044,6 +1097,7 @@ mobile/views/components/follow-button.vue:
following: "Abonnements" following: "Abonnements"
follow: "Suivre" follow: "Suivre"
request-pending: "En attente d'approbation" request-pending: "En attente d'approbation"
follow-processing: "フォロー処理中"
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"
@ -1052,7 +1106,7 @@ mobile/views/components/friends-maker.vue:
refresh: "Voir plus" refresh: "Voir plus"
close: "Fermer" close: "Fermer"
mobile/views/components/note.vue: mobile/views/components/note.vue:
reposted-by: "Renoté par {}" reposted-by: "Republié 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"
location: "Géolocalisation" location: "Géolocalisation"
@ -1079,7 +1133,7 @@ mobile/views/components/notifications.vue:
empty: "Pas de notifications" empty: "Pas de notifications"
mobile/views/components/post-form.vue: mobile/views/components/post-form.vue:
add-visible-user: "Ajouter un utilisateur" add-visible-user: "Ajouter un utilisateur"
submit: "Poster" submit: "Publier"
reply: "Répondre" reply: "Répondre"
renote: "Republier" renote: "Republier"
quote-placeholder: "Citer ce billet ... (Facultatif)" quote-placeholder: "Citer ce billet ... (Facultatif)"
@ -1131,7 +1185,7 @@ mobile/views/pages/drive.vue:
drive: "Drive" drive: "Drive"
more: "Afficher plus ..." more: "Afficher plus ..."
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "Commençons ! 📦" lets-start: "Votre compte est prêt ! 📦"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
followers-of: "Abonné·e·s de {}" followers-of: "Abonné·e·s de {}"
mobile/views/pages/following.vue: mobile/views/pages/following.vue:
@ -1142,7 +1196,7 @@ mobile/views/pages/home.vue:
hybrid: "Social" hybrid: "Social"
global: "Global" global: "Global"
mentions: "Mentions" mentions: "Mentions"
messages: "メッセージ" messages: "Messages"
mobile/views/pages/tag.vue: mobile/views/pages/tag.vue:
no-posts-found: "Pas de message avec un hashtag {} trouvé." no-posts-found: "Pas de message avec un hashtag {} trouvé."
mobile/views/pages/welcome.vue: mobile/views/pages/welcome.vue:
@ -1173,23 +1227,6 @@ mobile/views/pages/notifications.vue:
read-all: "Êtes vous sûr de vouloir marqués toutes les notifications non-lus en tant que lus?" read-all: "Êtes vous sûr de vouloir marqués toutes les notifications non-lus en tant que lus?"
mobile/views/pages/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "Reversi" reversi: "Reversi"
mobile/views/pages/settings/settings.profile.vue:
title: "Profil"
name: "Nom"
account: "Compte"
location: "Lieu"
description: "Description"
birthday: "Date de naissance"
avatar: "Avatar"
banner: "Bannière"
is-cat: "Ce compte est un Bot"
is-locked: "Demande dabonnement en attente dapprobation"
advanced: "Avancé"
privacy: "Vie privée"
save: "Mettre à jour le profil"
saved: "Profil mis à jour avec succès"
uploading: "En cours d'envoi"
upload-failed: "Échec de l'envoi"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "Chercher" search: "Chercher"
empty: "Aucun message trouvé pour '{}' " empty: "Aucun message trouvé pour '{}' "
@ -1219,6 +1256,7 @@ mobile/views/pages/settings.vue:
notification-position: "Style de notification" notification-position: "Style de notification"
notification-position-bottom: "en bas" notification-position-bottom: "en bas"
notification-position-top: "en haut" notification-position-top: "en haut"
theme: "Thème"
behavior: "Comportement" behavior: "Comportement"
fetch-on-scroll: "Chargement lors du défilement" fetch-on-scroll: "Chargement lors du défilement"
note-visibility: "Visibilité de la publication" note-visibility: "Visibilité de la publication"
@ -1245,7 +1283,7 @@ mobile/views/pages/settings.vue:
sound: "Sons" sound: "Sons"
enable-sounds: "Activer les sons" enable-sounds: "Activer les sons"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "vous suit" follows-you: "Vous suit"
following: "Abonnements" following: "Abonnements"
followers: "Abonné·e·s" followers: "Abonné·e·s"
notes: "Notes" notes: "Notes"
@ -1253,8 +1291,8 @@ mobile/views/pages/user.vue:
timeline: "Fil d'actualité" timeline: "Fil d'actualité"
media: "Media" media: "Media"
is-suspended: "This account has been suspended." is-suspended: "This account has been suspended."
is-remote: "Cet utilisateur n'est pas un utilisateur de Misskey. Certaines informations peuvent être erronées " is-remote: "Ceci est le profil dun utilisateur·rice distant·e. Certaines informations peuvent ne pas refléter ce profil dans sa totalité."
view-remote: "Voir les informations détaillées" view-remote: "Consulter son profil complet"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "Notes récentes" recent-notes: "Notes récentes"
images: "Images" images: "Images"
@ -1278,7 +1316,7 @@ mobile/views/pages/user/home.photos.vue:
no-photos: "Pas de photos" no-photos: "Pas de photos"
docs: docs:
edit-this-page-on-github: "Vous avez trouvé une erreur ou vous voulez contribuer à la documentation?" edit-this-page-on-github: "Vous avez trouvé une erreur ou vous voulez contribuer à la documentation?"
edit-this-page-on-github-link: "Modifiez cette page sur github!" edit-this-page-on-github-link: "Éditez cette page sur Github !"
api: api:
entities: entities:
properties: "Propriétés" properties: "Propriétés"

View File

@ -264,6 +264,41 @@ common/views/components/connect-failed.troubleshooter.vue:
common/views/components/media-banner.vue: common/views/components/media-banner.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
common/views/components/theme.vue:
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
dark-themes: "暗いテーマ"
install-a-theme: "テーマのインストール"
theme-code: "テーマコード"
install: "インストール"
installed: "「{}」をインストールしました"
create-a-theme: "テーマの作成"
save-created-theme: "テーマを保存"
primary-color: "プライマリ カラー"
secondary-color: "セカンダリ カラー"
text-color: "文字色"
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Dark"
theme-name: "テーマ名"
preview-created-theme: "プレビュー"
invalid-theme: "テーマが正しくありません。"
already-installed: "既にそのテーマはインストールされています。"
saved: "保存しました"
manage-themes: "テーマの管理"
builtin-themes: "標準テーマ"
my-themes: "マイテーマ"
installed-themes: "インストールされたテーマ"
select-theme: "テーマを選択してください"
uninstall: "アンインストール"
uninstalled: "「{}」をアンインストールしました"
author: "作者"
desc: "説明"
export: "エクスポート"
import: "インポート"
import-by-code: "またはコードをペースト"
theme-name-required: "テーマ名は必須です。"
common/views/components/cw-button.vue: common/views/components/cw-button.vue:
hide: "隠す" hide: "隠す"
show: "もっと見る" show: "もっと見る"
@ -300,7 +335,9 @@ common/views/components/note-menu.vue:
detail: "詳細" detail: "詳細"
copy-link: "リンクをコピー" copy-link: "リンクをコピー"
favorite: "お気に入り" favorite: "お気に入り"
unfavorite: "お気に入り解除"
pin: "ピン留め" pin: "ピン留め"
unpin: "ピン留め解除"
delete: "削除" delete: "削除"
delete-confirm: "この投稿を削除しますか?" delete-confirm: "この投稿を削除しますか?"
remote: "投稿元で見る" remote: "投稿元で見る"
@ -379,6 +416,25 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue: common/views/components/trends.vue:
count: "{}人が投稿" count: "{}人が投稿"
empty: "トレンドなし" empty: "トレンドなし"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-bot: "このアカウントはBotです"
is-locked: "フォローを承認制にする"
careful-bot: "Botからのフォローだけ承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "確認中" fetching: "確認中"
no-broadcasts: "お知らせはありません" no-broadcasts: "お知らせはありません"
@ -439,6 +495,7 @@ common/views/pages/follow.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop: desktop:
banner-crop-title: "バナーとして表示する部分を選択" banner-crop-title: "バナーとして表示する部分を選択"
@ -477,13 +534,13 @@ desktop/views/components/charts.vue:
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計" notes-total: "投稿の積算"
users: "ユーザーの増減" users: "ユーザーの増減"
users-total: "ユーザーの累計" users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減" drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計" drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減" drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計" drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト" network-requests: "リクエスト"
network-time: "応答時間" network-time: "応答時間"
network-usage: "通信量" network-usage: "通信量"
@ -565,6 +622,7 @@ desktop/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
@ -675,6 +733,7 @@ desktop/views/components/settings.vue:
2fa: "二段階認証" 2fa: "二段階認証"
other: "その他" other: "その他"
license: "ライセンス" license: "ライセンス"
theme: "テーマ"
behaviour: "動作" behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。" fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
@ -686,14 +745,18 @@ desktop/views/components/settings.vue:
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が利用されます。この設定はこのデバイスのみ有効です。"
deck-nav: "デッキ内ナビゲーション"
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
display: "デザインと表示" display: "デザインと表示"
customize: "ホームをカスタマイズ" customize: "ホームをカスタマイズ"
wallpaper: "壁紙"
choose-wallpaper: "壁紙を選択" choose-wallpaper: "壁紙を選択"
delete-wallpaper: "壁紙を削除" delete-wallpaper: "壁紙を削除"
dark-mode: "ダークモード" dark-mode: "ダークモード"
use-shadow: "UIに影を使用"
rounded-corners: "UIの角を丸める"
circle-icons: "円形のアイコンを使用" circle-icons: "円形のアイコンを使用"
contrasted-acct: "ユーザー名にコントラストを付ける" contrasted-acct: "ユーザー名にコントラストを付ける"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する" show-clock-on-header: "右上に時計を表示する"
@ -702,14 +765,14 @@ desktop/views/components/settings.vue:
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する" show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開" show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。" deck-column-align: "デッキのカラムの位置"
deck-column-align-center: "中央"
deck-column-align-left: "左"
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。" enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム" volume: "ボリューム"
test: "テスト" test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語" language: "言語"
pick-language: "言語を選択" pick-language: "言語を選択"
recommended: "推奨" recommended: "推奨"
@ -745,6 +808,10 @@ desktop/views/components/settings.vue:
tools: "ツール" tools: "ツール"
task-manager: "タスクマネージャ" task-manager: "タスクマネージャ"
third-parties: "サードパーティ" third-parties: "サードパーティ"
navbar-position: "ナビゲーションバーの位置"
navbar-position-top: "上"
navbar-position-left: "左"
navbar-position-right: "右"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "詳細..."
@ -784,20 +851,6 @@ desktop/views/components/settings.password.vue:
enter-new-password-again: "もう一度新しいパスワードを入力してください" enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません" not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました" changed: "パスワードを変更しました"
desktop/views/components/settings.profile.vue:
avatar: "アイコン"
choice-avatar: "画像を選択"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
save: "保存"
locked-account: "アカウントの保護"
is-locked: "フォローを承認制にする"
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
@ -896,10 +949,8 @@ desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
edit: "オプション" edit: "オプション"
desktop/views/pages/deck/deck.note.vue: desktop/views/pages/deck/deck.user-column.vue:
reposted-by: "{}がRenote" pinned-notes: "ピン留めされた投稿"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
@ -1034,6 +1085,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意" nsfw: "閲覧注意"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1044,6 +1097,7 @@ mobile/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
@ -1173,23 +1227,6 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "リバーシ" reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-locked: "フォローを承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"
@ -1219,6 +1256,7 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示" notification-position: "通知の表示"
notification-position-bottom: "下" notification-position-bottom: "下"
notification-position-top: "上" notification-position-top: "上"
theme: "テーマ"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
note-visibility: "投稿の公開範囲" note-visibility: "投稿の公開範囲"

View File

@ -288,6 +288,8 @@ common/views/components/media-banner.vue:
common/views/components/theme.vue: common/views/components/theme.vue:
light-theme: "非ダークモード時に使用するテーマ" light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ" dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
dark-themes: "暗いテーマ"
install-a-theme: "テーマのインストール" install-a-theme: "テーマのインストール"
theme-code: "テーマコード" theme-code: "テーマコード"
install: "インストール" install: "インストール"
@ -305,10 +307,19 @@ common/views/components/theme.vue:
invalid-theme: "テーマが正しくありません。" invalid-theme: "テーマが正しくありません。"
already-installed: "既にそのテーマはインストールされています。" already-installed: "既にそのテーマはインストールされています。"
saved: "保存しました" saved: "保存しました"
manage-themes: "テーマの管理"
builtin-themes: "標準テーマ"
my-themes: "マイテーマ"
installed-themes: "インストールされたテーマ" installed-themes: "インストールされたテーマ"
select-theme: "テーマを選択してください" select-theme: "テーマを選択してください"
uninstall: "アンインストール" uninstall: "アンインストール"
uninstalled: "「{}」をアンインストールしました" uninstalled: "「{}」をアンインストールしました"
author: "作者"
desc: "説明"
export: "エクスポート"
import: "インポート"
import-by-code: "またはコードをペースト"
theme-name-required: "テーマ名は必須です。"
common/views/components/cw-button.vue: common/views/components/cw-button.vue:
hide: "隠す" hide: "隠す"
@ -352,6 +363,7 @@ common/views/components/note-menu.vue:
detail: "詳細" detail: "詳細"
copy-link: "リンクをコピー" copy-link: "リンクをコピー"
favorite: "お気に入り" favorite: "お気に入り"
unfavorite: "お気に入り解除"
pin: "ピン留め" pin: "ピン留め"
unpin: "ピン留め解除" unpin: "ピン留め解除"
delete: "削除" delete: "削除"
@ -444,6 +456,26 @@ common/views/components/trends.vue:
count: "{}人が投稿" count: "{}人が投稿"
empty: "トレンドなし" empty: "トレンドなし"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-bot: "このアカウントはBotです"
is-locked: "フォローを承認制にする"
careful-bot: "Botからのフォローだけ承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "確認中" fetching: "確認中"
no-broadcasts: "お知らせはありません" no-broadcasts: "お知らせはありません"
@ -558,13 +590,13 @@ desktop/views/components/charts.vue:
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計" notes-total: "投稿の積算"
users: "ユーザーの増減" users: "ユーザーの増減"
users-total: "ユーザーの累計" users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減" drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計" drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減" drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計" drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト" network-requests: "リクエスト"
network-time: "応答時間" network-time: "応答時間"
network-usage: "通信量" network-usage: "通信量"
@ -802,9 +834,12 @@ desktop/views/components/settings.vue:
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が利用されます。この設定はこのデバイスのみ有効です。"
deck-nav: "デッキ内ナビゲーション"
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
display: "デザインと表示" display: "デザインと表示"
customize: "ホームをカスタマイズ" customize: "ホームをカスタマイズ"
wallpaper: "壁紙"
choose-wallpaper: "壁紙を選択" choose-wallpaper: "壁紙を選択"
delete-wallpaper: "壁紙を削除" delete-wallpaper: "壁紙を削除"
dark-mode: "ダークモード" dark-mode: "ダークモード"
@ -816,10 +851,14 @@ desktop/views/components/settings.vue:
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する" show-clock-on-header: "右上に時計を表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
timeline: "タイムライン"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する" show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開" show-maps: "マップの自動展開"
deck-column-align: "デッキのカラムの位置"
deck-column-align-center: "中央"
deck-column-align-left: "左"
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
@ -827,9 +866,6 @@ desktop/views/components/settings.vue:
volume: "ボリューム" volume: "ボリューム"
test: "テスト" test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語" language: "言語"
pick-language: "言語を選択" pick-language: "言語を選択"
recommended: "推奨" recommended: "推奨"
@ -871,6 +907,11 @@ desktop/views/components/settings.vue:
task-manager: "タスクマネージャ" task-manager: "タスクマネージャ"
third-parties: "サードパーティ" third-parties: "サードパーティ"
navbar-position: "ナビゲーションバーの位置"
navbar-position-top: "上"
navbar-position-left: "左"
navbar-position-right: "右"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "詳細..."
@ -916,21 +957,6 @@ desktop/views/components/settings.password.vue:
not-match: "新しいパスワードが一致しません" not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました" changed: "パスワードを変更しました"
desktop/views/components/settings.profile.vue:
avatar: "アイコン"
choice-avatar: "画像を選択"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
save: "保存"
locked-account: "アカウントの保護"
is-locked: "フォローを承認制にする"
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
@ -1051,10 +1077,8 @@ desktop/views/pages/deck/deck.tl-column.vue:
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
edit: "オプション" edit: "オプション"
desktop/views/pages/deck/deck.note.vue: desktop/views/pages/deck/deck.user-column.vue:
reposted-by: "{}がRenote" pinned-notes: "ピン留めされた投稿"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー" all-users: "全てのユーザー"
@ -1221,6 +1245,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意" nsfw: "閲覧注意"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
@ -1397,24 +1423,6 @@ mobile/views/pages/notifications.vue:
mobile/views/pages/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "リバーシ" reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-locked: "フォローを承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"

View File

@ -17,7 +17,7 @@ common:
ui: "インターフェイス" ui: "インターフェイス"
ui-desc: "このUIええ言うてたで、知らんけど。あんたの好みのUIなんて知ったこっちゃない。Misskeyは好きにいじれるからな、レイアウトやデザイン変えたり、色んなウィジェットひっつけたりして、あんただけのMisskey作って楽しんでな" ui-desc: "このUIええ言うてたで、知らんけど。あんたの好みのUIなんて知ったこっちゃない。Misskeyは好きにいじれるからな、レイアウトやデザイン変えたり、色んなウィジェットひっつけたりして、あんただけのMisskey作って楽しんでな"
drive: "ドライブ" drive: "ドライブ"
drive-desc: "「こないだの画像、どこやったかな…また投稿したいんやけど…」「さっきのファイルあのフォルダに直しといて」そんなこと言わんとって。Misskeyはもとからドライブ機能持っとるさかい、心配あらへん。ファイルの「わけわけ」したってな。" drive-desc: "「こないだの画像、どこやったかな…また投稿したいんやけど…」「さっきのファイルあのフォルダに直しといて」そんなこと言わんとって。Misskeyはもとからドライブ機能持っとるさかい、心配あらへん。ファイルの「わけわけ」したってな。"
outro: "Misskeyの機能は無限大や知らんけど。知らん言うとるやんけ、あんたが見に行けやMisskeyは分散型SNSやから、ここがあかんくても他がある。阪神でもオリックスでもワイは応援するで" outro: "Misskeyの機能は無限大や知らんけど。知らん言うとるやんけ、あんたが見に行けやMisskeyは分散型SNSやから、ここがあかんくても他がある。阪神でもオリックスでもワイは応援するで"
adblock: adblock:
detected: "広告ブロッカーを無効にしてや" detected: "広告ブロッカーを無効にしてや"
@ -264,9 +264,44 @@ common/views/components/connect-failed.troubleshooter.vue:
common/views/components/media-banner.vue: common/views/components/media-banner.vue:
sensitive: "見せたらあかん" sensitive: "見せたらあかん"
click-to-show: "押してみ、見せたるわ" click-to-show: "押してみ、見せたるわ"
common/views/components/theme.vue:
light-theme: "ナイトゲームちゃう時のテーマどないする?"
dark-theme: "ナイトゲームの時のテーマどないする?"
light-themes: "デイゲーム"
dark-themes: "ナイトゲーム"
install-a-theme: "テーマ入れるで"
theme-code: "テーマコード"
install: "インストール"
installed: "「{}」を入れたで!"
create-a-theme: "テーマ作る"
save-created-theme: "テーマ保存"
primary-color: "この色一番重要や"
secondary-color: "次はこの色出したって"
text-color: "文字はこの色や!"
base-theme: "この色が背景や!"
base-theme-light: "Light"
base-theme-dark: "Dark"
theme-name: "テーマ名"
preview-created-theme: "試してみる"
invalid-theme: "このテーマあかんわ、なんか間違うとる"
already-installed: "このテーマもうあるで"
saved: "保存したで!"
manage-themes: "テーマの管理"
builtin-themes: "いつものテーマ"
my-themes: "ワイのテーマ"
installed-themes: "入れたテーマ"
select-theme: "テーマ選んでや!"
uninstall: "ほかす"
uninstalled: "「{}」をほかしてもうたわ"
author: "作った人"
desc: "説明"
export: "エクスポート"
import: "インポート"
import-by-code: "それかコードを貼っつける"
theme-name-required: "テーマ名は絶対要るで"
common/views/components/cw-button.vue: common/views/components/cw-button.vue:
hide: "見せへんわ" hide: "もうええわ"
show: "もっとあるやろ" show: "見たいやろ"
common/views/components/messaging.vue: common/views/components/messaging.vue:
search-user: "ユーザーを探す" search-user: "ユーザーを探す"
you: "あんさん" you: "あんさん"
@ -300,7 +335,9 @@ common/views/components/note-menu.vue:
detail: "もっと" detail: "もっと"
copy-link: "リンクをコピー" copy-link: "リンクをコピー"
favorite: "お気に入り" favorite: "お気に入り"
unfavorite: "お気に入りやめる"
pin: "ピン留め" pin: "ピン留め"
unpin: "ピン留めやめる"
delete: "ほかす" delete: "ほかす"
delete-confirm: "この投稿を削除してもええか?" delete-confirm: "この投稿を削除してもええか?"
remote: "投稿元に行ってみよか" remote: "投稿元に行ってみよか"
@ -332,7 +369,7 @@ 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: "通信あかんわ"
@ -379,6 +416,25 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue: common/views/components/trends.vue:
count: "{}人が投稿" count: "{}人が投稿"
empty: "流行は自分で作るんや" empty: "流行は自分で作るんや"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-bot: "このアカウントはBotです"
is-locked: "フォローを承認制にする"
careful-bot: "Botからのフォローだけ承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "見てみるわ…" fetching: "見てみるわ…"
no-broadcasts: "お知らせはあらへんで" no-broadcasts: "お知らせはあらへんで"
@ -431,7 +487,7 @@ common/views/widgets/tips.vue:
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:
@ -439,6 +495,7 @@ common/views/pages/follow.vue:
following: "フォローしとる" following: "フォローしとる"
follow: "フォロー" follow: "フォロー"
request-pending: "フォローの許し待っとる" request-pending: "フォローの許し待っとる"
follow-processing: "今フォロー処理やっとる‥"
follow-request: "フォロー許してくれや!言うてみる" follow-request: "フォロー許してくれや!言うてみる"
desktop: desktop:
banner-crop-title: "どこバナーとして出す?" banner-crop-title: "どこバナーとして出す?"
@ -453,10 +510,10 @@ desktop:
choose-avatar: "アバターにする画像選んでや" choose-avatar: "アバターにする画像選んでや"
invalid-filetype: "この形式のファイル無理やねん" invalid-filetype: "この形式のファイル無理やねん"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "黒いの ... 全部"
notes: "Blue ... Notes" notes: "青いの ... 投稿"
replies: "Red ... Replies" replies: "赤いの ... 返信"
renotes: "Green ... Renotes" renotes: "碧いの ... Renotes"
desktop/views/components/activity.vue: desktop/views/components/activity.vue:
title: "アクティビティ" title: "アクティビティ"
toggle: "表示変える" toggle: "表示変える"
@ -477,13 +534,13 @@ desktop/views/components/charts.vue:
notes: "投稿の増減(統合)" notes: "投稿の増減(統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
notes-total: "全部の投稿" notes-total: "投稿の積算"
users: "ユーザーの増減" users: "ユーザーの増減"
users-total: "ユーザーの累計" users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減" drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計" drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減" drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計" drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト" network-requests: "リクエスト"
network-time: "応答時間" network-time: "応答時間"
network-usage: "通信量" network-usage: "通信量"
@ -514,7 +571,7 @@ desktop/views/components/drive.file.vue:
unmark-as-sensitive: "やっぱ見せたるわ" unmark-as-sensitive: "やっぱ見せたるわ"
copy-url: "URLをコピー" copy-url: "URLをコピー"
download: "ダウンロード" download: "ダウンロード"
else-files: "もっとあるで…" else-files: "まだあんで..."
set-as-avatar: "アイコンにする" set-as-avatar: "アイコンにする"
set-as-banner: "バナーにする" set-as-banner: "バナーにする"
open-in-app: "アプリで開く" open-in-app: "アプリで開く"
@ -548,7 +605,7 @@ desktop/views/components/drive.vue:
url-upload: "URLアップロード" url-upload: "URLアップロード"
url-of-file: "このURLのファイルをアップロードしたいねん" url-of-file: "このURLのファイルをアップロードしたいねん"
url-upload-requested: "アップロードしたい言うといたで" url-upload-requested: "アップロードしたい言うといたで"
may-take-time: "アップロード終わるまで時間かかるわ、知らんけど。たこ焼き何個食べれるやろか…" may-take-time: "アップロード終わるんにちょい時間かかるかもしれへんわ。"
create-folder: "フォルダー作成" create-folder: "フォルダー作成"
folder-name: "フォルダー名" folder-name: "フォルダー名"
contextmenu: contextmenu:
@ -565,6 +622,7 @@ desktop/views/components/follow-button.vue:
following: "フォローしとる" following: "フォローしとる"
follow: "フォロー" follow: "フォロー"
request-pending: "フォローの許し待っとる" request-pending: "フォローの許し待っとる"
follow-processing: "今フォロー処理やっとる‥"
follow-request: "フォロー許してくれや!言うてみる" follow-request: "フォロー許してくれや!言うてみる"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
@ -577,7 +635,7 @@ desktop/views/components/following.vue:
desktop/views/components/friends-maker.vue: desktop/views/components/friends-maker.vue:
title: "おもろそうやな:" title: "おもろそうやな:"
empty: "おもろいユーザー居らんかったわ" empty: "おもろいユーザー居らんかったわ"
fetching: "読みんどるで…" fetching: "読みんどります"
refresh: "もっとあるやろ!" refresh: "もっとあるやろ!"
close: "さいなら" close: "さいなら"
desktop/views/components/game-window.vue: desktop/views/components/game-window.vue:
@ -588,7 +646,7 @@ desktop/views/components/home.vue:
add: "増やす" add: "増やす"
desktop/views/input-dialog.vue: desktop/views/input-dialog.vue:
cancel: "やめとくわ" cancel: "やめとくわ"
ok: "決定" ok: "これや!"
desktop/views/components/messaging-room-window.vue: desktop/views/components/messaging-room-window.vue:
title: "メッセージ:" title: "メッセージ:"
desktop/views/components/messaging-window.vue: desktop/views/components/messaging-window.vue:
@ -649,11 +707,11 @@ desktop/views/components/post-form-window.vue:
note: "新規投稿" note: "新規投稿"
reply: "返す" reply: "返す"
attaches: "添付: {}メディア" attaches: "添付: {}メディア"
uploading-media: "{}個のメディアを上げてるで…" uploading-media: "{}個のメディアを上げとんねん……"
desktop/views/components/progress-dialog.vue: desktop/views/components/progress-dialog.vue:
waiting: "待っとる" waiting: "待っとる"
desktop/views/components/renote-form.vue: desktop/views/components/renote-form.vue:
quote: "ってくる…" quote: "ってくる…"
cancel: "やめとくわ" cancel: "やめとくわ"
renote: "Renote" renote: "Renote"
reposting: "やっとります..." reposting: "やっとります..."
@ -675,6 +733,7 @@ desktop/views/components/settings.vue:
2fa: "二段階認証" 2fa: "二段階認証"
other: "その他" other: "その他"
license: "ライセンス" license: "ライセンス"
theme: "テーマ"
behaviour: "動き" behaviour: "動き"
fetch-on-scroll: "スクロールしたらもっと見せてや" fetch-on-scroll: "スクロールしたらもっと見せてや"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動でもっとコンテンツを読み込むで。" fetch-on-scroll-desc: "ページを下までスクロールしたときに自動でもっとコンテンツを読み込むで。"
@ -686,14 +745,18 @@ desktop/views/components/settings.vue:
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 が利用されるで。この設定はこのデバイスのみ有効やで。"
deck-nav: "デッキ内ナビゲーション"
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
display: "見た感じ" display: "見た感じ"
customize: "ホームをカスタマイズ" customize: "ホームをカスタマイズ"
wallpaper: "壁紙"
choose-wallpaper: "壁紙選ぶ" choose-wallpaper: "壁紙選ぶ"
delete-wallpaper: "壁紙ほかす" delete-wallpaper: "壁紙ほかす"
dark-mode: "夜にすんで" dark-mode: "夜にすんで"
use-shadow: "UIに影付けたる"
rounded-corners: "みんなまぁるくUI変更"
circle-icons: "アイコンもタコ焼きも丸いやんな?" circle-icons: "アイコンもタコ焼きも丸いやんな?"
contrasted-acct: "ユーザー名ようわからんし見やすしといて" contrasted-acct: "ユーザー名ようわからんし見やすしといて"
gradient-window-header: "ウィンドウのタイトルバーにグラデーション付ける"
post-form-on-timeline: "タイムラインの上の方で投稿できるようにせえへん?" post-form-on-timeline: "タイムラインの上の方で投稿できるようにせえへん?"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示すんで" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示すんで"
show-clock-on-header: "右上をカリヨン広場にする(時計表示)" show-clock-on-header: "右上をカリヨン広場にする(時計表示)"
@ -702,14 +765,14 @@ desktop/views/components/settings.vue:
show-renoted-my-notes: "わしのRenoteもタイムライン載せてくれや" show-renoted-my-notes: "わしのRenoteもタイムライン載せてくれや"
show-local-renotes: "ローカル投稿のRenoteも見たいんや" show-local-renotes: "ローカル投稿のRenoteも見たいんや"
show-maps: "地図勝手にバァーって開いてくれ" show-maps: "地図勝手にバァーって開いてくれ"
show-maps-desc: "どこにおるんかわかっとる投稿の地図は自動で見せるで" deck-column-align: "デッキのカラムの位置"
deck-column-align-center: "中央"
deck-column-align-left: "左"
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンド鳴らす" enable-sounds: "サウンド鳴らす"
enable-sounds-desc: "投稿やメッセージもろたとき、音鳴らしたるわ。大丈夫や、この設定はブラウザが覚えてくれとる。" enable-sounds-desc: "投稿やメッセージもろたとき、音鳴らしたるわ。大丈夫や、この設定はブラウザが覚えてくれとる。"
volume: "ボリューム" volume: "ボリューム"
test: "テスト" test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグなんて要らんわ"
language: "言語" language: "言語"
pick-language: "言語選んでや" pick-language: "言語選んでや"
recommended: "おすすめ" recommended: "おすすめ"
@ -728,7 +791,7 @@ desktop/views/components/settings.vue:
update: "Misskey Update" update: "Misskey Update"
version: "バージョン:" version: "バージョン:"
latest-version: "最新のバージョン:" latest-version: "最新のバージョン:"
update-checking: "アップデートはあらへんか…" update-checking: "アップデートはあらへんか…"
do-update: "アップデートあるか見てみる" do-update: "アップデートあるか見てみる"
update-settings: "もっと設定" update-settings: "もっと設定"
prevent-update: "アップデートしたないわ、また今度や(やめときや)" prevent-update: "アップデートしたないわ、また今度や(やめときや)"
@ -745,6 +808,10 @@ desktop/views/components/settings.vue:
tools: "ツール" tools: "ツール"
task-manager: "タスクマネージャ" task-manager: "タスクマネージャ"
third-parties: "サードパーティ" third-parties: "サードパーティ"
navbar-position: "ナビゲーションバーの位置"
navbar-position-top: "上"
navbar-position-left: "左"
navbar-position-right: "右"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけとちゃうくて、予め登録しておいた物理的なデバイス(例えばあんさんのスマートフォンなど)も必要になり、よりセキュリティが向上すんで。" intro: "二段階認証を設定すると、サインイン時にパスワードだけとちゃうくて、予め登録しておいた物理的なデバイス(例えばあんさんのスマートフォンなど)も必要になり、よりセキュリティが向上すんで。"
detail: "詳細..." detail: "詳細..."
@ -784,20 +851,6 @@ desktop/views/components/settings.password.vue:
enter-new-password-again: "もういっぺんさらのパスワードを入れてや" enter-new-password-again: "もういっぺんさらのパスワードを入れてや"
not-match: "パスワードがおうとらん" not-match: "パスワードがおうとらん"
changed: "パスワード変えたわ" changed: "パスワード変えたわ"
desktop/views/components/settings.profile.vue:
avatar: "アイコン"
choice-avatar: "画像選んでや"
name: "名前"
location: "場所"
description: "ワイのこと"
birthday: "誕生日"
save: "保存"
locked-account: "アカウント守る"
is-locked: "他人のフォローは許してからや!"
other: "その他"
is-bot: "このアカウントはBotやで"
is-cat: "このアカウントはCatやで"
profile-updated: "プロフィールを更新したで"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "この投稿は見せられへんわ" private: "この投稿は見せられへんわ"
deleted: "この投稿なんか無くなってもうたわ" deleted: "この投稿なんか無くなってもうたわ"
@ -858,7 +911,7 @@ desktop/views/components/users-list.vue:
all: "すべて" all: "すべて"
iknow: "知っとる" iknow: "知っとる"
load-more: "もっと" load-more: "もっと"
fetching: "読みんどるで…" fetching: "読みんどります"
desktop/views/components/users-list-item.vue: desktop/views/components/users-list-item.vue:
followed: "フォローされとるで" followed: "フォローされとるで"
desktop/views/components/window.vue: desktop/views/components/window.vue:
@ -896,21 +949,19 @@ desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿だけや" is-media-only: "メディア投稿だけや"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
edit: "オプション" edit: "オプション"
desktop/views/pages/deck/deck.note.vue: desktop/views/pages/deck/deck.user-column.vue:
reposted-by: "{}がRenote" pinned-notes: "ピン留めされた投稿"
private: "この投稿は見せられへんわ"
deleted: "この投稿なんか無くなってもうたわ"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "ここの人らだけ" original-users: "ここの人らだけ"
all-notes: "全ての投稿" all-notes: "全ての投稿"
original-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: "タイムライン"
announcements: "知っときや" announcements: "知っときや"
@ -944,11 +995,11 @@ desktop/views/pages/user-list.users.vue:
username: "ユーザー名" username: "ユーザー名"
desktop/views/pages/user/user.followers-you-know.vue: desktop/views/pages/user/user.followers-you-know.vue:
title: "知っとるフォロワー" title: "知っとるフォロワー"
loading: "読み込んどる…" loading: "読み込んどります"
no-users: "フォロワー全員知らんわ" no-users: "フォロワー全員知らんわ"
desktop/views/pages/user/user.friends.vue: desktop/views/pages/user/user.friends.vue:
title: "よう話すツレ" title: "よう話すツレ"
loading: "読み込んどる…" loading: "読み込んどります"
no-users: "よう話すツレは居らん" no-users: "よう話すツレは居らん"
desktop/views/pages/user/user.vue: desktop/views/pages/user/user.vue:
is-suspended: "このユーザーはあかんわ。凍結されとる。" is-suspended: "このユーザーはあかんわ。凍結されとる。"
@ -958,7 +1009,7 @@ 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: "フォローされとるで"
@ -1034,6 +1085,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ(md5)" hash: "ハッシュ(md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "ちょっと見せられへんわ" nsfw: "ちょっと見せられへんわ"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "見たらあかんで" sensitive: "見たらあかんで"
click-to-show: "押してみ、見せたるわ" click-to-show: "押してみ、見せたるわ"
@ -1044,11 +1097,12 @@ mobile/views/components/follow-button.vue:
following: "フォローしとる" following: "フォローしとる"
follow: "フォロー" follow: "フォロー"
request-pending: "フォローの許し待っとる" request-pending: "フォローの許し待っとる"
follow-processing: "今フォロー処理やっとる‥"
follow-request: "フォロー許してくれや!言うてみる" follow-request: "フォロー許してくれや!言うてみる"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "おもろそうやな" title: "おもろそうやな"
empty: "おすすめのユーザーはおらん。" empty: "おすすめのユーザーはおらん。"
fetching: "読みんどるで…" fetching: "読みんどります"
refresh: "もっとあるやろ!" refresh: "もっとあるやろ!"
close: "さいなら" close: "さいなら"
mobile/views/components/note.vue: mobile/views/components/note.vue:
@ -1173,109 +1227,93 @@ mobile/views/pages/notifications.vue:
read-all: "通知全部読んだか?" read-all: "通知全部読んだか?"
mobile/views/pages/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "リバーシ" reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "ワイのこと"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatや"
is-locked: "他人のフォローは許してからや!"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "探す"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "ワイは「{}」なんて投稿知らんわ、無いんちゃう?知らんけど。"
not-found: "「{}」に関する投稿は見つかりませんでした。" not-found: "ワイは「{}」なんて投稿知らんわ、無いんちゃう?知らんけど。"
mobile/views/pages/selectdrive.vue: mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択" select-file: "ファイル選んでや"
mobile/views/pages/settings.vue: mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中" signed-in-as: "あんたは橋の下で拾った{}や!"
lang: "言語" lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。" lang-tip: "ページもっぺん読み込んだら反映したるで。"
recommended: "推奨" recommended: "これええで"
auto: "自動" auto: "勝手にやる"
specify-language: "言語を指定" specify-language: "言語選びや"
design: "デザインと表示" design: "見た感じ"
dark-mode: "ダークモード" dark-mode: "ナイトゲームや!"
i-am-under-limited-internet: "私は通信を制限されている" i-am-under-limited-internet: "電波と阪神がザコいんや"
circle-icons: "円形のアイコンを使用" circle-icons: "アイコンもタコ焼きも丸いやんな?"
contrasted-acct: "ユーザー名にコントラストを付ける" contrasted-acct: "ユーザー名ようわからんし見やすしといて"
timeline: "タイムライン" timeline: "タイムライン"
show-reply-target: "リプライ先を表示する" show-reply-target: "どこにリプライするんや見せて"
show-my-renotes: "自分の行ったRenoteを表示する" show-my-renotes: "あんたのしたRenoteも出すで"
show-renoted-my-notes: "自分の投稿のRenoteを表示する" show-renoted-my-notes: "あんたの言うたことのRenoteも出すで"
show-local-renotes: "ローカル投稿のRenoteを表示する" show-local-renotes: "ローカル投稿のRenoteも出すで"
post-style: "投稿の表示スタイル" post-style: "投稿の表示スタイル"
post-style-standard: "標準" post-style-standard: "標準"
post-style-smart: "べっぴんさん" post-style-smart: "べっぴんさん"
notification-position: "通知の表示" notification-position: "通知どこ見せる?"
notification-position-bottom: "" notification-position-bottom: "ミナミの方"
notification-position-top: "" notification-position-top: "キタの方"
behavior: "動作" theme: "テーマ"
fetch-on-scroll: "スクロールで自動読み込み" behavior: "動き"
fetch-on-scroll: "スクロールしたらもっと見せてや"
note-visibility: "投稿の公開範囲" note-visibility: "投稿の公開範囲"
default-note-visibility: "デフォルトの公開範囲" default-note-visibility: "もとからの公開範囲"
remember-note-visibility: "投稿の公開範囲を記憶する" remember-note-visibility: "投稿の公開範囲おぼえといて"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない" disable-via-mobile: "「モバイルからの投稿」フラグなんて要らんわ"
load-raw-images: "添付された画像を高画質で表示する" load-raw-images: "添付された画像もべっぴんさんのままにしといてな"
load-remote-media: "リモートサーバーのメディアを表示する" load-remote-media: "東京とか、リモートサーバーのメディアも見せてや"
twitter: "Twitter連携" twitter: "鳥さんとも連携や!"
twitter-connect: "Twitterアカウントに接続する" twitter-connect: "鳥さん邪魔すんで"
twitter-reconnect: "再接続する" twitter-reconnect: "もっぺん繋ぎ直すで"
twitter-disconnect: "切断する" twitter-disconnect: "邪魔するんやったら帰って"
update: "Misskey Update" update: "あんたのMisskeyいつのや?"
version: "バージョン:" version: "バージョン:"
latest-version: "最新のバージョン:" latest-version: "いっちゃん新しいやつ:"
update-checking: "アップデートを確認中" update-checking: "アップデートあるか見とるで"
check-for-updates: "アップデートを確認" check-for-updates: "アップデートあるんかな?"
no-updates: "利用可能な更新はありません" no-updates: "アップデートあらへんわ"
no-updates-desc: "お使いのMisskeyは最新です。" no-updates-desc: "つこてるMisskeyは最新や!"
update-available: "新しいバージョンが利用可能です" update-available: "もっとええバージョンがあるで"
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "もっぺんページ読み込んだら新しなるで"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "さいなら"
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンド鳴らす"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
follows-you: "フォローされています" follows-you: "フォローされとるで"
following: "フォロー" following: "フォロー"
followers: "フォロワー" followers: "フォロワー"
notes: "投稿" notes: "投稿"
overview: "概要" overview: "こんなやつ"
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。" is-suspended: "このユーザーはあかんわ。凍結されとる。"
is-remote: "このユーザーはリモートユーザーです。" is-remote: "このユーザーは東京とかそこらへんのリモートユーザー。"
view-remote: "正確な情報を見る" view-remote: "ちゃんとした情報を見る"
mobile/views/pages/user/home.vue: mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿" recent-notes: "最近儲かりまっか?"
images: "画像" images: "画像"
activity: "アクティビティ" activity: "やっとること"
keywords: "キーワード" keywords: "キーワード"
domains: "頻出ドメイン" domains: "よく出るドメイン"
frequently-replied-users: "よく会話するユーザー" frequently-replied-users: "よう話しとるユーザー"
followers-you-know: "知り合いのフォロワー" followers-you-know: "知っとるフォロワー"
last-used-at: "最終ログイン" last-used-at: "最後いつ来た?"
mobile/views/pages/user/home.followers-you-know.vue: mobile/views/pages/user/home.followers-you-know.vue:
loading: "読み込み中" loading: "読み込んどります"
no-users: "知り合いのユーザーはいません" no-users: "知っとるユーザーは居らん"
mobile/views/pages/user/home.friends.vue: mobile/views/pages/user/home.friends.vue:
loading: "読み込み中" loading: "読み込んどります"
no-users: "よく会話すユーザーはいません" no-users: "よ話すユーザーは居らん"
mobile/views/pages/user/home.notes.vue: mobile/views/pages/user/home.notes.vue:
loading: "読み込み中" loading: "読み込んどります"
no-notes: "投稿はありません" no-notes: "投稿はあらへん"
mobile/views/pages/user/home.photos.vue: mobile/views/pages/user/home.photos.vue:
loading: "読み込み中" loading: "読み込んどります"
no-photos: "写真はありません" no-photos: "写真はあらへんで"
docs: docs:
edit-this-page-on-github: "間違いや改善点を見つけましたか?" edit-this-page-on-github: "間違いや改善点を見つけましたか?"
edit-this-page-on-github-link: "このページをGitHubで編集" edit-this-page-on-github-link: "このページをGitHubで編集"

View File

@ -3,20 +3,20 @@ meta:
lang: "한국어" lang: "한국어"
divider: "" divider: ""
common: common:
misskey: "A ⭐ of fediverse" misskey: "연합우주의 ⭐"
about-title: "A ⭐ of fediverse." about-title: "연합우주의 ⭐."
about: "Misskey를 찾아 주셔서 감사합니다. Misskey은 지구에서 태어난 <b>분산 마이크로 블로그 SNS </b> 입니다. Fediverse (다양한 SNS로 구성되는 우주)에 존재하는 다른 SNS와 상호 연결되어 있습니다. 잠시 도시의 번잡함에서 벗어나 새로운 인터넷에 다이브 해 보지 않겠습니까." about: "Misskey를 찾아 주셔서 감사합니다. Misskey은 지구에서 태어난 <b>분산 마이크로 블로그 SNS </b> 입니다. Fediverse (다양한 SNS로 구성되는 우주)에 존재하는 다른 SNS와 상호 연결되어 있습니다. 잠시 도시의 번잡함에서 벗어나 새로운 인터넷에 다이브 해 보지 않겠습니까."
intro: intro:
title: "Misskeyって?" title: "Misskey란?"
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。" about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
features: "特徴" features: "특징"
rich-contents: "投稿" rich-contents: "게시"
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。" rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
reaction: "リアクション" reaction: "반응"
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。" reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
ui: "インターフェース" ui: "인터페이스"
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。" ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
drive: "ドライブ" drive: "드라이브"
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんかもしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんかMisskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。" drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんかもしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんかMisskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!" outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
adblock: adblock:
@ -71,7 +71,7 @@ common:
friday: "금요일" friday: "금요일"
saturday: "토요일" saturday: "토요일"
reactions: reactions:
like: "いいね" like: "좋아요"
love: "좋아" love: "좋아"
laugh: "크크" laugh: "크크"
hmm: "음..." hmm: "음..."
@ -82,14 +82,14 @@ common:
rip: "RIP" rip: "RIP"
pudding: "Pudding" pudding: "Pudding"
note-visibility: note-visibility:
public: "公開" public: "공개"
home: "ホーム" home: ""
home-desc: "ホームタイムラインにのみ公開" home-desc: "홈 타임라인에만 공개"
followers: "フォロワー" followers: "팔로워"
followers-desc: "自分のフォロワーにのみ公開" followers-desc: "자신의 팔로워에게만 공개"
specified: "ダイレクト" specified: "다이렉트"
specified-desc: "指定したユーザーにのみ公開" specified-desc: "지정한 사용자에게만 공개"
private: "非公開" private: "비공개"
note-placeholders: note-placeholders:
a: "지금 어떻게하고있어?" a: "지금 어떻게하고있어?"
b: "뭔가 있었습니까?" b: "뭔가 있었습니까?"
@ -107,14 +107,14 @@ common:
i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아" i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아"
show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시" show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
verified-user: "公式アカウント" verified-user: "공식 계정"
disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할" disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할"
always-show-nsfw: "常に閲覧注意のメディアを表示する" always-show-nsfw: "항상 열람주의 미디어를 표시"
always-mark-nsfw: "常にメディアを閲覧注意として投稿" always-mark-nsfw: "항상 미디어를 열람주의로 설정하여 게시"
show-full-acct: "ユーザー名のホストを省略しない" show-full-acct: "ユーザー名のホストを省略しない"
reduce-motion: "UIの動きを減らす" reduce-motion: "UIの動きを減らす"
this-setting-is-this-device-only: "このデバイスのみ" this-setting-is-this-device-only: "이 장치만"
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' do-not-use-in-production: '이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오.'
reversi: reversi:
drawn: "무승부" drawn: "무승부"
my-turn: "당신의 차례입니다" my-turn: "당신의 차례입니다"
@ -155,19 +155,19 @@ common:
home: "홈" home: "홈"
local: "로컬" local: "로컬"
hybrid: "소셜" hybrid: "소셜"
hashtag: "ハッシュタグ" hashtag: "해시태그"
global: "글로벌" global: "글로벌"
mentions: "あなた宛て" mentions: "あなた宛て"
direct: "ダイレクト投稿" direct: "ダイレクト投稿"
notifications: "통지" notifications: "통지"
list: "목록" list: "목록"
swap-left: "左に移動" swap-left: "왼쪽으로 이동"
swap-right: "右に移動" swap-right: "오른쪽으로 이동"
swap-up: "上に移動" swap-up: "위로 이동"
swap-down: "下に移動" swap-down: "아래로 이동"
remove: "カラムを削除" remove: "칼럼 제거"
add-column: "カラムを追加" add-column: "칼럼 추가"
rename: "名前を変更" rename: "이름 변경"
stack-left: "左に重ねる" stack-left: "左に重ねる"
pop-right: "右に出す" pop-right: "右に出す"
auth/views/form.vue: auth/views/form.vue:
@ -248,22 +248,57 @@ common/views/components/connect-failed.troubleshooter.vue:
checking-network: "ネットワーク接続を確認中" checking-network: "ネットワーク接続を確認中"
internet: "インターネット接続" internet: "インターネット接続"
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/media-banner.vue: common/views/components/media-banner.vue:
sensitive: "閲覧注意" sensitive: "열람주의"
click-to-show: "クリックして表示" click-to-show: "클릭하여 표시"
common/views/components/theme.vue:
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "밝은 테마"
dark-themes: "어두운 테마"
install-a-theme: "테마 설치"
theme-code: "테마 코드"
install: "설치"
installed: "「{}」をインストールしました"
create-a-theme: "테마 만들기"
save-created-theme: "테마 저장"
primary-color: "기본 색"
secondary-color: "보조 색"
text-color: "글자 색상"
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Dark"
theme-name: "테마명"
preview-created-theme: "미리보기"
invalid-theme: "テーマが正しくありません。"
already-installed: "既にそのテーマはインストールされています。"
saved: "保存しました"
manage-themes: "テーマの管理"
builtin-themes: "標準テーマ"
my-themes: "マイテーマ"
installed-themes: "インストールされたテーマ"
select-theme: "テーマを選択してください"
uninstall: "アンインストール"
uninstalled: "「{}」をアンインストールしました"
author: "作者"
desc: "説明"
export: "エクスポート"
import: "インポート"
import-by-code: "またはコードをペースト"
theme-name-required: "テーマ名は必須です。"
common/views/components/cw-button.vue: common/views/components/cw-button.vue:
hide: "隠す" hide: "隠す"
show: "もっと見る" show: "もっと見る"
@ -273,7 +308,7 @@ common/views/components/messaging.vue:
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: "新しいメッセージがあります"
@ -288,19 +323,21 @@ 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:
detail: "詳細" detail: "詳細"
copy-link: "リンクをコピー" copy-link: "링크 복사"
favorite: "お気に入り" favorite: "お気に入り"
unfavorite: "お気に入り解除"
pin: "ピン留め" pin: "ピン留め"
unpin: "ピン留め解除"
delete: "削除" delete: "削除"
delete-confirm: "この投稿を削除しますか?" delete-confirm: "この投稿を削除しますか?"
remote: "投稿元で見る" remote: "投稿元で見る"
@ -379,6 +416,25 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue: common/views/components/trends.vue:
count: "{}人が投稿" count: "{}人が投稿"
empty: "トレンドなし" empty: "トレンドなし"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-bot: "このアカウントはBotです"
is-locked: "フォローを承認制にする"
careful-bot: "Botからのフォローだけ承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "確認中" fetching: "確認中"
no-broadcasts: "お知らせはありません" no-broadcasts: "お知らせはありません"
@ -439,6 +495,7 @@ common/views/pages/follow.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop: desktop:
banner-crop-title: "バナーとして表示する部分を選択" banner-crop-title: "バナーとして表示する部分を選択"
@ -477,13 +534,13 @@ desktop/views/components/charts.vue:
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計" notes-total: "投稿の積算"
users: "ユーザーの増減" users: "ユーザーの増減"
users-total: "ユーザーの累計" users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減" drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計" drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減" drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計" drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト" network-requests: "リクエスト"
network-time: "応答時間" network-time: "応答時間"
network-usage: "通信量" network-usage: "通信量"
@ -565,6 +622,7 @@ desktop/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
@ -675,6 +733,7 @@ desktop/views/components/settings.vue:
2fa: "二段階認証" 2fa: "二段階認証"
other: "その他" other: "その他"
license: "ライセンス" license: "ライセンス"
theme: "テーマ"
behaviour: "動作" behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。" fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
@ -686,14 +745,18 @@ desktop/views/components/settings.vue:
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が利用されます。この設定はこのデバイスのみ有効です。"
deck-nav: "デッキ内ナビゲーション"
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
display: "デザインと表示" display: "デザインと表示"
customize: "ホームをカスタマイズ" customize: "ホームをカスタマイズ"
wallpaper: "壁紙"
choose-wallpaper: "壁紙を選択" choose-wallpaper: "壁紙を選択"
delete-wallpaper: "壁紙を削除" delete-wallpaper: "壁紙を削除"
dark-mode: "ダークモード" dark-mode: "ダークモード"
use-shadow: "UIに影を使用"
rounded-corners: "UIの角を丸める"
circle-icons: "円形のアイコンを使用" circle-icons: "円形のアイコンを使用"
contrasted-acct: "ユーザー名にコントラストを付ける" contrasted-acct: "ユーザー名にコントラストを付ける"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する" show-clock-on-header: "右上に時計を表示する"
@ -702,14 +765,14 @@ desktop/views/components/settings.vue:
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する" show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開" show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。" deck-column-align: "デッキのカラムの位置"
deck-column-align-center: "中央"
deck-column-align-left: "左"
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。" enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム" volume: "ボリューム"
test: "テスト" test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語" language: "言語"
pick-language: "言語を選択" pick-language: "言語を選択"
recommended: "推奨" recommended: "推奨"
@ -745,6 +808,10 @@ desktop/views/components/settings.vue:
tools: "ツール" tools: "ツール"
task-manager: "タスクマネージャ" task-manager: "タスクマネージャ"
third-parties: "サードパーティ" third-parties: "サードパーティ"
navbar-position: "ナビゲーションバーの位置"
navbar-position-top: "上"
navbar-position-left: "左"
navbar-position-right: "右"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "詳細..."
@ -784,20 +851,6 @@ desktop/views/components/settings.password.vue:
enter-new-password-again: "もう一度新しいパスワードを入力してください" enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません" not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました" changed: "パスワードを変更しました"
desktop/views/components/settings.profile.vue:
avatar: "アイコン"
choice-avatar: "画像を選択"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
save: "保存"
locked-account: "アカウントの保護"
is-locked: "フォローを承認制にする"
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
@ -896,10 +949,8 @@ desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
edit: "オプション" edit: "オプション"
desktop/views/pages/deck/deck.note.vue: desktop/views/pages/deck/deck.user-column.vue:
reposted-by: "{}がRenote" pinned-notes: "ピン留めされた投稿"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
@ -1034,6 +1085,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意" nsfw: "閲覧注意"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1044,6 +1097,7 @@ mobile/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
@ -1173,23 +1227,6 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "リバーシ" reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-locked: "フォローを承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"
@ -1219,6 +1256,7 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示" notification-position: "通知の表示"
notification-position-bottom: "下" notification-position-bottom: "下"
notification-position-top: "上" notification-position-top: "上"
theme: "テーマ"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
note-visibility: "投稿の公開範囲" note-visibility: "投稿の公開範囲"

View File

@ -264,6 +264,41 @@ common/views/components/connect-failed.troubleshooter.vue:
common/views/components/media-banner.vue: common/views/components/media-banner.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
common/views/components/theme.vue:
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
dark-themes: "暗いテーマ"
install-a-theme: "テーマのインストール"
theme-code: "テーマコード"
install: "インストール"
installed: "「{}」をインストールしました"
create-a-theme: "テーマの作成"
save-created-theme: "テーマを保存"
primary-color: "プライマリ カラー"
secondary-color: "セカンダリ カラー"
text-color: "文字色"
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Dark"
theme-name: "テーマ名"
preview-created-theme: "プレビュー"
invalid-theme: "テーマが正しくありません。"
already-installed: "既にそのテーマはインストールされています。"
saved: "保存しました"
manage-themes: "テーマの管理"
builtin-themes: "標準テーマ"
my-themes: "マイテーマ"
installed-themes: "インストールされたテーマ"
select-theme: "テーマを選択してください"
uninstall: "アンインストール"
uninstalled: "「{}」をアンインストールしました"
author: "作者"
desc: "説明"
export: "エクスポート"
import: "インポート"
import-by-code: "またはコードをペースト"
theme-name-required: "テーマ名は必須です。"
common/views/components/cw-button.vue: common/views/components/cw-button.vue:
hide: "隠す" hide: "隠す"
show: "もっと見る" show: "もっと見る"
@ -300,7 +335,9 @@ common/views/components/note-menu.vue:
detail: "詳細" detail: "詳細"
copy-link: "リンクをコピー" copy-link: "リンクをコピー"
favorite: "Deze notitie toevoegen aan favorieten" favorite: "Deze notitie toevoegen aan favorieten"
unfavorite: "お気に入り解除"
pin: "Vastmaken aan profielpagina" pin: "Vastmaken aan profielpagina"
unpin: "ピン留め解除"
delete: "削除" delete: "削除"
delete-confirm: "この投稿を削除しますか?" delete-confirm: "この投稿を削除しますか?"
remote: "Origineel tonen" remote: "Origineel tonen"
@ -379,6 +416,25 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue: common/views/components/trends.vue:
count: "{}人が投稿" count: "{}人が投稿"
empty: "トレンドなし" empty: "トレンドなし"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-bot: "このアカウントはBotです"
is-locked: "フォローを承認制にする"
careful-bot: "Botからのフォローだけ承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "Bezig met ophalen" fetching: "Bezig met ophalen"
no-broadcasts: "Geen uitzendingen" no-broadcasts: "Geen uitzendingen"
@ -439,6 +495,7 @@ common/views/pages/follow.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop: desktop:
banner-crop-title: "バナーとして表示する部分を選択" banner-crop-title: "バナーとして表示する部分を選択"
@ -477,13 +534,13 @@ desktop/views/components/charts.vue:
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計" notes-total: "投稿の積算"
users: "ユーザーの増減" users: "ユーザーの増減"
users-total: "ユーザーの累計" users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減" drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計" drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減" drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計" drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト" network-requests: "リクエスト"
network-time: "応答時間" network-time: "応答時間"
network-usage: "通信量" network-usage: "通信量"
@ -565,6 +622,7 @@ desktop/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "Volgen" follow: "Volgen"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "Volgers van {}" followers: "Volgers van {}"
@ -675,6 +733,7 @@ desktop/views/components/settings.vue:
2fa: "Authenticatie in twee stappen" 2fa: "Authenticatie in twee stappen"
other: "Overig" other: "Overig"
license: "Licentie" license: "Licentie"
theme: "テーマ"
behaviour: "Gedrag" behaviour: "Gedrag"
fetch-on-scroll: "Ophalen bij scrollen" fetch-on-scroll: "Ophalen bij scrollen"
fetch-on-scroll-desc: "Als je omlaag scrolt, wordt de rest van de inhoud automatisch opgehaald." fetch-on-scroll-desc: "Als je omlaag scrolt, wordt de rest van de inhoud automatisch opgehaald."
@ -686,14 +745,18 @@ desktop/views/components/settings.vue:
advanced: "Geavanceerde instellingen" advanced: "Geavanceerde instellingen"
api-via-stream: "API-verzoek via stream" api-via-stream: "API-verzoek via stream"
api-via-stream-desc: "API-verzoek wordt uitgevoerd via de WebSocket-verbinding i.p.v. de ingebouwde ophaal-API (voor verbeterde prestaties). Deze instelling wordt opgeslagen in je browser." api-via-stream-desc: "API-verzoek wordt uitgevoerd via de WebSocket-verbinding i.p.v. de ingebouwde ophaal-API (voor verbeterde prestaties). Deze instelling wordt opgeslagen in je browser."
deck-nav: "デッキ内ナビゲーション"
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
display: "Ontwerp en weergave" display: "Ontwerp en weergave"
customize: "Startpagina aanpassen" customize: "Startpagina aanpassen"
wallpaper: "壁紙"
choose-wallpaper: "壁紙を選択" choose-wallpaper: "壁紙を選択"
delete-wallpaper: "壁紙を削除" delete-wallpaper: "壁紙を削除"
dark-mode: "Donkere modus" dark-mode: "Donkere modus"
use-shadow: "UIに影を使用"
rounded-corners: "UIの角を丸める"
circle-icons: "Ronde pictogrammen gebruiken" circle-icons: "Ronde pictogrammen gebruiken"
contrasted-acct: "ユーザー名にコントラストを付ける" contrasted-acct: "ユーザー名にコントラストを付ける"
gradient-window-header: "Kleurverloop gebruiken op vensterkoppen"
post-form-on-timeline: "Berichtformulier boven de tijdlijn tonen" post-form-on-timeline: "Berichtformulier boven de tijdlijn tonen"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する" show-clock-on-header: "右上に時計を表示する"
@ -702,14 +765,14 @@ desktop/views/components/settings.vue:
show-renoted-my-notes: "Mijn gerenote bericht tonen op de tijdlijn" show-renoted-my-notes: "Mijn gerenote bericht tonen op de tijdlijn"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する" show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "Kaart tonen" show-maps: "Kaart tonen"
show-maps-desc: "Kaart van bijgevoegde locatie tonen." deck-column-align: "デッキのカラムの位置"
deck-column-align-center: "中央"
deck-column-align-left: "左"
sound: "Geluid" sound: "Geluid"
enable-sounds: "Geluid inschakelen" enable-sounds: "Geluid inschakelen"
enable-sounds-desc: "Een geluid afspelen bij het ontvangen van een bericht. Deze instelling wordt opgeslagen in je browser." enable-sounds-desc: "Een geluid afspelen bij het ontvangen van een bericht. Deze instelling wordt opgeslagen in je browser."
volume: "Volume" volume: "Volume"
test: "Testen" test: "Testen"
mobile: "Mobiel"
disable-via-mobile: "Berichten niet markeren als 'via mobiel'"
language: "Taal" language: "Taal"
pick-language: "Selecteer een taal" pick-language: "Selecteer een taal"
recommended: "Aanbevolen" recommended: "Aanbevolen"
@ -745,6 +808,10 @@ desktop/views/components/settings.vue:
tools: "Hulpmiddelen" tools: "Hulpmiddelen"
task-manager: "Taakbeheer" task-manager: "Taakbeheer"
third-parties: "Derde partij" third-parties: "Derde partij"
navbar-position: "ナビゲーションバーの位置"
navbar-position-top: "上"
navbar-position-left: "左"
navbar-position-right: "右"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "Als je verificatie in twee stappen instelt, dan heb je niet alleen een wachtwoord nodig bij het inloggen, maar ook een geregistreerd fysiek apparaat (zoals je smartphone). Dit verhoogt de veiligheid. " intro: "Als je verificatie in twee stappen instelt, dan heb je niet alleen een wachtwoord nodig bij het inloggen, maar ook een geregistreerd fysiek apparaat (zoals je smartphone). Dit verhoogt de veiligheid. "
detail: "Details bekijken..." detail: "Details bekijken..."
@ -784,20 +851,6 @@ desktop/views/components/settings.password.vue:
enter-new-password-again: "Voer je nieuwe wachtwoord nogmaals in" enter-new-password-again: "Voer je nieuwe wachtwoord nogmaals in"
not-match: "Het nieuwe wachtwoord komt niet overeen" not-match: "Het nieuwe wachtwoord komt niet overeen"
changed: "Wachtwoord bijgewerkt" changed: "Wachtwoord bijgewerkt"
desktop/views/components/settings.profile.vue:
avatar: "Gebruikersafbeelding"
choice-avatar: "Kies een afbeelding"
name: "Naam"
location: "Locatie"
description: "Omschrijving"
birthday: "Geboortedatum"
save: "Profiel bijwerken"
locked-account: "アカウントの保護"
is-locked: "フォローを承認制にする"
other: "その他"
is-bot: "Dit account is een Bot"
is-cat: "Dit account is een Kat"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
@ -896,10 +949,8 @@ desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
edit: "オプション" edit: "オプション"
desktop/views/pages/deck/deck.note.vue: desktop/views/pages/deck/deck.user-column.vue:
reposted-by: "{}がRenote" pinned-notes: "ピン留めされた投稿"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
@ -1034,6 +1085,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "Hash (md5)" hash: "Hash (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意" nsfw: "閲覧注意"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1044,6 +1097,7 @@ mobile/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "Volgen" follow: "Volgen"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
@ -1173,23 +1227,6 @@ mobile/views/pages/notifications.vue:
read-all: "Weet je zeker dat je alle meldingen wilt markeren als gelezen?" read-all: "Weet je zeker dat je alle meldingen wilt markeren als gelezen?"
mobile/views/pages/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "リバーシ" reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "Profiel"
name: "Naam"
account: "Account"
location: "Locatie"
description: "Omschrijving"
birthday: "Geboortedatum"
avatar: "Gebruikersafbeelding"
banner: "Omslagfoto"
is-cat: "Dit account is een Kat"
is-locked: "フォローを承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "Profiel bijwerken"
saved: "Profiel bijgewerkt"
uploading: "Bezig met uploaden"
upload-failed: "Upload mislukt"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "Zoeken" search: "Zoeken"
empty: "Geen berichten gevonden voor '{}'" empty: "Geen berichten gevonden voor '{}'"
@ -1219,6 +1256,7 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示" notification-position: "通知の表示"
notification-position-bottom: "下" notification-position-bottom: "下"
notification-position-top: "上" notification-position-top: "上"
theme: "テーマ"
behavior: "Gedrag" behavior: "Gedrag"
fetch-on-scroll: "Ophalen bij scrollen" fetch-on-scroll: "Ophalen bij scrollen"
note-visibility: "投稿の公開範囲" note-visibility: "投稿の公開範囲"

File diff suppressed because it is too large Load Diff

View File

@ -264,6 +264,41 @@ common/views/components/connect-failed.troubleshooter.vue:
common/views/components/media-banner.vue: common/views/components/media-banner.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
common/views/components/theme.vue:
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
dark-themes: "暗いテーマ"
install-a-theme: "テーマのインストール"
theme-code: "テーマコード"
install: "インストール"
installed: "「{}」をインストールしました"
create-a-theme: "テーマの作成"
save-created-theme: "テーマを保存"
primary-color: "プライマリ カラー"
secondary-color: "セカンダリ カラー"
text-color: "文字色"
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Dark"
theme-name: "テーマ名"
preview-created-theme: "プレビュー"
invalid-theme: "テーマが正しくありません。"
already-installed: "既にそのテーマはインストールされています。"
saved: "保存しました"
manage-themes: "テーマの管理"
builtin-themes: "標準テーマ"
my-themes: "マイテーマ"
installed-themes: "インストールされたテーマ"
select-theme: "テーマを選択してください"
uninstall: "アンインストール"
uninstalled: "「{}」をアンインストールしました"
author: "作者"
desc: "説明"
export: "エクスポート"
import: "インポート"
import-by-code: "またはコードをペースト"
theme-name-required: "テーマ名は必須です。"
common/views/components/cw-button.vue: common/views/components/cw-button.vue:
hide: "隠す" hide: "隠す"
show: "もっと見る" show: "もっと見る"
@ -300,7 +335,9 @@ common/views/components/note-menu.vue:
detail: "詳細" detail: "詳細"
copy-link: "リンクをコピー" copy-link: "リンクをコピー"
favorite: "Dodaj do ulubionych" favorite: "Dodaj do ulubionych"
unfavorite: "お気に入り解除"
pin: "Przypnij do profilu" pin: "Przypnij do profilu"
unpin: "ピン留め解除"
delete: "Usuń" delete: "Usuń"
delete-confirm: "Czy na pewno chcesz usunąć ten wpis?" delete-confirm: "Czy na pewno chcesz usunąć ten wpis?"
remote: "Pokaż oryginał" remote: "Pokaż oryginał"
@ -379,6 +416,25 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue: common/views/components/trends.vue:
count: "{}人が投稿" count: "{}人が投稿"
empty: "トレンドなし" empty: "トレンドなし"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-bot: "このアカウントはBotです"
is-locked: "フォローを承認制にする"
careful-bot: "Botからのフォローだけ承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "Sprawdzanie" fetching: "Sprawdzanie"
no-broadcasts: "Brak transmisji" no-broadcasts: "Brak transmisji"
@ -439,6 +495,7 @@ common/views/pages/follow.vue:
following: "Śledzisz" following: "Śledzisz"
follow: "Śledź" follow: "Śledź"
request-pending: "Oczekiwanie na pozwolenie" request-pending: "Oczekiwanie na pozwolenie"
follow-processing: "フォロー処理中"
follow-request: "Poproś o śledzenie" follow-request: "Poproś o śledzenie"
desktop: desktop:
banner-crop-title: "バナーとして表示する部分を選択" banner-crop-title: "バナーとして表示する部分を選択"
@ -477,13 +534,13 @@ desktop/views/components/charts.vue:
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計" notes-total: "投稿の積算"
users: "ユーザーの増減" users: "ユーザーの増減"
users-total: "ユーザーの累計" users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減" drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計" drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減" drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計" drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト" network-requests: "リクエスト"
network-time: "応答時間" network-time: "応答時間"
network-usage: "通信量" network-usage: "通信量"
@ -565,6 +622,7 @@ desktop/views/components/follow-button.vue:
following: "Śledzisz" following: "Śledzisz"
follow: "Śledź" follow: "Śledź"
request-pending: "Oczekiwanie na pozwolenie" request-pending: "Oczekiwanie na pozwolenie"
follow-processing: "フォロー処理中"
follow-request: "Poproś o śledzenie" follow-request: "Poproś o śledzenie"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "Śledzący" followers: "Śledzący"
@ -675,6 +733,7 @@ desktop/views/components/settings.vue:
2fa: "Uwierzytelnianie dwuetapowe" 2fa: "Uwierzytelnianie dwuetapowe"
other: "Inne" other: "Inne"
license: "Licencja" license: "Licencja"
theme: "テーマ"
behaviour: "Zachowanie" behaviour: "Zachowanie"
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół" fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
fetch-on-scroll-desc: "Po przewinięciu na dół strony automatycznie zostaną załadowane nowe treści." fetch-on-scroll-desc: "Po przewinięciu na dół strony automatycznie zostaną załadowane nowe treści."
@ -686,14 +745,18 @@ desktop/views/components/settings.vue:
advanced: "Ustawienia zaawansowane" advanced: "Ustawienia zaawansowane"
api-via-stream: "ストリームを経由したAPIリクエスト" api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。" api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
deck-nav: "デッキ内ナビゲーション"
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
display: "Wygląd i wyświetlanie" display: "Wygląd i wyświetlanie"
customize: "Dostosuj stronę główną" customize: "Dostosuj stronę główną"
wallpaper: "壁紙"
choose-wallpaper: "Wybierz tło" choose-wallpaper: "Wybierz tło"
delete-wallpaper: "Usuń tło" delete-wallpaper: "Usuń tło"
dark-mode: "Tryb ciemny" dark-mode: "Tryb ciemny"
use-shadow: "UIに影を使用"
rounded-corners: "UIの角を丸める"
circle-icons: "Używaj okrągłych ikon" circle-icons: "Używaj okrągłych ikon"
contrasted-acct: "ユーザー名にコントラストを付ける" contrasted-acct: "ユーザー名にコントラストを付ける"
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-clock-on-header: "右上に時計を表示する"
@ -702,14 +765,14 @@ desktop/views/components/settings.vue:
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する" show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "Automatycznie pokazuj mapę" show-maps: "Automatycznie pokazuj mapę"
show-maps-desc: "Mapa będzie automatycznie rozwijana dla wpisów zawierających informacje o lokalizacji." deck-column-align: "デッキのカラムの位置"
deck-column-align-center: "中央"
deck-column-align-left: "左"
sound: "Dźwięk" sound: "Dźwięk"
enable-sounds: "Włącz dźwięk" enable-sounds: "Włącz dźwięk"
enable-sounds-desc: "Odtwarzaj dźwięk przy wstawianiu wpisów, wysyłaniu lub otrzymywaniu wiadomości. Opcja ta jest zapamiętywana przez przeglądarkę." enable-sounds-desc: "Odtwarzaj dźwięk przy wstawianiu wpisów, wysyłaniu lub otrzymywaniu wiadomości. Opcja ta jest zapamiętywana przez przeglądarkę."
volume: "Głośność" volume: "Głośność"
test: "Test" test: "Test"
mobile: "Wersja mobilna"
disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”"
language: "Język" language: "Język"
pick-language: "Wybierz język" pick-language: "Wybierz język"
recommended: "Zalecane" recommended: "Zalecane"
@ -745,6 +808,10 @@ desktop/views/components/settings.vue:
tools: "Narzędzia" tools: "Narzędzia"
task-manager: "Menedżer zadań" task-manager: "Menedżer zadań"
third-parties: "Autorzy trzeci" third-parties: "Autorzy trzeci"
navbar-position: "ナビゲーションバーの位置"
navbar-position-top: "上"
navbar-position-left: "左"
navbar-position-right: "右"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "Jeżeli skonfigurujesz uwierzytelnianie dwuetapowe, aby zablokować się będziesz potrzebować (oprócz hasła) kodu ze skonfigurowanego urządzenia (np. smartfonu), co zwiększy bezpieczeństwo." intro: "Jeżeli skonfigurujesz uwierzytelnianie dwuetapowe, aby zablokować się będziesz potrzebować (oprócz hasła) kodu ze skonfigurowanego urządzenia (np. smartfonu), co zwiększy bezpieczeństwo."
detail: "Zobacz szczegóły…" detail: "Zobacz szczegóły…"
@ -784,20 +851,6 @@ desktop/views/components/settings.password.vue:
enter-new-password-again: "Wprowadź ponownie nowe hasło" enter-new-password-again: "Wprowadź ponownie nowe hasło"
not-match: "Nowe hasła nie pasują do siebie" not-match: "Nowe hasła nie pasują do siebie"
changed: "Pomyślnie zmieniono hasło" changed: "Pomyślnie zmieniono hasło"
desktop/views/components/settings.profile.vue:
avatar: "Awatar"
choice-avatar: "Wybierz obraz"
name: "Nazwa"
location: "Lokalizacja"
description: "Opis"
birthday: "Data urodzenia"
save: "Aktualizuj profil"
locked-account: "Zabezpiecz swoje konto"
is-locked: "フォローを承認制にする"
other: "Inne"
is-bot: "To konto jest prowadzone przez bota"
is-cat: "To konto jest prowadzone przez kota"
profile-updated: "Zaktualizowano profil"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "ten wpis jest prywatny" private: "ten wpis jest prywatny"
deleted: "ten wpis został usunięty" deleted: "ten wpis został usunięty"
@ -896,10 +949,8 @@ 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"
edit: "Opcje" edit: "Opcje"
desktop/views/pages/deck/deck.note.vue: desktop/views/pages/deck/deck.user-column.vue:
reposted-by: "Udostępniono przez {}" pinned-notes: "ピン留めされた投稿"
private: "ten wpis jest prywatny"
deleted: "ten wpis został usunięty"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
@ -1034,6 +1085,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "Hash (md5)" hash: "Hash (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意" nsfw: "閲覧注意"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "To jest zawartość NSFW" sensitive: "To jest zawartość NSFW"
click-to-show: "Naciśnij aby wyświetlić" click-to-show: "Naciśnij aby wyświetlić"
@ -1044,6 +1097,7 @@ mobile/views/components/follow-button.vue:
following: "Śledzisz" following: "Śledzisz"
follow: "Śledź" follow: "Śledź"
request-pending: "Oczekiwanie na pozwolenie" request-pending: "Oczekiwanie na pozwolenie"
follow-processing: "フォロー処理中"
follow-request: "Poproś o śledzenie" follow-request: "Poproś o śledzenie"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "Zacznij śledzić ludzi takich jak Ty" title: "Zacznij śledzić ludzi takich jak Ty"
@ -1173,23 +1227,6 @@ mobile/views/pages/notifications.vue:
read-all: "Czy na pewno chcesz oznaczyć wszystkie powiadomienia jako przeczytane?" read-all: "Czy na pewno chcesz oznaczyć wszystkie powiadomienia jako przeczytane?"
mobile/views/pages/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "Reversi" reversi: "Reversi"
mobile/views/pages/settings/settings.profile.vue:
title: "Profil"
name: "Nazwa"
account: "Konto"
location: "Lokalizacja"
description: "Opis"
birthday: "Data urodzenia"
avatar: "Awatar"
banner: "Baner"
is-cat: "To konto jest prowadzone przez kota"
is-locked: "フォローを承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "Aktualizuj profil"
saved: "Pomyślnie zaktualizowano profil"
uploading: "Wysyłanie"
upload-failed: "Wysyłanie nie powiodło się"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "Szukaj" search: "Szukaj"
empty: "Nie znaleziono wpisów zawierających '{}'" empty: "Nie znaleziono wpisów zawierających '{}'"
@ -1219,6 +1256,7 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示" notification-position: "通知の表示"
notification-position-bottom: "下" notification-position-bottom: "下"
notification-position-top: "上" notification-position-top: "上"
theme: "テーマ"
behavior: "Zachowanie" behavior: "Zachowanie"
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół" fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
note-visibility: "投稿の公開範囲" note-visibility: "投稿の公開範囲"

View File

@ -264,6 +264,41 @@ common/views/components/connect-failed.troubleshooter.vue:
common/views/components/media-banner.vue: common/views/components/media-banner.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
common/views/components/theme.vue:
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
dark-themes: "暗いテーマ"
install-a-theme: "テーマのインストール"
theme-code: "テーマコード"
install: "インストール"
installed: "「{}」をインストールしました"
create-a-theme: "テーマの作成"
save-created-theme: "テーマを保存"
primary-color: "プライマリ カラー"
secondary-color: "セカンダリ カラー"
text-color: "文字色"
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Dark"
theme-name: "テーマ名"
preview-created-theme: "プレビュー"
invalid-theme: "テーマが正しくありません。"
already-installed: "既にそのテーマはインストールされています。"
saved: "保存しました"
manage-themes: "テーマの管理"
builtin-themes: "標準テーマ"
my-themes: "マイテーマ"
installed-themes: "インストールされたテーマ"
select-theme: "テーマを選択してください"
uninstall: "アンインストール"
uninstalled: "「{}」をアンインストールしました"
author: "作者"
desc: "説明"
export: "エクスポート"
import: "インポート"
import-by-code: "またはコードをペースト"
theme-name-required: "テーマ名は必須です。"
common/views/components/cw-button.vue: common/views/components/cw-button.vue:
hide: "隠す" hide: "隠す"
show: "もっと見る" show: "もっと見る"
@ -300,7 +335,9 @@ common/views/components/note-menu.vue:
detail: "詳細" detail: "詳細"
copy-link: "リンクをコピー" copy-link: "リンクをコピー"
favorite: "お気に入り" favorite: "お気に入り"
unfavorite: "お気に入り解除"
pin: "ピン留め" pin: "ピン留め"
unpin: "ピン留め解除"
delete: "削除" delete: "削除"
delete-confirm: "この投稿を削除しますか?" delete-confirm: "この投稿を削除しますか?"
remote: "投稿元で見る" remote: "投稿元で見る"
@ -379,6 +416,25 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue: common/views/components/trends.vue:
count: "{}人が投稿" count: "{}人が投稿"
empty: "トレンドなし" empty: "トレンドなし"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-bot: "このアカウントはBotです"
is-locked: "フォローを承認制にする"
careful-bot: "Botからのフォローだけ承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "確認中" fetching: "確認中"
no-broadcasts: "お知らせはありません" no-broadcasts: "お知らせはありません"
@ -439,6 +495,7 @@ common/views/pages/follow.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop: desktop:
banner-crop-title: "バナーとして表示する部分を選択" banner-crop-title: "バナーとして表示する部分を選択"
@ -477,13 +534,13 @@ desktop/views/components/charts.vue:
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計" notes-total: "投稿の積算"
users: "ユーザーの増減" users: "ユーザーの増減"
users-total: "ユーザーの累計" users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減" drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計" drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減" drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計" drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト" network-requests: "リクエスト"
network-time: "応答時間" network-time: "応答時間"
network-usage: "通信量" network-usage: "通信量"
@ -565,6 +622,7 @@ desktop/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
@ -675,6 +733,7 @@ desktop/views/components/settings.vue:
2fa: "二段階認証" 2fa: "二段階認証"
other: "その他" other: "その他"
license: "ライセンス" license: "ライセンス"
theme: "テーマ"
behaviour: "動作" behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。" fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
@ -686,14 +745,18 @@ desktop/views/components/settings.vue:
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が利用されます。この設定はこのデバイスのみ有効です。"
deck-nav: "デッキ内ナビゲーション"
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
display: "デザインと表示" display: "デザインと表示"
customize: "ホームをカスタマイズ" customize: "ホームをカスタマイズ"
wallpaper: "壁紙"
choose-wallpaper: "壁紙を選択" choose-wallpaper: "壁紙を選択"
delete-wallpaper: "壁紙を削除" delete-wallpaper: "壁紙を削除"
dark-mode: "ダークモード" dark-mode: "ダークモード"
use-shadow: "UIに影を使用"
rounded-corners: "UIの角を丸める"
circle-icons: "円形のアイコンを使用" circle-icons: "円形のアイコンを使用"
contrasted-acct: "ユーザー名にコントラストを付ける" contrasted-acct: "ユーザー名にコントラストを付ける"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する" show-clock-on-header: "右上に時計を表示する"
@ -702,14 +765,14 @@ desktop/views/components/settings.vue:
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する" show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開" show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。" deck-column-align: "デッキのカラムの位置"
deck-column-align-center: "中央"
deck-column-align-left: "左"
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。" enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム" volume: "ボリューム"
test: "テスト" test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語" language: "言語"
pick-language: "言語を選択" pick-language: "言語を選択"
recommended: "推奨" recommended: "推奨"
@ -745,6 +808,10 @@ desktop/views/components/settings.vue:
tools: "ツール" tools: "ツール"
task-manager: "タスクマネージャ" task-manager: "タスクマネージャ"
third-parties: "サードパーティ" third-parties: "サードパーティ"
navbar-position: "ナビゲーションバーの位置"
navbar-position-top: "上"
navbar-position-left: "左"
navbar-position-right: "右"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "詳細..."
@ -784,20 +851,6 @@ desktop/views/components/settings.password.vue:
enter-new-password-again: "もう一度新しいパスワードを入力してください" enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません" not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました" changed: "パスワードを変更しました"
desktop/views/components/settings.profile.vue:
avatar: "アイコン"
choice-avatar: "画像を選択"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
save: "保存"
locked-account: "アカウントの保護"
is-locked: "フォローを承認制にする"
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
@ -896,10 +949,8 @@ desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
edit: "オプション" edit: "オプション"
desktop/views/pages/deck/deck.note.vue: desktop/views/pages/deck/deck.user-column.vue:
reposted-by: "{}がRenote" pinned-notes: "ピン留めされた投稿"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
@ -1034,6 +1085,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意" nsfw: "閲覧注意"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1044,6 +1097,7 @@ mobile/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
@ -1173,23 +1227,6 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "リバーシ" reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "Nome"
account: "Conta"
location: "Lugar"
description: "Biografia"
birthday: "Data de nascimento"
avatar: "Avatar"
banner: "Capa"
is-cat: "Esta conta é gato"
is-locked: "Pedido para seguir precisa ser aprovado"
advanced: "Avançado"
privacy: "Provacidade"
save: "Atualizar perfil"
saved: "Perfil atualizado"
uploading: "Enviando"
upload-failed: "Falha ao enviar"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "Pesquisar" search: "Pesquisar"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"
@ -1219,6 +1256,7 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示" notification-position: "通知の表示"
notification-position-bottom: "下" notification-position-bottom: "下"
notification-position-top: "上" notification-position-top: "上"
theme: "テーマ"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
note-visibility: "投稿の公開範囲" note-visibility: "投稿の公開範囲"

View File

@ -3,9 +3,9 @@ meta:
lang: "Русский язык" lang: "Русский язык"
divider: "" divider: ""
common: common:
misskey: "A ⭐ of fediverse" misskey: "Мы — ⭐ fediverse"
about-title: "A ⭐ of fediverse." about-title: "Мы — ⭐ fediverse"
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。" about: "Спасибо, что нашли Misskey. Misskey — это <b>децентрализованная платформа для микроблоггинга</b> родом с планеты Земля. Поскольку она существует внутри Fediverse (вселенной различных социальных платформ), она связана с другими платформами. Отдохните от шума большого города — и познакомьтесь с новым интернетом."
intro: intro:
title: "Misskeyって" title: "Misskeyって"
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。" about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
@ -264,6 +264,41 @@ common/views/components/connect-failed.troubleshooter.vue:
common/views/components/media-banner.vue: common/views/components/media-banner.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
common/views/components/theme.vue:
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
dark-themes: "暗いテーマ"
install-a-theme: "テーマのインストール"
theme-code: "テーマコード"
install: "インストール"
installed: "「{}」をインストールしました"
create-a-theme: "テーマの作成"
save-created-theme: "テーマを保存"
primary-color: "プライマリ カラー"
secondary-color: "セカンダリ カラー"
text-color: "文字色"
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Dark"
theme-name: "テーマ名"
preview-created-theme: "プレビュー"
invalid-theme: "テーマが正しくありません。"
already-installed: "既にそのテーマはインストールされています。"
saved: "保存しました"
manage-themes: "テーマの管理"
builtin-themes: "標準テーマ"
my-themes: "マイテーマ"
installed-themes: "インストールされたテーマ"
select-theme: "テーマを選択してください"
uninstall: "アンインストール"
uninstalled: "「{}」をアンインストールしました"
author: "作者"
desc: "説明"
export: "エクスポート"
import: "インポート"
import-by-code: "またはコードをペースト"
theme-name-required: "テーマ名は必須です。"
common/views/components/cw-button.vue: common/views/components/cw-button.vue:
hide: "隠す" hide: "隠す"
show: "もっと見る" show: "もっと見る"
@ -300,7 +335,9 @@ common/views/components/note-menu.vue:
detail: "詳細" detail: "詳細"
copy-link: "リンクをコピー" copy-link: "リンクをコピー"
favorite: "お気に入り" favorite: "お気に入り"
unfavorite: "お気に入り解除"
pin: "ピン留め" pin: "ピン留め"
unpin: "ピン留め解除"
delete: "削除" delete: "削除"
delete-confirm: "この投稿を削除しますか?" delete-confirm: "この投稿を削除しますか?"
remote: "投稿元で見る" remote: "投稿元で見る"
@ -379,6 +416,25 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue: common/views/components/trends.vue:
count: "{}人が投稿" count: "{}人が投稿"
empty: "トレンドなし" empty: "トレンドなし"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-bot: "このアカウントはBotです"
is-locked: "フォローを承認制にする"
careful-bot: "Botからのフォローだけ承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "確認中" fetching: "確認中"
no-broadcasts: "お知らせはありません" no-broadcasts: "お知らせはありません"
@ -439,6 +495,7 @@ common/views/pages/follow.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop: desktop:
banner-crop-title: "バナーとして表示する部分を選択" banner-crop-title: "バナーとして表示する部分を選択"
@ -477,13 +534,13 @@ desktop/views/components/charts.vue:
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計" notes-total: "投稿の積算"
users: "ユーザーの増減" users: "ユーザーの増減"
users-total: "ユーザーの累計" users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減" drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計" drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減" drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計" drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト" network-requests: "リクエスト"
network-time: "応答時間" network-time: "応答時間"
network-usage: "通信量" network-usage: "通信量"
@ -565,6 +622,7 @@ desktop/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
@ -675,6 +733,7 @@ desktop/views/components/settings.vue:
2fa: "二段階認証" 2fa: "二段階認証"
other: "その他" other: "その他"
license: "ライセンス" license: "ライセンス"
theme: "テーマ"
behaviour: "動作" behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。" fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
@ -686,14 +745,18 @@ desktop/views/components/settings.vue:
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が利用されます。この設定はこのデバイスのみ有効です。"
deck-nav: "デッキ内ナビゲーション"
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
display: "デザインと表示" display: "デザインと表示"
customize: "ホームをカスタマイズ" customize: "ホームをカスタマイズ"
wallpaper: "壁紙"
choose-wallpaper: "壁紙を選択" choose-wallpaper: "壁紙を選択"
delete-wallpaper: "壁紙を削除" delete-wallpaper: "壁紙を削除"
dark-mode: "ダークモード" dark-mode: "ダークモード"
use-shadow: "UIに影を使用"
rounded-corners: "UIの角を丸める"
circle-icons: "円形のアイコンを使用" circle-icons: "円形のアイコンを使用"
contrasted-acct: "ユーザー名にコントラストを付ける" contrasted-acct: "ユーザー名にコントラストを付ける"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する" show-clock-on-header: "右上に時計を表示する"
@ -702,14 +765,14 @@ desktop/views/components/settings.vue:
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する" show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開" show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。" deck-column-align: "デッキのカラムの位置"
deck-column-align-center: "中央"
deck-column-align-left: "左"
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。" enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム" volume: "ボリューム"
test: "テスト" test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語" language: "言語"
pick-language: "言語を選択" pick-language: "言語を選択"
recommended: "推奨" recommended: "推奨"
@ -745,6 +808,10 @@ desktop/views/components/settings.vue:
tools: "ツール" tools: "ツール"
task-manager: "タスクマネージャ" task-manager: "タスクマネージャ"
third-parties: "サードパーティ" third-parties: "サードパーティ"
navbar-position: "ナビゲーションバーの位置"
navbar-position-top: "上"
navbar-position-left: "左"
navbar-position-right: "右"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "詳細..."
@ -784,20 +851,6 @@ desktop/views/components/settings.password.vue:
enter-new-password-again: "もう一度新しいパスワードを入力してください" enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません" not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました" changed: "パスワードを変更しました"
desktop/views/components/settings.profile.vue:
avatar: "アイコン"
choice-avatar: "画像を選択"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
save: "保存"
locked-account: "アカウントの保護"
is-locked: "フォローを承認制にする"
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
@ -896,10 +949,8 @@ desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
edit: "オプション" edit: "オプション"
desktop/views/pages/deck/deck.note.vue: desktop/views/pages/deck/deck.user-column.vue:
reposted-by: "{}がRenote" pinned-notes: "ピン留めされた投稿"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
@ -1034,6 +1085,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意" nsfw: "閲覧注意"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1044,6 +1097,7 @@ mobile/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
@ -1173,23 +1227,6 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "リバーシ" reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-locked: "フォローを承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"
@ -1219,6 +1256,7 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示" notification-position: "通知の表示"
notification-position-bottom: "下" notification-position-bottom: "下"
notification-position-top: "上" notification-position-top: "上"
theme: "テーマ"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
note-visibility: "投稿の公開範囲" note-visibility: "投稿の公開範囲"

View File

@ -264,6 +264,41 @@ common/views/components/connect-failed.troubleshooter.vue:
common/views/components/media-banner.vue: common/views/components/media-banner.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
common/views/components/theme.vue:
light-theme: "非ダークモード時に使用するテーマ"
dark-theme: "ダークモード時に使用するテーマ"
light-themes: "明るいテーマ"
dark-themes: "暗いテーマ"
install-a-theme: "テーマのインストール"
theme-code: "テーマコード"
install: "インストール"
installed: "「{}」をインストールしました"
create-a-theme: "テーマの作成"
save-created-theme: "テーマを保存"
primary-color: "プライマリ カラー"
secondary-color: "セカンダリ カラー"
text-color: "文字色"
base-theme: "ベーステーマ"
base-theme-light: "Light"
base-theme-dark: "Dark"
theme-name: "テーマ名"
preview-created-theme: "プレビュー"
invalid-theme: "テーマが正しくありません。"
already-installed: "既にそのテーマはインストールされています。"
saved: "保存しました"
manage-themes: "テーマの管理"
builtin-themes: "標準テーマ"
my-themes: "マイテーマ"
installed-themes: "インストールされたテーマ"
select-theme: "テーマを選択してください"
uninstall: "アンインストール"
uninstalled: "「{}」をアンインストールしました"
author: "作者"
desc: "説明"
export: "エクスポート"
import: "インポート"
import-by-code: "またはコードをペースト"
theme-name-required: "テーマ名は必須です。"
common/views/components/cw-button.vue: common/views/components/cw-button.vue:
hide: "隠す" hide: "隠す"
show: "もっと見る" show: "もっと見る"
@ -300,7 +335,9 @@ common/views/components/note-menu.vue:
detail: "詳細" detail: "詳細"
copy-link: "リンクをコピー" copy-link: "リンクをコピー"
favorite: "お気に入り" favorite: "お気に入り"
unfavorite: "お気に入り解除"
pin: "ピン留め" pin: "ピン留め"
unpin: "ピン留め解除"
delete: "削除" delete: "削除"
delete-confirm: "この投稿を削除しますか?" delete-confirm: "この投稿を削除しますか?"
remote: "投稿元で見る" remote: "投稿元で見る"
@ -379,6 +416,25 @@ common/views/components/visibility-chooser.vue:
common/views/components/trends.vue: common/views/components/trends.vue:
count: "{}人が投稿" count: "{}人が投稿"
empty: "トレンドなし" empty: "トレンドなし"
common/views/components/profile-editor.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-bot: "このアカウントはBotです"
is-locked: "フォローを承認制にする"
careful-bot: "Botからのフォローだけ承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "確認中" fetching: "確認中"
no-broadcasts: "お知らせはありません" no-broadcasts: "お知らせはありません"
@ -439,6 +495,7 @@ common/views/pages/follow.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop: desktop:
banner-crop-title: "バナーとして表示する部分を選択" banner-crop-title: "バナーとして表示する部分を選択"
@ -477,13 +534,13 @@ desktop/views/components/charts.vue:
notes: "投稿の増減 (統合)" notes: "投稿の増減 (統合)"
local-notes: "投稿の増減 (ローカル)" local-notes: "投稿の増減 (ローカル)"
remote-notes: "投稿の増減 (リモート)" remote-notes: "投稿の増減 (リモート)"
notes-total: "投稿の累計" notes-total: "投稿の積算"
users: "ユーザーの増減" users: "ユーザーの増減"
users-total: "ユーザーの累計" users-total: "ユーザーの積算"
drive: "ドライブ使用量の増減" drive: "ドライブ使用量の増減"
drive-total: "ドライブ使用量の累計" drive-total: "ドライブ使用量の積算"
drive-files: "ドライブのファイル数の増減" drive-files: "ドライブのファイル数の増減"
drive-files-total: "ドライブのファイル数の累計" drive-files-total: "ドライブのファイル数の積算"
network-requests: "リクエスト" network-requests: "リクエスト"
network-time: "応答時間" network-time: "応答時間"
network-usage: "通信量" network-usage: "通信量"
@ -565,6 +622,7 @@ desktop/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
@ -675,6 +733,7 @@ desktop/views/components/settings.vue:
2fa: "二段階認証" 2fa: "二段階認証"
other: "その他" other: "その他"
license: "ライセンス" license: "ライセンス"
theme: "テーマ"
behaviour: "動作" behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。" fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
@ -686,14 +745,18 @@ desktop/views/components/settings.vue:
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が利用されます。この設定はこのデバイスのみ有効です。"
deck-nav: "デッキ内ナビゲーション"
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
display: "デザインと表示" display: "デザインと表示"
customize: "ホームをカスタマイズ" customize: "ホームをカスタマイズ"
wallpaper: "壁紙"
choose-wallpaper: "壁紙を選択" choose-wallpaper: "壁紙を選択"
delete-wallpaper: "壁紙を削除" delete-wallpaper: "壁紙を削除"
dark-mode: "ダークモード" dark-mode: "ダークモード"
use-shadow: "UIに影を使用"
rounded-corners: "UIの角を丸める"
circle-icons: "円形のアイコンを使用" circle-icons: "円形のアイコンを使用"
contrasted-acct: "ユーザー名にコントラストを付ける" contrasted-acct: "ユーザー名にコントラストを付ける"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-clock-on-header: "右上に時計を表示する" show-clock-on-header: "右上に時計を表示する"
@ -702,14 +765,14 @@ desktop/views/components/settings.vue:
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する" show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開" show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。" deck-column-align: "デッキのカラムの位置"
deck-column-align-center: "中央"
deck-column-align-left: "左"
sound: "サウンド" sound: "サウンド"
enable-sounds: "サウンドを有効にする" enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。" enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム" volume: "ボリューム"
test: "テスト" test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語" language: "言語"
pick-language: "言語を選択" pick-language: "言語を選択"
recommended: "推奨" recommended: "推奨"
@ -745,6 +808,10 @@ desktop/views/components/settings.vue:
tools: "ツール" tools: "ツール"
task-manager: "タスクマネージャ" task-manager: "タスクマネージャ"
third-parties: "サードパーティ" third-parties: "サードパーティ"
navbar-position: "ナビゲーションバーの位置"
navbar-position-top: "上"
navbar-position-left: "左"
navbar-position-right: "右"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "詳細..."
@ -784,20 +851,6 @@ desktop/views/components/settings.password.vue:
enter-new-password-again: "もう一度新しいパスワードを入力してください" enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません" not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました" changed: "パスワードを変更しました"
desktop/views/components/settings.profile.vue:
avatar: "アイコン"
choice-avatar: "画像を選択"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
save: "保存"
locked-account: "アカウントの保護"
is-locked: "フォローを承認制にする"
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
@ -896,10 +949,8 @@ desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー" is-media-view: "メディアビュー"
edit: "オプション" edit: "オプション"
desktop/views/pages/deck/deck.note.vue: desktop/views/pages/deck/deck.user-column.vue:
reposted-by: "{}がRenote" pinned-notes: "ピン留めされた投稿"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/stats/stats.vue: desktop/views/pages/stats/stats.vue:
all-users: "全てのユーザー" all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー" original-users: "このインスタンスのユーザー"
@ -1034,6 +1085,8 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)" hash: "ハッシュ (md5)"
exif: "EXIF" exif: "EXIF"
nsfw: "閲覧注意" nsfw: "閲覧注意"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
mobile/views/components/media-image.vue: mobile/views/components/media-image.vue:
sensitive: "閲覧注意" sensitive: "閲覧注意"
click-to-show: "クリックして表示" click-to-show: "クリックして表示"
@ -1044,6 +1097,7 @@ mobile/views/components/follow-button.vue:
following: "フォロー中" following: "フォロー中"
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-processing: "フォロー処理中"
follow-request: "フォロー申請" follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
@ -1173,23 +1227,6 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "リバーシ" reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-locked: "フォローを承認制にする"
advanced: "その他"
privacy: "プライバシー"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"
@ -1219,6 +1256,7 @@ mobile/views/pages/settings.vue:
notification-position: "通知の表示" notification-position: "通知の表示"
notification-position-bottom: "下" notification-position-bottom: "下"
notification-position-top: "上" notification-position-top: "上"
theme: "テーマ"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
note-visibility: "投稿の公開範囲" note-visibility: "投稿の公開範囲"

View File

@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "9.0.0", "version": "10.23.0",
"clientVersion": "1.0.10049", "clientVersion": "1.0.10698",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,
@ -20,26 +20,27 @@
"format": "gulp format" "format": "gulp format"
}, },
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-svg-core": "1.2.4", "@fortawesome/fontawesome-svg-core": "1.2.6",
"@fortawesome/free-brands-svg-icons": "5.3.1", "@fortawesome/free-brands-svg-icons": "5.4.1",
"@fortawesome/free-regular-svg-icons": "5.3.1", "@fortawesome/free-regular-svg-icons": "5.4.1",
"@fortawesome/free-solid-svg-icons": "5.3.1", "@fortawesome/free-solid-svg-icons": "5.4.1",
"@koa/cors": "2.2.2", "@koa/cors": "2.2.2",
"@prezzemolo/rap": "0.1.2", "@prezzemolo/rap": "0.1.2",
"@prezzemolo/zip": "0.0.3", "@prezzemolo/zip": "0.0.3",
"@types/bcryptjs": "2.4.2", "@types/bcryptjs": "2.4.2",
"@types/chai-http": "3.0.5",
"@types/dateformat": "1.0.1", "@types/dateformat": "1.0.1",
"@types/debug": "0.0.30", "@types/debug": "0.0.31",
"@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.26", "@types/elasticsearch": "5.0.28",
"@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",
"@types/gulp-mocha": "0.0.32", "@types/gulp-mocha": "0.0.32",
"@types/gulp-rename": "0.0.33", "@types/gulp-rename": "0.0.33",
"@types/gulp-replace": "0.0.31", "@types/gulp-replace": "0.0.31",
"@types/gulp-uglify": "3.0.5", "@types/gulp-uglify": "3.0.6",
"@types/gulp-util": "3.0.34", "@types/gulp-util": "3.0.34",
"@types/is-root": "1.0.0", "@types/is-root": "1.0.0",
"@types/is-url": "1.2.28", "@types/is-url": "1.2.28",
@ -48,7 +49,7 @@
"@types/koa-bodyparser": "5.0.1", "@types/koa-bodyparser": "5.0.1",
"@types/koa-compress": "2.0.8", "@types/koa-compress": "2.0.8",
"@types/koa-favicon": "2.0.19", "@types/koa-favicon": "2.0.19",
"@types/koa-logger": "3.1.0", "@types/koa-logger": "3.1.1",
"@types/koa-mount": "3.0.1", "@types/koa-mount": "3.0.1",
"@types/koa-multer": "1.0.0", "@types/koa-multer": "1.0.0",
"@types/koa-router": "7.0.32", "@types/koa-router": "7.0.32",
@ -58,19 +59,19 @@
"@types/minio": "7.0.0", "@types/minio": "7.0.0",
"@types/mkdirp": "0.5.2", "@types/mkdirp": "0.5.2",
"@types/mocha": "5.2.3", "@types/mocha": "5.2.3",
"@types/mongodb": "3.1.7", "@types/mongodb": "3.1.12",
"@types/ms": "0.7.30", "@types/ms": "0.7.30",
"@types/node": "10.10.3", "@types/node": "10.12.0",
"@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.3.0",
"@types/ratelimiter": "2.1.28", "@types/ratelimiter": "2.1.28",
"@types/redis": "2.8.6", "@types/redis": "2.8.7",
"@types/request": "2.47.1", "@types/request": "2.47.1",
"@types/request-promise-native": "1.0.15", "@types/request-promise-native": "1.0.15",
"@types/rimraf": "2.0.2", "@types/rimraf": "2.0.2",
"@types/seedrandom": "2.4.27", "@types/seedrandom": "2.4.27",
"@types/sharp": "0.17.10", "@types/sharp": "0.21.0",
"@types/showdown": "1.7.5", "@types/showdown": "1.7.5",
"@types/single-line-log": "1.1.0", "@types/single-line-log": "1.1.0",
"@types/speakeasy": "2.0.2", "@types/speakeasy": "2.0.2",
@ -78,27 +79,30 @@
"@types/tinycolor2": "1.4.1", "@types/tinycolor2": "1.4.1",
"@types/tmp": "0.0.33", "@types/tmp": "0.0.33",
"@types/uuid": "3.4.4", "@types/uuid": "3.4.4",
"@types/webpack": "4.4.12", "@types/webpack": "4.4.17",
"@types/webpack-stream": "3.2.10", "@types/webpack-stream": "3.2.10",
"@types/websocket": "0.0.40", "@types/websocket": "0.0.40",
"@types/ws": "6.0.1", "@types/ws": "6.0.1",
"animejs": "2.2.0", "animejs": "2.2.0",
"autobind-decorator": "2.1.0",
"autosize": "4.0.2", "autosize": "4.0.2",
"autwh": "0.1.0", "autwh": "0.1.0",
"bcryptjs": "2.4.3", "bcryptjs": "2.4.3",
"bee-queue": "1.2.2", "bee-queue": "1.2.2",
"bootstrap-vue": "2.0.0-rc.11", "bootstrap-vue": "2.0.0-rc.11",
"cafy": "11.3.0", "cafy": "11.3.0",
"chai": "4.2.0",
"chai-http": "4.2.0",
"chalk": "2.4.1", "chalk": "2.4.1",
"chart.js": "2.7.2", "chart.js": "2.7.3",
"commander": "2.17.1", "commander": "2.19.0",
"crc-32": "1.2.0", "crc-32": "1.2.0",
"css-loader": "1.0.0", "css-loader": "1.0.0",
"dateformat": "3.0.3", "dateformat": "3.0.3",
"debug": "4.0.1", "debug": "4.1.0",
"deep-equal": "1.0.1", "deep-equal": "1.0.1",
"deepcopy": "0.6.3", "deepcopy": "0.6.3",
"diskusage": "0.2.4", "diskusage": "0.2.5",
"dompurify": "1.0.5", "dompurify": "1.0.5",
"double-ended-queue": "2.1.0-0", "double-ended-queue": "2.1.0-0",
"elasticsearch": "15.1.1", "elasticsearch": "15.1.1",
@ -108,12 +112,12 @@
"eslint-plugin-vue": "4.7.1", "eslint-plugin-vue": "4.7.1",
"eventemitter3": "3.1.0", "eventemitter3": "3.1.0",
"exif-js": "2.3.0", "exif-js": "2.3.0",
"file-loader": "1.1.11", "file-loader": "2.0.0",
"file-type": "9.0.0", "file-type": "10.0.0",
"fuckadblock": "3.2.1", "fuckadblock": "3.2.1",
"gulp": "3.9.1", "gulp": "3.9.1",
"gulp-cssnano": "2.1.3", "gulp-cssnano": "2.1.3",
"gulp-htmlmin": "4.0.0", "gulp-htmlmin": "5.0.1",
"gulp-imagemin": "4.1.0", "gulp-imagemin": "4.1.0",
"gulp-mocha": "6.0.0", "gulp-mocha": "6.0.0",
"gulp-pug": "4.0.1", "gulp-pug": "4.0.1",
@ -133,14 +137,16 @@
"is-root": "2.0.0", "is-root": "2.0.0",
"is-url": "1.2.4", "is-url": "1.2.4",
"js-yaml": "3.12.0", "js-yaml": "3.12.0",
"jsdom": "11.12.0", "jsdom": "12.2.0",
"json5": "2.1.0",
"json5-loader": "1.0.1",
"koa": "2.5.1", "koa": "2.5.1",
"koa-bodyparser": "4.2.1", "koa-bodyparser": "4.2.1",
"koa-compress": "3.0.0", "koa-compress": "3.0.0",
"koa-favicon": "2.0.1", "koa-favicon": "2.0.1",
"koa-json-body": "5.3.0", "koa-json-body": "5.3.0",
"koa-logger": "3.2.0", "koa-logger": "3.2.0",
"koa-mount": "3.0.0", "koa-mount": "4.0.0",
"koa-multer": "1.0.2", "koa-multer": "1.0.2",
"koa-router": "7.4.0", "koa-router": "7.4.0",
"koa-send": "5.0.0", "koa-send": "5.0.0",
@ -154,10 +160,10 @@
"mkdirp": "0.5.1", "mkdirp": "0.5.1",
"mocha": "5.2.0", "mocha": "5.2.0",
"moji": "0.5.1", "moji": "0.5.1",
"mongodb": "3.1.1", "mongodb": "3.1.8",
"monk": "6.0.6", "monk": "6.0.6",
"ms": "2.1.1", "ms": "2.1.1",
"nan": "2.11.0", "nan": "2.11.1",
"nested-property": "0.0.7", "nested-property": "0.0.7",
"nprogress": "0.2.0", "nprogress": "0.2.0",
"object-assign-deep": "0.4.0", "object-assign-deep": "0.4.0",
@ -166,13 +172,14 @@
"parse5": "5.1.0", "parse5": "5.1.0",
"portscanner": "2.2.0", "portscanner": "2.2.0",
"progress-bar-webpack-plugin": "1.11.0", "progress-bar-webpack-plugin": "1.11.0",
"promise-limit": "2.7.0",
"promise-sequential": "1.1.1", "promise-sequential": "1.1.1",
"pug": "2.0.3", "pug": "2.0.3",
"punycode": "2.1.1", "punycode": "2.1.1",
"qrcode": "1.2.2", "qrcode": "1.3.0",
"ratelimiter": "3.2.0", "ratelimiter": "3.2.0",
"recaptcha-promise": "0.1.3", "recaptcha-promise": "0.1.3",
"reconnecting-websocket": "3.2.2", "reconnecting-websocket": "4.1.9",
"redis": "2.8.0", "redis": "2.8.0",
"request": "2.88.0", "request": "2.88.0",
"request-promise-native": "1.0.5", "request-promise-native": "1.0.5",
@ -182,17 +189,17 @@
"s-age": "1.1.2", "s-age": "1.1.2",
"sass-loader": "7.1.0", "sass-loader": "7.1.0",
"seedrandom": "2.4.4", "seedrandom": "2.4.4",
"sharp": "0.20.7", "sharp": "0.21.0",
"showdown": "1.8.6", "showdown": "1.8.7",
"showdown-highlightjs-extension": "0.1.2", "showdown-highlightjs-extension": "0.1.2",
"single-line-log": "1.1.2", "single-line-log": "1.1.2",
"speakeasy": "2.0.0", "speakeasy": "2.0.0",
"stringz": "1.0.0", "stringz": "1.0.0",
"style-loader": "0.23.0", "style-loader": "0.23.1",
"stylus": "0.54.5", "stylus": "0.54.5",
"stylus-loader": "3.0.2", "stylus-loader": "3.0.2",
"summaly": "2.2.0", "summaly": "2.2.0",
"systeminformation": "3.45.6", "systeminformation": "3.45.7",
"syuilo-password-strength": "0.0.1", "syuilo-password-strength": "0.0.1",
"textarea-caret": "3.1.0", "textarea-caret": "3.1.0",
"tinycolor2": "1.4.1", "tinycolor2": "1.4.1",
@ -201,21 +208,23 @@
"ts-node": "7.0.1", "ts-node": "7.0.1",
"tslint": "5.10.0", "tslint": "5.10.0",
"typescript": "2.9.2", "typescript": "2.9.2",
"typescript-eslint-parser": "18.0.0", "typescript-eslint-parser": "20.0.0",
"uglify-es": "3.3.9", "uglify-es": "3.3.9",
"url-loader": "1.1.1", "url-loader": "1.1.2",
"uuid": "3.3.2", "uuid": "3.3.2",
"v-animate-css": "0.0.2", "v-animate-css": "0.0.2",
"vue": "2.5.17", "vue": "2.5.17",
"vue-chartjs": "3.4.0", "vue-chartjs": "3.4.0",
"vue-color": "2.6.0", "vue-color": "2.7.0",
"vue-content-loading": "1.5.3",
"vue-cropperjs": "2.2.2", "vue-cropperjs": "2.2.2",
"vue-js-modal": "1.3.26", "vue-js-modal": "1.3.26",
"vue-json-tree-view": "2.1.4", "vue-json-tree-view": "2.1.4",
"vue-loader": "15.4.2", "vue-loader": "15.4.2",
"vue-router": "3.0.1", "vue-router": "3.0.1",
"vue-style-loader": "4.1.2", "vue-style-loader": "4.1.2",
"vue-svg-inline-loader": "1.1.3", "vue-svg-inline-loader": "1.2.1",
"vue-sweetalert2": "1.5.6",
"vue-template-compiler": "2.5.17", "vue-template-compiler": "2.5.17",
"vuedraggable": "2.16.0", "vuedraggable": "2.16.0",
"vuewordcloud": "18.7.11", "vuewordcloud": "18.7.11",
@ -223,10 +232,10 @@
"vuex-persistedstate": "2.5.4", "vuex-persistedstate": "2.5.4",
"web-push": "3.3.3", "web-push": "3.3.3",
"webfinger.js": "2.6.6", "webfinger.js": "2.6.6",
"webpack": "4.19.1", "webpack": "4.21.0",
"webpack-cli": "3.1.0", "webpack-cli": "3.1.2",
"websocket": "1.0.28", "websocket": "1.0.28",
"ws": "6.0.0", "ws": "6.1.0",
"xev": "2.0.1" "xev": "2.0.1"
}, },
"greenkeeper": { "greenkeeper": {

View File

@ -130,3 +130,29 @@ pre
[data-fa] [data-fa]
display inline-block display inline-block
.swal2-container
z-index 10000 !important
&.swal2-shown
background-color rgba(0, 0, 0, 0.5) !important
.swal2-popup
background var(--face) !important
.swal2-content
color var(--text) !important
.swal2-confirm
background-color var(--primary) !important
border-left-color var(--primary) !important
border-right-color var(--primary) !important
color var(--primaryForeground) !important
&:hover
background-image none !important
background-color var(--primaryDarken5) !important
&:active
background-image none !important
background-color var(--primaryDarken5) !important

View File

@ -5,9 +5,6 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { url, lang } from './config'; import { url, lang } from './config';
import applyTheme from './common/scripts/theme';
const darkTheme = require('../theme/dark');
const halloweenTheme = require('../theme/halloween');
export default Vue.extend({ export default Vue.extend({
computed: { computed: {

View File

@ -34,9 +34,6 @@ html
//- FontAwesome style //- FontAwesome style
style #{facss} style #{facss}
//- highlight.js style
style #{hljscss}
body body
noscript: p noscript: p
| JavaScriptを有効にしてください | JavaScriptを有効にしてください

View File

@ -24,7 +24,6 @@
const theme = localStorage.getItem('theme'); const theme = localStorage.getItem('theme');
if (theme) { if (theme) {
Object.entries(JSON.parse(theme)).forEach(([k, v]) => { Object.entries(JSON.parse(theme)).forEach(([k, v]) => {
if (k == 'meta') return;
document.documentElement.style.setProperty(`--${k}`, v.toString()); document.documentElement.style.setProperty(`--${k}`, v.toString());
}); });
} }
@ -143,7 +142,7 @@
localStorage.setItem('shouldFlush', 'false'); localStorage.setItem('shouldFlush', 'false');
// Random // Random
localStorage.setItem('salt', Math.random().toString()); localStorage.setItem('salt', Math.random().toString().substr(2, 8));
// Clear cache (service worker) // Clear cache (service worker)
try { try {

View File

@ -13,21 +13,21 @@ type Notification = {
export default function(type, data): Notification { export default function(type, data): Notification {
switch (type) { switch (type) {
case 'drive_file_created': case 'driveFileCreated':
return { return {
title: '%i18n:common.notification.file-uploaded%', title: '%i18n:common.notification.file-uploaded%',
body: data.name, body: data.name,
icon: data.url icon: data.url
}; };
case 'unread_messaging_message': case 'unreadMessagingMessage':
return { return {
title: '%i18n:common.notification.message-from%'.split("{}")[0] + `${getUserName(data.user)}` + '%i18n:common.notification.message-from%'.split("{}")[1] , title: '%i18n:common.notification.message-from%'.split("{}")[0] + `${getUserName(data.user)}` + '%i18n:common.notification.message-from%'.split("{}")[1] ,
body: data.text, // TODO: getMessagingMessageSummary(data), body: data.text, // TODO: getMessagingMessageSummary(data),
icon: data.user.avatarUrl icon: data.user.avatarUrl
}; };
case 'reversi_invited': case 'reversiInvited':
return { return {
title: '%i18n:common.notification.reversi-invited%', title: '%i18n:common.notification.reversi-invited%',
body: '%i18n:common.notification.reversi-invited-by%'.split("{}")[0] + `${getUserName(data.parent)}` + '%i18n:common.notification.reversi-invited-by%'.split("{}")[1], body: '%i18n:common.notification.reversi-invited-by%'.split("{}")[0] + `${getUserName(data.parent)}` + '%i18n:common.notification.reversi-invited-by%'.split("{}")[1],

View File

@ -0,0 +1,8 @@
const crypto = require('crypto');
export default (data: ArrayBuffer) => {
const buf = new Buffer(data);
const hash = crypto.createHash("md5");
hash.update(buf);
return hash.digest("hex");
};

View File

@ -0,0 +1,178 @@
import parse from '../../../../mfm/parse';
import { sum } from '../../../../prelude/array';
import MkNoteMenu from '../views/components/note-menu.vue';
import MkReactionPicker from '../views/components/reaction-picker.vue';
import Ok from '../views/components/ok.vue';
function focus(el, fn) {
const target = fn(el);
if (target) {
if (target.hasAttribute('tabindex')) {
target.focus();
} else {
focus(target, fn);
}
}
}
type Opts = {
mobile?: boolean;
};
export default (opts: Opts = {}) => ({
data() {
return {
showContent: false
};
},
computed: {
keymap(): any {
return {
'r|left': () => this.reply(true),
'e|a|plus': () => this.react(true),
'q|right': () => this.renote(true),
'f|b': this.favorite,
'delete|ctrl+d': this.del,
'ctrl+q|ctrl+right': this.renoteDirectly,
'up|k|shift+tab': this.focusBefore,
'down|j|tab': this.focusAfter,
'esc': this.blur,
'm|o': () => this.menu(true),
's': this.toggleShowContent,
'1': () => this.reactDirectly('like'),
'2': () => this.reactDirectly('love'),
'3': () => this.reactDirectly('laugh'),
'4': () => this.reactDirectly('hmm'),
'5': () => this.reactDirectly('surprise'),
'6': () => this.reactDirectly('congrats'),
'7': () => this.reactDirectly('angry'),
'8': () => this.reactDirectly('confused'),
'9': () => this.reactDirectly('rip'),
'0': () => this.reactDirectly('pudding'),
};
},
isRenote(): boolean {
return (this.note.renote &&
this.note.text == null &&
this.note.fileIds.length == 0 &&
this.note.poll == null);
},
appearNote(): any {
return this.isRenote ? this.note.renote : this.note;
},
reactionsCount(): number {
return this.appearNote.reactionCounts
? sum(Object.values(this.appearNote.reactionCounts))
: 0;
},
title(): string {
return new Date(this.appearNote.createdAt).toLocaleString();
},
urls(): string[] {
if (this.appearNote.text) {
const ast = parse(this.appearNote.text);
return ast
.filter(t => (t.type == 'url' || t.type == 'link') && !t.silent)
.map(t => t.url);
} else {
return null;
}
}
},
methods: {
reply(viaKeyboard = false) {
(this as any).apis.post({
reply: this.appearNote,
animation: !viaKeyboard,
cb: () => {
this.focus();
}
});
},
renote(viaKeyboard = false) {
(this as any).apis.post({
renote: this.appearNote,
animation: !viaKeyboard,
cb: () => {
this.focus();
}
});
},
renoteDirectly() {
(this as any).api('notes/create', {
renoteId: this.appearNote.id
});
},
react(viaKeyboard = false) {
this.blur();
(this as any).os.new(MkReactionPicker, {
source: this.$refs.reactButton,
note: this.appearNote,
showFocus: viaKeyboard,
animation: !viaKeyboard,
compact: opts.mobile,
big: opts.mobile
}).$once('closed', this.focus);
},
reactDirectly(reaction) {
(this as any).api('notes/reactions/create', {
noteId: this.appearNote.id,
reaction: reaction
});
},
favorite() {
(this as any).api('notes/favorites/create', {
noteId: this.appearNote.id
}).then(() => {
(this as any).os.new(Ok);
});
},
del() {
(this as any).api('notes/delete', {
noteId: this.appearNote.id
});
},
menu(viaKeyboard = false) {
(this as any).os.new(MkNoteMenu, {
source: this.$refs.menuButton,
note: this.appearNote,
animation: !viaKeyboard,
compact: opts.mobile,
}).$once('closed', this.focus);
},
toggleShowContent() {
this.showContent = !this.showContent;
},
focus() {
this.$el.focus();
},
blur() {
this.$el.blur();
},
focusBefore() {
focus(this.$el, e => e.previousElementSibling);
},
focusAfter() {
focus(this.$el, e => e.nextElementSibling);
}
}
});

View File

@ -0,0 +1,128 @@
import Vue from 'vue';
export default prop => ({
data() {
return {
connection: null
};
},
computed: {
$_ns_note_(): any {
return this[prop];
},
$_ns_isRenote(): boolean {
return (this.$_ns_note_.renote != null &&
this.$_ns_note_.text == null &&
this.$_ns_note_.fileIds.length == 0 &&
this.$_ns_note_.poll == null);
},
$_ns_target(): any {
return this.$_ns_isRenote ? this.$_ns_note_.renote : this.$_ns_note_;
},
},
created() {
if (this.$store.getters.isSignedIn) {
this.connection = (this as any).os.stream;
}
},
mounted() {
this.capture(true);
if (this.$store.getters.isSignedIn) {
this.connection.on('_connected_', this.onStreamConnected);
}
},
beforeDestroy() {
this.decapture(true);
if (this.$store.getters.isSignedIn) {
this.connection.off('_connected_', this.onStreamConnected);
}
},
methods: {
capture(withHandler = false) {
if (this.$store.getters.isSignedIn) {
const data = {
id: this.$_ns_target.id
} as any;
if (
(this.$_ns_target.visibleUserIds || []).includes(this.$store.state.i.id) ||
(this.$_ns_target.mentions || []).includes(this.$store.state.i.id)
) {
data.read = true;
}
this.connection.send('sn', data);
if (withHandler) this.connection.on('noteUpdated', this.onStreamNoteUpdated);
}
},
decapture(withHandler = false) {
if (this.$store.getters.isSignedIn) {
this.connection.send('un', {
id: this.$_ns_target.id
});
if (withHandler) this.connection.off('noteUpdated', this.onStreamNoteUpdated);
}
},
onStreamConnected() {
this.capture();
},
onStreamNoteUpdated(data) {
const { type, id, body } = data;
if (id !== this.$_ns_target.id) return;
switch (type) {
case 'reacted': {
const reaction = body.reaction;
if (this.$_ns_target.reactionCounts == null) {
Vue.set(this.$_ns_target, 'reactionCounts', {});
}
if (this.$_ns_target.reactionCounts[reaction] == null) {
Vue.set(this.$_ns_target.reactionCounts, reaction, 0);
}
this.$_ns_target.reactionCounts[reaction]++;
if (body.userId == this.$store.state.i.id) {
Vue.set(this.$_ns_target, 'myReaction', reaction);
}
break;
}
case 'pollVoted': {
if (body.userId == this.$store.state.i.id) return;
const choice = body.choice;
this.$_ns_target.poll.choices.find(c => c.id === choice).votes++;
break;
}
case 'deleted': {
Vue.set(this.$_ns_target, 'deletedAt', body.deletedAt);
this.$_ns_target.text = null;
this.$_ns_target.tags = [];
this.$_ns_target.fileIds = [];
this.$_ns_target.poll = null;
this.$_ns_target.geo = null;
this.$_ns_target.cw = null;
break;
}
}
this.$emit(`update:${prop}`, this.$_ns_note_);
},
}
});

View File

@ -0,0 +1,303 @@
import autobind from 'autobind-decorator';
import { EventEmitter } from 'eventemitter3';
import ReconnectingWebsocket from 'reconnecting-websocket';
import { wsUrl } from '../../config';
import MiOS from '../../mios';
/**
* Misskey stream connection
*/
export default class Stream extends EventEmitter {
private stream: ReconnectingWebsocket;
public state: string;
private sharedConnectionPools: Pool[] = [];
private sharedConnections: SharedConnection[] = [];
private nonSharedConnections: NonSharedConnection[] = [];
constructor(os: MiOS) {
super();
this.state = 'initializing';
const user = os.store.state.i;
this.stream = new ReconnectingWebsocket(wsUrl + (user ? `?i=${user.token}` : ''));
this.stream.addEventListener('open', this.onOpen);
this.stream.addEventListener('close', this.onClose);
this.stream.addEventListener('message', this.onMessage);
}
@autobind
public useSharedConnection(channel: string): SharedConnection {
let pool = this.sharedConnectionPools.find(p => p.channel === channel);
if (pool == null) {
pool = new Pool(this, channel);
this.sharedConnectionPools.push(pool);
}
const connection = new SharedConnection(this, channel, pool);
this.sharedConnections.push(connection);
return connection;
}
@autobind
public removeSharedConnection(connection: SharedConnection) {
this.sharedConnections = this.sharedConnections.filter(c => c !== connection);
}
@autobind
public removeSharedConnectionPool(pool: Pool) {
this.sharedConnectionPools = this.sharedConnectionPools.filter(p => p !== pool);
}
@autobind
public connectToChannel(channel: string, params?: any): NonSharedConnection {
const connection = new NonSharedConnection(this, channel, params);
this.nonSharedConnections.push(connection);
return connection;
}
@autobind
public disconnectToChannel(connection: NonSharedConnection) {
this.nonSharedConnections = this.nonSharedConnections.filter(c => c !== connection);
}
/**
* Callback of when open connection
*/
@autobind
private onOpen() {
const isReconnect = this.state == 'reconnecting';
this.state = 'connected';
this.emit('_connected_');
// チャンネル再接続
if (isReconnect) {
this.sharedConnectionPools.forEach(p => {
p.connect();
});
this.nonSharedConnections.forEach(c => {
c.connect();
});
}
}
/**
* Callback of when close connection
*/
@autobind
private onClose() {
if (this.state == 'connected') {
this.state = 'reconnecting';
this.emit('_disconnected_');
}
}
/**
* Callback of when received a message from connection
*/
@autobind
private onMessage(message) {
const { type, body } = JSON.parse(message.data);
if (type == 'channel') {
const id = body.id;
let connections: Connection[];
connections = this.sharedConnections.filter(c => c.id === id);
if (connections.length === 0) {
connections = [this.nonSharedConnections.find(c => c.id === id)];
}
connections.filter(c => c != null).forEach(c => {
c.emit(body.type, body.body);
});
} else {
this.emit(type, body);
}
}
/**
* Send a message to connection
*/
@autobind
public send(typeOrPayload, payload?) {
const data = payload === undefined ? typeOrPayload : {
type: typeOrPayload,
body: payload
};
this.stream.send(JSON.stringify(data));
}
/**
* Close this connection
*/
@autobind
public close() {
this.stream.removeEventListener('open', this.onOpen);
this.stream.removeEventListener('message', this.onMessage);
}
}
class Pool {
public channel: string;
public id: string;
protected stream: Stream;
public users = 0;
private disposeTimerId: any;
private isConnected = false;
constructor(stream: Stream, channel: string) {
this.channel = channel;
this.stream = stream;
this.id = Math.random().toString().substr(2, 8);
this.stream.on('_disconnected_', this.onStreamDisconnected);
}
@autobind
private onStreamDisconnected() {
this.isConnected = false;
}
@autobind
public inc() {
if (this.users === 0 && !this.isConnected) {
this.connect();
}
this.users++;
// タイマー解除
if (this.disposeTimerId) {
clearTimeout(this.disposeTimerId);
this.disposeTimerId = null;
}
}
@autobind
public dec() {
this.users--;
// そのコネクションの利用者が誰もいなくなったら
if (this.users === 0) {
// また直ぐに再利用される可能性があるので、一定時間待ち、
// 新たな利用者が現れなければコネクションを切断する
this.disposeTimerId = setTimeout(() => {
this.disconnect();
}, 3000);
}
}
@autobind
public connect() {
if (this.isConnected) return;
this.isConnected = true;
this.stream.send('connect', {
channel: this.channel,
id: this.id
});
}
@autobind
private disconnect() {
this.stream.off('_disconnected_', this.onStreamDisconnected);
this.stream.send('disconnect', { id: this.id });
this.stream.removeSharedConnectionPool(this);
}
}
abstract class Connection extends EventEmitter {
public channel: string;
protected stream: Stream;
public abstract id: string;
constructor(stream: Stream, channel: string) {
super();
this.stream = stream;
this.channel = channel;
}
@autobind
public send(id: string, typeOrPayload, payload?) {
const type = payload === undefined ? typeOrPayload.type : typeOrPayload;
const body = payload === undefined ? typeOrPayload.body : payload;
this.stream.send('ch', {
id: id,
type: type,
body: body
});
}
public abstract dispose(): void;
}
class SharedConnection extends Connection {
private pool: Pool;
public get id(): string {
return this.pool.id;
}
constructor(stream: Stream, channel: string, pool: Pool) {
super(stream, channel);
this.pool = pool;
this.pool.inc();
}
@autobind
public send(typeOrPayload, payload?) {
super.send(this.pool.id, typeOrPayload, payload);
}
@autobind
public dispose() {
this.pool.dec();
this.removeAllListeners();
this.stream.removeSharedConnection(this);
}
}
class NonSharedConnection extends Connection {
public id: string;
protected params: any;
constructor(stream: Stream, channel: string, params?: any) {
super(stream, channel);
this.params = params;
this.id = Math.random().toString().substr(2, 8);
this.connect();
}
@autobind
public connect() {
this.stream.send('connect', {
channel: this.channel,
id: this.id,
params: this.params
});
}
@autobind
public send(typeOrPayload, payload?) {
super.send(this.id, typeOrPayload, payload);
}
@autobind
public dispose() {
this.removeAllListeners();
this.stream.send('disconnect', { id: this.id });
this.stream.disconnectToChannel(this);
}
}

View File

@ -1,34 +0,0 @@
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../../mios';
/**
* Drive stream connection
*/
export class DriveStream extends Stream {
constructor(os: MiOS, me) {
super(os, 'drive', {
i: me.token
});
}
}
export class DriveStreamManager extends StreamManager<DriveStream> {
private me;
private os: MiOS;
constructor(os: MiOS, me) {
super();
this.me = me;
this.os = os;
}
public getConnection() {
if (this.connection == null) {
this.connection = new DriveStream(this.os, this.me);
}
return this.connection;
}
}

View File

@ -1,13 +0,0 @@
import Stream from '../../stream';
import MiOS from '../../../../../mios';
export class ReversiGameStream extends Stream {
constructor(os: MiOS, me, game) {
super(os, 'games/reversi-game', me ? {
i: me.token,
game: game.id
} : {
game: game.id
});
}
}

View File

@ -1,31 +0,0 @@
import StreamManager from '../../stream-manager';
import Stream from '../../stream';
import MiOS from '../../../../../mios';
export class ReversiStream extends Stream {
constructor(os: MiOS, me) {
super(os, 'games/reversi', {
i: me.token
});
}
}
export class ReversiStreamManager extends StreamManager<ReversiStream> {
private me;
private os: MiOS;
constructor(os: MiOS, me) {
super();
this.me = me;
this.os = os;
}
public getConnection() {
if (this.connection == null) {
this.connection = new ReversiStream(this.os, this.me);
}
return this.connection;
}
}

View File

@ -1,34 +0,0 @@
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../../mios';
/**
* Global timeline stream connection
*/
export class GlobalTimelineStream extends Stream {
constructor(os: MiOS, me) {
super(os, 'global-timeline', {
i: me.token
});
}
}
export class GlobalTimelineStreamManager extends StreamManager<GlobalTimelineStream> {
private me;
private os: MiOS;
constructor(os: MiOS, me) {
super();
this.me = me;
this.os = os;
}
public getConnection() {
if (this.connection == null) {
this.connection = new GlobalTimelineStream(this.os, this.me);
}
return this.connection;
}
}

View File

@ -1,13 +0,0 @@
import Stream from './stream';
import MiOS from '../../../mios';
export class HashtagStream extends Stream {
constructor(os: MiOS, me, q) {
super(os, 'hashtag', me ? {
i: me.token,
q: JSON.stringify(q)
} : {
q: JSON.stringify(q)
});
}
}

View File

@ -1,126 +0,0 @@
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../../mios';
/**
* Home stream connection
*/
export class HomeStream extends Stream {
constructor(os: MiOS, me) {
super(os, '', {
i: me.token
});
// 最終利用日時を更新するため定期的にaliveメッセージを送信
setInterval(() => {
this.send({ type: 'alive' });
me.lastUsedAt = new Date();
}, 1000 * 60);
// 自分の情報が更新されたとき
this.on('meUpdated', i => {
if (os.debug) {
console.log('I updated:', i);
}
os.store.dispatch('mergeMe', i);
});
this.on('read_all_notifications', () => {
os.store.dispatch('mergeMe', {
hasUnreadNotification: false
});
});
this.on('unread_notification', () => {
os.store.dispatch('mergeMe', {
hasUnreadNotification: true
});
});
this.on('read_all_messaging_messages', () => {
os.store.dispatch('mergeMe', {
hasUnreadMessagingMessage: false
});
});
this.on('unread_messaging_message', () => {
os.store.dispatch('mergeMe', {
hasUnreadMessagingMessage: true
});
});
this.on('unreadMention', () => {
os.store.dispatch('mergeMe', {
hasUnreadMentions: true
});
});
this.on('readAllUnreadMentions', () => {
os.store.dispatch('mergeMe', {
hasUnreadMentions: false
});
});
this.on('unreadSpecifiedNote', () => {
os.store.dispatch('mergeMe', {
hasUnreadSpecifiedNotes: true
});
});
this.on('readAllUnreadSpecifiedNotes', () => {
os.store.dispatch('mergeMe', {
hasUnreadSpecifiedNotes: false
});
});
this.on('clientSettingUpdated', x => {
os.store.commit('settings/set', {
key: x.key,
value: x.value
});
});
this.on('home_updated', x => {
os.store.commit('settings/setHome', x);
});
this.on('mobile_home_updated', x => {
os.store.commit('settings/setMobileHome', x);
});
this.on('widgetUpdated', x => {
os.store.commit('settings/setWidget', {
id: x.id,
data: x.data
});
});
// トークンが再生成されたとき
// このままではMisskeyが利用できないので強制的にサインアウトさせる
this.on('my_token_regenerated', () => {
alert('%i18n:common.my-token-regenerated%');
os.signout();
});
}
}
export class HomeStreamManager extends StreamManager<HomeStream> {
private me;
private os: MiOS;
constructor(os: MiOS, me) {
super();
this.me = me;
this.os = os;
}
public getConnection() {
if (this.connection == null) {
this.connection = new HomeStream(this.os, this.me);
}
return this.connection;
}
}

View File

@ -1,34 +0,0 @@
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../../mios';
/**
* Hybrid timeline stream connection
*/
export class HybridTimelineStream extends Stream {
constructor(os: MiOS, me) {
super(os, 'hybrid-timeline', {
i: me.token
});
}
}
export class HybridTimelineStreamManager extends StreamManager<HybridTimelineStream> {
private me;
private os: MiOS;
constructor(os: MiOS, me) {
super();
this.me = me;
this.os = os;
}
public getConnection() {
if (this.connection == null) {
this.connection = new HybridTimelineStream(this.os, this.me);
}
return this.connection;
}
}

View File

@ -1,34 +0,0 @@
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../../mios';
/**
* Local timeline stream connection
*/
export class LocalTimelineStream extends Stream {
constructor(os: MiOS, me) {
super(os, 'local-timeline', me ? {
i: me.token
} : {});
}
}
export class LocalTimelineStreamManager extends StreamManager<LocalTimelineStream> {
private me;
private os: MiOS;
constructor(os: MiOS, me) {
super();
this.me = me;
this.os = os;
}
public getConnection() {
if (this.connection == null) {
this.connection = new LocalTimelineStream(this.os, this.me);
}
return this.connection;
}
}

View File

@ -1,34 +0,0 @@
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../../mios';
/**
* Messaging index stream connection
*/
export class MessagingIndexStream extends Stream {
constructor(os: MiOS, me) {
super(os, 'messaging-index', {
i: me.token
});
}
}
export class MessagingIndexStreamManager extends StreamManager<MessagingIndexStream> {
private me;
private os: MiOS;
constructor(os: MiOS, me) {
super();
this.me = me;
this.os = os;
}
public getConnection() {
if (this.connection == null) {
this.connection = new MessagingIndexStream(this.os, this.me);
}
return this.connection;
}
}

View File

@ -1,20 +0,0 @@
import Stream from './stream';
import MiOS from '../../../mios';
/**
* Messaging stream connection
*/
export class MessagingStream extends Stream {
constructor(os: MiOS, me, otherparty) {
super(os, 'messaging', {
i: me.token,
otherparty
});
(this as any).on('_connected_', () => {
this.send({
i: me.token
});
});
}
}

View File

@ -1,30 +0,0 @@
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../../mios';
/**
* Notes stats stream connection
*/
export class NotesStatsStream extends Stream {
constructor(os: MiOS) {
super(os, 'notes-stats');
}
}
export class NotesStatsStreamManager extends StreamManager<NotesStatsStream> {
private os: MiOS;
constructor(os: MiOS) {
super();
this.os = os;
}
public getConnection() {
if (this.connection == null) {
this.connection = new NotesStatsStream(this.os);
}
return this.connection;
}
}

View File

@ -1,30 +0,0 @@
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../../mios';
/**
* Server stats stream connection
*/
export class ServerStatsStream extends Stream {
constructor(os: MiOS) {
super(os, 'server-stats');
}
}
export class ServerStatsStreamManager extends StreamManager<ServerStatsStream> {
private os: MiOS;
constructor(os: MiOS) {
super();
this.os = os;
}
public getConnection() {
if (this.connection == null) {
this.connection = new ServerStatsStream(this.os);
}
return this.connection;
}
}

View File

@ -1,109 +0,0 @@
import { EventEmitter } from 'eventemitter3';
import * as uuid from 'uuid';
import Connection from './stream';
import { erase } from '../../../../../prelude/array';
/**
* ストリーム接続を管理するクラス
* 複数の場所から同じストリームを利用する際、接続をまとめたりする
*/
export default abstract class StreamManager<T extends Connection> extends EventEmitter {
private _connection: T = null;
private disposeTimerId: any;
/**
* コネクションを必要としているユーザー
*/
private users = [];
protected set connection(connection: T) {
this._connection = connection;
if (this._connection == null) {
this.emit('disconnected');
} else {
this.emit('connected', this._connection);
this._connection.on('_connected_', () => {
this.emit('_connected_');
});
this._connection.on('_disconnected_', () => {
this.emit('_disconnected_');
});
this._connection.user = 'Managed';
}
}
protected get connection() {
return this._connection;
}
/**
* コネクションを持っているか否か
*/
public get hasConnection() {
return this._connection != null;
}
public get state(): string {
if (!this.hasConnection) return 'no-connection';
return this._connection.state;
}
/**
* コネクションを要求します
*/
public abstract getConnection(): T;
/**
* 現在接続しているコネクションを取得します
*/
public borrow() {
return this._connection;
}
/**
* コネクションを要求するためのユーザーIDを発行します
*/
public use() {
// タイマー解除
if (this.disposeTimerId) {
clearTimeout(this.disposeTimerId);
this.disposeTimerId = null;
}
// ユーザーID生成
const userId = uuid();
this.users.push(userId);
this._connection.user = `Managed (${ this.users.length })`;
return userId;
}
/**
* コネクションを利用し終わってもう必要ないことを通知します
* @param userId use で発行したユーザーID
*/
public dispose(userId) {
this.users = erase(userId, this.users);
this._connection.user = `Managed (${ this.users.length })`;
// 誰もコネクションの利用者がいなくなったら
if (this.users.length == 0) {
// また直ぐに再利用される可能性があるので、一定時間待ち、
// 新たな利用者が現れなければコネクションを切断する
this.disposeTimerId = setTimeout(() => {
this.disposeTimerId = null;
this.connection.close();
this.connection = null;
}, 3000);
}
}
}

View File

@ -1,137 +0,0 @@
import { EventEmitter } from 'eventemitter3';
import * as uuid from 'uuid';
import * as ReconnectingWebsocket from 'reconnecting-websocket';
import { wsUrl } from '../../../config';
import MiOS from '../../../mios';
/**
* Misskey stream connection
*/
export default class Connection extends EventEmitter {
public state: string;
private buffer: any[];
public socket: ReconnectingWebsocket;
public name: string;
public connectedAt: Date;
public user: string = null;
public in: number = 0;
public out: number = 0;
public inout: Array<{
type: 'in' | 'out',
at: Date,
data: string
}> = [];
public id: string;
public isSuspended = false;
private os: MiOS;
constructor(os: MiOS, endpoint, params?) {
super();
//#region BIND
this.onOpen = this.onOpen.bind(this);
this.onClose = this.onClose.bind(this);
this.onMessage = this.onMessage.bind(this);
this.send = this.send.bind(this);
this.close = this.close.bind(this);
//#endregion
this.id = uuid();
this.os = os;
this.name = endpoint;
this.state = 'initializing';
this.buffer = [];
const query = params
? Object.keys(params)
.map(k => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`)
.join('&')
: null;
this.socket = new ReconnectingWebsocket(`${wsUrl}/${endpoint}${query ? `?${query}` : ''}`);
this.socket.addEventListener('open', this.onOpen);
this.socket.addEventListener('close', this.onClose);
this.socket.addEventListener('message', this.onMessage);
// Register this connection for debugging
this.os.registerStreamConnection(this);
}
/**
* Callback of when open connection
*/
private onOpen() {
this.state = 'connected';
this.emit('_connected_');
this.connectedAt = new Date();
// バッファーを処理
const _buffer = [].concat(this.buffer); // Shallow copy
this.buffer = []; // Clear buffer
_buffer.forEach(data => {
this.send(data); // Resend each buffered messages
if (this.os.debug) {
this.out++;
this.inout.push({ type: 'out', at: new Date(), data });
}
});
}
/**
* Callback of when close connection
*/
private onClose() {
this.state = 'reconnecting';
this.emit('_disconnected_');
}
/**
* Callback of when received a message from connection
*/
private onMessage(message) {
if (this.isSuspended) return;
if (this.os.debug) {
this.in++;
this.inout.push({ type: 'in', at: new Date(), data: message.data });
}
try {
const msg = JSON.parse(message.data);
if (msg.type) this.emit(msg.type, msg.body);
} catch (e) {
// noop
}
}
/**
* Send a message to connection
*/
public send(data) {
if (this.isSuspended) return;
// まだ接続が確立されていなかったらバッファリングして次に接続した時に送信する
if (this.state != 'connected') {
this.buffer.push(data);
return;
}
if (this.os.debug) {
this.out++;
this.inout.push({ type: 'out', at: new Date(), data });
}
this.socket.send(JSON.stringify(data));
}
/**
* Close this connection
*/
public close() {
this.os.unregisterStreamConnection(this);
this.socket.removeEventListener('open', this.onOpen);
this.socket.removeEventListener('message', this.onMessage);
}
}

View File

@ -1,17 +0,0 @@
import Stream from './stream';
import MiOS from '../../mios';
export class UserListStream extends Stream {
constructor(os: MiOS, me, listId) {
super(os, 'user-list', {
i: me.token,
listId
});
(this as any).on('_connected_', () => {
this.send({
i: me.token
});
});
}
}

View File

@ -186,9 +186,8 @@ export default Vue.extend({
if (this.game.isStarted && !this.game.isEnded) { if (this.game.isStarted && !this.game.isEnded) {
this.pollingClock = setInterval(() => { this.pollingClock = setInterval(() => {
const crc32 = CRC32.str(this.logs.map(x => x.pos.toString()).join('')); const crc32 = CRC32.str(this.logs.map(x => x.pos.toString()).join(''));
this.connection.send({ this.connection.send('check', {
type: 'check', crc32: crc32
crc32
}); });
}, 3000); }, 3000);
} }
@ -224,9 +223,8 @@ export default Vue.extend({
sound.play(); sound.play();
} }
this.connection.send({ this.connection.send('set', {
type: 'set', pos: pos
pos
}); });
this.checkEnd(); this.checkEnd();

View File

@ -9,7 +9,6 @@
import Vue from 'vue'; import Vue from 'vue';
import XGame from './reversi.game.vue'; import XGame from './reversi.game.vue';
import XRoom from './reversi.room.vue'; import XRoom from './reversi.room.vue';
import { ReversiGameStream } from '../../../../scripts/streaming/games/reversi/reversi-game';
export default Vue.extend({ export default Vue.extend({
components: { components: {
@ -34,12 +33,13 @@ export default Vue.extend({
}, },
created() { created() {
this.g = this.game; this.g = this.game;
this.connection = new ReversiGameStream((this as any).os, this.$store.state.i, this.game); this.connection = (this as any).os.stream.connectToChannel('gamesReversiGame', {
gameId: this.game.id
});
this.connection.on('started', this.onStarted); this.connection.on('started', this.onStarted);
}, },
beforeDestroy() { beforeDestroy() {
this.connection.off('started', this.onStarted); this.connection.dispose();
this.connection.close();
}, },
methods: { methods: {
onStarted(game) { onStarted(game) {

View File

@ -59,15 +59,13 @@ export default Vue.extend({
myGames: [], myGames: [],
matching: null, matching: null,
invitations: [], invitations: [],
connection: null, connection: null
connectionId: null
}; };
}, },
mounted() { mounted() {
if (this.$store.getters.isSignedIn) { if (this.$store.getters.isSignedIn) {
this.connection = (this as any).os.streams.reversiStream.getConnection(); this.connection = (this as any).os.stream.useSharedConnection('gamesReversi');
this.connectionId = (this as any).os.streams.reversiStream.use();
this.connection.on('invited', this.onInvited); this.connection.on('invited', this.onInvited);
@ -90,8 +88,7 @@ export default Vue.extend({
beforeDestroy() { beforeDestroy() {
if (this.connection) { if (this.connection) {
this.connection.off('invited', this.onInvited); this.connection.dispose();
(this as any).os.streams.reversiStream.dispose(this.connectionId);
} }
}, },

View File

@ -149,9 +149,9 @@ export default Vue.extend({
}, },
created() { created() {
this.connection.on('change-accepts', this.onChangeAccepts); this.connection.on('changeAccepts', this.onChangeAccepts);
this.connection.on('update-settings', this.onUpdateSettings); this.connection.on('updateSettings', this.onUpdateSettings);
this.connection.on('init-form', this.onInitForm); this.connection.on('initForm', this.onInitForm);
this.connection.on('message', this.onMessage); this.connection.on('message', this.onMessage);
if (this.game.user1Id != this.$store.state.i.id && this.game.settings.form1) this.form = this.game.settings.form1; if (this.game.user1Id != this.$store.state.i.id && this.game.settings.form1) this.form = this.game.settings.form1;
@ -159,9 +159,9 @@ export default Vue.extend({
}, },
beforeDestroy() { beforeDestroy() {
this.connection.off('change-accepts', this.onChangeAccepts); this.connection.off('changeAccepts', this.onChangeAccepts);
this.connection.off('update-settings', this.onUpdateSettings); this.connection.off('updateSettings', this.onUpdateSettings);
this.connection.off('init-form', this.onInitForm); this.connection.off('initForm', this.onInitForm);
this.connection.off('message', this.onMessage); this.connection.off('message', this.onMessage);
}, },
@ -171,15 +171,11 @@ export default Vue.extend({
}, },
accept() { accept() {
this.connection.send({ this.connection.send('accept', {});
type: 'accept'
});
}, },
cancel() { cancel() {
this.connection.send({ this.connection.send('cancelAccept', {});
type: 'cancel-accept'
});
}, },
onChangeAccepts(accepts) { onChangeAccepts(accepts) {
@ -189,8 +185,7 @@ export default Vue.extend({
}, },
updateSettings() { updateSettings() {
this.connection.send({ this.connection.send('updateSettings', {
type: 'update-settings',
settings: this.game.settings settings: this.game.settings
}); });
}, },
@ -216,8 +211,7 @@ export default Vue.extend({
}, },
onChangeForm(item) { onChangeForm(item) {
this.connection.send({ this.connection.send('updateForm', {
type: 'update-form',
id: item.id, id: item.id,
value: item.value value: item.value
}); });
@ -238,9 +232,9 @@ export default Vue.extend({
const y = Math.floor(pos / this.game.settings.map[0].length); const y = Math.floor(pos / this.game.settings.map[0].length);
const newPixel = const newPixel =
pixel == ' ' ? '-' : pixel == ' ' ? '-' :
pixel == '-' ? 'b' : pixel == '-' ? 'b' :
pixel == 'b' ? 'w' : pixel == 'b' ? 'w' :
' '; ' ';
const line = this.game.settings.map[y].split(''); const line = this.game.settings.map[y].split('');
line[x] = newPixel; line[x] = newPixel;
this.$set(this.game.settings.map, y, line.join('')); this.$set(this.game.settings.map, y, line.join(''));

View File

@ -47,7 +47,6 @@ export default Vue.extend({
game: null, game: null,
matching: null, matching: null,
connection: null, connection: null,
connectionId: null,
pingClock: null pingClock: null
}; };
}, },
@ -66,15 +65,13 @@ export default Vue.extend({
this.fetch(); this.fetch();
if (this.$store.getters.isSignedIn) { if (this.$store.getters.isSignedIn) {
this.connection = (this as any).os.streams.reversiStream.getConnection(); this.connection = (this as any).os.stream.useSharedConnection('gamesReversi');
this.connectionId = (this as any).os.streams.reversiStream.use();
this.connection.on('matched', this.onMatched); this.connection.on('matched', this.onMatched);
this.pingClock = setInterval(() => { this.pingClock = setInterval(() => {
if (this.matching) { if (this.matching) {
this.connection.send({ this.connection.send('ping', {
type: 'ping',
id: this.matching.id id: this.matching.id
}); });
} }
@ -84,9 +81,7 @@ export default Vue.extend({
beforeDestroy() { beforeDestroy() {
if (this.connection) { if (this.connection) {
this.connection.off('matched', this.onMatched); this.connection.dispose();
(this as any).os.streams.reversiStream.dispose(this.connectionId);
clearInterval(this.pingClock); clearInterval(this.pingClock);
} }
}, },

View File

@ -1,5 +1,7 @@
import Vue from 'vue'; import Vue from 'vue';
import profileEditor from './profile-editor.vue';
import noteSkeleton from './note-skeleton.vue';
import theme from './theme.vue'; import theme from './theme.vue';
import instance from './instance.vue'; import instance from './instance.vue';
import cwButton from './cw-button.vue'; import cwButton from './cw-button.vue';
@ -44,6 +46,8 @@ import uiSelect from './ui/select.vue';
import formButton from './ui/form/button.vue'; import formButton from './ui/form/button.vue';
import formRadio from './ui/form/radio.vue'; import formRadio from './ui/form/radio.vue';
Vue.component('mk-profile-editor', profileEditor);
Vue.component('mk-note-skeleton', noteSkeleton);
Vue.component('mk-theme', theme); Vue.component('mk-theme', theme);
Vue.component('mk-instance', instance); Vue.component('mk-instance', instance);
Vue.component('mk-cw-button', cwButton); Vue.component('mk-cw-button', cwButton);

View File

@ -30,7 +30,6 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { MessagingStream } from '../../scripts/streaming/messaging';
import XMessage from './messaging-room.message.vue'; import XMessage from './messaging-room.message.vue';
import XForm from './messaging-room.form.vue'; import XForm from './messaging-room.form.vue';
import { url } from '../../../config'; import { url } from '../../../config';
@ -72,7 +71,7 @@ export default Vue.extend({
}, },
mounted() { mounted() {
this.connection = new MessagingStream((this as any).os, this.$store.state.i, this.user.id); this.connection = (this as any).os.stream.connectToChannel('messaging', { otherparty: this.user.id });
this.connection.on('message', this.onMessage); this.connection.on('message', this.onMessage);
this.connection.on('read', this.onRead); this.connection.on('read', this.onRead);
@ -92,9 +91,7 @@ export default Vue.extend({
}, },
beforeDestroy() { beforeDestroy() {
this.connection.off('message', this.onMessage); this.connection.dispose();
this.connection.off('read', this.onRead);
this.connection.close();
if (this.isNaked) { if (this.isNaked) {
window.removeEventListener('scroll', this.onScroll); window.removeEventListener('scroll', this.onScroll);
@ -177,8 +174,7 @@ export default Vue.extend({
this.messages.push(message); this.messages.push(message);
if (message.userId != this.$store.state.i.id && !document.hidden) { if (message.userId != this.$store.state.i.id && !document.hidden) {
this.connection.send({ this.connection.send('read', {
type: 'read',
id: message.id id: message.id
}); });
} }
@ -250,8 +246,7 @@ export default Vue.extend({
if (document.hidden) return; if (document.hidden) return;
this.messages.forEach(message => { this.messages.forEach(message => {
if (message.userId !== this.$store.state.i.id && !message.isRead) { if (message.userId !== this.$store.state.i.id && !message.isRead) {
this.connection.send({ this.connection.send('read', {
type: 'read',
id: message.id id: message.id
}); });
} }
@ -359,7 +354,7 @@ export default Vue.extend({
max-width 600px max-width 600px
margin 0 auto margin 0 auto
padding 0 padding 0
//background rgba(var(--face), 0.95) background var(--messagingRoomBg)
background-clip content-box background-clip content-box
> .new-message > .new-message

View File

@ -71,13 +71,11 @@ export default Vue.extend({
messages: [], messages: [],
q: null, q: null,
result: [], result: [],
connection: null, connection: null
connectionId: null
}; };
}, },
mounted() { mounted() {
this.connection = (this as any).os.streams.messagingIndexStream.getConnection(); this.connection = (this as any).os.stream.useSharedConnection('messagingIndex');
this.connectionId = (this as any).os.streams.messagingIndexStream.use();
this.connection.on('message', this.onMessage); this.connection.on('message', this.onMessage);
this.connection.on('read', this.onRead); this.connection.on('read', this.onRead);
@ -88,9 +86,7 @@ export default Vue.extend({
}); });
}, },
beforeDestroy() { beforeDestroy() {
this.connection.off('message', this.onMessage); this.connection.dispose();
this.connection.off('read', this.onRead);
(this as any).os.streams.messagingIndexStream.dispose(this.connectionId);
}, },
methods: { methods: {
getAcct, getAcct,

View File

@ -95,7 +95,8 @@ export default Vue.component('misskey-flavored-markdown', {
return [createElement(MkUrl, { return [createElement(MkUrl, {
props: { props: {
url: token.content, url: token.content,
target: '_blank' target: '_blank',
style: 'color:var(--mfmLink);'
} }
})]; })];
} }
@ -106,7 +107,8 @@ export default Vue.component('misskey-flavored-markdown', {
class: 'link', class: 'link',
href: token.url, href: token.url,
target: '_blank', target: '_blank',
title: token.url title: token.url,
style: 'color:var(--mfmLink);'
} }
}, token.title)]; }, token.title)];
} }
@ -114,22 +116,24 @@ export default Vue.component('misskey-flavored-markdown', {
case 'mention': { case 'mention': {
return (createElement as any)('a', { return (createElement as any)('a', {
attrs: { attrs: {
href: `${url}/@${getAcct(token)}`, href: `${url}/${token.canonical}`,
target: '_blank', target: '_blank',
dataIsMe: (this as any).i && getAcct((this as any).i) == getAcct(token) dataIsMe: (this as any).i && getAcct((this as any).i) == getAcct(token),
style: 'color:var(--mfmMention);'
}, },
directives: [{ directives: [{
name: 'user-preview', name: 'user-preview',
value: token.content value: token.canonical
}] }]
}, token.content); }, token.canonical);
} }
case 'hashtag': { case 'hashtag': {
return [createElement('a', { return [createElement('a', {
attrs: { attrs: {
href: `${url}/tags/${encodeURIComponent(token.hashtag)}`, href: `${url}/tags/${encodeURIComponent(token.hashtag)}`,
target: '_blank' target: '_blank',
style: 'color:var(--mfmHashtag);'
} }
}, token.content)]; }, token.content)];
} }

View File

@ -8,6 +8,7 @@
import Vue from 'vue'; import Vue from 'vue';
import { url } from '../../../config'; import { url } from '../../../config';
import copyToClipboard from '../../../common/scripts/copy-to-clipboard'; import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
import Ok from './ok.vue';
export default Vue.extend({ export default Vue.extend({
props: ['note', 'source', 'compact'], props: ['note', 'source', 'compact'],
@ -21,12 +22,34 @@ export default Vue.extend({
icon: '%fa:link%', icon: '%fa:link%',
text: '%i18n:@copy-link%', text: '%i18n:@copy-link%',
action: this.copyLink action: this.copyLink
}, null, {
icon: '%fa:star%',
text: '%i18n:@favorite%',
action: this.favorite
}]; }];
if (this.note.uri) {
items.push({
icon: '%fa:external-link-square-alt%',
text: '%i18n:@remote%',
action: () => {
window.open(this.note.uri, '_blank');
}
});
}
items.push(null);
if (this.note.isFavorited) {
items.push({
icon: '%fa:star%',
text: '%i18n:@unfavorite%',
action: this.unfavorite
});
} else {
items.push({
icon: '%fa:star%',
text: '%i18n:@favorite%',
action: this.favorite
});
}
if (this.note.userId == this.$store.state.i.id) { if (this.note.userId == this.$store.state.i.id) {
if ((this.$store.state.i.pinnedNoteIds || []).includes(this.note.id)) { if ((this.$store.state.i.pinnedNoteIds || []).includes(this.note.id)) {
items.push({ items.push({
@ -44,6 +67,7 @@ export default Vue.extend({
} }
if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) { if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) {
items.push(null);
items.push({ items.push({
icon: '%fa:trash-alt R%', icon: '%fa:trash-alt R%',
text: '%i18n:@delete%', text: '%i18n:@delete%',
@ -51,16 +75,6 @@ export default Vue.extend({
}); });
} }
if (this.note.uri) {
items.push({
icon: '%fa:external-link-square-alt%',
text: '%i18n:@remote%',
action: () => {
window.open(this.note.uri, '_blank');
}
});
}
return items; return items;
} }
}, },
@ -78,6 +92,7 @@ export default Vue.extend({
(this as any).api('i/pin', { (this as any).api('i/pin', {
noteId: this.note.id noteId: this.note.id
}).then(() => { }).then(() => {
(this as any).os.new(Ok);
this.destroyDom(); this.destroyDom();
}); });
}, },
@ -103,6 +118,16 @@ export default Vue.extend({
(this as any).api('notes/favorites/create', { (this as any).api('notes/favorites/create', {
noteId: this.note.id noteId: this.note.id
}).then(() => { }).then(() => {
(this as any).os.new(Ok);
this.destroyDom();
});
},
unfavorite() {
(this as any).api('notes/favorites/delete', {
noteId: this.note.id
}).then(() => {
(this as any).os.new(Ok);
this.destroyDom(); this.destroyDom();
}); });
}, },

View File

@ -0,0 +1,52 @@
<template>
<div>
<vue-content-loading v-if="width" :width="width" :height="100" :primary="primary" :secondary="secondary">
<circle cx="30" cy="30" r="30" />
<rect x="75" y="13" rx="4" ry="4" :width="150 + r1" height="15" />
<rect x="75" y="39" rx="4" ry="4" :width="260 + r2" height="10" />
<rect x="75" y="59" rx="4" ry="4" :width="230 + r3" height="10" />
</vue-content-loading>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import VueContentLoading from 'vue-content-loading';
import * as tinycolor from 'tinycolor2';
export default Vue.extend({
components: {
VueContentLoading,
},
data() {
return {
width: 0,
r1: (Math.random() * 100) - 50,
r2: (Math.random() * 100) - 50,
r3: (Math.random() * 100) - 50
};
},
computed: {
text(): tinycolor.Instance {
const text = tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text'));
return text;
},
primary(): string {
return '#' + this.text.clone().toHex();
},
secondary(): string {
return '#' + this.text.clone().darken(20).toHex();
}
},
mounted() {
let width = this.$el.clientWidth;
if (width < 400) width = 400;
this.width = width;
}
});
</script>

View File

@ -0,0 +1,175 @@
<template>
<div class="yvbkymdqeusiqucuuloahhiqflzinufs">
<div class="bg" ref="bg"></div>
<div class="body" ref="body">
<div class="icon">
<div class="circle left"></div>
<span class="check tip"></span>
<span class="check long"></span>
<div class="ring"></div>
<div class="fix"></div>
<div class="circle right"></div>
</div>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import * as anime from 'animejs';
export default Vue.extend({
mounted() {
this.$nextTick(() => {
anime({
targets: this.$refs.bg,
opacity: 1,
duration: 300,
easing: 'linear'
});
anime({
targets: this.$refs.body,
opacity: 1,
scale: [1.2, 1],
duration: 300,
easing: [0, 0.5, 0.5, 1]
});
});
setTimeout(() => {
anime({
targets: this.$refs.bg,
opacity: 0,
duration: 300,
easing: 'linear'
});
anime({
targets: this.$refs.body,
opacity: 0,
scale: 0.8,
duration: 300,
easing: [0.5, 0, 1, 0.5],
complete: () => this.destroyDom()
});
}, 1250);
}
});
</script>
<style lang="stylus" scoped>
.yvbkymdqeusiqucuuloahhiqflzinufs
pointer-events none
> .bg
display block
position fixed
z-index 10000
top 0
left 0
width 100%
height 100%
background rgba(#000, 0.7)
opacity 0
> .body
position fixed
z-index 10000
top 0
right 0
left 0
bottom 0
margin auto
width 150px
height 150px
background var(--face)
border-radius 8px
opacity 0
> .icon
display flex
justify-content center
position absolute
top 0
right 0
left 0
bottom 0
width 5em
height 5em
margin auto
border .25em solid transparent
border-radius 50%
line-height 5em
cursor default
box-sizing content-box
user-select none
zoom normal
border-color #a5dc86
> .circle
position absolute
width 3.75em
height 7.5em
transform rotate(45deg)
border-radius 50%
background var(--face)
&.left
top -.4375em
left -2.0635em
transform rotate(-45deg)
transform-origin 3.75em 3.75em
border-radius 7.5em 0 0 7.5em
&.right
top -.6875em
left 1.875em
transform rotate(-45deg)
transform-origin 0 3.75em
border-radius 0 7.5em 7.5em 0
animation swal2-rotate-success-circular-line 4.25s ease-in
> .check
display block
position absolute
height .3125em
border-radius .125em
background-color #a5dc86
z-index 2
&.tip
top 2.875em
left .875em
width 1.5625em
transform rotate(45deg)
animation swal2-animate-success-line-tip .75s
&.long
top 2.375em
right .5em
width 2.9375em
transform rotate(-45deg)
animation swal2-animate-success-line-long .75s
> .fix
position absolute
top .5em
left 1.625em
width .4375em
height 5.625em
transform rotate(-45deg)
z-index 1
background var(--face)
> .ring
position absolute
top -.25em
left -.25em
width 100%
height 100%
border .25em solid rgba(165,220,134,.3)
border-radius 50%
z-index 2
box-sizing content-box
</style>

View File

@ -49,6 +49,7 @@
<div> <div>
<ui-switch v-model="isCat" @change="save(false)">%i18n:@is-cat%</ui-switch> <ui-switch v-model="isCat" @change="save(false)">%i18n:@is-cat%</ui-switch>
<ui-switch v-model="isBot" @change="save(false)">%i18n:@is-bot%</ui-switch>
<ui-switch v-model="alwaysMarkNsfw">%i18n:common.always-mark-nsfw%</ui-switch> <ui-switch v-model="alwaysMarkNsfw">%i18n:common.always-mark-nsfw%</ui-switch>
</div> </div>
</section> </section>
@ -58,6 +59,7 @@
<div> <div>
<ui-switch v-model="isLocked" @change="save(false)">%i18n:@is-locked%</ui-switch> <ui-switch v-model="isLocked" @change="save(false)">%i18n:@is-locked%</ui-switch>
<ui-switch v-model="carefulBot" @change="save(false)">%i18n:@careful-bot%</ui-switch>
</div> </div>
</section> </section>
</ui-card> </ui-card>
@ -65,7 +67,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { apiUrl, host } from '../../../../config'; import { apiUrl, host } from '../../../config';
export default Vue.extend({ export default Vue.extend({
data() { data() {
@ -79,7 +81,9 @@ export default Vue.extend({
avatarId: null, avatarId: null,
bannerId: null, bannerId: null,
isCat: false, isCat: false,
isBot: false,
isLocked: false, isLocked: false,
carefulBot: false,
saving: false, saving: false,
avatarUploading: false, avatarUploading: false,
bannerUploading: false bannerUploading: false
@ -102,7 +106,9 @@ export default Vue.extend({
this.avatarId = this.$store.state.i.avatarId; this.avatarId = this.$store.state.i.avatarId;
this.bannerId = this.$store.state.i.bannerId; this.bannerId = this.$store.state.i.bannerId;
this.isCat = this.$store.state.i.isCat; this.isCat = this.$store.state.i.isCat;
this.isBot = this.$store.state.i.isBot;
this.isLocked = this.$store.state.i.isLocked; this.isLocked = this.$store.state.i.isLocked;
this.carefulBot = this.$store.state.i.carefulBot;
}, },
methods: { methods: {
@ -161,7 +167,9 @@ export default Vue.extend({
avatarId: this.avatarId, avatarId: this.avatarId,
bannerId: this.bannerId, bannerId: this.bannerId,
isCat: this.isCat, isCat: this.isCat,
isLocked: this.isLocked isBot: this.isBot,
isLocked: this.isLocked,
carefulBot: this.carefulBot
}).then(i => { }).then(i => {
this.saving = false; this.saving = false;
this.$store.state.i.avatarId = i.avatarId; this.$store.state.i.avatarId = i.avatarId;
@ -170,7 +178,10 @@ export default Vue.extend({
this.$store.state.i.bannerUrl = i.bannerUrl; this.$store.state.i.bannerUrl = i.bannerUrl;
if (notify) { if (notify) {
alert('%i18n:@saved%'); this.$swal({
type: 'success',
text: '%i18n:@saved%'
});
} }
}); });
} }

View File

@ -1,16 +1,16 @@
<template> <template>
<div class="mk-reactions-viewer"> <div class="mk-reactions-viewer">
<template v-if="reactions"> <template v-if="reactions">
<span :class="{notReacted}" @click="react('like')" v-if="reactions.like"><mk-reaction-icon reaction="like"/><span>{{ reactions.like }}</span></span> <span :class="{ reacted: note.myReaction == 'like' }" @click="react('like')" v-if="reactions.like"><mk-reaction-icon reaction="like"/><span>{{ reactions.like }}</span></span>
<span :class="{notReacted}" @click="react('love')" v-if="reactions.love"><mk-reaction-icon reaction="love"/><span>{{ reactions.love }}</span></span> <span :class="{ reacted: note.myReaction == 'love' }" @click="react('love')" v-if="reactions.love"><mk-reaction-icon reaction="love"/><span>{{ reactions.love }}</span></span>
<span :class="{notReacted}" @click="react('laugh')" v-if="reactions.laugh"><mk-reaction-icon reaction="laugh"/><span>{{ reactions.laugh }}</span></span> <span :class="{ reacted: note.myReaction == 'laugh' }" @click="react('laugh')" v-if="reactions.laugh"><mk-reaction-icon reaction="laugh"/><span>{{ reactions.laugh }}</span></span>
<span :class="{notReacted}" @click="react('hmm')" v-if="reactions.hmm"><mk-reaction-icon reaction="hmm"/><span>{{ reactions.hmm }}</span></span> <span :class="{ reacted: note.myReaction == 'hmm' }" @click="react('hmm')" v-if="reactions.hmm"><mk-reaction-icon reaction="hmm"/><span>{{ reactions.hmm }}</span></span>
<span :class="{notReacted}" @click="react('surprise')" v-if="reactions.surprise"><mk-reaction-icon reaction="surprise"/><span>{{ reactions.surprise }}</span></span> <span :class="{ reacted: note.myReaction == 'surprise' }" @click="react('surprise')" v-if="reactions.surprise"><mk-reaction-icon reaction="surprise"/><span>{{ reactions.surprise }}</span></span>
<span :class="{notReacted}" @click="react('congrats')" v-if="reactions.congrats"><mk-reaction-icon reaction="congrats"/><span>{{ reactions.congrats }}</span></span> <span :class="{ reacted: note.myReaction == 'congrats' }" @click="react('congrats')" v-if="reactions.congrats"><mk-reaction-icon reaction="congrats"/><span>{{ reactions.congrats }}</span></span>
<span :class="{notReacted}" @click="react('angry')" v-if="reactions.angry"><mk-reaction-icon reaction="angry"/><span>{{ reactions.angry }}</span></span> <span :class="{ reacted: note.myReaction == 'angry' }" @click="react('angry')" v-if="reactions.angry"><mk-reaction-icon reaction="angry"/><span>{{ reactions.angry }}</span></span>
<span :class="{notReacted}" @click="react('confused')" v-if="reactions.confused"><mk-reaction-icon reaction="confused"/><span>{{ reactions.confused }}</span></span> <span :class="{ reacted: note.myReaction == 'confused' }" @click="react('confused')" v-if="reactions.confused"><mk-reaction-icon reaction="confused"/><span>{{ reactions.confused }}</span></span>
<span :class="{notReacted}" @click="react('rip')" v-if="reactions.rip"><mk-reaction-icon reaction="rip"/><span>{{ reactions.rip }}</span></span> <span :class="{ reacted: note.myReaction == 'rip' }" @click="react('rip')" v-if="reactions.rip"><mk-reaction-icon reaction="rip"/><span>{{ reactions.rip }}</span></span>
<span :class="{notReacted}" @click="react('pudding')" v-if="reactions.pudding"><mk-reaction-icon reaction="pudding"/><span>{{ reactions.pudding }}</span></span> <span :class="{ reacted: note.myReaction == 'pudding' }" @click="react('pudding')" v-if="reactions.pudding"><mk-reaction-icon reaction="pudding"/><span>{{ reactions.pudding }}</span></span>
</template> </template>
</div> </div>
</template> </template>
@ -22,9 +22,6 @@ export default Vue.extend({
computed: { computed: {
reactions(): number { reactions(): number {
return this.note.reactionCounts; return this.note.reactionCounts;
},
notReacted(): boolean {
return this.note.myReaction == null;
} }
}, },
methods: { methods: {
@ -40,25 +37,42 @@ export default Vue.extend({
<style lang="stylus" scoped> <style lang="stylus" scoped>
.mk-reactions-viewer .mk-reactions-viewer
border-top dashed 1px var(--reactionViewerBorder) margin 6px 0
border-bottom dashed 1px var(--reactionViewerBorder)
margin 4px 0
&:empty &:empty
display none display none
> span > span
margin-right 8px display inline-block
height 32px
margin-right 6px
padding 0 6px
border-radius 4px
&.notReacted *
user-select none
pointer-events none
&.reacted
background var(--primary)
> span
color var(--primaryForeground)
&:not(.reacted)
cursor pointer cursor pointer
background var(--reactionViewerButtonBg)
&:hover
background var(--reactionViewerButtonHoverBg)
> .mk-reaction-icon > .mk-reaction-icon
font-size 1.4em font-size 1.4em
> span > span
margin-left 4px font-size 1.1em
font-size 1.2em line-height 32px
vertical-align middle
color var(--text) color var(--text)
</style> </style>

View File

@ -56,7 +56,7 @@ export default Vue.extend({
username: this.username, username: this.username,
password: this.password, password: this.password,
token: this.user && this.user.twoFactorEnabled ? this.token : undefined token: this.user && this.user.twoFactorEnabled ? this.token : undefined
}).then(() => { }, true).then(() => {
location.reload(); location.reload();
}).catch(() => { }).catch(() => {
alert('%i18n:@login-failed%'); alert('%i18n:@login-failed%');

View File

@ -131,11 +131,11 @@ export default Vue.extend({
password: this.password, password: this.password,
invitationCode: this.invitationCode, invitationCode: this.invitationCode,
'g-recaptcha-response': this.meta.recaptchaSitekey != null ? (window as any).grecaptcha.getResponse() : null 'g-recaptcha-response': this.meta.recaptchaSitekey != null ? (window as any).grecaptcha.getResponse() : null
}).then(() => { }, true).then(() => {
(this as any).api('signin', { (this as any).api('signin', {
username: this.username, username: this.username,
password: this.password password: this.password
}).then(() => { }, true).then(() => {
location.href = '/'; location.href = '/';
}); });
}).catch(() => { }).catch(() => {

View File

@ -1,14 +1,14 @@
<template> <template>
<div class="mk-stream-indicator"> <div class="mk-stream-indicator">
<p v-if=" stream.state == 'initializing' "> <p v-if="stream.state == 'initializing'">
%fa:spinner .pulse% %fa:spinner .pulse%
<span>%i18n:@connecting%<mk-ellipsis/></span> <span>%i18n:@connecting%<mk-ellipsis/></span>
</p> </p>
<p v-if=" stream.state == 'reconnecting' "> <p v-if="stream.state == 'reconnecting'">
%fa:spinner .pulse% %fa:spinner .pulse%
<span>%i18n:@reconnecting%<mk-ellipsis/></span> <span>%i18n:@reconnecting%<mk-ellipsis/></span>
</p> </p>
<p v-if=" stream.state == 'connected' "> <p v-if="stream.state == 'connected'">
%fa:check% %fa:check%
<span>%i18n:@connected%</span> <span>%i18n:@connected%</span>
</p> </p>

View File

@ -3,19 +3,29 @@
<label> <label>
<span>%i18n:@light-theme%</span> <span>%i18n:@light-theme%</span>
<ui-select v-model="light" placeholder="%i18n:@light-theme%"> <ui-select v-model="light" placeholder="%i18n:@light-theme%">
<option v-for="x in themes" :value="x.meta.id" :key="x.meta.id">{{ x.meta.name }}</option> <optgroup label="%i18n:@light-themes%">
<option v-for="x in lightThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
</optgroup>
<optgroup label="%i18n:@dark-themes%">
<option v-for="x in darkThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
</optgroup>
</ui-select> </ui-select>
</label> </label>
<label> <label>
<span>%i18n:@dark-theme%</span> <span>%i18n:@dark-theme%</span>
<ui-select v-model="dark" placeholder="%i18n:@dark-theme%"> <ui-select v-model="dark" placeholder="%i18n:@dark-theme%">
<option v-for="x in themes" :value="x.meta.id" :key="x.meta.id">{{ x.meta.name }}</option> <optgroup label="%i18n:@dark-themes%">
<option v-for="x in darkThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
</optgroup>
<optgroup label="%i18n:@light-themes%">
<option v-for="x in lightThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
</optgroup>
</ui-select> </ui-select>
</label> </label>
<details class="creator"> <details class="creator">
<summary>%i18n:@create-a-theme%</summary> <summary>%fa:palette% %i18n:@create-a-theme%</summary>
<div> <div>
<span>%i18n:@base-theme%:</span> <span>%i18n:@base-theme%:</span>
<ui-radio v-model="myThemeBase" value="light">%i18n:@base-theme-light%</ui-radio> <ui-radio v-model="myThemeBase" value="light">%i18n:@base-theme-light%</ui-radio>
@ -25,6 +35,9 @@
<ui-input v-model="myThemeName"> <ui-input v-model="myThemeName">
<span>%i18n:@theme-name%</span> <span>%i18n:@theme-name%</span>
</ui-input> </ui-input>
<ui-textarea v-model="myThemeDesc">
<span>%i18n:@desc%</span>
</ui-textarea>
</div> </div>
<div> <div>
<div style="padding-bottom:8px;">%i18n:@primary-color%:</div> <div style="padding-bottom:8px;">%i18n:@primary-color%:</div>
@ -38,37 +51,72 @@
<div style="padding-bottom:8px;">%i18n:@text-color%:</div> <div style="padding-bottom:8px;">%i18n:@text-color%:</div>
<color-picker v-model="myThemeText"/> <color-picker v-model="myThemeText"/>
</div> </div>
<ui-button @click="preview()">%i18n:@preview-created-theme%</ui-button> <ui-button @click="preview()">%fa:eye% %i18n:@preview-created-theme%</ui-button>
<ui-button primary @click="gen()">%i18n:@save-created-theme%</ui-button> <ui-button primary @click="gen()">%fa:save R% %i18n:@save-created-theme%</ui-button>
</details> </details>
<details> <details>
<summary>%i18n:@install-a-theme%</summary> <summary>%fa:download% %i18n:@install-a-theme%</summary>
<ui-button @click="import_()">%fa:file-import% %i18n:@import%</ui-button>
<input ref="file" type="file" accept=".misskeytheme" style="display:none;" @change="onUpdateImportFile"/>
<p>%i18n:@import-by-code%:</p>
<ui-textarea v-model="installThemeCode"> <ui-textarea v-model="installThemeCode">
<span>%i18n:@theme-code%</span> <span>%i18n:@theme-code%</span>
</ui-textarea> </ui-textarea>
<ui-button @click="install()">%i18n:@install%</ui-button> <ui-button @click="() => install(this.installThemeCode)">%fa:check% %i18n:@install%</ui-button>
</details> </details>
<details> <details>
<summary>%i18n:@installed-themes%</summary> <summary>%fa:folder-open% %i18n:@manage-themes%</summary>
<ui-select v-model="selectedInstalledTheme" placeholder="%i18n:@select-theme%"> <ui-select v-model="selectedThemeId" placeholder="%i18n:@select-theme%">
<option v-for="x in installedThemes" :value="x.meta.id" :key="x.meta.id">{{ x.meta.name }}</option> <optgroup label="%i18n:@builtin-themes%">
<option v-for="x in builtinThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
</optgroup>
<optgroup label="%i18n:@my-themes%">
<option v-for="x in installedThemes.filter(t => t.author == this.$store.state.i.username)" :value="x.id" :key="x.id">{{ x.name }}</option>
</optgroup>
<optgroup label="%i18n:@installed-themes%">
<option v-for="x in installedThemes.filter(t => t.author != this.$store.state.i.username)" :value="x.id" :key="x.id">{{ x.name }}</option>
</optgroup>
</ui-select> </ui-select>
<ui-textarea readonly :value="selectedInstalledThemeCode"> <template v-if="selectedTheme">
<span>%i18n:@theme-code%</span> <ui-input readonly :value="selectedTheme.author">
</ui-textarea> <span>%i18n:@author%</span>
<ui-button @click="uninstall()">%i18n:@uninstall%</ui-button> </ui-input>
<ui-textarea v-if="selectedTheme.desc" readonly :value="selectedTheme.desc">
<span>%i18n:@desc%</span>
</ui-textarea>
<ui-textarea readonly :value="selectedThemeCode">
<span>%i18n:@theme-code%</span>
</ui-textarea>
<ui-button @click="export_()" link :download="`${selectedTheme.name}.misskeytheme`" ref="export">%fa:box% %i18n:@export%</ui-button>
<ui-button @click="uninstall()" v-if="!builtinThemes.some(t => t.id == selectedTheme.id)">%fa:trash-alt R% %i18n:@uninstall%</ui-button>
</template>
</details> </details>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { lightTheme, darkTheme, builtinThemes, applyTheme } from '../../../theme'; import { lightTheme, darkTheme, builtinThemes, applyTheme, Theme } from '../../../theme';
import { Chrome } from 'vue-color'; import { Chrome } from 'vue-color';
import * as uuid from 'uuid'; import * as uuid from 'uuid';
import * as tinycolor from 'tinycolor2'; import * as tinycolor from 'tinycolor2';
import * as JSON5 from 'json5';
// 後方互換性のため
function convertOldThemedefinition(t) {
const t2 = {
id: t.meta.id,
name: t.meta.name,
author: t.meta.author,
base: t.meta.base,
vars: t.meta.vars,
props: t
};
delete t2.props.meta;
return t2;
}
export default Vue.extend({ export default Vue.extend({
components: { components: {
@ -77,22 +125,32 @@ export default Vue.extend({
data() { data() {
return { return {
builtinThemes: builtinThemes,
installThemeCode: null, installThemeCode: null,
selectedInstalledTheme: null, selectedThemeId: null,
myThemeBase: 'light', myThemeBase: 'light',
myThemeName: '', myThemeName: '',
myThemePrimary: lightTheme.meta.vars.primary, myThemeDesc: '',
myThemeSecondary: lightTheme.meta.vars.secondary, myThemePrimary: lightTheme.vars.primary,
myThemeText: lightTheme.meta.vars.text myThemeSecondary: lightTheme.vars.secondary,
myThemeText: lightTheme.vars.text
}; };
}, },
computed: { computed: {
themes(): any { themes(): Theme[] {
return this.$store.state.device.themes.concat(builtinThemes); return builtinThemes.concat(this.$store.state.device.themes);
}, },
installedThemes(): any { darkThemes(): Theme[] {
return this.themes.filter(t => t.base == 'dark' || t.kind == 'dark');
},
lightThemes(): Theme[] {
return this.themes.filter(t => t.base == 'light' || t.kind == 'light');
},
installedThemes(): Theme[] {
return this.$store.state.device.themes; return this.$store.state.device.themes;
}, },
@ -106,22 +164,26 @@ export default Vue.extend({
set(value) { this.$store.commit('device/set', { key: 'darkTheme', value }); } set(value) { this.$store.commit('device/set', { key: 'darkTheme', value }); }
}, },
selectedInstalledThemeCode() { selectedTheme() {
if (this.selectedInstalledTheme == null) return null; if (this.selectedThemeId == null) return null;
return JSON.stringify(this.installedThemes.find(x => x.meta.id == this.selectedInstalledTheme)); return this.themes.find(x => x.id == this.selectedThemeId);
},
selectedThemeCode() {
if (this.selectedTheme == null) return null;
return JSON5.stringify(this.selectedTheme, null, '\t');
}, },
myTheme(): any { myTheme(): any {
return { return {
meta: { name: this.myThemeName,
name: this.myThemeName, author: this.$store.state.i.username,
author: this.$store.state.i.name, desc: this.myThemeDesc,
base: this.myThemeBase, base: this.myThemeBase,
vars: { vars: {
primary: tinycolor(typeof this.myThemePrimary == 'string' ? this.myThemePrimary : this.myThemePrimary.rgba).toRgbString(), primary: tinycolor(typeof this.myThemePrimary == 'string' ? this.myThemePrimary : this.myThemePrimary.rgba).toRgbString(),
secondary: tinycolor(typeof this.myThemeSecondary == 'string' ? this.myThemeSecondary : this.myThemeSecondary.rgba).toRgbString(), secondary: tinycolor(typeof this.myThemeSecondary == 'string' ? this.myThemeSecondary : this.myThemeSecondary.rgba).toRgbString(),
text: tinycolor(typeof this.myThemeText == 'string' ? this.myThemeText : this.myThemeText.rgba).toRgbString() text: tinycolor(typeof this.myThemeText == 'string' ? this.myThemeText : this.myThemeText.rgba).toRgbString()
}
} }
}; };
} }
@ -130,37 +192,106 @@ export default Vue.extend({
watch: { watch: {
myThemeBase(v) { myThemeBase(v) {
const theme = v == 'light' ? lightTheme : darkTheme; const theme = v == 'light' ? lightTheme : darkTheme;
this.myThemePrimary = theme.meta.vars.primary; this.myThemePrimary = theme.vars.primary;
this.myThemeSecondary = theme.meta.vars.secondary; this.myThemeSecondary = theme.vars.secondary;
this.myThemeText = theme.meta.vars.text; this.myThemeText = theme.vars.text;
} }
}, },
beforeCreate() {
// migrate old theme definitions
// 後方互換性のため
this.$store.commit('device/set', {
key: 'themes', value: this.$store.state.device.themes.map(t => {
if (t.id == null) {
return convertOldThemedefinition(t);
} else {
return t;
}
})
});
},
methods: { methods: {
install() { install(code) {
const theme = JSON.parse(this.installThemeCode); let theme;
if (theme.meta == null || theme.meta.id == null) {
alert('%i18n:@invalid-theme%'); try {
theme = JSON5.parse(code);
} catch (e) {
this.$swal({
type: 'error',
text: '%i18n:@invalid-theme%'
});
return; return;
} }
if (this.$store.state.device.themes.some(t => t.meta.id == theme.meta.id)) {
alert('%i18n:@already-installed%'); // 後方互換性のため
if (theme.id == null && theme.meta != null) {
theme = convertOldThemedefinition(theme);
}
if (theme.id == null) {
this.$swal({
type: 'error',
text: '%i18n:@invalid-theme%'
});
return; return;
} }
if (this.$store.state.device.themes.some(t => t.id == theme.id)) {
this.$swal({
type: 'info',
text: '%i18n:@already-installed%'
});
return;
}
const themes = this.$store.state.device.themes.concat(theme); const themes = this.$store.state.device.themes.concat(theme);
this.$store.commit('device/set', { this.$store.commit('device/set', {
key: 'themes', value: themes key: 'themes', value: themes
}); });
alert('%i18n:@installed%'.replace('{}', theme.meta.name));
this.$swal({
type: 'success',
text: '%i18n:@installed%'.replace('{}', theme.name)
});
}, },
uninstall() { uninstall() {
const theme = this.installedThemes.find(x => x.meta.id == this.selectedInstalledTheme); const theme = this.selectedTheme;
const themes = this.$store.state.device.themes.filter(t => t.meta.id != theme.meta.id); const themes = this.$store.state.device.themes.filter(t => t.id != theme.id);
this.$store.commit('device/set', { this.$store.commit('device/set', {
key: 'themes', value: themes key: 'themes', value: themes
}); });
alert('%i18n:@uninstalled%'.replace('{}', theme.meta.name));
this.$swal({
type: 'info',
text: '%i18n:@uninstalled%'.replace('{}', theme.name)
});
},
import_() {
(this.$refs.file as any).click();
}
export_() {
const blob = new Blob([this.selectedThemeCode], {
type: 'application/json5'
});
this.$refs.export.$el.href = window.URL.createObjectURL(blob);
},
onUpdateImportFile() {
const f = (this.$refs.file as any).files[0];
const reader = new FileReader();
reader.onload = e => {
this.install(e.target.result);
};
reader.readAsText(f);
}, },
preview() { preview() {
@ -169,12 +300,26 @@ export default Vue.extend({
gen() { gen() {
const theme = this.myTheme; const theme = this.myTheme;
theme.meta.id = uuid();
if (theme.name == null || theme.name.trim() == '') {
this.$swal({
type: 'warning',
text: '%i18n:@theme-name-required%'
});
return;
}
theme.id = uuid();
const themes = this.$store.state.device.themes.concat(theme); const themes = this.$store.state.device.themes.concat(theme);
this.$store.commit('device/set', { this.$store.commit('device/set', {
key: 'themes', value: themes key: 'themes', value: themes
}); });
alert('%i18n:@saved%');
this.$swal({
type: 'success',
text: '%i18n:@saved%'
});
} }
} }
}); });
@ -182,6 +327,15 @@ export default Vue.extend({
<style lang="stylus" scoped> <style lang="stylus" scoped>
.nicnklzforebnpfgasiypmpdaaglujqm .nicnklzforebnpfgasiypmpdaaglujqm
> details
border-top solid 1px var(--faceDivider)
> summary
padding 16px 0
> *:last-child
margin-bottom 16px
> .creator > .creator
> div > div
padding 16px 0 padding 16px 0

View File

@ -1,7 +1,7 @@
<template> <template>
<button class="dmtdnykelhudezerjlfpbhgovrgnqqgr" :class="[styl, { inline, primary }]" :type="type" @click="$emit('click')"> <component class="dmtdnykelhudezerjlfpbhgovrgnqqgr" :is="link ? 'a' : 'button'" :class="[styl, { inline, primary }]" :type="type" @click="$emit('click')">
<slot></slot> <slot></slot>
</button> </component>
</template> </template>
<script lang="ts"> <script lang="ts">
@ -21,6 +21,11 @@ export default Vue.extend({
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
},
link: {
type: Boolean,
required: false,
default: false
} }
}, },
data() { data() {
@ -35,15 +40,20 @@ export default Vue.extend({
.dmtdnykelhudezerjlfpbhgovrgnqqgr .dmtdnykelhudezerjlfpbhgovrgnqqgr
display block display block
width 100% width 100%
min-height 40px
margin 0 margin 0
padding 0 padding 8px
text-align center
font-weight normal font-weight normal
font-size 16px font-size 16px
border none border none
border-radius 6px border-radius 6px
outline none outline none
box-shadow none box-shadow none
text-decoration none
user-select none
*
pointer-events none
&:focus &:focus
&:after &:after

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="ui-card"> <div class="ui-card" :class="{ shadow: $store.state.settings.useShadow }">
<header> <header>
<slot name="title"></slot> <slot name="title"></slot>
</header> </header>
@ -24,7 +24,10 @@ export default Vue.extend({
margin 16px margin 16px
color var(--faceText) color var(--faceText)
background var(--face) background var(--face)
box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12) border-radius var(--round)
&.shadow
box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12)
> header > header
padding 16px padding 16px

View File

@ -122,17 +122,19 @@ export default Vue.extend({
} }
}, },
mounted() { mounted() {
if (this.$refs.prefix) { this.$nextTick(() => {
this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px'; if (this.$refs.prefix) {
if (this.$refs.prefix.offsetWidth) { this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px';
this.$refs.input.style.paddingLeft = this.$refs.prefix.offsetWidth + 'px'; if (this.$refs.prefix.offsetWidth) {
this.$refs.input.style.paddingLeft = this.$refs.prefix.offsetWidth + 'px';
}
} }
} if (this.$refs.suffix) {
if (this.$refs.suffix) { if (this.$refs.suffix.offsetWidth) {
if (this.$refs.suffix.offsetWidth) { this.$refs.input.style.paddingRight = this.$refs.suffix.offsetWidth + 'px';
this.$refs.input.style.paddingRight = this.$refs.suffix.offsetWidth + 'px'; }
} }
} });
}, },
methods: { methods: {
focus() { focus() {

View File

@ -20,6 +20,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { apiUrl } from '../../../config'; import { apiUrl } from '../../../config';
import getMD5 from '../../scripts/get-md5';
export default Vue.extend({ export default Vue.extend({
data() { data() {
@ -28,61 +29,83 @@ export default Vue.extend({
}; };
}, },
methods: { methods: {
upload(file, folder) { checkExistence(fileData: ArrayBuffer): Promise<any> {
return new Promise((resolve, reject) => {
const data = new FormData();
data.append('md5', getMD5(fileData));
(this as any).api('drive/files/check_existence', {
md5: getMD5(fileData)
}).then(resp => {
resolve(resp.file);
});
});
},
upload(file: File, folder: any) {
if (folder && typeof folder == 'object') folder = folder.id; if (folder && typeof folder == 'object') folder = folder.id;
const id = Math.random(); const id = Math.random();
const ctx = {
id: id,
name: file.name || 'untitled',
progress: undefined,
img: undefined
};
this.uploads.push(ctx);
this.$emit('change', this.uploads);
const reader = new FileReader(); const reader = new FileReader();
reader.onload = (e: any) => { reader.onload = (e: any) => {
ctx.img = e.target.result; this.checkExistence(e.target.result).then(result => {
}; if (result !== null) {
reader.readAsDataURL(file); this.$emit('uploaded', result);
return;
}
const data = new FormData(); // Upload if the file didn't exist yet
data.append('i', this.$store.state.i.token); const buf = new Uint8Array(e.target.result);
data.append('file', file); let bin = '';
// We use for-of loop instead of apply() to avoid RangeError
// SEE: https://stackoverflow.com/questions/9267899/arraybuffer-to-base64-encoded-string
for (const byte of buf) bin += String.fromCharCode(byte);
const ctx = {
id: id,
name: file.name || 'untitled',
progress: undefined,
img: 'data:*/*;base64,' + btoa(bin)
};
if (folder) data.append('folderId', folder); this.uploads.push(ctx);
this.$emit('change', this.uploads);
const xhr = new XMLHttpRequest(); const data = new FormData();
xhr.open('POST', apiUrl + '/drive/files/create', true); data.append('i', this.$store.state.i.token);
xhr.onload = (e: any) => { data.append('file', file);
const driveFile = JSON.parse(e.target.response);
this.$emit('uploaded', driveFile); if (folder) data.append('folderId', folder);
this.uploads = this.uploads.filter(x => x.id != id); const xhr = new XMLHttpRequest();
this.$emit('change', this.uploads); xhr.open('POST', apiUrl + '/drive/files/create', true);
}; xhr.onload = (e: any) => {
const driveFile = JSON.parse(e.target.response);
xhr.upload.onprogress = e => { this.$emit('uploaded', driveFile);
if (e.lengthComputable) {
if (ctx.progress == undefined) ctx.progress = {};
ctx.progress.max = e.total;
ctx.progress.value = e.loaded;
}
};
xhr.send(data); this.uploads = this.uploads.filter(x => x.id != id);
this.$emit('change', this.uploads);
};
xhr.upload.onprogress = e => {
if (e.lengthComputable) {
if (ctx.progress == undefined) ctx.progress = {};
ctx.progress.max = e.total;
ctx.progress.value = e.loaded;
}
};
xhr.send(data);
})
}
reader.readAsArrayBuffer(file);
} }
} }
}); });
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
.mk-uploader .mk-uploader
overflow auto overflow auto

View File

@ -38,23 +38,20 @@ export default Vue.extend({
return { return {
fetching: true, fetching: true,
notes: [], notes: [],
connection: null, connection: null
connectionId: null
}; };
}, },
mounted() { mounted() {
this.fetch(); this.fetch();
this.connection = (this as any).os.streams.localTimelineStream.getConnection(); this.connection = (this as any).os.stream.useSharedConnection('localTimeline');
this.connectionId = (this as any).os.streams.localTimelineStream.use();
this.connection.on('note', this.onNote); this.connection.on('note', this.onNote);
}, },
beforeDestroy() { beforeDestroy() {
this.connection.off('note', this.onNote); this.connection.dispose();
(this as any).os.streams.localTimelineStream.dispose(this.connectionId);
}, },
methods: { methods: {

View File

@ -1,6 +1,6 @@
import * as getCaretCoordinates from 'textarea-caret'; import * as getCaretCoordinates from 'textarea-caret';
import MkAutocomplete from '../components/autocomplete.vue'; import MkAutocomplete from '../components/autocomplete.vue';
import renderAcct from '../../../../../misc/acct/render'; import { toASCII } from 'punycode';
export default { export default {
bind(el, binding, vn) { bind(el, binding, vn) {
@ -188,7 +188,7 @@ class Autocomplete {
const trimmedBefore = before.substring(0, before.lastIndexOf('@')); const trimmedBefore = before.substring(0, before.lastIndexOf('@'));
const after = source.substr(caret); const after = source.substr(caret);
const acct = renderAcct(value); const acct = value.host === null ? value.username : `${value.username}@${toASCII(value.host)}`;
// 挿入 // 挿入
this.text = `${trimmedBefore}@${acct} ${after}`; this.text = `${trimmedBefore}@${acct} ${after}`;

View File

@ -24,15 +24,13 @@ export default define({
return { return {
images: [], images: [],
fetching: true, fetching: true,
connection: null, connection: null
connectionId: null
}; };
}, },
mounted() { mounted() {
this.connection = (this as any).os.stream.getConnection(); this.connection = (this as any).os.stream.useSharedConnection('main');
this.connectionId = (this as any).os.stream.use();
this.connection.on('drive_file_created', this.onDriveFileCreated); this.connection.on('driveFileCreated', this.onDriveFileCreated);
(this as any).api('drive/stream', { (this as any).api('drive/stream', {
type: 'image/*', type: 'image/*',
@ -43,8 +41,7 @@ export default define({
}); });
}, },
beforeDestroy() { beforeDestroy() {
this.connection.off('drive_file_created', this.onDriveFileCreated); this.connection.dispose();
(this as any).os.stream.dispose(this.connectionId);
}, },
methods: { methods: {
onDriveFileCreated(file) { onDriveFileCreated(file) {
@ -76,9 +73,6 @@ export default define({
border-radius 8px border-radius 8px
.stream .stream
display -webkit-flex
display -moz-flex
display -ms-flex
display flex display flex
justify-content center justify-content center
flex-wrap wrap flex-wrap wrap

View File

@ -82,7 +82,6 @@ export default define({
data() { data() {
return { return {
connection: null, connection: null,
connectionId: null,
viewBoxY: 30, viewBoxY: 30,
stats: [], stats: [],
fediGradientId: uuid(), fediGradientId: uuid(),
@ -110,20 +109,16 @@ export default define({
} }
}, },
mounted() { mounted() {
this.connection = (this as any).os.streams.notesStatsStream.getConnection(); this.connection = (this as any).os.stream.useSharedConnection('notesStats');
this.connectionId = (this as any).os.streams.notesStatsStream.use();
this.connection.on('stats', this.onStats); this.connection.on('stats', this.onStats);
this.connection.on('statsLog', this.onStatsLog); this.connection.on('statsLog', this.onStatsLog);
this.connection.send({ this.connection.send('requestLog',{
type: 'requestLog', id: Math.random().toString().substr(2, 8)
id: Math.random().toString()
}); });
}, },
beforeDestroy() { beforeDestroy() {
this.connection.off('stats', this.onStats); this.connection.dispose();
this.connection.off('statsLog', this.onStatsLog);
(this as any).os.streams.notesStatsStream.dispose(this.connectionId);
}, },
methods: { methods: {
toggle() { toggle() {

View File

@ -44,7 +44,6 @@ export default define({
}, },
fetch() { fetch() {
fetch(`https://api.rss2json.com/v1/api.json?rss_url=${this.props.url}`, { fetch(`https://api.rss2json.com/v1/api.json?rss_url=${this.props.url}`, {
cache: 'no-cache'
}).then(res => { }).then(res => {
res.json().then(feed => { res.json().then(feed => {
this.items = feed.items; this.items = feed.items;

View File

@ -91,9 +91,8 @@ export default Vue.extend({
mounted() { mounted() {
this.connection.on('stats', this.onStats); this.connection.on('stats', this.onStats);
this.connection.on('statsLog', this.onStatsLog); this.connection.on('statsLog', this.onStatsLog);
this.connection.send({ this.connection.send('requestLog', {
type: 'requestLog', id: Math.random().toString().substr(2, 8)
id: Math.random().toString()
}); });
}, },
beforeDestroy() { beforeDestroy() {

View File

@ -45,8 +45,7 @@ export default define({
return { return {
fetching: true, fetching: true,
meta: null, meta: null,
connection: null, connection: null
connectionId: null
}; };
}, },
mounted() { mounted() {
@ -55,11 +54,10 @@ export default define({
this.fetching = false; this.fetching = false;
}); });
this.connection = (this as any).os.streams.serverStatsStream.getConnection(); this.connection = (this as any).os.stream.useSharedConnection('serverStats');
this.connectionId = (this as any).os.streams.serverStatsStream.use();
}, },
beforeDestroy() { beforeDestroy() {
(this as any).os.streams.serverStatsStream.dispose(this.connectionId); this.connection.dispose();
}, },
methods: { methods: {
toggle() { toggle() {

View File

@ -12,7 +12,7 @@ export const host = address.host;
export const hostname = address.hostname; export const hostname = address.hostname;
export const url = address.origin; export const url = address.origin;
export const apiUrl = url + '/api'; export const apiUrl = url + '/api';
export const wsUrl = url.replace('http://', 'ws://').replace('https://', 'wss://'); export const wsUrl = url.replace('http://', 'ws://').replace('https://', 'wss://') + '/streaming';
export const lang = _LANG_; export const lang = _LANG_;
export const langs = _LANGS_; export const langs = _LANGS_;
export const themeColor = _THEME_COLOR_; export const themeColor = _THEME_COLOR_;

View File

@ -6,13 +6,17 @@ export default (os: OS) => opts => {
const o = opts || {}; const o = opts || {};
if (o.renote) { if (o.renote) {
const vm = os.new(RenoteFormWindow, { const vm = os.new(RenoteFormWindow, {
note: o.renote note: o.renote,
animation: o.animation == null ? true : o.animation
}); });
if (o.cb) vm.$once('closed', o.cb);
document.body.appendChild(vm.$el); document.body.appendChild(vm.$el);
} else { } else {
const vm = os.new(PostFormWindow, { const vm = os.new(PostFormWindow, {
reply: o.reply reply: o.reply,
animation: o.animation == null ? true : o.animation
}); });
if (o.cb) vm.$once('closed', o.cb);
document.body.appendChild(vm.$el); document.body.appendChild(vm.$el);
} }
}; };

View File

@ -9,7 +9,6 @@ import './style.styl';
import init from '../init'; import init from '../init';
import fuckAdBlock from '../common/scripts/fuck-ad-block'; import fuckAdBlock from '../common/scripts/fuck-ad-block';
import { HomeStreamManager } from '../common/scripts/streaming/home';
import composeNotification from '../common/scripts/compose-notification'; import composeNotification from '../common/scripts/compose-notification';
import chooseDriveFolder from './api/choose-drive-folder'; import chooseDriveFolder from './api/choose-drive-folder';
@ -37,6 +36,7 @@ import MkTag from './views/pages/tag.vue';
import MkReversi from './views/pages/games/reversi.vue'; import MkReversi from './views/pages/games/reversi.vue';
import MkShare from './views/pages/share.vue'; import MkShare from './views/pages/share.vue';
import MkFollow from '../common/views/pages/follow.vue'; import MkFollow from '../common/views/pages/follow.vue';
import MiOS from '../mios';
/** /**
* init * init
@ -67,8 +67,8 @@ init(async (launch) => {
{ path: '/tags/:tag', component: MkTag }, { path: '/tags/:tag', component: MkTag },
{ path: '/share', component: MkShare }, { path: '/share', component: MkShare },
{ path: '/reversi/:game?', component: MkReversi }, { path: '/reversi/:game?', component: MkReversi },
{ path: '/@:user', component: MkUser }, { path: '/@:user', name: 'user', component: MkUser },
{ path: '/notes/:note', component: MkNote }, { path: '/notes/:note', name: 'note', component: MkNote },
{ path: '/authorize-follow', component: MkFollow } { path: '/authorize-follow', component: MkFollow }
] ]
}); });
@ -102,62 +102,56 @@ init(async (launch) => {
} }
if ((Notification as any).permission == 'granted') { if ((Notification as any).permission == 'granted') {
registerNotifications(os.stream); registerNotifications(os);
} }
} }
}, true); }, true);
function registerNotifications(stream: HomeStreamManager) { function registerNotifications(os: MiOS) {
const stream = os.stream;
if (stream == null) return; if (stream == null) return;
if (stream.hasConnection) { const connection = stream.useSharedConnection('main');
attach(stream.borrow());
}
stream.on('connected', connection => { connection.on('notification', notification => {
attach(connection); const _n = composeNotification('notification', notification);
const n = new Notification(_n.title, {
body: _n.body,
icon: _n.icon
});
setTimeout(n.close.bind(n), 6000);
}); });
function attach(connection) { connection.on('driveFileCreated', file => {
connection.on('notification', notification => { const _n = composeNotification('driveFileCreated', file);
const _n = composeNotification('notification', notification); const n = new Notification(_n.title, {
const n = new Notification(_n.title, { body: _n.body,
body: _n.body, icon: _n.icon
icon: _n.icon
});
setTimeout(n.close.bind(n), 6000);
}); });
setTimeout(n.close.bind(n), 5000);
});
connection.on('drive_file_created', file => { connection.on('unreadMessagingMessage', message => {
const _n = composeNotification('drive_file_created', file); const _n = composeNotification('unreadMessagingMessage', message);
const n = new Notification(_n.title, { const n = new Notification(_n.title, {
body: _n.body, body: _n.body,
icon: _n.icon icon: _n.icon
});
setTimeout(n.close.bind(n), 5000);
}); });
n.onclick = () => {
n.close();
/*(riot as any).mount(document.body.appendChild(document.createElement('mk-messaging-room-window')), {
user: message.user
});*/
};
setTimeout(n.close.bind(n), 7000);
});
connection.on('unread_messaging_message', message => { connection.on('reversiInvited', matching => {
const _n = composeNotification('unread_messaging_message', message); const _n = composeNotification('reversiInvited', matching);
const n = new Notification(_n.title, { const n = new Notification(_n.title, {
body: _n.body, body: _n.body,
icon: _n.icon icon: _n.icon
});
n.onclick = () => {
n.close();
/*(riot as any).mount(document.body.appendChild(document.createElement('mk-messaging-room-window')), {
user: message.user
});*/
};
setTimeout(n.close.bind(n), 7000);
}); });
});
connection.on('reversi_invited', matching => {
const _n = composeNotification('reversi_invited', matching);
const n = new Notification(_n.title, {
body: _n.body,
icon: _n.icon
});
});
}
} }

View File

@ -98,8 +98,7 @@ export default Vue.extend({
hierarchyFolders: [], hierarchyFolders: [],
selectedFiles: [], selectedFiles: [],
uploadings: [], uploadings: [],
connection: null, connection: null
connectionId: null,
/** /**
* ドロップされようとしているか * ドロップされようとしているか
@ -116,8 +115,7 @@ export default Vue.extend({
}; };
}, },
mounted() { mounted() {
this.connection = (this as any).os.streams.driveStream.getConnection(); this.connection = (this as any).os.stream.useSharedConnection('drive');
this.connectionId = (this as any).os.streams.driveStream.use();
this.connection.on('file_created', this.onStreamDriveFileCreated); this.connection.on('file_created', this.onStreamDriveFileCreated);
this.connection.on('file_updated', this.onStreamDriveFileUpdated); this.connection.on('file_updated', this.onStreamDriveFileUpdated);
@ -132,12 +130,7 @@ export default Vue.extend({
} }
}, },
beforeDestroy() { beforeDestroy() {
this.connection.off('file_created', this.onStreamDriveFileCreated); this.connection.dispose();
this.connection.off('file_updated', this.onStreamDriveFileUpdated);
this.connection.off('file_deleted', this.onStreamDriveFileDeleted);
this.connection.off('folder_created', this.onStreamDriveFolderCreated);
this.connection.off('folder_updated', this.onStreamDriveFolderUpdated);
(this as any).os.streams.driveStream.dispose(this.connectionId);
}, },
methods: { methods: {
onContextmenu(e) { onContextmenu(e) {

View File

@ -1,37 +0,0 @@
<template>
<div class="mk-ellipsis-icon">
<div></div><div></div><div></div>
</div>
</template>
<style lang="stylus" scoped>
.mk-ellipsis-icon
width 70px
margin 0 auto
text-align center
> div
display inline-block
width 18px
height 18px
background-color rgba(#000, 0.3)
border-radius 100%
animation bounce 1.4s infinite ease-in-out both
&:nth-child(1)
animation-delay 0s
&:nth-child(2)
margin 0 6px
animation-delay 0.16s
&:nth-child(3)
animation-delay 0.32s
@keyframes bounce
0%, 80%, 100%
transform scale(0)
40%
transform scale(1)
</style>

View File

@ -34,23 +34,18 @@ export default Vue.extend({
return { return {
u: this.user, u: this.user,
wait: false, wait: false,
connection: null, connection: null
connectionId: null
}; };
}, },
mounted() { mounted() {
this.connection = (this as any).os.stream.getConnection(); this.connection = (this as any).os.stream.useSharedConnection('main');
this.connectionId = (this as any).os.stream.use();
this.connection.on('follow', this.onFollow); this.connection.on('follow', this.onFollow);
this.connection.on('unfollow', this.onUnfollow); this.connection.on('unfollow', this.onUnfollow);
}, },
beforeDestroy() { beforeDestroy() {
this.connection.off('follow', this.onFollow); this.connection.dispose();
this.connection.off('unfollow', this.onUnfollow);
(this as any).os.stream.dispose(this.connectionId);
}, },
methods: { methods: {

View File

@ -8,7 +8,6 @@
<router-link class="name" :to="user | userPage" v-user-preview="user.id">{{ user | userName }}</router-link> <router-link class="name" :to="user | userPage" v-user-preview="user.id">{{ user | userName }}</router-link>
<p class="username">@{{ user | acct }}</p> <p class="username">@{{ user | acct }}</p>
</div> </div>
<mk-follow-button :user="user"/>
</div> </div>
</div> </div>
<p class="empty" v-if="!fetching && users.length == 0">%i18n:@empty%</p> <p class="empty" v-if="!fetching && users.length == 0">%i18n:@empty%</p>

View File

@ -38,7 +38,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="main"> <div class="main" :class="{ side: widgets.left.length == 0 || widgets.right.length == 0 }">
<template v-if="customize"> <template v-if="customize">
<x-draggable v-for="place in ['left', 'right']" <x-draggable v-for="place in ['left', 'right']"
:list="widgets[place]" :list="widgets[place]"
@ -141,7 +141,6 @@ export default Vue.extend({
data() { data() {
return { return {
connection: null, connection: null,
connectionId: null,
widgetAdderSelected: null, widgetAdderSelected: null,
trash: [] trash: []
}; };
@ -176,12 +175,11 @@ export default Vue.extend({
}, },
mounted() { mounted() {
this.connection = (this as any).os.stream.getConnection(); this.connection = (this as any).os.stream.useSharedConnection('main');
this.connectionId = (this as any).os.stream.use();
}, },
beforeDestroy() { beforeDestroy() {
(this as any).os.stream.dispose(this.connectionId); this.connection.dispose();
}, },
methods: { methods: {
@ -361,12 +359,10 @@ export default Vue.extend({
box-shadow var(--shadow) box-shadow var(--shadow)
border-radius var(--round) border-radius var(--round)
@media (max-width 700px) &.side
padding 0 > .main
width calc(100% - 280px)
> .tl max-width 680px
border none
border-radius 0
> *:not(.main) > *:not(.main)
width 280px width 280px
@ -383,14 +379,24 @@ export default Vue.extend({
padding-right 16px padding-right 16px
order 3 order 3
@media (max-width 1100px) &.side
> *:not(.main) @media (max-width 1000px)
display none > *:not(.main)
display none
> .main > .main
float none width 100%
width 100% max-width 700px
max-width 700px margin 0 auto
margin 0 auto
&:not(.side)
@media (max-width 1200px)
> *:not(.main)
display none
> .main
width 100%
max-width 700px
margin 0 auto
</style> </style>

View File

@ -9,7 +9,6 @@ import subNoteContent from './sub-note-content.vue';
import window from './window.vue'; import window from './window.vue';
import noteFormWindow from './post-form-window.vue'; import noteFormWindow from './post-form-window.vue';
import renoteFormWindow from './renote-form-window.vue'; import renoteFormWindow from './renote-form-window.vue';
import ellipsisIcon from './ellipsis-icon.vue';
import mediaImage from './media-image.vue'; import mediaImage from './media-image.vue';
import mediaImageDialog from './media-image-dialog.vue'; import mediaImageDialog from './media-image-dialog.vue';
import mediaVideo from './media-video.vue'; import mediaVideo from './media-video.vue';
@ -39,7 +38,6 @@ Vue.component('mk-sub-note-content', subNoteContent);
Vue.component('mk-window', window); Vue.component('mk-window', window);
Vue.component('mk-post-form-window', noteFormWindow); Vue.component('mk-post-form-window', noteFormWindow);
Vue.component('mk-renote-form-window', renoteFormWindow); Vue.component('mk-renote-form-window', renoteFormWindow);
Vue.component('mk-ellipsis-icon', ellipsisIcon);
Vue.component('mk-media-image', mediaImage); Vue.component('mk-media-image', mediaImage);
Vue.component('mk-media-image-dialog', mediaImageDialog); Vue.component('mk-media-image-dialog', mediaImageDialog);
Vue.component('mk-media-video', mediaVideo); Vue.component('mk-media-video', mediaVideo);

View File

@ -6,19 +6,12 @@
</div> </div>
</div> </div>
<div class="vwxdhznewyashiknzolsoihtlpicqepe" v-else> <div class="vwxdhznewyashiknzolsoihtlpicqepe" v-else>
<video class="video"
:src="video.url"
:title="video.name"
controls
@dblclick.prevent="onClick"
ref="video"
v-if="inlinePlayable" />
<a class="thumbnail" <a class="thumbnail"
:href="video.url" :href="video.url"
:style="imageStyle" :style="imageStyle"
@click.prevent="onClick" @click.prevent="onClick"
:title="video.name" :title="video.name"
v-else> >
%fa:R play-circle% %fa:R play-circle%
</a> </a>
</div> </div>
@ -46,7 +39,7 @@ export default Vue.extend({
computed: { computed: {
imageStyle(): any { imageStyle(): any {
return { return {
'background-image': `url(${this.video.url})` 'background-image': null // TODO `url(${this.video.thumbnailUrl})`
}; };
} }
}, },

View File

@ -91,14 +91,17 @@ import MkPostFormWindow from './post-form-window.vue';
import MkRenoteFormWindow from './renote-form-window.vue'; import MkRenoteFormWindow from './renote-form-window.vue';
import MkNoteMenu from '../../../common/views/components/note-menu.vue'; import MkNoteMenu from '../../../common/views/components/note-menu.vue';
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
import XSub from './notes.note.sub.vue'; import XSub from './note.sub.vue';
import { sum } from '../../../../../prelude/array'; import { sum } from '../../../../../prelude/array';
import noteSubscriber from '../../../common/scripts/note-subscriber';
export default Vue.extend({ export default Vue.extend({
components: { components: {
XSub XSub
}, },
mixins: [noteSubscriber('note')],
props: { props: {
note: { note: {
type: Object, type: Object,

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="tkfdzaxtkdeianobciwadajxzbddorql" :title="title"> <div class="tkfdzaxtkdeianobciwadajxzbddorql" :class="{ mini }" :title="title">
<mk-avatar class="avatar" :user="note.user"/> <mk-avatar class="avatar" :user="note.user"/>
<div class="main"> <div class="main">
<mk-note-header class="header" :note="note"/> <mk-note-header class="header" :note="note"/>
@ -24,6 +24,11 @@ export default Vue.extend({
note: { note: {
type: Object, type: Object,
required: true required: true
},
mini: {
type: Boolean,
required: false,
default: false
} }
}, },
@ -44,11 +49,19 @@ export default Vue.extend({
<style lang="stylus" scoped> <style lang="stylus" scoped>
.tkfdzaxtkdeianobciwadajxzbddorql .tkfdzaxtkdeianobciwadajxzbddorql
display flex display flex
margin 0
padding 16px 32px padding 16px 32px
font-size 0.9em font-size 0.9em
background var(--subNoteBg) background var(--subNoteBg)
&.mini
padding 16px
font-size 10px
> .avatar
margin 0 8px 0 0
width 38px
height 38px
> .avatar > .avatar
flex-shrink 0 flex-shrink 0
display block display block

View File

@ -0,0 +1,379 @@
<template>
<div
class="note"
:class="{ mini }"
v-show="appearNote.deletedAt == null"
:tabindex="appearNote.deletedAt == null ? '-1' : null"
v-hotkey="keymap"
:title="title"
>
<div class="conversation" v-if="detail && conversation.length > 0">
<x-sub v-for="note in conversation" :key="note.id" :note="note" :mini="mini"/>
</div>
<div class="reply-to" v-if="appearNote.reply && (!$store.getters.isSignedIn || $store.state.settings.showReplyTarget)">
<x-sub :note="appearNote.reply" :mini="mini"/>
</div>
<div class="renote" v-if="isRenote">
<mk-avatar class="avatar" :user="note.user"/>
%fa:retweet%
<span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span>
<a class="name" :href="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</a>
<span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span>
<mk-time :time="note.createdAt"/>
</div>
<article>
<mk-avatar class="avatar" :user="appearNote.user"/>
<div class="main">
<mk-note-header class="header" :note="appearNote"/>
<div class="body">
<p v-if="appearNote.cw != null" class="cw">
<span class="text" v-if="appearNote.cw != ''">{{ appearNote.cw }}</span>
<mk-cw-button v-model="showContent"/>
</p>
<div class="content" v-show="appearNote.cw == null || showContent">
<div class="text">
<span v-if="appearNote.isHidden" style="opacity: 0.5">%i18n:@private%</span>
<a class="reply" v-if="appearNote.reply">%fa:reply%</a>
<misskey-flavored-markdown v-if="appearNote.text" :text="appearNote.text" :i="$store.state.i" :class="$style.text"/>
<a class="rp" v-if="appearNote.renote">RP:</a>
</div>
<div class="files" v-if="appearNote.files.length > 0">
<mk-media-list :media-list="appearNote.files"/>
</div>
<mk-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/>
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a>
<div class="renote" v-if="appearNote.renote"><mk-note-preview :note="appearNote.renote" :mini="mini"/></div>
<mk-url-preview v-for="url in urls" :url="url" :key="url" :mini="mini"/>
</div>
</div>
<footer>
<mk-reactions-viewer :note="appearNote" ref="reactionsViewer"/>
<button class="replyButton" @click="reply()" title="%i18n:@reply%">
<template v-if="appearNote.reply">%fa:reply-all%</template>
<template v-else>%fa:reply%</template>
<p class="count" v-if="appearNote.repliesCount > 0">{{ appearNote.repliesCount }}</p>
</button>
<button class="renoteButton" @click="renote()" title="%i18n:@renote%">
%fa:retweet%<p class="count" v-if="appearNote.renoteCount > 0">{{ appearNote.renoteCount }}</p>
</button>
<button class="reactionButton" :class="{ reacted: appearNote.myReaction != null }" @click="react()" ref="reactButton" title="%i18n:@add-reaction%">
%fa:plus%<p class="count" v-if="appearNote.reactions_count > 0">{{ appearNote.reactions_count }}</p>
</button>
<button @click="menu()" ref="menuButton">
%fa:ellipsis-h%
</button>
</footer>
</div>
</article>
<div class="replies" v-if="detail && replies.length > 0">
<x-sub v-for="note in replies" :key="note.id" :note="note" :mini="mini"/>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import XSub from './note.sub.vue';
import noteMixin from '../../../common/scripts/note-mixin';
import noteSubscriber from '../../../common/scripts/note-subscriber';
export default Vue.extend({
components: {
XSub
},
mixins: [
noteMixin(),
noteSubscriber('note')
],
props: {
note: {
type: Object,
required: true
},
detail: {
type: Boolean,
required: false,
default: false
},
mini: {
type: Boolean,
required: false,
default: false
}
},
data() {
return {
conversation: [],
replies: []
};
},
created() {
if (this.detail) {
(this as any).api('notes/replies', {
noteId: this.appearNote.id,
limit: 8
}).then(replies => {
this.replies = replies;
});
(this as any).api('notes/conversation', {
noteId: this.appearNote.replyId
}).then(conversation => {
this.conversation = conversation.reverse();
});
}
}
});
</script>
<style lang="stylus" scoped>
.note
margin 0
padding 0
background var(--face)
border-bottom solid 1px var(--faceDivider)
&.mini
font-size 13px
> .renote
padding 8px 16px 0 16px
.avatar
width 20px
height 20px
> article
padding 16px 16px 4px
> .avatar
margin 0 10px 8px 0
width 42px
height 42px
&:last-of-type
border-bottom none
&:focus
z-index 1
&:after
content ""
pointer-events none
position absolute
top 2px
right 2px
bottom 2px
left 2px
border 2px solid var(--primaryAlpha03)
border-radius 4px
> .renote
display flex
align-items center
padding 16px 32px 8px 32px
line-height 28px
white-space pre
color var(--renoteText)
background linear-gradient(to bottom, var(--renoteGradient) 0%, var(--face) 100%)
.avatar
flex-shrink 0
display inline-block
width 28px
height 28px
margin 0 8px 0 0
border-radius 6px
[data-fa]
margin-right 4px
> span
flex-shrink 0
&:last-of-type
margin-right 8px
.name
overflow hidden
flex-shrink 1
text-overflow ellipsis
white-space nowrap
font-weight bold
> .mk-time
display block
margin-left auto
flex-shrink 0
font-size 0.9em
& + article
padding-top 8px
> article
display flex
padding 28px 32px 18px 32px
&:hover
> .main > footer > button
color var(--noteActionsHighlighted)
> .avatar
flex-shrink 0
display block
margin 0 16px 10px 0
width 58px
height 58px
border-radius 8px
//position -webkit-sticky
//position sticky
//top 74px
> .main
flex 1
min-width 0
> .header
margin-bottom 4px
> .body
> .cw
cursor default
display block
margin 0
padding 0
overflow-wrap break-word
color var(--noteText)
> .text
margin-right 8px
> .content
> .text
cursor default
display block
margin 0
padding 0
overflow-wrap break-word
color var(--noteText)
>>> .title
display block
margin-bottom 4px
padding 4px
font-size 90%
text-align center
background var(--mfmTitleBg)
border-radius 4px
>>> .code
margin 8px 0
>>> .quote
margin 8px
padding 6px 12px
color var(--mfmQuote)
border-left solid 3px var(--mfmQuoteLine)
> .reply
margin-right 8px
color var(--text)
> .rp
margin-left 4px
font-style oblique
color var(--renoteText)
> .location
margin 4px 0
font-size 12px
color #ccc
> .map
width 100%
height 300px
&:empty
display none
.mk-url-preview
margin-top 8px
> .mk-poll
font-size 80%
> .renote
margin 8px 0
> *
padding 16px
border dashed 1px var(--quoteBorder)
border-radius 8px
> footer
> button
margin 0 28px 0 0
padding 0 8px
line-height 32px
font-size 1em
color var(--noteActions)
background transparent
border none
cursor pointer
&:last-child
margin-right 0
&:hover
color var(--noteActionsHover)
&.replyButton:hover
color var(--noteActionsReplyHover)
&.renoteButton:hover
color var(--noteActionsRenoteHover)
&.reactionButton:hover
color var(--noteActionsReactionHover)
> .count
display inline
margin 0 0 0 8px
color #999
&.reacted, &.reacted:hover
color var(--noteActionsReactionHover)
</style>
<style lang="stylus" module>
.text
code
padding 4px 8px
margin 0 0.5em
font-size 80%
color #525252
background #f8f8f8
border-radius 2px
pre > code
padding 16px
margin 0
[data-is-me]:after
content "you"
padding 0 4px
margin-left 4px
font-size 80%
color var(--primaryForeground)
background var(--primary)
border-radius 4px
</style>

View File

@ -1,555 +0,0 @@
<template>
<div class="note" tabindex="-1" v-hotkey="keymap" :title="title">
<div class="reply-to" v-if="p.reply && (!$store.getters.isSignedIn || $store.state.settings.showReplyTarget)">
<x-sub :note="p.reply"/>
</div>
<div class="renote" v-if="isRenote">
<mk-avatar class="avatar" :user="note.user"/>
%fa:retweet%
<span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span>
<a class="name" :href="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</a>
<span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span>
<mk-time :time="note.createdAt"/>
</div>
<article>
<mk-avatar class="avatar" :user="p.user"/>
<div class="main">
<mk-note-header class="header" :note="p"/>
<div class="body">
<p v-if="p.cw != null" class="cw">
<span class="text" v-if="p.cw != ''">{{ p.cw }}</span>
<mk-cw-button v-model="showContent"/>
</p>
<div class="content" v-show="p.cw == null || showContent">
<div class="text">
<span v-if="p.isHidden" style="opacity: 0.5">%i18n:@private%</span>
<span v-if="p.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
<a class="reply" v-if="p.reply">%fa:reply%</a>
<misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i" :class="$style.text"/>
<a class="rp" v-if="p.renote">RP:</a>
</div>
<div class="files" v-if="p.files.length > 0">
<mk-media-list :media-list="p.files"/>
</div>
<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
<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="renote" v-if="p.renote"><mk-note-preview :note="p.renote"/></div>
<mk-url-preview v-for="url in urls" :url="url" :key="url"/>
</div>
</div>
<footer>
<mk-reactions-viewer :note="p" ref="reactionsViewer"/>
<button class="replyButton" @click="reply()" title="%i18n:@reply%">
<template v-if="p.reply">%fa:reply-all%</template>
<template v-else>%fa:reply%</template>
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
</button>
<button class="renoteButton" @click="renote()" title="%i18n:@renote%">
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
</button>
<button class="reactionButton" :class="{ reacted: p.myReaction != null }" @click="react()" ref="reactButton" title="%i18n:@add-reaction%">
%fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p>
</button>
<button @click="menu()" ref="menuButton">
%fa:ellipsis-h%
</button>
<!-- <button title="%i18n:@detail">
<template v-if="!isDetailOpened">%fa:caret-down%</template>
<template v-if="isDetailOpened">%fa:caret-up%</template>
</button> -->
</footer>
</div>
</article>
<div class="detail" v-if="isDetailOpened">
<mk-note-status-graph width="462" height="130" :note="p"/>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import parse from '../../../../../mfm/parse';
import MkPostFormWindow from './post-form-window.vue';
import MkRenoteFormWindow from './renote-form-window.vue';
import MkNoteMenu from '../../../common/views/components/note-menu.vue';
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
import XSub from './notes.note.sub.vue';
import { sum } from '../../../../../prelude/array';
function focus(el, fn) {
const target = fn(el);
if (target) {
if (target.hasAttribute('tabindex')) {
target.focus();
} else {
focus(target, fn);
}
}
}
export default Vue.extend({
components: {
XSub
},
props: {
note: {
type: Object,
required: true
}
},
data() {
return {
showContent: false,
isDetailOpened: false,
connection: null,
connectionId: null
};
},
computed: {
keymap(): any {
return {
'r|left': () => this.reply(true),
'e|a|plus': () => this.react(true),
'q|right': () => this.renote(true),
'ctrl+q|ctrl+right': this.renoteDirectly,
'up|k|shift+tab': this.focusBefore,
'down|j|tab': this.focusAfter,
'esc': this.blur,
'm|o': () => this.menu(true),
's': this.toggleShowContent,
'1': () => this.reactDirectly('like'),
'2': () => this.reactDirectly('love'),
'3': () => this.reactDirectly('laugh'),
'4': () => this.reactDirectly('hmm'),
'5': () => this.reactDirectly('surprise'),
'6': () => this.reactDirectly('congrats'),
'7': () => this.reactDirectly('angry'),
'8': () => this.reactDirectly('confused'),
'9': () => this.reactDirectly('rip'),
'0': () => this.reactDirectly('pudding'),
};
},
isRenote(): boolean {
return (this.note.renote &&
this.note.text == null &&
this.note.fileIds.length == 0 &&
this.note.poll == null);
},
p(): any {
return this.isRenote ? this.note.renote : this.note;
},
reactionsCount(): number {
return this.p.reactionCounts
? sum(Object.values(this.p.reactionCounts))
: 0;
},
title(): string {
return new Date(this.p.createdAt).toLocaleString();
},
urls(): string[] {
if (this.p.text) {
const ast = parse(this.p.text);
return ast
.filter(t => (t.type == 'url' || t.type == 'link') && !t.silent)
.map(t => t.url);
} else {
return null;
}
}
},
created() {
if (this.$store.getters.isSignedIn) {
this.connection = (this as any).os.stream.getConnection();
this.connectionId = (this as any).os.stream.use();
}
},
mounted() {
this.capture(true);
if (this.$store.getters.isSignedIn) {
this.connection.on('_connected_', this.onStreamConnected);
}
// Draw map
if (this.p.geo) {
const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true;
if (shouldShowMap) {
(this as any).os.getGoogleMaps().then(maps => {
const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]);
const map = new maps.Map(this.$refs.map, {
center: uluru,
zoom: 15
});
new maps.Marker({
position: uluru,
map: map
});
});
}
}
},
beforeDestroy() {
this.decapture(true);
if (this.$store.getters.isSignedIn) {
this.connection.off('_connected_', this.onStreamConnected);
(this as any).os.stream.dispose(this.connectionId);
}
},
methods: {
capture(withHandler = false) {
if (this.$store.getters.isSignedIn) {
const data = {
type: 'capture',
id: this.p.id
} as any;
if ((this.p.visibleUserIds || []).includes(this.$store.state.i.id) || (this.p.mentions || []).includes(this.$store.state.i.id)) {
data.read = true;
}
this.connection.send(data);
if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated);
}
},
decapture(withHandler = false) {
if (this.$store.getters.isSignedIn) {
this.connection.send({
type: 'decapture',
id: this.p.id
});
if (withHandler) this.connection.off('note-updated', this.onStreamNoteUpdated);
}
},
onStreamConnected() {
this.capture();
},
onStreamNoteUpdated(data) {
const note = data.note;
if (note.id == this.note.id) {
this.$emit('update:note', note);
} else if (note.id == this.note.renoteId) {
this.note.renote = note;
}
},
reply(viaKeyboard = false) {
(this as any).os.new(MkPostFormWindow, {
reply: this.p,
animation: !viaKeyboard
}).$once('closed', this.focus);
},
renote(viaKeyboard = false) {
(this as any).os.new(MkRenoteFormWindow, {
note: this.p,
animation: !viaKeyboard
}).$once('closed', this.focus);
},
renoteDirectly() {
(this as any).api('notes/create', {
renoteId: this.p.id
});
},
react(viaKeyboard = false) {
this.blur();
(this as any).os.new(MkReactionPicker, {
source: this.$refs.reactButton,
note: this.p,
showFocus: viaKeyboard,
animation: !viaKeyboard
}).$once('closed', this.focus);
},
reactDirectly(reaction) {
(this as any).api('notes/reactions/create', {
noteId: this.p.id,
reaction: reaction
});
},
menu(viaKeyboard = false) {
(this as any).os.new(MkNoteMenu, {
source: this.$refs.menuButton,
note: this.p,
animation: !viaKeyboard
}).$once('closed', this.focus);
},
toggleShowContent() {
this.showContent = !this.showContent;
},
focus() {
this.$el.focus();
},
blur() {
this.$el.blur();
},
focusBefore() {
focus(this.$el, e => e.previousElementSibling);
},
focusAfter() {
focus(this.$el, e => e.nextElementSibling);
}
}
});
</script>
<style lang="stylus" scoped>
.note
margin 0
padding 0
background var(--face)
border-bottom solid 1px var(--faceDivider)
&[data-round]
&:first-child
border-top-left-radius 6px
border-top-right-radius 6px
> .renote
border-top-left-radius 6px
border-top-right-radius 6px
&:last-of-type
border-bottom none
&:focus
z-index 1
&:after
content ""
pointer-events none
position absolute
top 2px
right 2px
bottom 2px
left 2px
border 2px solid var(--primaryAlpha03)
border-radius 4px
> .renote
display flex
align-items center
padding 16px 32px 8px 32px
line-height 28px
white-space pre
color var(--renoteText)
background linear-gradient(to bottom, var(--renoteGradient) 0%, var(--face) 100%)
.avatar
display inline-block
width 28px
height 28px
margin 0 8px 0 0
border-radius 6px
[data-fa]
margin-right 4px
> span
flex-shrink 0
&:last-of-type
margin-right 8px
.name
overflow hidden
flex-shrink 1
text-overflow ellipsis
white-space nowrap
font-weight bold
> .mk-time
display block
margin-left auto
flex-shrink 0
font-size 0.9em
& + article
padding-top 8px
> article
display flex
padding 28px 32px 18px 32px
&:hover
> .main > footer > button
color var(--noteActionsHighlighted)
> .avatar
flex-shrink 0
display block
margin 0 16px 10px 0
width 58px
height 58px
border-radius 8px
//position -webkit-sticky
//position sticky
//top 74px
> .main
flex 1
min-width 0
> .header
margin-bottom 4px
> .body
> .cw
cursor default
display block
margin 0
padding 0
overflow-wrap break-word
color var(--noteText)
> .text
margin-right 8px
> .content
> .text
cursor default
display block
margin 0
padding 0
overflow-wrap break-word
color var(--noteText)
>>> .title
display block
margin-bottom 4px
padding 4px
font-size 90%
text-align center
background var(--mfmTitleBg)
border-radius 4px
>>> .code
margin 8px 0
>>> .quote
margin 8px
padding 6px 12px
color var(--mfmQuote)
border-left solid 3px var(--mfmQuoteLine)
> .reply
margin-right 8px
color var(--text)
> .rp
margin-left 4px
font-style oblique
color var(--renoteText)
> .location
margin 4px 0
font-size 12px
color #ccc
> .map
width 100%
height 300px
&:empty
display none
.mk-url-preview
margin-top 8px
> .mk-poll
font-size 80%
> .renote
margin 8px 0
> *
padding 16px
border dashed 1px var(--quoteBorder)
border-radius 8px
> footer
> button
margin 0 28px 0 0
padding 0 8px
line-height 32px
font-size 1em
color var(--noteActions)
background transparent
border none
cursor pointer
&:hover
color var(--noteActionsHover)
&.replyButton:hover
color var(--noteActionsReplyHover)
&.renoteButton:hover
color var(--noteActionsRenoteHover)
&.reactionButton:hover
color var(--noteActionsReactionHover)
> .count
display inline
margin 0 0 0 8px
color #999
&.reacted, &.reacted:hover
color var(--noteActionsReactionHover)
> .detail
padding-top 4px
background rgba(#000, 0.0125)
</style>
<style lang="stylus" module>
.text
code
padding 4px 8px
margin 0 0.5em
font-size 80%
color #525252
background #f8f8f8
border-radius 2px
pre > code
padding 16px
margin 0
[data-is-me]:after
content "you"
padding 0 4px
margin-left 4px
font-size 80%
color var(--primaryForeground)
background var(--primary)
border-radius 4px
</style>

View File

@ -9,6 +9,12 @@
<button @click="resolveInitPromise">%i18n:@retry%</button> <button @click="resolveInitPromise">%i18n:@retry%</button>
</div> </div>
<div class="placeholder" v-if="fetching">
<template v-for="i in 10">
<mk-note-skeleton :key="i"/>
</template>
</div>
<!-- トランジションを有効にするとなぜかメモリリークする --> <!-- トランジションを有効にするとなぜかメモリリークする -->
<component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notes" class="notes transition" tag="div" ref="notes"> <component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notes" class="notes transition" tag="div" ref="notes">
<template v-for="(note, i) in _notes"> <template v-for="(note, i) in _notes">
@ -34,7 +40,7 @@ import Vue from 'vue';
import * as config from '../../../config'; import * as config from '../../../config';
import getNoteSummary from '../../../../../misc/get-note-summary'; import getNoteSummary from '../../../../../misc/get-note-summary';
import XNote from './notes.note.vue'; import XNote from './note.vue';
const displayLimit = 30; const displayLimit = 30;
@ -226,6 +232,10 @@ export default Vue.extend({
> * > *
transition transform .3s ease, opacity .3s ease transition transform .3s ease, opacity .3s ease
> .placeholder
padding 32px
opacity 0.3
> .notes > .notes
> .date > .date
display block display block

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