Compare commits

...

324 Commits
6.0.2 ... 7.1.2

Author SHA1 Message Date
3fb98e808f 7.1.2 2018-08-20 23:49:27 +09:00
2c9bacfcea Fix bug? 2018-08-20 23:49:00 +09:00
a542765cf8 Merge pull request #2352 from acid-chicken/patch-2
Update README.md
2018-08-20 07:45:35 +09:00
fd3f8d43db Merge pull request #2356 from acid-chicken/patch-3
Fix z-index
2018-08-20 07:44:57 +09:00
4f4496078a Update user.vue 2018-08-20 02:05:57 +09:00
8f4f5b4ce0 7.1.1 2018-08-20 01:42:56 +09:00
bdc6718ae5 Fix bug 2018-08-20 01:41:53 +09:00
09d1f1c20d Update README.md 2018-08-19 23:14:22 +09:00
0efb7af17b 7.1.0 2018-08-19 23:11:55 +09:00
a45a78b94f Merge pull request #2336 from syuilo/l10n_master
New Crowdin translations
2018-08-19 23:06:47 +09:00
6337c26cf0 Merge pull request #2347 from syuilo/greenkeeper/html-minifier-3.5.20
Update html-minifier to the latest version 🚀
2018-08-19 23:06:34 +09:00
208dec25d9 Merge pull request #2349 from syuilo/configress-build
設定ファイルなしでビルドできるように
2018-08-19 22:32:58 +09:00
7d65a0c3d5 wip 2018-08-19 22:32:25 +09:00
bb925e5de3 wip 2018-08-19 21:07:18 +09:00
c9de5b65d4 wip 2018-08-19 19:15:29 +09:00
9bc3fcf74f Merge pull request #2348 from mei23/mei-0819-nsfw3
リモートにNSFWが効かないのを修正
2018-08-19 18:46:47 +09:00
19d979c330 Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-19 18:38:15 +09:00
bb7b335491 nameId廃止 & アプリ作成時にシークレットを返すように 2018-08-19 18:38:02 +09:00
be5a0b4794 Fix リモートにNSFWが効かない 2018-08-19 18:08:29 +09:00
48eea03386 fix(package): update html-minifier to version 3.5.20 2018-08-19 09:03:23 +00:00
566317dc83 Fix bug 2018-08-19 13:32:02 +09:00
d4334645c2 New translations ja.yml (Japanese (Kansai-ben)) 2018-08-19 12:41:16 +09:00
d60c3c4ee3 7.0.2 2018-08-19 05:26:53 +09:00
452514f7fe Fix bug 2018-08-19 05:26:34 +09:00
58abb0ce8f 7.0.1 2018-08-19 05:15:55 +09:00
000d9cc1ce Fix bug 2018-08-19 05:15:50 +09:00
8cc017354a New translations ja.yml (English) 2018-08-19 04:11:04 +09:00
60269d15e8 Update version 2018-08-19 04:03:55 +09:00
7caa083612 New translations ja.yml (Japanese (Kansai-ben)) 2018-08-19 04:01:58 +09:00
68e1b00eb1 New translations ja.yml (Catalan) 2018-08-19 04:01:55 +09:00
1d904c756a New translations ja.yml (Portuguese) 2018-08-19 04:01:53 +09:00
0a1db1f595 New translations ja.yml (Korean) 2018-08-19 04:01:50 +09:00
e30e8267dd New translations ja.yml (Polish) 2018-08-19 04:01:48 +09:00
288a881817 New translations ja.yml (Chinese Simplified) 2018-08-19 04:01:46 +09:00
f593790872 New translations ja.yml (Italian) 2018-08-19 04:01:43 +09:00
1044ad8589 New translations ja.yml (Russian) 2018-08-19 04:01:41 +09:00
6e24015e68 New translations ja.yml (English) 2018-08-19 04:01:39 +09:00
b9a2c449ff New translations ja.yml (Spanish) 2018-08-19 04:01:37 +09:00
7c390cbf7b New translations ja.yml (German) 2018-08-19 04:01:35 +09:00
a657d1c774 New translations ja.yml (French) 2018-08-19 04:01:33 +09:00
f3936a79aa Fix #2335 2018-08-19 04:01:10 +09:00
78b560d89a #2324 2018-08-19 03:56:44 +09:00
2fc6313380 Fix #2325 2018-08-19 03:36:51 +09:00
c2b882a5d7 Improve cpu and memory chart in control panel 2018-08-19 03:32:01 +09:00
667b18fe24 Refactoring 2018-08-19 03:06:23 +09:00
60c0dac5f2 Merge pull request #2311 from acid-chicken/patch-autogen
[AUTOMATED] Update README.md
2018-08-19 01:14:48 +09:00
79f3e60dac Merge pull request #2331 from syuilo/l10n_master
New Crowdin translations
2018-08-19 01:14:00 +09:00
c4e04d6bf2 New translations ja.yml (English) 2018-08-19 01:01:20 +09:00
49f8219e54 Merge pull request #2286 from syuilo/l10n_master
New Crowdin translations
2018-08-19 00:58:02 +09:00
abd873e0a8 Create README.md 2018-08-19 00:57:40 +09:00
0e45d0d47f Merge branch 'master' into l10n_master 2018-08-19 00:55:07 +09:00
043b66f5da Merge pull request #2330 from syuilo/patch
Clean up
2018-08-19 00:52:10 +09:00
5d6e1fc391 New translations ja.yml (Japanese (Kansai-ben)) 2018-08-19 00:51:23 +09:00
fe292e77de New translations ja.yml (Catalan) 2018-08-19 00:51:20 +09:00
c996b5d0c8 New translations ja.yml (Portuguese) 2018-08-19 00:51:18 +09:00
7beb592f0c New translations ja.yml (Korean) 2018-08-19 00:51:16 +09:00
b3b11acd96 New translations ja.yml (Polish) 2018-08-19 00:51:14 +09:00
3bcdfbbd00 New translations ja.yml (Chinese Simplified) 2018-08-19 00:51:11 +09:00
fdad5d149f New translations ja.yml (Italian) 2018-08-19 00:51:09 +09:00
2e712a9212 New translations ja.yml (Russian) 2018-08-19 00:51:07 +09:00
86c8e634bb New translations ja.yml (English) 2018-08-19 00:51:05 +09:00
197a9306c4 New translations ja.yml (Spanish) 2018-08-19 00:51:03 +09:00
2e502a6b61 New translations ja.yml (German) 2018-08-19 00:51:00 +09:00
aa8a40e950 New translations ja.yml (French) 2018-08-19 00:50:58 +09:00
2f45ac3712 Merge pull request #2329 from syuilo/improve-chart
Improve chart
2018-08-19 00:46:17 +09:00
8ecf3db608 Add drive chart 2018-08-19 00:45:54 +09:00
f59c68022f Fix bug 2018-08-19 00:42:09 +09:00
7aac2c4e29 Clean up 2018-08-19 00:31:25 +09:00
0481de6629 wip 2018-08-19 00:27:23 +09:00
f59d0a75e4 missing semicolon 2018-08-19 00:20:36 +09:00
22f4b3cc7b missing semicolon 2018-08-19 00:20:36 +09:00
a4283c415a improve html to MFM 2018-08-19 00:20:36 +09:00
c0fbcee38a improve MFM to html 2018-08-19 00:20:36 +09:00
335200c31e wip 2018-08-18 23:56:44 +09:00
df71c90f9f wip 2018-08-18 23:48:54 +09:00
4220bdc963 New translations ja.yml (Japanese (Kansai-ben)) 2018-08-18 23:41:44 +09:00
97f3b1e46f New translations ja.yml (Catalan) 2018-08-18 23:41:42 +09:00
3a9dc358f8 New translations ja.yml (Portuguese) 2018-08-18 23:41:40 +09:00
2a3ab46a3d New translations ja.yml (Korean) 2018-08-18 23:41:37 +09:00
200a01f65f New translations ja.yml (Polish) 2018-08-18 23:41:34 +09:00
e68936911d New translations ja.yml (Chinese Simplified) 2018-08-18 23:41:32 +09:00
634ffeec54 New translations ja.yml (Italian) 2018-08-18 23:41:30 +09:00
8486cb785d New translations ja.yml (Russian) 2018-08-18 23:41:28 +09:00
a9eda4e6e2 New translations ja.yml (English) 2018-08-18 23:41:25 +09:00
f918f9b307 New translations ja.yml (Spanish) 2018-08-18 23:41:23 +09:00
d404d02d2d New translations ja.yml (German) 2018-08-18 23:41:21 +09:00
61f7a3974f New translations ja.yml (French) 2018-08-18 23:41:19 +09:00
cad8e4dea2 Update ja.yml 2018-08-18 23:39:25 +09:00
ef79903811 wip 2018-08-18 23:23:55 +09:00
c3cd0451ad wip 2018-08-18 23:15:16 +09:00
773fe28fcb wip 2018-08-18 20:26:01 +09:00
69e2576387 wip 2018-08-18 20:22:56 +09:00
908a5a1bb4 New translations ja.yml (Japanese (Kansai-ben)) 2018-08-18 19:21:12 +09:00
ffbd9ffc75 New translations ja.yml (English) 2018-08-18 18:21:27 +09:00
96223dd5e3 New translations ja.yml (English) 2018-08-18 17:57:09 +09:00
3231f12b93 Merge pull request #2319 from acid-chicken/patch-1
Add 関西弁
2018-08-18 17:13:22 +09:00
1408f39d9a Update ja-ks.yml 2018-08-18 17:07:25 +09:00
4ba06541aa Update ja-ks.yml 2018-08-18 17:07:00 +09:00
5c78ed645a Update index.js 2018-08-18 17:04:00 +09:00
33e19447aa Create ja-ks.yml 2018-08-18 17:02:56 +09:00
b52d995719 Fix typo 2018-08-18 13:12:29 +09:00
db5b90c093 New translations ja.yml (Catalan) 2018-08-18 13:11:48 +09:00
39bc75a7f9 New translations ja.yml (Portuguese) 2018-08-18 13:11:46 +09:00
3492067ecf New translations ja.yml (Korean) 2018-08-18 13:11:43 +09:00
e342a8da05 New translations ja.yml (Polish) 2018-08-18 13:11:40 +09:00
671d71dd47 New translations ja.yml (Chinese Simplified) 2018-08-18 13:11:38 +09:00
2f18d2ed8f New translations ja.yml (Italian) 2018-08-18 13:11:35 +09:00
f6e8165db0 New translations ja.yml (Russian) 2018-08-18 13:11:33 +09:00
eab3b22772 New translations ja.yml (English) 2018-08-18 13:11:31 +09:00
7664aa5a8c New translations ja.yml (Spanish) 2018-08-18 13:11:29 +09:00
a366392cbe New translations ja.yml (German) 2018-08-18 13:11:27 +09:00
c8c1bc09f9 New translations ja.yml (French) 2018-08-18 13:11:24 +09:00
11bb1608cf Resolve #2293 2018-08-18 13:09:15 +09:00
b1d77775aa Update README.md [AUTOGEN] 2018-08-18 11:02:58 +09:00
bc3f5e0d78 Merge pull request #2310 from sei0o/fix-1776
fix #1776
2018-08-18 07:54:49 +09:00
53ea709697 fix #1776 2018-08-18 07:53:06 +09:00
b7adbbb9bf 6.4.1 2018-08-18 06:01:55 +09:00
31aaf559ac Fix bug 2018-08-18 05:46:57 +09:00
160185b108 Fix bug 2018-08-18 05:43:09 +09:00
848ff4440b New translations ja.yml (English) 2018-08-18 05:32:18 +09:00
74291b2cae New translations ja.yml (Catalan) 2018-08-18 05:23:00 +09:00
ae6c4e0c5f New translations ja.yml (Portuguese) 2018-08-18 05:22:57 +09:00
ecb1840e27 New translations ja.yml (Korean) 2018-08-18 05:22:54 +09:00
42eb82a859 New translations ja.yml (Polish) 2018-08-18 05:22:52 +09:00
89a22908ce New translations ja.yml (Chinese Simplified) 2018-08-18 05:22:49 +09:00
bc3a94aa57 New translations ja.yml (Italian) 2018-08-18 05:22:47 +09:00
77fe579d9b New translations ja.yml (Russian) 2018-08-18 05:22:45 +09:00
e8c7803a2f New translations ja.yml (English) 2018-08-18 05:22:43 +09:00
1abaef624c New translations ja.yml (Spanish) 2018-08-18 05:22:40 +09:00
72cf2344a9 New translations ja.yml (German) 2018-08-18 05:22:38 +09:00
0462512e62 New translations ja.yml (French) 2018-08-18 05:22:36 +09:00
1d6b2bd969 6.4.0 2018-08-18 05:21:45 +09:00
5df90fdc4a l10n 2018-08-18 05:15:39 +09:00
607a5326d9 Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-18 05:05:48 +09:00
2cbd35acc4 🎨 2018-08-18 05:05:39 +09:00
9a0224ee21 🎨 2018-08-18 05:00:54 +09:00
2beedc5978 Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-18 04:52:15 +09:00
6d53e64798 Improve control panel 2018-08-18 04:52:06 +09:00
3478cdea08 Merge pull request #2304 from acid-chicken/acid-chicken-patch-4
Update README.md
2018-08-18 04:39:36 +09:00
b360f2ed45 Update README.md 2018-08-18 04:34:44 +09:00
7b0c4c29b4 Merge pull request #2303 from syuilo/update-readme
Update README.md
2018-08-18 04:29:29 +09:00
03f5d7575c Update README.md 2018-08-18 04:27:58 +09:00
e922d8904c Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-18 04:22:00 +09:00
45b55a8c98 Update rate limit setting 2018-08-18 04:21:49 +09:00
8973b76bda Merge pull request #2302 from syuilo/kao-to-faces
Fix #2301
2018-08-18 04:20:57 +09:00
41cf856e26 Fix #2301 2018-08-18 04:13:25 +09:00
b7aeb10304 Merge pull request #2300 from syuilo/delete-autogen
Delete .autogen
2018-08-18 04:05:47 +09:00
b8d9c1aa45 Delete .autogen 2018-08-18 04:05:00 +09:00
d7dbe503b6 🎨 2018-08-18 03:59:56 +09:00
c625dd074a Merge pull request #2299 from syuilo/new-kao
Add new kao
2018-08-18 03:56:30 +09:00
f8a977f1c0 Add new kao 2018-08-18 03:55:45 +09:00
c35e760fd3 Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-18 03:52:46 +09:00
bc34ac82cf Show some charts in control panel 2018-08-18 03:52:24 +09:00
98f25c9159 6.3.2 2018-08-18 03:37:56 +09:00
ae9c13df66 6.3.1 2018-08-18 03:37:10 +09:00
9f8d21b2bc Fix #2298 2018-08-18 03:36:13 +09:00
e05e97561a New translations ja.yml (French) 2018-08-18 01:42:31 +09:00
f9d21fd34a New translations ja.yml (French) 2018-08-18 01:21:26 +09:00
86aef5f3e0 New translations ja.yml (French) 2018-08-18 01:12:29 +09:00
e6bc7922ac New translations ja.yml (French) 2018-08-18 01:01:48 +09:00
b2f40b7d3e New translations ja.yml (French) 2018-08-18 00:51:35 +09:00
3878793405 New translations ja.yml (English) 2018-08-18 00:42:00 +09:00
33c7aef220 New translations ja.yml (French) 2018-08-18 00:41:58 +09:00
e927f7a4ec New translations ja.yml (English) 2018-08-18 00:32:15 +09:00
cd09fa5a28 Merge pull request #2297 from syuilo/update-readme
✌️☀️☁️❄️✌️
2018-08-17 23:20:58 +09:00
9ca9757418 ✌️☀️☁️❄️✌️ 2018-08-17 23:19:24 +09:00
1fae2ffc37 Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-17 23:07:01 +09:00
71657ddb98 🎨 2018-08-17 23:06:58 +09:00
63845e0ba7 Merge pull request #2294 from acid-chicken/patch-1
Resolve #2291
2018-08-17 22:38:40 +09:00
6781b68d33 Delete README.foot.md 2018-08-17 22:37:11 +09:00
d058eff59a Update and rename README.head.md to README.md 2018-08-17 22:36:38 +09:00
f409faea2c New translations ja.yml (Catalan) 2018-08-17 21:52:08 +09:00
77da98cd39 New translations ja.yml (Portuguese) 2018-08-17 21:52:06 +09:00
471afcbd57 New translations ja.yml (Korean) 2018-08-17 21:52:04 +09:00
72809f9d78 New translations ja.yml (Polish) 2018-08-17 21:52:01 +09:00
743fb45c3c New translations ja.yml (Chinese Simplified) 2018-08-17 21:51:59 +09:00
93d6b71a31 New translations ja.yml (Italian) 2018-08-17 21:51:57 +09:00
9b10e93fba New translations ja.yml (Russian) 2018-08-17 21:51:55 +09:00
0740837b6a New translations ja.yml (English) 2018-08-17 21:51:52 +09:00
ff49eacee4 New translations ja.yml (Spanish) 2018-08-17 21:51:50 +09:00
fbc6b267ff New translations ja.yml (German) 2018-08-17 21:51:48 +09:00
10cae8894e New translations ja.yml (French) 2018-08-17 21:51:46 +09:00
42addfed85 Merge pull request #2292 from syuilo/patch-2271
Resolve #2271
2018-08-17 21:43:15 +09:00
0dd6494ab9 fix(package): update url-loader to version 1.1.1 2018-08-17 21:41:42 +09:00
9f4c6a3aef Resolve #2271 2018-08-17 21:40:08 +09:00
9438dc560d New translations ja.yml (Catalan) 2018-08-17 21:32:40 +09:00
003ef65b59 New translations ja.yml (Portuguese) 2018-08-17 21:32:37 +09:00
978fb7e63a New translations ja.yml (Korean) 2018-08-17 21:32:35 +09:00
6203577696 New translations ja.yml (Polish) 2018-08-17 21:32:33 +09:00
f2b61f6a7e New translations ja.yml (Chinese Simplified) 2018-08-17 21:32:29 +09:00
6f4aa69723 New translations ja.yml (Italian) 2018-08-17 21:32:27 +09:00
b308e1bb2b New translations ja.yml (Russian) 2018-08-17 21:32:25 +09:00
ab3dad2d84 New translations ja.yml (English) 2018-08-17 21:32:23 +09:00
0af103f399 New translations ja.yml (Spanish) 2018-08-17 21:32:20 +09:00
873608a7de New translations ja.yml (German) 2018-08-17 21:32:18 +09:00
b04ad167da New translations ja.yml (French) 2018-08-17 21:32:15 +09:00
ad0d06c0d8 #332 2018-08-17 21:29:06 +09:00
151476ae8a New translations ja.yml (English) 2018-08-17 19:41:43 +09:00
fbf43c1450 Fix bug 2018-08-17 19:38:39 +09:00
35a1fa5bf0 6.3.0 2018-08-17 19:37:06 +09:00
8d3f71d490 Fix bug 2018-08-17 19:35:05 +09:00
2239eddf88 New translations ja.yml (Catalan) 2018-08-17 19:32:18 +09:00
94ea21d482 New translations ja.yml (Portuguese) 2018-08-17 19:32:15 +09:00
6a39f92431 New translations ja.yml (Korean) 2018-08-17 19:32:12 +09:00
7b2efa35c7 New translations ja.yml (Polish) 2018-08-17 19:32:09 +09:00
c41ea84568 New translations ja.yml (Chinese Simplified) 2018-08-17 19:32:06 +09:00
0e8262e623 New translations ja.yml (Italian) 2018-08-17 19:32:03 +09:00
4d97946943 New translations ja.yml (Russian) 2018-08-17 19:32:00 +09:00
96d48b5519 New translations ja.yml (English) 2018-08-17 19:31:57 +09:00
4cc54d081e New translations ja.yml (Spanish) 2018-08-17 19:31:55 +09:00
aab5a2ffbd New translations ja.yml (German) 2018-08-17 19:31:52 +09:00
c8f165b4ad New translations ja.yml (French) 2018-08-17 19:31:49 +09:00
9776d8e06b Merge pull request #2283 from sei0o/patch-2266
fix #2266
2018-08-17 19:24:10 +09:00
10f845ae76 Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-17 19:17:36 +09:00
2c8f962889 #2214 #2155 2018-08-17 19:17:23 +09:00
1721a82352 Merge pull request #2284 from acid-chicken/acid-chicken-patch-3
Auto-generate README
2018-08-17 18:50:17 +09:00
59bec546e4 Create README.foot.md 2018-08-17 18:34:35 +09:00
86503f2d69 Create README.head.md 2018-08-17 18:33:49 +09:00
e4b8c688bb fix #2266: デフォルト値を設定 2018-08-17 17:16:27 +09:00
4535ab4c43 fix #2266 2018-08-17 16:35:04 +09:00
dcdb57df9d Merge pull request #2270 from syuilo/l10n_master
New Crowdin translations
2018-08-17 14:57:51 +09:00
cfc2808c56 New translations ja.yml (English) 2018-08-17 14:51:21 +09:00
4a3d74c608 Merge branch 'master' into l10n_master 2018-08-17 14:48:38 +09:00
e18655d18f Merge pull request #2279 from syuilo/enhance-note-footer
Enhance note footer
2018-08-17 14:43:25 +09:00
12b4b78763 New translations ja.yml (Catalan) 2018-08-17 13:21:27 +09:00
550a528fc1 New translations ja.yml (Portuguese) 2018-08-17 13:21:25 +09:00
4e3429a5c7 New translations ja.yml (Korean) 2018-08-17 13:21:22 +09:00
ef98383075 New translations ja.yml (Polish) 2018-08-17 13:21:20 +09:00
d66d1f142f New translations ja.yml (Chinese Simplified) 2018-08-17 13:21:17 +09:00
c896055cb1 New translations ja.yml (Italian) 2018-08-17 13:21:15 +09:00
2e8b2e0cf9 New translations ja.yml (Russian) 2018-08-17 13:21:13 +09:00
59012b5693 New translations ja.yml (English) 2018-08-17 13:21:11 +09:00
dfb51e8d26 New translations ja.yml (Spanish) 2018-08-17 13:21:09 +09:00
5107824352 New translations ja.yml (German) 2018-08-17 13:21:07 +09:00
bf7ec18316 New translations ja.yml (French) 2018-08-17 13:21:04 +09:00
77d82d2d17 Merge pull request #2282 from sei0o/improve-login-failed-message
ログイン失敗時のメッセージを改善
2018-08-17 13:19:41 +09:00
2777460150 Merge pull request #2278 from mei23/mei-0817-announce3
Misskey => Misskey で renote 出来ない件修正
2018-08-17 13:18:11 +09:00
9476a240d9 ログイン失敗時のメッセージを改善 2018-08-17 12:34:07 +09:00
bddb878931 New translations ja.yml (English) 2018-08-17 10:01:12 +09:00
b0768d8a4a New translations ja.yml (English) 2018-08-17 09:51:19 +09:00
46bb7f9efb New translations ja.yml (English) 2018-08-17 09:41:18 +09:00
a507b7c0b0 Enhance note footer 2018-08-17 07:16:56 +09:00
939c0dc5f9 Fix indent 2018-08-17 06:46:32 +09:00
a89c206572 Fix Announce Activity 2018-08-17 06:40:50 +09:00
8b55263e72 New translations ja.yml (Catalan) 2018-08-17 06:11:53 +09:00
f2ad1e4639 New translations ja.yml (Portuguese) 2018-08-17 06:11:51 +09:00
0fbcec1c16 New translations ja.yml (Korean) 2018-08-17 06:11:48 +09:00
ec2b73d076 New translations ja.yml (Polish) 2018-08-17 06:11:46 +09:00
6630bb0b39 New translations ja.yml (Chinese Simplified) 2018-08-17 06:11:43 +09:00
bef0d4c8bd New translations ja.yml (Italian) 2018-08-17 06:11:41 +09:00
a57cb3bd31 New translations ja.yml (Russian) 2018-08-17 06:11:38 +09:00
1e4577a988 New translations ja.yml (English) 2018-08-17 06:11:36 +09:00
fe792b5bbb New translations ja.yml (Spanish) 2018-08-17 06:11:33 +09:00
d4005133d0 New translations ja.yml (German) 2018-08-17 06:11:31 +09:00
abe8e80268 New translations ja.yml (French) 2018-08-17 06:11:28 +09:00
e38e4940b4 Merge pull request #2277 from syuilo/patch-2276
Resolve #2276
2018-08-17 06:06:07 +09:00
48dc1678c3 Resolve #2276 2018-08-17 06:04:09 +09:00
431383ab54 Clean up 2018-08-17 05:33:20 +09:00
7a8d252f63 Merge pull request #2272 from mei23/mei-0817-debuglog
production以外のときに`npm run debug`が効かないのを修正
2018-08-17 04:04:18 +09:00
04525e2997 New translations ja.yml (Catalan) 2018-08-17 03:52:03 +09:00
a2f96f3f20 New translations ja.yml (Portuguese) 2018-08-17 03:52:01 +09:00
a81ecb0b28 New translations ja.yml (Korean) 2018-08-17 03:51:59 +09:00
1122368ee0 New translations ja.yml (Polish) 2018-08-17 03:51:56 +09:00
6c54328391 New translations ja.yml (Chinese Simplified) 2018-08-17 03:51:54 +09:00
1a26816f7a New translations ja.yml (Italian) 2018-08-17 03:51:52 +09:00
8538334d08 New translations ja.yml (Russian) 2018-08-17 03:51:50 +09:00
9387ebc569 New translations ja.yml (English) 2018-08-17 03:51:48 +09:00
c99dce68ed New translations ja.yml (Spanish) 2018-08-17 03:51:46 +09:00
6dea84c6d2 New translations ja.yml (German) 2018-08-17 03:51:44 +09:00
39060374c2 Fix npm run debug not working 2018-08-17 03:51:42 +09:00
d3ebb5d13f New translations ja.yml (French) 2018-08-17 03:51:41 +09:00
4e7c10d3d9 Merge pull request #2269 from syuilo/verified-user-ja
Update verified-user in ja.yml
2018-08-17 03:47:58 +09:00
e93ea66d2d Update verified-user in ja.yml 2018-08-17 03:47:08 +09:00
152dd70ea5 Merge pull request #2268 from syuilo/space-between-words
Add a space between the words
2018-08-17 03:18:52 +09:00
7b94cf9f84 Add a space between the words 2018-08-17 03:08:17 +09:00
d70e27a865 Provide id in announce activity 2018-08-17 02:37:20 +09:00
b780ea336c 6.2.0 2018-08-17 00:39:30 +09:00
bd9f589d32 Merge pull request #2255 from syuilo/l10n_master
New Crowdin translations
2018-08-17 00:38:30 +09:00
d9d18bd8f9 New translations ja.yml (English) 2018-08-17 00:33:59 +09:00
ffdaa6bc56 Use thumbnail 2018-08-17 00:27:36 +09:00
c7f60e337e New translations ja.yml (English) 2018-08-17 00:23:38 +09:00
7f265dbd52 New translations ja.yml (Catalan) 2018-08-17 00:22:15 +09:00
8929c5cabc New translations ja.yml (Portuguese) 2018-08-17 00:22:12 +09:00
4a610f3b0a New translations ja.yml (Korean) 2018-08-17 00:22:09 +09:00
55ec19edb5 New translations ja.yml (Polish) 2018-08-17 00:22:07 +09:00
c319c61832 New translations ja.yml (Chinese Simplified) 2018-08-17 00:22:05 +09:00
66db99b8cd New translations ja.yml (Italian) 2018-08-17 00:22:02 +09:00
ff2162974d New translations ja.yml (Russian) 2018-08-17 00:22:00 +09:00
78e86af086 New translations ja.yml (English) 2018-08-17 00:21:57 +09:00
2dcf89eecf New translations ja.yml (Spanish) 2018-08-17 00:21:55 +09:00
fdf94be998 New translations ja.yml (German) 2018-08-17 00:21:53 +09:00
0e913a5727 New translations ja.yml (French) 2018-08-17 00:21:50 +09:00
f3be077adc Fix bug 2018-08-17 00:19:27 +09:00
a6e0471f8c ✌️ 2018-08-17 00:13:52 +09:00
c5d734f9ad 6.1.0 2018-08-17 00:09:01 +09:00
ee12d887ae typo 2018-08-17 00:07:23 +09:00
b78d24be1e Fix bug 2018-08-17 00:05:57 +09:00
d5379e2b36 autoWatchをデフォルトでfalseに 2018-08-17 00:04:07 +09:00
cf36557084 New translations ja.yml (Catalan) 2018-08-17 00:00:54 +09:00
fd1ee129dc New translations ja.yml (Portuguese) 2018-08-17 00:00:51 +09:00
1471b7a6b5 New translations ja.yml (Korean) 2018-08-17 00:00:49 +09:00
1d39d7efcb New translations ja.yml (Polish) 2018-08-17 00:00:46 +09:00
69ee97f6e2 New translations ja.yml (Chinese Simplified) 2018-08-17 00:00:44 +09:00
12092e6083 New translations ja.yml (Italian) 2018-08-17 00:00:41 +09:00
6e29e40b8b New translations ja.yml (Russian) 2018-08-17 00:00:39 +09:00
842c9e735b New translations ja.yml (English) 2018-08-17 00:00:37 +09:00
2f63a25058 New translations ja.yml (Spanish) 2018-08-17 00:00:33 +09:00
d3b084003c New translations ja.yml (German) 2018-08-17 00:00:31 +09:00
0da9d3d8b0 New translations ja.yml (French) 2018-08-17 00:00:27 +09:00
58f3c6aab7 Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-16 23:59:25 +09:00
22e79675ad #2263 2018-08-16 23:59:22 +09:00
e5c350d740 Fix bug 2018-08-16 23:33:11 +09:00
210124ac34 New translations ja.yml (English) 2018-08-16 21:24:31 +09:00
7f9a35d7ac Improve object storage key 2018-08-16 21:23:31 +09:00
71a30f9001 New translations ja.yml (Korean) 2018-08-16 21:02:39 +09:00
95a34d55fb New translations ja.yml (English) 2018-08-16 21:02:36 +09:00
34f052b672 New translations ja.yml (Korean) 2018-08-16 20:51:53 +09:00
0178c2e696 New translations ja.yml (English) 2018-08-16 20:51:51 +09:00
5cb0c07627 New translations ja.yml (English) 2018-08-16 20:24:07 +09:00
d8fdbfe164 New translations ja.yml (English) 2018-08-16 20:11:53 +09:00
74e0b2734d New translations ja.yml (English) 2018-08-16 20:06:07 +09:00
3f5785bd03 New translations ja.yml (English) 2018-08-16 17:43:46 +09:00
15e5c69c15 New translations ja.yml (English) 2018-08-16 17:32:01 +09:00
57019c0b40 New translations ja.yml (English) 2018-08-16 09:01:03 +09:00
134 changed files with 4024 additions and 1714 deletions

View File

@ -5,6 +5,15 @@ ChangeLog
This document describes breaking changes only.
7.0.0
-----
### Migration
起動する前に、`node cli/migration/7.0.0`してください。
Please run `node cli/migration/7.0.0` before launch.
6.0.0
-----

View File

@ -7,10 +7,12 @@
[![][dependencies-badge]][dependencies-link]
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![Greenkeeper badge](https://badges.greenkeeper.io/syuilo/misskey.svg)](https://greenkeeper.io/)
**Microblogging. Redefined.**
Sophisticated microblogging platform, evolving forever.
**[Misskey](https://misskey.xyz)** is a completely open source,
ultimately sophisticated professional microblogging software.
[Misskey](https://misskey.xyz) is a decentralized microblogging platform born on Earth.
Since it exists within the Fediverse (a universe where various social media platforms are organized),
it is mutually linked with other social media platforms.
Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?
<a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a>
@ -28,7 +30,7 @@ ultimately sophisticated professional microblogging software.
and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz).
:package: Create your instance
:package: Create your own instance
----------------------------------------------------------------
If you want to run your own instance of Misskey,
please see [Setup and installation guide](./docs/setup.en.md).
@ -37,40 +39,52 @@ please see [Setup and installation guide](./docs/setup.en.md).
----------------------------------------------------------------
**[PR](https://github.com/syuilo/misskey/pulls)s welcome!**
If you want to...
* i18n ... please see [Translation guide](./docs/translate.en.md).
* l10n ... please visit https://crowdin.com/project/misskey
### i18n
Please see [Translation guide](./docs/translate.en.md).
### l10n
Misskey is using Crowdin for l10n.
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/misskey/localized.svg)](https://crowdin.com/project/misskey)
:heart: Backers & Sponsors
----------------------------------------------------------------
<table>
<tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=tB1e_r8RlZ5sFL0KV_e8dugapxatNBRK1Z3h67TO1g8%3D"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12378075/0156f769e20f412594fa6b87d85fe228/1?token-time=2145916800&token-hash=IsIJRUXszzoD6-7pDnRY8I05T9nSznc4GTaxj7C9SwU%3D"></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"></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"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12959468/c249e15aebec4424b5c0f427173671b6/1?token-time=2145916800&token-hash=lubpCEdxAkxPlpR2O6bvZ7BIh8Q4nGf-U_mE1qpjVAQ%3D"></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"></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"></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"></td>
<td><img src="https://c8.patreon.com/2/100/12718187"></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"></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"></td>
</tr>
<tr>
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
<td><a href="https://www.patreon.com/user/creators?u=12378075">39ff</a></td>
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
<td><a href="https://www.patreon.com/user/creators?u=12531784">Takashi Shibuya</a></td>
<td><a href="https://www.patreon.com/fujishan">fujishan</a></td>
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</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=12731202">negao</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=12931605">Reiju</a></td>
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
</tr>
</table>
<!-- PATREON_START -->
<table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12378075/0156f769e20f412594fa6b87d85fe228/1?token-time=2145916800&token-hash=IsIJRUXszzoD6-7pDnRY8I05T9nSznc4GTaxj7C9SwU%3D" alt="39ff"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/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/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://c8.patreon.com/2/100/12718187" alt="Peter G."></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D" alt="Naoki Kosaka"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12931605/ead494101f364dffa90efe49e36fb494/1?token-time=2145916800&token-hash=NzSFPjIlodXyv41rwK61aZWVZWfI4surJaNj8vWKvqM%3D" alt="Reiju"></td>
</tr><tr>
<td><a href="https://www.patreon.com/user?u=12378075">39ff</a></td>
<td><a href="https://www.patreon.com/user?u=12731202">negao</a></td>
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</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/user?u=12718187">Peter G.</a></td>
<td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td>
<td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td>
</tr></table>
<table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4950409/28e7d016209243759d9316be2e21381d/2?token-time=2145916800&token-hash=LuEaDkchH3GQWUcTOhBQ8xfKQYF0s5FjlZRd7Yduia8%3D" alt="mikan54951"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12959468/c249e15aebec4424b5c0f427173671b6/1?token-time=2145916800&token-hash=lubpCEdxAkxPlpR2O6bvZ7BIh8Q4nGf-U_mE1qpjVAQ%3D" alt="fujishan"></td>
</tr><tr>
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
<td><a href="https://www.patreon.com/user?u=4950409">mikan54951</a></td>
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
<td><a href="https://www.patreon.com/fujishan">fujishan</a></td>
</tr></table>
**Last updated:** Sat, 18 Aug 2018 02:02:58 UTC
<!-- PATREON_END -->
:four_leaf_clover: Copyright
----------------------------------------------------------------

View File

@ -1,101 +0,0 @@
const chalk = require('chalk');
const log = require('single-line-log').stdout;
const sequential = require('promise-sequential');
const { default: DriveFile, DriveFileChunk } = require('../built/models/drive-file');
const { default: DriveFileThumbnail, DriveFileThumbnailChunk } = require('../built/models/drive-file-thumbnail');
const { default: User } = require('../built/models/user');
const q = {
'metadata._user.host': {
$ne: null
},
'metadata.withoutChunks': false
};
async function main() {
const promiseGens = [];
const count = await DriveFile.count(q);
let prev;
for (let i = 0; i < count; i++) {
promiseGens.push(() => {
const promise = new Promise(async (res, rej) => {
const file = await DriveFile.findOne(prev ? Object.assign({
_id: { $lt: prev._id }
}, q) : q, {
sort: {
_id: -1
}
});
prev = file;
function skip() {
res([i, file, false]);
}
if (file == null) return skip();
log(chalk`{gray ${i}} scanning {bold ${file._id}} ${file.filename} ...`);
const attachingUsersCount = await User.count({
$or: [{
avatarId: file._id
}, {
bannerId: file._id
}]
}, { limit: 1 });
if (attachingUsersCount !== 0) return skip();
Promise.all([
// チャンクをすべて削除
DriveFileChunk.remove({
files_id: file._id
}),
DriveFile.update({ _id: file._id }, {
$set: {
'metadata.withoutChunks': true
}
})
]).then(async () => {
res([i, file, true]);
//#region サムネイルもあれば削除
const thumbnail = await DriveFileThumbnail.findOne({
'metadata.originalId': file._id
});
if (thumbnail) {
DriveFileThumbnailChunk.remove({
files_id: thumbnail._id
});
DriveFileThumbnail.remove({ _id: thumbnail._id });
}
//#endregion
});
});
promise.then(([i, file, deleted]) => {
if (deleted) {
log(chalk`{gray ${i}} {red deleted: {bold ${file._id}} ${file.filename}}`);
} else {
log(chalk`{gray ${i}} {green skipped: {bold ${file._id}} ${file.filename}}`);
}
log.clear();
console.log();
});
return promise;
});
}
return await sequential(promiseGens);
}
main().then(() => {
console.log('ALL DONE');
}).catch(console.error);

View File

@ -1,80 +0,0 @@
const chalk = require('chalk');
const log = require('single-line-log').stdout;
const sequential = require('promise-sequential');
const { default: DriveFile, deleteDriveFile } = require('../built/models/drive-file');
const { default: Note } = require('../built/models/note');
const { default: MessagingMessage } = require('../built/models/messaging-message');
const { default: User } = require('../built/models/user');
async function main() {
const promiseGens = [];
const count = await DriveFile.count({});
let prev;
for (let i = 0; i < count; i++) {
promiseGens.push(() => {
const promise = new Promise(async (res, rej) => {
const file = await DriveFile.findOne(prev ? {
_id: { $lt: prev._id }
} : {}, {
sort: {
_id: -1
}
});
prev = file;
function skip() {
res([i, file, false]);
}
if (file == null) return skip();
log(chalk`{gray ${i}} scanning {bold ${file._id}} ${file.filename} ...`);
const attachingUsersCount = await User.count({
$or: [{
avatarId: file._id
}, {
bannerId: file._id
}]
}, { limit: 1 });
if (attachingUsersCount !== 0) return skip();
const attachingNotesCount = await Note.count({
mediaIds: file._id
}, { limit: 1 });
if (attachingNotesCount !== 0) return skip();
const attachingMessagesCount = await MessagingMessage.count({
fileId: file._id
}, { limit: 1 });
if (attachingMessagesCount !== 0) return skip();
deleteDriveFile(file).then(() => {
res([i, file, true]);
}).catch(rej);
});
promise.then(([i, file, deleted]) => {
if (deleted) {
log(chalk`{gray ${i}} {red deleted: {bold ${file._id}} ${file.filename}}`);
} else {
log(chalk`{gray ${i}} {green skipped: {bold ${file._id}} ${file.filename}}`);
}
log.clear();
console.log();
});
return promise;
});
}
return await sequential(promiseGens);
}
main().then(() => {
console.log('done');
}).catch(console.error);

134
cli/migration/7.0.0.js Normal file
View File

@ -0,0 +1,134 @@
const { default: Stats } = require('../../built/models/stats');
const { default: User } = require('../../built/models/user');
const { default: Note } = require('../../built/models/note');
const { default: DriveFile } = require('../../built/models/drive-file');
const now = new Date();
const y = now.getFullYear();
const m = now.getMonth();
const d = now.getDate();
const today = new Date(y, m, d);
async function main() {
const localUsersCount = await User.count({
host: null
});
const remoteUsersCount = await User.count({
host: { $ne: null }
});
const localNotesCount = await Note.count({
'_user.host': null
});
const remoteNotesCount = await Note.count({
'_user.host': { $ne: null }
});
const localDriveFilesCount = await DriveFile.count({
'metadata._user.host': null
});
const remoteDriveFilesCount = await DriveFile.count({
'metadata._user.host': { $ne: null }
});
const localDriveFilesSize = await DriveFile
.aggregate([{
$match: {
'metadata._user.host': null,
'metadata.deletedAt': { $exists: false }
}
}, {
$project: {
length: true
}
}, {
$group: {
_id: null,
usage: { $sum: '$length' }
}
}])
.then(aggregates => {
if (aggregates.length > 0) {
return aggregates[0].usage;
}
return 0;
});
const remoteDriveFilesSize = await DriveFile
.aggregate([{
$match: {
'metadata._user.host': { $ne: null },
'metadata.deletedAt': { $exists: false }
}
}, {
$project: {
length: true
}
}, {
$group: {
_id: null,
usage: { $sum: '$length' }
}
}])
.then(aggregates => {
if (aggregates.length > 0) {
return aggregates[0].usage;
}
return 0;
});
await Stats.insert({
date: today,
users: {
local: {
total: localUsersCount,
diff: 0
},
remote: {
total: remoteUsersCount,
diff: 0
}
},
notes: {
local: {
total: localNotesCount,
diff: 0,
diffs: {
normal: 0,
reply: 0,
renote: 0
}
},
remote: {
total: remoteNotesCount,
diff: 0,
diffs: {
normal: 0,
reply: 0,
renote: 0
}
}
},
drive: {
local: {
totalCount: localDriveFilesCount,
totalSize: localDriveFilesSize,
diffCount: 0,
diffSize: 0
},
remote: {
totalCount: remoteDriveFilesCount,
totalSize: remoteDriveFilesSize,
diffCount: 0,
diffSize: 0
}
}
});
console.log('done');
}
main();

View File

@ -33,14 +33,3 @@ node cli/suspend @syuilo@misskey.xyz
``` shell
node cli/reset-password (User-ID or Username)
```
## Clean up cached remote files
``` shell
node cli/clean-cached-remote-files
```
## Clean up unused drive files
``` shell
node cli/clean-unused-drive-files
```
> We recommend that you announce a user that unused drive files will be deleted before performing this operation, as it may delete the user's important files.

View File

@ -33,14 +33,3 @@ node cli/suspend @syuilo@misskey.xyz
``` shell
node cli/reset-password (ユーザーID または ユーザー名)
```
## キャッシュされたリモートファイルをクリーンアップする
``` shell
node cli/clean-cached-remote-files
```
## 使われていないドライブのファイルをクリーンアップする
``` shell
node cli/clean-unused-drive-files
```
> ユーザーの大事なファイルを削除する可能性があるので、この操作を実行する前にユーザーに告知することをお勧めします。

5
locales/README.md Normal file
View File

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

View File

@ -84,7 +84,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "引き分け"
@ -287,7 +287,10 @@ common/views/components/signin.vue:
signin: "サインイン"
or: "または"
signin-with-twitter: "Twitterでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue:
invitation-code: "招待コード"
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
username: "ユーザー名"
checking: "確認しています..."
available: "利用できます"
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue:
avatar: "アイコン"
banner: "バナー"
nsfw: "閲覧注意"
contextmenu:
rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定"
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
original-users: "このインスタンスのユーザー"
all-notes: "全てのノート"
original-notes: "このインスタンスのノート"
invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結"
suspend: "凍結"
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする"
verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-available: "検索機能はインスタンスの設定で無効になっています。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "{}で共有"
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue:
download: "ダウンロード"
rename: "名前を変更"
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
show-local-renotes: "ローカルの投稿のRenoteを表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"

View File

@ -84,7 +84,7 @@ common:
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "引き分け"
@ -287,7 +287,10 @@ common/views/components/signin.vue:
signin: "Anmelden"
or: "または"
signin-with-twitter: "Twitterでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue:
invitation-code: "招待コード"
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
username: "Benutzername"
checking: "Überprüfung..."
available: "Verfügbar"
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue:
avatar: "Avatar"
banner: "Banner"
nsfw: "閲覧注意"
contextmenu:
rename: "Umbenennen"
mark-as-sensitive: "閲覧注意に設定"
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
circle-icons: "Kreisförmige Icons"
gradient-window-header: "Übergang in Fensterköpfen"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-reply-target: "Zeige Antworten"
show-my-renotes: "Zeige meine Reposts auf der Zeitleiste"
show-renoted-my-notes: "Zeige meine Reposts, die geteilt wurden, auf der Zeitleiste"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "Karte anzeigen"
show-maps-desc: "Zeige den Standort zu diesem Beitrag automatisch an."
sound: "Ton"
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
original-users: "このインスタンスのユーザー"
all-notes: "全てのノート"
original-notes: "このインスタンスのノート"
invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結"
suspend: "凍結"
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする"
verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
cancel: "Abbrechen"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-available: "検索機能はインスタンスの設定で無効になっています。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "{}で共有"
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue:
download: "ダウンロード"
rename: "名前を変更"
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
show-local-renotes: "ローカルの投稿のRenoteを表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"

View File

@ -16,7 +16,7 @@ common:
customization-tips:
title: "Customization tips"
paragraph1: "Home customization allows you to add/delete, drag and drop and rearrange widgets."
paragraph2: "You can change the display by <strong>right clicking</strong> on some widgets."
paragraph2: "You can change the display by <strong><strong>right</strong> clicking</strong> on some widgets."
paragraph3: "To delete a widget, drag and drop the widget onto <strong>the area labeled \"Trash\"</strong> in the header."
paragraph4: "To finish the customization, click \"Finish\" on the upper right."
gotit: "Got it!"
@ -72,9 +72,9 @@ common:
a: "What are you doing?"
b: "What's happening?"
c: "Whats on your mind?"
d: "What do you wish to say?"
d: "Would you post any words?"
e: "Write here"
f: "Waiting for your writing..."
f: "Waiting for your writing."
search: "Search"
delete: "Delete"
loading: "Loading"
@ -84,7 +84,7 @@ common:
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
i-like-sushi: "I prefer sushi rather than pudding"
show-reversi-board-labels: "Show row and column labels in Reversi"
verified-user: "Authorized User"
verified-user: "Verified account"
disable-animated-mfm: "Disable animated texts in a post"
reversi:
drawn: "Draw"
@ -141,11 +141,11 @@ common:
auth/views/form.vue:
share-access: "Would you <b>allow</b> <i>{{ app.name }}</i> to access your account?"
permission-ask: "This application requires the following permissions:"
account-read: "Viewing account information:"
account-write: "Modify account informations:"
account-read: "View account information."
account-write: "Modify account information."
note-write: "Post."
like-write: "To react to posts."
following-write: "Follow or unfollow."
like-write: "React to posts."
following-write: "Follow and unfollow."
drive-read: "Read your drive."
drive-write: "Upload/delete files in your drive."
notification-read: "Read your notifications."
@ -154,10 +154,10 @@ auth/views/form.vue:
accept: "Allow access."
auth/views/index.vue:
loading: "Loading"
denied: "Application authorization denied."
denied: "Application authorization has been denied."
denied-paragraph: "This application will not access your account."
already-authorized: "This application has already been authorized."
allowed: "Application authorizations allowed.+"
allowed: "Application authorizations allowed."
callback-url: "Going back to the application."
please-go-back: "Please go back to the application."
error: "Session does not exist."
@ -169,7 +169,7 @@ common/views/components/games/reversi/reversi.vue:
common/views/components/games/reversi/reversi.game.vue:
surrender: "Surrender"
surrendered: "By surrender"
is-llotheo: "The lesser one wins"
is-llotheo: "The lesser one wins(Llotheo)"
looped-map: "Looped map"
can-put-everywhere: "Can put everywhere"
common/views/components/games/reversi/reversi.index.vue:
@ -200,7 +200,7 @@ common/views/components/games/reversi/reversi.room.vue:
settings-of-the-bot: "Bot settings"
this-game-is-started-soon: "The game will begin in seconds"
waiting-for-other: "Waiting for the opponent"
waiting-for-me: "Waiting for you"
waiting-for-me: "Waiting for the your preparation"
waiting-for-both: "Prepareing"
cancel: "Cancel"
ready: "Ready"
@ -226,7 +226,7 @@ common/views/components/connect-failed.troubleshooter.vue:
no-server: "Unable to connect to the Misskey server"
no-server-desc: "The network connection of your device is normal, but you could not connect to the Misskey server. There is a possibility that the server is either down, or under maintenance, please try again later."
success: "Successfully connected to the Misskey server"
success-desc: "It seems to be able to connect. Please reload the page."
success-desc: "Looks like we have a connection. Please reload the page."
flush: "Clean cache"
set-version: "Specify version"
common/views/components/messaging.vue:
@ -278,7 +278,7 @@ common/views/components/poll-editor.vue:
add: "+ Add a choice"
destroy: "Discard the poll"
common/views/components/reaction-picker.vue:
choose-reaction: "Express a reaction"
choose-reaction: "Send a reaction"
common/views/components/signin.vue:
username: "Username"
password: "Password"
@ -287,7 +287,10 @@ common/views/components/signin.vue:
signin: "Sign in"
or: "Or"
signin-with-twitter: "Log in with Twitter"
login-failed: "Log in failed. Make sure you have entered your correct username and password."
common/views/components/signup.vue:
invitation-code: "Invitation code"
invitation-info: "If you do not have an invitation code, please contact an <a href=\"{}\">administrator</a>."
username: "Username"
checking: "Confirming..."
available: "Available"
@ -347,7 +350,7 @@ common/views/widgets/calendar.vue:
this-year: "This year: "
common/views/widgets/donation.vue:
title: "Request for donations"
text: "To keep Misskey up and running, we have to spend money on our domain name, the server costs and so on. Since we don't receive money from advertisements, we count on donations from all of you. If you're interested in helping, contact {}. Thank you for your contribution!"
text: "To keep Misskey up and running, there have to happen some expense for the domain name, the server and so on. Since our policy is not to display any advertisements, we count on your donations. If you're interested in helping, contact {}. Thank you for your contribution!"
common/views/widgets/photo-stream.vue:
title: "Photo stream"
no-photos: "No photos"
@ -388,8 +391,8 @@ common/views/widgets/tips.vue:
tips-line20: "The percentage of the calendar widget shows the percentage of time elapsed."
tips-line21: "You can also use the API to develop bots."
tips-line23: "Mayu is so cute with its eyebrows."
tips-line24: "Misskey started in 2014."
tips-line25: "You can receive notification even if Misskey is not open in a compatible browser."
tips-line24: "Misskey has been running since 2014."
tips-line25: "In a browser compatible with notification features, you can receive notifications in case Misskey is not open"
common/views/pages/follow.vue:
signed-in-as: "Signed in as {}"
following: "Following"
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue:
avatar: "Avatar"
banner: "Banner"
nsfw: "NSFW"
contextmenu:
rename: "Rename"
mark-as-sensitive: "Mark as 'sensitive'"
@ -470,7 +474,7 @@ desktop/views/components/drive.nav-folder.vue:
desktop/views/components/drive.vue:
search: "Search"
load-more: "Load more"
empty-draghover: "Drop it here, don't I look cute?"
empty-draghover: "Drop it here! Yep, cuz you know I'm cute, right?"
empty-drive: "Your media storage is empty"
empty-drive-description: "Right-click to open the menu, or drag and drop a file onto here for uploading."
empty-folder: "This folder is empty"
@ -480,7 +484,7 @@ desktop/views/components/drive.vue:
url-upload: "Upload from a URL"
url-of-file: "URL of file you want to upload"
url-upload-requested: "Upload requested"
may-take-time: "It may take some time for the upload to complete."
may-take-time: "It may take some time until the upload is complete."
create-folder: "Create a folder"
folder-name: "Folder name"
contextmenu:
@ -505,7 +509,7 @@ desktop/views/components/followers.vue:
desktop/views/components/following-window.vue:
following: "Following {}"
desktop/views/components/following.vue:
empty: "You dont follow anyone."
empty: "It seems you don't have any following users…"
desktop/views/components/friends-maker.vue:
title: "Recommended users:"
empty: "Couldn't find any recommended users."
@ -554,7 +558,7 @@ desktop/views/components/post-form.vue:
add-visible-user: "+Add a user"
attach-location-information: "Attach location information"
hide-contents: "Hide contents"
reply-placeholder: "Reply to this Post..."
reply-placeholder: "Reply to this post..."
quote-placeholder: "Quote this Post..."
submit: "Post"
reply: "Reply"
@ -575,7 +579,7 @@ desktop/views/components/post-form.vue:
recent-tags: "Recent"
click-to-tagging: "Click to tagging"
visibility: "Visibility"
geolocation-alert: "Your device can not measure location infomation"
geolocation-alert: "Your device does not provide location services."
error: "Error"
enter-username: "Please enter a username..."
annotations: "Annotations for the post (optional)"
@ -613,7 +617,7 @@ desktop/views/components/settings.vue:
fetch-on-scroll: "Endless loading on scroll"
fetch-on-scroll-desc: "When you scroll down the page, it automatically fetches additional content."
auto-popout: "Auto pop-out window"
auto-popout-desc: "Pops-out a newly opened window (onto a new tab), if possible. This setting is stored in the browser."
auto-popout-desc: "If it's possible, pop-out display will be used instead of opening a new window. This setting is stored in your browser."
advanced: "Advanced settings"
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."
@ -625,11 +629,13 @@ desktop/views/components/settings.vue:
circle-icons: "Use circle icons"
gradient-window-header: "Use gradients on window headers"
post-form-on-timeline: "Display post form at the top of the timeline"
suggest-recent-hashtags: "Show recent popular hashtags on the post form"
show-reply-target: "Display reply target"
show-my-renotes: "Show my reposts in the timeline"
show-renoted-my-notes: "Show my posts that have been shared in the timeline"
show-maps: "Show the map"
show-maps-desc: "Automatically show the location on the map attached to this post."
show-my-renotes: "Show my renotes in the timeline"
show-renoted-my-notes: "Show renoted my posts in timelines"
show-local-renotes: "Show renoted local posts in timelines"
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."
sound: "Sound"
enable-sounds: "Enable sound"
enable-sounds-desc: "Play a sound when you receive a post/message. This setting is stored in the browser."
@ -674,18 +680,18 @@ desktop/views/components/settings.vue:
third-parties: "Third-parties"
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."
detail: "See details..."
detail: "Details"
url: "https://www.google.com/landing/2step/"
caution: "If you lose access to your device, you won't be able to connect to Misskey anymore!"
caution: "If you lose access to your registered device, you won't be able to connect to Misskey anymore!"
register: "Register a device"
already-registered: "A device is already registered"
unregister: "Disable"
already-registered: "This device is already registered"
unregister: "Unregister"
unregistered: "Two-factor authentication has been disabled."
enter-password: "Enter the password"
authenticator: "First, you need to install Google Authenticator on your device:"
howtoinstall: "How to install"
scan: "And then, scan the QR code:"
done: "Please enter the token displaying on your device:"
done: "Please enter the token displayed on your device:"
submit: "Submit"
success: "Settings saved!"
failed: "Failed to setup. Please ensure that the token is correct."
@ -693,15 +699,15 @@ desktop/views/components/settings.2fa.vue:
desktop/views/components/settings.api.vue:
intro: "To access the API, set this token as the key 'i' of request parameters."
caution: "Do not enter this token to any apps nor tell this token to others otherwise your account may get compromised."
regeneration-of-token: "In case this token (may) leaks out, you want to regenerate it so that youll be safe."
regeneration-of-token: "If your token gets leaked, you can regenerate it."
regenerate-token: "Regenerate the token"
token: "Token:"
enter-password: "Please enter the password"
desktop/views/components/settings.apps.vue:
no-apps: "No linked applications"
desktop/views/components/settings.drive.vue:
max: "Max "
in-use: " in use."
max: "Max"
in-use: "In use"
desktop/views/components/settings.mute.vue:
no-users: "No muted users"
desktop/views/components/settings.password.vue:
@ -724,7 +730,7 @@ desktop/views/components/settings.profile.vue:
other: "Other"
is-bot: "This account is a Bot"
is-cat: "This account is a Cat"
profile-updated: "Profile has successfully updated"
profile-updated: "Your profile has been updated"
desktop/views/components/sub-note-content.vue:
private: "This post is private"
deleted: "This post has been deleted"
@ -740,7 +746,7 @@ desktop/views/components/timeline.vue:
list: "Lists"
desktop/views/components/ui.header.vue:
welcome-back: "Welcome back,"
adjective: "Sir "
adjective: "-san"
desktop/views/components/ui.header.account.vue:
profile: "Your profile"
drive: "Media storage"
@ -768,7 +774,7 @@ desktop/views/components/received-follow-requests-window.vue:
reject: "Reject"
desktop/views/components/user-lists-window.vue:
title: "User lists"
create-list: "Create new list"
create-list: "Create list"
list-name: "List name"
desktop/views/components/user-preview.vue:
notes: "Posts"
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
original-users: "Users on this instance"
all-notes: "All Posts"
original-notes: "Posts on this instance"
invite: "Invite"
desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "Suspend a user"
suspend: "Suspend"
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "Unsuspend users"
unsuspend: "Unsuspend"
unsuspended: "The user has successfully unsuspended."
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "User account verification settings"
verify: "Verify account"
verified: "The account is now being verified"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "User account unverification settings"
unverify: "Unverify account"
unverified: "The account is now being unverified"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "Posts"
local: "Local"
remote: "Remote"
desktop/views/pages/admin/admin.users-chart.vue:
title: "Users"
local: "Local"
remote: "Remote"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "Drive"
local: "Local"
remote: "Remote"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Only media posts"
is-media-view: "Media view"
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
cancel: "Cancel"
upload: "Upload files from your device"
desktop/views/pages/search.vue:
not-available: "The search feature is not available."
not-available: "Search feature is turned off in the settings for this instance."
not-found: "No posts were found for '{}'"
desktop/views/pages/share.vue:
share-with: "Share with {}."
@ -855,7 +882,7 @@ desktop/views/pages/user/user.friends.vue:
no-users: "No frequent mentions"
desktop/views/pages/user/user.vue:
is-suspended: "This account has been suspended."
is-remote: "The user is a remote user. Information about them that you see here may not complete."
is-remote: "The user is a remote user. The profile that you see here may not complete."
view-remote: "See their complete profile"
desktop/views/pages/user/user.home.vue:
last-used-at: "Last active:"
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "Choose files"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "Choose a folder"
mobile/views/components/drive.file.vue:
nsfw: "NSFW"
mobile/views/components/drive.file-detail.vue:
download: "Download"
rename: "Rename"
move: "Move"
hash: "Hash (md5)"
exif: "EXIF"
nsfw: "NSFW"
mobile/views/components/media-image.vue:
sensitive: "NSFW"
click-to-show: "Click to show"
@ -1012,7 +1042,7 @@ mobile/views/components/ui.nav.vue:
user-lists: "Lists"
widgets: "Widgets"
game: "Games"
darkmode: "Dark mode"
darkmode: "Dark theme"
settings: "Settings"
about: "About Misskey"
mobile/views/components/user-timeline.vue:
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
timeline: "Timeline"
show-reply-target: "Show reply target"
show-my-renotes: "Show my reposts"
show-renoted-my-notes: "Show my reposted posts"
show-renoted-my-notes: "Show renoted my posts"
show-local-renotes: "Show renoted local posts"
post-style: "Post design"
post-style-standard: "Standard"
post-style-smart: "Smart"
@ -1139,8 +1170,8 @@ mobile/views/pages/user.vue:
timeline: "Timeline"
media: "Media"
is-suspended: "This account has been suspended."
is-remote: "This user is a remote user, so the information you see here is not complete."
view-remote: "See their complete profile"
is-remote: "The user is a remote user. The profile that you see here may not complete."
view-remote: "See his/her complete profile"
mobile/views/pages/user/home.vue:
recent-notes: "Recent notes"
images: "Images"
@ -1163,8 +1194,8 @@ mobile/views/pages/user/home.photos.vue:
loading: "Loading"
no-photos: "No photos"
docs:
edit-this-page-on-github: "Did you find an error or do you want to contribute to the documentation? "
edit-this-page-on-github-link: "Edit this page on Github!"
edit-this-page-on-github: "Found a mistake or want to contribute for the documentation?"
edit-this-page-on-github-link: "Edit this page at GitHub!"
api:
entities:
properties: "Properties"
@ -1175,11 +1206,11 @@ docs:
require-credential: "This endpoint requires the authentication information."
require-permission: "This endpoint requires {permission} permission."
has-limit: "There is a rate limit."
duration-limit: "You can't request when a frequency of a request in during {duration} milliseconds exceeds {max} times."
min-interval-limit: "You can't request before {interval} milliseconds have passed since the previous request."
duration-limit: "If you have sent your requests more than {max} times in {duration} milliseconds, you will be unable to send more requests."
min-interval-limit: "If {interval} milliseconds haven't passed since the last request, you can't send a request."
show-src: "You can view the source code for this endpoint."
show-src-link: "See the code on GitHub"
generated: "This doc is generated by an API definition."
generated: "This document is generated by the API definition."
props:
name: "Name"
type: "Type"

View File

@ -84,7 +84,7 @@ common:
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
i-like-sushi: "Prefiero sushi a pudín"
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
verified-user: "Usuario verificado"
verified-user: "公式アカウント"
disable-animated-mfm: "Desactivar texto animado en una publicación"
reversi:
drawn: "Empatado"
@ -287,7 +287,10 @@ common/views/components/signin.vue:
signin: "Entra"
or: "O"
signin-with-twitter: "Ingresar con Twitter"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue:
invitation-code: "招待コード"
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
username: "Usuario"
checking: "Comprobando..."
available: "Disponible"
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue:
avatar: "Avatar"
banner: "Banner"
nsfw: "閲覧注意"
contextmenu:
rename: "Renombrar"
mark-as-sensitive: "Marcar como 'sensible'"
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
circle-icons: "Usar iconos circulares"
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"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
original-users: "このインスタンスのユーザー"
all-notes: "全てのノート"
original-notes: "このインスタンスのノート"
invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結"
suspend: "凍結"
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする"
verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-available: "検索機能はインスタンスの設定で無効になっています。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "{}で共有"
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue:
download: "ダウンロード"
rename: "名前を変更"
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
show-local-renotes: "ローカルの投稿のRenoteを表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"

View File

@ -4,10 +4,10 @@ meta:
divider: ""
common:
misskey: "Une ⭐ du fédiverse"
about-title: "Une ⭐ du fédiverse."
about: "Merci d'avoir découvert Misskey. Misskey est une <b>plateforme de micro-blogging distribuée</b> née sur Terre. Parce qu'il fait partie du Fédiverse (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-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 ?"
adblock:
detected: "Veuillez désactiver le bloqueur de publicités"
detected: "Veuillez désactiver votre bloqueur de publicités"
warning: "<strong>Misskey n'utilise pas de publicités</strong>, mais quelques options peuvent être non disponibles ou fonctionneraient mal si un bloqueur de publicités est activé."
application-authorization: "Permissions de l'application"
close: "Fermer"
@ -17,7 +17,7 @@ common:
title: "Conseils de personnalisation"
paragraph1: "La personnalisation à la maison vous permet d'ajouter / supprimer, glisser et déposer et réorganiser les 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."
gotit: "Compris!"
notification:
@ -69,7 +69,7 @@ common:
rip: "RIP"
pudding: "Pudding"
note-placeholders:
a: "Que faîtes vous maintenant ?"
a: "Que faites vous maintenant ?"
b: "Quoi de neuf ?"
c: "Qu'avez-vous en tête ?"
d: "Voulez-vous exprimer quelque chose ?"
@ -82,9 +82,9 @@ common:
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."
my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté."
i-like-sushi: "Je préfère les sushis (au 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"
verified-user: "Utilisateur·trice vérifié·e"
verified-user: "Compte vérifié"
disable-animated-mfm: "Désactiver les textes animés dans les publications"
reversi:
drawn: "Partie nulle"
@ -101,18 +101,18 @@ common:
analog-clock: "Horloge analogique"
profile: "Profil"
calendar: "Calendrier"
timemachine: "Calendrier (Machine de temps)"
timemachine: "Calendrier (Machine temporelle)"
activity: "Activité"
rss: "Lecteur de flux RSS"
memo: "Pense-bête"
trends: "Tendances"
photo-stream: "Flux de photos"
posts-monitor: "Graph des publications"
posts-monitor: "Graphe des publications"
slideshow: "Diaporama"
version: "Version"
broadcast: "Diffusion"
notifications: "Notifications"
users: "Utilisateurs"
users: "Utilisateur·rice·s"
polls: "Sondages"
post-form: "Formulaire de publication"
messaging: "Messagerie"
@ -174,16 +174,16 @@ common/views/components/games/reversi/reversi.game.vue:
can-put-everywhere: "どこでも置けるモード"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "Jouer à Reversi avec vos amis·es !"
sub-title: "Jouer à Reversi avec vos ami·e·s !"
invite: "Inviter"
rule: "Comment Jouer ?"
rule: "Comment jouer ?"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "Inviter"
mode-invite-desc: "Inviter un joueur."
mode-invite-desc: "Inviter un·e joueur·se."
invitations: "Vous avez reçu une invitation !"
my-games: "Mes jeux"
all-games: "Tous les jeux"
enter-username: "Saisir un nom d'utilisateur"
enter-username: "Saisir un nom d'utilisateur·rice"
game-state:
ended: "Terminée"
playing: "En cours"
@ -204,7 +204,7 @@ common/views/components/games/reversi/reversi.room.vue:
waiting-for-both: "En attente que vous soyez prêt"
cancel: "Annuler"
ready: "Prêt"
cancel-ready: "Annuler \"Je suis prêt\""
cancel-ready: "Annuler « Prêt »"
common/views/components/connect-failed.vue:
title: "Échec de connexion au serveur"
description: "Il y a soit un problème avec votre connexion internet, soit le serveur est hors-ligne ou en maintenance. Veuillez {ressayer} plus tard."
@ -230,20 +230,20 @@ common/views/components/connect-failed.troubleshooter.vue:
flush: "Vider le cache"
set-version: "Choisissez une version"
common/views/components/messaging.vue:
search-user: "Trouver un utilisateur"
search-user: "Trouver un·e utilisateur·rice"
you: "Vous"
no-history: "Pas d'historique"
common/views/components/messaging-room.vue:
empty: "Pas de conversations"
more: "Voir Plus"
more: "Voir plus"
no-history: "Il n'y a pas plus d'historique"
resize-form: "Faites glisser pour redimensionner"
new-message: "Nouveau message"
only-one-file-attached: "Un seul fichier uniquement peut être joint au message"
only-one-file-attached: "Un seul fichier peut être joint au message"
common/views/components/messaging-room.form.vue:
input-message-here: "Tapez ici votre message"
send: "Envoyer"
attach-from-local: "Joindre un fichier depuis votre PC"
attach-from-local: "Joindre un fichier depuis votre ordinateur"
attach-from-drive: "Joindre un fichier depuis votre Drive"
only-one-file-attached: "Un seul fichier uniquement peut être joint au message"
common/views/components/messaging-room.message.vue:
@ -251,23 +251,23 @@ common/views/components/messaging-room.message.vue:
deleted: "Ce message a été supprimé"
common/views/components/nav.vue:
about: "À propos"
stats: "Stats"
status: "Status"
stats: "Statistiques"
status: "Statut"
wiki: "Wiki"
donors: "Donateurs"
repository: "Repo"
develop: "Développeurs"
donors: "Donateur·rice·s"
repository: "Dépôt"
develop: "Développeur·se·s"
feedback: "Remarques"
common/views/components/note-menu.vue:
favorite: "Favorite this note"
pin: "Épingler sur votre profile"
favorite: "Mettre cette note en favoris"
pin: "Épingler sur votre profil"
delete: "Supprimer"
delete-confirm: "Supprimer cette publication ?"
remote: "Afficher les note originale"
remote: "Afficher la note originale"
common/views/components/poll.vue:
vote-to: "Voter pour '{}'"
vote-count: "{} votes"
total-users: "{} utilisateurs ont voté"
total-users: "{} utilisateur·rice·s ont voté·e·s"
vote: "Vote"
show-result: "Montrer les résultats"
voted: "Voté"
@ -280,31 +280,34 @@ common/views/components/poll-editor.vue:
common/views/components/reaction-picker.vue:
choose-reaction: "Choisissez votre réaction"
common/views/components/signin.vue:
username: "Nom d'utilisateur"
username: "Nom d'utilisateur·rice"
password: "Mot de passe"
token: "Token"
signing-in: "Connexion...."
signing-in: "Connexion"
signin: "Se connecter"
or: "Ou"
signin-with-twitter: "Se connecter via Twitter"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue:
username: "Nom d'utilisateur"
checking: "Vérification"
invitation-code: "Code dinvitation"
invitation-info: "Si vous navez pas de code dinvitation, contactez un·e <a href=\"{}\">administrateur·rice</a>."
username: "Nom d'utilisateur·rice"
checking: "Vérification…"
available: "Disponible"
unavailable: "Non disponible"
error: "Erreur de réseau"
invalid-format: "Utilisez seulement des lettres, nombres et/ou -."
error: "Erreur du réseau"
invalid-format: "Vous pouvez utiliser des lettres, des nombres et _."
too-short: "Veuillez saisir au moins un caractère !"
too-long: "Veuillez entrer au maximum 20 caractères."
password: "Mot de Passe"
password-placeholder: "Nous recommendons au moins 8 caractères."
password: "Mot de passe"
password-placeholder: "Nous recommandons au moins 8 caractères."
weak-password: "Faible"
normal-password: "Moyen"
strong-password: "Fort"
retype: "Retapez"
retype-placeholder: "Confirmez votre mot de passe"
password-matched: "OK"
password-not-matched: "Les mots de passes ne correspondent pas."
password-not-matched: "Les mots de passe ne correspondent pas."
recaptcha: "Vérifier"
create: "Créer un compte"
some-error: "La création du compte a échoué. Veuillez réessayer."
@ -316,14 +319,14 @@ common/views/components/stream-indicator.vue:
reconnecting: "Reconnexion en cours"
connected: "Connecté"
common/views/components/twitter-setting.vue:
description: "Si vous liez votre compte Twitter à votre compte Misskey, vous verrez ensuite votre compte Twitter s'afficher sur votre profile, vous aurez aussi la possibilité de vous connecter à Misskey en utilisant votre compte Twitter."
description: "Si vous liez votre compte Twitter à votre compte Misskey, vous verrez ensuite votre compte Twitter s'afficher sur votre profil, vous aurez aussi la possibilité de vous connecter à Misskey en utilisant votre compte Twitter."
connected-to: "Vous êtes connecté à ce compte Twitter"
detail: "Détails …"
reconnect: "Reconnecter"
detail: "Détails…"
reconnect: "Reconnexion"
connect: "Lier votre compte Twitter"
disconnect: "Déconnecter"
disconnect: "Déconnexion"
common/views/components/uploader.vue:
waiting: "En attente"
waiting: "Veuillez patienter"
common/views/components/visibility-chooser.vue:
public: "Public"
home: "Accueil"
@ -331,42 +334,42 @@ common/views/components/visibility-chooser.vue:
followers: "Abonné·e·s"
followers-desc: "Publier à vos abonné·e·s uniquement"
specified: "Direct"
specified-desc: "Publier aux utilisateurs·trices mentionné·es"
specified-desc: "Publier aux utilisateur·rice·s mentionné·e·s"
private: "Privé"
common/views/widgets/broadcast.vue:
fetching: "Récuperation"
fetching: "Récupération"
no-broadcasts: "Aucune annonce"
have-a-nice-day: "Passez une bonne journée !"
next: "Suivant"
common/views/widgets/calendar.vue:
year: "{} année"
month: "{} mois"
day: "{} jour"
year: "Année {}"
month: "Mois {}"
day: "Jour {}"
today: "Aujourd'hui :"
this-month: "Ce mois-ci :"
this-year: "Cette année :"
common/views/widgets/donation.vue:
title: "Dons"
title: "Faire un don"
text: "Les frais pour faire fonctionner Misskey sortent directement de notre poche. Nous ne recevons pas d'argent issu de la publicité, si vous pouvez nous faire des dons, on vous serait éternellement reconnaissants. Si vous êtes intéressé·es veuillez contacter {}. Merci pour votre contribution !"
common/views/widgets/photo-stream.vue:
title: "Flux de photo"
no-photos: "Pas de photos"
title: "Flux de photos"
no-photos: "Pas de photo"
common/views/widgets/posts-monitor.vue:
title: "Graph des publications"
title: "Graphe des publications"
toggle: "Basculer entre les vues"
common/views/widgets/hashtags.vue:
title: "Étiquettes"
count: "{} utilisateurs mentionnés"
count: "{} utilisateur·rice·s mentionné·e·s"
empty: "Aucune tendance"
common/views/widgets/server.vue:
title: "Info sur le serveur"
title: "Informations sur le serveur"
toggle: "Afficher les vues"
common/views/widgets/memo.vue:
title: "Pense-bête"
memo: "Écrivez ici !"
save: "Enregistrer"
common/views/widgets/slideshow.vue:
folder-customize-mode: "Veuillez quitter le mode personnalisé pour pouvour spécifier un dossier"
folder-customize-mode: "Pour pouvoir spécifier un dossier, veuillez quitter le mode de personnalisation"
folder: "Veuillez cliquer pour spécifier le dossier"
no-image: "Il n'y a aucune image dans ce dossier"
common/views/widgets/tips.vue:
@ -374,13 +377,13 @@ common/views/widgets/tips.vue:
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note"
tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note"
tips-line5: "Vous pouvez téléverser des fichiers sur le Drive en faisant un glisser/déplacer"
tips-line5: "Vous pouvez téléverser des fichiers sur le Drive en faisant un glisser-déposer"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres"
tips-line9: "Misskey est sous licence AGPLv3"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "Vous pouvez épingler des notes sur votre page en appuyant sur \"…\""
tips-line11: "Vous pouvez épingler des notes sur votre page en cliquant sur « … »"
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "Vous pouvez mettre un texte en surbrillance en le mettant entre ** **"
@ -391,18 +394,18 @@ common/views/widgets/tips.vue:
tips-line24: "Misskey a vu le jour en 2014"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/follow.vue:
signed-in-as: "Connecté·é en tant que {}"
signed-in-as: "Connecté·e en tant que {}"
following: "Suit"
follow: "Suivre"
request-pending: "Demande d'abonnement en attente"
follow-request: "Demande d'abonnement"
desktop:
banner-crop-title: "Découpez la partie qui apparaîtra comme une bannière"
banner-crop-title: "Découpez la partie qui apparaitra comme bannière"
banner: "Bannière"
uploading-banner: "Téléversement d'une nouvelle bannière"
banner-updated: "La bannière est mise à jour"
choose-banner: "Choisir une bannière"
avatar-crop-title: "Découpez la partie qui apparaîtra dans l'avatar"
avatar-crop-title: "Découpez la partie qui apparaitra comme avatar"
avatar: "Avatar"
uploading-avatar: "Téléversement du nouvel avatar"
avatar-updated: "L'avatar est mis à jour"
@ -413,16 +416,16 @@ desktop/views/components/activity.chart.vue:
replies: "Rouge ... Réponses"
renotes: "Vert ... Partages"
desktop/views/components/activity.vue:
title: "Activitié"
title: "Activité"
toggle: "Afficher les vues"
desktop/views/components/calendar.vue:
title: "{1} / {2}"
prev: "Mois dernier"
next: "Mois prochain"
go: "Cliquer pour naviguer"
go: "Cliquez pour naviguer"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "Sélection de fichiers"
upload: "Téléverser des fichiers à partir de votre PC"
upload: "Téléverser des fichiers à partir de votre ordinateur"
cancel: "Annuler"
ok: "OK"
choose-prompt: "Choisir un fichier"
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue:
avatar: "Avatar"
banner: "Bannière"
nsfw: "閲覧注意"
contextmenu:
rename: "Renommer"
mark-as-sensitive: "Marquer comme sensible"
@ -453,14 +457,14 @@ desktop/views/components/drive.file.vue:
add-app: "Ajouter une application"
rename-file: "Renommer le ficher"
input-new-file-name: "Entrer un nouveau nom"
copied: "Copied"
copied-url-to-clipboard: "L'URL a été copié dans le presse-papier"
copied: "Copié"
copied-url-to-clipboard: "L'URL a été copiée dans le presse-papier"
desktop/views/components/drive.folder.vue:
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."
unhandled-error: "Erreur inconnue"
contextmenu:
move-to-this-folder: "Bouger dans ce dossier"
move-to-this-folder: "Déplacer dans ce dossier"
show-in-new-window: "Ouvrir dans une nouvelle fenêtre"
rename: "Renommer"
rename-folder: "Renommer le dossier"
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
circle-icons: "Utiliser des icônes circulaires"
gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-reply-target: "Afficher les réponses"
show-my-renotes: "Afficher mes republications dans le fil"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "Afficher la carte"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "Son"
@ -786,23 +792,44 @@ desktop/views/components/window.vue:
close: "Fermer"
desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード"
drive: "ドライブ"
users: "ユーザー"
update: "更新"
drive: "Drive"
users: "Utilisateur·rice·s"
update: "Mises à jour"
desktop/views/pages/admin/admin.dashboard.vue:
dashboard: "ダッシュボード"
all-users: "全てのユーザー"
original-users: "このインスタンスのユーザー"
all-notes: "全てのノート"
original-notes: "このインスタンスのノート"
all-users: "Tou·te·s les utilisateur·rice·s"
original-users: "Utilisateur·rice·s sur cette instance"
all-notes: "Toutes les publications"
original-notes: "Publication sur cette instance"
invite: "Invitation"
desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結"
suspend: "凍結"
suspended: "凍結しました"
suspend-user: "Suspendre un·e utilisateur·rice"
suspend: "Suspendre"
suspended: "Suspendu avec succès"
desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました"
unsuspend-user: "Lever la suspension dutilisateur·rice·s"
unsuspend: "Suspension levée"
unsuspended: "La suspension de lutilisateur·rice a été levée avec succès"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定"
verify: "Vérification du compte"
verified: "Le compte a été vérifié"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Les publications médias uniquement"
is-media-view: "Vue média"
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
cancel: "Annuler"
upload: "Uploader un ou plusieurs fichier(s) depuis votre PC"
desktop/views/pages/search.vue:
not-available: "Vous ne pouvez pas utiliser la fonctionnalité de recherche."
not-available: "検索機能はインスタンスの設定で無効になっています。"
not-found: "Aucun message trouvé pour '{}'"
desktop/views/pages/share.vue:
share-with: "Partager avec {}"
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "Choisissez un fichier"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "Choisissez un dossier"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue:
download: "Télécharger"
rename: "Renommer"
move: "Déplacer"
hash: "Hash (md5)"
exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue:
sensitive: "Le contenu est NSFW"
click-to-show: "Cliquer pour afficher"
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
timeline: "Fil d'actualité"
show-reply-target: "Afficher les réponses"
show-my-renotes: "Afficher mes republications"
show-renoted-my-notes: "Afficher les notes que j'ai repartagé"
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
show-local-renotes: "ローカルの投稿のRenoteを表示する"
post-style: "Style de la publication"
post-style-standard: "Standard"
post-style-smart: "Intelligent"
@ -1172,14 +1203,14 @@ docs:
params: "Paramètres"
no-params: "Aucun paramètre"
res: "Réponse"
require-credential: "このエンドポイントは認証情報が必須です。"
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
require-credential: "Ce point de communication nécessite une authentification."
require-permission: "Ce point de communication nécessite la permission {permission}."
has-limit: "レートリミットがあります。"
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
show-src: "このエンドポイントのソースコードも閲覧できます。"
show-src: "Vous pouvez voir le code source ce point de communication."
show-src-link: "Consulter le code sur GitHub"
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
generated: "Ce document est généré à partir de la définition de lAPI."
props:
name: "Nom"
type: "Type"

View File

@ -15,6 +15,7 @@ const langs = {
'en': loadLang('en'),
'fr': loadLang('fr'),
'ja': native,
'ja-ks': loadLang('ja-ks'),
'pl': loadLang('pl'),
'es': loadLang('es')
};

View File

@ -84,7 +84,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "引き分け"
@ -287,7 +287,10 @@ common/views/components/signin.vue:
signin: "サインイン"
or: "または"
signin-with-twitter: "Twitterでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue:
invitation-code: "招待コード"
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
username: "ユーザー名"
checking: "確認しています..."
available: "利用できます"
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue:
avatar: "アイコン"
banner: "バナー"
nsfw: "閲覧注意"
contextmenu:
rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定"
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
original-users: "このインスタンスのユーザー"
all-notes: "全てのノート"
original-notes: "このインスタンスのノート"
invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結"
suspend: "凍結"
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする"
verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-available: "検索機能はインスタンスの設定で無効になっています。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "{}で共有"
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue:
download: "ダウンロード"
rename: "名前を変更"
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
show-local-renotes: "ローカルの投稿のRenoteを表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"

1412
locales/ja-ks.yml Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -12,7 +12,7 @@ common:
application-authorization: "앱의 연계"
close: "닫기"
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
got-it: "わかった"
got-it: "알았습니다"
customization-tips:
title: "사용자 정의 팁"
paragraph1: "홈 정의는 위젯을 추가 / 삭제하거나 드래그 앤 드롭하여 정렬 할 수 있습니다."
@ -39,7 +39,7 @@ common:
weeks_ago: "{}주전"
months_ago: "{}개월전"
years_ago: "{}년전"
month-and-day: "{month} {day}"
month-and-day: "{month} {day}"
trash: "휴지통"
weekday-short:
sunday: "일"
@ -84,7 +84,7 @@ common:
my-token-regenerated: "당신의 토큰이 업데이트되어 있기 때문에 로그 아웃합니다."
i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아"
show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
verified-user: "인증 된 사용자"
verified-user: "公式アカウント"
disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할"
reversi:
drawn: "무승부"
@ -122,13 +122,13 @@ common:
tips: "팁"
hashtags: "해시 태그"
deck:
widgets: "ウィジェット"
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
notifications: "通知"
list: "リスト"
widgets: "위젯"
home: ""
local: "로컬"
hybrid: "소셜"
global: "글로벌"
notifications: "통지"
list: "목록"
swap-left: "左に移動"
swap-right: "右に移動"
swap-up: "上に移動"
@ -150,10 +150,10 @@ auth/views/form.vue:
drive-write: "ドライブを操作する。"
notification-read: "通知を見る。"
notification-write: "通知を操作する。"
cancel: "キャンセル"
cancel: "취소"
accept: "アクセスを許可"
auth/views/index.vue:
loading: "読み込み中"
loading: "로드 중"
denied: "アプリケーションの連携をキャンセルしました。"
denied-paragraph: "このアプリがあなたのアカウントにアクセスすることはありません。"
already-authorized: "このアプリは既に連携済みです"
@ -165,18 +165,18 @@ auth/views/index.vue:
common/views/components/games/reversi/reversi.vue:
matching:
waiting-for: "{}を待っています"
cancel: "キャンセル"
cancel: "취소"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrender: "기권"
surrendered: "投了により"
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
looped-map: "루프 지도"
can-put-everywhere: "どこでも置けるモード"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
invite: "招待"
rule: "遊び方"
invite: "초대"
rule: "게임 방법"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待"
mode-invite-desc: "指定したユーザーと対戦するモードです。"
@ -185,26 +185,26 @@ common/views/components/games/reversi/reversi.index.vue:
all-games: "みんなの対局"
enter-username: "ユーザー名を入力してください"
game-state:
ended: "終了"
playing: "進行中"
ended: "종료"
playing: "진행중"
common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定"
choose-map: "マップを選択"
random: "ランダム"
black-or-white: "先手/後手"
black-is: "{}が黒"
rules: "ルール"
rules: "규칙"
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
looped-map: "루프 지도"
can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Botの設定"
this-game-is-started-soon: "ゲームは数秒後に開始されます"
waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中"
cancel: "キャンセル"
ready: "準備完了"
cancel-ready: "準備続行"
waiting-for-both: "준비중"
cancel: "취소"
ready: "준비 완료"
cancel-ready: "준비 계속"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@ -231,7 +231,7 @@ common/views/components/connect-failed.troubleshooter.vue:
set-version: "バージョン指定"
common/views/components/messaging.vue:
search-user: "ユーザーを探す"
you: "あなた"
you: "당신"
no-history: "履歴はありません"
common/views/components/messaging-room.vue:
empty: "このユーザーと話したことはありません"
@ -242,12 +242,12 @@ common/views/components/messaging-room.vue:
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
common/views/components/messaging-room.form.vue:
input-message-here: "ここにメッセージを入力"
send: "送信"
send: "전송"
attach-from-local: "PCからファイルを添付する"
attach-from-drive: "ドライブからファイルを添付する"
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
common/views/components/messaging-room.message.vue:
is-read: "既読"
is-read: "읽음"
deleted: "このメッセージは削除されました"
common/views/components/nav.vue:
about: "Misskeyについて"
@ -287,7 +287,10 @@ common/views/components/signin.vue:
signin: "サインイン"
or: "または"
signin-with-twitter: "Twitterでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue:
invitation-code: "招待コード"
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
username: "ユーザー名"
checking: "確認しています..."
available: "利用できます"
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue:
avatar: "アイコン"
banner: "バナー"
nsfw: "閲覧注意"
contextmenu:
rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定"
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
original-users: "このインスタンスのユーザー"
all-notes: "全てのノート"
original-notes: "このインスタンスのノート"
invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結"
suspend: "凍結"
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする"
verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-available: "検索機能はインスタンスの設定で無効になっています。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "{}で共有"
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue:
download: "ダウンロード"
rename: "名前を変更"
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
show-local-renotes: "ローカルの投稿のRenoteを表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"

View File

@ -84,7 +84,7 @@ common:
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
i-like-sushi: "Wolę sushi od puddingu"
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
verified-user: "Zweryfikowany użytkownik"
verified-user: "公式アカウント"
disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
reversi:
drawn: "Remis"
@ -287,7 +287,10 @@ common/views/components/signin.vue:
signin: "Zaloguj"
or: "または"
signin-with-twitter: "Zaloguj się za pomocą Twittera"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue:
invitation-code: "招待コード"
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
username: "Nazwa użytkownika"
checking: "Sprawdzanie…"
available: "Dostępna"
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue:
avatar: "Awatar"
banner: "Baner"
nsfw: "閲覧注意"
contextmenu:
rename: "Zmień nazwę"
mark-as-sensitive: "Oznacz jako zawartość wrażliwą"
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
circle-icons: "Używaj okrągłych ikon"
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"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-reply-target: "Pokazuj cel odpowiedzi"
show-my-renotes: "Pokazuj moje udostępnienia na osi czasu"
show-renoted-my-notes: "Pokazuj udostępnienia moich wpisów na osi czasu"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "Automatycznie pokazuj mapę"
show-maps-desc: "Mapa będzie automatycznie rozwijana dla wpisów zawierających informacje o lokalizacji."
sound: "Dźwięk"
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
original-users: "このインスタンスのユーザー"
all-notes: "全てのノート"
original-notes: "このインスタンスのノート"
invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結"
suspend: "凍結"
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする"
verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Tylko wpisy z zawartością multimedialną"
is-media-view: "Widok multimediów"
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
cancel: "Anuluj"
upload: "Wyślij pliki z Twojego komputera"
desktop/views/pages/search.vue:
not-available: "Funkcja wyszukiwania nie może zostać wykorzystywana."
not-available: "検索機能はインスタンスの設定で無効になっています。"
not-found: "Nie znaleziono wpisów zawierających „{}”"
desktop/views/pages/share.vue:
share-with: "Udostępnij z {}."
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "Wybierz plik"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "Wybierz katalog"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue:
download: "Pobierz"
rename: "Zmień nazwę"
move: "Przenieś"
hash: "Hash (md5)"
exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue:
sensitive: "To jest zawartość NSFW"
click-to-show: "Naciśnij aby wyświetlić"
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
timeline: "Oś czasu"
show-reply-target: "Pokazuj cel odpowiedzi"
show-my-renotes: "Pokazuj moje udostępnienia"
show-renoted-my-notes: "Pokazuj udostępnienia moich wpisów"
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
show-local-renotes: "ローカルの投稿のRenoteを表示する"
post-style: "Styl wpisów"
post-style-standard: "Standardowy"
post-style-smart: "Inteligentny"

View File

@ -84,7 +84,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "引き分け"
@ -287,7 +287,10 @@ common/views/components/signin.vue:
signin: "サインイン"
or: "または"
signin-with-twitter: "Twitterでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue:
invitation-code: "招待コード"
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
username: "ユーザー名"
checking: "確認しています..."
available: "利用できます"
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue:
avatar: "アイコン"
banner: "バナー"
nsfw: "閲覧注意"
contextmenu:
rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定"
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
original-users: "このインスタンスのユーザー"
all-notes: "全てのノート"
original-notes: "このインスタンスのノート"
invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結"
suspend: "凍結"
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする"
verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-available: "検索機能はインスタンスの設定で無効になっています。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "{}で共有"
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue:
download: "ダウンロード"
rename: "名前を変更"
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
show-local-renotes: "ローカルの投稿のRenoteを表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"

View File

@ -84,7 +84,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "引き分け"
@ -287,7 +287,10 @@ common/views/components/signin.vue:
signin: "サインイン"
or: "または"
signin-with-twitter: "Twitterでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue:
invitation-code: "招待コード"
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
username: "ユーザー名"
checking: "確認しています..."
available: "利用できます"
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue:
avatar: "アイコン"
banner: "バナー"
nsfw: "閲覧注意"
contextmenu:
rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定"
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
original-users: "このインスタンスのユーザー"
all-notes: "全てのノート"
original-notes: "このインスタンスのノート"
invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結"
suspend: "凍結"
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする"
verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-available: "検索機能はインスタンスの設定で無効になっています。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "{}で共有"
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue:
download: "ダウンロード"
rename: "名前を変更"
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
show-local-renotes: "ローカルの投稿のRenoteを表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"

View File

@ -84,7 +84,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
verified-user: "公式アカウント"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "引き分け"
@ -287,7 +287,10 @@ common/views/components/signin.vue:
signin: "サインイン"
or: "または"
signin-with-twitter: "Twitterでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
common/views/components/signup.vue:
invitation-code: "招待コード"
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
username: "ユーザー名"
checking: "確認しています..."
available: "利用できます"
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
desktop/views/components/drive.file.vue:
avatar: "アイコン"
banner: "バナー"
nsfw: "閲覧注意"
contextmenu:
rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定"
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
original-users: "このインスタンスのユーザー"
all-notes: "全てのノート"
original-notes: "このインスタンスのノート"
invite: "招待"
desktop/views/pages/admin/admin.suspend-user.vue:
suspend-user: "ユーザーの凍結"
suspend: "凍結"
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
unsuspend-user: "ユーザーの凍結の解除"
unsuspend: "凍結の解除"
unsuspended: "凍結を解除しました"
desktop/views/pages/admin/admin.verify-user.vue:
verify-user: "ユーザーの公式アカウント設定"
verify: "公式アカウントにする"
verified: "公式アカウントにしました"
desktop/views/pages/admin/admin.unverify-user.vue:
unverify-user: "ユーザーの公式アカウント解除"
unverify: "公式アカウントを解除する"
unverified: "公式アカウントを解除しました"
desktop/views/pages/admin/admin.notes-chart.vue:
title: "投稿"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.users-chart.vue:
title: "ユーザー"
local: "ローカル"
remote: "リモート"
desktop/views/pages/admin/admin.drive-chart.vue:
title: "ドライブ"
local: "ローカル"
remote: "リモート"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-available: "検索機能はインスタンスの設定で無効になっています。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "{}で共有"
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択"
mobile/views/components/drive.file.vue:
nsfw: "閲覧注意"
mobile/views/components/drive.file-detail.vue:
download: "ダウンロード"
rename: "名前を変更"
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
nsfw: "閲覧注意"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
show-local-renotes: "ローカルの投稿のRenoteを表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"

View File

@ -1,8 +1,8 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "6.0.2",
"clientVersion": "1.0.8367",
"version": "7.1.2",
"clientVersion": "1.0.8693",
"codename": "nighthike",
"main": "./built/index.js",
"private": true,
@ -126,7 +126,7 @@
"gulp-util": "3.0.8",
"hard-source-webpack-plugin": "0.12.0",
"highlight.js": "9.12.0",
"html-minifier": "3.5.19",
"html-minifier": "3.5.20",
"http-signature": "1.2.0",
"insert-text-at-cursor": "0.1.1",
"is-root": "2.0.0",
@ -201,7 +201,7 @@
"typescript": "2.9.2",
"typescript-eslint-parser": "18.0.0",
"uglify-es": "3.3.9",
"url-loader": "1.1.0",
"url-loader": "1.1.1",
"uuid": "3.3.2",
"v-animate-css": "0.0.2",
"vue": "2.5.17",

View File

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

View File

@ -0,0 +1,10 @@
const faces = [
'(=^・・^=)',
'v(\'ω\')v',
'🐡( \'-\' 🐡 )フグパンチ!!!!',
'🖕(´・_・`)🖕',
'(。><。)',
'(Δ・x・Δ)'
];
export default () => faces[Math.floor(Math.random() * faces.length)];

View File

@ -1,9 +0,0 @@
const kaos = [
'(=^・・^=)',
'v(\'ω\')v',
'🐡( \'-\' 🐡 )フグパンチ!!!!',
'🖕(´・_・`)🖕',
'(。><。)'
];
export default () => kaos[Math.floor(Math.random() * kaos.length)];

View File

@ -32,6 +32,7 @@
<mk-avatar class="avatar" :user="g.user2"/>
<span><b>{{ g.user1 | userName }}</b> vs <b>{{ g.user2 | userName }}</b></span>
<span class="state">{{ g.isEnded ? '%i18n:@game-state.ended%' : '%i18n:@game-state.playing%' }}</span>
<mk-time :time="g.createdAt" />
</a>
</section>
<section v-if="games.length > 0">
@ -41,6 +42,7 @@
<mk-avatar class="avatar" :user="g.user2"/>
<span><b>{{ g.user1 | userName }}</b> vs <b>{{ g.user2 | userName }}</b></span>
<span class="state">{{ g.isEnded ? '%i18n:@game-state.ended%' : '%i18n:@game-state.playing%' }}</span>
<mk-time :time="g.createdAt" />
</a>
</section>
</div>

View File

@ -12,13 +12,13 @@
</ui-input>
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/>
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
<p style="margin: 8px 0;" v-if="twitterIntegration">%i18n:@or%<a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
<p style="margin: 8px 0;">%i18n:@or% <a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
</form>
</template>
<script lang="ts">
import Vue from 'vue';
import { apiUrl, host, twitterIntegration } from '../../../config';
import { apiUrl, host } from '../../../config';
export default Vue.extend({
props: {
@ -36,8 +36,7 @@ export default Vue.extend({
password: '',
token: '',
apiUrl,
host,
twitterIntegration
host
};
},
methods: {
@ -54,13 +53,14 @@ export default Vue.extend({
this.signing = true;
(this as any).api('signin', {
username: this.username,
password: this.password,
// password という名前(または username とのペア?)では何らかのフィルタリングがされるっぽい?
x: this.username,
y: this.password,
token: this.user && this.user.twoFactorEnabled ? this.token : undefined
}).then(() => {
location.reload();
}).catch(() => {
alert('something happened');
alert('%i18n:@login-failed%');
this.signing = false;
});
}

View File

@ -1,5 +1,10 @@
<template>
<form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()">
<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required>
<span>%i18n:@invitation-code%</span>
<span slot="prefix">%fa:id-card-alt%</span>
<p slot="text" v-html="'%i18n:@invitation-info%'.replace('{}', meta.maintainer.url)"></p>
</ui-input>
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername">
<span>%i18n:@username%</span>
<span slot="prefix">@</span>
@ -29,7 +34,7 @@
<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p>
</div>
</ui-input>
<div v-if="recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="recaptchaSitekey" style="margin: 16px 0;"></div>
<div v-if="meta && meta.recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="meta.recaptchaSitekey" style="margin: 16px 0;"></div>
<ui-button type="submit">%i18n:@create%</ui-button>
</form>
</template>
@ -37,7 +42,7 @@
<script lang="ts">
import Vue from 'vue';
const getPasswordStrength = require('syuilo-password-strength');
import { host, url, recaptchaSitekey } from '../../../config';
import { host, url } from '../../../config';
export default Vue.extend({
data() {
@ -46,11 +51,12 @@ export default Vue.extend({
username: '',
password: '',
retypedPassword: '',
invitationCode: '',
url,
recaptchaSitekey,
usernameState: null,
passwordStrength: '',
passwordRetypeState: null
passwordRetypeState: null,
meta: null
}
},
computed: {
@ -61,6 +67,17 @@ export default Vue.extend({
this.usernameState != 'max-range');
}
},
created() {
(this as any).os.getMeta().then(meta => {
this.meta = meta;
});
},
mounted() {
const head = document.getElementsByTagName('head')[0];
const script = document.createElement('script');
script.setAttribute('src', 'https://www.google.com/recaptcha/api.js');
head.appendChild(script);
},
methods: {
onChangeUsername() {
if (this.username == '') {
@ -110,7 +127,8 @@ export default Vue.extend({
(this as any).api('signup', {
username: this.username,
password: this.password,
'g-recaptcha-response': recaptchaSitekey != null ? (window as any).grecaptcha.getResponse() : null
invitationCode: this.invitationCode,
'g-recaptcha-response': this.meta.recaptchaSitekey != null ? (window as any).grecaptcha.getResponse() : null
}).then(() => {
(this as any).api('signin', {
username: this.username,
@ -121,19 +139,11 @@ export default Vue.extend({
}).catch(() => {
alert('%i18n:@some-error%');
if (recaptchaSitekey != null) {
if (this.meta.recaptchaSitekey != null) {
(window as any).grecaptcha.reset();
}
});
}
},
mounted() {
if (recaptchaSitekey != null) {
const head = document.getElementsByTagName('head')[0];
const script = document.createElement('script');
script.setAttribute('src', 'https://www.google.com/recaptcha/api.js');
head.appendChild(script);
}
}
});
</script>

View File

@ -44,7 +44,12 @@ import Vue from 'vue';
import * as anime from 'animejs';
export default Vue.extend({
props: ['source', 'compact', 'v'],
props: ['source', 'compact'],
data() {
return {
v: this.$store.state.device.visibility || 'public'
}
},
mounted() {
this.$nextTick(() => {
const popover = this.$refs.popover as any;
@ -92,6 +97,7 @@ export default Vue.extend({
},
methods: {
choose(visibility) {
this.$store.commit('device/setVisibility', visibility);
this.$emit('chosen', visibility);
this.$destroy();
},

View File

@ -122,7 +122,7 @@ export default Vue.extend({
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
},
onStatsLog(statsLog) {
statsLog.forEach(stats => this.onStats(stats));
statsLog.reverse().forEach(stats => this.onStats(stats));
}
}
});

View File

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

View File

@ -9,12 +9,18 @@
@contextmenu.prevent.stop="onContextmenu"
:title="title"
>
<div class="label" v-if="$store.state.i.avatarId == file.id"><img src="/assets/label.svg"/>
<div class="label" v-if="$store.state.i.avatarId == file.id">
<img src="/assets/label.svg"/>
<p>%i18n:@avatar%</p>
</div>
<div class="label" v-if="$store.state.i.bannerId == file.id"><img src="/assets/label.svg"/>
<div class="label" v-if="$store.state.i.bannerId == file.id">
<img src="/assets/label.svg"/>
<p>%i18n:@banner%</p>
</div>
<div class="label red" v-if="file.isSensitive">
<img src="/assets/label-red.svg"/>
<p>%i18n:@nsfw%</p>
</div>
<div class="thumbnail" ref="thumbnail" :style="`background-color: ${ background }`">
<img :src="file.thumbnailUrl" alt="" @load="onThumbnailLoaded"/>
</div>
@ -212,6 +218,11 @@ root(isDark)
&:after
background #0b65a5
&.red
&:before
&:after
background #c12113
&:active
background rgba(#000, 0.1)
@ -220,6 +231,11 @@ root(isDark)
&:after
background #0b588c
&.red
&:before
&:after
background #ce2212
&[data-is-selected]
background $theme-color
@ -256,26 +272,29 @@ root(isDark)
pointer-events none
&:before
content ""
display block
position absolute
z-index 1
top 0
left 57px
width 28px
height 8px
background #0c7ac9
&:after
content ""
display block
position absolute
z-index 1
background #0c7ac9
&:before
top 0
left 57px
width 28px
height 8px
&:after
top 57px
left 0
width 8px
height 28px
background #0c7ac9
&.red
&:before
&:after
background #c12113
> img
position absolute

View File

@ -55,15 +55,15 @@
</div>
<footer>
<mk-reactions-viewer :note="p"/>
<button @click="reply" title="">
<button class="replyButton" @click="reply" title="">
<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 @click="renote" title="%i18n:@renote%">
<button class="renoteButton" @click="renote" title="%i18n:@renote%">
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
</button>
<button :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">
<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">
@ -372,15 +372,24 @@ root(isDark)
cursor pointer
&:hover
color isDark ? #9198af : #666
color isDark ? #a1a8bf : #444
&.replyButton:hover
color #0af
&.renoteButton:hover
color #8d0
&.reactionButton:hover
color #fa0
> .count
display inline
margin 0 0 0 8px
color #999
&.reacted
color $theme-color
&.reacted, &.reacted:hover
color #fa0
> .replies
> *

View File

@ -42,15 +42,15 @@
</div>
<footer>
<mk-reactions-viewer :note="p" ref="reactionsViewer"/>
<button @click="reply" title="%i18n:@reply%">
<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 @click="renote" title="%i18n:@renote%">
<button class="renoteButton" @click="renote" title="%i18n:@renote%">
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
</button>
<button :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">
<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">
@ -487,20 +487,24 @@ root(isDark)
cursor pointer
&:hover
color isDark ? #9198af : #666
color isDark ? #a1a8bf : #444
&.replyButton:hover
color #0af
&.renoteButton:hover
color #8d0
&.reactionButton:hover
color #fa0
> .count
display inline
margin 0 0 0 8px
color #999
&.reacted
color $theme-color
&:last-child
position absolute
right 0
margin 0
&.reacted, &.reacted:hover
color #fa0
> .detail
padding-top 4px

View File

@ -135,6 +135,12 @@ export default Vue.extend({
return;
}
}
if (this.$store.state.settings.showLocalRenotes === false) {
if (isPureRenote && (note.renote.user.host == null)) {
return;
}
}
//#endregion
// 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知
@ -187,7 +193,7 @@ export default Vue.extend({
clearNotification() {
this.unreadCount = 0;
document.title = config.name;
document.title = (this as any).os.instanceName;
},
onVisibilitychange() {

View File

@ -10,7 +10,7 @@
<span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span>
<a @click="addVisibleUser">%i18n:@add-visible-user%</a>
</div>
<div class="hashtags" v-if="recentHashtags.length > 0">
<div class="hashtags" v-if="recentHashtags.length > 0 && $store.state.settings.suggestRecentHashtags">
<b>%i18n:@recent-tags%:</b>
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" title="%@click-to-tagging%">#{{ tag }}</a>
</div>
@ -23,7 +23,7 @@
<div class="medias" :class="{ with: poll }" v-show="files.length != 0">
<x-draggable :list="files" :options="{ animation: 150 }">
<div v-for="file in files" :key="file.id">
<div class="img" :style="{ backgroundImage: `url(${file.url})` }" :title="file.name"></div>
<div class="img" :style="{ backgroundImage: `url(${file.thumbnailUrl})` }" :title="file.name"></div>
<img class="remove" @click="detachMedia(file.id)" src="/assets/desktop/remove.png" title="%i18n:@attach-cancel%" alt=""/>
</div>
</x-draggable>
@ -58,7 +58,7 @@
import Vue from 'vue';
import insertTextAtCursor from 'insert-text-at-cursor';
import * as XDraggable from 'vuedraggable';
import getKao from '../../../common/scripts/get-kao';
import getFace from '../../../common/scripts/get-face';
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
import parse from '../../../../../mfm/parse';
import { host } from '../../../config';
@ -99,7 +99,7 @@ export default Vue.extend({
useCw: false,
cw: null,
geo: null,
visibility: 'public',
visibility: this.$store.state.device.visibility || 'public',
visibleUsers: [],
autocomplete: null,
draghover: false,
@ -326,8 +326,7 @@ export default Vue.extend({
setVisibility() {
const w = (this as any).os.new(MkVisibilityChooser, {
source: this.$refs.visibilityButton,
v: this.visibility
source: this.$refs.visibilityButton
});
w.$once('chosen', v => {
this.visibility = v;
@ -422,7 +421,7 @@ export default Vue.extend({
},
kao() {
this.text += getKao();
this.text += getFace();
}
}
});

View File

@ -48,9 +48,11 @@
<mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/>
</div>
<mk-switch v-model="$store.state.settings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/>
<mk-switch v-model="$store.state.settings.suggestRecentHashtags" @change="onChangeSuggestRecentHashtags" text="%i18n:@suggest-recent-hashtags%"/>
<mk-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/>
<mk-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/>
<mk-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/>
<mk-switch v-model="$store.state.settings.showLocalRenotes" @change="onChangeShowLocalRenotes" text="%i18n:@show-local-renotes%"/>
<mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%">
<span>%i18n:@show-maps-desc%</span>
</mk-switch>
@ -335,6 +337,12 @@ export default Vue.extend({
value: v
});
},
onChangeSuggestRecentHashtags(v) {
this.$store.dispatch('settings/set', {
key: 'suggestRecentHashtags',
value: v
});
},
onChangeShowReplyTarget(v) {
this.$store.dispatch('settings/set', {
key: 'showReplyTarget',
@ -353,6 +361,12 @@ export default Vue.extend({
value: v
});
},
onChangeShowLocalRenotes(v) {
this.$store.dispatch('settings/set', {
key: 'showLocalRenotes',
value: v
});
},
onChangeShowMaps(v) {
this.$store.dispatch('settings/set', {
key: 'showMaps',

View File

@ -100,7 +100,8 @@ export default Vue.extend({
limit: fetchLimit + 1,
untilDate: this.date ? this.date.getTime() : undefined,
includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
}).then(notes => {
if (notes.length == fetchLimit + 1) {
notes.pop();
@ -122,7 +123,8 @@ export default Vue.extend({
limit: fetchLimit + 1,
untilId: (this.$refs.timeline as any).tail().id,
includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
});
promise.then(notes => {

View File

@ -47,7 +47,8 @@ export default Vue.extend({
listId: this.list.id,
limit: fetchLimit + 1,
includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
}).then(notes => {
if (notes.length == fetchLimit + 1) {
notes.pop();
@ -67,7 +68,8 @@ export default Vue.extend({
limit: fetchLimit + 1,
untilId: (this.$refs.timeline as any).tail().id,
includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
});
promise.then(notes => {

View File

@ -0,0 +1,144 @@
<template>
<div class="zyknedwtlthezamcjlolyusmipqmjgxz">
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
<defs>
<linearGradient :id="cpuGradientId" x1="0" x2="0" y1="1" y2="0">
<stop offset="0%" stop-color="hsl(180, 80%, 70%)"></stop>
<stop offset="100%" stop-color="hsl(0, 80%, 70%)"></stop>
</linearGradient>
<mask :id="cpuMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
<polygon
:points="cpuPolygonPoints"
fill="#fff"
fill-opacity="0.5"/>
<polyline
:points="cpuPolylinePoints"
fill="none"
stroke="#fff"
stroke-width="1"/>
</mask>
</defs>
<rect
x="0" y="0"
:width="viewBoxX" :height="viewBoxY"
:style="`stroke: none; fill: url(#${ cpuGradientId }); mask: url(#${ cpuMaskId })`"/>
<text x="1" y="12">CPU <tspan>{{ cpuP }}%</tspan></text>
</svg>
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
<defs>
<linearGradient :id="memGradientId" x1="0" x2="0" y1="1" y2="0">
<stop offset="0%" stop-color="hsl(180, 80%, 70%)"></stop>
<stop offset="100%" stop-color="hsl(0, 80%, 70%)"></stop>
</linearGradient>
<mask :id="memMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
<polygon
:points="memPolygonPoints"
fill="#fff"
fill-opacity="0.5"/>
<polyline
:points="memPolylinePoints"
fill="none"
stroke="#fff"
stroke-width="1"/>
</mask>
</defs>
<rect
x="0" y="0"
:width="viewBoxX" :height="viewBoxY"
:style="`stroke: none; fill: url(#${ memGradientId }); mask: url(#${ memMaskId })`"/>
<text x="1" y="12">MEM <tspan>{{ memP }}%</tspan></text>
</svg>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import * as uuid from 'uuid';
export default Vue.extend({
props: ['connection'],
data() {
return {
viewBoxX: 200,
viewBoxY: 70,
stats: [],
cpuGradientId: uuid(),
cpuMaskId: uuid(),
memGradientId: uuid(),
memMaskId: uuid(),
cpuPolylinePoints: '',
memPolylinePoints: '',
cpuPolygonPoints: '',
memPolygonPoints: '',
cpuP: '',
memP: ''
};
},
mounted() {
this.connection.on('stats', this.onStats);
this.connection.on('statsLog', this.onStatsLog);
this.connection.send({
type: 'requestLog',
id: Math.random().toString(),
length: 200
});
},
beforeDestroy() {
this.connection.off('stats', this.onStats);
this.connection.off('statsLog', this.onStatsLog);
},
methods: {
onStats(stats) {
this.stats.push(stats);
if (this.stats.length > 200) this.stats.shift();
const cpuPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - s.cpu_usage) * this.viewBoxY]);
const memPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - (s.mem.used / s.mem.total)) * this.viewBoxY]);
this.cpuPolylinePoints = cpuPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
this.memPolylinePoints = memPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
this.cpuPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${this.viewBoxY} ${this.cpuPolylinePoints} ${this.viewBoxX},${this.viewBoxY}`;
this.memPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${this.viewBoxY} ${this.memPolylinePoints} ${this.viewBoxX},${this.viewBoxY}`;
this.cpuP = (stats.cpu_usage * 100).toFixed(0);
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
},
onStatsLog(statsLog) {
statsLog.reverse().forEach(stats => this.onStats(stats));
}
}
});
</script>
<style lang="stylus" scoped>
root(isDark)
> svg
display block
width 50%
float left
&:first-child
padding-right 5px
&:last-child
padding-left 5px
> text
font-size 10px
fill isDark ? rgba(#fff, 0.55) : rgba(#000, 0.55)
> tspan
opacity 0.5
&:after
content ""
display block
clear both
.zyknedwtlthezamcjlolyusmipqmjgxz[data-darkmode]
root(true)
.zyknedwtlthezamcjlolyusmipqmjgxz:not([data-darkmode])
root(false)
</style>

View File

@ -1,37 +1,86 @@
<template>
<div>
<h1>%i18n:@dashboard%</h1>
<div v-if="stats">
<p><b>%i18n:@all-users%</b>: <span>{{ stats.usersCount | number }}</span></p>
<p><b>%i18n:@original-users%</b>: <span>{{ stats.originalUsersCount | number }}</span></p>
<p><b>%i18n:@all-notes%</b>: <span>{{ stats.notesCount | number }}</span></p>
<p><b>%i18n:@original-notes%</b>: <span>{{ stats.originalNotesCount | number }}</span></p>
<div class="obdskegsannmntldydackcpzezagxqfy card">
<header>%i18n:@dashboard%</header>
<div v-if="stats" class="stats">
<div><b>%fa:user% {{ stats.originalUsersCount | number }}</b><span>%i18n:@original-users%</span></div>
<div><span>%fa:user% {{ stats.usersCount | number }}</span><span>%i18n:@all-users%</span></div>
<div><b>%fa:pen% {{ stats.originalNotesCount | number }}</b><span>%i18n:@original-notes%</span></div>
<div><span>%fa:pen% {{ stats.notesCount | number }}</span><span>%i18n:@all-notes%</span></div>
</div>
<div class="cpu-memory">
<x-cpu-memory :connection="connection"/>
</div>
<div>
<button class="ui" @click="invite">%i18n:@invite%</button>
<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p>
</div>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import XCpuMemory from "./admin.cpu-memory.vue";
export default Vue.extend({
components: {
XCpuMemory
},
data() {
return {
stats: null
stats: null,
inviteCode: null,
connection: null,
connectionId: null
};
},
created() {
this.connection = (this as any).os.streams.serverStatsStream.getConnection();
this.connectionId = (this as any).os.streams.serverStatsStream.use();
(this as any).api('stats').then(stats => {
this.stats = stats;
});
},
beforeDestroy() {
(this as any).os.streams.serverStatsStream.dispose(this.connectionId);
},
methods: {
invite() {
(this as any).api('admin/invite').then(x => {
this.inviteCode = x.code;
});
}
}
});
</script>
<style lang="stylus" scoped>
h1
margin 0 0 1em 0
padding 0 0 8px 0
font-size 1em
color #555
border-bottom solid 1px #eee
@import '~const.styl'
.obdskegsannmntldydackcpzezagxqfy
> .stats
display flex
justify-content center
margin-bottom 16px
padding 16px
border solid 1px #eee
border-radius 8px
> div
flex 1
text-align center
> *:first-child
display block
color $theme-color
> *:last-child
font-size 70%
> .cpu-memory
margin-bottom 16px
padding 16px
border solid 1px #eee
border-radius: 8px
</style>

View File

@ -0,0 +1,51 @@
<template>
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
<polyline
:points="points"
fill="none"
stroke-width="1"
stroke="#555"/>
</svg>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: {
chart: {
required: true
},
type: {
type: String,
required: true
}
},
data() {
return {
viewBoxX: 365,
viewBoxY: 70,
points: null
};
},
created() {
const peak = Math.max.apply(null, this.chart.map(d => this.type == 'local' ? d.drive.local.totalSize : d.drive.remote.totalSize));
if (peak != 0) {
const data = this.chart.slice().reverse().map(x => ({
size: this.type == 'local' ? x.drive.local.totalSize : x.drive.remote.totalSize
}));
this.points = data.map((d, i) => `${i},${(1 - (d.size / peak)) * this.viewBoxY}`).join(' ');
}
}
});
</script>
<style lang="stylus" scoped>
svg
display block
padding 10px
width 100%
</style>

View File

@ -0,0 +1,34 @@
<template>
<div class="card">
<header>%i18n:@title%</header>
<div class="card">
<header>%i18n:@local%</header>
<x-chart v-if="chart" :chart="chart" type="local"/>
</div>
<div class="card">
<header>%i18n:@remote%</header>
<x-chart v-if="chart" :chart="chart" type="remote"/>
</div>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import XChart from "./admin.drive-chart.chart.vue";
export default Vue.extend({
components: {
XChart
},
props: {
chart: {
required: true
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
</style>

View File

@ -0,0 +1,76 @@
<template>
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
<polyline
:points="pointsNote"
fill="none"
stroke-width="1"
stroke="#41ddde"/>
<polyline
:points="pointsReply"
fill="none"
stroke-width="1"
stroke="#f7796c"/>
<polyline
:points="pointsRenote"
fill="none"
stroke-width="1"
stroke="#a1de41"/>
<polyline
:points="pointsTotal"
fill="none"
stroke-width="1"
stroke="#555"
stroke-dasharray="2 2"/>
</svg>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: {
chart: {
required: true
},
type: {
type: String,
required: true
}
},
data() {
return {
viewBoxX: 365,
viewBoxY: 70,
pointsNote: null,
pointsReply: null,
pointsRenote: null,
pointsTotal: null
};
},
created() {
const peak = Math.max.apply(null, this.chart.map(d => this.type == 'local' ? d.notes.local.diff : d.notes.remote.diff));
if (peak != 0) {
const data = this.chart.slice().reverse().map(x => ({
normal: this.type == 'local' ? x.notes.local.diffs.normal : x.notes.remote.diffs.normal,
reply: this.type == 'local' ? x.notes.local.diffs.reply : x.notes.remote.diffs.reply,
renote: this.type == 'local' ? x.notes.local.diffs.renote : x.notes.remote.diffs.renote,
total: this.type == 'local' ? x.notes.local.diff : x.notes.remote.diff
}));
this.pointsNote = data.map((d, i) => `${i},${(1 - (d.normal / peak)) * this.viewBoxY}`).join(' ');
this.pointsReply = data.map((d, i) => `${i},${(1 - (d.reply / peak)) * this.viewBoxY}`).join(' ');
this.pointsRenote = data.map((d, i) => `${i},${(1 - (d.renote / peak)) * this.viewBoxY}`).join(' ');
this.pointsTotal = data.map((d, i) => `${i},${(1 - (d.total / peak)) * this.viewBoxY}`).join(' ');
}
}
});
</script>
<style lang="stylus" scoped>
svg
display block
padding 10px
width 100%
</style>

View File

@ -0,0 +1,34 @@
<template>
<div class="card">
<header>%i18n:@title%</header>
<div class="card">
<header>%i18n:@local%</header>
<x-chart v-if="chart" :chart="chart" type="local"/>
</div>
<div class="card">
<header>%i18n:@remote%</header>
<x-chart v-if="chart" :chart="chart" type="remote"/>
</div>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import XChart from "./admin.notes-chart.chart.vue";
export default Vue.extend({
components: {
XChart
},
props: {
chart: {
required: true
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
</style>

View File

@ -1,5 +1,5 @@
<template>
<div>
<div class="card">
<header>%i18n:@suspend-user%</header>
<input v-model="username" type="text" class="ui"/>
<button class="ui" @click="suspendUser" :disabled="suspending">%i18n:@suspend%</button>

View File

@ -1,5 +1,5 @@
<template>
<div>
<div class="card">
<header>%i18n:@unsuspend-user%</header>
<input v-model="username" type="text" class="ui"/>
<button class="ui" @click="unsuspendUser" :disabled="unsuspending">%i18n:@unsuspend%</button>

View File

@ -0,0 +1,51 @@
<template>
<div class="card">
<header>%i18n:@unverify-user%</header>
<input v-model="username" type="text" class="ui"/>
<button class="ui" @click="unverifyUser" :disabled="unverifying">%i18n:@unverify%</button>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import parseAcct from "../../../../../../misc/acct/parse";
export default Vue.extend({
data() {
return {
username: null,
unverifying: false
};
},
methods: {
async unverifyUser() {
this.unverifying = true;
const user = await (this as any).os.api(
"users/show",
parseAcct(this.username)
);
await (this as any).os.api("admin/unverify-user", {
userId: user.id
});
this.unverifying = false;
(this as any).os.apis.dialog({ text: "%i18n:@unverified%" });
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
header
margin 10px 0
button
margin 16px 0
</style>

View File

@ -0,0 +1,51 @@
<template>
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
<polyline
:points="points"
fill="none"
stroke-width="1"
stroke="#555"/>
</svg>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: {
chart: {
required: true
},
type: {
type: String,
required: true
}
},
data() {
return {
viewBoxX: 365,
viewBoxY: 70,
points: null
};
},
created() {
const peak = Math.max.apply(null, this.chart.map(d => this.type == 'local' ? d.users.local.diff : d.users.remote.diff));
if (peak != 0) {
const data = this.chart.slice().reverse().map(x => ({
count: this.type == 'local' ? x.users.local.diff : x.users.remote.diff
}));
this.points = data.map((d, i) => `${i},${(1 - (d.count / peak)) * this.viewBoxY}`).join(' ');
}
}
});
</script>
<style lang="stylus" scoped>
svg
display block
padding 10px
width 100%
</style>

View File

@ -0,0 +1,34 @@
<template>
<div class="card">
<header>%i18n:@title%</header>
<div class="card">
<header>%i18n:@local%</header>
<x-chart v-if="chart" :chart="chart" type="local"/>
</div>
<div class="card">
<header>%i18n:@remote%</header>
<x-chart v-if="chart" :chart="chart" type="remote"/>
</div>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import XChart from "./admin.users-chart.chart.vue";
export default Vue.extend({
components: {
XChart
},
props: {
chart: {
required: true
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
</style>

View File

@ -0,0 +1,51 @@
<template>
<div class="card">
<header>%i18n:@verify-user%</header>
<input v-model="username" type="text" class="ui"/>
<button class="ui" @click="verifyUser" :disabled="verifying">%i18n:@verify%</button>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import parseAcct from "../../../../../../misc/acct/parse";
export default Vue.extend({
data() {
return {
username: null,
verifying: false
};
},
methods: {
async verifyUser() {
this.verifying = true;
const user = await (this as any).os.api(
"users/show",
parseAcct(this.username)
);
await (this as any).os.api("admin/verify-user", {
userId: user.id
});
this.verifying = false;
(this as any).os.apis.dialog({ text: "%i18n:@verified%" });
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
header
margin 10px 0
button
margin 16px 0
</style>

View File

@ -9,12 +9,17 @@
</ul>
</nav>
<main>
<div v-if="page == 'dashboard'">
<div v-show="page == 'dashboard'">
<x-dashboard/>
<x-users-chart :chart="chart"/>
<x-notes-chart :chart="chart"/>
<x-drive-chart :chart="chart"/>
</div>
<div v-if="page == 'users'">
<x-suspend-user/>
<x-unsuspend-user/>
<x-verify-user/>
<x-unverify-user/>
</div>
<div v-if="page == 'drive'"></div>
<div v-if="page == 'update'"></div>
@ -27,18 +32,34 @@ import Vue from "vue";
import XDashboard from "./admin.dashboard.vue";
import XSuspendUser from "./admin.suspend-user.vue";
import XUnsuspendUser from "./admin.unsuspend-user.vue";
import XVerifyUser from "./admin.verify-user.vue";
import XUnverifyUser from "./admin.unverify-user.vue";
import XUsersChart from "./admin.users-chart.vue";
import XNotesChart from "./admin.notes-chart.vue";
import XDriveChart from "./admin.drive-chart.vue";
export default Vue.extend({
components: {
XDashboard,
XSuspendUser,
XUnsuspendUser
XUnsuspendUser,
XVerifyUser,
XUnverifyUser,
XUsersChart,
XNotesChart,
XDriveChart
},
data() {
return {
page: 'dashboard'
page: 'dashboard',
chart: null
};
},
created() {
(this as any).api('admin/chart').then(chart => {
this.chart = chart;
});
},
methods: {
nav(page: string) {
this.page = page;
@ -47,7 +68,7 @@ export default Vue.extend({
});
</script>
<style lang="stylus" scoped>
<style lang="stylus">
@import '~const.styl'
.mk-admin
@ -90,13 +111,23 @@ export default Vue.extend({
width 100%
padding 16px 32px
header
margin 10px 0
> div
> div
max-width 800px
.card
padding 32px
background #fff
box-shadow 0 2px 8px rgba(#000, 0.1)
button
margin 16px 0
position absolute
right 0
&:not(:last-child)
margin-bottom 16px
> header
margin 0 0 1em 0
padding 0 0 8px 0
font-size 1em
color #555
border-bottom solid 1px #eee
</style>

View File

@ -70,7 +70,8 @@ export default Vue.extend({
limit: fetchLimit + 1,
mediaOnly: this.mediaOnly,
includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
}).then(notes => {
if (notes.length == fetchLimit + 1) {
notes.pop();
@ -91,7 +92,8 @@ export default Vue.extend({
untilId: (this.$refs.timeline as any).tail().id,
mediaOnly: this.mediaOnly,
includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
});
promise.then(notes => {

View File

@ -140,6 +140,12 @@ export default Vue.extend({
return;
}
}
if (this.$store.state.settings.showLocalRenotes === false) {
if (isPureRenote && (note.renote.user.host == null)) {
return;
}
}
//#endregion
if (this.isScrollTop()) {

View File

@ -98,7 +98,8 @@ export default Vue.extend({
limit: fetchLimit + 1,
mediaOnly: this.mediaOnly,
includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
}).then(notes => {
if (notes.length == fetchLimit + 1) {
notes.pop();
@ -119,7 +120,8 @@ export default Vue.extend({
mediaOnly: this.mediaOnly,
untilId: (this.$refs.timeline as any).tail().id,
includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
});
promise.then(notes => {

View File

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

View File

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

View File

@ -12,12 +12,11 @@
<script lang="ts">
import Vue from 'vue';
import * as config from '../../../config';
export default Vue.extend({
data() {
return {
name: config.name,
name: (this as any).os.instanceName,
posted: false,
text: new URLSearchParams(location.search).get('text')
};

View File

@ -5,7 +5,7 @@
<template v-if="$store.state.device.darkmode">%fa:moon%</template>
<template v-else>%fa:R moon%</template>
</button>
<div class="body" :style="{ backgroundImage: `url('${ welcomeBgUrl }')` }">
<div class="body">
<div class="container">
<div class="info">
<span><b>{{ host }}</b></span>
@ -46,22 +46,26 @@
<script lang="ts">
import Vue from 'vue';
import { host, name, description, copyright, welcomeBgUrl } from '../../../config';
import { host, copyright } from '../../../config';
export default Vue.extend({
data() {
return {
stats: null,
copyright,
welcomeBgUrl,
host,
name,
description,
name: 'Misskey',
description: '',
pointerInterval: null,
tags: []
};
},
created() {
(this as any).os.getMeta().then(meta => {
this.name = meta.name;
this.description = meta.description;
});
(this as any).api('stats').then(stats => {
this.stats = stats;
});

View File

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

View File

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

View File

@ -30,6 +30,10 @@
<span class="data-size">{{ file.datasize | bytes }}</span>
<span class="separator"></span>
<span class="created-at" @click="showCreatedAt">%fa:R clock%<mk-time :time="file.createdAt"/></span>
<template v-if="file.isSensitive">
<span class="separator"></span>
<span class="nsfw">%fa:eye-slash% %i18n:@nsfw%</span>
</template>
</div>
</div>
<div class="menu">
@ -198,6 +202,9 @@ export default Vue.extend({
> [data-fa]
margin-right 2px
> .nsfw
color #bf4633
> .menu
padding 14px
border-top solid 1px #dfdfdf

View File

@ -14,13 +14,17 @@
li.tag(style={background: tag.color, color: contrast(tag.color)})= tag.name
-->
<footer>
<p class="type"><mk-file-type-icon :type="file.type"/>{{ file.type }}</p>
<p class="separator"></p>
<p class="data-size">{{ file.datasize | bytes }}</p>
<p class="separator"></p>
<p class="created-at">
<span class="type"><mk-file-type-icon :type="file.type"/>{{ file.type }}</span>
<span class="separator"></span>
<span class="data-size">{{ file.datasize | bytes }}</span>
<span class="separator"></span>
<span class="created-at">
%fa:R clock%<mk-time :time="file.createdAt"/>
</p>
</span>
<template v-if="file.isSensitive">
<span class="separator"></span>
<span class="nsfw">%fa:eye-slash% %i18n:@nsfw%</span>
</template>
</footer>
</div>
</div>
@ -133,35 +137,27 @@ export default Vue.extend({
font-size 0.7em
> .separator
display inline
margin 0
padding 0 4px
color #CDCDCD
> .type
display inline
margin 0
padding 0
color #9D9D9D
> .mk-file-type-icon
margin-right 4px
> .data-size
display inline
margin 0
padding 0
color #9D9D9D
> .created-at
display inline
margin 0
padding 0
color #BDBDBD
> [data-fa]
margin-right 2px
> .nsfw
color #bf4633
&[data-is-selected]
background $theme-color

View File

@ -38,7 +38,6 @@
<script lang="ts">
import Vue from 'vue';
import getNoteSummary from '../../../../../misc/get-note-summary';
import * as config from '../../../config';
const displayLimit = 30;
@ -139,6 +138,12 @@ export default Vue.extend({
return;
}
}
if (this.$store.state.settings.showLocalRenotes === false) {
if (isPureRenote && (note.renote.user.host == null)) {
return;
}
}
//#endregion
// 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知
@ -184,7 +189,7 @@ export default Vue.extend({
clearNotification() {
this.unreadCount = 0;
document.title = config.name;
document.title = (this as any).os.instanceName;
},
onVisibilitychange() {

View File

@ -21,7 +21,7 @@
<div class="attaches" v-show="files.length != 0">
<x-draggable class="files" :list="files" :options="{ animation: 150 }">
<div class="file" v-for="file in files" :key="file.id">
<div class="img" :style="`background-image: url(${file.url})`" @click="detachMedia(file)"></div>
<div class="img" :style="`background-image: url(${file.thumbnailUrl})`" @click="detachMedia(file)"></div>
</div>
</x-draggable>
</div>
@ -45,7 +45,7 @@
<input ref="file" class="file" type="file" accept="image/*" multiple="multiple" @change="onChangeFile"/>
</div>
</div>
<div class="hashtags" v-if="recentHashtags.length > 0">
<div class="hashtags" v-if="recentHashtags.length > 0 && $store.state.settings.suggestRecentHashtags">
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)">#{{ tag }}</a>
</div>
</div>
@ -56,7 +56,7 @@ import Vue from 'vue';
import insertTextAtCursor from 'insert-text-at-cursor';
import * as XDraggable from 'vuedraggable';
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
import getKao from '../../../common/scripts/get-kao';
import getFace from '../../../common/scripts/get-face';
import parse from '../../../../../mfm/parse';
import { host } from '../../../config';
@ -94,7 +94,7 @@ export default Vue.extend({
files: [],
poll: false,
geo: null,
visibility: 'public',
visibility: this.$store.state.device.visibility || 'public',
visibleUsers: [],
useCw: false,
cw: null,
@ -240,8 +240,7 @@ export default Vue.extend({
setVisibility() {
const w = (this as any).os.new(MkVisibilityChooser, {
source: this.$refs.visibilityButton,
compact: true,
v: this.visibility
compact: true
});
w.$once('chosen', v => {
this.visibility = v;
@ -314,7 +313,7 @@ export default Vue.extend({
},
kao() {
this.text += getKao();
this.text += getFace();
}
}
});

View File

@ -8,7 +8,7 @@
<button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button>
<template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template>
<h1>
<slot>config.name</slot>
<slot>{{ os.instanceName }}</slot>
</h1>
<slot name="func"></slot>
</div>
@ -20,13 +20,11 @@
<script lang="ts">
import Vue from 'vue';
import * as anime from 'animejs';
import * as config from '../../../config';
export default Vue.extend({
props: ['func'],
data() {
return {
config,
hasGameInvitation: false,
connection: null,
connectionId: null

View File

@ -59,7 +59,8 @@ export default Vue.extend({
listId: this.list.id,
limit: fetchLimit + 1,
includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
}).then(notes => {
if (notes.length == fetchLimit + 1) {
notes.pop();
@ -82,7 +83,8 @@ export default Vue.extend({
limit: fetchLimit + 1,
untilId: (this.$refs.timeline as any).tail().id,
includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
});
promise.then(notes => {

View File

@ -25,7 +25,6 @@
<script lang="ts">
import Vue from 'vue';
import Progress from '../../../common/scripts/loading';
import * as config from '../../../config';
export default Vue.extend({
data() {
@ -44,7 +43,7 @@ export default Vue.extend({
window.addEventListener('popstate', this.onPopState);
},
mounted() {
document.title = `${config.name} Drive`;
document.title = `${(this as any).os.instanceName} Drive`;
document.documentElement.style.background = '#fff';
},
beforeDestroy() {
@ -64,7 +63,7 @@ export default Vue.extend({
(this.$refs as any).browser.openContextMenu();
},
onMoveRoot(silent) {
const title = `${config.name} Drive`;
const title = `${(this as any).os.instanceName} Drive`;
if (!silent) {
// Rewrite URL
@ -77,7 +76,7 @@ export default Vue.extend({
this.folder = null;
},
onOpenFolder(folder, silent) {
const title = `${folder.name} | ${config.name} Drive`;
const title = `${folder.name} | ${(this as any).os.instanceName} Drive`;
if (!silent) {
// Rewrite URL
@ -90,7 +89,7 @@ export default Vue.extend({
this.folder = folder;
},
onOpenFile(file, silent) {
const title = `${file.name} | ${config.name} Drive`;
const title = `${file.name} | ${(this as any).os.instanceName} Drive`;
if (!silent) {
// Rewrite URL

View File

@ -14,7 +14,6 @@
<script lang="ts">
import Vue from 'vue';
import Progress from '../../../common/scripts/loading';
import * as config from '../../../config';
export default Vue.extend({
data() {
@ -29,7 +28,7 @@ export default Vue.extend({
this.fetch();
},
mounted() {
document.title = `${config.name} | %i18n:@notifications%`;
document.title = `${(this as any).os.instanceName} | %i18n:@notifications%`;
},
methods: {
fetch() {

View File

@ -21,7 +21,6 @@ import Vue from 'vue';
import Progress from '../../../common/scripts/loading';
import parseAcct from '../../../../../misc/acct/parse';
import getUserName from '../../../../../misc/get-user-name';
import * as config from '../../../config';
export default Vue.extend({
data() {
@ -50,7 +49,7 @@ export default Vue.extend({
this.user = user;
this.fetching = false;
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + config.name;
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + (this as any).os.instanceName;
});
},
onLoaded() {

View File

@ -20,7 +20,6 @@
import Vue from 'vue';
import Progress from '../../../common/scripts/loading';
import parseAcct from '../../../../../misc/acct/parse';
import * as config from '../../../config';
export default Vue.extend({
data() {
@ -49,7 +48,7 @@ export default Vue.extend({
this.user = user;
this.fetching = false;
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + config.name;
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + (this as any).os.instanceName;
});
},
onLoaded() {

View File

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

View File

@ -95,7 +95,8 @@ export default Vue.extend({
limit: fetchLimit + 1,
untilDate: this.date ? this.date.getTime() : undefined,
includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
}).then(notes => {
if (notes.length == fetchLimit + 1) {
notes.pop();
@ -117,7 +118,8 @@ export default Vue.extend({
limit: fetchLimit + 1,
untilId: (this.$refs.timeline as any).tail().id,
includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
});
promise.then(notes => {

View File

@ -49,7 +49,6 @@
import Vue from 'vue';
import Progress from '../../../common/scripts/loading';
import XTl from './home.timeline.vue';
import * as config from '../../../config';
export default Vue.extend({
components: {
@ -97,7 +96,7 @@ export default Vue.extend({
},
mounted() {
document.title = config.name;
document.title = (this as any).os.instanceName;
Progress.start();

View File

@ -11,7 +11,6 @@
<script lang="ts">
import Vue from 'vue';
import parseAcct from '../../../../../misc/acct/parse';
import * as config from '../../../config';
export default Vue.extend({
data() {
@ -48,7 +47,7 @@ export default Vue.extend({
this.user = user;
this.fetching = false;
document.title = `%i18n:@messaging%: ${Vue.filter('userName')(this.user)} | ${config.name}`;
document.title = `%i18n:@messaging%: ${Vue.filter('userName')(this.user)} | ${(this as any).os.instanceName}`;
});
}
}

View File

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

View File

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

View File

@ -12,7 +12,6 @@
<script lang="ts">
import Vue from 'vue';
import Progress from '../../../common/scripts/loading';
import * as config from '../../../config';
const limit = 20;
@ -35,7 +34,7 @@ export default Vue.extend({
}
},
mounted() {
document.title = `%i18n:@search%: ${this.q} | ${config.name}`;
document.title = `%i18n:@search%: ${this.q} | ${(this as any).os.instanceName}`;
this.fetch();
},

View File

@ -21,6 +21,7 @@
<ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch>
<ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch>
<ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch>
<ui-switch v-model="$store.state.settings.showLocalRenotes" @change="onChangeShowLocalRenotes">%i18n:@show-local-renotes%</ui-switch>
</div>
<div>
@ -221,6 +222,13 @@ export default Vue.extend({
});
},
onChangeShowLocalRenotes(v) {
this.$store.dispatch('settings/set', {
key: 'showLocalRenotes',
value: v
});
},
checkForUpdate() {
this.checkingForUpdate = true;
checkForUpdate((this as any).os, true, true).then(newer => {

View File

@ -61,7 +61,6 @@ export default Vue.extend({
birthday: null,
avatarId: null,
bannerId: null,
isBot: false,
isCat: false,
saving: false,
avatarUploading: false,
@ -77,7 +76,6 @@ export default Vue.extend({
this.birthday = this.$store.state.i.profile.birthday;
this.avatarId = this.$store.state.i.avatarId;
this.bannerId = this.$store.state.i.bannerId;
this.isBot = this.$store.state.i.isBot;
this.isCat = this.$store.state.i.isCat;
},
@ -93,15 +91,15 @@ export default Vue.extend({
method: 'POST',
body: data
})
.then(response => response.json())
.then(f => {
this.avatarId = f.id;
this.avatarUploading = false;
})
.catch(e => {
this.avatarUploading = false;
alert('%18n:!@upload-failed%');
});
.then(response => response.json())
.then(f => {
this.avatarId = f.id;
this.avatarUploading = false;
})
.catch(e => {
this.avatarUploading = false;
alert('%18n:@upload-failed%');
});
},
onBannerChange([file]) {
@ -115,15 +113,15 @@ export default Vue.extend({
method: 'POST',
body: data
})
.then(response => response.json())
.then(f => {
this.bannerId = f.id;
this.bannerUploading = false;
})
.catch(e => {
this.bannerUploading = false;
alert('%18n:!@upload-failed%');
});
.then(response => response.json())
.then(f => {
this.bannerId = f.id;
this.bannerUploading = false;
})
.catch(e => {
this.bannerUploading = false;
alert('%18n:@upload-failed%');
});
},
save() {
@ -136,7 +134,6 @@ export default Vue.extend({
birthday: this.birthday || null,
avatarId: this.avatarId,
bannerId: this.bannerId,
isBot: this.isBot,
isCat: this.isCat
}).then(i => {
this.saving = false;

View File

@ -12,12 +12,11 @@
<script lang="ts">
import Vue from 'vue';
import * as config from '../../../config';
export default Vue.extend({
data() {
return {
name: config.name,
name: (this as any).os.instanceName,
posted: false,
text: new URLSearchParams(location.search).get('text')
};

View File

@ -67,7 +67,6 @@ import * as age from 's-age';
import parseAcct from '../../../../../misc/acct/parse';
import Progress from '../../../common/scripts/loading';
import XHome from './user/home.vue';
import * as config from '../../../config';
export default Vue.extend({
components: {
@ -107,7 +106,7 @@ export default Vue.extend({
this.fetching = false;
Progress.done();
document.title = Vue.filter('userName')(this.user) + ' | ' + config.name;
document.title = Vue.filter('userName')(this.user) + ' | ' + (this as any).os.instanceName;
});
}
}
@ -248,7 +247,7 @@ root(isDark)
top 47px
box-shadow 0 4px 4px isDark ? rgba(#000, 0.3) : rgba(#000, 0.07)
background-color $bg
z-index 1
z-index 2
> .nav-container
display flex

View File

@ -30,7 +30,7 @@
<script lang="ts">
import Vue from 'vue';
import { apiUrl, copyright, host, name, description } from '../../../config';
import { apiUrl, copyright, host } from '../../../config';
export default Vue.extend({
data() {
@ -39,12 +39,17 @@ export default Vue.extend({
copyright,
stats: null,
host,
name,
description,
name: 'Misskey',
description: '',
tags: []
};
},
created() {
(this as any).os.getMeta().then(meta => {
this.name = meta.name;
this.description = meta.description;
});
(this as any).api('stats').then(stats => {
this.stats = stats;
});

View File

@ -53,7 +53,6 @@
import Vue from 'vue';
import * as XDraggable from 'vuedraggable';
import * as uuid from 'uuid';
import * as config from '../../../config';
export default Vue.extend({
components: {
@ -103,7 +102,7 @@ export default Vue.extend({
},
mounted() {
document.title = config.name;
document.title = (this as any).os.instanceName;
},
methods: {

View File

@ -1,10 +0,0 @@
@import "../app"
@import "../reset"
html
color #456267
background #fff
body
margin 0
padding 0

View File

@ -1,209 +0,0 @@
<mk-index>
<h1>Misskey<i>Statistics</i></h1>
<main v-if="!initializing">
<mk-users stats={ stats }/>
<mk-notes stats={ stats }/>
</main>
<footer><a href={ _URL_ }>{ _HOST_ }</a></footer>
<style lang="stylus" scoped>
:scope
display block
margin 0 auto
padding 0 16px
max-width 700px
> h1
margin 0
padding 24px 0 0 0
font-size 24px
font-weight normal
> i
font-style normal
color #f43b16
> main
> *
margin 24px 0
padding-top 24px
border-top solid 1px #eee
> h2
margin 0 0 12px 0
font-size 18px
font-weight normal
> footer
margin 24px 0
text-align center
> a
color #546567
</style>
<script lang="typescript">
this.mixin('api');
this.initializing = true;
this.on('mount', () => {
this.$root.$data.os.api('stats').then(stats => {
this.update({
initializing: false,
stats
});
});
});
</script>
</mk-index>
<mk-notes>
<h2>%i18n:stats.notes-count% <b>{ stats.notesCount }</b></h2>
<mk-notes-chart v-if="!initializing" data={ data }/>
<style lang="stylus" scoped>
:scope
display block
</style>
<script lang="typescript">
this.mixin('api');
this.initializing = true;
this.stats = this.opts.stats;
this.on('mount', () => {
this.$root.$data.os.api('aggregation/notes', {
limit: 365
}).then(data => {
this.update({
initializing: false,
data
});
});
});
</script>
</mk-notes>
<mk-users>
<h2>%i18n:stats.users-count% <b>{ stats.usersCount }</b></h2>
<mk-users-chart v-if="!initializing" data={ data }/>
<style lang="stylus" scoped>
:scope
display block
</style>
<script lang="typescript">
this.mixin('api');
this.initializing = true;
this.stats = this.opts.stats;
this.on('mount', () => {
this.$root.$data.os.api('aggregation/users', {
limit: 365
}).then(data => {
this.update({
initializing: false,
data
});
});
});
</script>
</mk-users>
<mk-notes-chart>
<svg riot-viewBox="0 0 { viewBoxX } { viewBoxY }" preserveAspectRatio="none">
<title>Black ... Total<br/>Blue ... Notes<br/>Red ... Replies<br/>Green ... Renotes</title>
<polyline
riot-points={ pointsNote }
fill="none"
stroke-width="1"
stroke="#41ddde"/>
<polyline
riot-points={ pointsReply }
fill="none"
stroke-width="1"
stroke="#f7796c"/>
<polyline
riot-points={ pointsRenote }
fill="none"
stroke-width="1"
stroke="#a1de41"/>
<polyline
riot-points={ pointsTotal }
fill="none"
stroke-width="1"
stroke="#555"
stroke-dasharray="2 2"/>
</svg>
<style lang="stylus" scoped>
:scope
display block
> svg
display block
padding 1px
width 100%
</style>
<script lang="typescript">
this.viewBoxX = 365;
this.viewBoxY = 80;
this.data = this.opts.data.reverse();
this.data.forEach(d => d.total = d.notes + d.replies + d.renotes);
const peak = Math.max.apply(null, this.data.map(d => d.total));
this.on('mount', () => {
this.render();
});
this.render = () => {
this.update({
pointsNote: this.data.map((d, i) => `${i},${(1 - (d.notes / peak)) * this.viewBoxY}`).join(' '),
pointsReply: this.data.map((d, i) => `${i},${(1 - (d.replies / peak)) * this.viewBoxY}`).join(' '),
pointsRenote: this.data.map((d, i) => `${i},${(1 - (d.renotes / peak)) * this.viewBoxY}`).join(' '),
pointsTotal: this.data.map((d, i) => `${i},${(1 - (d.total / peak)) * this.viewBoxY}`).join(' ')
});
};
</script>
</mk-notes-chart>
<mk-users-chart>
<svg riot-viewBox="0 0 { viewBoxX } { viewBoxY }" preserveAspectRatio="none">
<polyline
riot-points={ createdPoints }
fill="none"
stroke-width="1"
stroke="#1cde84"/>
<polyline
riot-points={ totalPoints }
fill="none"
stroke-width="1"
stroke="#555"/>
</svg>
<style lang="stylus" scoped>
:scope
display block
> svg
display block
padding 1px
width 100%
</style>
<script lang="typescript">
this.viewBoxX = 365;
this.viewBoxY = 80;
this.data = this.opts.data.reverse();
const totalPeak = Math.max.apply(null, this.data.map(d => d.total));
const createdPeak = Math.max.apply(null, this.data.map(d => d.created));
this.on('mount', () => {
this.render();
});
this.render = () => {
this.update({
totalPoints: this.data.map((d, i) => `${i},${(1 - (d.total / totalPeak)) * this.viewBoxY}`).join(' '),
createdPoints: this.data.map((d, i) => `${i},${(1 - (d.created / createdPeak)) * this.viewBoxY}`).join(' ')
});
};
</script>
</mk-users-chart>

View File

@ -1 +0,0 @@
require('./index.tag');

View File

@ -1,10 +0,0 @@
@import "../app"
@import "../reset"
html
color #456267
background #fff
body
margin 0
padding 0

View File

@ -1,201 +0,0 @@
<mk-index>
<h1>Misskey<i>Status</i></h1>
<p>%fa:info-circle%%i18n:status.all-systems-maybe-operational%</p>
<main>
<mk-cpu-usage connection={ connection }/>
<mk-mem-usage connection={ connection }/>
</main>
<footer><a href={ _URL_ }>{ _HOST_ }</a></footer>
<style lang="stylus" scoped>
:scope
display block
margin 0 auto
padding 0 16px
max-width 700px
> h1
margin 0
padding 24px 0 16px 0
font-size 24px
font-weight normal
> [data-fa]
font-style normal
color #f43b16
> p
display block
margin 0
padding 12px 16px
background #eaf4ef
//border solid 1px #99ccb2
border-radius 4px
> [data-fa]
margin-right 5px
> main
> *
margin 24px 0
> h2
margin 0 0 12px 0
font-size 18px
font-weight normal
> footer
margin 24px 0
text-align center
> a
color #546567
</style>
<script lang="typescript">
import Connection from '../../common/scripts/streaming/server-stream';
this.mixin('api');
this.initializing = true;
this.connection = new Connection();
this.on('mount', () => {
this.$root.$data.os.api('meta').then(meta => {
this.update({
initializing: false,
meta
});
});
});
this.on('unmount', () => {
this.connection.close();
});
</script>
</mk-index>
<mk-cpu-usage>
<h2>CPU <b>{ percentage }%</b></h2>
<mk-line-chart ref="chart"/>
<style lang="stylus" scoped>
:scope
display block
</style>
<script lang="typescript">
this.connection = this.opts.connection;
this.on('mount', () => {
this.connection.on('stats', this.onStats);
});
this.on('unmount', () => {
this.connection.off('stats', this.onStats);
});
this.onStats = stats => {
this.$refs.chart.addData(1 - stats.cpu_usage);
const percentage = (stats.cpu_usage * 100).toFixed(0);
this.update({
percentage
});
};
</script>
</mk-cpu-usage>
<mk-mem-usage>
<h2>MEM <b>{ percentage }%</b></h2>
<mk-line-chart ref="chart"/>
<style lang="stylus" scoped>
:scope
display block
</style>
<script lang="typescript">
this.connection = this.opts.connection;
this.on('mount', () => {
this.connection.on('stats', this.onStats);
});
this.on('unmount', () => {
this.connection.off('stats', this.onStats);
});
this.onStats = stats => {
stats.mem.used = stats.mem.total - stats.mem.free;
this.$refs.chart.addData(1 - (stats.mem.used / stats.mem.total));
const percentage = (stats.mem.used / stats.mem.total * 100).toFixed(0);
this.update({
percentage
});
};
</script>
</mk-mem-usage>
<mk-line-chart>
<svg riot-viewBox="0 0 { viewBoxX } { viewBoxY }" preserveAspectRatio="none">
<defs>
<linearGradient id={ gradientId } x1="0" x2="0" y1="1" y2="0">
<stop offset="0%" stop-color="rgba(244, 59, 22, 0)"></stop>
<stop offset="100%" stop-color="#f43b16"></stop>
</linearGradient>
<mask id={ maskId } x="0" y="0" riot-width={ viewBoxX } riot-height={ viewBoxY }>
<polygon
riot-points={ polygonPoints }
fill="#fff"
fill-opacity="0.5"/>
</mask>
</defs>
<line x1="0" y1="0" riot-x2={ viewBoxX } y2="0" stroke="rgba(255, 255, 255, 0.1)" stroke-width="0.25" stroke-dasharray="1"/>
<line x1="0" y1="25%" riot-x2={ viewBoxX } y2="25%" stroke="rgba(255, 255, 255, 0.1)" stroke-width="0.25" stroke-dasharray="1"/>
<line x1="0" y1="50%" riot-x2={ viewBoxX } y2="50%" stroke="rgba(255, 255, 255, 0.1)" stroke-width="0.25" stroke-dasharray="1"/>
<line x1="0" y1="75%" riot-x2={ viewBoxX } y2="75%" stroke="rgba(255, 255, 255, 0.1)" stroke-width="0.25" stroke-dasharray="1"/>
<line x1="0" y1="100%" riot-x2={ viewBoxX } y2="100%" stroke="rgba(255, 255, 255, 0.1)" stroke-width="0.25" stroke-dasharray="1"/>
<rect
x="-1" y="-1"
riot-width={ viewBoxX + 2 } riot-height={ viewBoxY + 2 }
style="stroke: none; fill: url(#{ gradientId }); mask: url(#{ maskId })"/>
<polyline
riot-points={ polylinePoints }
fill="none"
stroke="#f43b16"
stroke-width="0.5"/>
</svg>
<style lang="stylus" scoped>
:scope
display block
padding 16px
border-radius 8px
background #1c2531
> svg
display block
padding 1px
width 100%
</style>
<script lang="typescript">
import uuid from 'uuid';
this.viewBoxX = 100;
this.viewBoxY = 30;
this.data = [];
this.gradientId = uuid();
this.maskId = uuid();
this.addData = data => {
this.data.push(data);
if (this.data.length > 100) this.data.shift();
const polylinePoints = this.data.map((d, i) => `${this.viewBoxX - ((this.data.length - 1) - i)},${d * this.viewBoxY}`).join(' ');
const polygonPoints = `${this.viewBoxX - (this.data.length - 1)},${ this.viewBoxY } ${ polylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
this.update({
polylinePoints,
polygonPoints
});
};
</script>
</mk-line-chart>

View File

@ -1 +0,0 @@
require('./index.tag');

View File

@ -11,11 +11,13 @@ const defaultSettings = {
fetchOnScroll: true,
showMaps: true,
showPostFormOnTopOfTl: false,
suggestRecentHashtags: true,
circleIcons: true,
gradientWindowHeader: false,
showReplyTarget: true,
showMyRenotes: true,
showRenotedMyNotes: true,
showLocalRenotes: true,
loadRemoteMedia: true,
disableViaMobile: false,
memo: null,
@ -108,6 +110,10 @@ export default (os: MiOS) => new Vuex.Store({
src: x.src,
arg: x.arg
};
},
setVisibility(state, visibility) {
state.visibility = visibility;
}
}
},

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">
<polygon fill="#ea2412" points="0,45.255 45.254,0 84.854,0 0,84.854 "/>
</svg>

After

Width:  |  Height:  |  Size: 441 B

View File

@ -15,8 +15,8 @@ const interval = 1000;
export default function() {
const log = new Deque<any>();
ev.on('requestServerStatsLog', id => {
ev.emit('serverStatsLog:' + id, log.toArray());
ev.on('requestServerStatsLog', x => {
ev.emit('serverStatsLog:' + x.id, log.toArray().slice(0, x.length || 50));
});
async function tick() {
@ -36,8 +36,8 @@ export default function() {
process_uptime: process.uptime()
};
ev.emit('serverStats', stats);
log.push(stats);
if (log.length > 50) log.shift();
log.unshift(stats);
if (log.length > 200) log.pop();
}
tick();

View File

@ -28,7 +28,7 @@ import { Config } from './config/types';
const clusterLog = debug('misskey:cluster');
const ev = new Xev();
if (process.env.NODE_ENV != 'production') {
if (process.env.NODE_ENV != 'production' && process.env.DEBUG == null) {
debug.enable('misskey');
}
@ -112,7 +112,7 @@ async function workerMain() {
async function init(): Promise<Config> {
Logger.info('Welcome to Misskey!');
(new Logger('Deps')).info(`Node.js ${process.version}`);
new Logger('Deps').info(`Node.js ${process.version}`);
MachineInfo.show();
EnvironmentInfo.show();
new DependencyInfo().showAll();

View File

@ -5,6 +5,10 @@ import config from '../config';
import { INote } from '../models/note';
import { TextElement } from './parse';
function intersperse<T>(sep: T, xs: T[]): T[] {
return [].concat(...xs.map(x => [sep, x])).slice(1);
}
const handlers: { [key: string]: (window: any, token: any, mentionedRemoteUsers: INote['mentionedRemoteUsers']) => void } = {
bold({ document }, { bold }) {
const b = document.createElement('b');
@ -80,12 +84,9 @@ const handlers: { [key: string]: (window: any, token: any, mentionedRemoteUsers:
},
text({ document }, { content }) {
for (const text of content.split('\n')) {
const node = document.createTextNode(text);
document.body.appendChild(node);
const br = document.createElement('br');
document.body.appendChild(br);
const nodes = (content as string).split('\n').map(x => document.createTextNode(x));
for (const x of intersperse(document.createElement('br'), nodes)) {
document.body.appendChild(x);
}
},

View File

@ -5,8 +5,6 @@ import db from '../db/mongodb';
import config from '../config';
const App = db.get<IApp>('apps');
App.createIndex('nameId');
App.createIndex('nameIdLower');
App.createIndex('secret');
export default App;
@ -16,17 +14,11 @@ export type IApp = {
userId: mongo.ObjectID | null;
secret: string;
name: string;
nameId: string;
nameIdLower: string;
description: string;
permission: string[];
callbackUrl: string;
};
export function isValidNameId(nameId: string): boolean {
return typeof nameId == 'string' && /^[a-zA-Z0-9_]{1,30}$/.test(nameId);
}
/**
* Pack an app for API response
*
@ -76,8 +68,6 @@ export const pack = (
_app.id = _app._id;
delete _app._id;
delete _app.nameIdLower;
// Visible by only owner
if (!opts.includeSecret) {
delete _app.secret;

View File

@ -52,6 +52,11 @@ export type IDriveFile = {
filename: string;
contentType: string;
metadata: IMetadata;
/**
* ファイルサイズ
*/
length: number;
};
export function validateFileName(name: string): boolean {

View File

@ -11,4 +11,5 @@ export type IMeta = {
usersCount: number;
originalUsersCount: number;
};
disableRegistration: boolean;
};

View File

@ -0,0 +1,12 @@
import * as mongo from 'mongodb';
import db from '../db/mongodb';
const RegistrationTicket = db.get<IRegistrationTicket>('registrationTickets');
RegistrationTicket.createIndex('code', { unique: true });
export default RegistrationTicket;
export interface IRegistrationTicket {
_id: mongo.ObjectID;
createdAt: Date;
code: string;
}

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