Compare commits

...

604 Commits

Author SHA1 Message Date
90cfd87f46 11.37.0 2020-01-07 22:04:46 +09:00
5ff89e1538 New Crowdin translations (#5602)
* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)
2020-01-07 22:04:19 +09:00
8b6968c665 Update dependencies 🚀 2020-01-07 21:51:37 +09:00
6ef1b1b1a2 カスタム絵文字リアクションの絵文字がNoteに添付されないのを修正 (#5686)
* カスタム絵文字リアクションの絵文字がNoteに添付されないのを修正

* ねんのため

* 記述順
2020-01-07 12:28:20 +09:00
fc0e1955d7 Update README.md [AUTOGEN] (#5680) 2020-01-05 20:58:42 +09:00
c3b8123e32 Stacked bar chart の修正 (#5681)
* Revert "Stacked bar chart がおかしいのを修正 (#5654)"

This reverts commit b16e5bd136.

* apexcharts@3.12.0
2020-01-05 20:12:37 +09:00
b6ec3f655a Update README.md [AUTOGEN] (#5676) 2020-01-04 22:25:31 +09:00
e37840d870 ドライブ関連の修正 (#5673)
* ✌️

* Update add-file.ts

* fix
2020-01-04 07:20:41 +09:00
85b7eb1fb8 2020 2020-01-02 04:15:16 +09:00
541f5f1314 Hide suspended user profile (#5452) 2020-01-02 02:47:20 +09:00
a3c7901f87 Fix: リモートプロキシ時にサムネイルのContent-Typeがおかしい (#5669) 2020-01-02 02:46:13 +09:00
78ef0a9929 ドライブファイルURL生成などの修正 (#5671)
* Fix: リモートプロキシ時にサムネイルのContent-Typeがおかしい

* fix drive
2020-01-02 02:45:05 +09:00
b0bb5d8dfc 期限切れ/未保存リモートファイルのローカルプロキシ (#5655)
* Media Proxy を実装

* サンプルを追加

* https://github.com/syuilo/misskey/pull/5649#discussion_r359967471 の修正

* https://github.com/syuilo/misskey/pull/5649#discussion_r359967966 の修正

* https://github.com/syuilo/misskey/pull/5649#discussion_r359968219 の修正

* 期限切れ/未保存リモートファイルのローカルプロキシ

* 設定

* 説明

* comment out

* fix

Co-authored-by: 和風ドレッシング <37681609+CookieRamen@users.noreply.github.com>
2019-12-31 17:23:47 +09:00
307fc18138 Update README.md [AUTOGEN] (#5664) 2019-12-31 02:47:33 +09:00
330f2dedf7 Update README.md [AUTOGEN] (#5661) 2019-12-27 06:43:54 +09:00
c5c074f201 Update ja-JP.yml
誤字修正 少数→小数  
数→数値のほうがよさそうなので変更
2019-12-24 19:54:53 +09:00
b16e5bd136 Stacked bar chart がおかしいのを修正 (#5654)
* Fix stacked bar chart

* Fix drive stacked bar chart
2019-12-21 16:49:01 +09:00
e13f778b33 Update README.md [AUTOGEN] (#5647) 2019-12-20 09:48:25 +09:00
953142115c Update dependencies 🚀 2019-12-20 04:46:28 +09:00
1eb5578063 Add round function 2019-12-20 02:09:51 +09:00
9bc07c1a1c Media Proxy を実装 (#5649)
* Media Proxy を実装

* サンプルを追加
2019-12-20 01:54:28 +09:00
cbbdc98744 /files/ 下のヘッダ設定タイミングを修正 (#5650) 2019-12-20 01:39:59 +09:00
4229065a69 Update README.md [AUTOGEN] (#5643) 2019-12-17 04:43:31 +09:00
932436096f 管理画面でstatsを継続リクエストしないように (#5608) 2019-12-15 03:43:31 +09:00
d95242cab0 ミュート/ブロックでページングと解除ができるように (#5610) 2019-12-15 03:42:33 +09:00
4214a0618e Update showdown to 1.9.1 (#5615) 2019-12-15 03:41:18 +09:00
c012f4f880 AP引用でquoteUrlに対応 (#5632)
* Supports quoteUrl

* Quote resolveをリトライする

* Update src/remote/activitypub/models/note.ts

Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com>

* Update src/remote/activitypub/models/note.ts

Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com>

* Update src/remote/activitypub/models/note.ts

Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com>

* Update src/remote/activitypub/models/note.ts

Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com>
2019-12-15 03:37:54 +09:00
3e85aad80a Implement Talk has read federation (#5636)
* Talk read

* fix

* 複数のRead ActivityはCollectionとして送るように

* あ
2019-12-15 03:37:19 +09:00
648be3005f Fix #5637 (#5638) 2019-12-15 03:35:09 +09:00
66165b1935 Redis prefixにホスト名を使用するように (Resolve #5639) (#5640) 2019-12-15 03:34:11 +09:00
e9360ac892 Fix AP inbox Announce (#5641) 2019-12-15 03:32:48 +09:00
1d234e10bd Fix #4800 (#5622) 2019-12-12 00:49:30 +09:00
2a9de356db Fix #5611 (#5612) 2019-12-12 00:46:10 +09:00
43f3f8a058 Resolve syuilo#5548 (#5607) 2019-12-12 00:41:26 +09:00
4998ba8866 Fix #5424 (#5604) 2019-12-12 00:39:59 +09:00
d18291cf0c gulpのminifyプロセスの改善 (#5624)
* Use terser instead of uglify

* Use gulp-clean-css instead of gulp-cssnano

* isProduction分岐を削除
2019-12-12 00:37:58 +09:00
fe9371f06c AP Signatureヘッダの特殊処理を削除 (#5628) 2019-12-11 23:14:51 +09:00
05a15afadb Update README.md [AUTOGEN] (#5634) 2019-12-11 21:57:49 +09:00
93417912bb Update README.md [AUTOGEN] (#5631) 2019-12-10 21:40:42 +09:00
07a565a61a Update README.md [AUTOGEN] (#5626) 2019-12-10 21:25:36 +09:00
332b13dfd0 Update README.md [AUTOGEN] (#5618) 2019-12-03 08:53:08 +09:00
81477ea7ee Update README.md [AUTOGEN] (#5613) 2019-12-02 15:43:06 +09:00
39e84539cd Update README.md [AUTOGEN] (#5606) 2019-12-01 17:39:30 +09:00
6496fbf923 Update README.md [AUTOGEN] (#5601) 2019-11-25 18:27:00 +09:00
de57dd7c97 11.36.0 2019-11-24 17:12:05 +09:00
9985c010bc Update master.ts 2019-11-24 17:11:53 +09:00
f7a328d66e Update dependencies 🚀 2019-11-24 17:09:32 +09:00
50598bcefb New Crowdin translations (#5573)
* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Polish)
2019-11-24 17:01:34 +09:00
9c38e9722a Fix bug 2019-11-24 16:43:19 +09:00
b241967fb9 Fix: ローカルにフォロワー限定投稿が流れてくる (#5598) 2019-11-24 08:31:57 +09:00
1f86a6d329 Fix bug 2019-11-23 09:43:47 +09:00
7a6b5b0bfc Remove unused import 2019-11-18 06:30:58 +09:00
e406791b7b Fix bug 2019-11-18 06:27:22 +09:00
4ce2f596ee Refactor 2019-11-18 06:25:47 +09:00
567f71fe61 Refactor 2019-11-18 06:23:44 +09:00
70bb5879f9 boot: remove setAttribute() calls and translate reload msg (#5532)
* boot: remove setAttribute() calls and translate reload msg

* Update src/client/app/boot.js

Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com>
2019-11-17 00:44:21 +09:00
cfd2d84b14 Link joinmisskey 2019-11-17 00:15:48 +09:00
44ab428803 無駄なAP deliverをしないように (#5589)
* DeliverManager, note/create

* recipe

* followers delivers

* comment

* rename

* fix

* cleanup
2019-11-09 18:51:54 +09:00
b34b728fbb Resolve #5587 (#5588)
* Resolve #5587

* stat
2019-11-09 18:24:41 +09:00
8ada1725bf 管理画面のジョブキュー一覧の修正 (#5586)
* Fix: inboxのジョブキューが表示されない

* ジョブキューで試行回数等を表示するように

* DBとオブジェクトストレージのジョブキューが表示されるように
2019-11-07 05:41:44 +09:00
873444c3c6 APの統計とログの修正と強化 (#5585)
* Fix #5580

* Improve AP logging
2019-11-07 00:02:18 +09:00
8bdd4fd061 Resolve #5582 (#5583) 2019-11-06 23:56:56 +09:00
f3b518fb62 Update yarn.lock (#5584) 2019-11-06 23:56:24 +09:00
626d64631e 11.35.1 2019-11-05 22:24:00 +09:00
608fa287c7 Update dependency 2019-11-05 22:21:52 +09:00
a35d01ee0f Resolve #5581 2019-11-05 22:20:56 +09:00
77c9b90e6d Store nodeinfo per federated instances (#5578)
* Store nodeinfo per federated instances

* Update fetch-nodeinfo.ts

* Update fetch-nodeinfo.ts

* update
2019-11-05 22:14:42 +09:00
2f8992f98a Fix bug 2019-11-05 22:11:47 +09:00
c8ab0e9d62 Update example.yml (#5572)
Redisの設定にprefix, dbを追加
2019-11-04 20:48:07 +09:00
072bc2d9fb Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-11-04 20:44:05 +09:00
cc7fec4b9f Improve reaction setting
Fix #5577
2019-11-04 20:44:01 +09:00
570931cff8 Fix #5552 (#5579) 2019-11-03 17:54:37 +09:00
88ec15d4c7 Update README.md [AUTOGEN] (#5574) 2019-11-03 04:22:36 +09:00
c23c8ae4c3 Update README.md [AUTOGEN] (#5570) 2019-11-02 13:47:24 +09:00
92af4401e2 実行時にpackage.jsonを参照しないように (#5418)
* 実行時にpackage.jsonを参照しないように

* nodeinfo

* move meta.json

* add dummy

* lowercase
2019-11-01 22:34:26 +09:00
5b0dfa6130 11.35.0 2019-11-01 06:17:43 +09:00
a664173b5b New Crowdin translations (#5503)
* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)
2019-11-01 05:46:47 +09:00
93a889df82 Preserve the attached order in AP (#5561)
* Preserve the attached order in AP

* Revert "Preserve the attached order in AP"

This reverts commit 8ac09cc81b1c216edccd2eba4bbdf0a194320883.

* use IN
2019-11-01 05:46:20 +09:00
0c1d3e186b 新規投稿のMFMをHTMLに変換する際、リモートユーザーへのメンションのリンク先を(できれば)urlに (#5562)
* 新規投稿のMFMをHTMLに変換する際、リモートユーザーへのメンションのリンク先を(できれば)urlに

Fix #2467
Related #5560

* remove unnecessary import

* Update src/services/note/create.ts

Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com>

* Apply suggestions from code review

Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com>
2019-11-01 05:43:54 +09:00
e1cf090440 Update webpack.config.ts (#5567) 2019-11-01 05:40:11 +09:00
ff81648134 Resolve #5560 (#5568) 2019-11-01 05:39:00 +09:00
1eed6911f0 Update README.md [AUTOGEN] (#5566) 2019-10-31 18:54:07 +09:00
5faf9dc2c9 Clean up 2019-10-31 15:53:35 +09:00
59a32e9352 Fix chart bug 2019-10-31 15:51:33 +09:00
bf654c6f42 Componentize modal (#5386) 2019-10-29 09:51:19 +09:00
34c82776fc Make issue process of registration tickets better (#5545)
* Make issue process of registration tickets better

* Fix illegal indent

* Bye rangestr

* Update invite.ts

* Fix bug

* Update invite.ts
2019-10-29 09:46:51 +09:00
02bde5150e Fix: プロフィールで他のユーザーにうつってもfieldsが更新されない (#5563) 2019-10-29 09:37:55 +09:00
245b08b624 Talk federation (#5534) 2019-10-29 06:01:14 +09:00
1e58b3daff Update README.md [AUTOGEN] (#5556) 2019-10-29 01:06:29 +09:00
4f2b4366f2 Fix #5539 (#5542) 2019-10-28 20:34:01 +09:00
7a94117d90 Update README.md [AUTOGEN] (#5553) 2019-10-28 14:54:33 +09:00
121c7542a0 投稿の文字数制限の初期値をmeta側と合わせる (#5546) 2019-10-26 00:16:47 +09:00
e0433c6b89 Update README.md [AUTOGEN] (#5541) 2019-10-25 22:35:43 +09:00
c9bf99fa66 Fix bug 2019-10-25 16:13:37 +09:00
795b56f8ab .config/example.ymlの不要なセミコロンを削除 (#5537) 2019-10-22 19:30:18 +09:00
d2edd67cff Update README.md
joinmisskey.github.io -> join.misskey.page
2019-10-21 14:56:54 +09:00
1ca6014284 Resolve #5533 2019-10-21 08:34:09 +09:00
7ff8fb027d Fix #4731 2019-10-21 00:52:50 +09:00
d672bb4643 Escでメディアビューワが閉じれるように (#5494)
* EscやBackspaceでメディアビューワが閉じれるように

* Backspaceでは閉じないように
2019-10-21 00:46:14 +09:00
4c6c06c80a Improve emoji-picker (#5515)
* Improve emoji-picker

* remove unimplanted translation

* カテゴリのサジェスト

* use unique
2019-10-21 00:43:39 +09:00
97b6af62fe Add ssl to elasticsearch config settings (#5527) 2019-10-21 00:41:12 +09:00
f180f02dd1 Fix bug on iOS 2019-10-20 23:13:14 +09:00
3dbd48f744 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-10-20 23:12:14 +09:00
3c99b2fd12 Improve usability 2019-10-20 23:12:07 +09:00
3d2cfd10bc Update README.md [AUTOGEN] (#5526) 2019-10-20 11:36:33 +09:00
e563798afb Update README.md [AUTOGEN] (#5519) 2019-10-18 14:33:45 +09:00
f679926b4f Update README.md [AUTOGEN] (#5517) 2019-10-18 14:32:30 +09:00
ff20045e1d Update README.md [AUTOGEN] (#5511) 2019-10-17 18:09:42 +09:00
c81ff10d5b Fix bug 2019-10-17 00:42:04 +09:00
a103ae6755 Fix #5508 (#5509) 2019-10-16 04:03:51 +09:00
5c44c75c23 Fix #5504 など (#5507)
* カスタム絵文字を重複登録できないように

* fix

* fix
2019-10-16 04:03:18 +09:00
3a973aee69 みつけるの微修正 (#5506)
* default instance name

* とりあえずリモートの人気のユーザーはリモートのみにするように
2019-10-16 03:45:09 +09:00
16d59e9988 11.34.0 2019-10-14 02:31:21 +09:00
93ce25db91 Update dependencies 🚀 2019-10-14 02:26:02 +09:00
c97a523ada New Crowdin translations (#5463)
* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)
2019-10-14 02:15:14 +09:00
488fe2e7bd みつけるに連合分を表示するように (#5490)
* みつける Fediverse

* discovered
2019-10-14 02:00:29 +09:00
8da278a279 Update https-proxy-agent など (#5497)
* Use proxy for web-push

* https-proxy-agent 3.0.0
2019-10-14 01:53:28 +09:00
da69650505 Resolve #5500 2019-10-14 01:41:25 +09:00
a85f6edd8a 閉じずに残ってしまうメニューなどの修正 (#5496)
* Fix: ページ移動等してもメニュー等が閉じずに残ってしまう

* Fix: ページ移動してもメディアビューワーが残ってしまう
2019-10-09 21:42:23 +09:00
d17c6adba4 ダウンロードURLにdownloadを付けないなど (#5488) 2019-10-04 20:18:41 +09:00
2671c6b4f2 Use node 12.11.1 2019-10-04 16:59:12 +09:00
a81d5786f3 Indicate if input value is invalid (#5422)
* Indicate if input value is invalid

* titleのとなり

* となりにメッセージ

* CSS as Suggested

* 同じ色に
2019-10-04 14:18:49 +09:00
75e2b075e1 Fix #5468 (#5470)
* Update activitypub.ts

* Update activitypub.ts

* Update activitypub.ts

* Update activitypub.ts

* fix type error

* trust the module

* remove space

* accept charset
2019-10-04 10:29:28 +09:00
533884dcaa Fix: オフライン時に大室櫻子が出てこない (#5480)
* Fix: オフライン時に大室櫻子が出てこない

* use onerror
2019-10-04 10:27:57 +09:00
7298b41a16 Update README.md [AUTOGEN] (#5482) 2019-10-04 05:05:48 +09:00
39561e858a Update README.md [AUTOGEN] (#5478) 2019-10-03 23:44:20 +09:00
96b88ee369 Update README.md [AUTOGEN] (#5474) 2019-10-02 07:53:01 +09:00
d94e2025be Update README.md [AUTOGEN] (#5471) 2019-10-02 07:27:25 +09:00
6ba5968861 Apply DB limit to the maximum note text length (#5465) 2019-10-01 01:46:31 +09:00
cea2d621f2 Fix typo: accpet -> accept (#5469) 2019-09-30 19:00:17 +09:00
84be4aa91e Update reversi-bot.ja-JP.md 2019-09-28 19:48:08 +09:00
a943bf3906 11.33.0 2019-09-27 05:59:18 +09:00
42a14508f6 Update dependencies 🚀 2019-09-27 05:50:34 +09:00
f4cb62db16 Update node version 2019-09-27 05:19:06 +09:00
4dc4ac2f0c Decrease tag limit 2019-09-27 05:18:09 +09:00
bf9da8458c Limit the tag counts to 100 (#5263)
* Limit the tag counts to 256

* Update create.ts

* Update create.ts

* Update create.ts

* Limit the user tag
2019-09-27 05:16:59 +09:00
1832b2e53c Update ja-JP.yml (#5393) 2019-09-27 05:14:10 +09:00
17ebaa01f5 New Crowdin translations (#5423)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)
2019-09-27 05:13:41 +09:00
c595f68d9d Update README.md [AUTOGEN] (#5461) 2019-09-27 05:13:31 +09:00
b040ac6373 PWA Fix (#5432)
* PWA Fix

* SWが/api/へのリクエストに関与しないように

* fix semicolon

* Update base.pug

* Update base.pug
2019-09-27 05:12:56 +09:00
e94dd8a5e8 Refactor removal of trailing comma/period (#5434)
* Refactor removal of trailing comma/period

* Use regex
2019-09-27 04:59:40 +09:00
e14509574d AP featured collectionの修正 / Collection Activityの対応 / typeの修正など (#5460)
* resolver type / fix updateFeatured

* type ApObject

* fix strange type

* AP Activity

* Collection Activityが失敗したらとりあえず無視
2019-09-27 04:58:28 +09:00
3a093f8bd7 Use mk-frac 2019-09-26 05:47:42 +09:00
ebb9a9b64f Add mk-frac component (#5456)
* Add mk-frac component

* Follow lint

* FIx linting miss
2019-09-26 04:24:38 +09:00
ef17838c64 Better broadcast widget mk2 (#5455)
* better broadcast widget

* 🎨

* 🎨

* 🎨

* mk2 (left nav with chevron icons)

* fix

* button title
2019-09-26 04:23:48 +09:00
11ddbdc58d Resolve #5454 (#5458) 2019-09-26 04:15:34 +09:00
4e8047275b 任意のグループからユーザーを削除すると他のグループからでも削除されちゃうのを修正 (#5459) 2019-09-26 04:14:41 +09:00
c19670d611 Resolve #5447 (#5448)
* Resolve syuilo#5447

* subページではalternateを表示しないように
2019-09-24 04:08:52 +09:00
540bd3630a Fix bug (#5453) 2019-09-24 03:58:00 +09:00
49f6b3233e Fix bug 2019-09-24 02:57:34 +09:00
0f2d392b4b Use stringz.length instead of String.length in hashtag length calculation (#5443)
* Use stringz.length instead of String.length

* length to 128, ignore combining
2019-09-22 01:21:45 +09:00
53fba9b137 fix typo 2019-09-21 21:45:20 +09:00
24f2183829 fix typo in misskey.nginx (#5445)
sites-ebabled => sites-enabled
2019-09-21 21:44:24 +09:00
61642539b1 Adminページのユーザー一覧フィルターに利用可能アカウントを追加 (#5430)
* Adminページのユーザー一覧フィルターにアクティブアカウントを追加

* validator update

* availableに
2019-09-21 21:35:22 +09:00
1b7454ca77 Fix: syuilo#3122 (#5435) 2019-09-21 21:33:01 +09:00
60d2558ed6 絵文字ピッカーの Unicode 12.0 対応など (#5441)
* Twemoji 12.1

* 絵文字ライブラリを持つように

* Fix chess_pawn emoji

* Add Unicode 12.0 emojis

* Add transgender flag/symbol emoji

* Add some japanese emoji keywords

* format emojilist.json

* fix emojilist order

* Add missing flags
2019-09-21 21:31:38 +09:00
9f5a763c69 Fix: selectでprefix/sufixがないときにいらない下線が付く (#5440) 2019-09-21 01:47:32 +09:00
0ef31a8bac Fix: unknown user cause 500 on AP (#5436) 2019-09-20 05:14:21 +09:00
1a8632e802 Fix: Keycap Number Sign が表示できない (#5431)
* Fix: Keycap Number Sign が表示できない

* add U+20E3
2019-09-15 23:33:58 +09:00
c1c955031e Fix typo - invalied (#5433)
* Fix typo - invelied

* fix Valied
2019-09-15 23:27:33 +09:00
75ab146860 Follow requests page improvements (#5429)
* follow-requests: add spacing between actions

* follow-requests: make separator more visible in dark themes
2019-09-15 02:38:34 +09:00
c3f9b2dcc3 Resolve #5420 (#5421) 2019-09-12 21:27:44 +09:00
c9e33f665e Check if there is a built code (#5415) 2019-09-10 17:15:38 +09:00
b719d43049 11.32.0 2019-09-10 15:48:37 +09:00
f555aa734b Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-09-10 15:46:20 +09:00
37fb685016 Update dependencies 🚀 2019-09-10 15:46:00 +09:00
09fe1b355a New Crowdin translations (#5385)
* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)
2019-09-10 15:44:25 +09:00
9d530a5c38 Fix typo: ommited -> omitted (#5406) 2019-09-09 22:47:52 +09:00
827c378ac1 AP Lock (#5410) 2019-09-09 22:46:45 +09:00
9b91b92bca Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-09-09 22:28:48 +09:00
e7fcca0e06 Fix #5403 2019-09-09 22:28:41 +09:00
a36e5b4543 Refactoring 2019-09-09 22:18:32 +09:00
ba474648a2 Update CONTRIBUTING.md 2019-09-08 21:21:08 +09:00
a7b710a2f8 広告ブロッカーの警告を削除 (#5408)
* remove f*ckadbloack

* follow-buttonが消されないように

* revert version

* remove locales
2019-09-08 21:19:28 +09:00
c033464b92 AP Undo Announce (#5400)
* AP Undo Announce

* Use activity id
2019-09-08 11:30:44 +09:00
3ef6305c76 Update README.md [AUTOGEN] (#5402) 2019-09-07 23:43:35 +09:00
511ef20b8a Update README.md [AUTOGEN] (#5396) 2019-09-05 05:05:24 +09:00
4db710a4b0 Fix indentation 2019-09-04 14:35:21 +09:00
efe92724a4 Update README.md [AUTOGEN] (#5390) 2019-09-04 04:25:22 +09:00
aa19767ebc 11.31.4 2019-09-03 08:00:41 +09:00
143190ab38 Fix bug 2019-09-03 08:00:21 +09:00
baf94f86c4 11.31.3 2019-09-03 07:28:45 +09:00
d36b129369 Improve reaction tooltip 2019-09-03 07:25:02 +09:00
f36d88246a Fetch more reactins 2019-09-03 07:15:53 +09:00
03f87140b3 11.31.2 2019-09-03 06:58:19 +09:00
1dc07f6b72 🎨 2019-09-03 06:58:01 +09:00
0aa0a9d24b 11.31.1 2019-09-03 06:22:05 +09:00
a9a93db2b4 Update reactions-viewer.reaction.vue 2019-09-03 06:20:52 +09:00
f187df3933 Update reactions-viewer.reaction.vue 2019-09-03 06:20:04 +09:00
8abe8042d7 Fix bug 2019-09-03 06:19:17 +09:00
58fd46ff6f 🎨 2019-09-03 06:00:45 +09:00
fef8b662c1 🎨 2019-09-03 05:50:01 +09:00
8de2f4ce76 Update node to 12.9.1 2019-09-03 05:43:44 +09:00
e5e344e1cd Update README.md [AUTOGEN] (#5382) 2019-09-03 01:02:57 +09:00
e70d7edf41 Fix #5380 (#5381) 2019-09-02 07:01:33 +09:00
71d4d51fb2 11.31.0 2019-09-02 06:33:07 +09:00
aaf38f1cbe Update CHANGELOG.md 2019-09-02 06:23:10 +09:00
0e0d6692c0 Fix bug 2019-09-02 06:21:43 +09:00
29f927fe72 Update CHANGELOG.md 2019-09-02 06:21:06 +09:00
ee39d9594e Improve readability 2019-09-02 06:04:12 +09:00
cefd2a4c54 ページURLが空の時currentNameを使うように (#5368)
* ページURLが空の時currentNameを使う

* 空の時はページURLにcurrentNameを代入するように

* Update src/client/app/common/views/pages/page-editor/page-editor.vue

Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com>

* update validator

* Update src/client/app/common/views/pages/page-editor/page-editor.vue

Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com>

* やっぱりuuidは統一

* エラー処理を追加

* some fix

* ちょっとだけ翻訳の追加と改善

* リファクタリング

* Revert "やっぱりuuidは統一"

This reverts commit 965a860504e8b09e5561a4ab862f8bab6a95e8d5.

* やっぱりuuidをわける

* エラー判定をidからcodeに+リファクタリング
2019-09-02 06:02:35 +09:00
a08c20d9af Fix #5353 2019-09-02 05:59:24 +09:00
dc11f1afbf Improve readavility 2019-09-02 05:52:38 +09:00
b0f2b209a2 Fix error 2019-09-02 05:42:30 +09:00
a25fdfd519 Fix #5373 2019-09-02 05:34:25 +09:00
c1aa58596d Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-09-02 05:20:17 +09:00
b6a3eb2445 Fix #5379 2019-09-02 05:20:06 +09:00
310f4d2edb New Crowdin translations (#5337)
* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)
2019-09-02 05:04:24 +09:00
701fee3139 Prevent users from opening note menu when already opened (#5367) 2019-09-02 04:45:01 +09:00
593c2b9517 Proxy for SMTP (#5371) 2019-09-02 04:42:52 +09:00
96b2267cb8 Chart resyncing (#5372)
* wip

* Add test

* Fix test

* Insert moderation log

* Add todo
2019-09-02 04:41:26 +09:00
84730a071a Update README.md [AUTOGEN] (#5377) 2019-09-02 04:06:54 +09:00
d0b0cf8dfb Use npx 2019-09-01 04:31:59 +09:00
749200d22b Show users who sent reaction on hover (#5362)
* Show users who sent reaction on hover

* Support i18n

* detail -> details

* Extract methods

* Update on change
2019-08-31 03:04:36 +09:00
a47baad943 Update dependencies 🚀 2019-08-31 03:01:50 +09:00
50abb51ece Syslog support
Resolve #5355
2019-08-30 08:29:46 +09:00
1f890c5bed Assign URL to each page of admin (#5366)
* Assign URL to each page of admin

* Remove cursor pointer
2019-08-30 04:19:49 +09:00
97f23af86d Assign URL to each page of settings (#5349)
* Assign URL to each page of settings

* Use router-link

* comma

* Use active-class

* Clean up

* space

* comma

* Redirect if mobile

* Redirect to /i/settings/profile

* Clean up
2019-08-29 14:57:28 +09:00
d77aa1f26a 不要なプロパティをレスポンスから削除 2019-08-29 07:34:54 +09:00
0b075ad4e9 Update README.md [AUTOGEN] (#5356) 2019-08-29 05:33:52 +09:00
423f776ed0 Perform animation only when reaction is added (#5359) 2019-08-29 05:20:27 +09:00
084fd8152b Refactor reactions-viewer.vue (#5358) 2019-08-29 05:15:14 +09:00
89d35c2e63 Fix bug 2019-08-29 05:13:03 +09:00
be33581642 Fix animation not being performed on new reaction (#5345)
* Fix animation not being performed on new reaction

* Clean up
2019-08-29 05:11:26 +09:00
2d6d9f30e1 ページURLが他と重複してたらエラーを投げるように (#5354)
* [Page]nameが重複したときの処理を追加

* page-editor側のerr.idにuuidを適用

* refactor

* uuidをわけた
2019-08-28 08:00:05 +09:00
85721065fd Save memo automatically (#5351)
* Save memo automatically

* Use clearTimeout

* Clean up

* Clean up
2019-08-28 02:26:19 +09:00
9d65768d4d [MFM] Fallback to js if specified lang is not available (#5347) 2019-08-27 19:44:49 +09:00
13f69e4291 excludeNsfwやCWのNSFW扱いなど (#5341)
* NoteにisSensitive

* Revert "NoteにisSensitive"

This reverts commit 3d5bcfbaf078ff91257a508f817dd1ef4ea31d7b.

* query excludeNsfw

* AP deliverでCW付きはsensitiveにするように

* excludeNsfwでCW付きも除くように
2019-08-27 17:33:07 +09:00
6a0affcec1 Tune worker/job counts (#5346)
* デフォルトのワーカー数を1に

* Tune default job count
2019-08-27 05:33:24 +09:00
ab6a84cd45 未実装のTLのRenoteクエリを実装 (#5343)
* users/notes includeMyRenotes

* other renotes

* fix target user in users/notes

* users/notesからv10から未実装でありえないオプションを削除

* users/notesのincludeMyRenotesの説明を修正

* remove needless anonymous checks
2019-08-27 03:24:35 +09:00
ba93bf7478 Prevent users from changing the disabled option (#5344) 2019-08-27 02:44:01 +09:00
1c4e1af7c3 Improve post form (#5326)
* Improve post form

* Remove local icon from button
2019-08-25 16:12:01 +09:00
a85f4c4fc4 Resolve #2716 (#5340)
* Resolve #2716

* Update ja-JP.yml
2019-08-25 16:11:20 +09:00
9d6c8806af CWの中のサムネイルのサイズが変なのを修正 (#5339)
* Fix #5338

* Revert "Fix #5338"

This reverts commit 72b32df2b74743bede6fff0dbc37fec352cff51f.

* Fix media-list height

* fix
2019-08-24 19:20:53 +09:00
ff52ea2a7c 11.30.0 2019-08-24 02:28:43 +09:00
f247ee9dd3 New Crowdin translations (#5322)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)
2019-08-24 02:24:24 +09:00
f4cec53ba1 [Room] Make Pinguin customizable 2019-08-24 02:18:21 +09:00
ad70b50fee [Room] Add energy drink 2019-08-23 06:52:42 +09:00
ea7b2b3141 Update README.md [AUTOGEN] (#5335) 2019-08-23 05:06:22 +09:00
c2f932e28b Fix #5324 2019-08-22 19:56:27 +09:00
c637882578 カップ麺をスムーズシェードするように 2019-08-22 19:42:52 +09:00
ef7221e39e Fix holo-display animation glitch 2019-08-22 19:37:01 +09:00
6b571a7799 Improve furniture preview (#5328)
* Improve furniture preview

* improve calc method

* camera.aspectいらないことに気付いた

* refactor & go camera far away

* 対角線の長さで計算するように

* 対角線の計算にhypot()を使用

Co-Authored-By: Aya Morisawa <AyaMorisawa4869@gmail.com>
2019-08-22 18:34:15 +09:00
0638b6cb69 Roomで未保存警告ダイアログなどを追加 (#5332)
* Room保存時にダイアログを表示するように

* Roomから移動するときに未保存ならば警告するように
2019-08-22 18:33:50 +09:00
a39c1706a1 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-08-22 02:40:19 +09:00
c741e27057 [Room] Add holo-display 2019-08-22 02:40:01 +09:00
ede854c215 Update button.vue (#5331) 2019-08-22 02:36:19 +09:00
6a953b4d94 Update yarn.lock (#5327) 2019-08-21 13:04:51 +09:00
1d763096c7 Update room section of CONTRIBUTING.md 2019-08-20 16:16:27 +09:00
630d873ec0 [room]Add cup noodle (#5323)
* [Room] Add cup noodles

* remove ,

* Fix Cup-Noodle Texture
2019-08-20 15:57:42 +09:00
d427957ea7 New Crowdin translations (#5321)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)
2019-08-20 02:19:06 +09:00
2430cc0e2c New translations ja-JP.yml (English) (#5320) 2019-08-20 02:04:55 +09:00
e57ee24864 New translations ja-JP.yml (French) (#5319) 2019-08-20 01:55:35 +09:00
3bc05ab3f2 New Crowdin translations (#5318)
* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)
2019-08-20 01:44:22 +09:00
4e50dcfa93 New Crowdin translations (#5313)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)
2019-08-19 21:24:43 +09:00
fcf5531e5b 🎨 2019-08-19 16:44:55 +09:00
3bef69ee58 🎨 2019-08-19 16:13:08 +09:00
311a4f28b0 Resolve #5298 2019-08-19 16:05:57 +09:00
01e692b353 Refactor 2019-08-19 15:59:36 +09:00
3b445af6fc Improve readability 2019-08-19 15:51:00 +09:00
1e43ece637 [Room] Update model 2019-08-19 14:01:05 +09:00
6f1048c006 11.29.0 2019-08-19 12:39:26 +09:00
d686e70f2b [Room] Better rendering 2019-08-19 12:35:18 +09:00
70f524b82d New Crowdin translations (#5312)
* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)
2019-08-19 12:17:37 +09:00
79c6475028 Improve readability 2019-08-19 02:19:37 +09:00
7dee5309dc Refactoring 2019-08-19 02:06:37 +09:00
958ec7b03f Fix #5307 2019-08-19 02:02:10 +09:00
9153434906 [Room] Add bin 2019-08-19 01:54:06 +09:00
3a08364c24 [Room] Add some furnitures 2019-08-19 01:45:20 +09:00
a9beeab502 [Room] Better rendering 2019-08-19 01:43:45 +09:00
38c901069a [Room] Better avatar rendering 2019-08-19 01:15:30 +09:00
3f7606060e Update geometry name 2019-08-19 01:01:15 +09:00
777f20e9be Add Trash can (#5309)
new file:   src/client/assets/room/furnitures/trash-can/trash-can.blend
	new file:   src/client/assets/room/furnitures/trash-can/trash-can.glb
2019-08-19 00:51:57 +09:00
8e39aecffe Update room section of CONTRIBUTING.md (#5306)
* Update room section of CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md
2019-08-18 23:40:52 +09:00
9e1ab54097 11.28.2 2019-08-18 20:32:23 +09:00
0f9e09f4bd cors 2019-08-18 20:32:04 +09:00
743ebc17b9 Fix #5291 (#5294) 2019-08-18 20:25:12 +09:00
9bc4af76b8 モバイルでもRoomを表示できるように 2019-08-18 19:11:24 +09:00
46fa26426d Fix bug 2019-08-18 19:08:33 +09:00
58d0dc1795 11.28.1 2019-08-18 16:56:42 +09:00
bc11702f7d Fix #5290 2019-08-18 16:55:09 +09:00
6288de5813 Fix #5291 2019-08-18 16:51:27 +09:00
bbf59c7d9f 11.28.0 2019-08-18 16:07:55 +09:00
d7787bacf7 [ImgBot] Optimize images (#5289)
*Total -- 2,381.44kb -> 1,992.59kb (16.33%)

/src/client/assets/room/furnitures/photoframe/photo-uv.png -- 20.34kb -> 2.58kb (87.33%)
/src/client/assets/room/furnitures/pc/motherboard-uv.png -- 21.43kb -> 2.85kb (86.69%)
/src/client/assets/room/furnitures/cardboard-box3/uv.png -- 21.58kb -> 3.51kb (83.72%)
/src/client/assets/room/furnitures/poster-v/uv.png -- 21.85kb -> 3.71kb (83.04%)
/src/client/assets/room/furnitures/milk/milk.png -- 3.76kb -> 0.64kb (82.89%)
/src/client/assets/room/furnitures/server/uv.png -- 22.29kb -> 3.92kb (82.42%)
/src/client/assets/room/furnitures/facial-tissue/facial-tissue.png -- 3.80kb -> 0.67kb (82.3%)
/src/client/assets/room/rooms/washitsu/tatami-uv.png -- 22.27kb -> 3.98kb (82.13%)
/src/client/assets/room/rooms/washitsu/husuma-uv.png -- 22.06kb -> 3.94kb (82.13%)
/src/client/assets/room/furnitures/tv/screen-uv.png -- 20.55kb -> 3.70kb (81.98%)
/src/client/assets/room/furnitures/poster-h/uv.png -- 20.15kb -> 3.70kb (81.65%)
/src/client/assets/room/furnitures/plant/plant-soil-uv.png -- 23.17kb -> 4.40kb (81%)
/src/client/assets/room/furnitures/facial-tissue/facial-tissue-uv.png -- 22.96kb -> 4.37kb (80.99%)
/src/client/assets/room/furnitures/cardboard-box2/uv.png -- 22.36kb -> 4.52kb (79.78%)
/src/client/assets/room/furnitures/book2/uv.png -- 37.36kb -> 8.41kb (77.49%)
/src/client/assets/room/furnitures/server/rack-uv.png -- 26.68kb -> 6.55kb (75.46%)
/src/client/assets/room/furnitures/monitor/screen-uv.png -- 5.81kb -> 1.46kb (74.88%)
/src/client/assets/room/furnitures/milk/milk-uv.png -- 49.21kb -> 16.19kb (67.1%)
/src/client/assets/room/furnitures/eraser/eraser-uv.png -- 27.93kb -> 10.90kb (60.96%)
/src/client/assets/room/furnitures/book2/barcode.png -- 8.71kb -> 3.42kb (60.72%)
/src/client/assets/room/rooms/washitsu/husuma.png -- 4.23kb -> 2.48kb (41.44%)
/src/client/assets/room/furnitures/server/rack.png -- 9.42kb -> 6.88kb (26.92%)
/src/client/assets/room/furnitures/eraser/cover.png -- 10.75kb -> 8.14kb (24.26%)
/src/client/assets/room/furnitures/plant2/soil.png -- 13.06kb -> 10.60kb (18.83%)
/src/client/assets/room/furnitures/plant/plant-soil.png -- 13.06kb -> 10.60kb (18.83%)
/src/client/assets/room/furnitures/monitor/screen.jpg -- 28.93kb -> 24.26kb (16.16%)
/src/client/assets/room/furnitures/cardboard-box3/texture.png -- 18.23kb -> 15.82kb (13.21%)
/src/client/assets/room/furnitures/cardboard-box2/texture.png -- 18.64kb -> 16.48kb (11.56%)
/src/client/assets/room/furnitures/book2/texture.png -- 64.05kb -> 59.59kb (6.97%)
/src/client/assets/room/furnitures/server/server.png -- 121.75kb -> 114.13kb (6.26%)
/src/client/assets/room/furnitures/pc/motherboard.jpg -- 67.25kb -> 63.09kb (6.19%)
/src/client/assets/room/furnitures/photoframe/photo.jpg -- 31.10kb -> 29.79kb (4.22%)
/src/client/assets/room/rooms/washitsu/tatami-single1600.png -- 1,163.42kb -> 1,145.84kb (1.51%)
/src/client/assets/room/rooms/washitsu/tatami.png -- 308.19kb -> 306.37kb (0.59%)
/src/client/assets/room/furnitures/moon/moon.jpg -- 85.11kb -> 85.11kb (0%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2019-08-18 15:06:22 +09:00
23ae0515c4 Update CHANGELOG.md 2019-08-18 15:05:13 +09:00
fe88b34b8a Update node version 2019-08-18 14:56:54 +09:00
74aa031a22 Update dependencies 🚀 2019-08-18 14:56:47 +09:00
6aeed212d9 New Crowdin translations (#5249)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (Dutch)
2019-08-18 14:43:30 +09:00
45b972c059 MisskeyRoom (#5267)
* wip

* Add pemcil

* Fix bug

* Update .gitattributes

* Add 🍮

* Better 🍮

* Add color boxes

* Add pc

* Add keyboard

* Add 📦

* Add more 📦

* ✌️

* carpet

* Add plant

* ✌️

* ✌️

* Update room.vue

* Add plant

* ✌️

* ✌️

* ✌️

* ✌️

* ✌️

* 段ボール箱がてかりすぎているのを修正

* Update room.ts

* Render username

* ✌️

* Add new 📦

* Update room.ts

* Remove blender backup files

* Refactor

* Improve performance

* Update room.ts

* Update .gitattributes

* Update room.ts

* Better fan

* Better tissue rendering

* Add 🐧

* Create photoframe2.glb

* chairs

* Add 📖

* fix: HiDPi環境でオブジェクトを選択できない (#5268)

* Better monitor

* ✌️

* Add corkboard

* Add missing blend

* mousepad

* Add missing blend

* Add cube

* 額縁やモニターなどに任意の画像を表示できるように

* Update MisskeyRoom section of CONTRIBUTING.md (#5272)

* Update MisskeyRoom section of CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Refactor

* カスタムテクスチャがずれないように

* Remove debug code

* Update furnitures.json5

* 一部の家具の色を自由に変えられるように

* Update ja-JP.yml

* Type annotation

* 家具の色やテクスチャをすぐ反映するように

* Update room.vue

* Update furnitures.json5

* Add 📺

* Update ja-JP.yml

* 床の色を変えられるように

* 和室にできるように

* Update washitsu

* Use MeshLambertMaterial to improve performance

* Use MeshLambertMaterial

* Fix bug

* Refactor

* Update room.ts

* Fix washitsu

* Update room.vue

* Update washistu

* Use MeshLambertMaterial

* Update room.ts

* Set current property value

* Disable reactivity to improve performance a bit

* Fix bug

* Set current carpet color

* Update ja-JP.yml

* Add rubik-cube (#5278)

* Update ja-JP.yml (#5279)

* Update UI

* ルームの設定を追加

* Add room link

* 家具をドラッグで移動や回転できるように

* esnextにする (#5286)

* Fix moduleResolution

* Use uuid v4

* Fix bug

* マットの色を変えられるように

* ✌️

* 異方性フィルタリングするように

* グラフィックの品質をフィルタリングに反映

* Add bloom effect when ultra graphics

* Add posters

* 🎨
2019-08-18 14:41:33 +09:00
7ecfc007a9 updateHashtagを並列で行わないように (#5284) 2019-08-18 12:47:45 +09:00
fc78c75bab Fix: Hashtagがupdateできない (#5285) 2019-08-18 12:46:47 +09:00
59493a0cd9 uuid() と lint (#5288)
* Import only v4 uuid, uuid() without version is deprecated

* Add Missing semicolon
2019-08-18 12:42:58 +09:00
6060c6d56e リモートユーザー向けのNoteUnreadsレコードは作成しないように (#5280) 2019-08-17 14:40:06 +09:00
6cdbb27169 Fix: ドライブアップロード直後に取得できるURLがoriginalじゃない (#5274) 2019-08-17 12:32:52 +09:00
ed8b073e54 タイトルやアイコンがきちんと設定されないことがあるのを修正 (#5265)
* Fix: og:site_nameがbase系ページに正しく反映さんれない

* instanceNameはAPIのmetaじゃなくてog:site_nameを参照するように

* Fix: タイトルが変更されるページから通常ページに遷移してもタイトルが戻らない

* Fix: タイトルが戻らない mobile / notifications

* Fix: faviconの変更が効かないページがある
2019-08-16 14:16:19 +09:00
7dd193636c Fix #5260 2019-08-11 20:13:57 +09:00
01d018510c ユーザー名の突き抜けの修正 (#5261)
* 突き抜け deck フォロリク/vote

* 突き抜け desktop

* notification reactionで絵文字の縦がずれないように

* Fix: ユーザーページの名前が突き抜ける

* Fix: デッキカラムでユーザー名が長いと閉じれなくなる

* デッキのカウントの位置が右になってしまってたのを修正

* デッキヘッダーのellipsis
2019-08-11 19:48:54 +09:00
1c273a0a75 Elasticsearchのインデックス名をconfigで変更できるように (#5257) 2019-08-09 13:04:35 +09:00
fa2c7658a0 PackedUserがサイレンスや凍結の情報を持つように (#5255) 2019-08-08 09:31:40 +09:00
84ca3a7d45 Unified the notation with "Renote" for consistency (#5256)
https://crowdin.com/translate/misskey/3/ja-zhcn#5238
2019-08-08 06:45:39 +09:00
902c73e6ac Update README.md [AUTOGEN] (#5251) 2019-08-06 23:23:01 +09:00
3b626f72e4 Resolve #5247 (#5248) 2019-08-05 10:30:31 +09:00
f5ce137a6b Update README.md [AUTOGEN] (#5246) 2019-08-03 19:56:59 +09:00
3ce9d12361 Update README.md [AUTOGEN] (#5243) 2019-08-02 22:37:31 +09:00
2fe2f3b1eb Update README.md [AUTOGEN] (#5240) 2019-08-02 21:21:31 +09:00
17b3ee41db Update README.md [AUTOGEN] (#5239) 2019-08-01 22:26:11 +09:00
56d2a5d5d3 Modify ssl directive to 'ssl' for listen directive (#5237)
the "ssl" directive is deprecated. 
http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl
2019-08-01 19:12:32 +09:00
3a17ff0983 11.27.1 2019-08-01 15:47:02 +09:00
9a9270bbe9 New Crowdin translations (#5230)
* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)
2019-08-01 15:44:53 +09:00
512eee4f51 Update README.md [AUTOGEN] (#5236) 2019-08-01 01:32:00 +09:00
db01fa0eef Enable s3ForcePathStyle (#5234) 2019-07-31 18:11:11 +09:00
0c49a1ebd5 11.27.0 2019-07-29 04:36:11 +09:00
636d6394e3 Update CHANGELOG.md 2019-07-29 04:34:56 +09:00
c67c091b3a New Crowdin translations (#5217)
* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)
2019-07-29 01:56:01 +09:00
333604898c fix #5214 ウィジェットが選択されていないときは追加されないように (#5227)
* fix #5214

* null削除の取り消し

* 空白文字の調整
2019-07-28 14:12:33 +09:00
076ac3b614 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-07-28 10:40:54 +09:00
0e1468b159 Update CHANGELOG.md 2019-07-28 10:40:42 +09:00
66409029e7 非ログイン時の警告処理 (#5219)
* Update note-mixin.ts

* Update note-mixin.ts

* ✌️

* Update note-mixin.ts

* Update note-menu.vue
2019-07-28 10:35:53 +09:00
8ec6b2ec11 Fix error 2019-07-28 10:31:16 +09:00
14736620ec HTTPリクエストのKeep-AliveとPrxoy対応など (#5226)
* DriveのKeep-Alive, Proxy と APのProxy対応

* request系でKeep-Aliveするように

* fix lookup-dns-cache.d.ts

* remove debug output
2019-07-28 09:49:02 +09:00
831ca53b63 「削除して編集」機能を追加 (#5182)
* 「削除して編集」機能を追加

* UXの調整

* 殆どの情報を保持したまま編集できるように

* update lang
2019-07-28 05:33:12 +09:00
6138d46509 AP Emojiのupdatedは採用しないように (#5220)
* AP Emojiのupdatedは採用しない

* updated判定は残す
2019-07-28 05:32:40 +09:00
c3003cb363 Improve mobile notifications view 2019-07-28 05:25:12 +09:00
4277e53433 通知のフィルタ (#5224)
* ✌️

* Deck
2019-07-28 04:44:09 +09:00
6516bd2ade Fix: リンクバリデーションリンクが一瞬表示されてしまう (#5216)
* Fix: リンクバリデーションリンクが一瞬表示されてしまう

* use link
2019-07-26 00:17:34 +09:00
27d22f954a 11.26.2 2019-07-25 02:23:42 +09:00
88f5e8e8e2 Bye moment from package.json (#5215)
* Bye moment from package.json

* Use Mapped types for argument type definition
2019-07-25 01:36:48 +09:00
fd2ae6d3cf Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-07-24 02:17:04 +09:00
238edd36f7 Fix error 2019-07-24 02:16:41 +09:00
5d847f9808 Fix: some post form errors (#5212)
* Fix: type mismatch in post-form-attaches

* Fix: 'this is null' in post-form-window
2019-07-24 02:15:40 +09:00
ac914af9c3 Fix #5210 2019-07-23 00:19:29 +09:00
636f90ca0c Improve CONTRIBUTING.md (#5158) 2019-07-22 14:57:23 +09:00
29469bb7c6 Better error 2019-07-22 10:18:27 +09:00
4f043b1841 Update signup.ts 2019-07-22 10:16:25 +09:00
85008303f5 Prevent username reusing 2019-07-22 10:15:00 +09:00
3432d6e615 Update dependencies 🚀 2019-07-22 07:31:02 +09:00
855c990a17 11.26.1 2019-07-21 22:59:57 +09:00
eef2dc2f62 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-07-21 22:59:15 +09:00
fa54140973 Update CHANGELOG.md 2019-07-21 22:58:57 +09:00
e770d32916 New Crowdin translations (#5206)
* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Czech)
2019-07-21 22:58:51 +09:00
8aeabf530c Patch #5060 (#5205)
* fix #5060

* forgot ";" :p
2019-07-21 22:27:36 +09:00
6fbf1cfc28 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-07-21 21:59:51 +09:00
5480df35bc Update CHANGELOG.md 2019-07-21 21:58:48 +09:00
8b5104d564 Update deprecated vscode extension (#5209) 2019-07-21 21:57:15 +09:00
3c1192d6bf Unignore .vscode/extensions.json (#5208) 2019-07-21 20:27:43 +09:00
eb8ef35122 Fix activity calendar for desktop widget (#5200)
* Fix activity calendar for desktop widget

* fetch past 21 weeks for activity widgets

* Cleanup

* forEach -> map

* Revert "forEach -> map"

This reverts commit b72e180ee4a788ff1a3c2955a061646561b2b735.
2019-07-21 19:12:16 +09:00
8a31e5fd0f Update CHANGELOG.md 2019-07-21 03:27:17 +09:00
751728db84 Update CHANGELOG.md 2019-07-21 03:25:10 +09:00
e695f54ef0 投稿フォームが画面外にはみ出さないように (#5203)
* 上下はみ出したウィンドウは上基準で収めるように

* 投稿フォームを画面より長くしないように
2019-07-20 17:50:01 +09:00
b2ed45ae38 Fix: スクロールしてると絵文字ピッカーの位置がずれる (#5204) 2019-07-20 17:47:40 +09:00
5e36f75f8a Clean up: Remove unused imports 2019-07-20 04:09:33 +09:00
7ac13a386c Improve GenerateVideoThumbnail (#5186)
* Improve GenerateVideoThumbnail

* use fluent-ffmpeg

* Update src/services/drive/generate-video-thumbnail.ts
2019-07-20 03:28:14 +09:00
56c8ad9df3 Improve usability of quote note by pasting url (#5196) 2019-07-20 03:23:16 +09:00
f1ab918ecd Fix question (#5197) 2019-07-20 03:20:06 +09:00
42af8c7695 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-07-20 02:02:48 +09:00
0de2e150cb [ImgBot] Optimize images (#5189)
/assets/ss/user.jpg -- 148.15kb -> 148.15kb (0%)
2019-07-20 01:56:09 +09:00
1ac498c8fe Update README.md [AUTOGEN] (#5199) 2019-07-20 01:53:09 +09:00
545d29a40a Update README.md [AUTOGEN] (#5193) 2019-07-20 00:40:08 +09:00
73bbef2922 Merge branch 'master' into develop 2019-07-19 06:14:21 +09:00
26567cdeb2 🎨 2019-07-19 06:13:56 +09:00
84941cbb97 Update CHANGELOG.md 2019-07-19 04:13:20 +09:00
cd5b24d4eb Merge branch 'develop' 2019-07-19 03:38:05 +09:00
c8abd512e1 11.26.0 2019-07-19 03:37:48 +09:00
de9bd2651b Remove unused import 2019-07-19 03:37:34 +09:00
c432310cae MFMの引用がインライン表示になっている問題を修正 2019-07-19 03:30:37 +09:00
1c95cdffdc Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-07-19 03:27:53 +09:00
c3ec668e16 Update CHANGELOG.md 2019-07-19 03:27:49 +09:00
2af79e9855 特定ホストへのメンションの特別処理をクライアントに追加 (#5185)
* 特定ホストへのメンションの特別処理をクライアントに追加

Fix #5168

* Apply suggestions from code review

Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com>

* Apply suggestions from code review

Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com>

* Apply suggestions from code review

Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com>

* Fix indent
2019-07-19 03:13:47 +09:00
f6ac6f9c6f fix #5071 (#5184) 2019-07-18 20:56:48 +09:00
d8c835fa51 Fix signin (#5181)
* Revert "Fix signin history (#5180)"

This reverts commit a97c14a7b7.

* fix signin

* failはfail専用に

* fix password less 200
2019-07-18 05:26:58 +09:00
a97c14a7b7 Fix signin history (#5180)
* Fix #5179

* Fix wrong value in signin history
2019-07-18 04:22:44 +09:00
54ecf97c22 New Crowdin translations (#5175)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)
2019-07-18 02:03:47 +09:00
9c4e64b7b5 Send Delete activity on suspend (#5165)
* Send Delete Person activity

* Delete activityの後にフォロー解除する

* アカウント削除でもDelete activity
2019-07-18 02:03:28 +09:00
ef44eda69e Mastodonのリンクの所有者認証に対応 (#5161)
* Profile metadata を設定できるように

* API desc
2019-07-18 00:11:39 +09:00
f1a7ab639b Resolve #5117 (#5171)
* Resolve #5117

* 出来立てのユーザーがストリームコネクションを持ってるはずがない
2019-07-18 00:00:03 +09:00
0d8286cb2a Improve #5176 (#5178)
* 🎨

* Follow review

* Remove unnecessary colon
2019-07-17 23:59:21 +09:00
8e4ad4b919 Improve usability of users view (#5176)
* Improve usability of users view

Resolve #5173

* Fix query

* Follow review and fix

* Follow review
2019-07-17 18:59:10 +09:00
9a09ed6290 Cleanup source (#5177)
* Cleanup source

* 🙏
2019-07-17 17:13:38 +09:00
9ca36021b0 Fix #5172 (#5174) 2019-07-17 13:28:27 +09:00
eaebb95827 Update README.md [AUTOGEN] (#5163) 2019-07-17 04:28:11 +09:00
b8cce2067c New translations ja-JP.yml (French) (#5170) 2019-07-17 01:34:32 +09:00
07a0631964 New translations ja-JP.yml (French) (#5169) 2019-07-17 01:25:56 +09:00
ebc2b05231 fix build error (#5162) 2019-07-17 00:59:19 +09:00
4c79dd4e96 Use yarn (#5154)
* Revert "✌️"

This reverts commit b5b437b878.

* Welcome back, yarn.lock

[lockfiles for all](https://yarnpkg.com/blog/2016/11/24/lockfiles-for-all/)

* Use alpine package registry instead of npm's

* Avoid npx

* Remove `"`

* Follow review

refs: https://github.com/syuilo/misskey/pull/5154#discussion_r303227256

* Update lockfile

* Use yarn instead of npm run

refs: https://github.com/syuilo/misskey/pull/5154#discussion_r303227285

* Back to npm

* Follow review

refs: https://github.com/syuilo/misskey/pull/5154#discussion_r303292279
2019-07-15 21:32:09 +09:00
abc57519a7 New Crowdin translations (#5155)
* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Czech)
2019-07-15 20:47:49 +09:00
a23a10d375 Improve CONTRIBUTING.md (#5157) 2019-07-15 20:47:09 +09:00
01e7716170 (コ`・ヘ・´ケ) (#5156) 2019-07-15 02:28:30 +09:00
0a29ce13b6 Nothing 2019-07-14 11:08:13 +09:00
6d0ee61661 Corriger les omissions 2019-07-14 11:04:27 +09:00
9c684fd6c4 Welcome back, yarn.lock
[lockfiles for all](https://yarnpkg.com/blog/2016/11/24/lockfiles-for-all/)
2019-07-14 10:16:30 +09:00
cbb8edd5ed Revert "Add yarn.lock to .gitignore (#3408)"
This reverts commit e8439679a5.
2019-07-14 10:09:00 +09:00
f933fa0e78 Add FAQ in CONTRIBUTING.md 2019-07-14 10:06:10 +09:00
b3e5198f23 Use yarn instead of npm 2019-07-14 10:04:52 +09:00
6e042ca344 Revert "Docker: Back to npm from yarn (#4730)"
This reverts commit 112a72abdf.
2019-07-14 09:58:45 +09:00
9381842af2 Bye @types/is-root 2019-07-14 09:42:22 +09:00
a6644c540a Update dependency resolutions 2019-07-14 09:38:49 +09:00
063427a660 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-07-14 04:02:41 +09:00
6846067a5d Update CONTRIBUTING.md 2019-07-14 04:02:24 +09:00
b7273c90ae Fix #5128 (#5153) 2019-07-14 03:56:34 +09:00
a6f5e23069 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-07-14 03:54:02 +09:00
f37f22b163 Fix bug 2019-07-14 03:53:45 +09:00
9440fdb2d0 New Crowdin translations (#5152)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)
2019-07-14 03:33:31 +09:00
96c19b2607 New Crowdin translations (#5151)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)
2019-07-14 03:28:30 +09:00
b34c1379e9 Resolve #3238 2019-07-14 03:18:45 +09:00
0fc965f342 New translations ja-JP.yml (Chinese Simplified) (#5149) 2019-07-13 02:04:09 +09:00
617db05808 New translations ja-JP.yml (Chinese Simplified) (#5148) 2019-07-13 01:45:09 +09:00
6a20ab687c New translations ja-JP.yml (Chinese Simplified) (#5146) 2019-07-13 01:13:50 +09:00
6c3bcdad54 New translations ja-JP.yml (Chinese Simplified) (#5145) 2019-07-13 01:04:06 +09:00
aeea275ec2 New Crowdin translations (#5144)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)
2019-07-12 22:36:09 +09:00
b3c6e28717 Improve usability (#5142)
Fix #3862
2019-07-12 22:24:29 +09:00
70691e1523 Fix: proxy-media後のContent-Typeが違う (#5143) 2019-07-12 22:21:47 +09:00
2cb032b0e0 Fix #5140 2019-07-12 03:17:31 +09:00
ebbf5268ac Improve usability 2019-07-12 02:08:13 +09:00
b2030e8403 🎨 2019-07-12 00:40:10 +09:00
82493bb741 Update dependencies 🚀 2019-07-11 23:46:46 +09:00
aa15901c23 New Crowdin translations (#5131)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)
2019-07-10 18:47:19 +09:00
0bd4d069a2 New Crowdin translations (#5130)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)
2019-07-10 18:37:38 +09:00
ab871c6991 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-07-10 18:30:58 +09:00
feec5e88fc Pages: Implement radio button 2019-07-10 18:30:51 +09:00
a091cbb93a Prevent duplicate user registration (#5129) 2019-07-10 03:47:07 +09:00
a59ab79da0 Fix drive browser showing false empty (#5127) 2019-07-09 17:38:14 +09:00
8ca4d39440 Update doc 2019-07-09 17:06:12 +09:00
41d041f701 Merge branch 'develop' 2019-07-09 17:03:38 +09:00
3e516474c2 11.25.1 2019-07-09 17:03:24 +09:00
405c9c258b New translations ja-JP.yml (English) (#5126) 2019-07-09 17:01:28 +09:00
24e389bcf3 Tune font (#5125) 2019-07-09 17:01:08 +09:00
933c83679e Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-07-09 16:55:59 +09:00
a7aa924949 Add userId prop 2019-07-09 16:55:55 +09:00
0eb84fe874 Fix bug 2019-07-09 16:55:33 +09:00
2f451fa058 New translations ja-JP.yml (English) (#5123) 2019-07-09 09:53:24 +09:00
2465a377a1 Delete init.ts 2019-07-09 04:09:02 +09:00
697219e946 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-07-09 00:11:18 +09:00
4478298a0a Update uodate docs 2019-07-09 00:11:04 +09:00
925f89720a New translations ja-JP.yml (Korean) (#5121) 2019-07-08 17:02:58 +09:00
0f71d9f47a Merge branch 'develop' 2019-07-08 16:17:47 +09:00
a7ec54ea97 11.25.0 2019-07-08 16:17:14 +09:00
1d43d18b19 🎨 2019-07-08 16:11:52 +09:00
0bcb25a983 New Crowdin translations (#5102)
* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)
2019-07-08 16:04:24 +09:00
ec1f2a285b Resolve #5116 2019-07-08 16:03:17 +09:00
c2c06694da Allow only one kind of date identifier at once (#5120) 2019-07-08 13:55:22 +09:00
5343b005df Improve paste uploading Resolve #3023 (#4542)
* resolve #3023

* fix

* fix

* better description

* widget

* fix text

* Update post-form.vue

* Fix enter-file-name dialog title text

* Fix type

* On messaging room

* Replace moment.js to original one

* Fix formatDateTimeString
2019-07-08 13:46:31 +09:00
eb783f827c Better display in narrow desktop and choosing client type; Fix #1442, Fix #2106, Resolve #4552 (#4549)
* fix #1442, fix #2106

* revert

* wip

* ✌️

* clean up

* fix

* https://github.com/syuilo/misskey/pull/4549#discussion_r287750004
2019-07-08 04:36:06 +09:00
6064c3ae47 Add semicolons 2019-07-08 04:32:57 +09:00
05862a420f Merge branch 'develop' into pr/4549 2019-07-08 04:27:18 +09:00
393ad283e1 🎨 2019-07-08 04:19:17 +09:00
841c8d619f 既定のアップロード先フォルダを設定できるように 2019-07-08 04:17:53 +09:00
5c2ed9e5d3 11.24.0の注意書きを追記 (#5108) 2019-07-07 19:00:38 +09:00
d39aabc143 Fix notification wrap (#5118) 2019-07-07 18:59:54 +09:00
4628f507e5 公開以外へのリプライ時元の公開範囲で指定したユーザー情報を引き継ぐように (#5119)
* 公開以外へのリプライ時元の公開範囲で指定したユーザー情報を引き継ぐように

* Use users/show userIds
2019-07-07 17:14:08 +09:00
8b05816860 Refactor: Remove needless return 2019-07-07 15:29:08 +09:00
3b8ea90fdc フォルダーを削除できないときダイアログボックスで知らせる (#5111)
* フォルダーを削除できないときダイアログボックスで知らせる

* https://github.com/syuilo/misskey/pull/5111#issuecomment-508959068

かわいい
2019-07-07 14:56:51 +09:00
638458e2c1 Fix: postgres redis cache の option が適用されない (#5114) 2019-07-07 07:59:59 +09:00
bd8d7c3d0f Improve Page
* ページをピン留めできるように
* デッキでカラム内でページを見れるように
2019-07-07 06:56:13 +09:00
4b747d20b7 Use npx to avoid global install of ts-node 2019-07-07 05:26:04 +09:00
351b236014 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-07-07 05:13:21 +09:00
e9251debe0 イベント送信時に指定の変数の値を添付出来るように 2019-07-07 05:12:31 +09:00
22c4842154 https://github.com/syuilo/misskey/pull/4549#discussion_r287750004 2019-07-07 02:22:33 +09:00
788edd3622 fix 2019-07-07 02:22:33 +09:00
5afe96e15a clean up 2019-07-07 02:22:08 +09:00
899fc8a7bd ✌️ 2019-07-07 02:22:08 +09:00
2afcdda058 wip 2019-07-07 02:21:13 +09:00
c2fc637575 revert 2019-07-07 02:18:24 +09:00
82d2b0608f fix #1442, fix #2106 2019-07-07 02:18:24 +09:00
047a46d966 Support password-less login with WebAuthn (#5112)
* Support password-less login with WebAuthn

* Fix initial value of usePasswordLessLogin
2019-07-07 01:38:36 +09:00
e97dd13e81 Pages: ボタンを色付き表示できるように 2019-07-06 23:11:16 +09:00
067e9ec6f4 Fix bug 2019-07-06 22:53:15 +09:00
64397708fd MisskeyPagesにイベント送信ボタンを追加 2019-07-06 18:14:50 +09:00
5ae6b0058f やった (#5110) 2019-07-06 00:46:00 +09:00
c201326906 Merge branch 'develop' 2019-07-05 22:36:13 +09:00
3bc2fe8527 11.24.2 2019-07-05 22:35:52 +09:00
c76c1fc4ef Update CHANGELOG.md 2019-07-05 22:34:34 +09:00
fb3fa06ae7 Update CHANGELOG.md 2019-07-05 22:33:54 +09:00
48353cccae Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-07-05 22:32:19 +09:00
65bf863093 Fix #4760 2019-07-05 22:32:15 +09:00
87a6ef0581 Fix: SingleLineなMFMが折り返されてしまう (#5109) 2019-07-05 21:47:18 +09:00
af583d2ef6 Update CHANGELOG.md 2019-07-05 21:21:09 +09:00
68d49bc770 Add PB 2019-07-05 21:18:49 +09:00
d848195a6e チャートで数字が表示される問題を修正 2019-07-05 21:13:52 +09:00
3c5324bbbb Merge branch 'develop' 2019-07-05 18:02:42 +09:00
e2d59293fb 11.24.1 2019-07-05 18:02:29 +09:00
411f038f34 Fix: カスタム絵文字リアクションがたまに文字になってしまう (#5105) 2019-07-05 17:58:54 +09:00
26f2ae093b APNGでもMIME typeはimage/pngにするように (#5100)
* APNGでもMIME typeはimage/pngにするように

* Revert "APNGでもMIME typeはimage/pngにするように"

This reverts commit e579eb2bf44f526cabfa9bd4adc6b4fa84727e3b.

* APNGはファイル送信時のみimage/pngにするように
2019-07-05 17:44:23 +09:00
6a53ccf814 ハッシュタグのトレンドの計算を5分単位で丸める (#5107) 2019-07-05 08:43:56 +09:00
114523e69e Fix WebAuthn login (#5103) 2019-07-05 07:48:12 +09:00
d5caf22d8c Update Emojis immediately (#5106) 2019-07-05 07:45:00 +09:00
a8f945ae8e Update node version (#5101) 2019-07-05 02:48:32 +09:00
d078f78602 Merge branch 'develop' 2019-07-05 02:13:02 +09:00
a5c6145237 11.24.0 2019-07-05 02:12:45 +09:00
50df9f7dff Update node version 2019-07-05 02:12:23 +09:00
7b33522d97 New Crowdin translations (#5082)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Korean)
2019-07-05 02:09:59 +09:00
d3edf03125 Fix errors 2019-07-05 02:00:54 +09:00
d5cd38b459 Create partial type definition for 'jsrsasign' (#5092)
* Create partial type definition for 'jsrsasign'

* Update comments

* Add jsrsasign dependency

* Make some params of Signature class optional

* Make init argument of Signature.init optional
2019-07-05 01:54:16 +09:00
2c76d410ab Resolve #1867 2019-07-04 22:59:52 +09:00
dfd991a6c6 テストメールは管理者アドレスに送信するように 2019-07-04 21:08:47 +09:00
16b81fff38 Resolve #3431 2019-07-04 21:07:02 +09:00
f379a721f1 Fix bug 2019-07-04 20:52:21 +09:00
194a958d40 Update CHANGELOG.md 2019-07-04 20:40:02 +09:00
327ffd3498 Resolve #4321 2019-07-04 20:39:33 +09:00
40276d7f1a テストページ廃止 2019-07-04 20:26:12 +09:00
9254f95679 Update CHANGELOG.md 2019-07-04 15:14:13 +09:00
2e1a9dffbe Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-07-04 14:45:33 +09:00
ead5a6a258 APNG support 2019-07-04 14:45:28 +09:00
97002400a8 アバターファイル選択でimage以外は表示しないように (#5098) 2019-07-04 14:31:30 +09:00
5e7a4e4752 Fix MIME 2019-07-03 23:43:09 +09:00
2c955858a0 Add note 2019-07-03 20:31:52 +09:00
a0e56504de Update package.json 2019-07-03 20:31:38 +09:00
d46e9f5abe Update ESLint 🚀 (#5097) 2019-07-03 20:20:02 +09:00
fd94b817ab Implement Webauthn 🎉 (#5088)
* Implement Webauthn 🎉

* Share hexifyAB

* Move hr inside template and add AttestationChallenges janitor daemon

* Apply suggestions from code review

Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com>

* Add newline at the end of file

* Fix stray newline in promise chain

* Ignore var in try{}catch(){} block

Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com>

* Add missing comma

* Add missing semicolon

* Support more attestation formats

* add support for more key types and linter pass

* Refactor

* Refactor

* credentialId --> id

* Fix

* Improve readability

* Add indexes

* fixes for credentialId->id

* Avoid changing store state

* Fix syntax error and code style

* Remove unused import

* Refactor of getkey API

* Create 1561706992953-webauthn.ts

* Update ja-JP.yml

* Add type annotations

* Fix code style

* Specify depedency version

* Fix code style

* Fix janitor daemon and login requesting 2FA regardless of status
2019-07-03 20:18:07 +09:00
f17e229c1e Resolve #5072 2019-07-03 03:58:45 +09:00
96e23b0e5b MFMで連続したスペースがひとつに纏まるのを修正 2019-07-02 20:52:37 +09:00
014b945ea6 Fix test 2019-07-02 20:08:30 +09:00
76693138d3 Fix MFM parsing: Ignore parent [] of URL 2019-07-02 20:05:52 +09:00
10677b57d4 Update dependencies 🚀 2019-07-02 19:20:34 +09:00
5f0ac0f46a Fix #5073 2019-07-02 19:17:14 +09:00
7ffe559525 Resolve #5085 2019-07-02 18:32:24 +09:00
919e3e2fed Update README.md [AUTOGEN] (#5094) 2019-07-02 15:37:24 +09:00
03e999875a リモートファイルの削除が重い問題を修正 2019-07-01 21:12:14 +09:00
ed0070c470 Set job concurrency to reduce performance issue 2019-07-01 20:37:26 +09:00
d764316708 Simplify log domain 2019-07-01 03:25:31 +09:00
06b1203ef9 Create 1561873850023-ChartIndexes.ts 2019-06-30 14:51:57 +09:00
b2cf74e878 Create accept-migration.ts 2019-06-30 04:49:30 +09:00
21064f7859 Add initial migration 2019-06-29 23:19:21 +09:00
bb2d76ffa3 Fix #4926 2019-06-29 23:12:00 +09:00
763b70e01b Revert "Update ormconfig.ts"
This reverts commit 5a349eb376.
2019-06-29 15:58:04 +09:00
5a349eb376 Update ormconfig.ts 2019-06-29 15:31:54 +09:00
0141affe05 Fix: AP object / actor type (#5086)
* attributedToがArrayの場合などに対応

* attachment以外で来るDocument系のObjectに対応

* Renote, Reply 対応

* 表示をいい感じに

* fix type

* revert as const

* Fix Note / Question type

* attributedToのtypeで複合配列を想定する
2019-06-28 18:54:09 +09:00
a8379e3bc9 Use as const
#5089
2019-06-28 16:38:48 +09:00
952789cc1e Use as const
#5089
2019-06-27 18:04:09 +09:00
0500600cdd Merge branch 'develop' 2019-06-25 01:27:51 +09:00
6b897e562a 11.23.1 2019-06-25 01:27:33 +09:00
f74bc309b1 Fix bug 2019-06-25 01:24:01 +09:00
bc83963ac7 English nyaize 2019-06-24 22:20:13 +09:00
94715e6153 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-06-23 16:12:37 +09:00
31a5247b9c 🎨 2019-06-23 16:12:11 +09:00
ac9f77752d New translations ja-JP.yml (Chinese Simplified) (#5081) 2019-06-23 01:53:21 +09:00
73ac2632c2 Merge branch 'develop' 2019-06-23 00:22:33 +09:00
20f11a6701 11.23.0 2019-06-23 00:21:58 +09:00
9bdc67c1f6 New Crowdin translations (#5065)
* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)
2019-06-23 00:21:04 +09:00
bb4ca7b31a Resolve #5010 2019-06-23 00:06:39 +09:00
89f16668e6 Fix #4519 2019-06-22 04:17:02 +09:00
8409b59dea Improve usability 2019-06-22 04:09:53 +09:00
1707002d43 Block all activities from suspended users (#5076) 2019-06-21 15:42:07 +09:00
16b03fc157 Improve url-preview (#5077)
* url-previewリクエスト時にハッシュは除く

* ハッシュだけ違うプレビューカードは表示しない

*  url-previewをユーザーロケールで出し分けるように

* Fix code style
2019-06-21 15:41:02 +09:00
fa0023e541 Fix bug 2019-06-21 15:11:56 +09:00
aec5911821 Improve sync 2019-06-21 15:08:17 +09:00
26f4c038f3 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-06-21 13:06:55 +09:00
6136f6f33a デッキの状態を同期できるように 2019-06-21 13:06:47 +09:00
2b8d0225cc Enable ServiceWorker (#5075) 2019-06-21 11:50:38 +09:00
18184441f1 ホームのカスタマイズ情報を複数のデバイス間で同期できるように 2019-06-21 01:50:01 +09:00
bd83939993 Provide Redis version 2019-06-20 22:55:57 +09:00
2c1932faa7 Add psql version to info page 2019-06-20 22:52:35 +09:00
33d79420eb Fix code style 2019-06-19 17:47:24 +09:00
80d8af84dd Merge branch 'develop' 2019-06-18 19:16:41 +09:00
aac519bf80 11.22.0 2019-06-18 19:15:55 +09:00
d64dffbdda Add index 2019-06-18 17:11:28 +09:00
4015ccef2f Add chart indices 2019-06-18 17:10:28 +09:00
b6f985abaf Update summaly to 2.3.0 2019-06-18 16:58:32 +09:00
2dac8d3d1f Update db.vue 2019-06-18 16:53:14 +09:00
4f284e1bc0 Resolve #5063 2019-06-18 16:49:58 +09:00
b0280355e8 Better request interval 2019-06-18 16:17:20 +09:00
048d88b784 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-06-18 15:56:31 +09:00
bb52ebdc3e Provide version of postgresql 2019-06-18 15:56:03 +09:00
5f2fda85ba Resolve #5069 (#5070) 2019-06-18 15:42:08 +09:00
1331f0b953 Use WHATWG API
> New application code should use the WHATWG API.
2019-06-18 15:27:13 +09:00
736fdabc1d Fix #2637 2019-06-18 15:19:19 +09:00
7096c0ca49 Add note 2019-06-18 14:04:41 +09:00
1a984de8e8 Better error handling 2019-06-18 13:58:59 +09:00
285d0d13f9 Fix MFM URL parsing 2019-06-17 20:15:19 +09:00
63c659bc8f Fix MFM strike parsing 2019-06-16 21:42:57 +09:00
af60b45ee7 Fix MFM italic parsing 2019-06-16 21:30:51 +09:00
e7effd606d Fix test 2019-06-16 21:30:26 +09:00
5042d23bc4 Simplify test 2019-06-16 21:29:31 +09:00
b134467bd3 Add some MFM tests 2019-06-16 21:26:43 +09:00
5cc1aab530 Merge branch 'develop' 2019-06-16 16:09:04 +09:00
49d57ce049 11.21.0 2019-06-16 16:08:36 +09:00
f1feceaf1a Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-06-16 16:08:29 +09:00
1204e1c5e4 Update dependencies 🚀 2019-06-16 16:07:57 +09:00
96cf4c30cf New Crowdin translations (#5053)
* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Danish)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (French)
2019-06-16 16:06:00 +09:00
a3853611ad Fix: オートコンプリートにアニメーション停止が効かない (#5061) 2019-06-16 16:04:27 +09:00
ef7eaaabfa Support Unicode 12.0 Emoji (#5062) 2019-06-16 14:24:37 +09:00
a4a96710b0 閉鎖しているホストにはAP deliverしないように (#5057)
* 閉鎖しているホストにはAP deliverしないように

* fix case
2019-06-15 17:09:59 +09:00
6d08909b2f Refactor 2019-06-15 17:06:03 +09:00
2615368b1e Resolve #365 2019-06-15 00:07:41 +09:00
2bd03ca725 Use halfwidth space instead of fullwidth space in code (#5054) 2019-06-14 22:54:19 +09:00
67dda01fcb image以外はproxyしないように (#5051) 2019-06-14 12:14:23 +09:00
e9dc54c4d9 サムネイル生成でエラーになってもファイルのアップロードを失敗しないように
#5050
2019-06-13 22:59:15 +09:00
fde9fc2891 Make url preview log warn 2019-06-13 22:35:37 +09:00
6e59798e82 Merge branch 'develop' 2019-06-13 18:22:49 +09:00
5e3cc0a3c6 11.20.4 2019-06-13 18:22:31 +09:00
cfb35324d0 Fix bug 2019-06-13 18:15:35 +09:00
9bfbc12afa Add indexes 2019-06-13 15:30:51 +09:00
b41cddaf5a Fix: #5035 (#5048) 2019-06-12 13:47:58 +09:00
1432a7193d 設定でPostgreSQLのクエリー結果のキャッシュを無効できるように (#5046) 2019-06-11 20:49:08 +09:00
20630cb3a0 Update README.md [AUTOGEN] (#5044) 2019-06-11 16:57:52 +09:00
2eb02ae581 Merge branch 'develop' 2019-06-10 23:11:22 +09:00
801f9027aa 11.20.3 2019-06-10 23:11:04 +09:00
802739a2df Fix bug 2019-06-10 23:09:36 +09:00
95b1e1a21d Merge branch 'develop' 2019-06-10 11:44:01 +09:00
b8060a522a 11.20.2 2019-06-10 11:43:45 +09:00
fe2191a491 New Crowdin translations (#5040)
* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)
2019-06-10 11:42:06 +09:00
2891f52817 Merge branch 'riamu' into develop 2019-06-10 11:41:07 +09:00
5bdc44c672 ✌️ (#5041)
related #5020
2019-06-10 01:02:33 +09:00
65d359b57a Fix #5020 2019-06-09 23:07:32 +09:00
155da0c6a3 Avoid roma-ji naming 2019-04-10 20:30:00 +09:00
688 changed files with 28061 additions and 4582 deletions

View File

@ -8,6 +8,9 @@
# Final accessible URL seen by a user.
url: https://example.tld/
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
# URL SETTINGS AFTER THAT!
# ┌───────────────────────┐
#───┘ Port and TLS settings └───────────────────────────────────
@ -62,6 +65,9 @@ db:
user: example-misskey-user
pass: example-misskey-pass
# Whether disable Caching queries
#disableCache: true
# Extra Connection options
#extra:
# ssl: true
@ -73,6 +79,8 @@ redis:
host: localhost
port: 6379
#pass: example-pass
#prefix: example-prefix
#db: 1
# ┌─────────────────────────────┐
#───┘ Elasticsearch configuration └─────────────────────────────
@ -110,8 +118,28 @@ autoAdmin: true
# Whether disable HSTS
#disableHsts: true
# Clustering
# Number of worker processes
#clusterLimit: 1
# Job concurrency per worker
# deliverJobConcurrency: 128
# inboxJobConcurrency: 16
# IP address family used for outgoing request (ipv4, ipv6 or dual)
#outgoingAddressFamily: ipv4
# Syslog option
#syslog:
# host: localhost
# port: 514
# Proxy for HTTP/HTTPS
#proxy: http://127.0.0.1:3128
# Proxy for SMTP/SMTPS
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
# Media Proxy
#mediaProxy: https://example.com/proxy

View File

@ -1,23 +1,23 @@
{
"parserOptions": {
"parser": "typescript-eslint-parser"
"parser": "@typescript-eslint/parser"
},
"extends": [
"eslint:recommended",
"plugin:vue/recommended"
],
"rules": {
"vue/require-v-for-key": false,
"vue/max-attributes-per-line": false,
"vue/html-indent": false,
"vue/html-self-closing": false,
"vue/no-unused-vars": false,
"vue/attributes-order": false,
"vue/require-prop-types": false,
"vue/require-default-prop": false,
"vue/html-closing-bracket-spacing": false,
"vue/singleline-html-element-content-newline": false,
"vue/no-v-html": false,
"vue/require-v-for-key": 0,
"vue/max-attributes-per-line": 0,
"vue/html-indent": 0,
"vue/html-self-closing": 0,
"vue/no-unused-vars": 0,
"vue/attributes-order": 0,
"vue/require-prop-types": 0,
"vue/require-default-prop": 0,
"vue/html-closing-bracket-spacing": 0,
"vue/singleline-html-element-content-newline": 0,
"vue/no-v-html": 0,
"no-console": 0,
"no-unused-vars": 0,
"no-empty": 0

6
.gitattributes vendored
View File

@ -1,5 +1,7 @@
*.svg -diff -text
*.psd -diff -text
*.ai -diff -text
yarn.lock -diff -text
package-lock.json -diff -text
*.mqo -diff -text
*.glb -diff -text
*.blend -diff -text
*.afdesign -diff -text

11
.gitignore vendored
View File

@ -1,5 +1,6 @@
# Visual Studio Code
/.vscode
!/.vscode/extensions.json
# Intelij-IDEA
/.idea
@ -7,9 +8,6 @@
# Node.js
/node_modules
# yarn
yarn.lock
# config
/.config/*
!/.config/example.yml
@ -32,3 +30,10 @@ api-docs.json
.DS_Store
/files
ormconfig.json
# blender backups
*.blend1
*.blend2
*.blend3
*.blend4
*.blend5

View File

@ -1 +1 @@
v12.1.0
v12.11.1

View File

@ -2,10 +2,10 @@
"recommendations": [
"ducksoupdev.vue2",
"editorconfig.editorconfig",
"eg2.tslint",
"eg2.vscode-npm-script",
"hollowtree.vue-snippets",
"ms-vscode.typescript-javascript-grammar",
"ms-vscode.vscode-typescript-tslint-plugin",
"octref.vetur",
"sysoev.language-stylus"
]

View File

@ -1,21 +1,446 @@
ChangeLog
=========
If you encounter any problems with updating, please try the following:
1. `npm run clean` or `npm run cleanall`
2. Retry update (Don't forget `npm i`)
11.37.0 (2020/01/07)
--------------------
### ✨Improvements
* AP引用でquoteUrlに対応
* トークの既読を連合
* 期限切れ/未保存リモートファイルのローカルプロキシ機能
* ミュート/ブロックでページングと解除ができるように
* Redis prefixにホスト名を使用するように
* AP Resolverの長いエラーメッセージをトリムするように
* 管理画面でstatsを継続リクエストしないように
* 凍結ユーザーのプロファイルなどを表示しないように
* クライアントで、thumbanilUrlが提供されていない画像はプレビューしないように
* svgでも画像の平均色を計算するように
* 画像の平均色を計算するとき、透過部分のある画像では一律で背景を#fff(白)に
* Pages: 小数点を丸める関数を追加
Migration
------------------------------
#### 1
```
npm i -g ts-node
```
### 🐛Fixes
* カスタム絵文字リアクションの絵文字がNoteに添付されないのを修正
* リモートプロキシ時にサムネイルのContent-Typeがおかしい問題を修正
* /files/ 下のヘッダ設定タイミングを修正
* イベントが同じRedisを使用する他のMisskeyインスタンスに飛んでしまう問題を修正
* AP inbox Announce の処理の修正
* followers, direct投稿の存在がユーザーの投稿一覧に表示されている問題を修正
* Stacked bar chart がおかしいのを修正
* リストのインポートがエラーが出るとそこで終わってしまう問題を修正
* サムネイル/webpublicのファイル形式がjpeg/pngに固定されていたのをファイルを基に送出するように
* syslogが使えない問題を修正
#### 2
```
npm run migrate
```
11.36.0 (2019/11/24)
--------------------
### ✨Improvements
* ジョブキューで試行回数等を表示するように
* deliverエラー等の同じようなログが複数出てこないように、上でまとめて出すように
* deliverエラーのログではキューの詳細情報を格納しないように
* inbox/deliverのログに試行回数とキューが作られてからの時間を表示するように
* 無駄なAP deliverをしないように
* boot: remove setAttribute() calls and translate reload msg
### 🐛Fixes
* メンションの通知が届かない可能性がある問題を修正
* ブロックや閉鎖済みインスタンスのステータスが更新されてしまう問題を修正
* 「フォロワーを解除」アクティビティを正しく受け取らない問題を修正
* inboxのジョブキューが表示されない問題を修正
* ローカルにフォロワー限定投稿が流れてくる問題を修正
* リモートユーザーのアイコンがサムネイルで表示されない問題を修正
* DBとオブジェクトストレージのジョブキューが表示されない問題を修正
* エラーが発生したときにサーバーがクラッシュすることがある問題を修正
11.35.1 (2019/11/05)
--------------------
### 🐛Fixes
* リモートのフォローボタンを押してmisskeyインスタンスを入力したとき正しく動作しない問題を修正
* リアクション設定で改行ができない問題を修正
* nodeinfoのmetadataを一般的なものに修正
11.35.0 (2019/11/01)
--------------------
### ✨Improvements
* 一対一でのトークを連合するように
* カスタム絵文字をカテゴリ分け出来るように
* カスタム絵文字をカテゴリ, 名前でソートするように
* 絵文字ピッカーに最近使った絵文字を表示するように
* 絵文字ピッカーで最後に使ったページを覚えておくように
* 絵文字ピッカーで正方形じゃない絵文字のアスペクト比を保持するように
* EscやBackspaceでメディアビューワが閉じれるように
### 🐛Fixes
* AP: リモートアカウントを解決するとき、そのActorにendpointsが無いとTypeErrorになる問題を修正
* AP: 新規投稿のMFMをHTMLに変換する際、リモートユーザーへのメンションのリンク先を(できれば)urlに
* AP: menionのclassにu-urlを付けるように
* AP: Noteの添付ファイルを提示する時に添付順を保持するように
* リモートユーザーの更新に失敗することがある問題を修正
* ミュートしているユーザーのプロフィールを開くと投稿が表示されない問題を修正
* チャートで値が減ったときの記録が正しく行われていなかった問題を修正
* カスタム絵文字を登録できない場合がある問題を修正
* カスタム絵文字を重複登録できないように
* みつけるの微修正
* プロフィールで他のユーザーにうつってもfieldsが更新されない問題を修正
* 絵文字ピッカーでアニメーション停止オプションが効かないのを修正
11.34.0 (2019/10/14)
--------------------
### ✨Improvements
* みつけるに連合分を表示するように
* リアクションピッカーをカスタマイズできるように
* inputで不正な値を入力したときにメッセージを表示するように
* ドライブファイルダウンロードURLにdownloadを付けないように
* web-pushでProxyを使用するように
### 🐛Fixes
* 投稿本文が合字を含んで8192文字の場合に制限をパスしても投稿できない問題を修正
* meta.maxNoteTextLengthをnote.textの最大サイズより大きく設定できる問題を修正
* ページ移動等してもメニュー等が閉じずに残ってしまう問題を修正
* ページ移動してもメディアビューワーが残ってしまう問題を修正
* APに関する問題の修正
* オフライン時に大室櫻子が出てこない問題を修正
11.33.0 (2019/09/27)
--------------------
### ✨Improvements
* 絵文字ピッカーの Unicode 12.0 対応
* Adminページのユーザー一覧フィルターに利用可能アカウントを追加
* お知らせウィジェットのデザインを変更
### 🐛Fixes
* ユーザーを特定のリストから外すと他のリストからも消える問題を修正
* 任意のグループからユーザーを削除すると他のグループからでも削除されちゃうのを修正
* 非公開の投稿にリアクションや返信がついたとき通知が正しく行われない問題を修正
* AP: featured collectionの取り扱いが間違ってるのを修正
* AP: 存在しないユーザーをAPで参照すると404にするべきところ500になってしまうのを修正
* AndoridとデスクトップOSのChromeでPWAとしてインストールホーム画面に追加できない問題を修正
* /@:user/* でユーザー用のページを返さない問題を修正
* インスタンス設定で空Arrayがうまく保存できない問題を修正
* 絵文字サジェスト時にそれがサロゲートペアだった場合「1文字」分しかカーソルが移動しない問題を修正
* ハッシュタグパースの修正
* MFMでKeycap Number Signが表示できない問題を修正
* フォローリクエストページのデザインを修正
* selectコンポーネントに余分な下線が付く問題を修正
11.32.0 (2019/09/10)
--------------------
### ✨Improvements
* APでRenote/Boost取り消しをやりとりするように
* リモートNote存在確認から作成までの間にLockをかけるように
* 広告ブロッカーの警告を削除
### 🐛Fixes
* ミュートしているユーザーからトークメッセージが来たときに通知インジケーターが点灯する問題を修正
* リアクションした人が10人を超えるときツールチップの表示がおかしい問題を修正
11.31.4 (2019/09/03)
--------------------
### 🐛Fixes
* 誰がリアクションしたか見れるやつの表示を改善
11.31.3 (2019/09/03)
--------------------
### 🐛Fixes
* 誰がリアクションしたか見れるやつの表示を改善
11.31.2 (2019/09/03)
--------------------
### 🐛Fixes
* 誰がリアクションしたか見れるやつの表示を改善
11.31.1 (2019/09/03)
--------------------
### 🐛Fixes
* 誰がリアクションしたか見れるやつの表示を改善
11.31.0 (2019/09/02)
--------------------
### ✨Improvements
* Syslogサポート
* チャートの同期機能をAPI経由で使えるように
* SMTPでProxyを使用できるように
* リアクションにホバーすることで誰がリアクションしたか見れるように
* リプライ時、返信元のlocalOnly属性を引き継ぐように
* 引用付き、ローカルのみなどの案内文にアイコン追加
* AP deliver/inbox job の並列度を変更できるように
* clusterLimitの既定値を1に
* AP inbox ジョブの並列度を下げる
* CWが付いた投稿はAP上でNote.sensitiveフラグを付けるように
* メモウィジェットの内容を自動で保存するように
* ページURLが他と重複してたらエラーを投げるように
* ページURLが空の時エラーを投げるように
* リアクションが解除されたときはアニメーションしないように
* 設定の各セクションごとにURLを割り当てるように
* 管理画面の各セクションごとにURLを割り当てるように
### 🐛Fixes
* 未実装のTLのRenoteクエリを実装
* タイムラインAPIのexcludeNsfwオプションを実装
* ユーザーページの投稿一覧の私の投稿にRenoteが表示される問題を修正
* meta APIでemojiプロパティに不要な情報が含まれているのを修正
* モバイル版でドライブのファイルを削除したときの挙動がおかしい問題を修正
* visiblity-chooserにlocalOnly属性が伝わらなかったのを修正
* 言語指定したときコードブロックが表示されない問題を修正
* トークのメッセージがはみ出す問題を修正
* CWの中のサムネイルのサイズが変なのを少し修正
* リアクションが初めて付いた時のエフェクトが消えている問題を修正
* 無効になっているスイッチを操作できる問題を修正
* Mキー連打で画面が真っ暗問題を修正
* AmazonのURLプレビューが出来ない問題を修正
* 表記ゆれを修正
11.30.0 (2019/08/24)
--------------------
### ✨Improvements
* Room: 家具をすべてしまうボタンを追加
* Room: カップ麺追加
* Room: ホログラフィックディスプレイ追加
* Room: エナジードリンク追加
* Room: ピンギンの色を変えられるように
* Room: プレビューの見やすさを向上
* Room保存時にダイアログを表示するように
* Roomから移動するときに未保存ならば警告するように
### 🐛Fixes
* MisskeyRoomからページを戻した時、テキスト入力画面で選択位置変更ができない問題を修正
11.29.0 (2019/08/19)
--------------------
### ✨Improvements
* Room: ソファ追加
* Room: 螺旋階段追加
* Room: ゴミ箱追加
### 🐛Fixes
* Room: 部屋を離れても裏でレンダリングが続く問題を修正
* Room: アバターのレンダリングを修正
* Room: ライティングの調整
11.28.2 (2019/08/18)
--------------------
### 🐛Fixes
* 他人の部屋なのに部屋編集UIが表示されるのを修正
* オブジェクトストレージを使用している場合Roomで画像を読み込めない問題を修正
11.28.1 (2019/08/18)
--------------------
### 🐛Fixes
* オブジェクトストレージを使用している場合Roomで画像を読み込めない問題を修正
* Roomで家具を移動など確定せずに「しまう」と部屋ごと消える問題を修正
11.28.0 (2019/08/18)
--------------------
### ✨Improvements
* 自分の部屋を作れるように
* Delキーを押して投稿を削除するときに確認ダイアログを出すように
* Elasticsearchのインデックス名をconfigで変更できるように
### 🐛Fixes
* コンテンツを遡ってる途中に新しいアイテムが先頭に追加されると上限に達している場合末尾のアイテムが削除される問題を修正
* ユーザー名が突き抜けるのを修正
* ユーザー一覧とかでサイレンス・凍結されたユーザーの状態が表示されてなかったのを修正
* タイトルやアイコンがきちんと設定されないことがあるのを修正
* ドライブアップロード直後に取得できるURLがoriginalじゃない問題を修正
* リモートユーザー向けのNoteUnreadsレコードが作成される問題を修正
* Hashtagがupdateできない問題を修正
* ハッシュタグの更新がタグの数だけ並列で行われてDBを重くしてしまうことがあるのを修正
11.27.1 (2019/08/01)
--------------------
### 🐛Fixes
* オブジェクトストレージに関する問題を修正
11.27.0 (2019/07/29)
--------------------
### ✨Improvements
* 「削除して編集」機能を追加
* HTTPリクエストのKeep-AliveとPrxoy対応(サーバーのパフォーマンス向上)
* 通知を種類でフィルタリングして表示できるように
* モバイルで通知ページを表示することができるように
* 非ログイン時の警告処理
### 🐛Fixes
* リモートの絵文字が更新されない問題を修正
* リンクバリデーションリンクが一瞬表示されてしまう問題を修正
* 選択していない状態でウィジェットが追加できる問題を修正
11.26.2 (2019/07/25)
--------------------
### 🐛Fixes
* すでに使われたことのあるユーザー名を再度使えないように
* モバイルのウィジェットページが常に i/update-client-setting を呼び続ける問題を修正
* 投稿フォームのヘッダに添付ファイル数がちゃんと表示されない問題を修正
11.26.1 (2019/07/21)
--------------------
### 🐛Fixes
* リモートアンケートの期限が保存されないのを修正
* 自分をブロックしているユーザーがおすすめユーザーに表示されている問題を修正
* スクロールしてると絵文字ピッカーの位置がずれる問題を修正
* 投稿フォームが画面外にはみ出さないように
* 投稿フォームの「引用付き」の表示が見づらい問題の修正
* 投稿フォームにもうリノートや引用ノートのデータがある場合はリンクを貼っても「引用として添付しますか?」のダイアログボックスが出ないように
* 「タイムライン上部に投稿フォームを表示する」機能の使用時、ノートを投稿しても引用ノートのデータが残る問題の修正
* デスクトップ版のアクティビティウィジェットの日付とデータの表示が変だったのを修正
11.26.0 (2019/07/19)
--------------------
### ✨Improvements
* モデレーターログを記録して確認できるように
* プロフィールに追加情報を設定できるように
* Mastodonのリンクの所有者認証に対応
* AP: Delete Person アクティビティを配信するように
* AP: Delete アクティビティの後にフォロー解除するように
* AP: アカウント削除でもDelete activityを配信するように
* Pages: ラジオボタンを追加
* AdminページのUsers Viewでユーザーのレコードをクリックすることですぐユーザーを照会できるように
* AdminページのUsers Viewでユーザー一覧からユーザー名とホスト情報で検索できるように
* 特定ホストへのメンションの特別処理をクライアントに追加
* 設定画面でデスクトップ・モバイルモード変更時はすぐにrefreshするか伺うように
* ペーストされたファイル名のテンプレート変更時すぐどのようになるか見れるように
* (コ`・ヘ・´ケ)を追加
### 🐛Fixes
* ログインのログが正しく保存されない問題を修正
* 同じユーザー名のユーザーが作成できてしまうことがある問題を修正
* 報告されたレポート内容が表示されない問題を修正
* リモートのプロフィールの追加情報が表示されない問題を修正
* 「見つける」のタグが大文字小文字区別されている問題を修正
* 管理画面のインスタンス一覧でソートが正しく機能していない問題を修正
* プロフィール設定でバナーに動画を設定すると以降編集ができない問題を修正
* ウェブ検索エンジンの設定でグリッチが発生する問題を修正
* MFMの引用がインライン表示になっている問題を修正
* アンケートの期限入力部分のタイトル表示がおかしい問題を修正
* 画面上の項目がすべていなくなると実際はロードされてないだけのファイルやフォルダーがあるにも関わらず「もっと読み込む」ボタンがなくなり「このフォルダーは空です」っていうplaceholderが表示されてしまう問題を修正
* proxy-media後のContent-Typeが違う問題を修正
* ビルド時にエラーが出るのを修正
11.25.1 (2019/07/09)
--------------------
### 🐛Fixes
* ページイベントが正しくストリームに流れてこない問題を修正
* フォントの調整
11.25.0 (2019/07/08)
--------------------
### ✨Improvements
* パスワード無しログイン機能
* MisskeyPagesにイベント送信ボタンを追加
* MisskeyPagesでボタンを目立たせることができるように
* ページをピン留めできるように
* デッキのカラム内でページを見れるように
* 既定のアップロード先フォルダを設定できるように
* ファイルをペーストしてアップロードするときのファイル名をカスタマイズできるように
* 公開以外へのリプライ時元の公開範囲で指定したユーザー情報を引き継ぐように
* デスクトップ版を使うかモバイル版を使うか手動で設定できるように
* フォルダーを削除できないときダイアログボックスで知らせるように
### 🐛Fixes
* postgres redis cache の option が適用されない問題を修正
* 一部MFMテキストが折り返されず突き抜ける問題を修正
11.24.2 (2019/07/05)
--------------------
### 🐛Fixes
* チャートAPIの返り値が文字列になっていることがある問題を修正
* チャートに数字が表示される問題を修正
* ペタバイト単位が表示できない問題を修正
* SingleLineなMFMが折り返されてしまう問題を修正
11.24.1 (2019/07/05)
--------------------
### 🐛Fixes
* WebAuthnでログインできない問題を修正
* 絵文字の変更事項のmetaへの反映が最大時間遅延される問題を修正
* ハッシュタグのトレンドの計算を5分単位で丸めるように
* APNGでもMIME typeはimage/pngにするように
* カスタム絵文字リアクションがたまに文字になってしまう問題を修正
11.24.0 (2019/07/05)
--------------------
### 注意
- このアップデート後に、`node built/tools/accept-migration Init 1000000000000`してください。
- プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
### ✨Improvements
* WebAuthnサポート
* APNGサポート
* アバターファイル選択でimage以外は表示しないように
* データベース手動バキューム機能
* メールサーバー設定が正しいか確認できるように
* ピン止めの上限に達したときエラーを表示するように
* AP: attributedTo, to, cc が Array や Object のパターンに対応
* AP: object type が Audio, Document, Image, Page, Video のパターンに対応
* フォロー解除時に確認ダイアログを表示するように
* ユーザー入力ダイアログで、入力時にユーザーの存在を確認するように
### 🐛Fixes
* 自分のインスタンスのルートURIへのリンクが無になる問題を修正
* リモートファイルの削除が重い問題を修正
* 投稿などの連続したスペースがひとつに纏まるのを修正
* MFMのパース修正
* マイグレーション時にエラーが出る問題を修正
11.23.1 (2019/06/25)
--------------------
### 🐛Fixes
* クライアントの設定がリセットされることがある問題を修正
11.23.0 (2019/06/23)
--------------------
### ✨Improvements
* ホーム/デッキのカスタマイズ情報を複数のデバイスで同期できるように
* ホーム/デッキのカスタマイズ情報の複数プリセット切り替え
* サーバー情報にRedisのバージョンを追加
* ServiceWorker有効化
* MisskeyPagesでリストの要素数を取得する関数を追加
* URLプレビューでハッシュだけ違うプレビューカードは表示しないように
* URLプレビューをユーザーロケールで出し分けるように
* リモートの凍結されたアカウントからのアクティビティはすべて無視するように
### 🐛Fixes
* フォロー解除してもフォローボタンがフォロー中のままになる問題を修正
11.22.0 (2019/06/18)
--------------------
### ✨Improvements
* 管理画面でデータベースの各テーブルのレコード数やサイズを確認できるように
* サーバー情報にPostgreSQLのバージョンを追加
### 🐛Fixes
* リモートファイルのダウンロードに失敗することがある問題を修正
* アンケートの期間を日時指定で選択すると日時がUTCになってしまう問題を修正
* MFMのパースを修正
11.21.0 (2019/06/16)
--------------------
### ✨Improvements
* Unicode 12.0 の絵文字に対応
* 閉鎖しているホストにはAP deliverしないように
* image以外はproxyしないように
### 🐛Fixes
* サムネイル生成でエラーになるとファイルのアップロードに失敗する問題を修正
* オートコンプリートにアニメーション停止が効かない問題を修正
11.20.4 (2019/06/13)
--------------------
### 🐛Fixes
* 検索結果がループする問題を修正
* 設定でPostgreSQLのクエリー結果のキャッシュを無効できるように
* 「投稿内の動きのあるテキストを無効にする」だけ反応しない問題を修正
* 特定の操作のデータベースのパフォーマンス調整
11.20.3 (2019/06/10)
--------------------
### 🐛Fixes
* 絵文字サジェストが動作しなくなっていた問題を修正
11.20.2 (2019/06/10)
--------------------
### 🐛Fixes
* Redisにパスワードを設定している場合接続できない問題を修正
* i18n
* など
11.20.1 (2019/06/07)
--------------------
@ -524,12 +949,11 @@ mongodb:
db: misskey
```
3. migration ブランチに切り替え
4. `npm i`
5. `npm run build`
6. `npm run init`
7. `npm run migrate`
8. master ブランチに戻す
9. enjoy
4. `yarn install`
5. `yarn build`
6. `yarn migrate`
7. master ブランチに戻す
8. enjoy
10.100.0
----------

View File

@ -7,18 +7,24 @@ Feature suggestions and bug reports are filed in https://github.com/syuilo/missk
* Please search existing issues to avoid duplication. If your issue is already filed, please add your reaction or comment to the existing one.
* If you have multiple independent issues, please submit them separately.
## Branches
* **master** branch is tracking the latest release and used for production purposes.
* **develop** branch is where we work for the next release.
* **l10n_develop** branch is reserved for localization management.
## Localization (l10n)
Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management.
You can improve our translations with your Crowdin account.
Changes you make in Crowdin will be merged into develop branch.
Your changes in Crowdin are automatically submitted as a PR (with the title "New Crowdin translations") to the repository.
The owner [@syuilo](https://github.com/syuilo) merges the PR into the develop branch before the next release.
If you can't find the language you want to contribute with, please open an issue.
If your language is not listed in Crowdin, please open an issue.
![Crowdin](https://d322cqt584bo4o.cloudfront.net/misskey/localized.svg)
## Internationalization (i18n)
Misskey uses [vue-i18n](https://github.com/kazupon/vue-i18n).
Misskey uses the Vue.js plugin [Vue I18n](https://github.com/kazupon/vue-i18n).
Documentation of Vue I18n is available at http://kazupon.github.io/vue-i18n/introduction.html .
## Documentation
* Documents for contributors are located in [`/docs`](/docs).
@ -29,9 +35,25 @@ Misskey uses [vue-i18n](https://github.com/kazupon/vue-i18n).
* Test codes are located in [`/test`](/test).
## Continuous integration
Misskey uses CircleCI for automated test.
Misskey uses CircleCI for executing automated tests.
Configuration files are located in [`/.circleci`](/.circleci).
## Adding MisskeyRoom items
* Use English for material, object and texture names.
* Use meter for unit of length.
* Your PR should include all source files (e.g. `.png`, `.blend`) of your models (for later editing).
* Your PR must include the glTF binary files (`.glb`) of your models.
* Add a locale key `room.furnitures.YOUR_ITEM` at [`/locales/ja-JP.yml`](/locales/ja-JP.yml).
* Add a furniture definition at [`/src/client/app/common/scripts/room/furnitures.json5`](/src/client/app/common/scripts/room/furnitures.json5).
If you have no experience on 3D modeling, we suggest to use the free 3DCG software [Blender](https://www.blender.org/).
You can find information on glTF 2.0 at [glTF 2.0 — Blender Manual]( https://docs.blender.org/manual/en/dev/addons/io_scene_gltf2.html).
## FAQ
### How to resolve conflictions occurred at yarn.lock?
Just execute `yarn` to fix it.
## Glossary
### AP
Stands for _**A**ctivity**P**ub_.
@ -51,11 +73,15 @@ Convert な(na) to にゃ(nya)
#### Denyaize
Revert Nyaize
## Code style
### セミコロンを省略しない
ASI Hazardを避けるためでもある
## TypeScript Coding Style
### Do not omit semicolons
This is to avoid Automatic Semicolon Insertion (ASI) hazard.
### 中括弧を省略しない
Ref:
* https://www.ecma-international.org/ecma-262/#sec-automatic-semicolon-insertion
* https://github.com/tc39/ecma262/pull/1062
### Do not omit curly brackets
Bad:
``` ts
if (foo)
@ -73,18 +99,38 @@ if (foo) {
}
```
ただし**`if`が一行**の時だけは省略しても良い
As a special case, you can omit the curly brackets if
* the body of the `if`-statement have only one statement and,
* the `if`-statement does not have `else`-clause.
Good:
``` ts
if (foo) bar;
```
### `export default`を使わない
インテリセンスと相性が悪かったりするため
Make sure that the condition and the body statement are on the same line.
参考:
* https://gfx.hatenablog.com/entry/2017/11/24/135343
### Do not use `==` when it can simply be replaced with `===`.
🥰
### Use only boolean (or null related) values in the condition of an `if`-statement.
Bad:
``` ts
if (foo.length)
```
Good:
``` ts
if (foo.length > 0)
```
### Do not use `export default`
This is because the current language support does not work well with `export default`.
Ref:
* https://basarat.gitbooks.io/typescript/docs/tips/defaultIsBad.html
* https://gfx.hatenablog.com/entry/2017/11/24/135343
Bad:
``` ts
@ -219,11 +265,12 @@ const user = await Users.findOne(userId).then(ensure);
```
### Migration作成方法
コードの変更をした後、`ormconfig.json``npm run ormconfig`で生成)を用意し、
```
npm i -g ts-node
ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
```
作成されたスクリプトは不必要な変更を含むため除去してください。
## その他
### HTMLのクラス名で follow という単語は使わない
広告ブロッカーで誤ってブロックされる

View File

@ -1,4 +1,4 @@
FROM node:12.1-alpine AS base
FROM node:12.11.1-alpine AS base
ENV NODE_ENV=production
@ -23,9 +23,9 @@ RUN apk add --no-cache \
zlib-dev
COPY package.json ./
RUN npm i
RUN yarn install
COPY . ./
RUN npm run build
RUN yarn build
FROM base AS runner

View File

@ -1,6 +1,6 @@
<a href="https://xn--931a.moe/"><img src="https://github.com/syuilo/misskey/blob/develop/assets/ai-orig.png?raw=true" align="right" height="320px"/></a>
[![Misskey](/assets/title.png)](https://misskey.io/)
[![Misskey](/assets/title.png)](https://join.misskey.page/)
================================================================
[![CircleCI](https://img.shields.io/circleci/project/github/syuilo/misskey.svg?style=for-the-badge&logo=circleci)](https://circleci.com/gh/syuilo/misskey)
@ -10,10 +10,10 @@
**A forever evolving, sophisticated microblogging platform.**
<p align="justify">
<a href="https://misskey.io">Misskey</a> is a decentralized microblogging platform born on Earth.
<a href="https://join.misskey.page/">Misskey</a> 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://joinmisskey.github.io/">Find an instance!</a>
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://join.misskey.page/">Find an instance!</a>
</p>
<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>
@ -103,88 +103,88 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
----------------------------------------------------------------
<!-- PATREON_START -->
<table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5888816/36da0f7c15954df0ab13f9abdf227f66/1.jpeg?token-time=2145916800&token-hash=at8QpJXJ8C0zINY_NmoMKv-MhXVoUK-YzTgaJPJzJYU%3D" alt="Hiroshi Seki" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/27956229" alt="Oliver Maximilian Seidel" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/3.png?token-time=2145916800&token-hash=oH_i7gJjNT7Ot6j9JiVwy7ZJIBqACVnzLqlz4YrDAZA%3D" alt="weepjp" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/605366/c9dc408fdcbf412fb183ca5b06235f8d/1.jpeg?token-time=2145916800&token-hash=oaqsjLqOFjWN5I9hm2epOaTXaEtKwQUy5OW-EpAz6-g%3D" alt="Jon Leibowitz" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19045173/cb91c0f345c24d4ebfd05f19906d5e26/1.png?token-time=2145916800&token-hash=o_zKBytJs_AxHwSYw_5R8eD0eSJe3RoTR3kR3Q0syN0%3D" alt="kiritan" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/24430516/b1964ac5b9f746d2a12ff53dbc9aa40a/1.jpg?token-time=2145916800&token-hash=bmEiMGYpp3bS7hCCbymjGGsHBZM3AXuBOFO3Kro37PU%3D" alt="Eduardo Quiros" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/14215107/1cbe1912c26143919fa0faca16f12ce1/2.png?token-time=2145916800&token-hash=v0KzlXjyiq18u6aSxyy9qIUxSCAx-nnHlO7MzhSA6Mc%3D" alt="Nesakko" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/776209" alt="Denshi" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/557245" alt="mkatze" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1.jpe?token-time=2145916800&token-hash=bqwLTk0Wo0hUJJ8J5y7ii05bLzz-_CDA7Bo0Mp4RFU0%3D" alt="ne_moni" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/4.jpe?token-time=2145916800&token-hash=zEyJqVM7u9d8Ri-65fJYSJcWF1jBH1nJ5a3taRzrTmw%3D" alt="Melilot" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5670915/ee175f0bfb6347ffa4ea101a8c097bff/1.jpg?token-time=2145916800&token-hash=mPLM9CA-riFHx-myr3bLZJuH2xBRHA9se5VbHhLIOuA%3D" alt="osapon" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/3075183/c2ae575c604e420297f000ccc396e395/1.jpeg?token-time=2145916800&token-hash=O9qmPtpo6wWb0OuvnkEekhk_1WO2MTdytLr7ZgsAr80%3D" alt="Liaizon Wakest" width="100"></td>
</tr><tr>
<td><a href="https://www.patreon.com/rane_hs">Hiroshi Seki</a></td>
<td><a href="https://www.patreon.com/user?u=27956229">Oliver Maximilian Seidel</a></td>
<td><a href="https://www.patreon.com/weepjp">weepjp</a></td>
<td><a href="https://www.patreon.com/jonleibowitz">Jon Leibowitz</a></td>
<td><a href="https://www.patreon.com/user?u=19045173">kiritan</a></td>
<td><a href="https://www.patreon.com/user?u=24430516">Eduardo Quiros</a></td>
<td><a href="https://www.patreon.com/Nesakko">Nesakko</a></td>
<td><a href="https://www.patreon.com/user?u=776209">Denshi</a></td>
<td><a href="https://www.patreon.com/user?u=557245">mkatze</a></td>
<td><a href="https://www.patreon.com/user?u=13099460">ne_moni</a></td>
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
<td><a href="https://www.patreon.com/osapon">osapon</a></td>
<td><a href="https://www.patreon.com/wakest">Liaizon Wakest</a></td>
</tr></table>
<table><tr>
<td><img src="https://c8.patreon.com/2/200/557245" alt="mkatze" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/23915207/25428766ecd745478e600b3d7f871eb2/1.png?token-time=2145916800&token-hash=urCLLA4KjJZX92Y1CxcBP4d8bVTHGkiaPnQZp-Tqz68%3D" alt="kabo2468y" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/8249688/4aacf36b6b244ab1bc6653591b6640df/2.png?token-time=2145916800&token-hash=1ZEf2w6L34253cZXS_HlVevLEENWS9QqrnxGUAYblPo%3D" alt="AureoleArk" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5670915/ee175f0bfb6347ffa4ea101a8c097bff/1.jpg?token-time=2145916800&token-hash=mPLM9CA-riFHx-myr3bLZJuH2xBRHA9se5VbHhLIOuA%3D" alt="osapon" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18899730/6a22797f68254034a854d69ea2445fc8/1.png?token-time=2145916800&token-hash=b_uj57yxo5VzkSOUS7oXE_762dyOTB_oxzbO6lFNG3k%3D" alt="YuzuRyo61" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1.png?token-time=2145916800&token-hash=FMV7cPKBD1TU2WTbl1jg6AcdKSvTb2BSFcDhgc-EO8w%3D" alt="gutfuckllc" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5788159/af42076ab3354bb49803cfba65f94bee/1.jpg?token-time=2145916800&token-hash=iSaxp_Yr2-ZiU2YVi9rcpZZj9mj3UvNSMrZr4CU4qtA%3D" alt="mewl hayabusa" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1.png?token-time=2145916800&token-hash=9nEQje_eMvUjq9a7L3uBqW-MQbS-rRMaMgd7UYVoFNM%3D" alt="mydarkstar" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/12718187" alt="Peter G." width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1.jpe?token-time=2145916800&token-hash=UQRWf01TwHDV4Cls1K0YAOAjM29ssif7hLVq0ESQ0hs%3D" alt="nemu" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/17463605" alt="Sampot" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19356899/496b4681d33b4520bd7688e0fd19c04d/2.jpeg?token-time=2145916800&token-hash=_sTj3dUBOhn9qwiJ7F19Qd-yWWfUqJC_0jG1h0agEqQ%3D" alt="sheeta.s" width="100"></td>
</tr><tr>
<td><a href="https://www.patreon.com/user?u=557245">mkatze</a></td>
<td><a href="https://www.patreon.com/user?u=23915207">kabo2468y</a></td>
<td><a href="https://www.patreon.com/AureoleArk">AureoleArk</a></td>
<td><a href="https://www.patreon.com/osapon">osapon</a></td>
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
<td><a href="https://www.patreon.com/Yuzulia">YuzuRyo61</a></td>
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
<td><a href="https://www.patreon.com/hs_sh_net">mewl hayabusa</a></td>
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
<td><a href="https://www.patreon.com/user?u=17866454">sikyosyounin</a></td>
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
<td><a href="https://www.patreon.com/user?u=17463605">Sampot</a></td>
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s</a></td>
</tr></table>
<table><tr>
<td><img src="https://c8.patreon.com/2/200/16542964" alt="Takumi Sugita" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19356899/496b4681d33b4520bd7688e0fd19c04d/2.jpeg?token-time=2145916800&token-hash=_sTj3dUBOhn9qwiJ7F19Qd-yWWfUqJC_0jG1h0agEqQ%3D" alt="sheeta.s" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5827393/59893c191dda408f9cabd0f20a3a5627/1.jpeg?token-time=2145916800&token-hash=i9N05vOph-eP1LTLb9_npATjYOpntL0ZsHNaZFSsPmE%3D" alt="motcha" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13737140/1adf7835017d479280d90fe8d30aade2/1.png?token-time=2145916800&token-hash=0pdle8h5pDZrww0BDOjdz6zO-HudeGTh36a3qi1biVU%3D" alt="Satsuki Yanagi" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1.jpe?token-time=2145916800&token-hash=CPxGQhKIlEaa6WUcgbyHixyKEhakiw9RFdOhsIJBQ_o%3D" alt="takimura" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17195955/be45e5e14c3e48b2bee0456c84e19df4/4.jpe?token-time=2145916800&token-hash=UslrPVM-8TXOe8AapuNiaFYjcIJgPNcU-fKpGbfGJNI%3D" alt="Damillora" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/83884b38afc74d4cbe83c30a13b10edd/1.png?token-time=2145916800&token-hash=R5Tog8RWg0rguRoCIoir3lThokrdPvs8Utfikhc0nhY%3D" alt="Atsuko Tominaga" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/619ab87cc08448439222631ebb26802f/1.gif?token-time=2145916800&token-hash=o27K7M02s1z-LkDUEO5Oa7cu-GviRXeOXxryi4o_6VU%3D" alt="Atsuko Tominaga" width="100"></td>
</tr><tr>
<td><a href="https://www.patreon.com/user?u=16542964">Takumi Sugita</a></td>
<td><a href="https://www.patreon.com/user?u=17866454">sikyosyounin</a></td>
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s</a></td>
<td><a href="https://www.patreon.com/user?u=5827393">motcha</a></td>
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
<td><a href="https://www.patreon.com/takimura">takimura</a></td>
<td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td>
</tr></table>
<table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3.png?token-time=2145916800&token-hash=FTm3WVom4dJ9NwWMU4OpCL_8Yc13WiwEbKrDPyTZTPs%3D" alt="natalie" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1.jpe?token-time=2145916800&token-hash=EWxXhVbZYH7KB4IDT3joc8TbIg8zPO40x1r5IDn3R7c%3D" alt="Hiratake" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5923936/2a743cbfbff946c2af3f09026047c0da/2.png?token-time=2145916800&token-hash=h6yphW1qnM0n_NOWaf8qtszMRLXEwIxfk5beu4RxdT0%3D" alt="noellabo" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/2384390/5681180e1efb46a8b28e0e8d4c8b9037/1.jpg?token-time=2145916800&token-hash=SJcMy-Q1BcS940-LFUVOMfR7-5SgrzsEQGhYb3yowFk%3D" alt="CG" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpe?token-time=2145916800&token-hash=qA8j97lIZNc-74AuZ0p4F3ms6sKPeKjtNt2vEuwpsyo%3D" alt="Hekovic" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/10789744/97175095d8f04c0f86225ff47cb98d40/1.jpeg?token-time=2145916800&token-hash=l4AoMR7Nj7K4yAHrkrk2hAoggPkbSPm12m1nmbe9Pb8%3D" alt="Naoki Hirayama" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1.jpeg?token-time=2145916800&token-hash=L55UhJ0rcuNAH3w_ryeeGN4hC6taoOixyAhraEi0bzw%3D" alt="dansup" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1.png?token-time=2145916800&token-hash=hBayGfOmQH3kRMdNnDe4oCZD_9fsJWSt29xXR3KRMVk%3D" alt="Nokotaro Takeda" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/23932002" alt="nenohi" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1.jpeg?token-time=2145916800&token-hash=vGe7wXGqmA8Q7m-kDNb6fyGdwk-Dxk4F-ut8ZZu51RM%3D" alt="Takashi Shibuya" width="100"></td>
</tr><tr>
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
<td><a href="https://www.patreon.com/takimura">takimura</a></td>
<td><a href="https://www.patreon.com/damillora">Damillora</a></td>
<td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td>
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
<td><a href="https://www.patreon.com/noellabo">noellabo</a></td>
<td><a href="https://www.patreon.com/Corset">CG</a></td>
<td><a href="https://www.patreon.com/hekovic">Hekovic</a></td>
<td><a href="https://www.patreon.com/spinlock">Naoki Hirayama</a></td>
</tr></table>
<table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1.jpeg?token-time=2145916800&token-hash=L55UhJ0rcuNAH3w_ryeeGN4hC6taoOixyAhraEi0bzw%3D" alt="dansup" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1.jpeg?token-time=2145916800&token-hash=d8jBQLMOHD87KtXs5C9fk1o58DMF73pQ-dYH3uZJPBE%3D" alt="Gargron" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1.png?token-time=2145916800&token-hash=hBayGfOmQH3kRMdNnDe4oCZD_9fsJWSt29xXR3KRMVk%3D" alt="Nokotaro Takeda" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1.jpeg?token-time=2145916800&token-hash=vGe7wXGqmA8Q7m-kDNb6fyGdwk-Dxk4F-ut8ZZu51RM%3D" alt="Takashi Shibuya" width="100"></td>
</tr><tr>
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
<td><a href="https://www.patreon.com/user?u=23932002">nenohi</a></td>
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
</tr></table>
**Last updated:** Tue, 04 Jun 2019 04:21:06 UTC
**Last updated:** Sun, 05 Jan 2020 05:37:07 UTC
<!-- PATREON_END -->
:four_leaf_clover: Copyright
----------------------------------------------------------------
> Copyright (c) 2014-2019 syuilo
> Copyright (c) 2014-2020 syuilo
Misskey is open-source software licensed under the [GNU AGPLv3](LICENSE).

BIN
assets/icons/512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

91
assets/icons/icon.svg Normal file
View File

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg8"
version="1.1"
viewBox="0 0 135.46667 135.46667"
height="512"
width="512"
sodipodi:docname="icon.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
inkscape:export-filename="H:\misskey\assets\icons\512.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="965"
id="namedview10"
showgrid="false"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:snap-page="true"
inkscape:zoom="0.921875"
inkscape:cx="219.9952"
inkscape:cy="361.00053"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg8" />
<defs
id="defs2" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<rect
style="opacity:1;fill:#2ba3bc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32291675;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect828"
width="135.46667"
height="135.46667"
x="1.896631e-16"
y="0" />
<g
transform="matrix(0.57430748,0,0,0.57430748,11.070705,-35.453717)"
id="layer1"
style="stroke-width:1.74122751;fill:#ffffff;fill-opacity:1">
<g
transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)"
id="g4502"
style="stroke-width:1.74122751;fill:#ffffff;fill-opacity:1">
<g
id="g5125"
transform="translate(-1.3333333e-6,-1.3439941e-6)"
style="fill:#ffffff;fill-opacity:1;stroke-width:1.74122751">
<g
aria-label="Mi"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.50409585px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="text4489"
transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)">
<path
id="path5210"
transform="matrix(0.26412464,0,0,0.26412464,24.988264,136.28626)"
d="m 62.474609,76.585938 c -7.47555,0 -14.595784,1.246427 -21.359375,3.738281 C 29.011968,84.595952 19.044417,92.249798 11.212891,103.28516 3.7373405,113.96451 0,125.88934 0,139.06055 v 233.8789 c 0,17.08697 6.0510264,31.85913 18.154297,44.31836 12.459246,12.10327 27.233346,18.15625 44.320312,18.15625 17.442947,0 32.215089,-6.05298 44.318361,-18.15625 12.45925,-12.45923 18.68945,-27.23139 18.68945,-44.31836 V 330.4082 c 0.13441,-9.21122 9.6225,-6.79429 14.41797,0 8.98111,15.55395 28.02226,28.91242 50.19141,28.83594 22.16915,-0.0764 40.58194,-11.03699 50.19336,-28.83594 3.63981,-4.29263 13.89902,-11.60675 14.95117,0 v 42.53125 c 0,17.08697 6.05102,31.85913 18.15429,44.31836 12.45923,12.10327 27.23335,18.15625 44.32032,18.15625 17.44294,0 32.21509,-6.05298 44.31836,-18.15625 12.45923,-12.45923 18.68945,-27.23139 18.68945,-44.31836 v -233.8789 c 0,-13.17121 -3.9146,-25.09604 -11.74609,-35.77539 -7.47557,-11.035362 -17.26588,-18.689208 -29.36914,-22.960941 -7.11956,-2.491854 -14.23982,-3.738281 -21.35938,-3.738281 -19.22286,0 -35.41865,7.476649 -48.58984,22.427734 l -63.40235,74.199218 c -1.42391,1.06791 -6.14093,9.23242 -16.16015,9.23242 -10.01923,0 -14.20109,-8.16451 -15.625,-9.23242 L 110.53125,99.013672 C 97.716024,84.062587 81.697447,76.585938 62.474609,76.585938 Z m 395.060551,0 c -14.9511,-10e-7 -27.76596,5.340179 -38.44532,16.019531 -10.32338,10.323381 -15.48437,22.961011 -15.48437,37.912111 0,14.9511 5.16099,27.76596 15.48437,38.44531 10.67936,10.32338 23.49422,15.48633 38.44532,15.48633 14.95109,0 27.76596,-5.16295 38.44531,-15.48633 C 506.65982,158.28354 512,145.46868 512,130.51758 512,115.56648 506.65982,102.92885 495.98047,92.605469 485.30112,81.926117 472.48625,76.585938 457.53516,76.585938 Z m 0.5332,118.541012 c -14.9511,0 -27.76596,5.34018 -38.44531,16.01953 -10.67936,10.67936 -16.01758,23.49422 -16.01758,38.44532 v 131.89062 c 0,14.9511 5.33822,27.76596 16.01758,38.44531 10.67935,10.32339 23.49421,15.48633 38.44531,15.48633 14.9511,0 27.58873,-5.16294 37.91211,-15.48633 C 506.65982,409.24838 512,396.43352 512,381.48242 V 249.5918 c 0,-14.9511 -5.34018,-27.76596 -16.01953,-38.44532 -10.32338,-10.67935 -22.96101,-16.01953 -37.91211,-16.01953 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:1.90855289px"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 148 KiB

View File

@ -68,7 +68,7 @@ Build misskey with the following:
*5.* Init DB
----------------------------------------------------------------
``` shell
docker-compose run --rm web npm run init
docker-compose run --rm web yarn run init
```
*6.* That is it.

View File

@ -68,7 +68,7 @@ cp docker_example.env docker.env
*5.* データベースを初期化
----------------------------------------------------------------
``` shell
docker-compose run --rm web npm run init
docker-compose run --rm web yarn run init
```
*6.* 以上です!

View File

@ -1,7 +1,7 @@
# Sample nginx configuration for Misskey
#
# 1. Replace example.tld to your domain
# 2. Copy to /etc/nginx/sites-available/ and then symlink from /etc/nginx/sites-ebabled/
# 2. Copy to /etc/nginx/sites-available/ and then symlink from /etc/nginx/sites-enabled/
# or copy to /etc/nginx/conf.d/
# For WebSocket
@ -25,10 +25,9 @@ server {
}
server {
listen 443 http2;
listen [::]:443 http2;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.tld;
ssl on;
ssl_session_cache shared:ssl_session_cache:10m;
# To use Let's Encrypt certificate

View File

@ -27,6 +27,7 @@ Please install and setup these softwares:
* **[Redis](https://redis.io/)**
##### Optional
* [Yarn](https://yarnpkg.com/) *Optional but recommended for security reason. If you won't install it, use `npx yarn` instead of `yarn`.*
* [Elasticsearch](https://www.elastic.co/) - required to enable the search feature
* [FFmpeg](https://www.ffmpeg.org/)
@ -50,7 +51,7 @@ Please install and setup these softwares:
5. Install misskey dependencies.
`npm install`
`yarn`
*4.* Configure Misskey
----------------------------------------------------------------
@ -65,21 +66,20 @@ Please install and setup these softwares:
Build misskey with the following:
`NODE_ENV=production npm run build`
`NODE_ENV=production yarn build`
If you're on Debian, you will need to install the `build-essential`, `python` package.
If you're still encountering errors about some modules, use node-gyp:
1. `npm install -g node-gyp`
2. `node-gyp configure`
3. `node-gyp build`
4. `NODE_ENV=production npm run build`
1. `npx node-gyp configure`
2. `npx node-gyp build`
3. `NODE_ENV=production yarn build`
*6.* Init DB
----------------------------------------------------------------
``` shell
npm run init
yarn run init
```
*7.* That is it.
@ -130,12 +130,16 @@ You can check if the service is running with `systemctl status misskey`.
### How to update your Misskey server to the latest version
1. `git checkout master`
2. `git pull`
3. `npm install`
4. `NODE_ENV=production npm run build`
5. Check [ChangeLog](../CHANGELOG.md) for migration information
3. `yarn install`
4. `NODE_ENV=production yarn build`
5. `yarn migrate`
6. Restart your Misskey process to apply changes
7. Enjoy
If you encounter any problems with updating, please try the following:
1. `yarn clean` or `yarn cleanall`
2. Retry update (Don't forget `yarn install`
----------------------------------------------------------------
If you have any questions or troubles, feel free to contact us!

View File

@ -27,7 +27,8 @@ Installez les paquets suivants :
* **[Redis](https://redis.io/)**
##### Optionnels
* [Elasticsearch](https://www.elastic.co/) - requis pour pouvoir activer la fonctionnalité de recherche
* [Yarn](https://yarnpkg.com/) - *recommander pour des raisons de sécurité. Si vous ne l'installez pas, utilisez `npx yarn` au lieu de` yarn`.*
* [Elasticsearch](https://www.elastic.co/) - *requis pour pouvoir activer la fonctionnalité de recherche.*
* [FFmpeg](https://www.ffmpeg.org/)
*3.* Installation de Misskey
@ -50,7 +51,7 @@ Installez les paquets suivants :
5. Installez les dépendances de misskey.
`npm install`
`yarn install`
*4.* Création du fichier de configuration
----------------------------------------------------------------
@ -65,23 +66,22 @@ Installez les paquets suivants :
Construisez Misskey comme ceci :
`NODE_ENV=production npm run build`
`NODE_ENV=production yarn build`
Si vous êtes sous Debian, vous serez amené à installer les paquets `build-essential` et `python`.
Si vous rencontrez des erreurs concernant certains modules, utilisez node-gyp:
1. `npm install -g node-gyp`
2. `node-gyp configure`
3. `node-gyp build`
4. `NODE_ENV=production npm run build`
1. `npx node-gyp configure`
2. `npx node-gyp build`
3. `NODE_ENV=production yarn build`
*6.* C'est tout.
----------------------------------------------------------------
Excellent ! Maintenant, vous avez un environnement prêt pour lancer Misskey
### Lancement conventionnel
Lancez tout simplement `NODE_ENV=production npm start`. Bonne chance et amusez-vous bien !
Lancez tout simplement `NODE_ENV=production yarn start`. Bonne chance et amusez-vous bien !
### Démarrage avec systemd
@ -124,9 +124,9 @@ Vous pouvez vérifier si le service a démarré en utilisant la commande `system
### Méthode de mise à jour vers la plus récente version de Misskey
1. `git checkout master`
2. `git pull`
3. `npm install`
4. `NODE_ENV=production npm run build`
5. Consultez [ChangeLog](../CHANGELOG.md) pour les information de migration.
3. `yarn install`
4. `NODE_ENV=production yarn build`
5. `yarn migrate`
----------------------------------------------------------------

View File

@ -27,6 +27,8 @@ adduser --disabled-password --disabled-login misskey
* **[Redis](https://redis.io/)**
##### オプション
* [Yarn](https://yarnpkg.com/)
* セキュリティの観点から推奨されます。 yarn をインストールしない方針の場合は、文章中の `yarn` を適宜 `npx yarn` と読み替えてください。
* [Elasticsearch](https://www.elastic.co/)
* 検索機能を有効にするためにはインストールが必要です。
* [FFmpeg](https://www.ffmpeg.org/)
@ -51,7 +53,7 @@ adduser --disabled-password --disabled-login misskey
5. Misskeyの依存パッケージをインストール
`npm install`
`yarn install`
*4.* 設定ファイルを作成する
----------------------------------------------------------------
@ -66,20 +68,19 @@ adduser --disabled-password --disabled-login misskey
次のコマンドでMisskeyをビルドしてください:
`NODE_ENV=production npm run build`
`NODE_ENV=production yarn build`
Debianをお使いであれば、`build-essential`パッケージをインストールする必要があります。
何らかのモジュールでエラーが発生する場合はnode-gypを使ってください:
1. `npm install -g node-gyp`
2. `node-gyp configure`
3. `node-gyp build`
4. `NODE_ENV=production npm run build`
1. `npx node-gyp configure`
2. `npx node-gyp build`
3. `NODE_ENV=production yarn build`
*6.* データベースを初期化
----------------------------------------------------------------
``` shell
npm run init
yarn run init
```
*7.* 以上です!
@ -87,7 +88,7 @@ npm run init
お疲れ様でした。これでMisskeyを動かす準備は整いました。
### 通常起動
`NODE_ENV=production npm start`するだけです。GLHF!
`NODE_ENV=production yarn start`するだけです。GLHF!
### systemdを用いた起動
1. systemdサービスのファイルを作成
@ -120,7 +121,7 @@ npm run init
3. systemdを再読み込みしmisskeyサービスを有効化
`systemctl daemon-reload ; systemctl enable misskey`
`systemctl daemon-reload; systemctl enable misskey`
4. misskeyサービスの起動
@ -131,11 +132,11 @@ npm run init
### Misskeyを最新バージョンにアップデートする方法:
1. `git checkout master`
2. `git pull`
3. `npm install`
4. `NODE_ENV=production npm run build`
5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
3. `yarn install`
4. `NODE_ENV=production yarn build`
5. `yarn migrate`
なにか問題が発生した場合は、`npm run clean`または`npm run cleanall`すると直る場合があります。
なにか問題が発生した場合は、`yarn clean`または`yarn cleanall`すると直る場合があります。
----------------------------------------------------------------

View File

@ -3,28 +3,22 @@
*/
import * as gulp from 'gulp';
import * as gutil from 'gulp-util';
import * as ts from 'gulp-typescript';
const sourcemaps = require('gulp-sourcemaps');
import tslint from 'gulp-tslint';
const cssnano = require('gulp-cssnano');
const stylus = require('gulp-stylus');
import * as uglifyComposer from 'gulp-uglify/composer';
import * as rimraf from 'rimraf';
import chalk from 'chalk';
const imagemin = require('gulp-imagemin');
import * as chalk from 'chalk';
import * as rename from 'gulp-rename';
import * as mocha from 'gulp-mocha';
import * as replace from 'gulp-replace';
const uglifyes = require('uglify-es');
const cleanCSS = require('gulp-clean-css');
const terser = require('gulp-terser');
const locales = require('./locales');
const uglify = uglifyComposer(uglifyes, console);
const env = process.env.NODE_ENV || 'development';
const isProduction = env === 'production';
const isDebug = !isProduction;
const isDebug = env !== 'production';
if (isDebug) {
console.warn(chalk.yellow.bold('WARNING! NODE_ENV is not "production".'));
@ -47,9 +41,14 @@ gulp.task('build:copy:views', () =>
gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
);
gulp.task('build:copy', gulp.parallel('build:copy:views', () =>
gulp.task('build:copy:fonts', () =>
gulp.src('./node_modules/three/examples/fonts/**/*').pipe(gulp.dest('./built/client/assets/fonts/'))
);
gulp.task('build:copy', gulp.parallel('build:copy:views', 'build:copy:fonts', () =>
gulp.src([
'./src/const.json',
'./src/emojilist.json',
'./src/server/web/views/**/*',
'./src/**/assets/**/*',
'!./src/client/app/**/assets/**/*'
@ -92,22 +91,20 @@ gulp.task('cleanall', gulp.parallel('clean', cb =>
));
gulp.task('build:client:script', () => {
const client = require('./built/client/meta.json');
const client = require('./built/meta.json');
return gulp.src(['./src/client/app/boot.js', './src/client/app/safe.js'])
.pipe(replace('VERSION', JSON.stringify(client.version)))
.pipe(replace('ENV', JSON.stringify(env)))
.pipe(replace('LANGS', JSON.stringify(Object.keys(locales))))
.pipe(isProduction ? uglify({
.pipe(terser({
toplevel: true
} as any) : gutil.noop())
}))
.pipe(gulp.dest('./built/client/assets/'));
});
gulp.task('build:client:styles', () =>
gulp.src('./src/client/app/init.css')
.pipe(isProduction
? (cssnano as any)()
: gutil.noop())
.pipe(cleanCSS())
.pipe(gulp.dest('./built/client/assets/'))
);
@ -117,7 +114,6 @@ gulp.task('copy:client', () =>
'./src/client/assets/**/*',
'./src/client/app/*/assets/**/*'
])
.pipe(isProduction ? (imagemin as any)() : gutil.noop())
.pipe(rename(path => {
path.dirname = path.dirname!.replace('assets', '.');
}))
@ -127,7 +123,7 @@ gulp.task('copy:client', () =>
gulp.task('doc', () =>
gulp.src('./src/docs/**/*.styl')
.pipe(stylus())
.pipe((cssnano as any)())
.pipe(cleanCSS())
.pipe(gulp.dest('./built/docs/assets/'))
);

View File

@ -1 +1,7 @@
require('./built').default();
const fs = require('fs');
if (fs.existsSync('./built')) {
require('./built').default();
} else {
console.log('Built code is not found. Probably an error occurred during a build or you just forgot to build.');
}

View File

@ -18,9 +18,6 @@ common:
drive: "Disk"
drive-desc: "Chcete sdílet obrázek, který jste již nahráli? Chcete vaše nahrané soubory organizovat, pojmenovávat a vytvářet pro ně složky? Misskey Disk je pro vás nejlepší řešení. Je velmi snadné sdílet vaše soubory online."
outro: "Podívejte se na unikátní vlastnosti Misskey vlastníma očima! Pokud si myslíte, že tato instance není pro vás, zkuste jiné instance, neboť Misskey je decentralizovaná sociální síť, takže můžete snadno najít své přátele. Hodně štěstí a zábavy!"
adblock:
detected: "Prosím vypněte svůj blokovač reklam"
warning: "Některé vlastnosti mohou být nedostupné nebo mohou způsobovat chyby, pokud máte povolený blokovač reklam. <strong>Misskey nepoužívá reklamy</strong>."
application-authorization: "Autorizované aplikace"
close: "Zavřít"
do-not-copy-paste: "Prosím nezadávejte ani nevkládejte sem kód. Váš účet může být kompromitován."
@ -34,6 +31,20 @@ common:
signup: "Registrovat"
signout: "Odhlásit"
reload-to-apply-the-setting: "Pro uplatnění tohoto nastavení musíte znovu načíst tuto stránku. Chcete ji načíst teď?"
fetching-as-ap-object: "Načítám data z Fediversu..."
delete-confirm: "Opravdu chcete smazat tento příspěvek?"
signin-required: "Přihlašte se, prosím"
notification-type: "Typy oznámení"
notification-types:
all: "Všechny"
pollVote: "Hlasy"
follow: "Sledovaní"
receiveFollowRequest: "Žádost o sledování"
reply: "Odpovědi"
quote: "Citace"
renote: "Renotovat"
mention: "Zmínky"
reaction: "Reakce"
got-it: "Rozumím!"
customization-tips:
title: "Tipy pro přizpůsobení"
@ -89,18 +100,40 @@ common:
"read:notifications": "Prohlížet oznámení"
"write:notifications": "Pracovat s oznámeními"
"read:reactions": "Prohlížet reakce"
"write:reactions": "Narabět s reakcemi"
"write:votes": "Hlasovat"
"read:pages": "Zhlédnutí stránky"
"write:pages": "Upravit stránky"
"write:user-groups": "Upravit uživatelskou skupinu"
empty-timeline-info:
follow-users-to-make-your-timeline: "Poznámky sledujících se zobrazí ve vaší časové ose"
explore: "Najít uživatele"
post-form:
attach-location-information: "Přidat informace o lokaci"
hide-contents: "Schovat obsah"
reply-placeholder: "Odpovědět na tento příspěvek"
quote-placeholder: "Citovat tento příspěvek"
quote-attached: "Přiložit citaci"
submit: "Odeslat"
reply: "Odpovědět"
renote: "Renotovat"
posting: "Posílání"
attach-media-from-local: "Nahrát soubor z vašeho zařízení"
attach-media-from-drive: "Přiložit soubory z vašeho Drivu"
insert-a-kao: "v('ω')v"
create-poll: "Vytvořit anketu"
text-remain: "zbývá ještě {} znaků"
recent-tags: "Nejnovější"
local-only-message: "Publikovat zprávu pouze lokálně"
click-to-tagging: "Klikni pro otágování"
visibility: "Viditelnost"
geolocation-alert: "Vaše zařízení nedalo k dispozici lokaci"
error: "Chyba"
enter-username: "Zadejte své uživatelské jméno"
specified-recipient: "Pro"
add-visible-user: "Přidat uživatele"
username-prompt: "Zadejte své uživatelské jméno"
enter-file-name: "Upravit název souboru"
weekday-short:
sunday: "Ne"
monday: "Po"
@ -160,6 +193,7 @@ common:
other: "Ostatní"
appearance: "Vzhled"
behavior: "Chování"
reactions: "Reakce"
fetch-on-scroll: "Nekonečné načítaní posuvem"
fetch-on-scroll-desc: "Pokud budete rolovat dolů po stránce, automaticky bude načten další obsah."
note-visibility: "Viditelnost příspěvku"
@ -167,6 +201,9 @@ common:
remember-note-visibility: "Zapamatovat viditelnost příspěvků"
web-search-engine: "Webové vyhledávače"
web-search-engine-desc: "Například: https://www.google.com/?#q={{query}}"
paste: "Vložit"
pasted-file-name-desc: "Například: \"rrrr-MM-dd HH-mm-ss [{{number}}]\" → \"2018-03-20 21-30-24 1\""
paste-dialog: "Upravit název vloženého souboru"
keep-cw: "Zachovat varování o obsahu"
keep-cw-desc: "Při odpovědi na příspěvek bude varování o obsahu nastaveno stejně jako původní příspěvek."
i-like-sushi: "Mam radši sushi (než puding)"
@ -204,7 +241,7 @@ common:
deck-column-width-wide: "Široké"
use-shadow: "Používat v rozhraní stíny"
rounded-corners: "Zakulatit rohy v rozhraní"
circle-icons: "Používat kulaté ikony"
circle-icons: "Používat kulaté avatary"
contrasted-acct: "Přidat uživatelskému účtu kontrast"
wallpaper: "Obrázek na pozadí"
choose-wallpaper: "Zvolit pozadí"
@ -249,6 +286,19 @@ common:
disable-via-mobile: "Neoznačovat příspěvky jako „z mobilu“"
load-raw-images: "Zobrazovat obrázky v původní kvalitě"
load-remote-media: "Zobrazovat média ze vzdáleného serveru"
sync: "Synchronizace"
save: "Uložit"
saved: "Uloženo"
preview: "Náhled"
room: "Místnost"
_room:
graphicsQuality: "Kvalita grafiky"
_graphicsQuality:
ultra: "Nejvyšší"
high: "Vysoká"
medium: "Střední"
low: "Nízká"
cheep: "Nejnižší"
search: "Hledání"
delete: "Odstranit"
loading: "Načítám..."
@ -316,7 +366,10 @@ auth/views/form.vue:
accept: "Povolit přístup"
auth/views/index.vue:
loading: "Načítám..."
denied-paragraph: "Tato aplikace nebude mít přístup k Vašemu účtu."
already-authorized: "Tato aplikace byla již autorizována."
callback-url: "Zpátky do aplikace."
please-go-back: "Prosím vraťte se zpátky do aplikace."
error: "Taková relace neexistuje."
sign-in: "Prosím přihlaste se."
common/views/pages/explore.vue:
@ -338,13 +391,16 @@ common/views/components/games/reversi/reversi.vue:
cancel: "Zrušit"
common/views/components/games/reversi/reversi.game.vue:
surrender: "Vzdát se"
surrendered: "Vzdaním se"
looped-map: "Zacyklená mapa"
can-put-everywhere: "Lze položit kamkoliv"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "Hrajte Reversi s Vašimi kamarády!"
invite: "Pozvat"
rule: "Jak hrát"
mode-invite: "Pozvat"
invitations: "Jste pozvaní ke hře!"
my-games: "Moje hra"
all-games: "Všechny hry"
enter-username: "Zadejte své uživatelské jméno"
@ -366,20 +422,29 @@ common/views/components/games/reversi/reversi.room.vue:
waiting-for-both: "Připravuji"
cancel: "Zrušit"
ready: "Připraveno"
cancel-ready: "Pokračovat v přípravě"
common/views/components/connect-failed.vue:
title: "Nelze se připojit k serveru"
description: "Nastal problém s Vaším připojením k internetu, nebo server není dostupný nebo zrovna probíhá údržba. Prosím {zkuste to znova} za pár minut."
thanks: "Děkujeme že jste použili Misskey."
troubleshoot: "Odstranění problémů"
common/views/components/connect-failed.troubleshooter.vue:
title: "Poradce při potížích"
network: "Síťové připojení"
checking-network: "Prověřit síťové připojení"
internet: "Připojení k internetu"
checking-internet: "Ověřuji připojení k internetu."
server: "Připojení k serveru"
checking-server: "Spojuji se se serverem"
finding: "Vyšetřování problému"
no-network: "Žádné připojení k síti"
no-network-desc: "Ujistěte se že jste připojeni k Internetu."
no-internet: "Nejste připojeni k internetu"
no-internet-desc: "Jste připojen k síti, ale zdá se že stále chybí připojení k Internetu. Prosím zkontrolujte Vaše připojení k Internetu."
no-server: "Nelze se připojit k serveru Misskey"
success: "Úspěšně se podařilo spojit s Misskey serverem"
flush: "Vyčistit mezipaměť"
set-version: "Vyberte verzi"
common/views/components/media-banner.vue:
sensitive: "Choulostivý obsah"
click-to-show: "Klikněte pro zobrazení"
@ -403,8 +468,10 @@ common/views/components/theme.vue:
find-more-theme: "Najít další vzhledy"
theme-name: "Jméno vzhledu"
preview-created-theme: "Náhled"
invalid-theme: "Vzhled není validní"
already-installed: "Tento vzhled je již nainstalován."
saved: "Uloženo"
manage-themes: "Správa vzhledů"
builtin-themes: "Standardní vzhledy"
my-themes: "Moje vzhledy"
installed-themes: "Nainstalované vzhledy"
@ -415,6 +482,7 @@ common/views/components/theme.vue:
desc: "Popis"
export: "Exportovat"
import: "Importovat"
import-by-code: "nebo zkopírujte kód"
theme-name-required: "Jméno vzhledu je povinné"
common/views/components/cw-button.vue:
hide: "Skrýt"
@ -427,9 +495,14 @@ common/views/components/messaging.vue:
you: "Vy"
no-history: "Žádná historie"
user: "Uživatel"
group: "Skupina"
start-with-user: "Zahájit konverzaci s uživatelem"
start-with-group: "Zahájit skupinovou konverzaci"
select-group: "Vybrat skupinu"
common/views/components/messaging-room.vue:
new-message: "Máte novou zprávu"
common/views/components/messaging-room.form.vue:
input-message-here: "Sem zadejte zprávu"
send: "Odeslat"
attach-from-local: "Přiložit soubory z Vašeho zařízení"
common/views/components/messaging-room.message.vue:
@ -444,6 +517,7 @@ common/views/components/nav.vue:
repository: "Úložiště"
develop: "Vývojáři"
feedback: "Zpětná vazba"
tos: "Podmínky užívání"
common/views/components/note-menu.vue:
mention: "Zmínění"
detail: "Více"
@ -457,6 +531,7 @@ common/views/components/note-menu.vue:
unpin: "Odepnout"
delete: "Odstranit"
delete-confirm: "Opravdu chcete smazat tento příspěvek?"
delete-and-edit: "Smazat a upravit"
remote: "Ukázat originální poznámku"
common/views/components/user-menu.vue:
mention: "Zmínění"
@ -487,17 +562,22 @@ common/views/components/poll-editor.vue:
remove: "Odstranit tuto možnost"
add: "+ Přidat možnost"
destroy: "Zahodit dotazník"
multiple: "Více odpovědí je povoleno"
expiration: "Termín"
infinite: "Nekonečne"
at: "Výběr data a času"
no-more: "Více už přidat nemůžete"
deadline-date: "Termín ukončení"
deadline-time: "Doba trvání"
interval: "Trvání"
unit: "Jednotka"
second: "Sekunda"
minute: "Minuta"
hour: "Hodina"
day: "Ne"
common/views/components/reaction-picker.vue:
choose-reaction: "Vyberte svoji reakci"
input-reaction-placeholder: "nebo vložte Emoji"
common/views/components/emoji-picker.vue:
custom-emoji: "Emoji"
people: "Lidé"
@ -508,15 +588,25 @@ common/views/components/emoji-picker.vue:
objects: "Objekty"
symbols: "Symboly"
flags: "Vlajky"
common/views/components/settings/app-type.vue:
title: "Režim"
intro: "Můžete vybrat zdali chcete použít stolní, nebo mobilní vzhled."
choices:
auto: "Vybrat vzhled automaticky"
desktop: "Vždy použít stolní vzhled"
mobile: "Vždy použít mobilní vzhled"
info: "Pro aktivování změn musíte znovu načíst stránky."
common/views/components/signin.vue:
username: "Přezdívka"
password: "Heslo"
token: "Token"
signing-in: "Přihlašování..."
or: "Nebo"
signin-with-twitter: "Přihlásit se pomocí účtu Twitter"
signin-with-github: "Přihlásit se pomocí účtu GitHub"
signin-with-discord: "Přihlásit se pomocí účtu Discord"
login-failed: "Nelze se přihlásit. Zkontrolujte prosím své uživatelské jméno a heslo."
enter-2fa-code: "Vložte Váš verifikační kód"
common/views/components/signup.vue:
invitation-code: "Kód pozvánky"
invitation-info: "Pokud máte pozvánku, prosím kontaktujte <a href=\"{}\">administrátora</a>."
@ -538,6 +628,8 @@ common/views/components/signup.vue:
password-matched: "OK"
password-not-matched: "Neshodují se"
recaptcha: "Potvrzení"
agree-to: "Souhlasím s {0}."
tos: "Podmínky užívání"
create: "Vytvořit účet"
some-error: "Pokus o vytvoření účtu selhal. Prosím zkuste to znovu."
common/views/components/special-message.vue:
@ -553,8 +645,10 @@ common/views/components/notification-settings.vue:
mark-as-read-all-unread-notes: "Označit všechny příspěvky za přečtené"
mark-as-read-all-talk-messages: "Označit všechny zprávy za přečtené"
common/views/components/integration-settings.vue:
title: "Integrace"
connect: "Připojit"
disconnect: "Odpojit"
connected-to: "Jste připojen k tomuto GitHub účtu"
common/views/components/github-setting.vue:
description: "Jakmile spojíte Váš GitHub účet s Vaším Misskey účtem, uvidíte informace o Vašem GitHub účtu na Vašem profilu a budete se moci přihlásit skrze GitHub."
connected-to: "Je připojen k tomuto GitHub účtu"
@ -574,8 +668,11 @@ common/views/components/uploader.vue:
common/views/components/visibility-chooser.vue:
public: "Veřejné"
home: "Domů"
home-desc: "Poslat pouze na domovskou časovou osu"
specified: "Přímá"
specified-desc: "Poslat pouze zmíněným uživatelům"
local-public: "Veřejná (pouze místní)"
local-public-desc: "Nepublikovat na vzdálených serverech"
local-home: "Domovská (pouze místní)"
local-followers: "Pro sledující (pouze místní)"
common/views/components/trends.vue:
@ -585,6 +682,8 @@ common/views/components/language-settings.vue:
title: "Zobrazit jazyky"
pick-language: "Zvolte jazyk"
recommended: "Doporučené"
auto: "Automaticky"
specify-language: "Vyberte jazyk"
info: "Pro aktivování změn musíte znovu načíst stránky."
common/views/components/profile-editor.vue:
title: "Profil"
@ -605,12 +704,14 @@ common/views/components/profile-editor.vue:
saved: "Profil byl úspěšně aktualizován"
uploading: "Nahrávám"
upload-failed: "Nahrávání selhalo"
unable-to-process: "Operace nemohla být dokončena."
email: "Nastavení e-mailů"
email-address: "Emailová adresa"
email-verified: "Váš e-mail byl ověřen"
email-not-verified: "Váš email není potvrzen. Prosím zkontrolujte si svou schránku."
export: "Exportovat"
import: "Importovat"
export-and-import: "Import / Export"
export-targets:
following-list: "Seznam sledujících"
mute-list: "Seznam ztlumených uživatelů"
@ -620,6 +721,9 @@ common/views/components/profile-editor.vue:
danger-zone: "Nebezpečná zóna"
delete-account: "Smazat účet"
account-deleted: "Váš účet byl smazán. Může chvilku trvat než zmizí všechna data."
profile-metadata: "Metadata profilu"
metadata-label: "Popis"
metadata-content: "Obsah"
common/views/components/user-list-editor.vue:
users: "Uživatel"
rename: "Přejmenovat seznam"
@ -630,20 +734,34 @@ common/views/components/user-list-editor.vue:
add-user: "Přidat uživatele"
common/views/components/user-group-editor.vue:
users: "Členové"
rename: "Přejmenovat skupinu"
delete: "Odstranit skupinu"
transfer: "Přesunout skupinu"
transfer-are-you-sure: "Jste si jistí že chcete přidat @$2 do skupiny: $1?"
transferred: "Skupina přesunuta"
remove-user: "Odebrat uživatele z této skupiny"
delete-are-you-sure: "Jste si jistí že chcete smazat skupinu \"$1\"?"
deleted: "Smazáno"
invite: "Pozvat"
invited: "Pozvánka byla úspěšně odeslána"
common/views/components/user-lists.vue:
user-lists: "Seznamy"
create-list: "Vytvořit seznam"
list-name: "Název seznamu"
common/views/components/user-groups.vue:
user-groups: "Skupiny"
create-group: "Vytvořit skupinu"
group-name: "Název skupiny"
owned-groups: "Moje skupiny"
invites: "Pozvat"
accept-invite: "Přidat se"
reject-invite: "Odmítnout"
common/views/widgets/broadcast.vue:
fetching: "Načítám"
no-broadcasts: "Žádná nová oznámení"
have-a-nice-day: "Přejeme Vám příjemný den!"
next: "Další"
prev: "Předchozí"
common/views/widgets/calendar.vue:
year: "Rok {}"
month: "{},"
@ -652,6 +770,7 @@ common/views/widgets/calendar.vue:
this-month: "Měsíc:"
this-year: "Rok:"
common/views/widgets/photo-stream.vue:
title: "Foto stream"
no-photos: "Žádné obrázky"
common/views/widgets/posts-monitor.vue:
title: "Grafy příspěvků"
@ -667,6 +786,8 @@ common/views/widgets/memo.vue:
save: "Uložit"
common/views/widgets/slideshow.vue:
no-image: "V této složce nebyly nalezeny žádné fotky."
common/views/widgets/tips.vue:
tips-line23: "Ai-chan kawaii!"
common/views/pages/not-found.vue:
page-not-found: "Stránka nenalezena"
common/views/pages/follow.vue:
@ -681,6 +802,7 @@ desktop:
avatar: "Avatar"
uploading-avatar: "Nahrál nový avatar"
avatar-updated: "Vaše avatar byl aktualizován"
unable-to-process: "Operace nemohla být dokončena."
invalid-filetype: "Tento formát souboru není podporován"
desktop/views/components/activity.chart.vue:
total: "Černá ... Celkem"
@ -717,7 +839,7 @@ desktop/views/components/drive.file.vue:
rename: "Přejmenovat"
copy-url: "Kopírovat URL"
download: "Stáhnout"
else-files: "Více..."
else-files: "Ostatní"
set-as-avatar: "Nastavit jako avatar"
set-as-banner: "Nastavit jako baner"
open-in-app: "Otevřít v aplikaci"
@ -735,7 +857,9 @@ desktop/views/components/drive.folder.vue:
rename: "Přejmenovat"
rename-folder: "Přejmenovat složku"
input-new-folder-name: "Zadejte nové jméno"
else-folders: "Ostatní"
desktop/views/components/drive.vue:
search: "Vyhledávání"
empty-drive-description: "Klikněte pravým tlačítkem myši pro otevření menu, nebo sem přetáhněte soubor pro nahrání."
empty-folder: "Tato složka je prázdná"
unable-to-process: "Operace nemohla být dokončena."
@ -751,10 +875,13 @@ desktop/views/components/drive.vue:
url-upload: "Nahrát z URL"
desktop/views/components/media-video.vue:
click-to-show: "Klikněte pro zobrazení"
desktop/views/components/followers.vue:
empty: "Vypadá to že Vás nikdo nesleduje."
desktop/views/components/game-window.vue:
game: "Reversi"
desktop/views/components/home.vue:
done: "Hotovo"
add-widget: "Přidat widget:"
add: "Přidat"
desktop/views/input-dialog.vue:
cancel: "Zrušit"
@ -762,6 +889,7 @@ desktop/views/input-dialog.vue:
desktop/views/components/note-detail.vue:
private: "Tento příspěvek je soukromý"
deleted: "Tento příspěvek byl odstraněn"
location: "Lokace"
renote: "Renotovat"
add-reaction: "Přidat reakci"
undo-reaction: "Odebrat reakci"
@ -776,6 +904,8 @@ desktop/views/components/note.vue:
desktop/views/components/notes.vue:
error: "Načítání selhalo."
retry: "Opakovat"
desktop/views/components/notifications.vue:
empty: "Žádné nové notifikace!"
desktop/views/components/post-form.vue:
posted: "Odesláno!"
replied: "Odpověděno!"
@ -800,9 +930,29 @@ desktop/views/components/renote-form-window.vue:
desktop/views/components/settings.2fa.vue:
detail: "Více…"
url: "https://www.google.cz/landing/2step/"
register: "Přidat zařízení"
already-registered: "Toto zařízení je již připojené"
unregister: "Odebrat"
enter-password: "Prosím zadejte heslo"
authenticator: "Nejprve musíte nainstalovat Google Authenticator na Vašem zařízení:"
howtoinstall: "Jak nainstalovat"
token: "Token"
scan: "Poté naskenujte QR kód:"
done: "Prosím vložte kód zobrazený na Vašem zařízení:"
submit: "Uložit"
success: "Nastavení uloženo!"
failed: "Nepodařilo se spárovat. Prosím zkontrolujte správnost bezpečnostního kódu."
totp-header: "Ověřovací aplikace"
security-key-header: "Bezpečnostní klíč"
last-used: "Naposledy použito:"
activate-key: "Klikněte pro aktivaci bezpečnostního klíče"
security-key-name: "Název klíče"
key-unregistered: "Bezpečnostní klíč byl odstraněn"
common/views/components/media-image.vue:
sensitive: "NSFW"
click-to-show: "Klikněte pro zobrazení"
common/views/components/api-settings.vue:
caution: "Nepoužívejte tento kód v žádné jiné aplikace nebo ho sdílejte s ostatními (jinak můžete ohrozit svojí bezpečnost)."
token: "Token:"
enter-password: "Prosím zadejte heslo"
console:
@ -858,6 +1008,7 @@ desktop/views/components/ui.header.account.vue:
lists: "Seznamy"
groups: "Skupiny"
admin: "Administrace"
room: "Místnost"
desktop/views/components/ui.header.nav.vue:
game: "Hry"
desktop/views/components/ui.header.notifications.vue:
@ -883,20 +1034,48 @@ admin/views/index.vue:
announcements: "Oznámení"
queue: "Fronta úloh"
logs: "Logy"
db: "Databáze"
back-to-misskey: "Zpět na Misskey"
admin/views/db.vue:
tables: "Tabulky"
vacuum: "Vysavač"
vacuum-info: "Uklidí databázi. Neohrozí data a sníží využití disku. Tohle se děje automaticky a opakovaně."
vacuum-exclamation: "Vysavač může dočasně přetížit databázi a dočasně omezit akce uživatelů."
admin/views/dashboard.vue:
dashboard: "Kontrolní panel"
accounts: "Účty"
notes: "Poznámky"
drive: "Disk"
instances: "Instance"
this-instance: "Tato instance"
federated: "Z fedivesmíru"
admin/views/queue.vue:
title: "Ve frontě"
remove-all-jobs: "Vyčistit frontu"
jobs: "Úkoly"
queue: "Ve frontě"
domains:
inbox: "Obdržené"
db: "Databáze"
states:
active: "V procesu"
delayed: "Naplánováno"
waiting: "Ve frontě"
result-is-truncated: "Zkrácený výsledek"
admin/views/logs.vue:
logs: "Logy"
domain: "Doména"
level: "Úroveň"
levels:
all: "Vše"
info: "Informace"
success: "Podařilo se"
warning: "Varování"
error: "Chyba"
debug: "Debug"
delete-all: "Smazat vše"
admin/views/abuse.vue:
target: "Cíl"
details: "Popis"
remove-report: "Odstranit"
admin/views/instance.vue:
@ -904,17 +1083,33 @@ admin/views/instance.vue:
instance-name: "Název instance"
instance-description: "Popis instance"
host: "Hostitel"
icon-url: "URL ikonky"
logo-url: "URL loga"
banner-url: "URL pro baner"
error-image-url: "URL pro chybový obrázek"
languages: "Jazyk této instance"
languages-desc: "Můžete nastavit více než jeden, oddělte mezerami."
tos-url: "URL pro smluvní podmínky"
repository-url: "URL adresa repositáře"
feedback-url: "URL pro zpětnou vazbu"
maintainer-config: "Informace o administrátorovi"
maintainer-name: "Jméno administrátora"
maintainer-email: "Kontakt na administrátora"
advanced-config: "Další nastavení"
object-storage-base-url: "URL"
object-storage-prefix: "Předpona"
object-storage-endpoint: "Endpoint"
object-storage-region: "Region"
object-storage-port: "Port"
object-storage-access-key: "Přístupový klíč"
object-storage-secret-key: "Tajný Klíč (Secret Key)"
object-storage-use-ssl: "Použít SSL"
object-storage-s3-info-here: "zde"
mb: "V megabajtech"
recaptcha-config: "nastavení služby reCAPTCHA"
recaptcha-info: "reCAPTCHA token je povinný. Můžete jej získat na https://www.google.com/recaptcha/intro/"
enable-recaptcha: "povolit reCAPTCHA"
recaptcha-secret-key: "Tajný Klíč (Secret Key)"
recaptcha-preview: "Náhled"
twitter-integration-config: "Nastavení spojení s Twitterem"
twitter-integration-info: "The callback URL is set on {url}."
@ -939,6 +1134,7 @@ admin/views/instance.vue:
smtp-auth: "Provést SMTP autentikaci"
smtp-user: "SMTP uživatel"
smtp-pass: "SMTP heslo"
test-email: "Test"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "Povolit ServiceWorker"
vapid-publickey: "VAPID veřejný klíč"
@ -986,6 +1182,8 @@ admin/views/users.vue:
reset-password-confirm: "Opravdu chcete resetovat Vaše heslo?"
password-updated: "Heslo je nyní \"{password}\""
update-remote-user: "Aktualizovat informace o vzdáleném účtu"
username: "Přezdívka"
host: "Hostitel"
users:
title: "Uživatel"
state:
@ -1002,6 +1200,11 @@ admin/views/users.vue:
admin/views/moderators.vue:
add-moderator:
title: "Vytvořit moderátora"
logs:
title: "Logy"
moderator: "Moderátoři"
type: "Operace"
info: "Informace"
admin/views/emoji.vue:
add-emoji:
title: "Přidat emoji"
@ -1105,6 +1308,9 @@ desktop/views/widgets/notifications.vue:
title: "Oznámení"
desktop/views/widgets/polls.vue:
title: "Ankety"
nothing: "Žádné nové notifikace!"
desktop/views/widgets/trends.vue:
nothing: "Žádné nové notifikace!"
desktop/views/widgets/users.vue:
title: "Doporučení uživatelé"
mobile/views/components/drive.vue:
@ -1147,6 +1353,8 @@ mobile/views/components/note-sub.vue:
admin: "admin"
bot: "bot"
cat: "kočka"
mobile/views/components/notifications.vue:
empty: "Žádné nové notifikace!"
mobile/views/components/sub-note-content.vue:
private: "Tento příspěvek je soukromý"
deleted: "Tento příspěvek byl odstraněn"
@ -1190,9 +1398,12 @@ mobile/views/pages/note.vue:
mobile/views/pages/games/reversi.vue:
reversi: "Reversi"
mobile/views/pages/search.vue:
search: "Vyhledávání"
not-found: "Pro '{q}' nebyly nalezeny žádné příspěvky."
mobile/views/pages/selectdrive.vue:
select-file: "Vybrat soubory"
mobile/views/pages/notifications.vue:
notifications: "Oznámení"
mobile/views/pages/user/home.vue:
activity: "Aktivita"
frequently-replied-users: "Častá zmínění"
@ -1216,6 +1427,8 @@ deck/deck.user-column.vue:
dev/views/new-app.vue:
app-name-desc: "Jméno vaší aplikace"
pages:
pin-this-page: "Připnout"
unpin-this-page: "Odepnout"
like: "Lajk"
title: "Titulek"
blocks:
@ -1237,6 +1450,8 @@ pages:
_action:
_dialog:
content: "Obsah"
_radioButton:
title: "Titulek"
script:
categories:
random: "Náhodně"
@ -1253,5 +1468,14 @@ pages:
arg2: "Seznamy"
_pick:
arg1: "Seznamy"
_listLen:
arg1: "Seznamy"
types:
array: "Seznamy"
room:
translate: "Přesunout"
save: "Uložit"
saved: "Uloženo"
furnitures:
moon: "Měsíc"
bin: "Koš"

View File

@ -18,9 +18,6 @@ common:
drive: "Drev"
drive-desc: "Vil du poste et billede, som du tidligere har uploadet? Har du brug for at navngive filer og organisere dem i mapper, som du selv har navngivet? Så er Misskey Drev den bedste løsning for dig. Den gør det så let som ingenting at dele dine filer online."
outro: "Tjek Misskey's unikke funktioner ved at se dem med dine egne øjne. Hvis du kommer frem til, at den ene server ikke er noget for dig, så kan du prøve en anden. Misskey er et decentraliseret SNS, så du kan lettere finde frem til brugere, som du klikker med. God fornøjelse!"
adblock:
detected: "Her kan du deaktivere ad blocker."
warning: "Visse funktioner kan forsvinde eller medføre forstyrrelser, hvis ad blocking er aktiveret. <strong>Misskey kører ikke annoncer</strong>."
application-authorization: "Adgangsstyring"
close: "Luk"
do-not-copy-paste: "Undgå venligst at skrive eller klistre kode ind her. I modsat fald kan din konto blive kompromitteret."
@ -35,6 +32,13 @@ common:
signout: "Log ud"
reload-to-apply-the-setting: "Denne indstilling slår først igennem, når du har genindlæst siden. Vil du genindlæse siden nu?"
fetching-as-ap-object: "Tilladelse til sammenkobling"
delete-confirm: "Er du helt sikker på, at du vil slette denne post?"
notification-types:
all: "Alle"
follow: "Følger"
reply: "Svar"
renote: "Gen-postering"
reaction: "Reaktion"
got-it: "Det er OK"
customization-tips:
title: "Tips om tilpasning"
@ -162,6 +166,7 @@ common:
other: "Andet"
appearance: "Udseende"
behavior: "Opførsel"
reactions: "Reaktion"
fetch-on-scroll: "Uendeligt scroll"
fetch-on-scroll-desc: "Når du scroller ned ad siden, hentes der automatisk nyt indhold ind"
note-visibility: "Post synlighed"
@ -206,7 +211,7 @@ common:
deck-column-width-wide: "Bred"
use-shadow: "Vis skygger"
rounded-corners: "Vis afrundede hjørner"
circle-icons: "Anvend cykliske ikoner"
circle-icons: "Anvend cykliske avatar"
contrasted-acct: "Tilføj kontrast til brugerkontoen"
wallpaper: "Baggrundsbillede"
choose-wallpaper: "Vælg en baggrund"
@ -251,6 +256,9 @@ common:
disable-via-mobile: "Marker aldrig posten som \"fra mobil\""
load-raw-images: "Vis vedhæftede bilag i original kvalitet"
load-remote-media: "Vis medie-materiale fra en ekstern server"
save: "Gem"
saved: "Gemt"
preview: "Før-visning"
search: "Søg"
delete: "Slet"
loading: "Henter"
@ -568,6 +576,8 @@ common/views/components/emoji-picker.vue:
objects: "Objekt"
symbols: "Symboler"
flags: "Flag"
common/views/components/settings/app-type.vue:
info: "Du er nødt til at genindlæse siden, før ændringerne slår igennem."
common/views/components/signin.vue:
username: "Brugernavn"
password: "Adgangskode"
@ -669,7 +679,7 @@ common/views/components/profile-editor.vue:
you-can-include-hashtags: "Du må gerne bruge hashtags i din profil beskrivelse"
language: "Sprog"
birthday: "Fødselsdag"
avatar: "Ikon"
avatar: "Avatar"
banner: "Banner"
is-cat: "Denne konto er en Kat"
is-bot: "Denne konto er en Bot"
@ -682,6 +692,7 @@ common/views/components/profile-editor.vue:
saved: "Profil er opdateret med succes"
uploading: "Overfører"
upload-failed: "Fejl ved overførsel"
unable-to-process: "Handlingen kunne ikke gennemføres."
email: "Email indstillinger"
email-address: "Email adresse"
email-verified: "Din email er blevet bekræftet"
@ -701,6 +712,7 @@ common/views/components/profile-editor.vue:
danger-zone: "Risici"
delete-account: "Slet kontoen"
account-deleted: "Kontoen er slettet. Det kan vare lidt, inden alle data forsvinder."
metadata-content: "Indhold"
common/views/components/user-list-editor.vue:
users: "Bruger"
rename: "Omdøb listen"
@ -807,6 +819,7 @@ desktop:
uploading-avatar: "Overfør en ny avatar"
avatar-updated: "Avatar er overført med succes"
choose-avatar: "Vælg et billede til din avatar"
unable-to-process: "Handlingen kunne ikke gennemføres."
invalid-filetype: "Denne filtype kan ikke benyttes her"
desktop/views/components/activity.chart.vue:
total: "Sort ... Total"
@ -847,7 +860,7 @@ desktop/views/components/drive.file.vue:
unmark-as-sensitive: "Fjern markering som 'følsom'"
copy-url: "Kopier webadresse"
download: "Download"
else-files: "Andre"
else-files: "Avanceret"
set-as-avatar: "Vælg som avatar"
set-as-banner: "Vælg som banner"
open-in-app: "Åbn i app"
@ -866,6 +879,7 @@ desktop/views/components/drive.folder.vue:
rename: "Omdøb"
rename-folder: "Omdøb mappe"
input-new-folder-name: "Angiv nyt navn"
else-folders: "Avanceret"
desktop/views/components/drive.vue:
search: "Søg"
empty-draghover: "Smid det her! Fordi du ved, at jeg er meget sød, ikke?"
@ -995,6 +1009,7 @@ common/views/components/drive-settings.vue:
max: "Kapacitet"
in-use: "I brug"
stats: "Statistik"
default-upload-folder-name: "Mappe(r)"
common/views/components/mute-and-block.vue:
mute-and-block: "Annuller / Bloker"
mute: "Annuller"
@ -1004,6 +1019,8 @@ common/views/components/mute-and-block.vue:
word-mute: "Ordfilter"
muted-words: "Frafiltrerede ord"
muted-words-description: "Mellemrum mellem ord vil blive håndteret, som om der står AND i mellem ordene i søgningen (dvs. alle ord skal være til stede). Linjeskift mellem ord vil føre til, at der søges med OR mellem ordene (dvs. kun det ene af ordene behøver være til stede)."
unmute-confirm: "Er du sikker på, at du vil fjerne annulleringen af denne bruger?"
unblock-confirm: "Er du sikker på, at du vil fjerne blokeringen af denne bruger?"
save: "Gem"
common/views/components/password-settings.vue:
reset: "Skift adgangskode"
@ -1139,7 +1156,6 @@ admin/views/instance.vue:
object-storage-s3-info-here: "Her"
object-storage-gcs-info: "Når du bruger Google Cloud Storage som eksternt lager, skal du indstille \"Terminal\" til storage.googleapis.com og forlade feltet \"Region\"."
cache-remote-files: "Cache eksterne filer"
cache-remote-files-desc: "Hvis du deaktiverer denne indstilling, kan du linke direkte uden at gemme eksterne filer her. Dermed sparer du plads på din egen server. Til gengæld bliver linksene til de eksterne filer usynlige for brugere, som har deaktiveret direkte links, fordi der ikke vises miniature-billeder. Alt i alt anbefales det at aktivere denne indstilling."
local-drive-capacity-mb: "Kapacitet på hver lokal brugers drev"
remote-drive-capacity-mb: "Kapacitet på hver ekstern brugers drev"
mb: "I megabytes (MB)"
@ -1195,6 +1211,7 @@ admin/views/instance.vue:
smtp-auth: "Udfør autentifikation af SMTP"
smtp-user: "SMTP bruger"
smtp-pass: "SMTP adgangskode"
test-email: "Test"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "Aktiver ServiceWorker"
serviceworker-info: "Skal være aktiveret for at give push notifikationer."
@ -1271,6 +1288,8 @@ admin/views/users.vue:
remote-user-updated: "Informationen om den eksterne bruger er nu blevet opdateret."
delete-all-files: "Slet alle filer"
delete-all-files-confirm: "Er du sikker på, at alle filerne skal slettes?"
username: "Brugernavn"
host: "Vært"
users:
title: "Bruger"
sort:
@ -1301,6 +1320,11 @@ admin/views/moderators.vue:
added: "Redaktør er oprettet"
remove: "Fjern"
removed: "Redaktøren er nu fjernet"
logs:
title: "Logs"
moderator: "Redaktører"
type: "Drift"
info: "Information"
admin/views/emoji.vue:
add-emoji:
title: "Tilføj emoji"
@ -1589,6 +1613,8 @@ mobile/views/pages/search.vue:
not-found: "Ingen poster fundet for \"{q}\""
mobile/views/pages/selectdrive.vue:
select-file: "Vælg fil(er)"
mobile/views/pages/notifications.vue:
notifications: "Notifikationer"
mobile/views/pages/settings.vue:
signed-in-as: "Logget ind som {}"
mobile/views/pages/user.vue:
@ -1663,6 +1689,8 @@ dev/views/new-app.vue:
app-name: "Navn på app"
app-name-placeholder: "F.eks. Misskey for iOS"
pages:
pin-this-page: "Tilknyt til din profil"
unpin-this-page: "Fjern tilknytning til din profil"
like: "Synes om"
title: "Titel"
blocks:
@ -1708,6 +1736,10 @@ pages:
_dialog:
content: "Indhold"
resetRandom: "Nulstil tilfældigt tal"
_radioButton:
name: "Variabel navn"
title: "Titel"
default: "Standard værdi"
script:
categories:
flow: "Kontrol"
@ -1761,10 +1793,11 @@ pages:
_divide:
arg1: "A"
arg2: "B"
remind: "÷ Tomo"
_remind:
_mod:
arg1: "A"
arg2: "B"
_round:
arg1: "Tal"
eq: "A og B er ens"
_eq:
arg1: "A"
@ -1845,6 +1878,8 @@ pages:
_pick:
arg1: "Lister"
arg2: "Position"
_listLen:
arg1: "Lister"
number: "Tal"
stringToNumber: "Tekst til tal"
_stringToNumber:
@ -1877,3 +1912,10 @@ pages:
enviromentVariables: "Miljø variabel"
pageVariables: "Side element"
argVariables: "Input slot"
room:
translate: "Flyt"
save: "Gem"
saved: "Gemt"
furnitures:
moon: "Måne"
bin: "Skraldespand"

View File

@ -18,9 +18,6 @@ common:
drive: "Drive"
drive-desc: "Du willst ein hochgeladenes Foto nochmal posten? Deine Dateien benennen und in Ordnern sortieren? Misskeys Drive ist der beste Ort dafür. Damit wird das Teilen zum Kinderspiel!"
outro: "Probiere Misskey aus und entdecke Misskeys einzigartige Funktionen. Wenn dir diese Instanz nicht zusagt, nimm einfach eine andere. Dank Misskeys dezentralem System kannst du dich überall mit deinen Freunden verbinden. Also dann, GLHF!"
adblock:
detected: "Bitte deaktiviere den Werbeblocker."
warning: "<strong>Misskey hat keine Werbung.</strong> Allerdings können Werbeblocker für unerwartete Probleme und fehlende Funktionen sorgen."
application-authorization: "Autorisierte Anwendungen"
close: "Schließen"
do-not-copy-paste: "Bitte keinen Code einfügen. Ihr Account könnte gefährdet werden."
@ -35,6 +32,10 @@ common:
signout: "Ausloggen"
reload-to-apply-the-setting: "Die Seite muss zum Übernehmen dieser Einstellung aktualisiert werden. Soll die Seite jetzt neu geladen werden?"
fetching-as-ap-object: "Hole Daten…"
delete-confirm: "Diesen Beitrag löschen?"
notification-types:
reply: "Antworten"
renote: "Anmerkung"
got-it: "Verstanden!"
customization-tips:
title: "Anpassung-Tipps"
@ -203,7 +204,7 @@ common:
deck-column-width-wide: "Sehr breit"
use-shadow: "Nutze Schatten"
rounded-corners: "Abgerundete Ecken"
circle-icons: "Kreisförmige Icons"
circle-icons: "Kreisförmige Avatar"
contrasted-acct: "Nutzernamen kontrastreicher darstellen"
wallpaper: "Hintergrund"
choose-wallpaper: "Hintergrund auswählen"
@ -248,6 +249,9 @@ common:
disable-via-mobile: "Beitrag nicht als „vom Handy“ markieren"
load-raw-images: "Anhänge in voller Größe laden"
load-remote-media: "Zeige Inhalte von fremden Servern"
save: "Speichern"
saved: "Gespeichert"
preview: "Vorschau"
search: "Suche"
delete: "Löschen"
loading: "Laden"
@ -565,6 +569,7 @@ common/views/components/profile-editor.vue:
avatar: "Avatar"
banner: "Banner"
save: "Speichern"
unable-to-process: "Der Vorgang konnte nicht abgeschlossen werden"
export: "Exportieren"
import: "Importieren"
export-targets:
@ -598,6 +603,8 @@ common/views/widgets/memo.vue:
save: "Speichern"
desktop:
banner: "Banner"
avatar: "Avatar"
unable-to-process: "Der Vorgang konnte nicht abgeschlossen werden"
desktop/views/components/activity.chart.vue:
total: "Schwarz ... komplett"
notes: "Blau ... Hinweise"
@ -632,7 +639,6 @@ desktop/views/components/drive.file.vue:
rename: "Umbenennen"
copy-url: "URL kopieren"
download: "Download"
else-files: "Anderes…"
set-as-avatar: "Als Avatar festlegen"
set-as-banner: "Setze als Banner"
open-in-app: "In der App öffnen"
@ -738,6 +744,7 @@ common/views/components/drive-settings.vue:
in-use: "benutzt"
stats: "Statistiken"
common/views/components/mute-and-block.vue:
unmute-confirm: "Stummschaltung für diesen Nutzer aufheben?"
save: "Speichern"
desktop/views/components/sub-note-content.vue:
private: "Dieser Beitrag ist privat"
@ -775,6 +782,7 @@ admin/views/instance.vue:
invite: "Einladen"
save: "Speichern"
saved: "Gespeichert"
test-email: "Test"
admin/views/charts.vue:
drive: "Drive"
admin/views/drive.vue:
@ -782,6 +790,7 @@ admin/views/drive.vue:
local: "Lokal"
delete: "Löschen"
admin/views/users.vue:
username: "Benutzername"
users:
origin:
local: "Lokal"
@ -871,6 +880,8 @@ mobile/views/pages/note.vue:
next: "Nächster Kommentar"
mobile/views/pages/search.vue:
search: "Suchen"
mobile/views/pages/notifications.vue:
notifications: "Benachrichtigungen"
mobile/views/pages/user/home.vue:
activity: "Aktivität"
keywords: "Schlagwörter"
@ -910,6 +921,8 @@ dev/views/new-app.vue:
authority-desc: "Nur die hier eingetragenen Berechtigungen, werden per API zur Verfügung stehen."
authority-warning: "Dies kann auch nach dem erstellen der Anwendung geändert werden, allerdings werden dann alle bisher generierten Token ungültig."
pages:
pin-this-page: "An die Profilseite pinnen"
unpin-this-page: "Lösen"
like: "Gefällt mir"
blocks:
post: "\"Neuer Beitrag\"-Formular"
@ -929,5 +942,13 @@ pages:
arg2: "Listen"
_pick:
arg1: "Listen"
_listLen:
arg1: "Listen"
types:
array: "Listen"
room:
save: "Speichern"
saved: "Gespeichert"
furnitures:
moon: "Mond"
bin: "Papierkorb"

View File

@ -12,15 +12,12 @@ common:
rich-contents: "Post"
rich-contents-desc: "Just post your idea, hot topics, and anything you want to share. You may want to decorate your words, attach your favorite pictures, send files, including videos, or create a poll - those are some of the things you can do with Misskey!"
reaction: "Reactions"
reaction-desc: "The easiest way to express your emotions. Misskey allows you to add various kinds of reactions to other's posts. The emotional experience on Misskey will never be on other SNSs, which are only able to push “likes”."
reaction-desc: "The easiest way to express your emotions. Misskey allows you to add various reactions to posts. Other SNSs only have a \"like\" reaction."
ui: "Interface"
ui-desc: "No single UI can suit everyone. Therefore, Misskey has a highly customizable UI for your tastes. You can make your home original by editing the layout of your timeline, and moving around selectable widgets that you can easily adjust to make this place your own."
drive: "Drive"
drive-desc: "Wanna post a picture you have already uploaded? Wish to organize, name and create a folder for your uploaded files? Misskey Drive is the best solution for you. Very easy to share your files online."
outro: "Check Misskey-unique features by seeing them with your own eyes! If you feel like this instance is not for you, try other instances, as Misskey is a decentralized SNS, so that you can easily find your mates. Then, GLHF!"
adblock:
detected: "Please disable ad blocker."
warning: "Some features may be unavailable or cause malfunctions if ad blocking features are enabled. <strong>Misskey is not running ads</strong>."
application-authorization: "Application authorizations"
close: "Close"
do-not-copy-paste: "Please do not enter or paste the code here. Account may be compromised."
@ -30,11 +27,25 @@ common:
customize-home: "Customize home layout"
featured-notes: "Featured notes"
dark-mode: "Dark Mode"
signin: "Log In"
signin: "Login"
signup: "Sign up"
signout: "Logout"
reload-to-apply-the-setting: "You'll need to reload the page to reflect this setting. Do you want to reload it now?"
fetching-as-ap-object: "Inquiring to union"
fetching-as-ap-object: "Inquiring to fediverse"
unfollow-confirm: "Do you want to unfollow {name}?"
delete-confirm: "Are you sure you want to delete this post?"
signin-required: "Please login"
notification-type: "Notification Type"
notification-types:
all: "All"
pollVote: "Votes"
follow: "Following"
receiveFollowRequest: "Follow requests"
reply: "Reply"
quote: "Quote"
renote: "Renote"
mention: "Mentions"
reaction: "Reaction"
got-it: "Got it!"
customization-tips:
title: "Customization tips"
@ -80,7 +91,7 @@ common:
"write:drive": "Work with the Drive"
"read:favorites": "View Favorites"
"write:favorites": "Work with Favorites"
"read:following": "View Follower info"
"read:following": "View your Follow info"
"write:following": "Work with Follow info"
"read:messaging": "View Messaging"
"write:messaging": "Work with Messaging"
@ -92,6 +103,12 @@ common:
"read:reactions": "View reactions"
"write:reactions": "Work with reactions"
"write:votes": "Vote"
"read:pages": "View Pages"
"write:pages": "Update Pages"
"read:page-likes": "View Likes on Pages"
"write:page-likes": "Update Likes on Pages"
"read:user-groups": "View User groups"
"write:user-groups": "Edit User groups"
empty-timeline-info:
follow-users-to-make-your-timeline: "Following users will show their posts in your timeline."
explore: "Find users"
@ -119,9 +136,11 @@ common:
geolocation-alert: "Your device does not provide location services"
error: "Error"
enter-username: "Please enter username"
specified-recipient: "Recipient"
add-visible-user: "Add a user"
cw-placeholder: "Comments for the post (optional)"
username-prompt: "Please enter username"
enter-file-name: "Edit file name"
weekday-short:
sunday: "S"
monday: "M"
@ -181,6 +200,8 @@ common:
other: "Other"
appearance: "Appearance"
behavior: "Behavior"
reactions: "Reaction"
reactions-description: "Customize Emojis of Reaction picker delimited by line breaks"
fetch-on-scroll: "Endless loading on scroll"
fetch-on-scroll-desc: "When you scroll down the page, it automatically fetches additional content."
note-visibility: "Post visibility"
@ -188,6 +209,11 @@ common:
remember-note-visibility: "Remember post visibility"
web-search-engine: "Web search engine"
web-search-engine-desc: "Example: https://www.google.com/?#q={{query}}"
paste: "Paste"
pasted-file-name: "Template for pasted file name"
pasted-file-name-desc: "Example: \"yyyy-MM-dd HH-mm-ss [{{number}}]\" → \"2018-03-20 21-30-24 1\""
paste-dialog: "Edit the pasted file name"
paste-dialog-desc: "Display a dialog to edit the file name when you paste a file."
keep-cw: "Preserve content warning"
keep-cw-desc: "When replying to a post, the same content warning is set by default to the reply, as has been set by the original post."
i-like-sushi: "I prefer sushi rather than pudding"
@ -195,6 +221,7 @@ common:
use-avatar-reversi-stones: "Use avatar as a stone in reversi"
disable-animated-mfm: "Disable animated texts in a post"
disable-showing-animated-images: "Do not play animated images"
enable-quick-notification-view: "Enable Quick Notification View"
suggest-recent-hashtags: "Show recent popular hashtags on the post form"
always-show-nsfw: "Always show NSFW contents"
always-mark-nsfw: "Always mark posts with media attachments as NSFW"
@ -225,7 +252,7 @@ common:
deck-column-width-wide: "Wide"
use-shadow: "Use shadows in the UI"
rounded-corners: "Round the corners of the UI"
circle-icons: "Use circular icons"
circle-icons: "Use circular avatar icon"
contrasted-acct: "Add contrast to user account"
wallpaper: "Background image"
choose-wallpaper: "Choose a background"
@ -270,6 +297,22 @@ common:
disable-via-mobile: "Don't mark the post as 'from mobile'"
load-raw-images: "Show attached images in original quality"
load-remote-media: "Show media from a remote server"
sync: "Sync"
save: "Save"
saved: "Saved"
preview: "Preview"
home-profile: "Home profile"
deck-profile: "Deck profile"
room: "Room"
_room:
graphicsQuality: "Graphics Quality"
_graphicsQuality:
ultra: "Ultra"
high: "High"
medium: "Medium"
low: "Low"
cheep: "Cheep"
useOrthographicCamera: "Use Orthographic Camera"
search: "Search"
delete: "Delete"
loading: "Loading"
@ -350,10 +393,15 @@ common/views/pages/explore.vue:
popular-users: "Popular users"
recently-updated-users: "Recently active users"
recently-registered-users: "Users who joined recently"
recently-discovered-users: "Recently Discovered Users"
popular-tags: "Popular Tags"
federated: "From the fediverse"
explore: "Explore {host}"
explore-fediverse: "Explore Fediverse"
users-info: "Currently, {users} users are registered here"
common/views/components/reactions-viewer.details.vue:
few-users: "{users} reacted with {reaction}"
many-users: "{users}, and {omitted} more reacted with {reaction}"
common/views/components/url-preview.vue:
enable-player: "Enable playback"
disable-player: "Close the player"
@ -519,7 +567,10 @@ common/views/components/note-menu.vue:
unpin: "Unpin"
delete: "Delete"
delete-confirm: "Are you sure you want to delete this post?"
delete-and-edit: "Delete and Edit"
delete-and-edit-confirm: "Are you sure you want to delete this note and edit it? You will lose all reactions, renotes and replies to it."
remote: "Show original note"
pin-limit-exceeded: "You can't pin any more posts."
common/views/components/user-menu.vue:
mention: "Mention"
mute: "Mute"
@ -579,7 +630,9 @@ common/views/components/reaction-picker.vue:
choose-reaction: "Send a reaction"
input-reaction-placeholder: "or input Emoji"
common/views/components/emoji-picker.vue:
recent-emoji: "Recently used"
custom-emoji: "Custom Emoji"
no-category: "Uncategorized"
people: "People"
animals-and-nature: "Animals & Nature"
food-and-drink: "Food & drink"
@ -588,6 +641,14 @@ common/views/components/emoji-picker.vue:
objects: "Objects"
symbols: "Symbols"
flags: "Flags"
common/views/components/settings/app-type.vue:
title: "Mode"
intro: "You can specify whether you want to use the desktop, or the mobile layout."
choices:
auto: "Choose layout automatically"
desktop: "Always use the desktop layout"
mobile: "Always use the mobile layout"
info: "You need to reload the page for the changes to take effect."
common/views/components/signin.vue:
username: "Username"
password: "Password"
@ -597,7 +658,9 @@ common/views/components/signin.vue:
signin-with-twitter: "Log in with Twitter"
signin-with-github: "Sign in with GitHub"
signin-with-discord: "Sign in with Discord"
login-failed: "Logging in has failed. Make sure you have entered the correct username and password."
login-failed: "Unable to log in. The username or password you entered is incorrect."
tap-key: "Click on the Security Key to log in"
enter-2fa-code: "Enter your verification code"
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>."
@ -641,7 +704,7 @@ common/views/components/integration-settings.vue:
title: "Service cooperation"
connect: "Connect"
disconnect: "Disconnect"
connected-to: "You are connected to next account"
connected-to: "You are connected to this account"
common/views/components/github-setting.vue:
description: "Once you connect your GitHub account to your Misskey account, you will be able to see information about your GitHub account on your profile, and you will be able to sign-in via GitHub."
connected-to: "You are connected to this GitHub account"
@ -689,7 +752,7 @@ common/views/components/profile-editor.vue:
you-can-include-hashtags: "You can also include hashtags in your profile description."
language: "Language"
birthday: "Birthday"
avatar: "Icon"
avatar: "Avatar"
banner: "Banner"
is-cat: "This account is a Cat"
is-bot: "This account is a Bot"
@ -702,6 +765,9 @@ common/views/components/profile-editor.vue:
saved: "Profile updated successfully"
uploading: "Uploading"
upload-failed: "Failed to upload"
unable-to-process: "The operation could not be completed."
avatar-not-an-image: "The file you specified as an avatar is not an image"
banner-not-an-image: "The file you specified as a banner is not an image"
email: "Email settings"
email-address: "Email Address"
email-verified: "Your email has been verified."
@ -721,6 +787,9 @@ common/views/components/profile-editor.vue:
danger-zone: "Cautious options"
delete-account: "Remove the account"
account-deleted: "The account has been deleted. It may take some time until all of the data disappears."
profile-metadata: "Profile metadata"
metadata-label: "Label"
metadata-content: "Content"
common/views/components/user-list-editor.vue:
users: "User"
rename: "Rename list"
@ -759,6 +828,7 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "No announcements"
have-a-nice-day: "Have a nice day!"
next: "Next"
prev: "Previous"
common/views/widgets/calendar.vue:
year: "Year {}"
month: "{},"
@ -830,6 +900,7 @@ desktop:
uploading-avatar: "Uploading a new avatar"
avatar-updated: "Successfully updated the avatar"
choose-avatar: "Select an image for the avatar"
unable-to-process: "The operation could not be completed."
invalid-filetype: "This filetype is not acceptable here"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
@ -870,8 +941,8 @@ desktop/views/components/drive.file.vue:
unmark-as-sensitive: "Unmark as 'sensitive'"
copy-url: "Copy URL"
download: "Download"
else-files: "Others"
set-as-avatar: "Set as an avatar"
else-files: "Other"
set-as-avatar: "Set as avatar"
set-as-banner: "Set as a banner"
open-in-app: "Open in app"
add-app: "Add app"
@ -880,15 +951,20 @@ desktop/views/components/drive.file.vue:
copied: "Copied"
copied-url-to-clipboard: "URL has been copied to clipboard"
desktop/views/components/drive.folder.vue:
upload-folder: "Default Upload location"
unable-to-process: "The operation could not be completed."
circular-reference-detected: "The destination folder is a subfolder of the folder you wish to move."
unhandled-error: "Unknown error"
unable-to-delete: "Unable to delete"
has-child-files-or-folders: "Since this folder is not empty, it can not be deleted."
contextmenu:
move-to-this-folder: "Move to this folder"
show-in-new-window: "Open in new window"
rename: "Rename"
rename-folder: "Rename folder"
input-new-folder-name: "Enter new name"
else-folders: "Other"
set-as-upload-folder: "Set as default upload folder"
desktop/views/components/drive.vue:
search: "Search"
empty-draghover: "Drop it here! Yep, cuz you know I'm cute, right?"
@ -994,6 +1070,16 @@ desktop/views/components/settings.2fa.vue:
success: "Settings saved!"
failed: "Failed to setup. Please ensure that the token is correct."
info: "From the next time you sign in to Misskey, the token displayed on your device will be necessary too, as well as the password."
totp-header: "Authenticator App"
security-key-header: "Security Key"
security-key: "For additional security, you can log in to your account using a hardware Security Key that supports FIDO2. When you then sign in, you'll need the registered Security Key, or an authenticator app with you."
last-used: "Last used:"
activate-key: "Click to activate the Security Key"
security-key-name: "Name the Key"
register-security-key: "Complete Key registration"
something-went-wrong: "Wow! There was a problem registering the Key:"
key-unregistered: "The Key has been deleted"
use-password-less-login: "Use Password-less login"
common/views/components/media-image.vue:
sensitive: "NSFW"
click-to-show: "Click to show"
@ -1018,6 +1104,9 @@ common/views/components/drive-settings.vue:
max: "Max"
in-use: "In use"
stats: "Statistics"
default-upload-folder: "Default upload folder location"
default-upload-folder-name: "Folder(s)"
change-default-upload-folder: "Change folder"
common/views/components/mute-and-block.vue:
mute-and-block: "Mute / Block"
mute: "Mute"
@ -1027,6 +1116,8 @@ common/views/components/mute-and-block.vue:
word-mute: "Word mute"
muted-words: "Muted keywords"
muted-words-description: "Separating with spaces results in AND specifications, and delimiting with line breaks results in OR specifications"
unmute-confirm: "Are you certain that you want to unmute this user?"
unblock-confirm: "Are you certain that you want to unblock this user?"
save: "Save"
common/views/components/password-settings.vue:
reset: "Change password"
@ -1071,6 +1162,7 @@ desktop/views/components/ui.header.account.vue:
groups: "Groups"
follow-requests: "Follow requests"
admin: "Admin"
room: "Room"
desktop/views/components/ui.header.nav.vue:
game: "Games"
desktop/views/components/ui.header.notifications.vue:
@ -1103,7 +1195,13 @@ admin/views/index.vue:
abuse: "Abuse"
queue: "Job Queue"
logs: "Logs"
db: "Database"
back-to-misskey: "Back to Misskey"
admin/views/db.vue:
tables: "Tables"
vacuum: "Vacuum"
vacuum-info: "Tidies up the database. Keeps the data intact and reduces disk usage. This is usually done automatically and periodically."
vacuum-exclamation: "Vacuuming can overload the database for a while, and cause users not to be able to participate in interactions."
admin/views/dashboard.vue:
dashboard: "Dashboard"
accounts: "Accounts"
@ -1181,7 +1279,9 @@ admin/views/instance.vue:
object-storage-s3-info-here: "here"
object-storage-gcs-info: "If you are going to use Google Cloud Storage as Object Storage, Set the 'Endpoint' as storage.googleapis.com, and keep the 'Region' is blank."
cache-remote-files: "Cache remote files"
cache-remote-files-desc: "Without this parameter, all remote files are linked to their host server directly. This will be an effective solution to save your server storage, however make remote files invisible to users who set direct-link disabled, since no thumbnail will be generated, increase traffic. It is recommended that this parameter set enabled."
cache-remote-files-desc: "If disabled, All remote files going to be linked to their origin server directly. This will be an effective solution to save your server storage. However, Since no thumbnail will be generated, It will make increasing data usage, and also may remote files are invisible to users who set direct-link disabled. It is recommended that this config set enabled or enabling the next config, 'Proxy remote files'."
proxy-remote-files: "Proxy remote files"
proxy-remote-files-desc: "If enabled, Remote files that not stored locally or deleted by storage overusage will be proxied locally and also thumbnails will be generated."
local-drive-capacity-mb: "Volume of Drive per user"
remote-drive-capacity-mb: "Volume of Drive per remote user"
mb: "In megabytes"
@ -1211,7 +1311,7 @@ admin/views/instance.vue:
discord-integration-client-id: "Client ID"
discord-integration-client-secret: "Client Secret"
proxy-account-config: "Proxy account"
proxy-account-info: "Proxy account can follow a remote user to deliver activities if no one in this instance follow him or her. When you add a remote user who is followed by nobody in this instance to your list, in order to get his or her data, proxy account follow him or her instead of your following."
proxy-account-info: "A proxy account is an account that acts as a remote follower for users under certain conditions. For example, when a user adds a remote user to the list, the activity will not be delivered to the server if no one is following that user, so the proxy account will follow instead."
proxy-account-username: "Proxy account user name"
proxy-account-username-desc: "Specify the user name of the account that is used as a proxy."
proxy-account-warn: "You must make an account having this username before this action."
@ -1238,6 +1338,7 @@ admin/views/instance.vue:
smtp-auth: "Perform SMTP authentication"
smtp-user: "SMTP User"
smtp-pass: "SMTP Password"
test-email: "Test"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "Enable ServiceWorker"
serviceworker-info: "Must be enabled for push notifications."
@ -1256,9 +1357,9 @@ admin/views/charts.vue:
charts:
federation-instances: "The number of instances: increase/decrease"
federation-instances-total: "Total number of instances"
notes: "The number of posts: increase/decrease (Combined)"
local-notes: "The number of posts: increase/decrease (Local)"
remote-notes: "The number of posts: increase/decrease (Remote)"
notes: "Increase, or decrease in the number of posts (Combined)"
local-notes: "Increase, or decrease in the number of posts (Local)"
remote-notes: "Increase, or decrease in the number of posts (Remote)"
notes-total: "Total posts"
users: "The number of users: increase/decrease"
users-total: "Total users"
@ -1317,6 +1418,8 @@ admin/views/users.vue:
remote-user-updated: "The information regarding the remote user has been updated."
delete-all-files: "Delete all files"
delete-all-files-confirm: "Are you sure that you want to delete all files?"
username: "Username"
host: "Host"
users:
title: "Users"
sort:
@ -1328,6 +1431,7 @@ admin/views/users.vue:
state:
title: "Sort"
all: "All"
available: "Available"
admin: "Administrator"
moderator: "Moderator"
adminOrModerator: "Admin/Moderator"
@ -1347,11 +1451,18 @@ admin/views/moderators.vue:
added: "Registered a Moderator."
remove: "Discharge"
removed: "The moderator has been discharged"
logs:
title: "Logs"
moderator: "Moderators"
type: "Operations"
at: "Timestamp"
info: "Information"
admin/views/emoji.vue:
add-emoji:
title: "Add emoji"
name: "Emoji name"
name-desc: "You can use the characters a~z 0~9 _"
category: "Categories"
aliases: "Aliases"
aliases-desc: "You can add more than one, separated by spaces."
url: "Image URL"
@ -1427,7 +1538,7 @@ admin/views/federation.vue:
chart-srcs:
requests: "Requests"
users: "Increase, or decrease in the number of users"
users-total: "Total number of users"
users-total: "Users in total"
notes: "Increase, or decrease in the number of notes"
notes-total: "Total number of notes"
ff: "Increase of followers"
@ -1635,6 +1746,8 @@ mobile/views/pages/search.vue:
not-found: "No posts were found for '{q}'"
mobile/views/pages/selectdrive.vue:
select-file: "Choose files"
mobile/views/pages/notifications.vue:
notifications: "Notifications"
mobile/views/pages/settings.vue:
signed-in-as: "Signed in as {}"
mobile/views/pages/user.vue:
@ -1693,6 +1806,7 @@ deck/deck.user-column.vue:
activity: "Activity"
timeline: "Timeline"
pinned-notes: "Pinned posts"
pinned-page: "Pinned page"
docs:
edit-this-page-on-github: "Found an error, or do you want to contribute to the documentation?"
edit-this-page-on-github-link: "Edit this page at GitHub!"
@ -1724,9 +1838,14 @@ pages:
read-page: "Viewing the source"
page-created: "Created the page!"
page-updated: "Updated the page"
name-already-exists: "The specified page name already exists"
title-invalid-name: "The specified page URL is invalid"
text-invalid-name: "Check whether that is not a blank"
are-you-sure-delete: "Do you want to delete this page?"
page-deleted: "The page has been deleted"
edit-this-page: "Edit this page"
pin-this-page: "Pin to your profile"
unpin-this-page: "Unpin"
view-source: "View Source"
view-page: "View page"
like: "Like"
@ -1745,6 +1864,7 @@ pages:
url: "Page URL"
summary: "Summary of page"
align-center: "Center align"
hide-title-when-pinned: "Hide page title when pinned to profile"
font: "Font"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
@ -1798,12 +1918,25 @@ pages:
inc: "Increase number"
_button:
text: "Title"
colored: "Color"
action: "Operation when the button pressed"
_action:
dialog: "Show a dialog"
_dialog:
content: "Content"
resetRandom: "Reset a random number"
pushEvent: "Send an event"
_pushEvent:
event: "Name of the event"
message: "Message to display when pressed"
variable: "Variable to send"
no-variable: "None"
radioButton: "Choices"
_radioButton:
name: "Variable name"
title: "Title"
values: "Item of choices that delimited by line breaks"
default: "Default value"
script:
categories:
flow: "Control"
@ -1857,10 +1990,13 @@ pages:
_divide:
arg1: "A"
arg2: "B"
remind: "÷ Remaindering"
_remind:
mod: "÷ Remaindering"
_mod:
arg1: "A"
arg2: "B"
round: "Round decimal"
_round:
arg1: "Number"
eq: "A and B are equal"
_eq:
arg1: "A"
@ -1941,6 +2077,9 @@ pages:
_pick:
arg1: "Lists"
arg2: "Position"
listLen: "Get length of list"
_listLen:
arg1: "Lists"
number: "Number"
stringToNumber: "Text to number"
_stringToNumber:
@ -1973,3 +2112,64 @@ pages:
enviromentVariables: "Environment variable"
pageVariables: "Page element"
argVariables: "Input slot"
room:
add-furniture: "Place furniture"
translate: "Move"
rotate: "Rotate"
exit: "Deselect"
remove: "Remove"
save: "Save"
saved: "Saved"
clear: "Remove All"
clear-confirm: "Are you sure to remove all furnitures in your room?"
leave-confirm: "There are unsaved changes. Do you really want to leave?"
chooseImage: "Select an image"
room-type: "Room type"
carpet-color: "Color of carpet"
rooms:
default: "Default"
washitsu: "Japanese-style"
furnitures:
milk: "Milk carton"
bed: "Bed"
low-table: "Low Table"
desk: "Desk"
chair: "Chair"
chair2: "Chair 2"
fan: "Fan"
pc: "Computer"
plant: "Houseplant"
plant2: "Houseplant 2"
eraser: "Eraser"
pencil: "Pencil"
pudding: "Pudding"
cardboard-box: "Cardboard Box"
cardboard-box2: "Cardboard Box 2"
cardboard-box3: "Cardboard Box 3"
book: "Book"
book2: "Book 2"
piano: "Piano"
facial-tissue: "Facial tissue"
server: "Servers"
moon: "Moon"
corkboard: "Cork board"
mousepad: "Mousepad"
monitor: "Monitor"
keyboard: "Keyboard"
carpet-stripe: "Carpet (stripe)"
mat: "Mat"
color-box: "Bookshelf"
wall-clock: "Wall clock"
photoframe: "Picture frame"
cube: "Cube"
tv: "TV"
pinguin: "Penguin"
rubik-cube: "Rubik's Cube"
poster-h: "Poster (Horizontal)"
poster-v: "Poster (Vertical)"
sofa: "Sofa"
spiral: "Spiral Staircase"
bin: "Waste bin"
cup-noodle: "Cup noodle"
holo-display: "Holographic display"
energy-drink: "Energy drink"

View File

@ -16,9 +16,8 @@ common:
ui: "Interfaz"
ui-desc: "No hay ninguna interfaz que le vaya bien a todos. Por eso, Misskey tiene una interfaz altamente personalizable para tus gustos. Puedes hacer tu página principal única editando la interfaz de tu timeline y moviendo varios widgets para conseguir hacer de este lugar uno propio."
drive: "Drive"
adblock:
detected: "Por favor, desactive el bloqueador de publicidad."
warning: "<strong>Misskey no tiene anuncios publicitarios.</strong> Sin embargo, algunas características podrían no estar disponibles si el bloqueador de publicidad está habilitado."
drive-desc: "¿Quieres postear de nuevo la imagen que has posteado antes? Si es así, ¿Quieres separar y ordenar en carpetas los archivos que has subido? La característica Drive incorporada en la base de Misskey es la solución. Compartir archivos es simple."
outro: "Aún hay características que solamente están en Misskey, asegúrate de eso con tus propios ojos. Misskey es un servicio de red social distribuida, si no te gusta esta instancia, puedes probar otra instancia. Así que, ¡buena suerte!"
application-authorization: "Autorizaciones de la aplicación."
close: "Cerrar"
do-not-copy-paste: "Por favor no copies código aquí. Tu cuenta puede resultar comprometida."
@ -31,9 +30,26 @@ common:
signin: "Iniciar sesión"
signup: "¡Regístrate!"
signout: "Cerrar sesión"
reload-to-apply-the-setting: "Para aplicar esta configuración, hay que recargar la página. ¿Quiere recargar ahora?"
fetching-as-ap-object: "Consultar en el fediverso"
unfollow-confirm: "¿Quiere dejar de seguir a {name}?"
delete-confirm: "¿Seguro que quieres borrar la publicación?"
signin-required: "Inicie sesion"
notification-type: "Tipo de notificación"
notification-types:
all: "Todo"
pollVote: "Encuestas"
follow: "Seguimientos"
receiveFollowRequest: "Solicitudes de seguimiento"
reply: "Responder"
quote: "Citas"
renote: "Volver a publicar"
mention: "Menciones"
reaction: "Reacciones"
got-it: "¡Listo!"
customization-tips:
title: "Consejos de personalización"
paragraph: "<p>Se puede personalizar el inicio agregando/quitando widgets, arrastrarlos, soltarlos y ordenarlos.</p><p>Haciendo <strong>Click <strong>derecho</strong></strong>, se puede modificar la muestra de un widget</p><p>Para quitar un widget, arrastre y suelte el widget en el area que dice <strong>\"Papelera\"</strong> en el cabezal</p><p>Para acabar de personalizar, haga click en \"Listo\" arriba a la derecha</p>"
gotit: "¡Comprendido!"
notification:
file-uploaded: "Archivo cargado."
@ -71,20 +87,42 @@ common:
"write:account": "Editar información de la cuenta"
"read:blocks": "Ver bloques"
"write:blocks": "Editar bloques"
"read:drive": "Explorar el drive"
"write:drive": "Administrar el drive"
"read:favorites": "Ver favoritos"
"write:favorites": "Editar favoritos"
"read:following": "Ver información de seguidor"
"write:following": "Seguir/Dejar de seguir"
"read:messaging": "Ver conversación"
"write:messaging": "Administrar coversación"
"read:mutes": "Ver silenciados"
"write:mutes": "Administrar silenciados"
"write:notes": "Crear y eliminar articulos"
"read:notifications": "Ver notificaciones"
"write:notifications": "Administrar notificaciones"
"read:reactions": "Ver reacciones"
"write:reactions": "Administrar reacciones"
"write:votes": "Vota"
"read:pages": "Ver páginas"
"write:pages": "Administrar páginas"
"read:page-likes": "Ver páginas que te gustan"
"write:page-likes": "Administrar páginas que te gustan"
"read:user-groups": "Ver grupos de usuarios"
"write:user-groups": "Administrar grupos de usuarios"
empty-timeline-info:
follow-users-to-make-your-timeline: "Seguir al usuario mostrará sus posts en la linea de tiempo"
explore: "Explorar usuarios"
post-form:
reply: "Responder"
renote: "Volver a publicar"
attach-media-from-local: "Agregar medios de tu dispositivo"
insert-a-kao: "v('ω')v"
recent-tags: "Reciente"
error: "Error"
enter-username: "Ingresar nombre de usuario"
add-visible-user: "Agregar usuario"
username-prompt: "Ingresar nombre de usuario"
enter-file-name: "Editar nombre del archivo"
weekday-short:
sunday: "domingo"
monday: "lunes"
@ -139,15 +177,18 @@ common:
mute-and-block: "Silenciar/Bloquear"
blocking: "Bloquear"
security: "Seguridad"
signin: "Historial de ingresos"
password: "Contraseña"
other: "Otros"
appearance: "Diseño"
behavior: "Comportamiento"
reactions: "Reacciones"
fetch-on-scroll-desc: "Cuando te deslizas al final de la página nuevo contenido se carga automáticamente."
note-visibility: "Visibilidad de la publicación"
default-note-visibility: "Rango de publicación predeterminado"
web-search-engine: "Buscador web"
web-search-engine-desc: "Ejemplo: https://www.google.com/?#q={{query}}"
keep-cw: "Mantener CW"
this-setting-is-this-device-only: "Solo para este dispositivo"
use-os-default-emojis: "Usar los emoticonos estándar del sistema operativo"
line-width: "Grosor de línea"
@ -172,7 +213,7 @@ common:
deck-column-width-wide: "Ancho"
use-shadow: "Usar sombras en la Interfaz de Usuario"
rounded-corners: "Esquinas redondeadas en la Interfaz de Usuario"
circle-icons: "Usar iconos circulares"
circle-icons: "Usar avatar circulares"
contrasted-acct: "Añadir contraste al nombre de usuario"
wallpaper: "Fondo de pantalla"
choose-wallpaper: "Escoge un fondo de pantalla"
@ -197,6 +238,9 @@ common:
update-available-desc: "Las actualizaciones se aplicarán cuando la página se vuelva a cargar."
advanced-settings: "Configuraciones avanzadas"
navbar-position-left: "Izquierda"
save: "Guardar"
saved: "Guardado"
preview: "Vista previa"
search: "Buscar"
delete: "eliminar"
loading: "cargando"
@ -458,6 +502,8 @@ common/views/components/emoji-picker.vue:
objects: "Objetos"
symbols: "Símbolos"
flags: "Países"
common/views/components/settings/app-type.vue:
info: "Necesitas recargar la página para que los cambios tengan efecto."
common/views/components/signin.vue:
username: "Usuario"
password: "Contraseña"
@ -565,6 +611,7 @@ common/views/components/profile-editor.vue:
saved: "Perfil actualizado con exito"
uploading: "Subiendo"
upload-failed: "Error al subir"
unable-to-process: "La operación no se puede llevar a cabo"
email: "Preferencias de correo"
email-address: "Correo electrónico"
email-verified: "Tu cuenta de correo ha sido verificada."
@ -667,6 +714,7 @@ desktop:
uploading-avatar: "Cargando un nuevo avatar"
avatar-updated: "Avatar actualizado"
choose-avatar: "Escoge una imagen de avatar"
unable-to-process: "La operación no se puede llevar a cabo"
invalid-filetype: "Este tipo de archivo no es compatible aquí"
desktop/views/components/activity.chart.vue:
total: "Negro ... Total"
@ -725,6 +773,7 @@ desktop/views/components/drive.folder.vue:
rename: "Renombrar"
rename-folder: "Renombrar carpeta"
input-new-folder-name: "Escribe el nombre nuevo"
else-folders: "Otros"
desktop/views/components/drive.vue:
search: "Buscar"
empty-draghover: "¡Saluda!"
@ -859,6 +908,7 @@ desktop/views/components/settings.tags.vue:
desktop/views/components/timeline.vue:
home: "Inicio"
local: "Local"
hybrid: "Social"
global: "Global"
list: "Listas"
hashtag: "Hashtags"
@ -939,6 +989,7 @@ admin/views/instance.vue:
smtp-port: "Puerto SMTP"
smtp-user: "Usuario SMTP"
smtp-pass: "Contraseña SMTP"
test-email: "Prueba"
admin/views/charts.vue:
title: "Gráficos"
per-day: "Por día"
@ -958,12 +1009,18 @@ admin/views/drive.vue:
mark-as-sensitive: "Marcar como 'sensible'"
unmark-as-sensitive: "Desmarcar como 'sensible'"
admin/views/users.vue:
username: "Usuario"
host: "Host"
users:
state:
all: "Todo"
moderator: "Moderadores"
origin:
local: "Local"
admin/views/moderators.vue:
logs:
title: "Registros"
moderator: "Moderadores"
admin/views/emoji.vue:
add-emoji:
add: "Agregar"
@ -990,6 +1047,8 @@ admin/views/federation.vue:
day: "Por día"
blocked-hosts: "Bloquear"
save: "Guardar"
desktop/views/pages/welcome.vue:
timeline: "Timeline"
desktop/views/pages/selectdrive.vue:
cancel: "Cancelar"
desktop/views/pages/user-list.users.vue:
@ -1004,6 +1063,11 @@ desktop/views/pages/user/user.photos.vue:
desktop/views/pages/user/user.header.vue:
month: "lunes"
day: "domingo"
desktop/views/pages/user/user.timeline.vue:
default: "Posts"
with-replies: "Posts y respuestas"
with-media: "Multimedia"
my-posts: "Mis posts"
desktop/views/widgets/notifications.vue:
title: "Notificaciones"
desktop/views/widgets/polls.vue:
@ -1050,6 +1114,7 @@ mobile/views/components/ui.header.vue:
welcome-back: "Bienvenido/a de vuelta,"
adjective: "-san"
mobile/views/components/ui.nav.vue:
timeline: "Timeline"
notifications: "Notificaciones"
follow-requests: "Solicitudes de seguimiento"
search: "Buscar"
@ -1064,6 +1129,7 @@ mobile/views/pages/drive.vue:
mobile/views/pages/home.vue:
home: "Inicio"
local: "Local"
hybrid: "Social"
global: "Global"
mobile/views/pages/widgets.vue:
dashboard: "Panel de control"
@ -1075,6 +1141,10 @@ mobile/views/pages/games/reversi.vue:
reversi: "Reversi"
mobile/views/pages/search.vue:
search: "Buscar"
mobile/views/pages/notifications.vue:
notifications: "Notificaciones"
mobile/views/pages/user.vue:
timeline: "Timeline"
mobile/views/pages/user/home.vue:
activity: "Actividad"
mobile/views/pages/user/home.photos.vue:
@ -1082,6 +1152,7 @@ mobile/views/pages/user/home.photos.vue:
deck:
home: "Inicio"
local: "Local"
hybrid: "Social"
hashtag: "Etiquetas"
global: "Global"
notifications: "Notificaciones"
@ -1089,7 +1160,9 @@ deck:
rename: "Renombrar"
deck/deck.user-column.vue:
activity: "Actividad"
timeline: "Timeline"
pages:
pin-this-page: "Fijar en el perfil"
like: "Me gusta"
blocks:
post: "Formulario"
@ -1109,5 +1182,13 @@ pages:
arg2: "Listas"
_pick:
arg1: "Listas"
_listLen:
arg1: "Listas"
types:
array: "Listas"
room:
save: "Guardar"
saved: "Guardado"
furnitures:
moon: "Luna"
bin: "Papelera"

View File

@ -12,15 +12,12 @@ common:
rich-contents: "Notes"
rich-contents-desc: "Partagez vos idées, les événements et les sujets qui vous tiennent à cœur ainsi que tout autre chose que vous souhaitez partager avec les autres. Si vous le désirez, vous pouvez décorer vos messages en utilisant une syntaxe différente ou en y joignant des sondages et des fichiers, tels que les photos ou les vidéos que vous aimez."
reaction: "Réactions"
reaction-desc: "Une manière simple d'exprimer vos émotions. Misskey peut attacher diverses réactions aux publications des autres utilisateurs. Si vous essayez les réactions sur Misskey, vous ne pourrez plus retourner sur une autre plateforme de réseaux sociaux n'offrant que des « J'aime »."
reaction-desc: "Une manière simple d'exprimer vos émotions. Misskey peut attacher diverses réactions aux publications des autres utilisateur·rice·s. Si vous essayez les réactions sur Misskey, vous ne pourrez plus retourner sur une autre plateforme de réseaux sociaux n'offrant que des « J'aime »."
ui: "Interface"
ui-desc: "Aucune interface graphique ne peut plaire à tout le monde. Par conséquent, Misskey possède une interface utilisateur hautement personnalisable selon vos goûts. Vous pouvez rendre votre page d'accueil originale en modifiant la mise en page de votre fil et en déplaçant les widgets que vous pouvez facilement ajuster pour vous approprier cet espace."
drive: "Drive"
drive-desc: "Vous voulez poster une photo que vous avez déjà transférée ? Vous souhaitez organiser, nommer et créer un dossier pour vos fichiers téléversés ? Misskey Drive est la meilleure solution pour vous. Très facile de partager vos fichiers en ligne."
outro: "Découvrez vous-même les fonctionnalités de Misskey. Étant donné que Misskey est un réseau social fédéré, vous pouvez essayer dautres instances afin de trouver vos amis si la présente instance ne vous correspond pas. Bonne chance et amusez-vous bien!"
adblock:
detected: "Veuillez désactiver votre bloqueur de publicités"
warning: "<strong>Misskey nutilise 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: "Autorisations de lapplication"
close: "Fermer"
do-not-copy-paste: "Veuillez ne pas entrer ou coller le code ici. Le compte pourrait être compromis."
@ -34,9 +31,25 @@ common:
signup: "S'enregistrer"
signout: "Se déconnecter"
reload-to-apply-the-setting: "Le rechargement de la page est nécessaire pour appliquer ces paramètres. Désirez-vous la recharger maintenant ?"
fetching-as-ap-object: "Récupération depuis le fédiverse"
unfollow-confirm: "Désirez-vous vous désabonner de {name} ?"
delete-confirm: "Supprimer cette publication ?"
signin-required: "Veuillez vous connecter"
notification-type: "Type de notifications"
notification-types:
all: "Tout"
pollVote: "Sondages"
follow: "Abonnements"
receiveFollowRequest: "Demandes dabonnements"
reply: "Réponses"
quote: "Cité par"
renote: "Partages"
mention: "Mentions"
reaction: "Réactions"
got-it: "Jai compris !"
customization-tips:
title: "Conseils de personnalisation"
paragraph: "<p>La personnalisation de la page d'accueil vous permet d'ajouter/supprimer, glisser-déposer et réarranger les widgets.</p><p>Vous pouvez changer l'apparence de certain widget avec le <strong><strong>clic</strong>droit</strong>.</p><p>Pour supprimer un widget, faites glisser le widget sur <strong>la zone \"Corbeille\"</strong> dans l'en-tête.</p><p>Pour terminer la personnalisation, cliquez sur \"Terminé\" en haut à droite.</p>"
gotit: "Compris !"
notification:
file-uploaded: "Le fichier a été téléversé !"
@ -79,18 +92,26 @@ common:
"read:favorites": "Afficher les favoris"
"write:favorites": "Écrire des favoris"
"read:following": "Voir les informations de l'abonné"
"write:following": "Suivre/Ne plus suivre"
"read:messaging": "Lire les conversations"
"write:messaging": "Utiliser la messagerie"
"read:mutes": "Voir les comptes masqués"
"write:mutes": "Gérer les comptes muets"
"write:notes": "Créer ou supprimer des publications"
"read:notifications": "Afficher les notifications"
"write:notifications": "Gérer vos notifications"
"read:reactions": "Lire les réactions"
"write:reactions": "Gérer vos réactions"
"write:votes": "Vote"
"read:pages": "Afficher la page"
"write:pages": "Mettre à jour les Pages"
"read:page-likes": "Lire les favoris sur les Pages"
"write:page-likes": "Mettre à jour les favoris sur les Pages"
"read:user-groups": "Voir les groupes d'utilisateur·rice·s"
"write:user-groups": "Éditer les groupes des utilisateur·rice·s"
empty-timeline-info:
follow-users-to-make-your-timeline: "Les utilisateurs suivants afficheront leurs publications sur votre fil."
explore: "Trouver des utilisateurs"
follow-users-to-make-your-timeline: "Les utilisateur·rice·s suivant·e·s afficheront leurs publications sur votre fil."
explore: "Trouver des utilisateur·rice·s"
post-form:
attach-location-information: "Joindre des informations de localisation"
hide-contents: "Masquer les contenus"
@ -98,6 +119,7 @@ common:
quote-placeholder: "Citer cette note …"
option-quote-placeholder: "Citer ce billet ... (Facultatif)"
quote-attached: "Cité"
quote-question: "Souhaitez-vous ajoutez une citation ?"
submit: "Publication"
reply: "Répondre"
renote: "Republier"
@ -114,9 +136,11 @@ common:
geolocation-alert: "Votre appareil ne prend pas en charge les services de localisation"
error: "Erreur"
enter-username: "Saisir un nom d'utilisateur"
specified-recipient: "Correspondant·e"
add-visible-user: "Ajouter un utilisateur"
cw-placeholder: "Commenter le contenu (optionnel)"
username-prompt: "Saisir un nom d'utilisateur"
enter-file-name: "Éditer le nom du fichier"
weekday-short:
sunday: "D"
monday: "L"
@ -148,13 +172,13 @@ common:
public: "Public"
home: "Principal"
home-desc: "Publier sur le fil principal uniquement"
followers: "Abonnés"
followers-desc: "Publier à vos abonnés uniquement"
followers: "Abonné·e·s"
followers-desc: "Publier à vos abonné·e·s uniquement"
specified: "Direct"
specified-desc: "Publier uniquement aux utilisateurs mentionnés"
specified-desc: "Publier uniquement aux utilisateur·rice·s mentionné·e·s"
local-public: "Local (Public)"
local-home: "Accueil (local uniquement)"
local-followers: "Local (Abonnés)"
local-followers: "Abonné·e·s (Local uniquement)"
note-placeholders:
a: "Que faites-vous maintenant ?"
b: "Quoi de neuf ?"
@ -168,7 +192,7 @@ common:
notification: "Notifications"
apps: "Applications"
tags: "Hashtags"
mute-and-block: "Silencés / Bloqués"
mute-and-block: "Masqués / Bloqués"
blocking: "En cours blocage"
security: "Sécurité"
signin: "Historique des connexions"
@ -176,6 +200,8 @@ common:
other: "Avancé"
appearance: "Apparence"
behavior: "Comportement"
reactions: "Réaction"
reactions-description: "Personnaliser les émojis à afficher dans le sélecteur de réactions, délimités par les sauts de ligne."
fetch-on-scroll: "Chargement automatique lors du défilement"
fetch-on-scroll-desc: "Chargement automatique du contenu lors du défilement de la page."
note-visibility: "Visibilité de la publication"
@ -183,6 +209,10 @@ common:
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
web-search-engine: "Moteur de recherche Web"
web-search-engine-desc: "Exemple: https://www.google.com/?#q={{query}}"
paste: "Coller"
pasted-file-name: "Modèle de nom de fichier collé"
pasted-file-name-desc: "Exemple : \"yyyy-MM-dd HH-mm-ss [{{number}}]\" → \"2018-03-20 21-30-24 1\""
paste-dialog: "Modifier le nom du fichier collé"
keep-cw: "Maintenir l'avertissement de contenu"
keep-cw-desc: "Lorsque vous répondez à un message, le même avertissement de contenu est reprit par défaut dans la réponse, le même que celui qui a été défini dans le message original."
i-like-sushi: "Je préfère les sushis plutôt que le pudding"
@ -190,6 +220,7 @@ common:
use-avatar-reversi-stones: "Utiliser lavatar comme pion dans Reversi"
disable-animated-mfm: "Désactiver les textes animés dans les publications"
disable-showing-animated-images: "Désactiver l'animation des images"
enable-quick-notification-view: "Activer l'affichage rapide des notifications"
suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie"
always-show-nsfw: "Toujours afficher les contenus sensibles"
always-mark-nsfw: "Toujours marquer les notes ayant des médias comme sensibles"
@ -220,7 +251,7 @@ common:
deck-column-width-wide: "Large"
use-shadow: "Utiliser les ombres dans l'interface utilisateur"
rounded-corners: "Coins arrondis de l'interface utilisateur"
circle-icons: "Utiliser des icônes circulaires"
circle-icons: "Utiliser des avatar circulaires"
contrasted-acct: "Ajouter du contraste au nom de lutilisateur"
wallpaper: "Image du fond d'écran"
choose-wallpaper: "Sélectionner un fond d'écran"
@ -265,6 +296,22 @@ common:
disable-via-mobile: "Enlever la mention publié via 'mobile'"
load-raw-images: "Afficher les photos jointes dans leur qualité originale"
load-remote-media: "Afficher les médias depuis le serveur distant"
sync: "Synchroniser"
save: "Enregistrer"
saved: "enregistré"
preview: "Prévisualisation"
home-profile: "Profil principal"
deck-profile: "Profil deck"
room: "Pièce"
_room:
graphicsQuality: "Qualité des graphismes"
_graphicsQuality:
ultra: "Très élevée"
high: "Élevée"
medium: "Moyenne"
low: "Basse"
cheep: "Minimale"
useOrthographicCamera: "Utiliser une caméra orthographique"
search: "Recherche"
delete: "Supprimer"
loading: "Chargement en cours…"
@ -314,7 +361,7 @@ common:
version: "Version"
broadcast: "Diffusion"
notifications: "Notifications"
users: "Utilisateurs recommandés"
users: "Utilisateur·rice·s recommandé·e·s"
polls: "Sondages"
post-form: "Champs de publication"
server: "Infos sur le serveur"
@ -342,13 +389,17 @@ auth/views/index.vue:
sign-in: "Veuillez vous connecter"
common/views/pages/explore.vue:
pinned-users: "Utilisateur·rice·s épinglé·e·s"
popular-users: "Utilisateurs populaires"
recently-updated-users: "Utilisateurs actifs récemment"
popular-users: "Utilisateur·rice·s populaires"
recently-updated-users: "Utilisateur·rice·s actif·ve·s récemment"
recently-registered-users: "Les nouveaux inscrits"
recently-discovered-users: "Utilisateurs récemment découverts"
popular-tags: "Mots-clés populaires"
federated: "Du Fédiverse"
explore: "Explorer {host}"
users-info: "Actuellement, {users} utilisateurs se sont inscrit ici"
explore-fediverse: "Explorer le Fédiverse"
users-info: "Actuellement, {users} utilisateur·rice·s se sont inscrit ici"
common/views/components/reactions-viewer.details.vue:
few-users: "{users} ont réagit avec {reaction}"
common/views/components/url-preview.vue:
enable-player: "Activer la lecture"
disable-player: "Fermer le lecteur"
@ -386,6 +437,7 @@ common/views/components/games/reversi/reversi.room.vue:
black-or-white: "Noirs/Blancs"
black-is: "{} Noirs"
rules: "Règles"
is-llotheo: "Celui ou celle qui a le moins de pièces gagne (Llotheo)"
looped-map: "Carte en boucle"
can-put-everywhere: "Peut poser partout"
settings-of-the-bot: "Configuration du bot"
@ -513,7 +565,10 @@ common/views/components/note-menu.vue:
unpin: "Désépingler"
delete: "Supprimer"
delete-confirm: "Supprimer cette publication ?"
delete-and-edit: "Supprimer et réécrire"
delete-and-edit-confirm: "Êtes-vous sûr de vouloir effacer cette note et la modifier ? Vous perdrez toutes les réactions, renotes et réponses."
remote: "Afficher la note originale"
pin-limit-exceeded: "Vous ne pouvez plus épingler davantage de publications."
common/views/components/user-menu.vue:
mention: "Mention"
mute: "Silencier"
@ -531,8 +586,11 @@ common/views/components/user-menu.vue:
report-abuse-reported: "Transmit à ladministrateur. Merci de votre collaboration."
silence: "Mettre en sourdine"
unsilence: "Enlever la sourdine"
silence-confirm: "Êtes-vous surs de vouloir mettre cet·te utilisateur·rice en sourdine ?"
suspend: "Suspendre"
unsuspend: "Ne plus suspendre"
suspend-confirm: "Êtes-vous surs de vouloir suspendre cet·te utilisateur·rice ?"
unsuspend-confirm: "Êtes-vous sûr de vouloir débloquer cet utilisateur ?"
common/views/components/poll.vue:
vote-to: "Voter pour '{}'"
vote-count: "{} votes"
@ -551,9 +609,11 @@ common/views/components/poll-editor.vue:
remove: "Supprimer ce choix"
add: "+ Ajouter un choix"
destroy: "Annuler ce sondage"
multiple: "Autoriser le multi-choix"
expiration: "Valide jusqu'à"
infinite: "Illimité"
at: "Choisir une date et une durée"
after: "Choisir la durée"
no-more: "Vous ne pouvez pas en ajouter davantage"
deadline-date: "Date déchéance"
deadline-time: "Durée"
@ -564,10 +624,12 @@ common/views/components/poll-editor.vue:
hour: "Heures"
day: "D"
common/views/components/reaction-picker.vue:
choose-reaction: "Choisissez votre réaction"
choose-reaction: "Envoyer une réaction"
input-reaction-placeholder: "ou insérez un émoji"
common/views/components/emoji-picker.vue:
recent-emoji: "Utilisés récemment"
custom-emoji: "Émoji personnalisé"
no-category: "Sans catégorie"
people: "Personnes"
animals-and-nature: "Animaux et nature"
food-and-drink: "Nourriture et boisson"
@ -576,6 +638,14 @@ common/views/components/emoji-picker.vue:
objects: "Objets"
symbols: "Symboles"
flags: "Drapeaux"
common/views/components/settings/app-type.vue:
title: "Mode"
intro: "Vous pouvez choisir, si vous voulez utiliser la disposition de bureau ou mobile."
choices:
auto: "Choisir la disposition automatiquement"
desktop: "Toujours utiliser la disposition de bureau"
mobile: "Toujours utiliser la disposition mobile"
info: "Le rechargement de la page est requis afin d'appliquer les modifications."
common/views/components/signin.vue:
username: "Nom d'utilisateur·rice"
password: "Mot de passe"
@ -586,6 +656,8 @@ common/views/components/signin.vue:
signin-with-github: "Se connecter avec GitHub"
signin-with-discord: "Se connecter avec Discord"
login-failed: "Échec dauthentification. Veuillez vérifier que votre nom dutilisateur et mot de passe sont corrects."
tap-key: "Cliquez sur la clé de sécurité pour vous connecter"
enter-2fa-code: "Entrez votre code de vérification"
common/views/components/signup.vue:
invitation-code: "Code dinvitation"
invitation-info: "Si vous navez pas de code dinvitation, contactez un <a href=\"{}\">administrateur</a>."
@ -653,13 +725,13 @@ common/views/components/visibility-chooser.vue:
followers: "Abonné·e·s"
followers-desc: "Publier à vos abonné·e·s uniquement"
specified: "Direct"
specified-desc: "Publier uniquement aux utilisateurs mentionnés"
specified-desc: "Publier uniquement aux utilisateur·rice·s mentionné·e·s"
local-public: "Local (Public)"
local-public-desc: "Ne pas publier pour les distants"
local-home: "Accueil (local uniquement)"
local-followers: "Local (Abonnés)"
local-followers: "Abonné·e·s (Local uniquement)"
common/views/components/trends.vue:
count: "{} utilisateurs mentionnés"
count: "{} utilisateur·rice·s mentionné·e·s"
empty: "Aucune tendance"
common/views/components/language-settings.vue:
title: "Langue "
@ -690,6 +762,9 @@ common/views/components/profile-editor.vue:
saved: "Profil mis à jour avec succès"
uploading: "En cours denvoi …"
upload-failed: "Échec de l'envoi"
unable-to-process: "L'opération n'a pas pu être complétée"
avatar-not-an-image: "Le fichier sélectionné pour votre avatar n'est pas une image"
banner-not-an-image: "Le fichier sélectionné pour votre bannière n'est pas une image"
email: "Paramètres de messagerie"
email-address: "Adresse de courrier électronique"
email-verified: "Ladresse du courrier électronique a été vérifiée."
@ -709,6 +784,9 @@ common/views/components/profile-editor.vue:
danger-zone: "Zone de danger"
delete-account: "Supprimer le compte"
account-deleted: "Le compte a été supprimé. Cela peut prendre un certain temps avant que toutes les données disparaissent."
profile-metadata: "Métadonnées du profil"
metadata-label: "Étiquette"
metadata-content: "Contenu"
common/views/components/user-list-editor.vue:
users: "Utilisateur·rice"
rename: "Renommer la liste"
@ -722,8 +800,10 @@ common/views/components/user-group-editor.vue:
rename: "Renommer le groupe"
delete: "Supprimer le groupe"
transfer: "Transférer de groupe"
transfer-are-you-sure: "Êtes vous surs de vouloir ajouter @$2 au groupe $1 ?"
transferred: "Groupe transféré"
remove-user: "Enlever un utilisateur de ce groupe"
delete-are-you-sure: "Désirez-vous vraiment supprimer le groupe $1 ?"
deleted: "Supprimé"
invite: "Inviter"
invited: "Invitation envoyée avec succès"
@ -745,6 +825,7 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "Aucune annonce"
have-a-nice-day: "Passez une bonne journée !"
next: "Suivant"
prev: "Précédent"
common/views/widgets/calendar.vue:
year: "Année {}"
month: "{},"
@ -789,6 +870,7 @@ common/views/widgets/tips.vue:
tips-line19: "Plusieurs fenêtres peuvent être détachées en dehors du navigateur."
tips-line20: "Pourcentage sur le widget calendrier qui indique le pourcentage de temps passé"
tips-line21: "Vous pouvez aussi utiliser l'API pour développer des Bots."
tips-line23: "Ai-chan kawaii!"
tips-line24: "Misskey est fonctionnel depuis 2014"
tips-line25: "Vous pouvez recevoir les notifications de Misskey dans un navigateur web compatible"
common/views/pages/not-found.vue:
@ -815,6 +897,7 @@ desktop:
uploading-avatar: "Téléversement du nouvel avatar"
avatar-updated: "Mise à jour de lavatar avec succès"
choose-avatar: "Choisir un avatar"
unable-to-process: "L'opération n'a pas pu être complétée"
invalid-filetype: "Ce format de fichier nest pas pris en charge"
desktop/views/components/activity.chart.vue:
total: "Noirs ... Total"
@ -855,7 +938,7 @@ desktop/views/components/drive.file.vue:
unmark-as-sensitive: "Ne pas marquer comme sensible"
copy-url: "Copier lURL"
download: "Télécharger"
else-files: "Autres..."
else-files: "Avancé"
set-as-avatar: "Utiliser en tant qu'avatar"
set-as-banner: "Utiliser en tant que bannière"
open-in-app: "Ouvrir dans l'application"
@ -865,15 +948,20 @@ desktop/views/components/drive.file.vue:
copied: "Copié"
copied-url-to-clipboard: "L'URL a été copiée dans le presse-papier"
desktop/views/components/drive.folder.vue:
upload-folder: "Emplacement de téléversement par défaut"
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"
unable-to-delete: "Ne peut pas être supprimé"
has-child-files-or-folders: "Ce dossier n'est pas vide, il ne peut pas être supprimé"
contextmenu:
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"
input-new-folder-name: "Entrer un nouveau nom"
else-folders: "Avancé"
set-as-upload-folder: "Spécifier en tant que dossier de téléversement par défaut"
desktop/views/components/drive.vue:
search: "Rechercher"
empty-draghover: "Drop Welcome!"
@ -897,7 +985,7 @@ desktop/views/components/media-video.vue:
sensitive: "Le contenu est NSFW"
click-to-show: "Cliquer pour afficher"
desktop/views/components/followers-window.vue:
followers: "{} abonné·e·s"
followers: "Abonné·e·s de {}"
desktop/views/components/followers.vue:
empty: "Il semble que vous navez pas encore dabonné·e·s."
desktop/views/components/following-window.vue:
@ -918,8 +1006,8 @@ desktop/views/components/note-detail.vue:
deleted: "cette publication a été supprimée"
location: "Géolocalisation"
renote: "Republier"
add-reaction: "Ajouter votre reaction"
undo-reaction: "Inverser la réaction"
add-reaction: "Ajouter une réaction"
undo-reaction: "Annuler la réaction"
desktop/views/components/note.vue:
reply: "Répondre"
renote: "Partager"
@ -979,6 +1067,15 @@ desktop/views/components/settings.2fa.vue:
success: "Sauvegarde des paramètres avec succès !"
failed: "Lopération a échoué. Veuillez vous assurer que le jeton a été saisi correctement."
info: "À partir de maintenant, à chaque fois que vous vous connectez entrez votre mot de passe ainsi que le jeton généré sur votre appareil."
totp-header: "Application d'authentification"
security-key-header: "Clé de sécurité"
security-key: "Pour plus de sécurité, vous pouvez vous connecter à votre compte à l'aide d'une clé de sécurité matérielle qui prend en charge FIDO2. Lorsque vous vous connecterez, vous aurez besoin de la clé de sécurité enregistrée ou d'une application d'authentification avec vous."
last-used: "Dernière utilisation :"
activate-key: "Cliquez pour activer la clé de sécurité"
security-key-name: "Nom de la clé"
something-went-wrong: "Oula ! Il y a eu un problème lors de lenregistrement de la clé."
key-unregistered: "La clé a été supprimée"
use-password-less-login: "Utiliser une connexion sans mot de passe"
common/views/components/media-image.vue:
sensitive: "Contenu sensible"
click-to-show: "Cliquer pour afficher"
@ -1003,15 +1100,20 @@ common/views/components/drive-settings.vue:
max: "Maximale"
in-use: "utilisé"
stats: "Statistiques"
default-upload-folder: "Emplacement par défaut du dossier de transfert"
default-upload-folder-name: "Dossier·s"
change-default-upload-folder: "Changer de dossier"
common/views/components/mute-and-block.vue:
mute-and-block: "Silencés / Bloqués"
mute: "Mettre en sourdine"
block: "En cours blocage"
mute-and-block: "Masqués / Bloqués"
mute: "Mis en sourdine"
block: "Vous avez bloqué"
no-muted-users: "Aucun utilisateur nest mis en sourdine"
no-blocked-users: "Aucun utilisateur nest bloqué"
word-mute: "Filtre de mots"
muted-words: "Mots masqués"
muted-words-description: "Description des mots mis en sourdine"
unmute-confirm: "Ne plus masquer cet utilisateur ?"
unblock-confirm: "Débloquer cet utilisateur ?"
save: "Enregistrer"
common/views/components/password-settings.vue:
reset: "Modifier le mot de passe"
@ -1056,6 +1158,7 @@ desktop/views/components/ui.header.account.vue:
groups: "Groupes"
follow-requests: "Demandes dabonnement"
admin: "Admin"
room: "Pièce"
desktop/views/components/ui.header.nav.vue:
game: "Jeux"
desktop/views/components/ui.header.notifications.vue:
@ -1088,7 +1191,12 @@ admin/views/index.vue:
abuse: "Abus"
queue: "File dattente"
logs: "Journaux"
db: "Base de données"
back-to-misskey: "Retour vers Misskey"
admin/views/db.vue:
tables: "Tables"
vacuum: "Vacuum"
vacuum-info: "Range la base de données. Conserve les données intactes et réduit l'utilisation du disque. Cela se fait généralement automatiquement et périodiquement."
admin/views/dashboard.vue:
dashboard: "Tableau de bord"
accounts: "Comptes"
@ -1106,11 +1214,13 @@ admin/views/queue.vue:
deliver: "Délivrées"
inbox: "Reçues"
db: "Base de données"
objectStorage: "Stockage d'objets"
state: "État"
states:
active: "en cours"
delayed: "Programmé"
waiting: "En file d'attente"
result-is-truncated: "Le résultat est tronqué"
other-queues: "Autres files dattente"
admin/views/logs.vue:
logs: "Journaux"
@ -1143,12 +1253,14 @@ admin/views/instance.vue:
languages-desc: "Vous pouvez en définir plus dune, séparées par des espaces."
tos-url: "URL des conditions d'utilisation"
repository-url: "URL du dépôt"
feedback-url: "URL pour les commentaires"
maintainer-config: "Informations de ladministrateur"
maintainer-name: "Nom de ladministrateur"
maintainer-email: "Contact administratif"
advanced-config: "Autres réglages"
note-and-tl: "Notes et fils"
drive-config: "Paramètres du lecteur"
use-object-storage: "Utiliser le stockage d'objets"
object-storage-base-url: "URL"
object-storage-prefix: "Préfixe"
object-storage-endpoint: "Point de terminaison"
@ -1187,6 +1299,7 @@ admin/views/instance.vue:
discord-integration-client-id: "ID client"
discord-integration-client-secret: "Secret client"
proxy-account-config: "Compte proxy"
proxy-account-info: "Un compte proxy se comporte, dans certaines conditions, comme un·e abonné·e distant pour les utilisateurs d'autres instances.\nExemple : quand un·e utilisateur·rice distant·e est ajouté·e à une liste, ses publications ne serait pas visibles sur l'instance si personne ne le·la suit. Le compte proxy va donc le·la suivre pour que ses publications soient acheminées."
proxy-account-username: "Nom dutilisateur du compte proxy"
proxy-account-username-desc: "Spécifiez le nom dutilisateur du compte utilisé comme proxy."
proxy-account-warn: "Avant dentamer cette action, vous devez au préalable avoir créé un compte avec ce nom dutilisateur."
@ -1212,6 +1325,7 @@ admin/views/instance.vue:
smtp-auth: "Effectuer une authentification SMTP"
smtp-user: "Utilisateur SMTP"
smtp-pass: "Mot de passe SMTP"
test-email: "Test"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "Activer ServiceWorker"
serviceworker-info: "Devrait être activé pour les notifications push."
@ -1224,7 +1338,7 @@ admin/views/charts.vue:
per-hour: "par heure"
federation: "Fédération"
notes: "Publications"
users: "Utilisateurs"
users: "Utilisateur·rice·s"
drive: "Lecteur"
network: "Réseau"
charts:
@ -1234,8 +1348,8 @@ admin/views/charts.vue:
local-notes: "Nombre des publications : augmentation/diminution (Local)"
remote-notes: "Nombre de publications : augmentation/diminution (distants)"
notes-total: "Total des notes"
users: "Nombre dutilisateurs : augmentation/diminution"
users-total: "Nombre total des utilisateurs"
users: "Nombre dutilisateur·rice·s : augmentation/diminution"
users-total: "Nombre total des utilisateur·rice·s"
active-users: "Utilisateur·rice·s actif·ve·s"
drive: "Capacité utilisée comme stockage : augmentation/diminution"
drive-total: "Utilisation totale du lecteur"
@ -1266,6 +1380,8 @@ admin/views/drive.vue:
unmark-as-sensitive: "Ne pas marquer comme sensible"
marked-as-sensitive: "Marqué comme sensible"
unmarked-as-sensitive: "Marqué comme non sensible"
clean-remote-files: "Nettoyer le cache des fichiers distants"
clean-remote-files-are-you-sure: "Êtes-vous sûr de vouloir effacer tout les fichiers distants mis en cache ?"
clean-up: "Nettoyage"
admin/views/users.vue:
operation: "Actions"
@ -1287,6 +1403,9 @@ admin/views/users.vue:
update-remote-user: "Mettre à jour les informations de lutilisateur·rice distant·e"
remote-user-updated: "Les informations de lutilisateur·rice distant·e ont étés mis à jour"
delete-all-files: "Supprimer tous les fichiers"
delete-all-files-confirm: "Êtes vous surs de vouloir supprimer tous les fichiers ?"
username: "Nom d'utilisateur·rice"
host: "Hôte"
users:
title: "Utilisateur·rice·s"
sort:
@ -1298,6 +1417,7 @@ admin/views/users.vue:
state:
title: "État"
all: "Tout"
available: "Disponible"
admin: "Admin"
moderator: "Modérateur"
adminOrModerator: "Administrateur/Modérateur"
@ -1317,11 +1437,18 @@ admin/views/moderators.vue:
added: "Ajouté en tant que modérateur"
remove: "Révoquer"
removed: "Le modérateur a été révoqué"
logs:
title: "Journaux"
moderator: "Modérateurs"
type: "Actions"
at: "Date de modification"
info: "Informations"
admin/views/emoji.vue:
add-emoji:
title: "Ajouter un émoji"
name: "Nom de lémoji"
name-desc: "Vous pouvez utiliser les caractères a~z 0~9 _"
category: "Catégories"
aliases: "Aliases"
aliases-desc: "Vous pouvez définir plus dun, séparés par des espaces."
url: "URL de limage"
@ -1374,7 +1501,7 @@ admin/views/federation.vue:
lastCommunicatedAtAsc: "La date et l'heure des interactions plus anciennes"
lastCommunicatedAtDesc: "La date et l'heure des nouvelles interactions"
notesDesc: "Description des notes"
usersAsc: "Peu d'abonnés"
usersAsc: "Peu d'abonné·e·s"
followingAsc: "Les moins suivies"
followingDesc: "Ayant le plus d'abonné·e·s"
followersAsc: "Ayant le moins d'abonné·e·s"
@ -1389,11 +1516,12 @@ admin/views/federation.vue:
charts: "Graphs"
chart-srcs:
requests: "Requêtes"
users: "Nombre dutilisateurs·trices : augmentation/diminution"
users: "Nombre dutilisateur·trice·s : augmentation/diminution"
users-total: "Nombre total des utilisateur·rice·s"
notes: "Augmentation/diminution du nombre des notes"
notes-total: "Nombre total des notes"
ff: "Augmentation des abonné·e·s"
ff-total: "Nombre total d'abonnements"
drive-usage: "Augmentation et diminution de la capacité stockage"
drive-usage-total: "Utilisation totale du stockage"
drive-files-total: "Nombre total des fichiers sur le Drive"
@ -1431,7 +1559,7 @@ desktop/views/pages/user-list.users.vue:
desktop/views/pages/user/user.followers-you-know.vue:
title: "Abonné·e·s que vous connaissez"
loading: "Chargement en cours"
no-users: "Aucun abonné connu"
no-users: "Aucun·e abonné·e connu·e"
desktop/views/pages/user/user.friends.vue:
title: "Mentions fréquentes"
loading: "Chargement en cours"
@ -1593,6 +1721,8 @@ mobile/views/pages/search.vue:
not-found: "Aucune publication trouvée pour « {q} »."
mobile/views/pages/selectdrive.vue:
select-file: "Choisissez un fichier"
mobile/views/pages/notifications.vue:
notifications: "Notifications"
mobile/views/pages/settings.vue:
signed-in-as: "Connecté·e en tant que {}"
mobile/views/pages/user.vue:
@ -1646,11 +1776,12 @@ deck/deck.user-column.vue:
follows-you: "Vous suit"
posts: "Notes"
following: "Suit"
followers: "Abonnés"
followers: "Abonné·e·s"
images: "Images"
activity: "Activité"
timeline: "Fil dactualité"
pinned-notes: "Notes épinglées"
pinned-page: "Page épinglée"
docs:
edit-this-page-on-github: "Vous avez trouvé une erreur ou vous voulez contribuer à la documentation ?"
edit-this-page-on-github-link: "Éditez cette page sur GitHub !"
@ -1682,12 +1813,18 @@ pages:
read-page: "Voir la source"
page-created: "Page a été créée !"
page-updated: "A mis à jour la page"
name-already-exists: "Une page portant le même nom existe déjà"
title-invalid-name: "LURL de la page spécifiée nest pas valide"
are-you-sure-delete: "Confirmez-vous la suppression de cette page ?"
page-deleted: "La page a bien été supprimée."
edit-this-page: "Éditer cette page"
pin-this-page: "Épingler sur votre profil"
unpin-this-page: "Désépingler"
view-source: "Afficher la source"
view-page: "Afficher la page"
like: "Bien"
unlike: "Je naime pas"
liked-pages: "Pages favorites"
my-pages: "Mes pages"
inspector: "Inspecteur"
content: "Bloc de page"
@ -1697,6 +1834,7 @@ pages:
url: "URL de page"
summary: "Résumé de page"
align-center: "Centrée"
hide-title-when-pinned: "Masquer le titre de la page lorsque celle-ci est épinglée au profil"
font: "Police de caractères"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
@ -1749,12 +1887,24 @@ pages:
inc: "Augmenter le chiffre"
_button:
text: "Titre"
colored: "Couleur"
action: "L'opération lorsque le bouton sera pressé"
_action:
dialog: "Afficher une fenêtre de dialogue"
_dialog:
content: "Contenu"
resetRandom: "Réinitialiser le nombre aléatoire"
pushEvent: "Envoyer un évènement"
_pushEvent:
event: "Nom de l'évènement"
message: "Message à afficher lorsque appuyé"
variable: "Variable à envoyer"
no-variable: "Aucune"
radioButton: "Choix"
_radioButton:
name: "Nom de la variable"
title: "Titre"
default: "Valeur par défaut"
script:
categories:
flow: "Contrôle"
@ -1765,9 +1915,11 @@ pages:
value: "Valeur"
fn: "Fonction"
text: "Actions texte"
convert: "Convertir"
list: "Listes"
blocks:
text: "Texte"
multiLineText: "Texte (Multi-lignes)"
textList: "Liste de texte"
strLen: "Longueur du texte"
_strLen:
@ -1775,6 +1927,8 @@ pages:
strPick: "Extraire un caractère"
_strPick:
arg1: "Texte"
arg2: "Position du joueur"
strReplace: "Remplacement de texte"
_strReplace:
arg1: "Texte"
arg2: "Avant le remplacement"
@ -1801,9 +1955,11 @@ pages:
_divide:
arg1: "A"
arg2: "B"
_remind:
_mod:
arg1: "A"
arg2: "B"
_round:
arg1: "Numérique"
eq: "A et B sont équivalents"
_eq:
arg1: "A"
@ -1836,6 +1992,7 @@ pages:
_gtEq:
arg1: "A"
arg2: "B"
if: "Branche"
_if:
arg1: "Si"
arg2: "donc"
@ -1853,6 +2010,7 @@ pages:
randomPick: "Choisir aléatoirement depuis la liste"
_randomPick:
arg1: "Listes"
dailyRandom: "Aléatoire (Quotidien pour chaque utilisateur)"
_dailyRandom:
arg1: "Probabilité"
_dailyRannum:
@ -1860,19 +2018,29 @@ pages:
arg2: "Maximum"
_dailyRandomPick:
arg1: "Listes"
seedRandom: "Aléatoire (graine)"
_seedRandom:
arg1: "Graine"
arg2: "Probabilité"
seedRannum: "Nombre aléatoire (Graine)"
_seedRannum:
arg1: "Graine"
arg2: "Min"
arg3: "Max"
seedRandomPick: "Sélection aléatoire dans une liste (Graine)"
_seedRandomPick:
arg1: "Graine"
arg2: "Listes"
DRPWPM: "Sélection aléatoire à partir d'une liste pondérée (mise à jour quotidienne par utilisateur)"
_DRPWPM:
arg1: "Liste de texte"
pick: "Sélectionner dans la liste"
_pick:
arg1: "Listes"
arg2: "Position"
listLen: "Longueur de la liste"
_listLen:
arg1: "Listes"
number: "Numérique"
stringToNumber: "Chaîne en chiffres"
_stringToNumber:
@ -1880,12 +2048,14 @@ pages:
numberToString: "Chiffres en chaîne"
_numberToString:
arg1: "Numérique"
splitStrByLine: "Séparer le texte par lignes"
_splitStrByLine:
arg1: "Texte"
ref: "Variables"
fn: "Fonction"
_fn:
slots: "Emplacement"
slots-info: "Veuillez délimiter chaque emplacement par un saut de ligne"
arg1: "Sortie"
for: "Répéter"
_for:
@ -1901,3 +2071,65 @@ pages:
emptySlot: "Slot vide"
enviromentVariables: "Variables d'environnement"
pageVariables: "Élément de page"
argVariables: "Entrée vide"
room:
add-furniture: "Placer des meubles"
translate: "Déplacer"
rotate: "Tourner"
exit: "Retour"
remove: "Enlever"
save: "Enregistrer"
saved: "enregistré"
clear: "Tout enlever"
clear-confirm: "Désirez-vous enlever tout les meubles de votre chambre ?"
leave-confirm: "Vous avez des modifications non-sauvegardées. Voulez-vous vraiment quitter ?"
chooseImage: "Sélectionnez une image"
room-type: "Type de chambre"
carpet-color: "Couleur du tapis"
rooms:
default: "Par défaut"
washitsu: "Style japonnais"
furnitures:
milk: "Lait en carton"
bed: "Lit"
low-table: "Table basse"
desk: "Bureau"
chair: "Chaise"
chair2: "Chaise 2"
fan: "Ventilateur"
pc: "Ordinateur"
plant: "Plante dintérieur"
plant2: "Plante dintérieur 2"
eraser: "Gomme"
pencil: "Crayon"
pudding: "Pudding"
cardboard-box: "Boîte en carton"
cardboard-box2: "Boîte en carton 2"
cardboard-box3: "Boîte en carton 3"
book: "Livre"
book2: "Livre 2"
piano: "Piano"
facial-tissue: "Mouchoirs en papier"
server: "Serveurs"
moon: "Lune"
corkboard: "Tableau en liège"
mousepad: "Tapis de souris"
monitor: "Écran"
keyboard: "Clavier"
carpet-stripe: "Tapis (zébré)"
mat: "Tapis"
color-box: "Étagère"
wall-clock: "Horloge murale"
photoframe: "Cadre photo"
cube: "Cube"
tv: "Téléviseur"
pinguin: "Pingouin"
rubik-cube: "Cube de Rubik"
poster-h: "Affiche (horizontale)"
poster-v: "Affiche (verticale)"
sofa: "Canapé"
spiral: "Escaliers en spirale"
bin: "Corbeille"
cup-noodle: "Bol de nouilles"
holo-display: "Affichage holographique"
energy-drink: "Boisson énergétique"

View File

@ -19,9 +19,6 @@ common:
drive: "ドライブ"
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんかもしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんかMisskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
adblock:
detected: "広告ブロッカーを無効にしてください"
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
application-authorization: "アプリの連携"
close: "閉じる"
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
@ -36,6 +33,20 @@ common:
signout: "ログアウト"
reload-to-apply-the-setting: "この設定を反映するにはページをリロードする必要があります。今すぐリロードしますか?"
fetching-as-ap-object: "連合に照会中"
unfollow-confirm: "{name}さんをフォロー解除しますか?"
delete-confirm: "この投稿を削除しますか?"
signin-required: "ログインしてください"
notification-type: "通知の種類"
notification-types:
all: "すべて"
pollVote: "投票"
follow: "フォロー"
receiveFollowRequest: "フォローリクエスト"
reply: "返信"
quote: "引用"
renote: "Renote"
mention: "言及"
reaction: "リアクション"
got-it: "わかった"
customization-tips:
@ -96,6 +107,12 @@ common:
"read:reactions": "リアクションを見る"
"write:reactions": "リアクションを操作する"
"write:votes": "投票する"
"read:pages": "ページを見る"
"write:pages": "ページを操作する"
"read:page-likes": "ページのいいねを見る"
"write:page-likes": "ページのいいねを操作する"
"read:user-groups": "ユーザーグループを見る"
"write:user-groups": "ユーザーグループを操作する"
empty-timeline-info:
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
@ -125,9 +142,11 @@ common:
geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー"
enter-username: "ユーザー名を入力してください"
specified-recipient: "宛先"
add-visible-user: "ユーザーを追加"
cw-placeholder: "内容への注釈 (オプション)"
username-prompt: "ユーザー名を入力してください"
enter-file-name: "ファイル名を編集"
weekday-short:
sunday: "日"
@ -193,6 +212,8 @@ common:
other: "その他"
appearance: "デザイン"
behavior: "動作"
reactions: "リアクション"
reactions-description: "リアクションピッカーに表示するリアクションを改行で区切って設定します。"
fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
note-visibility: "投稿の公開範囲"
@ -200,6 +221,11 @@ common:
remember-note-visibility: "投稿の公開範囲を記憶する"
web-search-engine: "ウェブ検索エンジン"
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
paste: "ペースト"
pasted-file-name: "ペーストされたファイル名のテンプレート"
pasted-file-name-desc: "例: \"yyyy-MM-dd HH-mm-ss [{{number}}]\" → \"2018-03-20 21-30-24 1\""
paste-dialog: "ペースト時にファイル名を編集"
paste-dialog-desc: "ペースト時にファイル名を編集するダイアログを表示するようにします。"
keep-cw: "CW保持"
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
@ -207,6 +233,7 @@ common:
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
disable-showing-animated-images: "アニメーション画像を再生しない"
enable-quick-notification-view: "通知のクイックビューを有効にする"
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
always-show-nsfw: "常に閲覧注意のメディアを表示する"
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
@ -237,7 +264,7 @@ common:
deck-column-width-wide: "広"
use-shadow: "UIに影を使用"
rounded-corners: "UIの角を丸める"
circle-icons: "円形のアイコンを使用"
circle-icons: "円形のアバターを使用"
contrasted-acct: "ユーザー名にコントラストを付ける"
wallpaper: "壁紙"
choose-wallpaper: "壁紙を選択"
@ -282,6 +309,22 @@ common:
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
load-raw-images: "添付された画像を高画質で表示する"
load-remote-media: "リモートサーバーのメディアを表示する"
sync: "同期"
save: "保存"
saved: "保存しました"
preview: "プレビュー"
home-profile: "ホームのプロファイル"
deck-profile: "デッキのプロファイル"
room: "ルーム"
_room:
graphicsQuality: "グラフィックの品質"
_graphicsQuality:
ultra: "最高"
high: "高"
medium: "中"
low: "低"
cheep: "最低"
useOrthographicCamera: "平行投影カメラを使用"
search: "検索"
delete: "削除"
@ -371,11 +414,17 @@ common/views/pages/explore.vue:
popular-users: "人気のユーザー"
recently-updated-users: "最近投稿したユーザー"
recently-registered-users: "新規ユーザー"
recently-discovered-users: "最近発見されたユーザー"
popular-tags: "人気のタグ"
federated: "連合"
explore: "{host}を探索"
explore-fediverse: "Fediverseを探索"
users-info: "現在{users}ユーザーが登録されています"
common/views/components/reactions-viewer.details.vue:
few-users: "{users}が{reaction}をリアクション"
many-users: "{users}と他{omitted}人が{reaction}をリアクション"
common/views/components/url-preview.vue:
enable-player: "プレイヤーを開く"
disable-player: "プレイヤーを閉じる"
@ -557,7 +606,10 @@ common/views/components/note-menu.vue:
unpin: "ピン留め解除"
delete: "削除"
delete-confirm: "この投稿を削除しますか?"
delete-and-edit: "削除して編集"
delete-and-edit-confirm: "この投稿を削除してもう一度編集しますかこの投稿へのリアクション、Renote、返信も全て削除されます。"
remote: "投稿元で見る"
pin-limit-exceeded: "これ以上ピン留めできません。"
common/views/components/user-menu.vue:
mention: "メンション"
@ -622,7 +674,9 @@ common/views/components/reaction-picker.vue:
input-reaction-placeholder: "または絵文字を入力"
common/views/components/emoji-picker.vue:
recent-emoji: "最近使った絵文字"
custom-emoji: "カスタム絵文字"
no-category: "カテゴリなし"
people: "人"
animals-and-nature: "動物&自然"
food-and-drink: "食べ物&飲み物"
@ -632,6 +686,15 @@ common/views/components/emoji-picker.vue:
symbols: "記号"
flags: "旗"
common/views/components/settings/app-type.vue:
title: "モード"
intro: "デスクトップ版とモバイル版のどちらを使うかを指定できます。"
choices:
auto: "自動で選択"
desktop: "デスクトップ版に固定"
mobile: "モバイル版に固定"
info: "変更はページの再度読み込み後に反映されます。"
common/views/components/signin.vue:
username: "ユーザー名"
password: "パスワード"
@ -642,6 +705,8 @@ common/views/components/signin.vue:
signin-with-github: "GitHubでログイン"
signin-with-discord: "Discordでログイン"
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
tap-key: "セキュリティキーをクリックしてログイン"
enter-2fa-code: "認証コードを入力してください"
common/views/components/signup.vue:
invitation-code: "招待コード"
@ -745,7 +810,7 @@ common/views/components/profile-editor.vue:
you-can-include-hashtags: "ハッシュタグを含めることができます。"
language: "言語"
birthday: "誕生日"
avatar: "アイコン"
avatar: "アバター"
banner: "バナー"
is-cat: "このアカウントはCatです"
is-bot: "このアカウントはBotです"
@ -758,6 +823,9 @@ common/views/components/profile-editor.vue:
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
unable-to-process: "操作を完了できません"
avatar-not-an-image: "アバターとして指定したファイルは画像ではありません"
banner-not-an-image: "バナーとして指定したファイルは画像ではありません"
email: "メール設定"
email-address: "メールアドレス"
email-verified: "メールアドレスが確認されました"
@ -777,6 +845,9 @@ common/views/components/profile-editor.vue:
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
profile-metadata: "プロフィール補足情報"
metadata-label: "ラベル"
metadata-content: "内容"
common/views/components/user-list-editor.vue:
users: "ユーザー"
@ -820,6 +891,7 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "お知らせはありません"
have-a-nice-day: "良い一日を!"
next: "次"
prev: "前"
common/views/widgets/calendar.vue:
year: "{}年"
@ -903,6 +975,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択"
unable-to-process: "操作を完了できません"
invalid-filetype: "この形式のファイルはサポートされていません"
desktop/views/components/activity.chart.vue:
@ -942,7 +1015,7 @@ desktop/views/components/drive-window.vue:
used: "使用中"
desktop/views/components/drive.file.vue:
avatar: "アイコン"
avatar: "アバター"
banner: "バナー"
nsfw: "閲覧注意"
contextmenu:
@ -951,8 +1024,8 @@ desktop/views/components/drive.file.vue:
unmark-as-sensitive: "閲覧注意を解除"
copy-url: "URLをコピー"
download: "ダウンロード"
else-files: "その他..."
set-as-avatar: "アイコンに設定"
else-files: "その他"
set-as-avatar: "アバターに設定"
set-as-banner: "バナーに設定"
open-in-app: "アプリで開く"
add-app: "アプリを追加"
@ -962,15 +1035,20 @@ desktop/views/components/drive.file.vue:
copied-url-to-clipboard: "URLをクリップボードにコピーしました"
desktop/views/components/drive.folder.vue:
upload-folder: "既定アップロード先"
unable-to-process: "操作を完了できません"
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
unhandled-error: "不明なエラー"
unable-to-delete: "削除できません"
has-child-files-or-folders: "このフォルダは空でないため、削除できません。"
contextmenu:
move-to-this-folder: "このフォルダへ移動"
show-in-new-window: "新しいウィンドウで表示"
rename: "名前を変更"
rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください"
else-folders: "その他"
set-as-upload-folder: "既定アップロード先に設定"
desktop/views/components/drive.vue:
search: "検索"
@ -1096,6 +1174,16 @@ desktop/views/components/settings.2fa.vue:
success: "設定が完了しました!"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
totp-header: "認証アプリ"
security-key-header: "セキュリティキー"
security-key: "セキュリティを強化するために、FIDO2をサポートするハードウェアセキュリティキーを使用してアカウントにログインできます。 サインインの際は、登録されたセキュリティキーまたは認証アプリが必要になります。"
last-used: "最後の使用:"
activate-key: "クリックしてセキュリティキーをアクティベートしてください"
security-key-name: "キー名"
register-security-key: "キーの登録を完了"
something-went-wrong: "わー! キーを登録する際に問題が発生しました:"
key-unregistered: "キーが削除されました"
use-password-less-login: "パスワードなしのログインを使用"
common/views/components/media-image.vue:
sensitive: "閲覧注意"
@ -1124,6 +1212,9 @@ common/views/components/drive-settings.vue:
max: "容量"
in-use: "使用中"
stats: "統計"
default-upload-folder: "既定のアップロード先フォルダ"
default-upload-folder-name: "フォルダ"
change-default-upload-folder: "フォルダを変更"
common/views/components/mute-and-block.vue:
mute-and-block: "ミュートとブロック"
@ -1134,6 +1225,8 @@ common/views/components/mute-and-block.vue:
word-mute: "ワードミュート"
muted-words: "ミュートされたキーワード"
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
unmute-confirm: "このユーザーをミュート解除しますか?"
unblock-confirm: "このユーザーをブロック解除しますか?"
save: "保存"
common/views/components/password-settings.vue:
@ -1185,6 +1278,7 @@ desktop/views/components/ui.header.account.vue:
groups: "グループ"
follow-requests: "フォロー申請"
admin: "管理"
room: "ルーム"
desktop/views/components/ui.header.nav.vue:
game: "ゲーム"
@ -1226,8 +1320,15 @@ admin/views/index.vue:
abuse: "スパム報告"
queue: "ジョブキュー"
logs: "ログ"
db: "データベース"
back-to-misskey: "Misskeyに戻る"
admin/views/db.vue:
tables: "テーブル"
vacuum: "バキューム"
vacuum-info: "データベースの掃除を行います。データはそのままで、ディスク使用量を減らします。通常この操作は自動で定期的に行われます。"
vacuum-exclamation: "バキュームを行うと、しばらくの間データベースの負荷が高くなり、ユーザーの操作を受け付けなくなる場合があります。"
admin/views/dashboard.vue:
dashboard: "ダッシュボード"
accounts: "アカウント"
@ -1309,7 +1410,9 @@ admin/views/instance.vue:
object-storage-s3-info-here: "こちら"
object-storage-gcs-info: "Google Cloud Storageをオブジェクトストレージとして使用する場合、「エンドポイント」は storage.googleapis.com に設定し、「リージョン」は空欄にします。"
cache-remote-files: "リモートのファイルをキャッシュする"
cache-remote-files-desc: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。そのためサーバーのストレージを節約できますが、プライバシー設定で直リンクを無効にしているユーザーにはファイルが見えなくなったり、サムネイルが生成されないので通信量が増加します。通常はこの設定をオンにしておくことをおすすめします。"
cache-remote-files-desc: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。そのためサーバーのストレージを節約できますが、プライバシー設定で直リンクを無効にしているユーザーにはファイルが見えなくなったり、サムネイルが生成されないので通信量が増加します。通常はこの設定をオンにするか次のリモートファイルのプロキシを有効にすることをおすすめします。"
proxy-remote-files: "リモートのファイルをプロキシする"
proxy-remote-files-desc: "この設定を有効にすると、未保存または保存容量超過で削除されたリモートファイルをローカルでプロキシし、サムネイルも生成するようになります。"
local-drive-capacity-mb: "ローカルユーザーひとりあたりのドライブ容量"
remote-drive-capacity-mb: "リモートユーザーひとりあたりのドライブ容量"
mb: "メガバイト単位"
@ -1366,6 +1469,7 @@ admin/views/instance.vue:
smtp-auth: "SMTP認証を行う"
smtp-user: "SMTPユーザー"
smtp-pass: "SMTPパスワード"
test-email: "テスト"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "ServiceWorkerを有効にする"
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
@ -1448,6 +1552,8 @@ admin/views/users.vue:
remote-user-updated: "リモートユーザー情報を更新しました"
delete-all-files: "すべてのファイルを削除"
delete-all-files-confirm: "すべてのファイルを削除しますか?"
username: "ユーザー名"
host: "ホスト"
users:
title: "ユーザー"
sort:
@ -1459,6 +1565,7 @@ admin/views/users.vue:
state:
title: "状態"
all: "すべて"
available: "利用可能"
admin: "管理者"
moderator: "モデレーター"
adminOrModerator: "管理者+モデレーター"
@ -1479,12 +1586,19 @@ admin/views/moderators.vue:
added: "モデレーターを登録しました"
remove: "解除"
removed: "モデレーター登録を解除しました"
logs:
title: "ログ"
moderator: "モデレーター"
type: "操作"
at: "日時"
info: "情報"
admin/views/emoji.vue:
add-emoji:
title: "絵文字の登録"
name: "絵文字名"
name-desc: "a~z 0~9 _ の文字が使えます。"
category: "カテゴリ"
aliases: "エイリアス"
aliases-desc: "スペースで区切って複数設定できます。"
url: "絵文字画像URL"
@ -1818,6 +1932,9 @@ mobile/views/pages/search.vue:
mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択"
mobile/views/pages/notifications.vue:
notifications: "通知"
mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中"
@ -1882,6 +1999,7 @@ deck/deck.user-column.vue:
activity: "アクティビティ"
timeline: "タイムライン"
pinned-notes: "ピン留めされた投稿"
pinned-page: "ピン留めされたページ"
docs:
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
@ -1918,9 +2036,14 @@ pages:
read-page: "ソースを表示中"
page-created: "ページを作成しました"
page-updated: "ページを更新しました"
name-already-exists: "指定されたページURLは既に存在しています"
title-invalid-name: "不正なページURLです"
text-invalid-name: "空白でないか確認してください"
are-you-sure-delete: "このページを削除しますか?"
page-deleted: "ページを削除しました"
edit-this-page: "このページを編集"
pin-this-page: "ピン留め"
unpin-this-page: "ピン留め解除"
view-source: "ソースを表示"
view-page: "ページを見る"
like: "いいね"
@ -1939,6 +2062,7 @@ pages:
url: "ページURL"
summary: "ページの要約"
align-center: "中央寄せ"
hide-title-when-pinned: "ピン留めされているときにタイトルを非表示"
font: "フォント"
fontSerif: "セリフ"
fontSansSerif: "サンセリフ"
@ -2000,12 +2124,26 @@ pages:
_button:
text: "タイトル"
colored: "色付き"
action: "ボタンを押したときの動作"
_action:
dialog: "ダイアログを表示する"
_dialog:
content: "内容"
resetRandom: "乱数をリセット"
pushEvent: "イベントを送信させる"
_pushEvent:
event: "イベント名"
message: "押したときに表示するメッセージ"
variable: "送信する変数"
no-variable: "なし"
radioButton: "選択肢"
_radioButton:
name: "変数名"
title: "タイトル"
values: "改行で区切った選択肢"
default: "デフォルト値"
script:
categories:
@ -2060,10 +2198,13 @@ pages:
_divide:
arg1: "A"
arg2: "B"
remind: "÷ 割った余り"
_remind:
mod: "÷ 割った余り"
_mod:
arg1: "A"
arg2: "B"
round: "小数を丸める"
_round:
arg1: "数値"
eq: "AとBが同じ"
_eq:
arg1: "A"
@ -2144,6 +2285,9 @@ pages:
_pick:
arg1: "リスト"
arg2: "位置"
listLen: "リストの長さを取得"
_listLen:
arg1: "リスト"
number: "数値"
stringToNumber: "テキストを数値に"
_stringToNumber:
@ -2176,3 +2320,65 @@ pages:
enviromentVariables: "環境変数"
pageVariables: "ページ要素"
argVariables: "入力スロット"
room:
add-furniture: "家具を置く"
translate: "移動"
rotate: "回転"
exit: "戻る"
remove: "しまう"
save: "保存"
saved: "保存しました"
clear: "片付け"
clear-confirm: "全ての家具をしまいますか?"
leave-confirm: "未保存の変更があります、移動しますか?"
chooseImage: "画像を選択"
room-type: "部屋のタイプ"
carpet-color: "床の色"
rooms:
default: "デフォルト"
washitsu: "和室"
furnitures:
milk: "牛乳パック"
bed: "ベッド"
low-table: "ローテーブル"
desk: "デスク"
chair: "チェア"
chair2: "チェア2"
fan: "換気扇"
pc: "パソコン"
plant: "観葉植物"
plant2: "観葉植物2"
eraser: "消しゴム"
pencil: "鉛筆"
pudding: "プリン"
cardboard-box: "段ボール箱"
cardboard-box2: "段ボール箱2"
cardboard-box3: "段ボール箱3"
book: "本"
book2: "本2"
piano: "ピアノ"
facial-tissue: "ティッシュボックス"
server: "サーバー"
moon: "月"
corkboard: "コルクボード"
mousepad: "マウスパッド"
monitor: "モニター"
keyboard: "キーボード"
carpet-stripe: "カーペット(縞)"
mat: "マット"
color-box: "カラーボックス"
wall-clock: "壁掛け時計"
photoframe: "額縁"
cube: "キューブ"
tv: "テレビ"
pinguin: "ピンギン"
rubik-cube: "ルービックキューブ"
poster-h: "ポスター(横長)"
poster-v: "ポスター(縦長)"
sofa: "ソファ"
spiral: "螺旋階段"
bin: "ゴミ箱"
cup-noodle: "カップ麺"
holo-display: "ホログラフィックディスプレイ"
energy-drink: "エナジードリンク"

View File

@ -18,15 +18,19 @@ common:
drive: "ドライブ"
drive-desc: "「こないだの画像、どこやったかな……また投稿したいんやけど……」「さっきのファイルあのフォルダに直しといて」そんなこと言わんとって。Misskeyはもとからドライブ機能持っとるさかい、心配あらへん。ファイルの「わけわけ」したってな。"
outro: "Misskeyの機能は無限大や知らんけど。知らん言うとるやんけ、あんたが見に行けやMisskeyは分散型SNSやから、ここがあかんくても他がある。阪神でもオリックスでもワイは応援するで"
adblock:
detected: "広告ブロッカーを無効にしてや"
warning: "<strong>Misskeyは広告を掲載してへん</strong>けど、広告をブロックしはる機能がおると一部の機能が利用できんくなったり、不具合が発生するかも分からん。知らんけど。"
application-authorization: "アプリの連携"
close: "さいなら"
do-not-copy-paste: "ここにコードを入力したり張り付けたりせんといてください。アカウントが不正利用されるかも分からん。知らんけど。"
load-more: "もっとあらへんのか!"
enter-password: "パスワードを入れてや"
2fa: "二段階認証"
delete-confirm: "この投稿を削除してもええか?"
notification-types:
all: "すべて"
follow: "フォロー"
reply: "返す"
renote: "Renote"
reaction: "リアクション"
got-it: "ほい"
customization-tips:
title: "カスタマイズのヒント"
@ -122,7 +126,11 @@ common:
blocking: "ブロック"
password: "パスワード"
other: "その他"
reactions: "リアクション"
timeline: "タイムライン"
save: "保存"
saved: "保存したで!"
preview: "試してみる"
search: "検索"
delete: "削除"
loading: "読み込み中"
@ -363,6 +371,8 @@ common/views/components/emoji-picker.vue:
objects: "物"
symbols: "記号"
flags: "旗"
common/views/components/settings/app-type.vue:
info: "ページもっぺん読み込んだら反映したるで。"
common/views/components/signin.vue:
username: "ユーザー名"
password: "パスワード"
@ -456,7 +466,7 @@ common/views/components/profile-editor.vue:
description: "自己紹介"
language: "言語"
birthday: "誕生日"
avatar: "アイコン"
avatar: "アバター"
banner: "バナー"
is-cat: "このアカウントはCatやで"
is-bot: "このアカウントはBotやで"
@ -468,6 +478,7 @@ common/views/components/profile-editor.vue:
saved: "プロフィールを保存したで"
uploading: "アップロードしとります"
upload-failed: "これアップロードでけへんわ"
unable-to-process: "あかん、無理やわ"
email: "メール設定"
email-address: "メールアドレス"
email-verified: "このメールアドレスOKや"
@ -561,6 +572,7 @@ desktop:
uploading-avatar: "新しいアバターをアップロードしとるで"
avatar-updated: "アバターを更新したで"
choose-avatar: "アバターにする画像選んでや"
unable-to-process: "あかん、無理やわ"
invalid-filetype: "この形式のファイル無理やねん"
desktop/views/components/activity.chart.vue:
total: "黒いの ... 全部"
@ -592,7 +604,7 @@ desktop/views/components/crop-window.vue:
desktop/views/components/drive-window.vue:
used: "使うとる"
desktop/views/components/drive.file.vue:
avatar: "アイコン"
avatar: "アバター"
banner: "バナー"
nsfw: "見たらあかんで"
contextmenu:
@ -601,8 +613,8 @@ desktop/views/components/drive.file.vue:
unmark-as-sensitive: "やっぱ見せたるわ"
copy-url: "URLをコピー"
download: "ダウンロード"
else-files: "まだあんで..."
set-as-avatar: "アイコンにする"
else-files: "その他"
set-as-avatar: "アバターにする"
set-as-banner: "バナーにする"
open-in-app: "アプリで開く"
add-app: "アプリ増やす"
@ -620,6 +632,7 @@ desktop/views/components/drive.folder.vue:
rename: "名前を変えるで"
rename-folder: "フォルダ名を変えるで"
input-new-folder-name: "新しいフォルダ名を入力してや"
else-folders: "その他"
desktop/views/components/drive.vue:
search: "検索"
empty-draghover: "ドロップするにゃ!お魚以外なら何でもいいにゃ!"
@ -747,6 +760,7 @@ common/views/components/drive-settings.vue:
max: "容量"
in-use: "使うとる"
stats: "統計"
default-upload-folder-name: "フォルダ"
common/views/components/mute-and-block.vue:
mute-and-block: "ミュートとブロック"
mute: "ミュート"
@ -853,7 +867,6 @@ admin/views/instance.vue:
drive-config: "ドライブの設定"
object-storage-endpoint: "エンドポイント"
cache-remote-files: "リモートのファイルをキャッシュする"
cache-remote-files-desc: "この設定を無効にすると、リモートファイルをこっちで保管せずに直接リンク張るようになるで。サーバーのストレージは軽くやろうけど、プライバシー設定で直リンクを向こうにしとるユーザーはファイルが見れへんし、サムネイルが無いから通信量が増えたりするから、普通はオンにしといてな。"
local-drive-capacity-mb: "ローカルユーザーひとりあたりのドライブ容量"
remote-drive-capacity-mb: "リモートユーザーひとりあたりのドライブ容量"
mb: "メガバイト単位"
@ -938,6 +951,8 @@ admin/views/users.vue:
reset-password: "パスワードをリセット"
password-updated: "パスワードは現在「{password} 」やで"
suspend: "凍結"
username: "ユーザー名"
host: "ホスト"
users:
title: "ユーザー"
state:
@ -945,6 +960,11 @@ admin/views/users.vue:
moderator: "モデレーター"
origin:
local: "ローカル"
admin/views/moderators.vue:
logs:
moderator: "モデレーター"
type: "操作"
info: "情報"
admin/views/emoji.vue:
add-emoji:
add: "増やす"
@ -1161,6 +1181,8 @@ mobile/views/pages/search.vue:
not-found: "ワイは「{q}」なんて投稿知らんわ、無いんちゃう?知らんけど。"
mobile/views/pages/selectdrive.vue:
select-file: "ファイル選んでや"
mobile/views/pages/notifications.vue:
notifications: "通知"
mobile/views/pages/settings.vue:
signed-in-as: "あんたは橋の下で拾った{}や!"
mobile/views/pages/user.vue:
@ -1234,6 +1256,8 @@ dev/views/new-app.vue:
authority-desc: "ここにチェックした機能しかAPIからアクセスできひんから気ぃつけてな"
authority-warning: "アプリ作った後でも変えれるけど、新しいやつ追加したらそん時関連付いてるユーザーキーは全部ほかされるで。"
pages:
pin-this-page: "ピン留め"
unpin-this-page: "ピン留めやめる"
like: "ええやん"
blocks:
image: "画像"
@ -1254,5 +1278,14 @@ pages:
arg2: "リスト"
_pick:
arg1: "リスト"
_listLen:
arg1: "リスト"
types:
array: "リスト"
room:
translate: "移動"
save: "保存"
saved: "保存したで!"
furnitures:
moon: "月"
bin: "ゴミ箱"

View File

@ -4,7 +4,7 @@ meta:
common:
misskey: "연합우주의 ⭐"
about-title: "연합우주의 ⭐."
about: "Misskey를 찾아주셔서 감사합니다. Misskey는 지구에서 태어난 <b>분산 마이크로 블로그 SNS </b> 입니다. Fediverse(다양한 SNS로 구성되는 우주)에 존재하 다른 SNS와 상호 연결되어 있습니다. 잠시 도시의 번잡함에서 벗어나 새로운 인터넷에 다이브 해 보지 않겠습니까."
about: "Misskey를 발견해주셔서 감사합니다! Misskey는 지구에서 태어난 <b>분산 마이크로 블로그 SNS</b> 입니다. Fediverse (다양한 SNS가 함께하는 우주)에 존재하고 있어서, 다른 SNS와 서로 연결되어 있습니다. 번잡한 도시에서 벗어나 새로운 인터넷에 빠져보지 않으시겠어요?"
intro:
title: "Misskey란?"
about: "Misskey는 오픈소스 <b>분산형 마이크로블로그 SNS</b>입니다. 다양하고 폭넓게 커스터마이징할 수 있는 UI, 글에 대한 리액션, 파일을 관리할 수 있는 드라이브 등의 선진적인 기능을 갖추고 있습니다. 더하여 Fediverse라고 부르는 네트워크에 연결할 수 있어 다른 SNS와도 주고받을 수 있습니다. 예를 들자면, 당신이 무언가를 게시하면, 해당 게시물은 Misskey 뿐만 아니라 다른 SNS에도 전해집니다. 살짝 어떤 행성에서 다른 행성으로 전파를 발신하고 있는 모습을 상상해주세요."
@ -18,9 +18,6 @@ common:
drive: "드라이브"
drive-desc: "이전에 올렸던 적 있는 이미지를 다시 올리고 싶을 때가 있지 않으신가요? 아니면 업로드했던 파일을 폴더로 정리하고 싶지 않으신가요? Misskey에 기본적으로 내장된 드라이브 기능으로 해결됩니다. 파일 공유도 쉽습니다."
outro: "이외에도 Misskey에만 있는 기능이 아직도 더 있으니 부디 여러분 자신의 눈으로 확인해보시기 바랍니다. Misskey는 분산형 SNS라서 이 인스턴스가 마음에 들지 않으신다면 다른 인스턴스를 시도해보실 수도 있습니다. 그럼, GLHF!"
adblock:
detected: "광고 차단기를 해제하십시오"
warning: "<strong>Misskey는 광고를 게재하지 않습니다</strong>. 하지만 광고 차단 기능을 사용할 경우 일부 기능을 사용할 수 없거나 문제가 발생할 수 있습니다."
application-authorization: "앱 연계"
close: "닫기"
do-not-copy-paste: "여기에 코드를 입력하거나 붙여넣지 마십시오. 계정이 무단으로 사용될 수 있습니다."
@ -35,6 +32,20 @@ common:
signout: "로그아웃"
reload-to-apply-the-setting: "이 설정을 적용하려면 페이지를 새로고침해야 합니다. 바로 새로고침하시겠습니까?"
fetching-as-ap-object: "연합에서 조회 중"
unfollow-confirm: "{name} 님을 팔로우 해제하시겠습니까?"
delete-confirm: "이 글을 삭제하시겠습니까?"
signin-required: "로그인 해주세요"
notification-type: "알림의 종류"
notification-types:
all: "모두"
pollVote: "투표"
follow: "팔로잉"
receiveFollowRequest: "팔로우 요청"
reply: "답글 달기"
quote: "인용"
renote: "리노트"
mention: "멘션"
reaction: "리액션"
got-it: "알겠습니다"
customization-tips:
title: "커스터마이징 도움말"
@ -72,14 +83,14 @@ common:
followers: "팔로워"
favorites: "즐겨찾기"
permissions:
"read:account": "계정 정보를 볼 수 있습니다."
"write:account": "계정 정보 변경할 수 있습니다."
"read:blocks": "차단 목록을 볼 수 있습니다."
"write:blocks": "차단 목록을 조작할 수 있습니다."
"read:drive": "드라이브의 파일들을 볼 수 있습니다."
"write:drive": "드라이브의 파일들을 조작할 수 있습니다."
"read:favorites": "즐겨찾기 목록을 볼 수 있습니다."
"write:favorites": "즐겨찾기 목록을 조작할 수 있습니다."
"read:account": "계정 정보 보기"
"write:account": "계정 정보 변경"
"read:blocks": "차단 보기"
"write:blocks": "차단 수정"
"read:drive": "드라이브 보기"
"write:drive": "드라이브 수정"
"read:favorites": "즐겨찾기 보기"
"write:favorites": "즐겨찾기 수정"
"read:following": "팔로우 정보 보기"
"write:following": "팔로잉, 팔로우 수정"
"read:messaging": "대화 보기"
@ -87,11 +98,17 @@ common:
"read:mutes": "뮤트 보기"
"write:mutes": "뮤트 수정"
"write:notes": "글 작성, 삭제"
"read:notifications": " 보기"
"read:notifications": "알림 보기"
"write:notifications": "알림 수정"
"read:reactions": "리액션 보기"
"write:reactions": "리액션 수정"
"write:votes": "투표하기"
"read:pages": "페이지 보기"
"write:pages": "페이지 변경"
"read:page-likes": "페이지의 좋아요 보기"
"write:page-likes": "페이지의 좋아요 변경"
"read:user-groups": "유저 그룹 보기"
"write:user-groups": "유저 그룹을 변경"
empty-timeline-info:
follow-users-to-make-your-timeline: "사용자를 팔로우하면 글이 타임라인에 표시됩니다."
explore: "사용자 탐색"
@ -116,12 +133,14 @@ common:
local-only-message: "이 글은 로컬에만 공개되어 있습니다"
click-to-tagging: "클릭하여 태그 넣기"
visibility: "공개 범위"
geolocation-alert: "사용 중 장치에서는 위치 정보를 사용할 수 없습니다"
geolocation-alert: "사용 중이신 장치에서는 위치 정보를 사용할 수 없습니다"
error: "오류"
enter-username: "사용자명을 입력해주세요"
specified-recipient: "수신인"
add-visible-user: "사용자 추가"
cw-placeholder: "내용에 대한 주석 (옵션)"
username-prompt: "사용자명을 입력해주세요"
enter-file-name: "파일 이름 수정"
weekday-short:
sunday: "일"
monday: "월"
@ -181,6 +200,8 @@ common:
other: "기타"
appearance: "디자인"
behavior: "동작"
reactions: "리액션"
reactions-description: "리액션 선택창에 표시할 리액션을 줄바꿈으로 구분해 설정합니다."
fetch-on-scroll: "스크롤하여 자동으로 불러오기"
fetch-on-scroll-desc: "페이지를 아래로 스크롤하였을 때 자동으로 추가 콘텐츠를 불러옵니다."
note-visibility: "게시물의 공개 범위"
@ -188,6 +209,11 @@ common:
remember-note-visibility: "글의 공개 범위를 기억하기"
web-search-engine: "웹 검색엔진"
web-search-engine-desc: "예: https://www.google.com/?#q={{query}}"
paste: "붙여넣기"
pasted-file-name: "붙여넣은 파일의 이름 템플릿"
pasted-file-name-desc: "예시: \"yyyy-MM-dd HH-mm-ss [{{number}}]\" → \"2018-03-20 21-30-24 1\""
paste-dialog: "붙여넣기 시 파일 이름을 편집"
paste-dialog-desc: "붙여넣기 시 파일 이름을 편집할 수 있도록 대화 상자를 표시합니다."
keep-cw: "CW 유지"
keep-cw-desc: "글에 답글을 달 때, 답글할 글에 CW가 설정되어 있는 경우 기본값으로 동일한 CW를 설정하도록 합니다."
i-like-sushi: "저는 (푸딩보다 차라리) 초밥이 좋아요"
@ -195,6 +221,7 @@ common:
use-avatar-reversi-stones: "리버시의 돌로 아바타를 사용"
disable-animated-mfm: "글의 문자 애니메이션을 비활성화"
disable-showing-animated-images: "움직이는 이미지를 자동으로 재생하지 않음"
enable-quick-notification-view: "알림의 빠른 보기를 사용합니다"
suggest-recent-hashtags: "최근 해시태그를 글 작성란에 표시"
always-show-nsfw: "항상 열람주의 미디어를 표시"
always-mark-nsfw: "항상 미디어를 열람주의로 설정하여 게시"
@ -225,7 +252,7 @@ common:
deck-column-width-wide: "넓음"
use-shadow: "UI에 그림자 효과 적용"
rounded-corners: "UI의 모서리를 둥글게 설정"
circle-icons: "원형 아이콘 사용"
circle-icons: "원형 아바타를 사용"
contrasted-acct: "사용자명에 대비 추가"
wallpaper: "배경"
choose-wallpaper: "배경 설정"
@ -270,6 +297,22 @@ common:
disable-via-mobile: "작성하는 글에 \"모바일에서 작성함\" 을 붙이지 않음"
load-raw-images: "첨부 이미지를 고품질로 표시"
load-remote-media: "원격 서버의 미디어를 표시"
sync: "동기화"
save: "저장"
saved: "저장하였습니다"
preview: "미리보기"
home-profile: "홈 프로필"
deck-profile: "덱 프로필"
room: "룸"
_room:
graphicsQuality: "그래픽 품질"
_graphicsQuality:
ultra: "최고"
high: "높음"
medium: "보통"
low: "낮음"
cheep: "최저"
useOrthographicCamera: "평행 투시 카메라를 사용"
search: "검색"
delete: "삭제"
loading: "로드 중"
@ -286,7 +329,7 @@ common:
is-remote-user: "이 사용자 정보는 정확하지 않을 수 있습니다."
is-remote-post: "이 글 정보는 복사본입니다."
view-on-remote: "정확한 정보 보기"
renoted-by: "{user}이(가) 리노트"
renoted-by: "{user}이 리노트"
no-notes: "글이 없습니다"
turn-on-darkmode: "어둠에 삼켜져라"
turn-off-darkmode: "빛이 있으라"
@ -350,10 +393,15 @@ common/views/pages/explore.vue:
popular-users: "인기 사용자"
recently-updated-users: "최근 게시한 사용자"
recently-registered-users: "신규 사용자"
recently-discovered-users: "최근 발견된 유저"
popular-tags: "인기 태그"
federated: "연합"
explore: "{host}을(를) 탐색"
explore-fediverse: "연합 우주를 탐색"
users-info: "현재 {users} 사용자가 등록되어 있습니다"
common/views/components/reactions-viewer.details.vue:
few-users: "{users}님이 {reaction} 리액션"
many-users: "{users}님 외 {omitted}명이 {reaction} 리액션"
common/views/components/url-preview.vue:
enable-player: "플레이어 열기"
disable-player: "플레이어 닫기"
@ -519,7 +567,10 @@ common/views/components/note-menu.vue:
unpin: "프로필에서 고정 해제"
delete: "삭제"
delete-confirm: "이 글을 삭제하시겠습니까?"
delete-and-edit: "삭제 후 편집"
delete-and-edit-confirm: "이 글을 삭제한 뒤 다시 편집하시겠습니까? 이 글에 대한 리액션, 리노트, 답글 또한 모두 삭제됩니다."
remote: "글 원본 보기"
pin-limit-exceeded: "더 이상 고정할 수 없습니다."
common/views/components/user-menu.vue:
mention: "멘션"
mute: "뮤트"
@ -579,7 +630,9 @@ common/views/components/reaction-picker.vue:
choose-reaction: "리액션 선택"
input-reaction-placeholder: "또는 이모지 입력"
common/views/components/emoji-picker.vue:
recent-emoji: "최근 사용한 이모지"
custom-emoji: "커스텀 이모지"
no-category: "카테고리 없음"
people: "사람들"
animals-and-nature: "동물 & 자연"
food-and-drink: "음식 & 음료"
@ -588,6 +641,14 @@ common/views/components/emoji-picker.vue:
objects: "사물"
symbols: "기호"
flags: "깃발"
common/views/components/settings/app-type.vue:
title: "모드"
intro: "데스크톱과 모바일 중 어떤 레이아웃을 사용할 지 지정할 수 있습니다."
choices:
auto: "자동으로 선택"
desktop: "데스크톱 레이아웃으로 고정"
mobile: "모바일 레이아웃으로 고정"
info: "변경사항은 페이지를 새로고침한 뒤에 반영됩니다."
common/views/components/signin.vue:
username: "사용자명"
password: "비밀번호"
@ -598,6 +659,8 @@ common/views/components/signin.vue:
signin-with-github: "GitHub으로 로그인"
signin-with-discord: "Discord로 로그인"
login-failed: "로그인할 수 없습니다. 사용자명과 비밀번호를 확인하여 주십시오."
tap-key: "보안 키를 클릭하여 로그인"
enter-2fa-code: "인증 코드를 입력하여 주십시오"
common/views/components/signup.vue:
invitation-code: "초대 코드"
invitation-info: "초대 코드가 없으신 분은 <a href=\"{}\">관리자</a>에게 연락하시기 바랍니다."
@ -702,6 +765,9 @@ common/views/components/profile-editor.vue:
saved: "프로필을 저장하였습니다"
uploading: "업로드 중"
upload-failed: "업로드에 실패하였습니다"
unable-to-process: "작업을 완료할 수 없습니다"
avatar-not-an-image: "아바타로 지정한 파일이 이미지 형식이 아닙니다"
banner-not-an-image: "배너로 지정한 파일이 이미지 형식이 아닙니다"
email: "메일 설정"
email-address: "메일 주소"
email-verified: "매일 주소가 확인되었습니다"
@ -721,6 +787,9 @@ common/views/components/profile-editor.vue:
danger-zone: "위험한 설정"
delete-account: "계정 삭제"
account-deleted: "계정이 삭제되었습니다. 데이터가 사라질 때까지 시간이 걸릴 수 있습니다."
profile-metadata: "프로필 추가 정보"
metadata-label: "라벨"
metadata-content: "내용"
common/views/components/user-list-editor.vue:
users: "사용자"
rename: "리스트 이름 바꾸기"
@ -759,6 +828,7 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "공지사항이 없습니다"
have-a-nice-day: "좋은 하루 되세요!"
next: "다음"
prev: "이전"
common/views/widgets/calendar.vue:
year: "{}년"
month: "{}월"
@ -830,6 +900,7 @@ desktop:
uploading-avatar: "새로운 아바타를 업로드하고 있습니다"
avatar-updated: "아바타가 변경되었습니다"
choose-avatar: "아바타 이미지를 선택"
unable-to-process: "작업을 완료할 수 없습니다"
invalid-filetype: "이 형식의 파일은 지원되지 않습니다"
desktop/views/components/activity.chart.vue:
total: "검은색 ... 전체"
@ -870,8 +941,8 @@ desktop/views/components/drive.file.vue:
unmark-as-sensitive: "열람주의 해제"
copy-url: "URL 복사"
download: "다운로드"
else-files: "기타..."
set-as-avatar: "아이콘으로 설정"
else-files: "기타"
set-as-avatar: "아바타로 설정"
set-as-banner: "배너로 설정"
open-in-app: "앱에서 열기"
add-app: "앱 추가"
@ -880,15 +951,20 @@ desktop/views/components/drive.file.vue:
copied: "복사 완료"
copied-url-to-clipboard: "URL을 클립보드에 복사하였습니다"
desktop/views/components/drive.folder.vue:
upload-folder: "기본 업로드 위치"
unable-to-process: "작업을 완료할 수 없습니다"
circular-reference-detected: "대상 폴더가 이동할 폴더의 하위 폴더입니다."
unhandled-error: "알 수 없는 오류"
unable-to-delete: "삭제할 수 없습니다"
has-child-files-or-folders: "이 폴더는 비어있지 않기 때문에 삭제할 수 없습니다."
contextmenu:
move-to-this-folder: "이 폴더로 이동"
show-in-new-window: "새 창으로 보기"
rename: "이름 변경"
rename-folder: "폴더 이름 변경"
input-new-folder-name: "새 폴더 이름을 입력하여 주십시오"
else-folders: "기타"
set-as-upload-folder: "기본 업로드 위치로 설정"
desktop/views/components/drive.vue:
search: "검색"
empty-draghover: "끌어놓으신 거 맞나요? 괜찮아요, 저는 귀여우니까요"
@ -994,6 +1070,16 @@ desktop/views/components/settings.2fa.vue:
success: "설정이 완료되었습니다!"
failed: "설정에 실패했습니다. 토큰이 잘못되었는지 확인해주십시오."
info: "다음 로그인부터는 이와 동일하게 비밀번호에 더해 장치에 표시된 토큰을 입력합니다."
totp-header: "인증 앱"
security-key-header: "보안 키"
security-key: "보안을 강화하려면 FIDO2를 지원하는 하드웨어 보안 키를 사용하여 계정에 로그인할 수 있습니다. 로그인 시 등록하였던 보안 키 또는 인증 앱이 필요하게 됩니다."
last-used: "마지막 사용:"
activate-key: "클릭하여 보안 키를 활성화하여 주십시오"
security-key-name: "키 이름"
register-security-key: "키 등록 완료"
something-went-wrong: "으악! 키를 등록하는 도중 문제가 발생하였습니다:"
key-unregistered: "키가 등록되어 있지 않습니다"
use-password-less-login: "비밀번호 없는 로그인 사용"
common/views/components/media-image.vue:
sensitive: "열람주의"
click-to-show: "클릭하여 보기"
@ -1018,6 +1104,9 @@ common/views/components/drive-settings.vue:
max: "최대 용량"
in-use: "사용중"
stats: "통계"
default-upload-folder: "기본 업로드 폴더 위치"
default-upload-folder-name: "폴더"
change-default-upload-folder: "폴더 변경"
common/views/components/mute-and-block.vue:
mute-and-block: "뮤트 및 차단"
mute: "뮤트"
@ -1027,6 +1116,8 @@ common/views/components/mute-and-block.vue:
word-mute: "단어 뮤트"
muted-words: "뮤트된 키워드"
muted-words-description: "공백으로 구분하는 경우 AND로 지정되며, 줄바꿈으로 구분하는 경우 OR로 지정됩니다"
unmute-confirm: "이 사용자를 뮤트 해제하시겠습니까?"
unblock-confirm: "이 사용자를 차단 해제하시겠습니까?"
save: "저장"
common/views/components/password-settings.vue:
reset: "비밀번호 변경"
@ -1071,6 +1162,7 @@ desktop/views/components/ui.header.account.vue:
groups: "그룹"
follow-requests: "팔로우 요청"
admin: "관리"
room: "룸"
desktop/views/components/ui.header.nav.vue:
game: "게임"
desktop/views/components/ui.header.notifications.vue:
@ -1103,7 +1195,13 @@ admin/views/index.vue:
abuse: "스팸 신고"
queue: "작업 대기열"
logs: "로그"
db: "데이터베이스"
back-to-misskey: "Misskey로 돌아가기"
admin/views/db.vue:
tables: "테이블"
vacuum: "청소"
vacuum-info: "데이터베이스를 청소합니다. 데이터는 그대로인 채로 데이터의 사용량을 줄입니다. 일반적으로 이 작업은 자동으로 정기적으로 수행됩니다."
vacuum-exclamation: "청소를 수행하면 한동안 데이터베이스의 부하가 높아져 사용자 조작을 처리하지 못 할 수 있습니다."
admin/views/dashboard.vue:
dashboard: "대시보드"
accounts: "계정"
@ -1126,7 +1224,7 @@ admin/views/queue.vue:
states:
active: "처리중"
delayed: "지연됨"
waiting: "대기열에 들어감"
waiting: "대기열에 있음"
result-is-truncated: "결과는 생략되었습니다"
other-queues: "기타 큐"
admin/views/logs.vue:
@ -1181,7 +1279,9 @@ admin/views/instance.vue:
object-storage-s3-info-here: "이곳"
object-storage-gcs-info: "Google Cloud Storage를 오브젝트 스토리지로 사용하는 경우, 「엔드포인트」는 storage.googleapis.com 으로 설정하고, 「리전」 란은 비웁니다."
cache-remote-files: "원격 파일을 캐시"
cache-remote-files-desc: "이 설정을 해지하면 원격 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 프라이버시 설정에서 직접 링크를 무효로 설정한 사용자에게는 파일이 보이지 않거나, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다. 일반적으로 이 설정을 ON으로 두는 것을 추천합니다."
cache-remote-files-desc: "이 설정을 해지하면 원격 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 프라이버시 설정에서 직접 링크를 무효로 설정한 사용자에게는 파일이 보이지 않거나, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다. 보통은 이 설정을 사용하거나 아래의 원격 파일 프록시를 설정하는 것을 추천합니다."
proxy-remote-files: "원격 파일 프록시"
proxy-remote-files-desc: "이 설정을 사용하면, 저장되지 않았거나 용량 초과로 삭제된 원격 파일을 로컬에서 프록시하여 썸네일을 생성하게 됩니다."
local-drive-capacity-mb: "로컬 사용자 한 명당 드라이브 용량"
remote-drive-capacity-mb: "원격 사용자 한 명당 드라이브 용량"
mb: "메가바이트 단위"
@ -1238,6 +1338,7 @@ admin/views/instance.vue:
smtp-auth: "SMTP 인증 수행"
smtp-user: "SMTP 사용자"
smtp-pass: "SMTP 비밀번호"
test-email: "테스트"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "ServiceWorker 사용"
serviceworker-info: "푸시알림을 수행하려면 사용해야 합니다."
@ -1317,6 +1418,8 @@ admin/views/users.vue:
remote-user-updated: "원격 사용자 정보를 갱신하였습니다"
delete-all-files: "모든 파일 삭제"
delete-all-files-confirm: "모든 파일을 삭제하시겠습니까?"
username: "사용자명"
host: "호스트"
users:
title: "사용자"
sort:
@ -1328,6 +1431,7 @@ admin/views/users.vue:
state:
title: "상태"
all: "모두"
available: "이용 가능"
admin: "관리자"
moderator: "모더레이터"
adminOrModerator: "관리자+모더레이터"
@ -1347,11 +1451,18 @@ admin/views/moderators.vue:
added: "모더레이터를 등록하였습니다"
remove: "해제"
removed: "모더레이터 등록을 해제했습니다"
logs:
title: "로그"
moderator: "모더레이터"
type: "작업"
at: "일시"
info: "정보"
admin/views/emoji.vue:
add-emoji:
title: "이모지 등록"
name: "이모지 이름"
name-desc: "a~z 0~9 _ 의 문자를 사용할 수 있습니다."
category: "카테고리"
aliases: "별칭"
aliases-desc: "공백으로 구분하여 여러 개 설정할 수 있습니다."
url: "이모지 이미지 URL"
@ -1635,6 +1746,8 @@ mobile/views/pages/search.vue:
not-found: "\"{q}\" 와 일치하는 글을 찾을 수 없습니다."
mobile/views/pages/selectdrive.vue:
select-file: "파일 선택"
mobile/views/pages/notifications.vue:
notifications: "알림"
mobile/views/pages/settings.vue:
signed-in-as: "{}(으)로 로그인"
mobile/views/pages/user.vue:
@ -1693,6 +1806,7 @@ deck/deck.user-column.vue:
activity: "활동"
timeline: "타임라인"
pinned-notes: "고정해놓은 글"
pinned-page: "고정해놓은 페이지"
docs:
edit-this-page-on-github: "틀린 점이나 개선할 점을 찾으셨나요?"
edit-this-page-on-github-link: "이 페이지를 GitHub에서 편집"
@ -1724,9 +1838,14 @@ pages:
read-page: "소스 표시중"
page-created: "페이지를 만들었습니다"
page-updated: "페이지를 수정했습니다"
name-already-exists: "지정한 페이지 URL은 이미 존재합니다"
title-invalid-name: "유효하지 않은 페이지 URL입니다"
text-invalid-name: "비어있지 않은지 확인해주세요"
are-you-sure-delete: "이 페이지를 삭제하시겠습니까?"
page-deleted: "페이지가 삭제되었습니다"
edit-this-page: "이 페이지를 편집"
pin-this-page: "프로필에 고정"
unpin-this-page: "프로필에서 고정 해제"
view-source: "소스 보기"
view-page: "페이지 보기"
like: "좋아요"
@ -1745,6 +1864,7 @@ pages:
url: "페이지 URL"
summary: "페이지 요약"
align-center: "가운데 정렬"
hide-title-when-pinned: "프로필에 고정해놓은 경우 타이틀을 표시하지 않음"
font: "글꼴"
fontSerif: "세리프"
fontSansSerif: "산 세리프"
@ -1798,12 +1918,25 @@ pages:
inc: "증가치"
_button:
text: "제목"
colored: "색상"
action: "버튼을 눌렀을 때의 동작"
_action:
dialog: "대화상자를 표시"
_dialog:
content: "내용"
resetRandom: "난수를 초기화"
pushEvent: "이벤트 보내기"
_pushEvent:
event: "이벤트 이름"
message: "눌렀을 때 표시할 메시지"
variable: "보낼 변수"
no-variable: "없음"
radioButton: "선택지"
_radioButton:
name: "변수명"
title: "제목"
values: "줄바꿈으로 구분된 선택지"
default: "기본값"
script:
categories:
flow: "흐름 제어"
@ -1857,10 +1990,13 @@ pages:
_divide:
arg1: "A"
arg2: "B"
remind: "÷ 나눈 나머지"
_remind:
mod: "÷ 나눈 나머지"
_mod:
arg1: "A"
arg2: "B"
round: "소수점을 반올림"
_round:
arg1: "수치"
eq: "A와 B가 동일"
_eq:
arg1: "A"
@ -1941,6 +2077,9 @@ pages:
_pick:
arg1: "리스트"
arg2: "위치"
listLen: "리스트의 길이 가져오기"
_listLen:
arg1: "리스트"
number: "수치"
stringToNumber: "텍스트를 수치로"
_stringToNumber:
@ -1973,3 +2112,64 @@ pages:
enviromentVariables: "환경 변수"
pageVariables: "페이지 요소"
argVariables: "입력 슬롯"
room:
add-furniture: "가구를 배치"
translate: "이동"
rotate: "회전"
exit: "선택 해제"
remove: "치우기"
save: "저장"
saved: "저장하였습니다"
clear: "모두 치우기"
clear-confirm: "정말 방 안의 모든 가구를 치우시겠습니까?"
leave-confirm: "저장되지 않은 변경 사항이 있습니다. 정말 나가시겠습니까?"
chooseImage: "이미지 선택"
room-type: "룸 종류"
carpet-color: "바닥 색상"
rooms:
default: "기본"
washitsu: "일본식"
furnitures:
milk: "우유 팩"
bed: "침대"
low-table: "낮은 테이블"
desk: "책상"
chair: "의자"
chair2: "의자 2"
fan: "환기구"
pc: "컴퓨터"
plant: "관엽식물"
plant2: "관엽식물 2"
eraser: "지우개"
pencil: "연필"
pudding: "푸딩"
cardboard-box: "골판지 상자"
cardboard-box2: "골판지 상자 2"
cardboard-box3: "골판지 상자 3"
book: "책"
book2: "책 2"
piano: "피아노"
facial-tissue: "휴지 상자"
server: "서버"
moon: "달"
corkboard: "게시판"
mousepad: "마우스 패드"
monitor: "모니터"
keyboard: "키보드"
carpet-stripe: "카페트 (줄무늬)"
mat: "매트"
color-box: "책장"
wall-clock: "벽걸이 시계"
photoframe: "액자"
cube: "큐브"
tv: "TV"
pinguin: "펭귄"
rubik-cube: "루빅스 큐브"
poster-h: "포스터 (가로)"
poster-v: "포스터 (세로)"
sofa: "소파"
spiral: "나선형 계단"
bin: "휴지통"
cup-noodle: "컵라면"
holo-display: "홀로그램"
energy-drink: "에너지 드링크"

View File

@ -3,11 +3,58 @@ meta:
lang: "Nederlands"
common:
misskey: "Deel alles met anderen die ook Misskey gebruiken."
about-title: "Een ster van het fediverse"
about: "Bedankt voor het ontdekken van Misskey. Misskey is een <b>gedecentraliseerd microblogging platform</b> geboren op aarde. Omdat het bestaat binnen het Fediverse (een georganiseerd universum van verschillende sociale mediaplatformen), staat het verbonden met andere sociale medieplatformen. Neem een pauze van de stedelijke drukte, en duik in het nieuwe intenet?"
intro:
title: "Wat is Misskey?"
about: "Misskey is een open source <b>gedecentraliseerd blogplatform</b>. Het heeft een gesofisticeerde, volledig aanpasbare gebruikersinterface, uitgebreide reactiemogelijkheden voor posts, gratis geïntegreerd bestandsoplagbeheer en andere geavanceerde mogelijkheden. Daarnaast staat Misskey verbonden aan een netwerksysteem genaam het \"Fediverse\", hiermee kunnen we communiceren met andere gebruikers op andere SNSs. Dit betekent dat wanneer je iets post het niet enkel verstuurd wordt naar andere Misskey gebruikers, maar ook naar gebruikers op Mastodon en Pleroma. Stel je voor dat een planeet een radiosignaal verzendt naar een andere planeet als manier van communiceren."
features: "Kenmerken"
rich-contents: "Bericht"
rich-contents-desc: "Post jouw idee, hot topic, wat je ook maar wil delen. Maak jouw teksten aantrekkelijk met je favoriete foto's, verzend bestanden, zelfs video's, of maak een poll. Dit zijn enkele van de mogelijkheden die Misskey aanbiedt!"
reaction: "Reactie"
reaction-desc: "Dé makkelijkste manier om jouw gevoelens uit te drukken. Met Misskey kan je verschillende reacties toevoegen aan jouw posts. Andere SNSs hebben enkel maar een \"vind ik leuk\" reactie."
ui: "Interface"
ui-desc: "Niet één UI past nij iedereen. Daarom heeft Misskey een uitgebreide keuze om de UI naar jouw hand te zetten. Je kan jouw nieuwe thuis zo origineel maken als je zelf wil door jouw tijdslijn aan te passen door widgets te verplaatsen en hun look te veranderen. Zo maak je van Misskey jouw eigen stek."
drive: "Drive"
drive-desc: "Wil je een foto posten die je reeds het geüpload? Wens je georganiseerde map met zelfgekozen naam maken voor al jouw bestanden? De beste oplossing voor jou is Misskey Drive. Dit maakt het supermakkelijk om jouw bestanden online te delen."
application-authorization: "Geauthoriseerde applicaties"
close: "Sluiten"
do-not-copy-paste: "Gelieve de code hier niet in te geven of te plakken. De account kan gecompromiseerd zijn."
load-more: "Laad meer resultaten"
enter-password: "Voer het wachtwoord in"
2fa: "Tweestapsverificatie"
customize-home: "Layout aanpassen"
featured-notes: "Uitgelicht"
dark-mode: "Donker thema"
signin: "Aanmelden"
signup: "Registreren"
signout: "Afmelden"
reload-to-apply-the-setting: "Herlaad de pagina om je aanpassingen te bekijken. Wil je de pagina nu herladen?"
fetching-as-ap-object: "Verzenden naar Fediverse"
unfollow-confirm: "Wil stoppen met {name} te volgen?"
delete-confirm: "Ben je zeker dat je dit bericht wil verwijderen?"
signin-required: "Gelieve in te loggen"
notification-type: "Notificatietype"
notification-types:
all: "Alle"
pollVote: "Stemmen"
follow: "Volgend"
receiveFollowRequest: "Volgverzoeken"
reply: "Beantwoorden"
quote: "Bron"
mention: "Vermeldingen"
reaction: "Reactie"
got-it: "Ik snap het!"
customization-tips:
title: "Aanpassingstips"
gotit: "Ik snap het!"
notification:
file-uploaded: "Je bestand is geüpload"
message-from: "Bericht van {}:"
reversi-invited: "Uitgenodigd voor spel"
notified-by: "Bemerkt door: {}"
reply-from: "Antwoord van: {}"
quoted-by: "Geciteerd door: {}"
time:
unknown: "onbekend"
future: "toekomstig"
@ -19,7 +66,13 @@ common:
weeks_ago: "{}week/weken geleden"
months_ago: "{}maand(en) geleden"
years_ago: "{}jaar geleden"
month-and-day: "{day} {month}"
trash: "Prullenbak"
drive: "Drive"
pages: "Pagina's"
messaging: "Gesprekken"
home: "Startpagina"
deck: "Deck"
timeline: "Tijdlijn"
followers: "Volgers"
favorites: "Deze notitie toevoegen aan favorieten"
@ -54,7 +107,11 @@ common:
profile: "Je profiel"
notification: "Meldingen"
password: "Wachtwoord"
reactions: "Reactie"
deck-column-align-center: "Centreren"
deck-column-align-left: "Links"
timeline: "Tijdlijn"
navbar-position-left: "Links"
search: "Zoeken"
delete: "Verwijderen"
loading: "Bezig met laden"
@ -199,6 +256,7 @@ common/views/components/profile-editor.vue:
name: "Naam"
avatar: "Gebruikersafbeelding"
banner: "Omslagfoto"
unable-to-process: "De operatie kan niet worden voltooid."
export-targets:
following-list: "Volgend"
user-lists: "Lijsten"
@ -226,6 +284,8 @@ common/views/pages/follow.vue:
follow: "Volgend"
desktop:
banner: "Omslagfoto"
avatar: "Gebruikersafbeelding"
unable-to-process: "De operatie kan niet worden voltooid."
desktop/views/components/activity.chart.vue:
total: "Zwart ... totaal"
notes: "Blauw ... notities"
@ -260,7 +320,6 @@ desktop/views/components/drive.file.vue:
rename: "Naam wijzigen"
copy-url: "URL kopiëren"
download: "Downloaden"
else-files: "Overig"
set-as-avatar: "Instellen als gebruikersafbeelding"
set-as-banner: "Instellen als omslagfoto"
open-in-app: "Openen in app"
@ -377,6 +436,7 @@ common/views/components/api-settings.vue:
common/views/components/drive-settings.vue:
in-use: "gebruikt"
stats: "Statistieken"
default-upload-folder-name: "Map(pen)"
desktop/views/components/sub-note-content.vue:
private: "(dit bericht is privé)"
poll: "Peilingen"
@ -415,16 +475,19 @@ admin/views/index.vue:
users: "Gebruiker"
admin/views/dashboard.vue:
notes: "Bericht"
drive: "Drive"
admin/views/abuse.vue:
remove-report: "Verwijderen"
admin/views/charts.vue:
notes: "Bericht"
users: "Gebruiker"
drive: "Drive"
admin/views/drive.vue:
origin:
local: "Lokaal"
delete: "Verwijderen"
admin/views/users.vue:
username: "Gebruikersnaam"
users:
title: "Gebruiker"
state:
@ -554,6 +617,7 @@ mobile/views/pages/home.vue:
global: "Algemeen"
mobile/views/pages/widgets.vue:
add-widget: "Toevoegen"
customization-tips: "Aanpassingstips"
mobile/views/pages/widgets/activity.vue:
activity: "Activiteit"
mobile/views/pages/note.vue:
@ -566,6 +630,8 @@ mobile/views/pages/search.vue:
search: "Zoeken"
mobile/views/pages/selectdrive.vue:
select-file: "Kies een bestand"
mobile/views/pages/notifications.vue:
notifications: "Meldingen"
mobile/views/pages/settings.vue:
signed-in-as: "Ingelogd als {}"
mobile/views/pages/user.vue:
@ -606,6 +672,7 @@ docs:
edit-this-page-on-github: "Heb je een fout ontdekt of wil je bijdragen aan de documentatie? "
edit-this-page-on-github-link: "Bewerk deze pagina op GitHub!"
pages:
pin-this-page: "Vastmaken aan profielpagina"
like: "Leuk"
blocks:
image: "Afbeeldingen"
@ -623,5 +690,12 @@ pages:
arg2: "Lijsten"
_pick:
arg1: "Lijsten"
_listLen:
arg1: "Lijsten"
types:
array: "Lijsten"
room:
translate: "Verplaatsen"
furnitures:
moon: "Maan"
bin: "Prullenbak"

View File

@ -11,6 +11,10 @@ common:
rich-contents: "Innlegg"
drive: "Disk"
close: "Lukk"
notification-types:
all: "Alle"
follow: "Følger"
reply: "Svar"
got-it: "Skjønner!"
notification:
file-uploaded: "Filen ble lastet opp!"
@ -78,6 +82,7 @@ common:
_settings:
notification: "Notifikasjon"
password: "Passord"
save: "Lagre"
search: "Søk"
delete: "Slett"
loading: "Laster inn..."
@ -286,6 +291,7 @@ common/views/components/api-settings.vue:
common/views/components/drive-settings.vue:
in-use: "brukt"
stats: "Statistikk"
default-upload-folder-name: "Mappe(r)"
common/views/components/mute-and-block.vue:
save: "Lagre"
desktop/views/components/settings.tags.vue:
@ -344,12 +350,16 @@ admin/views/drive.vue:
local: "Lokalt"
delete: "Slett"
admin/views/users.vue:
username: "Brukernavn"
users:
title: "Bruker"
state:
all: "Alle"
origin:
local: "Lokalt"
admin/views/moderators.vue:
logs:
info: "Informasjon"
admin/views/emoji.vue:
add-emoji:
add: "Legg til"
@ -461,6 +471,8 @@ mobile/views/pages/games/reversi.vue:
reversi: "Reversi"
mobile/views/pages/search.vue:
search: "Søk"
mobile/views/pages/notifications.vue:
notifications: "Notifikasjon"
mobile/views/pages/user.vue:
following: "Følger"
followers: "Følgere"
@ -484,6 +496,7 @@ deck/deck.user-column.vue:
followers: "Følgere"
images: "Bilder"
pages:
pin-this-page: "Fest til profilen din"
like: "Lik"
blocks:
image: "Bilder"
@ -503,5 +516,13 @@ pages:
arg2: "Lister"
_pick:
arg1: "Lister"
_listLen:
arg1: "Lister"
types:
array: "Lister"
room:
translate: "Flytt"
save: "Lagre"
furnitures:
moon: "Måne"
bin: "Papirkurv"

View File

@ -14,9 +14,6 @@ common:
ui: "Interfejs"
drive: "Dysk"
drive-desc: "Chcesz opublikować zdjęcie, które już przesłałeś? Chcesz uporządkować, nazwać i utworzyć folder dla przesłanych plików? Dysk Misskey to najlepsze rozwiązanie dla Ciebie. Bardzo łatwo udostępniać swoje pliki online."
adblock:
detected: "Spróbuj wyłączyć blokadę reklam."
warning: "<strong>Misskey nie zawiera reklam</strong>, ale część funkcji może nie działać prawidłowo z włączonym blokowaniem reklam."
application-authorization: "Współpraca aplikacji"
close: "Zamknij"
load-more: "Załaduj więcej"
@ -28,6 +25,18 @@ common:
signin: "Zaloguj się"
signup: "Rejestracja"
signout: "Wyloguj się"
delete-confirm: "Czy na pewno chcesz usunąć ten wpis?"
notification-type: "Typy powiadomień"
notification-types:
all: "Wszyscy"
pollVote: "Głosy"
follow: "Śledzeni"
receiveFollowRequest: "Prośby o śledzenie"
reply: "Odpowiedzi"
quote: "Cytat"
renote: "Udostępnij"
mention: "Wzmianki"
reaction: "Reakcje"
got-it: "Rozumiem!"
customization-tips:
title: "Wskazówki o dostosowywaniu"
@ -65,6 +74,7 @@ common:
favorites: "Moje ulubione"
permissions:
"read:drive": "Wyświetl dysk"
"read:messaging": "Zobacz konwersację"
"write:votes": "Zagłosuj"
empty-timeline-info:
explore: "Poznaj"
@ -72,6 +82,7 @@ common:
hide-contents: "Ukryj zawartość"
reply-placeholder: "Odpowiedź na ten wpis…"
quote-placeholder: "Zacytuj ten wpis…"
quote-attached: "Z cytatem"
submit: "Wpis"
reply: "Odpowiedz"
renote: "Udostępnij"
@ -84,8 +95,10 @@ common:
visibility: "Widoczność"
error: "Błąd"
enter-username: "Wprowadź nazwę użytkownika"
specified-recipient: "Adresat"
add-visible-user: "Dodaj użytkownika"
username-prompt: "Wprowadź nazwę użytkownika"
enter-file-name: "Wprowadź nazwę pliku"
weekday-short:
sunday: "N"
monday: "Pn"
@ -144,10 +157,13 @@ common:
other: "Inne"
appearance: "Wygląd"
behavior: "Zachowanie"
reactions: "Reakcja"
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
note-visibility: "Widoczność wpisów"
remember-note-visibility: "Zapamiętaj widoczność wpisów"
web-search-engine: "Wyszukiwarka internetowa"
web-search-engine-desc: "Wzór: https://www.google.com/?#q={{query}}"
paste: "Wklej"
line-width: "Szerokości linii"
line-width-thin: "Cienka"
line-width-normal: "Normalna"
@ -176,6 +192,9 @@ common:
version: "Wersja:"
do-update: "Sprawdź dostępność nowych aktualizacji"
navbar-position-left: "Z lewej"
save: "Zapisz"
saved: "Zapisano"
preview: "Pokaż podgląd"
search: "Szukaj"
delete: "Usuń"
loading: "Ładowanie"
@ -412,6 +431,8 @@ common/views/components/emoji-picker.vue:
objects: "Rzeczy"
symbols: "Symbole"
flags: "Flagi"
common/views/components/settings/app-type.vue:
info: "Musisz odświeżyć stronę, aby zmiany zostały uwzględnione."
common/views/components/signin.vue:
username: "Nazwa użytkownika"
password: "Hasło"
@ -512,6 +533,7 @@ common/views/components/profile-editor.vue:
saved: "Pomyślnie zaktualizowano profil"
uploading: "Wysyłanie"
upload-failed: "Wysyłanie nie powiodło się"
unable-to-process: "Nie udało się ukończyć działania."
email: "Ustawienia e-mail"
email-address: "Adres e-mail"
email-verified: "Twój adres e-mail został zweryfikowany."
@ -606,6 +628,7 @@ desktop:
uploading-avatar: "Wysyłanie awatara"
avatar-updated: "Wysłano awatar"
choose-avatar: "Wybierz awatar"
unable-to-process: "Nie udało się ukończyć działania."
desktop/views/components/activity.chart.vue:
total: "Czarny … Łącznie"
notes: "Niebieski … Wpisy"
@ -664,6 +687,7 @@ desktop/views/components/drive.folder.vue:
rename: "Zmień nazwę"
rename-folder: "Zmień nazwę katalogu"
input-new-folder-name: "Wprowadź nową nazwę"
else-folders: "Inne"
desktop/views/components/drive.vue:
search: "Szukaj"
empty-draghover: "Przeciągnij tutaj!"
@ -783,6 +807,7 @@ common/views/components/drive-settings.vue:
max: "Max"
in-use: "użyto"
stats: "Statystyki"
default-upload-folder-name: "Katalog(i)"
common/views/components/mute-and-block.vue:
mute-and-block: "Wycisz / Zablokuj"
mute: "Wycisz"
@ -880,6 +905,7 @@ admin/views/instance.vue:
save: "Zapisz"
saved: "Zapisano"
email: "Adres e-mail"
test-email: "Test"
admin/views/charts.vue:
notes: "Wpisy"
users: "Użytkownicy"
@ -901,6 +927,7 @@ admin/views/drive.vue:
unmark-as-sensitive: "Cofnij oznaczenie jako zawartość wrażliwą"
admin/views/users.vue:
user-not-found: "Nie znaleziono użytkownika"
username: "Nazwa użytkownika"
users:
title: "Użytkownicy"
sort:
@ -916,6 +943,9 @@ admin/views/users.vue:
admin/views/moderators.vue:
add-moderator:
add: "Zarejestruj się"
logs:
moderator: "Moderatorzy"
info: "Informacje"
admin/views/emoji.vue:
add-emoji:
name: "Nazwa Emoji"
@ -1122,6 +1152,8 @@ mobile/views/pages/search.vue:
search: "Szukaj"
mobile/views/pages/selectdrive.vue:
select-file: "Wybierz plik"
mobile/views/pages/notifications.vue:
notifications: "Powiadomienia"
mobile/views/pages/settings.vue:
signed-in-as: "Zalogowany jako {}"
mobile/views/pages/user.vue:
@ -1186,6 +1218,8 @@ dev/views/new-app.vue:
app-name: "Nazwa Aplikacji"
authority: "Uprawnienia"
pages:
pin-this-page: "Przypnij do profilu"
unpin-this-page: "Odepnij"
like: "Lubię"
title: "Tytuł"
blocks:
@ -1203,6 +1237,8 @@ pages:
text: "Tytuł"
_button:
text: "Tytuł"
_radioButton:
title: "Tytuł"
script:
categories:
random: "Losowy"
@ -1219,5 +1255,14 @@ pages:
arg2: "Listy"
_pick:
arg1: "Listy"
_listLen:
arg1: "Listy"
types:
array: "Listy"
room:
translate: "Przenieś"
save: "Zapisz"
saved: "Zapisano"
furnitures:
moon: "Księżyc"
bin: "Kosz"

View File

@ -12,12 +12,12 @@ common:
rich-contents: "Post"
rich-contents-desc: "Apenas poste suas ideias, temas do momento e qualquer coisa que você queira compartilhar. Você pode querer decorar suas palavras, anexar suas imagens favoritas, enviar arquivos, inclusive vídeos ou criar uma enquete. Essas são as coisas que você pode fazer em Misskey."
reaction: "Reações"
adblock:
detected: "Por favor, desative o bloqueador de anúncios."
warning: "Alguns recursos podem não estar disponíveis ou apresentar mal funcionamento se o bloqueio de anúncios estiver ativado. <strong>Misskey não está usando anúncios</strong>"
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません"
application-authorization: "Aplicativos autorizados"
close: "Fechar"
do-not-copy-paste: "Por favor, não digite ou copie o código aqui. A conta pode ser comprometida."
notification-types:
follow: "Seguindo"
got-it: "Entendi!"
customization-tips:
title: "Dicas de personalização"
@ -282,3 +282,7 @@ pages:
blocks:
image: "Imagens"
post: "Formulário de publicação"
room:
furnitures:
moon: "Lua"
bin: "Lixo"

View File

@ -12,20 +12,25 @@ common:
rich-contents: "Посты"
rich-contents-desc: "Просто выложи свою идею, актуальные темы и всё, что тебе хочется показать миру. Ты можешь декорировать свои слова, прикреплять свои любимые картинки, отправлять файлы с фильмами и создать голосование - это те вещи, которые ты можешь сделать с помощью Misskey!"
reaction: "Реакции"
reaction-desc: "Самый лёгкий способ выразить свои эмоции. Misskey позволяет добавлять различные виды реакций к постам других людей. Эмоциональный опыт из Misskey никогда не появится в других социальных сетях, позволяющих только жать “лайки”."
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
ui: "Интерфейс"
ui-desc: "Нет такого интерфейса, понравившегося всем. Поэтому у Misskey имеется пользовательский интерфейс, широко настраиваемый под ваши вкусы. Создай себе уникальную домашнюю страницу редактируя, подстраивая оформление ленты и размещая виджеты, которые тоже можно кастомизировать."
drive: "Хранилище файлов"
drive-desc: "Хотите запостить картинку, которую уже отправляли ранее? Хочется сортировать, переименовать и создать папку для ваших выложенных файлов? Тогда Misskey Drive - это лучшее решение для вас. Очень лёгкий способ делиться своими файлами онлайн."
outro: "Попробуйте будущие, уникальные для Misskey функции своими глазами! Если чувствуете, что это не в вашем вкусе, то попробуйте другие инстанции, ведь Misskey - это децентрализованная социальная сеть, так что ты можешь с лёгкостью найти себе товарищей. И наконец, GLHF!"
adblock:
detected: "Пожалуйста, отключите блокировщик рекламы."
warning: "Некоторые функции перестанут быть доступными или будут работать неправильно, если включена блокировка рекламы. <strong>В Misskey нет рекламы</strong>."
application-authorization: "Авторизация приложений"
close: "Закрыть"
do-not-copy-paste: "Пожалуйста, не вводите и не вставляйте сюда код. Аккаунту может угрожать опасность."
load-more: "Загрузить больше"
enter-password: "Пожалуйста, введите ваш пароль"
2fa: "Двухфакторная аутентификация"
customize-home: "Настройка домашней страницы"
featured-notes: "Рекомендуемые"
dark-mode: "Тёмная тема"
signin: "Войти"
signup: "Регистрация"
signout: "Выйти"
reload-to-apply-the-setting: "Вам необходимо перезагрузить страницу, чтобы применить настройки. Вы хотите перезагрузить сейчас?"
customization-tips:
title: "Советы по настройке"
gotit: "Понятно!"
@ -51,7 +56,14 @@ common:
month-and-day: "{day}.{month}"
trash: "Мусорное ведро"
drive: "Drive"
pages: "Страницы"
messaging: "Чат"
timeline: "Лента"
followers: "Подписчики"
favorites: "Избранное"
post-form:
reply: "Ответить"
create-poll: "Создать опрос"
weekday-short:
sunday: "Вс"
monday: "Пн"
@ -153,3 +165,7 @@ pages:
random: "Случайно"
blocks:
random: "Случайно"
room:
furnitures:
moon: "Луна"
bin: "Мусорное ведро"

View File

@ -2,12 +2,12 @@
meta:
lang: "中文(简体)"
common:
misskey: "Fediverse中的一颗⭐"
about-title: "Fediverse中的一颗⭐"
about: "非常感谢您找到了Misskey。 Misskey是诞生于地球的<b>分布式微博SNS</b>。因为她处于Fediverse(由各种SNS组成的宇宙)中所以她与其他SNS相互连接。想要远离喧嚣的城市,不如深入这新的互联网来探索一下吧。"
misskey: "联邦宇宙中的一颗⭐"
about-title: "联邦宇宙中的一颗⭐"
about: "非常感谢您找到了Misskey。 Misskey是诞生于地球的<b>分布式微博SNS</b>。因为她处于联邦宇宙(由各种SNS组成的宇宙)中所以她与其他SNS相互连接。为什么不试试远离喧嚣的城市,入这新的网络海洋之中呢?"
intro:
title: "什么是 Misskey 呢?"
about: "Misskey是开源的<b>分散式微博SNS</b>。复杂的完全可定制的Ui各种各样的帖子反应提供集成管理系统和其他先进功能的免费文件存储。此外称为“Fediverse”的网络系统使我们能够与其他SNS的用户进行通信。比如如果你张贴一些东西那么你的帖子不仅会发送给Misskey还会发送到其他SNS平台。想象一下正如一颗行星和另一颗行星通过电磁波来进行通信一样。"
about: "Misskey是开源的<b>分散式微博SNS</b>。丰富且可以高度定制的Ui对别人的帖子进行各种回应集成管理系统的网盘等先进功能。此外称为“联邦世界”的网络系统使我们能够与其他SNS的用户进行通信。比如如果你发布一个帖子那么你的帖子不仅会发送给Misskey还会发送到其他SNS平台。想象一下正如一颗行星和另一颗行星通过电磁波来进行通信一样。"
features: "功能"
rich-contents: "发布"
rich-contents-desc: "请分享您的想法,热门话题,以及任何您想与大家分享的内容。如果有需要的话,您可以使用各种语法来修饰文章,发布问卷调查,或者添加各种您喜欢的图像和视频等文件。"
@ -16,11 +16,8 @@ common:
ui: "交互界面"
ui-desc: "世界上没有一个UI可以适合每一个人. 所以, Misskey 提供一个可以高度定制的UI交互界面. 您可以通过编辑, 调整布局, 放置可选择的小部件来轻松定制您的专属UI界面。"
drive: "网盘"
drive-desc: "想要发布一张您已经上传过的照片吗想要管理文件或为上传的文件创建文件夹吗Misskey的网盘是一个最好的解决方案。"
drive-desc: "想要发布一张您已经上传过的照片吗想要管理文件或为上传的文件创建文件夹吗Misskey的内置网盘将为您完美解决这些问题。简单地分享您的文件。"
outro: "Misskey还有其他更多功能请亲身体验一下吧。因为 Misskey 是一个分布式的 SNS如果您感觉某个功能不适合自己试试其他的吧。祝您玩得开心"
adblock:
detected: "请关闭广告拦截器"
warning: "<strong>Misskey不会发布广告</strong>如果您启用广告拦截器, 可能会导致某些功能无法正常使用。"
application-authorization: "应用程序授权"
close: "关闭"
do-not-copy-paste: "请不要在这里输入或粘贴代码。您帐户可能会受到损害。"
@ -35,6 +32,20 @@ common:
signout: "退出"
reload-to-apply-the-setting: "必须重新加载页面以应用此设置。 确实要立即重新加载吗?"
fetching-as-ap-object: "联合查询"
unfollow-confirm: "取消对{name}的关注?"
delete-confirm: "确定删除这个投稿吗?"
signin-required: "请先登录"
notification-type: "通知类型"
notification-types:
all: "所有"
pollVote: "投票"
follow: "关注中"
receiveFollowRequest: "关注请求"
reply: "回复"
quote: "引用"
renote: "转推"
mention: "提及"
reaction: "回应"
got-it: "知道了"
customization-tips:
title: "自定义提示"
@ -92,6 +103,12 @@ common:
"read:reactions": "查看回应"
"write:reactions": "回应操作"
"write:votes": "投票"
"read:pages": "查看页面"
"write:pages": "操作页面"
"read:page-likes": "查看喜欢的页面"
"write:page-likes": "操作喜欢的页面"
"read:user-groups": "查看用户组"
"write:user-groups": "操作用户组"
empty-timeline-info:
follow-users-to-make-your-timeline: "关注其他用户时,帖子将显示在时间线中。"
explore: "查找用户"
@ -119,9 +136,11 @@ common:
geolocation-alert: "您的设备不支持定位服务"
error: "错误"
enter-username: "输入用户名"
specified-recipient: "收件人"
add-visible-user: "添加用户"
cw-placeholder: "评论帖子(可选)"
username-prompt: "输入用户名"
enter-file-name: "编辑文件名"
weekday-short:
sunday: "日"
monday: "一"
@ -172,7 +191,7 @@ common:
profile: "个人资料"
notification: "通知"
apps: "应用程序"
tags: "哈希标签"
tags: "话题标签"
mute-and-block: "屏蔽/拉黑"
blocking: "拉黑"
security: "安全性"
@ -181,6 +200,8 @@ common:
other: "其他"
appearance: "设计"
behavior: "行为"
reactions: "回应"
reactions-description: "快速选择回应中的自定义表情符号,以换行符分隔。"
fetch-on-scroll: "向下滚动时自动加载"
fetch-on-scroll-desc: "向下滚动页面时,它会自动提取其他内容。"
note-visibility: "帖子可见性"
@ -188,6 +209,11 @@ common:
remember-note-visibility: "记住帖子可见性"
web-search-engine: "搜索引擎"
web-search-engine-desc: "例如: https://www.google.com/?#q={{query}}"
paste: "粘贴"
pasted-file-name: "粘贴的文件名模板"
pasted-file-name-desc: "例: \"yyyy-MM-dd HH-mm-ss [{{number}}]\" → \"2018-03-20 21-30-24 1\""
paste-dialog: "粘贴时编辑文件名"
paste-dialog-desc: "粘贴时显示编辑文件名的对话框"
keep-cw: "保留内容警告"
keep-cw-desc: "在回复帖子时,如果原帖设置了内容警告,默认情况下回帖也会设置相同的内容警告。"
i-like-sushi: "相比于布丁来说, 我更喜欢寿司。"
@ -195,6 +221,7 @@ common:
use-avatar-reversi-stones: "用头像作为黑白棋的棋子"
disable-animated-mfm: "在帖子中禁用动画文本"
disable-showing-animated-images: "不播放动画"
enable-quick-notification-view: "启用通知快速查看"
suggest-recent-hashtags: "在帖子表单上显示最近流行的哈希标签"
always-show-nsfw: "总是显示 NSFW 的内容"
always-mark-nsfw: "总是用 NSFW 来标记附件"
@ -225,7 +252,7 @@ common:
deck-column-width-wide: "宽"
use-shadow: "在UI中使用阴影效果"
rounded-corners: "UI界面圆角效果"
circle-icons: "使用圆形图标"
circle-icons: "使用圆形头像"
contrasted-acct: "增加用户名的对比度"
wallpaper: "壁纸"
choose-wallpaper: "选择壁纸"
@ -270,6 +297,22 @@ common:
disable-via-mobile: "不要将帖子标记为“来自手机”"
load-raw-images: "以原始质量显示附加图像"
load-remote-media: "显示来自远程服务器的媒体"
sync: "同步"
save: "保存"
saved: "已保存"
preview: "预览"
home-profile: "定制首页数据"
deck-profile: "定制Deck数据"
room: "房间"
_room:
graphicsQuality: "图形质量"
_graphicsQuality:
ultra: "最高"
high: "高"
medium: "中"
low: "低"
cheep: "最低"
useOrthographicCamera: "使用正交相机"
search: "搜索"
delete: "删除"
loading: "正在加载中"
@ -321,7 +364,7 @@ common:
notifications: "通知"
users: "推荐用户"
polls: "调查问卷"
post-form: "投稿形式"
post-form: "投稿窗口"
server: "服务器信息"
nav: "导航"
tips: "提示"
@ -350,10 +393,15 @@ common/views/pages/explore.vue:
popular-users: "热门用户"
recently-updated-users: "活跃用户"
recently-registered-users: "新用户"
recently-discovered-users: "最近发现的用户"
popular-tags: "热门标签"
federated: "联"
federated: "联"
explore: "查找{host}"
explore-fediverse: "探索Fediverse"
users-info: "当前有{users}个注册用户"
common/views/components/reactions-viewer.details.vue:
few-users: "{users}作出了{reaction}的回应"
many-users: "{users}和其他{omitted}人做出了{reaction}的回应"
common/views/components/url-preview.vue:
enable-player: "打开播放器"
disable-player: "关闭播放器"
@ -519,7 +567,10 @@ common/views/components/note-menu.vue:
unpin: "取消置顶"
delete: "删除"
delete-confirm: "确定删除这个投稿吗?"
delete-and-edit: "删除和编辑"
delete-and-edit-confirm: "要删除此帖并再次编辑吗?对此帖的所有回应,转推和回复也将被删除。"
remote: "显示原始投稿"
pin-limit-exceeded: "无法置顶更多了。"
common/views/components/user-menu.vue:
mention: "提到"
mute: "屏蔽"
@ -579,7 +630,9 @@ common/views/components/reaction-picker.vue:
choose-reaction: "选择回应"
input-reaction-placeholder: "表情符号输入"
common/views/components/emoji-picker.vue:
recent-emoji: "最近使用的表情符号"
custom-emoji: "自定义表情符号"
no-category: "未分类"
people: "人"
animals-and-nature: "动物与自然"
food-and-drink: "食物与饮品"
@ -588,16 +641,26 @@ common/views/components/emoji-picker.vue:
objects: "物品"
symbols: "符号"
flags: "旗帜"
common/views/components/settings/app-type.vue:
title: "模式"
intro: "您可以指定使用桌面版或移动版。"
choices:
auto: "自动选择"
desktop: "固定为桌面版"
mobile: "固定为移动版"
info: "更改将在刷新页面后生效。"
common/views/components/signin.vue:
username: "用户名"
password: "密码"
token: "Token (令牌)"
signing-in: "正在登录..."
signing-in: "在弄了在弄了..."
or: "或者"
signin-with-twitter: "用 Twitter 登录"
signin-with-github: "用 GitHub 登录"
signin-with-discord: "用 Discord 登录"
login-failed: "登录失败。请检查用户名和密码。"
tap-key: "点击安全密钥登录"
enter-2fa-code: "输入验证码"
common/views/components/signup.vue:
invitation-code: "邀请码"
invitation-info: "如果您没有邀请码,请联系<a href=\"{}\">管理员</a>。"
@ -702,6 +765,9 @@ common/views/components/profile-editor.vue:
saved: "您的个人资料已保存"
uploading: "正在上传"
upload-failed: "上传失败"
unable-to-process: "无法完成操作"
avatar-not-an-image: "选择的头像文件不是图片格式"
banner-not-an-image: "选择的横幅背景不是图片格式"
email: "邮件设置"
email-address: "电子邮件地址"
email-verified: "电子邮件地址已验证"
@ -721,6 +787,9 @@ common/views/components/profile-editor.vue:
danger-zone: "危险选项"
delete-account: "删除帐户"
account-deleted: "帐户已被删除。 数据会在一段时间之后清除。"
profile-metadata: "个人资料补充信息"
metadata-label: "标签"
metadata-content: "内容"
common/views/components/user-list-editor.vue:
users: "用户"
rename: "重命名列表"
@ -759,6 +828,7 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "没有公告"
have-a-nice-day: "祝你有愉快的一天!"
next: "下一个"
prev: "上一首"
common/views/widgets/calendar.vue:
year: "{}年"
month: "{}月"
@ -830,6 +900,7 @@ desktop:
uploading-avatar: "上传一个新的头像"
avatar-updated: "成功上传头像"
choose-avatar: "选择作为头像的图片"
unable-to-process: "无法完成操作"
invalid-filetype: "不接受此文件类型"
desktop/views/components/activity.chart.vue:
total: "黑 ... 总计"
@ -859,7 +930,7 @@ desktop/views/components/crop-window.vue:
cancel: "取消"
ok: "确定"
desktop/views/components/drive-window.vue:
used: "使用"
used: "使用"
desktop/views/components/drive.file.vue:
avatar: "头像"
banner: "背景"
@ -870,8 +941,8 @@ desktop/views/components/drive.file.vue:
unmark-as-sensitive: "取消标记为“敏感”"
copy-url: "复制链接"
download: "下载"
else-files: "其他..."
set-as-avatar: "设为头像"
else-files: "其他"
set-as-avatar: "设为头像"
set-as-banner: "设置为背景"
open-in-app: "在应用程序中打开"
add-app: "添加应用"
@ -880,15 +951,20 @@ desktop/views/components/drive.file.vue:
copied: "已复制"
copied-url-to-clipboard: "已复制链接到剪贴板"
desktop/views/components/drive.folder.vue:
upload-folder: "默认上传文件夹"
unable-to-process: "无法完成操作"
circular-reference-detected: "目标文件夹是您要移动的文件夹的子文件夹。"
unhandled-error: "未知错误"
unable-to-delete: "无法删除"
has-child-files-or-folders: "此文件夹不为空,无法删除。"
contextmenu:
move-to-this-folder: "移动到此文件夹"
show-in-new-window: "在新窗口打开"
rename: "重命名"
rename-folder: "重命名文件夹"
input-new-folder-name: "请输入新文件名"
else-folders: "其他"
set-as-upload-folder: "设置为默认上传文件夹"
desktop/views/components/drive.vue:
search: "搜索"
empty-draghover: "放在这里!因为你知道我很可爱,对吗?"
@ -994,6 +1070,16 @@ desktop/views/components/settings.2fa.vue:
success: "设置完成"
failed: "设置失败, 请确保您的密钥是正确的。"
info: "从下次登录Misskey时您的设备上显示的令牌以及密码也是必需的。"
totp-header: "身份验证 App"
security-key-header: "安全密钥"
security-key: "为了增强安全性您可以使用支持FIDO2的硬件安全密钥登录您的帐户。 登录时,您将需要注册安全密钥或身份验证应用。"
last-used: "最后使用:"
activate-key: "单击以激活您的安全密钥"
security-key-name: "密钥名称"
register-security-key: "安全密钥注册完成"
something-went-wrong: "糟糕!安全密钥注册出现问题:"
key-unregistered: "安全密钥已被删除。"
use-password-less-login: "使用免密码登录"
common/views/components/media-image.vue:
sensitive: "阅读注意"
click-to-show: "点击查看"
@ -1016,8 +1102,11 @@ desktop/views/components/settings.apps.vue:
no-apps: "没有已连接的应用程序"
common/views/components/drive-settings.vue:
max: "容量"
in-use: "正在使用"
in-use: "使用"
stats: "统计"
default-upload-folder: "默认上传文件夹"
default-upload-folder-name: "文件夹"
change-default-upload-folder: "更改文件夹"
common/views/components/mute-and-block.vue:
mute-and-block: "屏蔽/拉黑"
mute: "屏蔽"
@ -1027,6 +1116,8 @@ common/views/components/mute-and-block.vue:
word-mute: "文字屏蔽"
muted-words: "屏蔽关键字"
muted-words-description: "使用空格分隔会产生AND规范并且使用换行符分隔会产生OR规范"
unmute-confirm: "取消屏蔽用户?"
unblock-confirm: "取消拉黑此用户?"
save: "保存"
common/views/components/password-settings.vue:
reset: "更改密码"
@ -1071,6 +1162,7 @@ desktop/views/components/ui.header.account.vue:
groups: "群组"
follow-requests: "关注申请"
admin: "管理"
room: "房间"
desktop/views/components/ui.header.nav.vue:
game: "游戏"
desktop/views/components/ui.header.notifications.vue:
@ -1093,23 +1185,29 @@ desktop/views/components/window.vue:
popout: "弹出"
close: "关闭"
admin/views/index.vue:
dashboard: "Dashboard"
instance: "例"
emoji: "Emoji"
dashboard: "仪表盘"
instance: "例"
emoji: "自定义Emoji"
moderators: "版主"
users: "用户"
federation: "联"
federation: "联"
announcements: "公告"
abuse: "举报垃圾信息"
queue: "作业队列"
logs: "登录"
logs: "日志"
db: "数据库"
back-to-misskey: "返回 Misskey"
admin/views/db.vue:
tables: "表格"
vacuum: "VACUUM"
vacuum-info: "清理数据库。 保持数据完整并减少磁盘使用量。 此操作通常会自动定期执行。"
vacuum-exclamation: "运行VACUUM之后数据库上的负载可能会持续一段时间并且可能不响应用户操作。"
admin/views/dashboard.vue:
dashboard: "Dashboard"
accounts: "账户"
notes: "帖子"
drive: "网盘"
instances: "例"
instances: "例"
this-instance: "此实例"
federated: "联合"
admin/views/queue.vue:
@ -1130,7 +1228,7 @@ admin/views/queue.vue:
result-is-truncated: "结果已省略"
other-queues: "其他队列"
admin/views/logs.vue:
logs: "登录"
logs: "日志"
domain: "域"
level: "级别"
levels:
@ -1148,7 +1246,7 @@ admin/views/abuse.vue:
details: "详情"
remove-report: "删除"
admin/views/instance.vue:
instance: "例"
instance: "例"
instance-name: "实例名称"
instance-description: "实例介绍"
host: "主机名"
@ -1181,7 +1279,7 @@ admin/views/instance.vue:
object-storage-s3-info-here: "这里"
object-storage-gcs-info: "将Google Cloud Storage用作对象存储时请将“终端”设置为storage.googleapis.com并将“区域”留空。"
cache-remote-files: "远程文件缓存"
cache-remote-files-desc: "如果没有此参数,则所有远程文件都将直接链接到其主机服务器。 这将是保存服务器存储的有效解决方案,但是对于设置禁用直接链接的用户而言,远程文件不可见,因为不会生成缩略图,从而增加流量。 建议启用此参数集。"
proxy-remote-files: "代理远程文件"
local-drive-capacity-mb: "每个用户的网盘空间"
remote-drive-capacity-mb: "每个远程用户的网盘容量"
mb: "以兆字节(Mbps)为单位"
@ -1238,6 +1336,7 @@ admin/views/instance.vue:
smtp-auth: "SMTP身份验证"
smtp-user: "SMTP 用户名"
smtp-pass: "SMTP 密码"
test-email: "测试"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "启用ServiceWorker"
serviceworker-info: "您需要启用推送通知"
@ -1317,6 +1416,8 @@ admin/views/users.vue:
remote-user-updated: "远程用户信息已更新"
delete-all-files: "删除所有文件"
delete-all-files-confirm: "删除所有文件吗?"
username: "用户名"
host: "主机名"
users:
title: "用户"
sort:
@ -1328,6 +1429,7 @@ admin/views/users.vue:
state:
title: "状态"
all: "全部"
available: "可用"
admin: "管理员"
moderator: "版主"
adminOrModerator: "管理员+版主"
@ -1347,11 +1449,18 @@ admin/views/moderators.vue:
added: "已注册版主。"
remove: "取消"
removed: "取消注册版主"
logs:
title: "日志"
moderator: "版主"
type: "操作"
at: "日期和时间"
info: "信息"
admin/views/emoji.vue:
add-emoji:
title: "添加emoji"
name: "Emoji 名称"
name-desc: "你可以使用字符a~z 0~9 _"
category: "类别"
aliases: "别名"
aliases-desc: "您可以添加多个,以空格分隔。"
url: "emoji 地址"
@ -1396,7 +1505,7 @@ admin/views/federation.vue:
block: "拉黑"
marked-as-closed: "标记为已关闭"
lookup: "查询"
instances: "联"
instances: "联"
instance-not-registered: "实例未注册"
sort: "排序"
sorts:
@ -1516,9 +1625,9 @@ desktop/views/widgets/trends.vue:
desktop/views/widgets/users.vue:
title: "推荐用户"
refresh: "更多"
no-one: "不是"
no-one: "没有任何推荐用户"
mobile/views/components/drive.vue:
used: "使用"
used: "使用"
folder-count: "文件夹"
count-separator: ""
file-count: "文件"
@ -1635,6 +1744,8 @@ mobile/views/pages/search.vue:
not-found: "没有找到有关于“{q}”的帖子"
mobile/views/pages/selectdrive.vue:
select-file: "选择文件"
mobile/views/pages/notifications.vue:
notifications: "通知"
mobile/views/pages/settings.vue:
signed-in-as: "以{}登录"
mobile/views/pages/user.vue:
@ -1693,6 +1804,7 @@ deck/deck.user-column.vue:
activity: "活动"
timeline: "时间线"
pinned-notes: "置顶帖"
pinned-page: "已置顶的页面"
docs:
edit-this-page-on-github: "发现错误或想要为文档做出贡献?"
edit-this-page-on-github-link: "在GitHub上编辑这个页面。"
@ -1724,9 +1836,14 @@ pages:
read-page: "查看源"
page-created: "页面已创建"
page-updated: "页面已更新"
name-already-exists: "该页面URL已存在"
title-invalid-name: "无效的页面URL"
text-invalid-name: "请确认该项不为空"
are-you-sure-delete: "是否删除此页面?"
page-deleted: "该页面已被删除。"
edit-this-page: "编辑此页面"
pin-this-page: "置顶"
unpin-this-page: "取消置顶"
view-source: "查看源代码"
view-page: "查看页面"
like: "赞"
@ -1745,6 +1862,7 @@ pages:
url: "页面URL"
summary: "页面摘要"
align-center: "居中"
hide-title-when-pinned: "置顶时隐藏标题"
font: "字体"
fontSerif: "衬线字体"
fontSansSerif: "无衬线字体"
@ -1765,10 +1883,10 @@ pages:
section: "章节"
image: "图片"
button: "按钮"
if: "如果"
if: "判断"
_if:
variable: "变量"
post: "投稿形式"
post: "投稿窗口"
_post:
text: "内容"
textInput: "文本输入"
@ -1798,12 +1916,25 @@ pages:
inc: "增加值"
_button:
text: "标题"
colored: "彩色"
action: "按下按钮时的行为"
_action:
dialog: "显示对话框"
_dialog:
content: "内容"
resetRandom: "随机值重置"
pushEvent: "发送事件"
_pushEvent:
event: "事件名称"
message: "按下时显示的消息"
variable: "发送的变量"
no-variable: "空"
radioButton: "选择项"
_radioButton:
name: "变量名"
title: "标题"
values: "使用换行区分的选择项"
default: "默认值"
script:
categories:
flow: "控制"
@ -1857,10 +1988,13 @@ pages:
_divide:
arg1: "A"
arg2: "B"
remind: "÷ 取模"
_remind:
mod: "÷ 取模"
_mod:
arg1: "A"
arg2: "B"
round: "四舍五入"
_round:
arg1: "数值"
eq: "A和B相等"
_eq:
arg1: "A"
@ -1941,6 +2075,9 @@ pages:
_pick:
arg1: "列表"
arg2: "位置"
listLen: "获取列表长度"
_listLen:
arg1: "列表"
number: "数值"
stringToNumber: "文本到数字"
_stringToNumber:
@ -1973,3 +2110,64 @@ pages:
enviromentVariables: "环境变量"
pageVariables: "页面元素"
argVariables: "输入槽函数"
room:
add-furniture: "放置家具"
translate: "移动"
rotate: "旋转"
exit: "返回"
remove: "移除"
save: "保存"
saved: "已保存"
clear: "清理"
clear-confirm: "是否清除所有家具?"
leave-confirm: "有尚未保存的修改。是否离开?"
chooseImage: "选择图片"
room-type: "房间类型"
carpet-color: "地板颜色"
rooms:
default: "默认"
washitsu: "和式房间"
furnitures:
milk: "牛奶纸箱"
bed: "床"
low-table: "矮桌"
desk: "书桌"
chair: "椅子"
chair2: "椅子2"
fan: "换气扇"
pc: "电脑"
plant: "观叶植物"
plant2: "观叶植物2"
eraser: "橡皮擦"
pencil: "铅笔"
pudding: "布丁"
cardboard-box: "纸板箱"
cardboard-box2: "纸板箱2"
cardboard-box3: "纸板箱3"
book: "书"
book2: "书2"
piano: "钢琴"
facial-tissue: "纸巾盒"
server: "服务器"
moon: "月球"
corkboard: "软木板"
mousepad: "鼠标垫"
monitor: "显示器"
keyboard: "键盘"
carpet-stripe: "地毯(条纹)"
mat: "垫子"
color-box: "收纳柜"
wall-clock: "挂钟"
photoframe: "相框"
cube: "立方体"
tv: "电视"
pinguin: "企鹅君"
rubik-cube: "魔方"
poster-h: "海报(横向)"
poster-v: "海报(纵向)"
sofa: "沙发"
spiral: "螺旋楼梯"
bin: "垃圾箱"
cup-noodle: "杯面"
holo-display: "全息显示器"
energy-drink: "能量饮料"

View File

@ -7,8 +7,6 @@ common:
rich-contents: "發佈"
reaction: "回應"
drive: "雲端硬碟"
adblock:
detected: "請禁用廣告封鎖器"
close: "關閉"
enter-password: "請輸入密碼"
2fa: "雙重身份驗證"
@ -88,3 +86,6 @@ admin/views/charts.vue:
drive: "雲端硬碟"
pages:
like: "贊"
room:
furnitures:
moon: "月"

View File

@ -0,0 +1,485 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class Init1000000000000 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`CREATE TYPE "log_level_enum" AS ENUM('error', 'warning', 'info', 'success', 'debug')`);
await queryRunner.query(`CREATE TABLE "log" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "domain" character varying(64) array NOT NULL DEFAULT '{}'::varchar[], "level" "log_level_enum" NOT NULL, "worker" character varying(8) NOT NULL, "machine" character varying(128) NOT NULL, "message" character varying(1024) NOT NULL, "data" jsonb NOT NULL DEFAULT '{}', CONSTRAINT "PK_350604cbdf991d5930d9e618fbd" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_8e4eb51a35d81b64dda28eed0a" ON "log" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_8cb40cfc8f3c28261e6f887b03" ON "log" ("domain") `);
await queryRunner.query(`CREATE INDEX "IDX_584b536b49e53ac81beb39a177" ON "log" ("level") `);
await queryRunner.query(`CREATE TABLE "drive_folder" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "name" character varying(128) NOT NULL, "userId" character varying(32), "parentId" character varying(32), CONSTRAINT "PK_7a0c089191f5ebdc214e0af808a" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_02878d441ceae15ce060b73daf" ON "drive_folder" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_f4fc06e49c0171c85f1c48060d" ON "drive_folder" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_00ceffb0cdc238b3233294f08f" ON "drive_folder" ("parentId") `);
await queryRunner.query(`CREATE TABLE "drive_file" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32), "userHost" character varying(128), "md5" character varying(32) NOT NULL, "name" character varying(256) NOT NULL, "type" character varying(128) NOT NULL, "size" integer NOT NULL, "comment" character varying(512), "properties" jsonb NOT NULL DEFAULT '{}', "storedInternal" boolean NOT NULL, "url" character varying(512) NOT NULL, "thumbnailUrl" character varying(512), "webpublicUrl" character varying(512), "accessKey" character varying(256), "thumbnailAccessKey" character varying(256), "webpublicAccessKey" character varying(256), "uri" character varying(512), "src" character varying(512), "folderId" character varying(32), "isSensitive" boolean NOT NULL DEFAULT false, "isLink" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_43ddaaaf18c9e68029b7cbb032e" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_c8dfad3b72196dd1d6b5db168a" ON "drive_file" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_860fa6f6c7df5bb887249fba22" ON "drive_file" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_92779627994ac79277f070c91e" ON "drive_file" ("userHost") `);
await queryRunner.query(`CREATE INDEX "IDX_37bb9a1b4585f8a3beb24c62d6" ON "drive_file" ("md5") `);
await queryRunner.query(`CREATE INDEX "IDX_a40b8df8c989d7db937ea27cf6" ON "drive_file" ("type") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_d85a184c2540d2deba33daf642" ON "drive_file" ("accessKey") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_e74022ce9a074b3866f70e0d27" ON "drive_file" ("thumbnailAccessKey") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_c55b2b7c284d9fef98026fc88e" ON "drive_file" ("webpublicAccessKey") `);
await queryRunner.query(`CREATE INDEX "IDX_e5848eac4940934e23dbc17581" ON "drive_file" ("uri") `);
await queryRunner.query(`CREATE INDEX "IDX_bb90d1956dafc4068c28aa7560" ON "drive_file" ("folderId") `);
await queryRunner.query(`CREATE TABLE "user" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE, "lastFetchedAt" TIMESTAMP WITH TIME ZONE, "username" character varying(128) NOT NULL, "usernameLower" character varying(128) NOT NULL, "name" character varying(128), "followersCount" integer NOT NULL DEFAULT 0, "followingCount" integer NOT NULL DEFAULT 0, "notesCount" integer NOT NULL DEFAULT 0, "avatarId" character varying(32), "bannerId" character varying(32), "tags" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "avatarUrl" character varying(512), "bannerUrl" character varying(512), "avatarColor" character varying(32), "bannerColor" character varying(32), "isSuspended" boolean NOT NULL DEFAULT false, "isSilenced" boolean NOT NULL DEFAULT false, "isLocked" boolean NOT NULL DEFAULT false, "isBot" boolean NOT NULL DEFAULT false, "isCat" boolean NOT NULL DEFAULT false, "isAdmin" boolean NOT NULL DEFAULT false, "isModerator" boolean NOT NULL DEFAULT false, "isVerified" boolean NOT NULL DEFAULT false, "emojis" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "host" character varying(128), "inbox" character varying(512), "sharedInbox" character varying(512), "featured" character varying(512), "uri" character varying(512), "token" character(16), CONSTRAINT "UQ_a854e557b1b14814750c7c7b0c9" UNIQUE ("token"), CONSTRAINT "REL_58f5c71eaab331645112cf8cfa" UNIQUE ("avatarId"), CONSTRAINT "REL_afc64b53f8db3707ceb34eb28e" UNIQUE ("bannerId"), CONSTRAINT "PK_cace4a159ff9f2512dd42373760" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_e11e649824a45d8ed01d597fd9" ON "user" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_80ca6e6ef65fb9ef34ea8c90f4" ON "user" ("updatedAt") `);
await queryRunner.query(`CREATE INDEX "IDX_a27b942a0d6dcff90e3ee9b5e8" ON "user" ("usernameLower") `);
await queryRunner.query(`CREATE INDEX "IDX_fa99d777623947a5b05f394cae" ON "user" ("tags") `);
await queryRunner.query(`CREATE INDEX "IDX_3252a5df8d5bbd16b281f7799e" ON "user" ("host") `);
await queryRunner.query(`CREATE INDEX "IDX_be623adaa4c566baf5d29ce0c8" ON "user" ("uri") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a854e557b1b14814750c7c7b0c" ON "user" ("token") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_5deb01ae162d1d70b80d064c27" ON "user" ("usernameLower", "host") `);
await queryRunner.query(`CREATE TABLE "app" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32), "secret" character varying(64) NOT NULL, "name" character varying(128) NOT NULL, "description" character varying(512) NOT NULL, "permission" character varying(64) array NOT NULL, "callbackUrl" character varying(512), CONSTRAINT "PK_9478629fc093d229df09e560aea" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_048a757923ed8b157e9895da53" ON "app" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_3f5b0899ef90527a3462d7c2cb" ON "app" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_f49922d511d666848f250663c4" ON "app" ("secret") `);
await queryRunner.query(`CREATE TABLE "access_token" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "token" character varying(128) NOT NULL, "hash" character varying(128) NOT NULL, "userId" character varying(32) NOT NULL, "appId" character varying(32) NOT NULL, CONSTRAINT "PK_f20f028607b2603deabd8182d12" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_70ba8f6af34bc924fc9e12adb8" ON "access_token" ("token") `);
await queryRunner.query(`CREATE INDEX "IDX_64c327441248bae40f7d92f34f" ON "access_token" ("hash") `);
await queryRunner.query(`CREATE INDEX "IDX_9949557d0e1b2c19e5344c171e" ON "access_token" ("userId") `);
await queryRunner.query(`CREATE TYPE "note_visibility_enum" AS ENUM('public', 'home', 'followers', 'specified')`);
await queryRunner.query(`CREATE TABLE "note" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "replyId" character varying(32), "renoteId" character varying(32), "text" text, "name" character varying(256), "cw" character varying(512), "appId" character varying(32), "userId" character varying(32) NOT NULL, "viaMobile" boolean NOT NULL DEFAULT false, "localOnly" boolean NOT NULL DEFAULT false, "renoteCount" smallint NOT NULL DEFAULT 0, "repliesCount" smallint NOT NULL DEFAULT 0, "reactions" jsonb NOT NULL DEFAULT '{}', "visibility" "note_visibility_enum" NOT NULL, "uri" character varying(512), "score" integer NOT NULL DEFAULT 0, "fileIds" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], "attachedFileTypes" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "visibleUserIds" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], "mentions" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], "mentionedRemoteUsers" text NOT NULL DEFAULT '[]', "emojis" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "tags" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "hasPoll" boolean NOT NULL DEFAULT false, "geo" jsonb DEFAULT null, "userHost" character varying(128), "replyUserId" character varying(32), "replyUserHost" character varying(128), "renoteUserId" character varying(32), "renoteUserHost" character varying(128), CONSTRAINT "PK_96d0c172a4fba276b1bbed43058" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_e7c0567f5261063592f022e9b5" ON "note" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_17cb3553c700a4985dff5a30ff" ON "note" ("replyId") `);
await queryRunner.query(`CREATE INDEX "IDX_52ccc804d7c69037d558bac4c9" ON "note" ("renoteId") `);
await queryRunner.query(`CREATE INDEX "IDX_5b87d9d19127bd5d92026017a7" ON "note" ("userId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_153536c67d05e9adb24e99fc2b" ON "note" ("uri") `);
await queryRunner.query(`CREATE INDEX "IDX_51c063b6a133a9cb87145450f5" ON "note" ("fileIds") `);
await queryRunner.query(`CREATE INDEX "IDX_25dfc71b0369b003a4cd434d0b" ON "note" ("attachedFileTypes") `);
await queryRunner.query(`CREATE INDEX "IDX_796a8c03959361f97dc2be1d5c" ON "note" ("visibleUserIds") `);
await queryRunner.query(`CREATE INDEX "IDX_54ebcb6d27222913b908d56fd8" ON "note" ("mentions") `);
await queryRunner.query(`CREATE INDEX "IDX_88937d94d7443d9a99a76fa5c0" ON "note" ("tags") `);
await queryRunner.query(`CREATE INDEX "IDX_7125a826ab192eb27e11d358a5" ON "note" ("userHost") `);
await queryRunner.query(`CREATE TABLE "poll_vote" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "choice" integer NOT NULL, CONSTRAINT "PK_fd002d371201c472490ba89c6a0" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_0fb627e1c2f753262a74f0562d" ON "poll_vote" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_66d2bd2ee31d14bcc23069a89f" ON "poll_vote" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_aecfbd5ef60374918e63ee95fa" ON "poll_vote" ("noteId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_50bd7164c5b78f1f4a42c4d21f" ON "poll_vote" ("userId", "noteId", "choice") `);
await queryRunner.query(`CREATE TABLE "note_reaction" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "reaction" character varying(128) NOT NULL, CONSTRAINT "PK_767ec729b108799b587a3fcc9cf" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_01f4581f114e0ebd2bbb876f0b" ON "note_reaction" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_13761f64257f40c5636d0ff95e" ON "note_reaction" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_45145e4953780f3cd5656f0ea6" ON "note_reaction" ("noteId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_ad0c221b25672daf2df320a817" ON "note_reaction" ("userId", "noteId") `);
await queryRunner.query(`CREATE TABLE "note_watching" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "noteUserId" character varying(32) NOT NULL, CONSTRAINT "PK_49286fdb23725945a74aa27d757" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_318cdf42a9cfc11f479bd802bb" ON "note_watching" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_b0134ec406e8d09a540f818288" ON "note_watching" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_03e7028ab8388a3f5e3ce2a861" ON "note_watching" ("noteId") `);
await queryRunner.query(`CREATE INDEX "IDX_44499765eec6b5489d72c4253b" ON "note_watching" ("noteUserId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a42c93c69989ce1d09959df4cf" ON "note_watching" ("userId", "noteId") `);
await queryRunner.query(`CREATE TABLE "note_unread" ("id" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "noteUserId" character varying(32) NOT NULL, "isSpecified" boolean NOT NULL, CONSTRAINT "PK_1904eda61a784f57e6e51fa9c1f" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_56b0166d34ddae49d8ef7610bb" ON "note_unread" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_e637cba4dc4410218c4251260e" ON "note_unread" ("noteId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_d908433a4953cc13216cd9c274" ON "note_unread" ("userId", "noteId") `);
await queryRunner.query(`CREATE TABLE "notification" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "notifieeId" character varying(32) NOT NULL, "notifierId" character varying(32) NOT NULL, "type" character varying(32) NOT NULL, "isRead" boolean NOT NULL DEFAULT false, "noteId" character varying(32), "reaction" character varying(128), "choice" integer, CONSTRAINT "PK_705b6c7cdf9b2c2ff7ac7872cb7" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_b11a5e627c41d4dc3170f1d370" ON "notification" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_3c601b70a1066d2c8b517094cb" ON "notification" ("notifieeId") `);
await queryRunner.query(`CREATE TABLE "meta" ("id" character varying(32) NOT NULL, "name" character varying(128), "description" character varying(1024), "maintainerName" character varying(128), "maintainerEmail" character varying(128), "announcements" jsonb NOT NULL DEFAULT '[]', "disableRegistration" boolean NOT NULL DEFAULT false, "disableLocalTimeline" boolean NOT NULL DEFAULT false, "disableGlobalTimeline" boolean NOT NULL DEFAULT false, "enableEmojiReaction" boolean NOT NULL DEFAULT true, "useStarForReactionFallback" boolean NOT NULL DEFAULT false, "langs" character varying(64) array NOT NULL DEFAULT '{}'::varchar[], "hiddenTags" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "blockedHosts" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "mascotImageUrl" character varying(512) DEFAULT '/assets/ai.png', "bannerUrl" character varying(512), "errorImageUrl" character varying(512) DEFAULT 'https://xn--931a.moe/aiart/yubitun.png', "iconUrl" character varying(512), "cacheRemoteFiles" boolean NOT NULL DEFAULT true, "proxyAccount" character varying(128), "enableRecaptcha" boolean NOT NULL DEFAULT false, "recaptchaSiteKey" character varying(64), "recaptchaSecretKey" character varying(64), "localDriveCapacityMb" integer NOT NULL DEFAULT 1024, "remoteDriveCapacityMb" integer NOT NULL DEFAULT 32, "maxNoteTextLength" integer NOT NULL DEFAULT 500, "summalyProxy" character varying(128), "enableEmail" boolean NOT NULL DEFAULT false, "email" character varying(128), "smtpSecure" boolean NOT NULL DEFAULT false, "smtpHost" character varying(128), "smtpPort" integer, "smtpUser" character varying(128), "smtpPass" character varying(128), "enableServiceWorker" boolean NOT NULL DEFAULT false, "swPublicKey" character varying(128), "swPrivateKey" character varying(128), "enableTwitterIntegration" boolean NOT NULL DEFAULT false, "twitterConsumerKey" character varying(128), "twitterConsumerSecret" character varying(128), "enableGithubIntegration" boolean NOT NULL DEFAULT false, "githubClientId" character varying(128), "githubClientSecret" character varying(128), "enableDiscordIntegration" boolean NOT NULL DEFAULT false, "discordClientId" character varying(128), "discordClientSecret" character varying(128), CONSTRAINT "PK_c4c17a6c2bd7651338b60fc590b" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE TABLE "following" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "followeeId" character varying(32) NOT NULL, "followerId" character varying(32) NOT NULL, "followerHost" character varying(128), "followerInbox" character varying(512), "followerSharedInbox" character varying(512), "followeeHost" character varying(128), "followeeInbox" character varying(512), "followeeSharedInbox" character varying(512), CONSTRAINT "PK_c76c6e044bdf76ecf8bfb82a645" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_582f8fab771a9040a12961f3e7" ON "following" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_24e0042143a18157b234df186c" ON "following" ("followeeId") `);
await queryRunner.query(`CREATE INDEX "IDX_6516c5a6f3c015b4eed39978be" ON "following" ("followerId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_307be5f1d1252e0388662acb96" ON "following" ("followerId", "followeeId") `);
await queryRunner.query(`CREATE TABLE "instance" ("id" character varying(32) NOT NULL, "caughtAt" TIMESTAMP WITH TIME ZONE NOT NULL, "host" character varying(128) NOT NULL, "system" character varying(64), "usersCount" integer NOT NULL DEFAULT 0, "notesCount" integer NOT NULL DEFAULT 0, "followingCount" integer NOT NULL DEFAULT 0, "followersCount" integer NOT NULL DEFAULT 0, "driveUsage" integer NOT NULL DEFAULT 0, "driveFiles" integer NOT NULL DEFAULT 0, "latestRequestSentAt" TIMESTAMP WITH TIME ZONE, "latestStatus" integer, "latestRequestReceivedAt" TIMESTAMP WITH TIME ZONE, "lastCommunicatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, "isNotResponding" boolean NOT NULL DEFAULT false, "isMarkedAsClosed" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_eaf60e4a0c399c9935413e06474" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_2cd3b2a6b4cf0b910b260afe08" ON "instance" ("caughtAt") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_8d5afc98982185799b160e10eb" ON "instance" ("host") `);
await queryRunner.query(`CREATE TABLE "muting" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "muteeId" character varying(32) NOT NULL, "muterId" character varying(32) NOT NULL, CONSTRAINT "PK_2e92d06c8b5c602eeb27ca9ba48" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_f86d57fbca33c7a4e6897490cc" ON "muting" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_ec96b4fed9dae517e0dbbe0675" ON "muting" ("muteeId") `);
await queryRunner.query(`CREATE INDEX "IDX_93060675b4a79a577f31d260c6" ON "muting" ("muterId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_1eb9d9824a630321a29fd3b290" ON "muting" ("muterId", "muteeId") `);
await queryRunner.query(`CREATE TABLE "sw_subscription" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "endpoint" character varying(512) NOT NULL, "auth" character varying(256) NOT NULL, "publickey" character varying(128) NOT NULL, CONSTRAINT "PK_e8f763631530051b95eb6279b91" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_97754ca6f2baff9b4abb7f853d" ON "sw_subscription" ("userId") `);
await queryRunner.query(`CREATE TABLE "blocking" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "blockeeId" character varying(32) NOT NULL, "blockerId" character varying(32) NOT NULL, CONSTRAINT "PK_e5d9a541cc1965ee7e048ea09dd" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_b9a354f7941c1e779f3b33aea6" ON "blocking" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_2cd4a2743a99671308f5417759" ON "blocking" ("blockeeId") `);
await queryRunner.query(`CREATE INDEX "IDX_0627125f1a8a42c9a1929edb55" ON "blocking" ("blockerId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_98a1bc5cb30dfd159de056549f" ON "blocking" ("blockerId", "blockeeId") `);
await queryRunner.query(`CREATE TABLE "user_list" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "name" character varying(128) NOT NULL, CONSTRAINT "PK_87bab75775fd9b1ff822b656402" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_b7fcefbdd1c18dce86687531f9" ON "user_list" ("userId") `);
await queryRunner.query(`CREATE TABLE "user_list_joining" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "userListId" character varying(32) NOT NULL, CONSTRAINT "PK_11abb3768da1c5f8de101c9df45" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_d844bfc6f3f523a05189076efa" ON "user_list_joining" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_605472305f26818cc93d1baaa7" ON "user_list_joining" ("userListId") `);
await queryRunner.query(`CREATE TABLE "hashtag" ("id" character varying(32) NOT NULL, "name" character varying(128) NOT NULL, "mentionedUserIds" character varying(32) array NOT NULL, "mentionedUsersCount" integer NOT NULL DEFAULT 0, "mentionedLocalUserIds" character varying(32) array NOT NULL, "mentionedLocalUsersCount" integer NOT NULL DEFAULT 0, "mentionedRemoteUserIds" character varying(32) array NOT NULL, "mentionedRemoteUsersCount" integer NOT NULL DEFAULT 0, "attachedUserIds" character varying(32) array NOT NULL, "attachedUsersCount" integer NOT NULL DEFAULT 0, "attachedLocalUserIds" character varying(32) array NOT NULL, "attachedLocalUsersCount" integer NOT NULL DEFAULT 0, "attachedRemoteUserIds" character varying(32) array NOT NULL, "attachedRemoteUsersCount" integer NOT NULL DEFAULT 0, CONSTRAINT "PK_cb36eb8af8412bfa978f1165d78" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_347fec870eafea7b26c8a73bac" ON "hashtag" ("name") `);
await queryRunner.query(`CREATE INDEX "IDX_2710a55f826ee236ea1a62698f" ON "hashtag" ("mentionedUsersCount") `);
await queryRunner.query(`CREATE INDEX "IDX_0e206cec573f1edff4a3062923" ON "hashtag" ("mentionedLocalUsersCount") `);
await queryRunner.query(`CREATE INDEX "IDX_4c02d38a976c3ae132228c6fce" ON "hashtag" ("mentionedRemoteUsersCount") `);
await queryRunner.query(`CREATE INDEX "IDX_d57f9030cd3af7f63ffb1c267c" ON "hashtag" ("attachedUsersCount") `);
await queryRunner.query(`CREATE INDEX "IDX_0c44bf4f680964145f2a68a341" ON "hashtag" ("attachedLocalUsersCount") `);
await queryRunner.query(`CREATE INDEX "IDX_0b03cbcd7e6a7ce068efa8ecc2" ON "hashtag" ("attachedRemoteUsersCount") `);
await queryRunner.query(`CREATE TABLE "note_favorite" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, CONSTRAINT "PK_af0da35a60b9fa4463a62082b36" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_47f4b1892f5d6ba8efb3057d81" ON "note_favorite" ("userId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_0f4fb9ad355f3effff221ef245" ON "note_favorite" ("userId", "noteId") `);
await queryRunner.query(`CREATE TABLE "abuse_user_report" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "reporterId" character varying(32) NOT NULL, "comment" character varying(512) NOT NULL, CONSTRAINT "PK_87873f5f5cc5c321a1306b2d18c" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_db2098070b2b5a523c58181f74" ON "abuse_user_report" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_d049123c413e68ca52abe73420" ON "abuse_user_report" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_04cc96756f89d0b7f9473e8cdf" ON "abuse_user_report" ("reporterId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_5cd442c3b2e74fdd99dae20243" ON "abuse_user_report" ("userId", "reporterId") `);
await queryRunner.query(`CREATE TABLE "registration_ticket" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "code" character varying(64) NOT NULL, CONSTRAINT "PK_f11696b6fafcf3662d4292734f8" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_0ff69e8dfa9fe31bb4a4660f59" ON "registration_ticket" ("code") `);
await queryRunner.query(`CREATE TABLE "messaging_message" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "recipientId" character varying(32) NOT NULL, "text" character varying(4096), "isRead" boolean NOT NULL DEFAULT false, "fileId" character varying(32), CONSTRAINT "PK_db398fd79dc95d0eb8c30456eaa" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_e21cd3646e52ef9c94aaf17c2e" ON "messaging_message" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_5377c307783fce2b6d352e1203" ON "messaging_message" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_cac14a4e3944454a5ce7daa514" ON "messaging_message" ("recipientId") `);
await queryRunner.query(`CREATE TABLE "signin" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "ip" character varying(128) NOT NULL, "headers" jsonb NOT NULL, "success" boolean NOT NULL, CONSTRAINT "PK_9e96ddc025712616fc492b3b588" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_2c308dbdc50d94dc625670055f" ON "signin" ("userId") `);
await queryRunner.query(`CREATE TABLE "auth_session" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "token" character varying(128) NOT NULL, "userId" character varying(32), "appId" character varying(32) NOT NULL, CONSTRAINT "PK_19354ed146424a728c1112a8cbf" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_62cb09e1129f6ec024ef66e183" ON "auth_session" ("token") `);
await queryRunner.query(`CREATE TABLE "follow_request" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "followeeId" character varying(32) NOT NULL, "followerId" character varying(32) NOT NULL, "requestId" character varying(128), "followerHost" character varying(128), "followerInbox" character varying(512), "followerSharedInbox" character varying(512), "followeeHost" character varying(128), "followeeInbox" character varying(512), "followeeSharedInbox" character varying(512), CONSTRAINT "PK_53a9aa3725f7a3deb150b39dbfc" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_12c01c0d1a79f77d9f6c15fadd" ON "follow_request" ("followeeId") `);
await queryRunner.query(`CREATE INDEX "IDX_a7fd92dd6dc519e6fb435dd108" ON "follow_request" ("followerId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_d54a512b822fac7ed52800f6b4" ON "follow_request" ("followerId", "followeeId") `);
await queryRunner.query(`CREATE TABLE "emoji" ("id" character varying(32) NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE, "name" character varying(128) NOT NULL, "host" character varying(128), "url" character varying(512) NOT NULL, "uri" character varying(512), "type" character varying(64), "aliases" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], CONSTRAINT "PK_df74ce05e24999ee01ea0bc50a3" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_b37dafc86e9af007e3295c2781" ON "emoji" ("name") `);
await queryRunner.query(`CREATE INDEX "IDX_5900e907bb46516ddf2871327c" ON "emoji" ("host") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_4f4d35e1256c84ae3d1f0eab10" ON "emoji" ("name", "host") `);
await queryRunner.query(`CREATE TABLE "reversi_game" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "startedAt" TIMESTAMP WITH TIME ZONE, "user1Id" character varying(32) NOT NULL, "user2Id" character varying(32) NOT NULL, "user1Accepted" boolean NOT NULL DEFAULT false, "user2Accepted" boolean NOT NULL DEFAULT false, "black" integer, "isStarted" boolean NOT NULL DEFAULT false, "isEnded" boolean NOT NULL DEFAULT false, "winnerId" character varying(32), "surrendered" character varying(32), "logs" jsonb NOT NULL DEFAULT '[]', "map" character varying(64) array NOT NULL, "bw" character varying(32) NOT NULL, "isLlotheo" boolean NOT NULL DEFAULT false, "canPutEverywhere" boolean NOT NULL DEFAULT false, "loopedBoard" boolean NOT NULL DEFAULT false, "form1" jsonb DEFAULT null, "form2" jsonb DEFAULT null, "crc32" character varying(32), CONSTRAINT "PK_76b30eeba71b1193ad7c5311c3f" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_b46ec40746efceac604142be1c" ON "reversi_game" ("createdAt") `);
await queryRunner.query(`CREATE TABLE "reversi_matching" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "parentId" character varying(32) NOT NULL, "childId" character varying(32) NOT NULL, CONSTRAINT "PK_880bd0afbab232f21c8b9d146cf" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_b604d92d6c7aec38627f6eaf16" ON "reversi_matching" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_3b25402709dd9882048c2bbade" ON "reversi_matching" ("parentId") `);
await queryRunner.query(`CREATE INDEX "IDX_e247b23a3c9b45f89ec1299d06" ON "reversi_matching" ("childId") `);
await queryRunner.query(`CREATE TABLE "user_note_pining" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, CONSTRAINT "PK_a6a2dad4ae000abce2ea9d9b103" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_bfbc6f79ba4007b4ce5097f08d" ON "user_note_pining" ("userId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_410cd649884b501c02d6e72738" ON "user_note_pining" ("userId", "noteId") `);
await queryRunner.query(`CREATE TYPE "poll_notevisibility_enum" AS ENUM('public', 'home', 'followers', 'specified')`);
await queryRunner.query(`CREATE TABLE "poll" ("noteId" character varying(32) NOT NULL, "expiresAt" TIMESTAMP WITH TIME ZONE, "multiple" boolean NOT NULL, "choices" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "votes" integer array NOT NULL, "noteVisibility" "poll_notevisibility_enum" NOT NULL, "userId" character varying(32) NOT NULL, "userHost" character varying(128), CONSTRAINT "REL_da851e06d0dfe2ef397d8b1bf1" UNIQUE ("noteId"), CONSTRAINT "PK_da851e06d0dfe2ef397d8b1bf1b" PRIMARY KEY ("noteId"))`);
await queryRunner.query(`CREATE INDEX "IDX_0610ebcfcfb4a18441a9bcdab2" ON "poll" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_7fa20a12319c7f6dc3aed98c0a" ON "poll" ("userHost") `);
await queryRunner.query(`CREATE TABLE "user_keypair" ("userId" character varying(32) NOT NULL, "publicKey" character varying(4096) NOT NULL, "privateKey" character varying(4096) NOT NULL, CONSTRAINT "REL_f4853eb41ab722fe05f81cedeb" UNIQUE ("userId"), CONSTRAINT "PK_f4853eb41ab722fe05f81cedeb6" PRIMARY KEY ("userId"))`);
await queryRunner.query(`CREATE TABLE "user_publickey" ("userId" character varying(32) NOT NULL, "keyId" character varying(256) NOT NULL, "keyPem" character varying(4096) NOT NULL, CONSTRAINT "REL_10c146e4b39b443ede016f6736" UNIQUE ("userId"), CONSTRAINT "PK_10c146e4b39b443ede016f6736d" PRIMARY KEY ("userId"))`);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_171e64971c780ebd23fae140bb" ON "user_publickey" ("keyId") `);
await queryRunner.query(`CREATE TABLE "user_profile" ("userId" character varying(32) NOT NULL, "location" character varying(128), "birthday" character(10), "description" character varying(1024), "fields" jsonb NOT NULL DEFAULT '[]', "url" character varying(512), "email" character varying(128), "emailVerifyCode" character varying(128), "emailVerified" boolean NOT NULL DEFAULT false, "twoFactorTempSecret" character varying(128), "twoFactorSecret" character varying(128), "twoFactorEnabled" boolean NOT NULL DEFAULT false, "password" character varying(128), "clientData" jsonb NOT NULL DEFAULT '{}', "autoWatch" boolean NOT NULL DEFAULT false, "autoAcceptFollowed" boolean NOT NULL DEFAULT false, "alwaysMarkNsfw" boolean NOT NULL DEFAULT false, "carefulBot" boolean NOT NULL DEFAULT false, "twitter" boolean NOT NULL DEFAULT false, "twitterAccessToken" character varying(64) DEFAULT null, "twitterAccessTokenSecret" character varying(64) DEFAULT null, "twitterUserId" character varying(64) DEFAULT null, "twitterScreenName" character varying(64) DEFAULT null, "github" boolean NOT NULL DEFAULT false, "githubAccessToken" character varying(64) DEFAULT null, "githubId" integer DEFAULT null, "githubLogin" character varying(64) DEFAULT null, "discord" boolean NOT NULL DEFAULT false, "discordAccessToken" character varying(64) DEFAULT null, "discordRefreshToken" character varying(64) DEFAULT null, "discordExpiresDate" integer DEFAULT null, "discordId" character varying(64) DEFAULT null, "discordUsername" character varying(64) DEFAULT null, "discordDiscriminator" character varying(64) DEFAULT null, "userHost" character varying(128), CONSTRAINT "REL_51cb79b5555effaf7d69ba1cff" UNIQUE ("userId"), CONSTRAINT "PK_51cb79b5555effaf7d69ba1cff9" PRIMARY KEY ("userId"))`);
await queryRunner.query(`CREATE INDEX "IDX_dce530b98e454793dac5ec2f5a" ON "user_profile" ("userHost") `);
await queryRunner.query(`CREATE TYPE "__chart__active_users_span_enum" AS ENUM('hour', 'day')`);
await queryRunner.query(`CREATE TABLE "__chart__active_users" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__active_users_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_count" bigint NOT NULL, "___remote_count" bigint NOT NULL, CONSTRAINT "PK_317237a9f733b970604a11e314f" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE TYPE "__chart__drive_span_enum" AS ENUM('hour', 'day')`);
await queryRunner.query(`CREATE TABLE "__chart__drive" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__drive_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_totalCount" bigint NOT NULL, "___local_totalSize" bigint NOT NULL, "___local_incCount" bigint NOT NULL, "___local_incSize" bigint NOT NULL, "___local_decCount" bigint NOT NULL, "___local_decSize" bigint NOT NULL, "___remote_totalCount" bigint NOT NULL, "___remote_totalSize" bigint NOT NULL, "___remote_incCount" bigint NOT NULL, "___remote_incSize" bigint NOT NULL, "___remote_decCount" bigint NOT NULL, "___remote_decSize" bigint NOT NULL, CONSTRAINT "PK_f96bc548a765cd4b3b354221ce7" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE TYPE "__chart__federation_span_enum" AS ENUM('hour', 'day')`);
await queryRunner.query(`CREATE TABLE "__chart__federation" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__federation_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___instance_total" bigint NOT NULL, "___instance_inc" bigint NOT NULL, "___instance_dec" bigint NOT NULL, CONSTRAINT "PK_b39dcd31a0fe1a7757e348e85fd" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE TYPE "__chart__hashtag_span_enum" AS ENUM('hour', 'day')`);
await queryRunner.query(`CREATE TABLE "__chart__hashtag" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__hashtag_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_count" bigint NOT NULL, "___remote_count" bigint NOT NULL, CONSTRAINT "PK_c32f1ea2b44a5d2f7881e37f8f9" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE TYPE "__chart__instance_span_enum" AS ENUM('hour', 'day')`);
await queryRunner.query(`CREATE TABLE "__chart__instance" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__instance_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___requests_failed" bigint NOT NULL, "___requests_succeeded" bigint NOT NULL, "___requests_received" bigint NOT NULL, "___notes_total" bigint NOT NULL, "___notes_inc" bigint NOT NULL, "___notes_dec" bigint NOT NULL, "___notes_diffs_normal" bigint NOT NULL, "___notes_diffs_reply" bigint NOT NULL, "___notes_diffs_renote" bigint NOT NULL, "___users_total" bigint NOT NULL, "___users_inc" bigint NOT NULL, "___users_dec" bigint NOT NULL, "___following_total" bigint NOT NULL, "___following_inc" bigint NOT NULL, "___following_dec" bigint NOT NULL, "___followers_total" bigint NOT NULL, "___followers_inc" bigint NOT NULL, "___followers_dec" bigint NOT NULL, "___drive_totalFiles" bigint NOT NULL, "___drive_totalUsage" bigint NOT NULL, "___drive_incFiles" bigint NOT NULL, "___drive_incUsage" bigint NOT NULL, "___drive_decFiles" bigint NOT NULL, "___drive_decUsage" bigint NOT NULL, CONSTRAINT "PK_1267c67c7c2d47b4903975f2c00" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE TYPE "__chart__network_span_enum" AS ENUM('hour', 'day')`);
await queryRunner.query(`CREATE TABLE "__chart__network" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__network_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___incomingRequests" bigint NOT NULL, "___outgoingRequests" bigint NOT NULL, "___totalTime" bigint NOT NULL, "___incomingBytes" bigint NOT NULL, "___outgoingBytes" bigint NOT NULL, CONSTRAINT "PK_bc4290c2e27fad14ef0c1ca93f3" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE TYPE "__chart__notes_span_enum" AS ENUM('hour', 'day')`);
await queryRunner.query(`CREATE TABLE "__chart__notes" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__notes_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_total" bigint NOT NULL, "___local_inc" bigint NOT NULL, "___local_dec" bigint NOT NULL, "___local_diffs_normal" bigint NOT NULL, "___local_diffs_reply" bigint NOT NULL, "___local_diffs_renote" bigint NOT NULL, "___remote_total" bigint NOT NULL, "___remote_inc" bigint NOT NULL, "___remote_dec" bigint NOT NULL, "___remote_diffs_normal" bigint NOT NULL, "___remote_diffs_reply" bigint NOT NULL, "___remote_diffs_renote" bigint NOT NULL, CONSTRAINT "PK_0aec823fa85c7f901bdb3863b14" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE TYPE "__chart__per_user_drive_span_enum" AS ENUM('hour', 'day')`);
await queryRunner.query(`CREATE TABLE "__chart__per_user_drive" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__per_user_drive_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___totalCount" bigint NOT NULL, "___totalSize" bigint NOT NULL, "___incCount" bigint NOT NULL, "___incSize" bigint NOT NULL, "___decCount" bigint NOT NULL, "___decSize" bigint NOT NULL, CONSTRAINT "PK_d0ef23d24d666e1a44a0cd3d208" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE TYPE "__chart__per_user_following_span_enum" AS ENUM('hour', 'day')`);
await queryRunner.query(`CREATE TABLE "__chart__per_user_following" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__per_user_following_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_followings_total" bigint NOT NULL, "___local_followings_inc" bigint NOT NULL, "___local_followings_dec" bigint NOT NULL, "___local_followers_total" bigint NOT NULL, "___local_followers_inc" bigint NOT NULL, "___local_followers_dec" bigint NOT NULL, "___remote_followings_total" bigint NOT NULL, "___remote_followings_inc" bigint NOT NULL, "___remote_followings_dec" bigint NOT NULL, "___remote_followers_total" bigint NOT NULL, "___remote_followers_inc" bigint NOT NULL, "___remote_followers_dec" bigint NOT NULL, CONSTRAINT "PK_85bb1b540363a29c2fec83bd907" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE TYPE "__chart__per_user_notes_span_enum" AS ENUM('hour', 'day')`);
await queryRunner.query(`CREATE TABLE "__chart__per_user_notes" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__per_user_notes_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___total" bigint NOT NULL, "___inc" bigint NOT NULL, "___dec" bigint NOT NULL, "___diffs_normal" bigint NOT NULL, "___diffs_reply" bigint NOT NULL, "___diffs_renote" bigint NOT NULL, CONSTRAINT "PK_334acf6e915af2f29edc11b8e50" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE TYPE "__chart__per_user_reaction_span_enum" AS ENUM('hour', 'day')`);
await queryRunner.query(`CREATE TABLE "__chart__per_user_reaction" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__per_user_reaction_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_count" bigint NOT NULL, "___remote_count" bigint NOT NULL, CONSTRAINT "PK_984f54dae441e65b633e8d27a7f" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE TYPE "__chart__test_grouped_span_enum" AS ENUM('hour', 'day')`);
await queryRunner.query(`CREATE TABLE "__chart__test_grouped" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__test_grouped_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___foo_total" bigint NOT NULL, "___foo_inc" bigint NOT NULL, "___foo_dec" bigint NOT NULL, CONSTRAINT "PK_f4a2b175d308695af30d4293272" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE TYPE "__chart__test_unique_span_enum" AS ENUM('hour', 'day')`);
await queryRunner.query(`CREATE TABLE "__chart__test_unique" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__test_unique_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___foo" bigint NOT NULL, CONSTRAINT "PK_409bac9c97cc612d8500012319d" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE TYPE "__chart__test_span_enum" AS ENUM('hour', 'day')`);
await queryRunner.query(`CREATE TABLE "__chart__test" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__test_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___foo_total" bigint NOT NULL, "___foo_inc" bigint NOT NULL, "___foo_dec" bigint NOT NULL, CONSTRAINT "PK_b4bc31dffbd1b785276a3ecfc1e" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE TYPE "__chart__users_span_enum" AS ENUM('hour', 'day')`);
await queryRunner.query(`CREATE TABLE "__chart__users" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__users_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_total" bigint NOT NULL, "___local_inc" bigint NOT NULL, "___local_dec" bigint NOT NULL, "___remote_total" bigint NOT NULL, "___remote_inc" bigint NOT NULL, "___remote_dec" bigint NOT NULL, CONSTRAINT "PK_4dfcf2c78d03524b9eb2c99d328" PRIMARY KEY ("id"))`);
await queryRunner.query(`ALTER TABLE "drive_folder" ADD CONSTRAINT "FK_f4fc06e49c0171c85f1c48060d2" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "drive_folder" ADD CONSTRAINT "FK_00ceffb0cdc238b3233294f08f2" FOREIGN KEY ("parentId") REFERENCES "drive_folder"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "drive_file" ADD CONSTRAINT "FK_860fa6f6c7df5bb887249fba22e" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "drive_file" ADD CONSTRAINT "FK_bb90d1956dafc4068c28aa7560a" FOREIGN KEY ("folderId") REFERENCES "drive_folder"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "user" ADD CONSTRAINT "FK_58f5c71eaab331645112cf8cfa5" FOREIGN KEY ("avatarId") REFERENCES "drive_file"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "user" ADD CONSTRAINT "FK_afc64b53f8db3707ceb34eb28e2" FOREIGN KEY ("bannerId") REFERENCES "drive_file"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "app" ADD CONSTRAINT "FK_3f5b0899ef90527a3462d7c2cb3" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "access_token" ADD CONSTRAINT "FK_9949557d0e1b2c19e5344c171e9" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "access_token" ADD CONSTRAINT "FK_a3ff16c90cc87a82a0b5959e560" FOREIGN KEY ("appId") REFERENCES "app"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_17cb3553c700a4985dff5a30ff5" FOREIGN KEY ("replyId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_52ccc804d7c69037d558bac4c96" FOREIGN KEY ("renoteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_ec5c201576192ba8904c345c5cc" FOREIGN KEY ("appId") REFERENCES "app"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_5b87d9d19127bd5d92026017a7b" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "poll_vote" ADD CONSTRAINT "FK_66d2bd2ee31d14bcc23069a89f8" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "poll_vote" ADD CONSTRAINT "FK_aecfbd5ef60374918e63ee95fa7" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "note_reaction" ADD CONSTRAINT "FK_13761f64257f40c5636d0ff95ee" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "note_reaction" ADD CONSTRAINT "FK_45145e4953780f3cd5656f0ea6a" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "note_watching" ADD CONSTRAINT "FK_b0134ec406e8d09a540f8182888" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "note_watching" ADD CONSTRAINT "FK_03e7028ab8388a3f5e3ce2a8619" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "note_unread" ADD CONSTRAINT "FK_56b0166d34ddae49d8ef7610bb9" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "note_unread" ADD CONSTRAINT "FK_e637cba4dc4410218c4251260e4" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_3c601b70a1066d2c8b517094cb9" FOREIGN KEY ("notifieeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710" FOREIGN KEY ("notifierId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_769cb6b73a1efe22ddf733ac453" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "following" ADD CONSTRAINT "FK_24e0042143a18157b234df186c3" FOREIGN KEY ("followeeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "following" ADD CONSTRAINT "FK_6516c5a6f3c015b4eed39978be5" FOREIGN KEY ("followerId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "muting" ADD CONSTRAINT "FK_ec96b4fed9dae517e0dbbe0675c" FOREIGN KEY ("muteeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "muting" ADD CONSTRAINT "FK_93060675b4a79a577f31d260c67" FOREIGN KEY ("muterId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "sw_subscription" ADD CONSTRAINT "FK_97754ca6f2baff9b4abb7f853dd" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "blocking" ADD CONSTRAINT "FK_2cd4a2743a99671308f5417759e" FOREIGN KEY ("blockeeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "blocking" ADD CONSTRAINT "FK_0627125f1a8a42c9a1929edb552" FOREIGN KEY ("blockerId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "user_list" ADD CONSTRAINT "FK_b7fcefbdd1c18dce86687531f99" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "user_list_joining" ADD CONSTRAINT "FK_d844bfc6f3f523a05189076efaa" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "user_list_joining" ADD CONSTRAINT "FK_605472305f26818cc93d1baaa74" FOREIGN KEY ("userListId") REFERENCES "user_list"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "note_favorite" ADD CONSTRAINT "FK_47f4b1892f5d6ba8efb3057d81a" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "note_favorite" ADD CONSTRAINT "FK_0e00498f180193423c992bc4370" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD CONSTRAINT "FK_d049123c413e68ca52abe734203" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD CONSTRAINT "FK_04cc96756f89d0b7f9473e8cdf3" FOREIGN KEY ("reporterId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "messaging_message" ADD CONSTRAINT "FK_5377c307783fce2b6d352e1203b" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "messaging_message" ADD CONSTRAINT "FK_cac14a4e3944454a5ce7daa5142" FOREIGN KEY ("recipientId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "messaging_message" ADD CONSTRAINT "FK_535def119223ac05ad3fa9ef64b" FOREIGN KEY ("fileId") REFERENCES "drive_file"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "signin" ADD CONSTRAINT "FK_2c308dbdc50d94dc625670055f7" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "auth_session" ADD CONSTRAINT "FK_c072b729d71697f959bde66ade0" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "auth_session" ADD CONSTRAINT "FK_dbe037d4bddd17b03a1dc778dee" FOREIGN KEY ("appId") REFERENCES "app"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "follow_request" ADD CONSTRAINT "FK_12c01c0d1a79f77d9f6c15fadd2" FOREIGN KEY ("followeeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "follow_request" ADD CONSTRAINT "FK_a7fd92dd6dc519e6fb435dd108f" FOREIGN KEY ("followerId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "reversi_game" ADD CONSTRAINT "FK_f7467510c60a45ce5aca6292743" FOREIGN KEY ("user1Id") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "reversi_game" ADD CONSTRAINT "FK_6649a4e8c5d5cf32fb03b5da9f6" FOREIGN KEY ("user2Id") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "reversi_matching" ADD CONSTRAINT "FK_3b25402709dd9882048c2bbade0" FOREIGN KEY ("parentId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "reversi_matching" ADD CONSTRAINT "FK_e247b23a3c9b45f89ec1299d066" FOREIGN KEY ("childId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "user_note_pining" ADD CONSTRAINT "FK_bfbc6f79ba4007b4ce5097f08d6" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "user_note_pining" ADD CONSTRAINT "FK_68881008f7c3588ad7ecae471cf" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "poll" ADD CONSTRAINT "FK_da851e06d0dfe2ef397d8b1bf1b" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "user_keypair" ADD CONSTRAINT "FK_f4853eb41ab722fe05f81cedeb6" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "user_publickey" ADD CONSTRAINT "FK_10c146e4b39b443ede016f6736d" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "user_profile" ADD CONSTRAINT "FK_51cb79b5555effaf7d69ba1cff9" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "user_profile" DROP CONSTRAINT "FK_51cb79b5555effaf7d69ba1cff9"`);
await queryRunner.query(`ALTER TABLE "user_publickey" DROP CONSTRAINT "FK_10c146e4b39b443ede016f6736d"`);
await queryRunner.query(`ALTER TABLE "user_keypair" DROP CONSTRAINT "FK_f4853eb41ab722fe05f81cedeb6"`);
await queryRunner.query(`ALTER TABLE "poll" DROP CONSTRAINT "FK_da851e06d0dfe2ef397d8b1bf1b"`);
await queryRunner.query(`ALTER TABLE "user_note_pining" DROP CONSTRAINT "FK_68881008f7c3588ad7ecae471cf"`);
await queryRunner.query(`ALTER TABLE "user_note_pining" DROP CONSTRAINT "FK_bfbc6f79ba4007b4ce5097f08d6"`);
await queryRunner.query(`ALTER TABLE "reversi_matching" DROP CONSTRAINT "FK_e247b23a3c9b45f89ec1299d066"`);
await queryRunner.query(`ALTER TABLE "reversi_matching" DROP CONSTRAINT "FK_3b25402709dd9882048c2bbade0"`);
await queryRunner.query(`ALTER TABLE "reversi_game" DROP CONSTRAINT "FK_6649a4e8c5d5cf32fb03b5da9f6"`);
await queryRunner.query(`ALTER TABLE "reversi_game" DROP CONSTRAINT "FK_f7467510c60a45ce5aca6292743"`);
await queryRunner.query(`ALTER TABLE "follow_request" DROP CONSTRAINT "FK_a7fd92dd6dc519e6fb435dd108f"`);
await queryRunner.query(`ALTER TABLE "follow_request" DROP CONSTRAINT "FK_12c01c0d1a79f77d9f6c15fadd2"`);
await queryRunner.query(`ALTER TABLE "auth_session" DROP CONSTRAINT "FK_dbe037d4bddd17b03a1dc778dee"`);
await queryRunner.query(`ALTER TABLE "auth_session" DROP CONSTRAINT "FK_c072b729d71697f959bde66ade0"`);
await queryRunner.query(`ALTER TABLE "signin" DROP CONSTRAINT "FK_2c308dbdc50d94dc625670055f7"`);
await queryRunner.query(`ALTER TABLE "messaging_message" DROP CONSTRAINT "FK_535def119223ac05ad3fa9ef64b"`);
await queryRunner.query(`ALTER TABLE "messaging_message" DROP CONSTRAINT "FK_cac14a4e3944454a5ce7daa5142"`);
await queryRunner.query(`ALTER TABLE "messaging_message" DROP CONSTRAINT "FK_5377c307783fce2b6d352e1203b"`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP CONSTRAINT "FK_04cc96756f89d0b7f9473e8cdf3"`);
await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP CONSTRAINT "FK_d049123c413e68ca52abe734203"`);
await queryRunner.query(`ALTER TABLE "note_favorite" DROP CONSTRAINT "FK_0e00498f180193423c992bc4370"`);
await queryRunner.query(`ALTER TABLE "note_favorite" DROP CONSTRAINT "FK_47f4b1892f5d6ba8efb3057d81a"`);
await queryRunner.query(`ALTER TABLE "user_list_joining" DROP CONSTRAINT "FK_605472305f26818cc93d1baaa74"`);
await queryRunner.query(`ALTER TABLE "user_list_joining" DROP CONSTRAINT "FK_d844bfc6f3f523a05189076efaa"`);
await queryRunner.query(`ALTER TABLE "user_list" DROP CONSTRAINT "FK_b7fcefbdd1c18dce86687531f99"`);
await queryRunner.query(`ALTER TABLE "blocking" DROP CONSTRAINT "FK_0627125f1a8a42c9a1929edb552"`);
await queryRunner.query(`ALTER TABLE "blocking" DROP CONSTRAINT "FK_2cd4a2743a99671308f5417759e"`);
await queryRunner.query(`ALTER TABLE "sw_subscription" DROP CONSTRAINT "FK_97754ca6f2baff9b4abb7f853dd"`);
await queryRunner.query(`ALTER TABLE "muting" DROP CONSTRAINT "FK_93060675b4a79a577f31d260c67"`);
await queryRunner.query(`ALTER TABLE "muting" DROP CONSTRAINT "FK_ec96b4fed9dae517e0dbbe0675c"`);
await queryRunner.query(`ALTER TABLE "following" DROP CONSTRAINT "FK_6516c5a6f3c015b4eed39978be5"`);
await queryRunner.query(`ALTER TABLE "following" DROP CONSTRAINT "FK_24e0042143a18157b234df186c3"`);
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_769cb6b73a1efe22ddf733ac453"`);
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710"`);
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_3c601b70a1066d2c8b517094cb9"`);
await queryRunner.query(`ALTER TABLE "note_unread" DROP CONSTRAINT "FK_e637cba4dc4410218c4251260e4"`);
await queryRunner.query(`ALTER TABLE "note_unread" DROP CONSTRAINT "FK_56b0166d34ddae49d8ef7610bb9"`);
await queryRunner.query(`ALTER TABLE "note_watching" DROP CONSTRAINT "FK_03e7028ab8388a3f5e3ce2a8619"`);
await queryRunner.query(`ALTER TABLE "note_watching" DROP CONSTRAINT "FK_b0134ec406e8d09a540f8182888"`);
await queryRunner.query(`ALTER TABLE "note_reaction" DROP CONSTRAINT "FK_45145e4953780f3cd5656f0ea6a"`);
await queryRunner.query(`ALTER TABLE "note_reaction" DROP CONSTRAINT "FK_13761f64257f40c5636d0ff95ee"`);
await queryRunner.query(`ALTER TABLE "poll_vote" DROP CONSTRAINT "FK_aecfbd5ef60374918e63ee95fa7"`);
await queryRunner.query(`ALTER TABLE "poll_vote" DROP CONSTRAINT "FK_66d2bd2ee31d14bcc23069a89f8"`);
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_5b87d9d19127bd5d92026017a7b"`);
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_ec5c201576192ba8904c345c5cc"`);
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_52ccc804d7c69037d558bac4c96"`);
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_17cb3553c700a4985dff5a30ff5"`);
await queryRunner.query(`ALTER TABLE "access_token" DROP CONSTRAINT "FK_a3ff16c90cc87a82a0b5959e560"`);
await queryRunner.query(`ALTER TABLE "access_token" DROP CONSTRAINT "FK_9949557d0e1b2c19e5344c171e9"`);
await queryRunner.query(`ALTER TABLE "app" DROP CONSTRAINT "FK_3f5b0899ef90527a3462d7c2cb3"`);
await queryRunner.query(`ALTER TABLE "user" DROP CONSTRAINT "FK_afc64b53f8db3707ceb34eb28e2"`);
await queryRunner.query(`ALTER TABLE "user" DROP CONSTRAINT "FK_58f5c71eaab331645112cf8cfa5"`);
await queryRunner.query(`ALTER TABLE "drive_file" DROP CONSTRAINT "FK_bb90d1956dafc4068c28aa7560a"`);
await queryRunner.query(`ALTER TABLE "drive_file" DROP CONSTRAINT "FK_860fa6f6c7df5bb887249fba22e"`);
await queryRunner.query(`ALTER TABLE "drive_folder" DROP CONSTRAINT "FK_00ceffb0cdc238b3233294f08f2"`);
await queryRunner.query(`ALTER TABLE "drive_folder" DROP CONSTRAINT "FK_f4fc06e49c0171c85f1c48060d2"`);
await queryRunner.query(`DROP TABLE "__chart__users"`);
await queryRunner.query(`DROP TYPE "__chart__users_span_enum"`);
await queryRunner.query(`DROP TABLE "__chart__test"`);
await queryRunner.query(`DROP TYPE "__chart__test_span_enum"`);
await queryRunner.query(`DROP TABLE "__chart__test_unique"`);
await queryRunner.query(`DROP TYPE "__chart__test_unique_span_enum"`);
await queryRunner.query(`DROP TABLE "__chart__test_grouped"`);
await queryRunner.query(`DROP TYPE "__chart__test_grouped_span_enum"`);
await queryRunner.query(`DROP TABLE "__chart__per_user_reaction"`);
await queryRunner.query(`DROP TYPE "__chart__per_user_reaction_span_enum"`);
await queryRunner.query(`DROP TABLE "__chart__per_user_notes"`);
await queryRunner.query(`DROP TYPE "__chart__per_user_notes_span_enum"`);
await queryRunner.query(`DROP TABLE "__chart__per_user_following"`);
await queryRunner.query(`DROP TYPE "__chart__per_user_following_span_enum"`);
await queryRunner.query(`DROP TABLE "__chart__per_user_drive"`);
await queryRunner.query(`DROP TYPE "__chart__per_user_drive_span_enum"`);
await queryRunner.query(`DROP TABLE "__chart__notes"`);
await queryRunner.query(`DROP TYPE "__chart__notes_span_enum"`);
await queryRunner.query(`DROP TABLE "__chart__network"`);
await queryRunner.query(`DROP TYPE "__chart__network_span_enum"`);
await queryRunner.query(`DROP TABLE "__chart__instance"`);
await queryRunner.query(`DROP TYPE "__chart__instance_span_enum"`);
await queryRunner.query(`DROP TABLE "__chart__hashtag"`);
await queryRunner.query(`DROP TYPE "__chart__hashtag_span_enum"`);
await queryRunner.query(`DROP TABLE "__chart__federation"`);
await queryRunner.query(`DROP TYPE "__chart__federation_span_enum"`);
await queryRunner.query(`DROP TABLE "__chart__drive"`);
await queryRunner.query(`DROP TYPE "__chart__drive_span_enum"`);
await queryRunner.query(`DROP TABLE "__chart__active_users"`);
await queryRunner.query(`DROP TYPE "__chart__active_users_span_enum"`);
await queryRunner.query(`DROP INDEX "IDX_dce530b98e454793dac5ec2f5a"`);
await queryRunner.query(`DROP TABLE "user_profile"`);
await queryRunner.query(`DROP INDEX "IDX_171e64971c780ebd23fae140bb"`);
await queryRunner.query(`DROP TABLE "user_publickey"`);
await queryRunner.query(`DROP TABLE "user_keypair"`);
await queryRunner.query(`DROP INDEX "IDX_7fa20a12319c7f6dc3aed98c0a"`);
await queryRunner.query(`DROP INDEX "IDX_0610ebcfcfb4a18441a9bcdab2"`);
await queryRunner.query(`DROP TABLE "poll"`);
await queryRunner.query(`DROP TYPE "poll_notevisibility_enum"`);
await queryRunner.query(`DROP INDEX "IDX_410cd649884b501c02d6e72738"`);
await queryRunner.query(`DROP INDEX "IDX_bfbc6f79ba4007b4ce5097f08d"`);
await queryRunner.query(`DROP TABLE "user_note_pining"`);
await queryRunner.query(`DROP INDEX "IDX_e247b23a3c9b45f89ec1299d06"`);
await queryRunner.query(`DROP INDEX "IDX_3b25402709dd9882048c2bbade"`);
await queryRunner.query(`DROP INDEX "IDX_b604d92d6c7aec38627f6eaf16"`);
await queryRunner.query(`DROP TABLE "reversi_matching"`);
await queryRunner.query(`DROP INDEX "IDX_b46ec40746efceac604142be1c"`);
await queryRunner.query(`DROP TABLE "reversi_game"`);
await queryRunner.query(`DROP INDEX "IDX_4f4d35e1256c84ae3d1f0eab10"`);
await queryRunner.query(`DROP INDEX "IDX_5900e907bb46516ddf2871327c"`);
await queryRunner.query(`DROP INDEX "IDX_b37dafc86e9af007e3295c2781"`);
await queryRunner.query(`DROP TABLE "emoji"`);
await queryRunner.query(`DROP INDEX "IDX_d54a512b822fac7ed52800f6b4"`);
await queryRunner.query(`DROP INDEX "IDX_a7fd92dd6dc519e6fb435dd108"`);
await queryRunner.query(`DROP INDEX "IDX_12c01c0d1a79f77d9f6c15fadd"`);
await queryRunner.query(`DROP TABLE "follow_request"`);
await queryRunner.query(`DROP INDEX "IDX_62cb09e1129f6ec024ef66e183"`);
await queryRunner.query(`DROP TABLE "auth_session"`);
await queryRunner.query(`DROP INDEX "IDX_2c308dbdc50d94dc625670055f"`);
await queryRunner.query(`DROP TABLE "signin"`);
await queryRunner.query(`DROP INDEX "IDX_cac14a4e3944454a5ce7daa514"`);
await queryRunner.query(`DROP INDEX "IDX_5377c307783fce2b6d352e1203"`);
await queryRunner.query(`DROP INDEX "IDX_e21cd3646e52ef9c94aaf17c2e"`);
await queryRunner.query(`DROP TABLE "messaging_message"`);
await queryRunner.query(`DROP INDEX "IDX_0ff69e8dfa9fe31bb4a4660f59"`);
await queryRunner.query(`DROP TABLE "registration_ticket"`);
await queryRunner.query(`DROP INDEX "IDX_5cd442c3b2e74fdd99dae20243"`);
await queryRunner.query(`DROP INDEX "IDX_04cc96756f89d0b7f9473e8cdf"`);
await queryRunner.query(`DROP INDEX "IDX_d049123c413e68ca52abe73420"`);
await queryRunner.query(`DROP INDEX "IDX_db2098070b2b5a523c58181f74"`);
await queryRunner.query(`DROP TABLE "abuse_user_report"`);
await queryRunner.query(`DROP INDEX "IDX_0f4fb9ad355f3effff221ef245"`);
await queryRunner.query(`DROP INDEX "IDX_47f4b1892f5d6ba8efb3057d81"`);
await queryRunner.query(`DROP TABLE "note_favorite"`);
await queryRunner.query(`DROP INDEX "IDX_0b03cbcd7e6a7ce068efa8ecc2"`);
await queryRunner.query(`DROP INDEX "IDX_0c44bf4f680964145f2a68a341"`);
await queryRunner.query(`DROP INDEX "IDX_d57f9030cd3af7f63ffb1c267c"`);
await queryRunner.query(`DROP INDEX "IDX_4c02d38a976c3ae132228c6fce"`);
await queryRunner.query(`DROP INDEX "IDX_0e206cec573f1edff4a3062923"`);
await queryRunner.query(`DROP INDEX "IDX_2710a55f826ee236ea1a62698f"`);
await queryRunner.query(`DROP INDEX "IDX_347fec870eafea7b26c8a73bac"`);
await queryRunner.query(`DROP TABLE "hashtag"`);
await queryRunner.query(`DROP INDEX "IDX_605472305f26818cc93d1baaa7"`);
await queryRunner.query(`DROP INDEX "IDX_d844bfc6f3f523a05189076efa"`);
await queryRunner.query(`DROP TABLE "user_list_joining"`);
await queryRunner.query(`DROP INDEX "IDX_b7fcefbdd1c18dce86687531f9"`);
await queryRunner.query(`DROP TABLE "user_list"`);
await queryRunner.query(`DROP INDEX "IDX_98a1bc5cb30dfd159de056549f"`);
await queryRunner.query(`DROP INDEX "IDX_0627125f1a8a42c9a1929edb55"`);
await queryRunner.query(`DROP INDEX "IDX_2cd4a2743a99671308f5417759"`);
await queryRunner.query(`DROP INDEX "IDX_b9a354f7941c1e779f3b33aea6"`);
await queryRunner.query(`DROP TABLE "blocking"`);
await queryRunner.query(`DROP INDEX "IDX_97754ca6f2baff9b4abb7f853d"`);
await queryRunner.query(`DROP TABLE "sw_subscription"`);
await queryRunner.query(`DROP INDEX "IDX_1eb9d9824a630321a29fd3b290"`);
await queryRunner.query(`DROP INDEX "IDX_93060675b4a79a577f31d260c6"`);
await queryRunner.query(`DROP INDEX "IDX_ec96b4fed9dae517e0dbbe0675"`);
await queryRunner.query(`DROP INDEX "IDX_f86d57fbca33c7a4e6897490cc"`);
await queryRunner.query(`DROP TABLE "muting"`);
await queryRunner.query(`DROP INDEX "IDX_8d5afc98982185799b160e10eb"`);
await queryRunner.query(`DROP INDEX "IDX_2cd3b2a6b4cf0b910b260afe08"`);
await queryRunner.query(`DROP TABLE "instance"`);
await queryRunner.query(`DROP INDEX "IDX_307be5f1d1252e0388662acb96"`);
await queryRunner.query(`DROP INDEX "IDX_6516c5a6f3c015b4eed39978be"`);
await queryRunner.query(`DROP INDEX "IDX_24e0042143a18157b234df186c"`);
await queryRunner.query(`DROP INDEX "IDX_582f8fab771a9040a12961f3e7"`);
await queryRunner.query(`DROP TABLE "following"`);
await queryRunner.query(`DROP TABLE "meta"`);
await queryRunner.query(`DROP INDEX "IDX_3c601b70a1066d2c8b517094cb"`);
await queryRunner.query(`DROP INDEX "IDX_b11a5e627c41d4dc3170f1d370"`);
await queryRunner.query(`DROP TABLE "notification"`);
await queryRunner.query(`DROP INDEX "IDX_d908433a4953cc13216cd9c274"`);
await queryRunner.query(`DROP INDEX "IDX_e637cba4dc4410218c4251260e"`);
await queryRunner.query(`DROP INDEX "IDX_56b0166d34ddae49d8ef7610bb"`);
await queryRunner.query(`DROP TABLE "note_unread"`);
await queryRunner.query(`DROP INDEX "IDX_a42c93c69989ce1d09959df4cf"`);
await queryRunner.query(`DROP INDEX "IDX_44499765eec6b5489d72c4253b"`);
await queryRunner.query(`DROP INDEX "IDX_03e7028ab8388a3f5e3ce2a861"`);
await queryRunner.query(`DROP INDEX "IDX_b0134ec406e8d09a540f818288"`);
await queryRunner.query(`DROP INDEX "IDX_318cdf42a9cfc11f479bd802bb"`);
await queryRunner.query(`DROP TABLE "note_watching"`);
await queryRunner.query(`DROP INDEX "IDX_ad0c221b25672daf2df320a817"`);
await queryRunner.query(`DROP INDEX "IDX_45145e4953780f3cd5656f0ea6"`);
await queryRunner.query(`DROP INDEX "IDX_13761f64257f40c5636d0ff95e"`);
await queryRunner.query(`DROP INDEX "IDX_01f4581f114e0ebd2bbb876f0b"`);
await queryRunner.query(`DROP TABLE "note_reaction"`);
await queryRunner.query(`DROP INDEX "IDX_50bd7164c5b78f1f4a42c4d21f"`);
await queryRunner.query(`DROP INDEX "IDX_aecfbd5ef60374918e63ee95fa"`);
await queryRunner.query(`DROP INDEX "IDX_66d2bd2ee31d14bcc23069a89f"`);
await queryRunner.query(`DROP INDEX "IDX_0fb627e1c2f753262a74f0562d"`);
await queryRunner.query(`DROP TABLE "poll_vote"`);
await queryRunner.query(`DROP INDEX "IDX_7125a826ab192eb27e11d358a5"`);
await queryRunner.query(`DROP INDEX "IDX_88937d94d7443d9a99a76fa5c0"`);
await queryRunner.query(`DROP INDEX "IDX_54ebcb6d27222913b908d56fd8"`);
await queryRunner.query(`DROP INDEX "IDX_796a8c03959361f97dc2be1d5c"`);
await queryRunner.query(`DROP INDEX "IDX_25dfc71b0369b003a4cd434d0b"`);
await queryRunner.query(`DROP INDEX "IDX_51c063b6a133a9cb87145450f5"`);
await queryRunner.query(`DROP INDEX "IDX_153536c67d05e9adb24e99fc2b"`);
await queryRunner.query(`DROP INDEX "IDX_5b87d9d19127bd5d92026017a7"`);
await queryRunner.query(`DROP INDEX "IDX_52ccc804d7c69037d558bac4c9"`);
await queryRunner.query(`DROP INDEX "IDX_17cb3553c700a4985dff5a30ff"`);
await queryRunner.query(`DROP INDEX "IDX_e7c0567f5261063592f022e9b5"`);
await queryRunner.query(`DROP TABLE "note"`);
await queryRunner.query(`DROP TYPE "note_visibility_enum"`);
await queryRunner.query(`DROP INDEX "IDX_9949557d0e1b2c19e5344c171e"`);
await queryRunner.query(`DROP INDEX "IDX_64c327441248bae40f7d92f34f"`);
await queryRunner.query(`DROP INDEX "IDX_70ba8f6af34bc924fc9e12adb8"`);
await queryRunner.query(`DROP TABLE "access_token"`);
await queryRunner.query(`DROP INDEX "IDX_f49922d511d666848f250663c4"`);
await queryRunner.query(`DROP INDEX "IDX_3f5b0899ef90527a3462d7c2cb"`);
await queryRunner.query(`DROP INDEX "IDX_048a757923ed8b157e9895da53"`);
await queryRunner.query(`DROP TABLE "app"`);
await queryRunner.query(`DROP INDEX "IDX_5deb01ae162d1d70b80d064c27"`);
await queryRunner.query(`DROP INDEX "IDX_a854e557b1b14814750c7c7b0c"`);
await queryRunner.query(`DROP INDEX "IDX_be623adaa4c566baf5d29ce0c8"`);
await queryRunner.query(`DROP INDEX "IDX_3252a5df8d5bbd16b281f7799e"`);
await queryRunner.query(`DROP INDEX "IDX_fa99d777623947a5b05f394cae"`);
await queryRunner.query(`DROP INDEX "IDX_a27b942a0d6dcff90e3ee9b5e8"`);
await queryRunner.query(`DROP INDEX "IDX_80ca6e6ef65fb9ef34ea8c90f4"`);
await queryRunner.query(`DROP INDEX "IDX_e11e649824a45d8ed01d597fd9"`);
await queryRunner.query(`DROP TABLE "user"`);
await queryRunner.query(`DROP INDEX "IDX_bb90d1956dafc4068c28aa7560"`);
await queryRunner.query(`DROP INDEX "IDX_e5848eac4940934e23dbc17581"`);
await queryRunner.query(`DROP INDEX "IDX_c55b2b7c284d9fef98026fc88e"`);
await queryRunner.query(`DROP INDEX "IDX_e74022ce9a074b3866f70e0d27"`);
await queryRunner.query(`DROP INDEX "IDX_d85a184c2540d2deba33daf642"`);
await queryRunner.query(`DROP INDEX "IDX_a40b8df8c989d7db937ea27cf6"`);
await queryRunner.query(`DROP INDEX "IDX_37bb9a1b4585f8a3beb24c62d6"`);
await queryRunner.query(`DROP INDEX "IDX_92779627994ac79277f070c91e"`);
await queryRunner.query(`DROP INDEX "IDX_860fa6f6c7df5bb887249fba22"`);
await queryRunner.query(`DROP INDEX "IDX_c8dfad3b72196dd1d6b5db168a"`);
await queryRunner.query(`DROP TABLE "drive_file"`);
await queryRunner.query(`DROP INDEX "IDX_00ceffb0cdc238b3233294f08f"`);
await queryRunner.query(`DROP INDEX "IDX_f4fc06e49c0171c85f1c48060d"`);
await queryRunner.query(`DROP INDEX "IDX_02878d441ceae15ce060b73daf"`);
await queryRunner.query(`DROP TABLE "drive_folder"`);
await queryRunner.query(`DROP INDEX "IDX_584b536b49e53ac81beb39a177"`);
await queryRunner.query(`DROP INDEX "IDX_8cb40cfc8f3c28261e6f887b03"`);
await queryRunner.query(`DROP INDEX "IDX_8e4eb51a35d81b64dda28eed0a"`);
await queryRunner.query(`DROP TABLE "log"`);
await queryRunner.query(`DROP TYPE "log_level_enum"`);
}
}

View File

@ -0,0 +1,29 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class webauthn1561706992953 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`CREATE TABLE "attestation_challenge" ("id" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, "challenge" character varying(64) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "registrationChallenge" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_d0ba6786e093f1bcb497572a6b5" PRIMARY KEY ("id", "userId"))`);
await queryRunner.query(`CREATE INDEX "IDX_f1a461a618fa1755692d0e0d59" ON "attestation_challenge" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_47efb914aed1f72dd39a306c7b" ON "attestation_challenge" ("challenge") `);
await queryRunner.query(`CREATE TABLE "user_security_key" ("id" character varying NOT NULL, "userId" character varying(32) NOT NULL, "publicKey" character varying NOT NULL, "lastUsed" TIMESTAMP WITH TIME ZONE NOT NULL, "name" character varying(30) NOT NULL, CONSTRAINT "PK_3e508571121ab39c5f85d10c166" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_ff9ca3b5f3ee3d0681367a9b44" ON "user_security_key" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_0d7718e562dcedd0aa5cf2c9f7" ON "user_security_key" ("publicKey") `);
await queryRunner.query(`ALTER TABLE "user_profile" ADD "securityKeysAvailable" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`ALTER TABLE "attestation_challenge" ADD CONSTRAINT "FK_f1a461a618fa1755692d0e0d592" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "user_security_key" ADD CONSTRAINT "FK_ff9ca3b5f3ee3d0681367a9b447" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "user_security_key" DROP CONSTRAINT "FK_ff9ca3b5f3ee3d0681367a9b447"`);
await queryRunner.query(`ALTER TABLE "attestation_challenge" DROP CONSTRAINT "FK_f1a461a618fa1755692d0e0d592"`);
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "securityKeysAvailable"`);
await queryRunner.query(`DROP INDEX "IDX_0d7718e562dcedd0aa5cf2c9f7"`);
await queryRunner.query(`DROP INDEX "IDX_ff9ca3b5f3ee3d0681367a9b44"`);
await queryRunner.query(`DROP TABLE "user_security_key"`);
await queryRunner.query(`DROP INDEX "IDX_47efb914aed1f72dd39a306c7b"`);
await queryRunner.query(`DROP INDEX "IDX_f1a461a618fa1755692d0e0d59"`);
await queryRunner.query(`DROP TABLE "attestation_challenge"`);
}
}

View File

@ -0,0 +1,201 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class ChartIndexes1561873850023 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`CREATE INDEX "IDX_0ad37b7ef50f4ddc84363d7ccc" ON "__chart__active_users" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_15e91a03aeeac9dbccdf43fc06" ON "__chart__active_users" ("span") `);
await queryRunner.query(`CREATE INDEX "IDX_00ed5f86db1f7efafb1978bf21" ON "__chart__active_users" ("group") `);
await queryRunner.query(`CREATE INDEX "IDX_20f57cc8f142c131340ee16742" ON "__chart__active_users" ("span", "date") `);
await queryRunner.query(`CREATE INDEX "IDX_9a3ed15a30ab7e3a37702e6e08" ON "__chart__active_users" ("date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_c26e2c1cbb6e911e0554b27416" ON "__chart__active_users" ("span", "date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_13565815f618a1ff53886c5b28" ON "__chart__drive" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_3fa0d0f17ca72e3dc80999a032" ON "__chart__drive" ("span") `);
await queryRunner.query(`CREATE INDEX "IDX_7a170f67425e62a8fabb76c872" ON "__chart__drive" ("group") `);
await queryRunner.query(`CREATE INDEX "IDX_6e1df243476e20cbf86572ecc0" ON "__chart__drive" ("span", "date") `);
await queryRunner.query(`CREATE INDEX "IDX_3313d7288855ec105b5bbf6c21" ON "__chart__drive" ("date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_06690fc959f1c9fdaf21928222" ON "__chart__drive" ("span", "date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_36cb699c49580d4e6c2e6159f9" ON "__chart__federation" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_e447064455928cf627590ef527" ON "__chart__federation" ("span") `);
await queryRunner.query(`CREATE INDEX "IDX_76e87c7bfc5d925fcbba405d84" ON "__chart__federation" ("group") `);
await queryRunner.query(`CREATE INDEX "IDX_2d416e6af791a82e338c79d480" ON "__chart__federation" ("span", "date") `);
await queryRunner.query(`CREATE INDEX "IDX_dd907becf76104e4b656659e6b" ON "__chart__federation" ("date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_e9cd07672b37d8966cf3709283" ON "__chart__federation" ("span", "date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_07747a1038c05f532a718fe1de" ON "__chart__hashtag" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_fcc181fb8283009c61cc4083ef" ON "__chart__hashtag" ("span") `);
await queryRunner.query(`CREATE INDEX "IDX_99a7d2faaef84a6f728d714ad6" ON "__chart__hashtag" ("group") `);
await queryRunner.query(`CREATE INDEX "IDX_49975586f50ed7b800fdd88fbd" ON "__chart__hashtag" ("span", "date") `);
await queryRunner.query(`CREATE INDEX "IDX_25a97c02003338124b2b75fdbc" ON "__chart__hashtag" ("date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_6d6f156ceefc6bc5f273a0e370" ON "__chart__hashtag" ("span", "date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_6b8f34a1a64b06014b6fb66824" ON "__chart__instance" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_c12f0af4a66cdd30c2287ce8aa" ON "__chart__instance" ("span") `);
await queryRunner.query(`CREATE INDEX "IDX_da8a46ba84ca1d8bb5a29bfb63" ON "__chart__instance" ("group") `);
await queryRunner.query(`CREATE INDEX "IDX_d0a4f79af5a97b08f37b547197" ON "__chart__instance" ("span", "date") `);
await queryRunner.query(`CREATE INDEX "IDX_39ee857ab2f23493037c6b6631" ON "__chart__instance" ("date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_f5448d9633cff74208d850aabe" ON "__chart__instance" ("span", "date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_a1efd3e0048a5f2793a47360dc" ON "__chart__network" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_f8dd01baeded2ffa833e0a610a" ON "__chart__network" ("span") `);
await queryRunner.query(`CREATE INDEX "IDX_7b5da130992ec9df96712d4290" ON "__chart__network" ("group") `);
await queryRunner.query(`CREATE INDEX "IDX_08fac0eb3b11f04c200c0b40dd" ON "__chart__network" ("span", "date") `);
await queryRunner.query(`CREATE INDEX "IDX_0a905b992fecd2b5c3fb98759e" ON "__chart__network" ("date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_9ff6944f01acb756fdc92d7563" ON "__chart__network" ("span", "date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_42eb716a37d381cdf566192b2b" ON "__chart__notes" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_e69096589f11e3baa98ddd64d0" ON "__chart__notes" ("span") `);
await queryRunner.query(`CREATE INDEX "IDX_7036f2957151588b813185c794" ON "__chart__notes" ("group") `);
await queryRunner.query(`CREATE INDEX "IDX_0c9a159c5082cbeef3ca6706b5" ON "__chart__notes" ("span", "date") `);
await queryRunner.query(`CREATE INDEX "IDX_f09d543e3acb16c5976bdb31fa" ON "__chart__notes" ("date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_924fc196c80ca24bae01dd37e4" ON "__chart__notes" ("span", "date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_5f86db6492274e07c1a3cdf286" ON "__chart__per_user_drive" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_328f259961e60c4fa0bfcf55ca" ON "__chart__per_user_drive" ("span") `);
await queryRunner.query(`CREATE INDEX "IDX_e496ca8096d28f6b9b509264dc" ON "__chart__per_user_drive" ("group") `);
await queryRunner.query(`CREATE INDEX "IDX_42ea9381f0fda8dfe0fa1c8b53" ON "__chart__per_user_drive" ("span", "date") `);
await queryRunner.query(`CREATE INDEX "IDX_30bf67687f483ace115c5ca642" ON "__chart__per_user_drive" ("date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_f2aeafde2ae6fbad38e857631b" ON "__chart__per_user_drive" ("span", "date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_7af07790712aa3438ff6773f3b" ON "__chart__per_user_following" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_f92dd6d03f8d994f29987f6214" ON "__chart__per_user_following" ("span") `);
await queryRunner.query(`CREATE INDEX "IDX_4b3593098b6edc9c5afe36b18b" ON "__chart__per_user_following" ("group") `);
await queryRunner.query(`CREATE INDEX "IDX_57b5458d0d3d6d1e7f13d4e57f" ON "__chart__per_user_following" ("span", "date") `);
await queryRunner.query(`CREATE INDEX "IDX_b77d4dd9562c3a899d9a286fcd" ON "__chart__per_user_following" ("date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_4db3b84c7be0d3464714f3e0b1" ON "__chart__per_user_following" ("span", "date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_84234bd1abb873f07329681c83" ON "__chart__per_user_notes" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_8d2cbbc8114d90d19b44d626b6" ON "__chart__per_user_notes" ("span") `);
await queryRunner.query(`CREATE INDEX "IDX_55bf20f366979f2436de99206b" ON "__chart__per_user_notes" ("group") `);
await queryRunner.query(`CREATE INDEX "IDX_046feeb12e9ef5f783f409866a" ON "__chart__per_user_notes" ("span", "date") `);
await queryRunner.query(`CREATE INDEX "IDX_5048e9daccbbbc6d567bb142d3" ON "__chart__per_user_notes" ("date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_f68a5ab958f9f5fa17a32ac23b" ON "__chart__per_user_notes" ("span", "date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_f7bf4c62059764c2c2bb40fdab" ON "__chart__per_user_reaction" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_65633a106bce43fc7c5c30a5c7" ON "__chart__per_user_reaction" ("span") `);
await queryRunner.query(`CREATE INDEX "IDX_8cf3156fd7a6b15c43459c6e3b" ON "__chart__per_user_reaction" ("group") `);
await queryRunner.query(`CREATE INDEX "IDX_edeb73c09c3143a81bcb34d569" ON "__chart__per_user_reaction" ("span", "date") `);
await queryRunner.query(`CREATE INDEX "IDX_229a41ad465f9205f1f5703291" ON "__chart__per_user_reaction" ("date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_e316f01a6d24eb31db27f88262" ON "__chart__per_user_reaction" ("span", "date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_0c641990ecf47d2545df4edb75" ON "__chart__test_grouped" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_2be7ec6cebddc14dc11e206686" ON "__chart__test_grouped" ("span") `);
await queryRunner.query(`CREATE INDEX "IDX_234dff3c0b56a6150b95431ab9" ON "__chart__test_grouped" ("group") `);
await queryRunner.query(`CREATE INDEX "IDX_a5133470f4825902e170328ca5" ON "__chart__test_grouped" ("span", "date") `);
await queryRunner.query(`CREATE INDEX "IDX_b14489029e4b3aaf4bba5fb524" ON "__chart__test_grouped" ("date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_84e661abb7bd1e51b690d4b017" ON "__chart__test_grouped" ("span", "date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_437bab3c6061d90f6bb65fd2cc" ON "__chart__test_unique" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_5c73bf61da4f6e6f15bae88ed1" ON "__chart__test_unique" ("span") `);
await queryRunner.query(`CREATE INDEX "IDX_bbfa573a8181018851ed0b6357" ON "__chart__test_unique" ("group") `);
await queryRunner.query(`CREATE INDEX "IDX_d70c86baedc68326be11f9c0ce" ON "__chart__test_unique" ("span", "date") `);
await queryRunner.query(`CREATE INDEX "IDX_a0cd75442dd10d0643a17c4a49" ON "__chart__test_unique" ("date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_66e1e1ecd2f29e57778af35b59" ON "__chart__test_unique" ("span", "date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_b070a906db04b44c67c6c2144d" ON "__chart__test" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_92255988735563f0fe4aba1f05" ON "__chart__test" ("span") `);
await queryRunner.query(`CREATE INDEX "IDX_d41cce6aee1a50bfc062038f9b" ON "__chart__test" ("group") `);
await queryRunner.query(`CREATE INDEX "IDX_c5870993e25c3d5771f91f5003" ON "__chart__test" ("span", "date") `);
await queryRunner.query(`CREATE INDEX "IDX_a319e5dbf47e8a17497623beae" ON "__chart__test" ("date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_f170de677ea75ad4533de2723e" ON "__chart__test" ("span", "date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_845254b3eaf708ae8a6cac3026" ON "__chart__users" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_7c184198ecf66a8d3ecb253ab3" ON "__chart__users" ("span") `);
await queryRunner.query(`CREATE INDEX "IDX_ed9b95919c672a13008e9487ee" ON "__chart__users" ("group") `);
await queryRunner.query(`CREATE INDEX "IDX_f091abb24193d50c653c6b77fc" ON "__chart__users" ("span", "date") `);
await queryRunner.query(`CREATE INDEX "IDX_337e9599f278bd7537fe30876f" ON "__chart__users" ("date", "group") `);
await queryRunner.query(`CREATE INDEX "IDX_a770a57c70e668cc61590c9161" ON "__chart__users" ("span", "date", "group") `);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`DROP INDEX "IDX_a770a57c70e668cc61590c9161"`);
await queryRunner.query(`DROP INDEX "IDX_337e9599f278bd7537fe30876f"`);
await queryRunner.query(`DROP INDEX "IDX_f091abb24193d50c653c6b77fc"`);
await queryRunner.query(`DROP INDEX "IDX_ed9b95919c672a13008e9487ee"`);
await queryRunner.query(`DROP INDEX "IDX_7c184198ecf66a8d3ecb253ab3"`);
await queryRunner.query(`DROP INDEX "IDX_845254b3eaf708ae8a6cac3026"`);
await queryRunner.query(`DROP INDEX "IDX_f170de677ea75ad4533de2723e"`);
await queryRunner.query(`DROP INDEX "IDX_a319e5dbf47e8a17497623beae"`);
await queryRunner.query(`DROP INDEX "IDX_c5870993e25c3d5771f91f5003"`);
await queryRunner.query(`DROP INDEX "IDX_d41cce6aee1a50bfc062038f9b"`);
await queryRunner.query(`DROP INDEX "IDX_92255988735563f0fe4aba1f05"`);
await queryRunner.query(`DROP INDEX "IDX_b070a906db04b44c67c6c2144d"`);
await queryRunner.query(`DROP INDEX "IDX_66e1e1ecd2f29e57778af35b59"`);
await queryRunner.query(`DROP INDEX "IDX_a0cd75442dd10d0643a17c4a49"`);
await queryRunner.query(`DROP INDEX "IDX_d70c86baedc68326be11f9c0ce"`);
await queryRunner.query(`DROP INDEX "IDX_bbfa573a8181018851ed0b6357"`);
await queryRunner.query(`DROP INDEX "IDX_5c73bf61da4f6e6f15bae88ed1"`);
await queryRunner.query(`DROP INDEX "IDX_437bab3c6061d90f6bb65fd2cc"`);
await queryRunner.query(`DROP INDEX "IDX_84e661abb7bd1e51b690d4b017"`);
await queryRunner.query(`DROP INDEX "IDX_b14489029e4b3aaf4bba5fb524"`);
await queryRunner.query(`DROP INDEX "IDX_a5133470f4825902e170328ca5"`);
await queryRunner.query(`DROP INDEX "IDX_234dff3c0b56a6150b95431ab9"`);
await queryRunner.query(`DROP INDEX "IDX_2be7ec6cebddc14dc11e206686"`);
await queryRunner.query(`DROP INDEX "IDX_0c641990ecf47d2545df4edb75"`);
await queryRunner.query(`DROP INDEX "IDX_e316f01a6d24eb31db27f88262"`);
await queryRunner.query(`DROP INDEX "IDX_229a41ad465f9205f1f5703291"`);
await queryRunner.query(`DROP INDEX "IDX_edeb73c09c3143a81bcb34d569"`);
await queryRunner.query(`DROP INDEX "IDX_8cf3156fd7a6b15c43459c6e3b"`);
await queryRunner.query(`DROP INDEX "IDX_65633a106bce43fc7c5c30a5c7"`);
await queryRunner.query(`DROP INDEX "IDX_f7bf4c62059764c2c2bb40fdab"`);
await queryRunner.query(`DROP INDEX "IDX_f68a5ab958f9f5fa17a32ac23b"`);
await queryRunner.query(`DROP INDEX "IDX_5048e9daccbbbc6d567bb142d3"`);
await queryRunner.query(`DROP INDEX "IDX_046feeb12e9ef5f783f409866a"`);
await queryRunner.query(`DROP INDEX "IDX_55bf20f366979f2436de99206b"`);
await queryRunner.query(`DROP INDEX "IDX_8d2cbbc8114d90d19b44d626b6"`);
await queryRunner.query(`DROP INDEX "IDX_84234bd1abb873f07329681c83"`);
await queryRunner.query(`DROP INDEX "IDX_4db3b84c7be0d3464714f3e0b1"`);
await queryRunner.query(`DROP INDEX "IDX_b77d4dd9562c3a899d9a286fcd"`);
await queryRunner.query(`DROP INDEX "IDX_57b5458d0d3d6d1e7f13d4e57f"`);
await queryRunner.query(`DROP INDEX "IDX_4b3593098b6edc9c5afe36b18b"`);
await queryRunner.query(`DROP INDEX "IDX_f92dd6d03f8d994f29987f6214"`);
await queryRunner.query(`DROP INDEX "IDX_7af07790712aa3438ff6773f3b"`);
await queryRunner.query(`DROP INDEX "IDX_f2aeafde2ae6fbad38e857631b"`);
await queryRunner.query(`DROP INDEX "IDX_30bf67687f483ace115c5ca642"`);
await queryRunner.query(`DROP INDEX "IDX_42ea9381f0fda8dfe0fa1c8b53"`);
await queryRunner.query(`DROP INDEX "IDX_e496ca8096d28f6b9b509264dc"`);
await queryRunner.query(`DROP INDEX "IDX_328f259961e60c4fa0bfcf55ca"`);
await queryRunner.query(`DROP INDEX "IDX_5f86db6492274e07c1a3cdf286"`);
await queryRunner.query(`DROP INDEX "IDX_924fc196c80ca24bae01dd37e4"`);
await queryRunner.query(`DROP INDEX "IDX_f09d543e3acb16c5976bdb31fa"`);
await queryRunner.query(`DROP INDEX "IDX_0c9a159c5082cbeef3ca6706b5"`);
await queryRunner.query(`DROP INDEX "IDX_7036f2957151588b813185c794"`);
await queryRunner.query(`DROP INDEX "IDX_e69096589f11e3baa98ddd64d0"`);
await queryRunner.query(`DROP INDEX "IDX_42eb716a37d381cdf566192b2b"`);
await queryRunner.query(`DROP INDEX "IDX_9ff6944f01acb756fdc92d7563"`);
await queryRunner.query(`DROP INDEX "IDX_0a905b992fecd2b5c3fb98759e"`);
await queryRunner.query(`DROP INDEX "IDX_08fac0eb3b11f04c200c0b40dd"`);
await queryRunner.query(`DROP INDEX "IDX_7b5da130992ec9df96712d4290"`);
await queryRunner.query(`DROP INDEX "IDX_f8dd01baeded2ffa833e0a610a"`);
await queryRunner.query(`DROP INDEX "IDX_a1efd3e0048a5f2793a47360dc"`);
await queryRunner.query(`DROP INDEX "IDX_f5448d9633cff74208d850aabe"`);
await queryRunner.query(`DROP INDEX "IDX_39ee857ab2f23493037c6b6631"`);
await queryRunner.query(`DROP INDEX "IDX_d0a4f79af5a97b08f37b547197"`);
await queryRunner.query(`DROP INDEX "IDX_da8a46ba84ca1d8bb5a29bfb63"`);
await queryRunner.query(`DROP INDEX "IDX_c12f0af4a66cdd30c2287ce8aa"`);
await queryRunner.query(`DROP INDEX "IDX_6b8f34a1a64b06014b6fb66824"`);
await queryRunner.query(`DROP INDEX "IDX_6d6f156ceefc6bc5f273a0e370"`);
await queryRunner.query(`DROP INDEX "IDX_25a97c02003338124b2b75fdbc"`);
await queryRunner.query(`DROP INDEX "IDX_49975586f50ed7b800fdd88fbd"`);
await queryRunner.query(`DROP INDEX "IDX_99a7d2faaef84a6f728d714ad6"`);
await queryRunner.query(`DROP INDEX "IDX_fcc181fb8283009c61cc4083ef"`);
await queryRunner.query(`DROP INDEX "IDX_07747a1038c05f532a718fe1de"`);
await queryRunner.query(`DROP INDEX "IDX_e9cd07672b37d8966cf3709283"`);
await queryRunner.query(`DROP INDEX "IDX_dd907becf76104e4b656659e6b"`);
await queryRunner.query(`DROP INDEX "IDX_2d416e6af791a82e338c79d480"`);
await queryRunner.query(`DROP INDEX "IDX_76e87c7bfc5d925fcbba405d84"`);
await queryRunner.query(`DROP INDEX "IDX_e447064455928cf627590ef527"`);
await queryRunner.query(`DROP INDEX "IDX_36cb699c49580d4e6c2e6159f9"`);
await queryRunner.query(`DROP INDEX "IDX_06690fc959f1c9fdaf21928222"`);
await queryRunner.query(`DROP INDEX "IDX_3313d7288855ec105b5bbf6c21"`);
await queryRunner.query(`DROP INDEX "IDX_6e1df243476e20cbf86572ecc0"`);
await queryRunner.query(`DROP INDEX "IDX_7a170f67425e62a8fabb76c872"`);
await queryRunner.query(`DROP INDEX "IDX_3fa0d0f17ca72e3dc80999a032"`);
await queryRunner.query(`DROP INDEX "IDX_13565815f618a1ff53886c5b28"`);
await queryRunner.query(`DROP INDEX "IDX_c26e2c1cbb6e911e0554b27416"`);
await queryRunner.query(`DROP INDEX "IDX_9a3ed15a30ab7e3a37702e6e08"`);
await queryRunner.query(`DROP INDEX "IDX_20f57cc8f142c131340ee16742"`);
await queryRunner.query(`DROP INDEX "IDX_00ed5f86db1f7efafb1978bf21"`);
await queryRunner.query(`DROP INDEX "IDX_15e91a03aeeac9dbccdf43fc06"`);
await queryRunner.query(`DROP INDEX "IDX_0ad37b7ef50f4ddc84363d7ccc"`);
await queryRunner.query(`DROP INDEX "IDX_90148bbc2bf0854428786bfc15"`);
await queryRunner.query(`DROP INDEX "IDX_88937d94d7443d9a99a76fa5c0"`);
await queryRunner.query(`DROP INDEX "IDX_54ebcb6d27222913b908d56fd8"`);
await queryRunner.query(`DROP INDEX "IDX_796a8c03959361f97dc2be1d5c"`);
await queryRunner.query(`DROP INDEX "IDX_25dfc71b0369b003a4cd434d0b"`);
await queryRunner.query(`DROP INDEX "IDX_51c063b6a133a9cb87145450f5"`);
await queryRunner.query(`DROP INDEX "IDX_fa99d777623947a5b05f394cae"`);
await queryRunner.query(`DROP INDEX "IDX_315c779174fe8247ab324f036e"`);
await queryRunner.query(`DROP INDEX "IDX_c5d46cbfda48b1c33ed852e21b"`);
await queryRunner.query(`DROP INDEX "IDX_8cb40cfc8f3c28261e6f887b03"`);
}
}

View File

@ -0,0 +1,13 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class PasswordLessLogin1562422242907 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "user_profile" ADD COLUMN "usePasswordLessLogin" boolean DEFAULT false NOT NULL`);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "usePasswordLessLogin"`);
}
}

View File

@ -0,0 +1,17 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class PinnedPage1562444565093 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "user_profile" ADD "pinnedPageId" character varying(32)`);
await queryRunner.query(`ALTER TABLE "user_profile" ADD CONSTRAINT "UQ_6dc44f1ceb65b1e72bacef2ca27" UNIQUE ("pinnedPageId")`);
await queryRunner.query(`ALTER TABLE "user_profile" ADD CONSTRAINT "FK_6dc44f1ceb65b1e72bacef2ca27" FOREIGN KEY ("pinnedPageId") REFERENCES "page"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "user_profile" DROP CONSTRAINT "FK_6dc44f1ceb65b1e72bacef2ca27"`);
await queryRunner.query(`ALTER TABLE "user_profile" DROP CONSTRAINT "UQ_6dc44f1ceb65b1e72bacef2ca27"`);
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "pinnedPageId"`);
}
}

View File

@ -0,0 +1,13 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class PageTitleHideOption1562448332510 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "page" ADD "hideTitleWhenPinned" boolean NOT NULL DEFAULT false`);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "page" DROP COLUMN "hideTitleWhenPinned"`);
}
}

View File

@ -0,0 +1,17 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class ModerationLog1562869971568 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`CREATE TABLE "moderation_log" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "type" character varying(128) NOT NULL, "info" jsonb NOT NULL, CONSTRAINT "PK_d0adca6ecfd068db83e4526cc26" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_a08ad074601d204e0f69da9a95" ON "moderation_log" ("userId") `);
await queryRunner.query(`ALTER TABLE "moderation_log" ADD CONSTRAINT "FK_a08ad074601d204e0f69da9a954" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "moderation_log" DROP CONSTRAINT "FK_a08ad074601d204e0f69da9a954"`);
await queryRunner.query(`DROP INDEX "IDX_a08ad074601d204e0f69da9a95"`);
await queryRunner.query(`DROP TABLE "moderation_log"`);
}
}

View File

@ -0,0 +1,13 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class UsedUsername1563757595828 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`CREATE TABLE "used_username" ("username" character varying(128) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, CONSTRAINT "PK_78fd79d2d24c6ac2f4cc9a31a5d" PRIMARY KEY ("username"))`);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`DROP TABLE "used_username"`);
}
}

View File

@ -0,0 +1,13 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class room1565634203341 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "user_profile" ADD "room" jsonb NOT NULL DEFAULT '{}'`);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "room"`);
}
}

View File

@ -0,0 +1,13 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class CustomEmojiCategory1571220798684 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "emoji" ADD "category" character varying(128)`, undefined);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "emoji" DROP COLUMN "category"`, undefined);
}
}

View File

@ -0,0 +1,29 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class nodeinfo1572760203493 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "system"`, undefined);
await queryRunner.query(`ALTER TABLE "instance" ADD "softwareName" character varying(64) DEFAULT null`, undefined);
await queryRunner.query(`ALTER TABLE "instance" ADD "softwareVersion" character varying(64) DEFAULT null`, undefined);
await queryRunner.query(`ALTER TABLE "instance" ADD "openRegistrations" boolean DEFAULT null`, undefined);
await queryRunner.query(`ALTER TABLE "instance" ADD "name" character varying(256) DEFAULT null`, undefined);
await queryRunner.query(`ALTER TABLE "instance" ADD "description" character varying(4096) DEFAULT null`, undefined);
await queryRunner.query(`ALTER TABLE "instance" ADD "maintainerName" character varying(128) DEFAULT null`, undefined);
await queryRunner.query(`ALTER TABLE "instance" ADD "maintainerEmail" character varying(256) DEFAULT null`, undefined);
await queryRunner.query(`ALTER TABLE "instance" ADD "infoUpdatedAt" TIMESTAMP WITH TIME ZONE`, undefined);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "infoUpdatedAt"`, undefined);
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "maintainerEmail"`, undefined);
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "maintainerName"`, undefined);
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "description"`, undefined);
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "name"`, undefined);
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "openRegistrations"`, undefined);
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "softwareVersion"`, undefined);
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "softwareName"`, undefined);
await queryRunner.query(`ALTER TABLE "instance" ADD "system" character varying(64)`, undefined);
}
}

View File

@ -0,0 +1,14 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class TalkFederationId1576269851876 implements MigrationInterface {
name = 'TalkFederationId1576269851876'
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "messaging_message" ADD "uri" character varying(512)`, undefined);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "messaging_message" DROP COLUMN "uri"`, undefined);
}
}

View File

@ -0,0 +1,14 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class ProxyRemoteFiles1576869585998 implements MigrationInterface {
name = 'ProxyRemoteFiles1576869585998'
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "meta" ADD "proxyRemoteFiles" boolean NOT NULL DEFAULT false`, undefined);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "proxyRemoteFiles"`, undefined);
}
}

View File

@ -1,7 +1,7 @@
import * as fs from 'fs';
import config from './config';
const config = require('./built/config').default;
const entities = require('./built/db/postgre').entities;
const json = {
module.exports = {
type: 'postgres',
host: config.db.host,
port: config.db.port,
@ -9,11 +9,9 @@ const json = {
password: config.db.pass,
database: config.db.db,
extra: config.db.extra,
entities: ['src/models/entities/*.ts'],
entities: entities,
migrations: ['migration/*.ts'],
cli: {
migrationsDir: 'migration'
}
};
fs.writeFileSync('ormconfig.json', JSON.stringify(json));

View File

@ -1,7 +1,7 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "11.20.1",
"version": "11.37.0",
"codename": "daybreak",
"repository": {
"type": "git",
@ -11,9 +11,9 @@
"private": true,
"scripts": {
"start": "node ./index.js",
"init": "node ./built/init.js",
"init": "npm run migrate",
"ormconfig": "node ./built/ormconfig.js",
"migrate": "npm run ormconfig && ts-node ./node_modules/typeorm/cli.js migration:run",
"migrate": "ts-node ./node_modules/typeorm/cli.js migration:run",
"migrateandstart": "npm run migrate && npm run start",
"build": "webpack && gulp build",
"webpack": "webpack",
@ -26,239 +26,239 @@
"format": "gulp format"
},
"resolutions": {
"gulp-cssnano/cssnano/postcss-svgo/svgo/js-yaml": "^3.13.1",
"video-thumbnail-generator/lodash": "^4.17.11"
"https-proxy-agent": "^3.0.0",
"lodash": "^4.17.13"
},
"dependencies": {
"@elastic/elasticsearch": "7.0.0-rc.2",
"@fortawesome/fontawesome-svg-core": "1.2.15",
"@fortawesome/free-brands-svg-icons": "5.7.2",
"@fortawesome/free-regular-svg-icons": "5.7.2",
"@fortawesome/free-solid-svg-icons": "5.7.2",
"@fortawesome/vue-fontawesome": "0.1.5",
"@koa/cors": "2.2.3",
"@elastic/elasticsearch": "7.5.0",
"@fortawesome/fontawesome-svg-core": "1.2.26",
"@fortawesome/free-brands-svg-icons": "5.12.0",
"@fortawesome/free-regular-svg-icons": "5.12.0",
"@fortawesome/free-solid-svg-icons": "5.12.0",
"@fortawesome/vue-fontawesome": "0.1.9",
"@koa/cors": "3.0.0",
"@koa/multer": "2.0.2",
"@koa/router": "8.0.5",
"@types/bcryptjs": "2.4.2",
"@types/bull": "3.5.11",
"@types/dateformat": "3.0.0",
"@types/deep-equal": "1.0.1",
"@types/double-ended-queue": "2.1.0",
"@types/bull": "3.10.6",
"@types/cbor": "5.0.0",
"@types/dateformat": "3.0.1",
"@types/double-ended-queue": "2.1.1",
"@types/gulp": "4.0.6",
"@types/gulp-mocha": "0.0.32",
"@types/gulp-rename": "0.0.33",
"@types/gulp-replace": "0.0.31",
"@types/gulp-uglify": "3.0.6",
"@types/gulp-util": "3.0.34",
"@types/is-root": "1.0.0",
"@types/is-url": "1.2.28",
"@types/js-yaml": "3.12.1",
"@types/jsdom": "12.2.3",
"@types/katex": "0.10.1",
"@types/koa": "2.0.48",
"@types/koa-bodyparser": "5.0.2",
"@types/jsdom": "12.2.4",
"@types/katex": "0.11.0",
"@types/koa": "2.11.0",
"@types/koa-bodyparser": "4.3.0",
"@types/koa-compress": "2.0.9",
"@types/koa-cors": "0.0.0",
"@types/koa-favicon": "2.0.19",
"@types/koa-logger": "3.1.1",
"@types/koa-mount": "3.0.1",
"@types/koa-multer": "1.0.0",
"@types/koa-router": "7.0.40",
"@types/koa-mount": "4.0.0",
"@types/koa-send": "4.1.2",
"@types/koa-views": "2.0.3",
"@types/koa__cors": "2.2.3",
"@types/lolex": "3.1.1",
"@types/minio": "7.0.1",
"@types/mocha": "5.2.6",
"@types/node": "11.13.8",
"@types/nodemailer": "4.6.8",
"@types/nprogress": "0.0.29",
"@types/koa-views": "2.0.4",
"@types/koa__cors": "3.0.0",
"@types/koa__multer": "2.0.1",
"@types/koa__router": "8.0.2",
"@types/lolex": "5.1.0",
"@types/mocha": "5.2.7",
"@types/node": "13.1.4",
"@types/nodemailer": "6.4.0",
"@types/nprogress": "0.2.0",
"@types/oauth": "0.9.1",
"@types/parse5": "5.0.0",
"@types/parse5": "5.0.2",
"@types/parsimmon": "1.10.0",
"@types/portscanner": "2.1.0",
"@types/pug": "2.0.4",
"@types/qrcode": "1.3.2",
"@types/qrcode": "1.3.4",
"@types/random-seed": "0.3.3",
"@types/ratelimiter": "2.1.28",
"@types/redis": "2.8.12",
"@types/redis": "2.8.14",
"@types/rename": "1.0.1",
"@types/request": "2.48.1",
"@types/request-promise-native": "1.0.16",
"@types/request": "2.48.4",
"@types/request-promise-native": "1.0.17",
"@types/request-stats": "3.0.0",
"@types/rimraf": "2.0.2",
"@types/rimraf": "2.0.3",
"@types/seedrandom": "2.4.28",
"@types/sharp": "0.22.1",
"@types/showdown": "1.9.2",
"@types/speakeasy": "2.0.4",
"@types/systeminformation": "3.23.1",
"@types/tinycolor2": "1.4.1",
"@types/sharp": "0.23.1",
"@types/showdown": "1.9.3",
"@types/speakeasy": "2.0.5",
"@types/systeminformation": "3.54.1",
"@types/tinycolor2": "1.4.2",
"@types/tmp": "0.1.0",
"@types/uuid": "3.4.4",
"@types/uuid": "3.4.6",
"@types/web-push": "3.3.0",
"@types/webpack": "4.4.29",
"@types/webpack": "4.41.1",
"@types/webpack-stream": "3.2.10",
"@types/websocket": "0.0.40",
"@types/ws": "6.0.1",
"animejs": "3.0.1",
"apexcharts": "3.7.1",
"@types/websocket": "1.0.0",
"@types/ws": "6.0.4",
"@typescript-eslint/parser": "2.15.0",
"agentkeepalive": "4.1.0",
"animejs": "3.1.0",
"apexcharts": "3.12.0",
"autobind-decorator": "2.4.0",
"autosize": "4.0.2",
"autwh": "0.1.0",
"aws-sdk": "2.598.0",
"bcryptjs": "2.4.3",
"bootstrap-vue": "2.0.0-rc.13",
"bull": "3.10.0",
"cafy": "15.1.1",
"bootstrap": "4.4.1",
"bootstrap-vue": "2.1.0",
"bull": "3.12.1",
"cafy": "15.2.1",
"cbor": "5.0.1",
"chai": "4.2.0",
"chalk": "2.4.2",
"cli-highlight": "2.1.1",
"commander": "2.20.0",
"chalk": "3.0.0",
"cli-highlight": "2.1.4",
"commander": "4.1.0",
"content-disposition": "0.5.3",
"crc-32": "1.2.0",
"css-loader": "2.1.1",
"css-loader": "3.4.1",
"cssnano": "4.1.10",
"dateformat": "3.0.3",
"deep-equal": "1.0.1",
"diskusage": "1.1.1",
"diskusage": "1.1.3",
"double-ended-queue": "2.1.0-0",
"emojilib": "2.4.0",
"eslint": "5.16.0",
"eslint-plugin-vue": "5.2.2",
"eventemitter3": "3.1.2",
"feed": "2.0.4",
"file-type": "10.11.0",
"fuckadblock": "3.2.1",
"eslint": "6.8.0",
"eslint-plugin-vue": "6.1.2",
"eventemitter3": "4.0.0",
"feed": "4.1.0",
"file-type": "13.0.1",
"fluent-ffmpeg": "2.1.2",
"gulp": "4.0.2",
"gulp-cssnano": "2.1.3",
"gulp-imagemin": "5.0.3",
"gulp-mocha": "6.0.0",
"gulp-rename": "1.4.0",
"gulp-clean-css": "4.2.0",
"gulp-mocha": "7.0.2",
"gulp-rename": "2.0.0",
"gulp-replace": "1.0.0",
"gulp-sourcemaps": "2.6.5",
"gulp-stylus": "2.7.0",
"gulp-terser": "1.2.0",
"gulp-tslint": "8.1.4",
"gulp-typescript": "5.0.1",
"gulp-uglify": "3.0.2",
"gulp-util": "3.0.8",
"hard-source-webpack-plugin": "0.13.1",
"html-minifier": "4.0.0",
"http-signature": "1.2.0",
"insert-text-at-cursor": "0.2.0",
"http-signature": "1.3.1",
"https-proxy-agent": "4.0.0",
"insert-text-at-cursor": "0.3.0",
"is-root": "2.1.0",
"is-svg": "4.2.0",
"js-yaml": "3.13.1",
"jsdom": "15.1.1",
"json5": "2.1.0",
"json5-loader": "2.0.0",
"katex": "0.10.2",
"koa": "2.7.0",
"jsdom": "15.2.1",
"json5": "2.1.1",
"json5-loader": "3.0.0",
"jsrsasign": "8.0.12",
"katex": "0.11.1",
"koa": "2.11.0",
"koa-bodyparser": "4.2.1",
"koa-compress": "3.0.0",
"koa-favicon": "2.0.1",
"koa-json-body": "5.3.0",
"koa-logger": "3.2.0",
"koa-logger": "3.2.1",
"koa-mount": "4.0.0",
"koa-multer": "1.0.2",
"koa-router": "7.4.0",
"koa-send": "5.0.0",
"koa-slow": "2.1.0",
"koa-views": "6.2.0",
"koa-views": "6.2.1",
"langmap": "0.0.16",
"loader-utils": "1.2.3",
"lolex": "3.1.0",
"lolex": "5.1.2",
"lookup-dns-cache": "2.1.0",
"minio": "7.0.8",
"mocha": "6.1.4",
"mocha": "7.0.0",
"moji": "0.5.1",
"moment": "2.24.0",
"ms": "2.1.1",
"nested-property": "0.0.7",
"ms": "2.1.2",
"multer": "1.4.2",
"nested-property": "1.0.2",
"node-fetch": "2.6.0",
"nodemailer": "6.2.1",
"nodemailer": "6.4.2",
"nprogress": "0.2.0",
"object-assign-deep": "0.4.0",
"os-utils": "0.0.14",
"parse5": "5.1.0",
"parsimmon": "1.12.0",
"pg": "7.11.0",
"parse5": "5.1.1",
"parsimmon": "1.13.0",
"pg": "7.17.0",
"portscanner": "2.2.0",
"postcss-loader": "3.0.0",
"prismjs": "1.16.0",
"prismjs": "1.18.0",
"progress-bar-webpack-plugin": "1.12.1",
"promise-any": "0.2.0",
"promise-limit": "2.7.0",
"promise-sequential": "1.1.1",
"pug": "2.0.3",
"pug": "2.0.4",
"punycode": "2.1.1",
"pureimage": "0.1.6",
"qrcode": "1.3.3",
"qrcode": "1.4.4",
"random-seed": "0.3.0",
"randomcolor": "0.5.4",
"ratelimiter": "3.3.0",
"ratelimiter": "3.4.0",
"recaptcha-promise": "0.1.3",
"reconnecting-websocket": "4.1.10",
"reconnecting-websocket": "4.2.0",
"redis": "2.8.0",
"redis-lock": "0.1.4",
"reflect-metadata": "0.1.13",
"rename": "1.0.4",
"request": "2.88.0",
"request-promise-native": "1.0.7",
"request-promise-native": "1.0.8",
"request-stats": "3.0.0",
"require-all": "3.0.0",
"rimraf": "2.6.3",
"rimraf": "3.0.0",
"rndstr": "1.0.0",
"s-age": "1.1.2",
"seedrandom": "3.0.1",
"sharp": "0.22.1",
"showdown": "1.9.0",
"seedrandom": "3.0.5",
"sharp": "0.23.4",
"showdown": "1.9.1",
"showdown-highlightjs-extension": "0.1.2",
"speakeasy": "2.0.0",
"stringz": "1.0.0",
"style-loader": "0.23.1",
"stylus": "0.54.5",
"stringz": "2.0.0",
"style-loader": "1.1.2",
"stylus": "0.54.7",
"stylus-loader": "3.0.2",
"summaly": "2.2.0",
"systeminformation": "4.1.6",
"summaly": "2.3.1",
"syslog-pro": "1.0.0",
"systeminformation": "4.17.3",
"syuilo-password-strength": "0.0.1",
"terser-webpack-plugin": "1.3.0",
"terser-webpack-plugin": "2.3.1",
"textarea-caret": "3.1.0",
"three": "0.112.1",
"tinycolor2": "1.4.1",
"tmp": "0.1.0",
"ts-loader": "5.3.3",
"ts-node": "7.0.1",
"tslint": "5.15.0",
"ts-loader": "6.2.1",
"ts-node": "8.5.4",
"tslint": "5.20.1",
"tslint-sonarts": "1.9.0",
"typeorm": "0.2.16-rc.1",
"typescript": "3.3.3333",
"typescript-eslint-parser": "22.0.0",
"uglify-es": "3.3.9",
"typeorm": "0.2.22",
"typescript": "3.7.4",
"ulid": "2.3.0",
"url-loader": "1.1.2",
"uuid": "3.3.2",
"url-loader": "3.0.0",
"uuid": "3.3.3",
"v-animate-css": "0.0.3",
"v-debounce": "0.1.2",
"video-thumbnail-generator": "1.1.3",
"vue": "2.6.10",
"vue": "2.6.11",
"vue-color": "2.7.0",
"vue-content-loading": "1.6.0",
"vue-cropperjs": "3.0.0",
"vue-i18n": "8.11.2",
"vue-cropperjs": "4.0.1",
"vue-i18n": "8.15.3",
"vue-js-modal": "1.3.31",
"vue-json-pretty": "1.6.0",
"vue-loader": "15.7.0",
"vue-json-pretty": "1.6.3",
"vue-loader": "15.8.3",
"vue-marquee-text-component": "1.1.1",
"vue-prism-component": "1.1.1",
"vue-router": "3.0.6",
"vue-router": "3.1.3",
"vue-sequential-entrance": "1.1.3",
"vue-style-loader": "4.1.2",
"vue-svg-inline-loader": "1.2.15",
"vue-template-compiler": "2.6.10",
"vuedraggable": "2.21.0",
"vue-svg-inline-loader": "1.4.4",
"vue-template-compiler": "2.6.11",
"vuedraggable": "2.23.2",
"vuewordcloud": "18.7.11",
"vuex": "3.1.1",
"vuex-persistedstate": "2.5.4",
"web-push": "3.3.5",
"webpack": "4.33.0",
"webpack-cli": "3.3.2",
"websocket": "1.0.28",
"ws": "7.0.0",
"vuex": "3.1.2",
"vuex-persistedstate": "2.7.0",
"web-push": "3.4.3",
"webpack": "4.41.5",
"webpack-cli": "3.3.10",
"websocket": "1.0.31",
"ws": "7.2.1",
"xev": "2.0.1"
},
"devDependencies": {
"@types/fluent-ffmpeg": "2.1.12"
}
}

803
src/@types/jsrsasign.d.ts vendored Normal file
View File

@ -0,0 +1,803 @@
// Attention: Partial Type Definition
declare module 'jsrsasign' {
//// HELPER TYPES
/**
* Attention: The value might be changed by the function.
*/
type Mutable<T> = T;
/**
* Deprecated: The function might be deleted in future release.
*/
type Deprecated<T> = T;
//// COMMON TYPES
/**
* byte number
*/
type ByteNumber = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255;
/**
* hexadecimal string /[0-9A-F]/
*/
type HexString = string;
/**
* binary string /[01]/
*/
type BinString = string;
/**
* base64 string /[A-Za-z0-9+/]=+/
*/
type Base64String = string;
/**
* base64 URL encoded string /[A-Za-z0-9_-]/
*/
type Base64URLString = string;
/**
* time value (ex. "151231235959Z")
*/
type TimeValue = string;
/**
* OID string (ex. '1.2.3.4.567')
*/
type OID = string;
/**
* OID name
*/
type OIDName = string;
/**
* PEM formatted string
*/
type PEM = string;
//// ASN1 TYPES
class ASN1Object {
public isModified: boolean;
public hTLV: ASN1TLV;
public hT: ASN1T;
public hL: ASN1L;
public hV: ASN1V;
public getLengthHexFromValue(): HexString;
public getEncodedHex(): ASN1TLV;
public getValueHex(): ASN1V;
public getFreshValueHex(): ASN1V;
}
class DERAbstractStructured extends ASN1Object {
constructor(params?: Partial<Record<'array', ASN1Object[]>>);
public setByASN1ObjectArray(asn1ObjectArray: ASN1Object[]): void;
public appendASN1Object(asn1Object: ASN1Object): void;
}
class DERSequence extends DERAbstractStructured {
constructor(params?: Partial<Record<'array', ASN1Object[]>>);
public getFreshValueHex(): ASN1V;
}
//// ASN1HEX TYPES
/**
* ASN.1 DER encoded data (hexadecimal string)
*/
type ASN1S = HexString;
/**
* index of something
*/
type Idx<T extends { [idx: string]: unknown } | { [idx: number]: unknown }> = ASN1S extends { [idx: string]: unknown } ? string : ASN1S extends { [idx: number]: unknown } ? number : never;
/**
* byte length of something
*/
type ByteLength<T extends { length: unknown }> = T['length'];
/**
* ASN.1 L(length) (hexadecimal string)
*/
type ASN1L = HexString;
/**
* ASN.1 T(tag) (hexadecimal string)
*/
type ASN1T = HexString;
/**
* ASN.1 V(value) (hexadecimal string)
*/
type ASN1V = HexString;
/**
* ASN.1 TLV (hexadecimal string)
*/
type ASN1TLV = HexString;
/**
* ASN.1 object string
*/
type ASN1ObjectString = string;
/**
* nth
*/
type Nth = number;
/**
* ASN.1 DER encoded OID value (hexadecimal string)
*/
type ASN1OIDV = HexString;
class ASN1HEX {
public static getLblen(s: ASN1S, idx: Idx<ASN1S>): ByteLength<ASN1L>;
public static getL(s: ASN1S, idx: Idx<ASN1S>): ASN1L;
public static getVblen(s: ASN1S, idx: Idx<ASN1S>): ByteLength<ASN1V>;
public static getVidx(s: ASN1S, idx: Idx<ASN1S>): Idx<ASN1V>;
public static getV(s: ASN1S, idx: Idx<ASN1S>): ASN1V;
public static getTLV(s: ASN1S, idx: Idx<ASN1S>): ASN1TLV;
public static getNextSiblingIdx(s: ASN1S, idx: Idx<ASN1S>): Idx<ASN1ObjectString>;
public static getChildIdx(h: ASN1S, pos: Idx<ASN1S>): Idx<ASN1ObjectString>[];
public static getNthChildIdx(h: ASN1S, idx: Idx<ASN1S>, nth: Nth): Idx<ASN1ObjectString>;
public static getIdxbyList(h: ASN1S, currentIndex: Idx<ASN1ObjectString>, nthList: Mutable<Nth[]>, checkingTag?: string): Idx<Mutable<Nth[]>>;
public static getTLVbyList(h: ASN1S, currentIndex: Idx<ASN1ObjectString>, nthList: Mutable<Nth[]>, checkingTag?: string): ASN1TLV;
public static getVbyList(h: ASN1S, currentIndex: Idx<ASN1ObjectString>, nthList: Mutable<Nth[]>, checkingTag?: string, removeUnusedbits?: boolean): ASN1V;
public static hextooidstr(hex: ASN1OIDV): OID;
public static dump(hexOrObj: ASN1S | ASN1Object, flags?: Record<string, unknown>, idx?: Idx<ASN1S>, indent?: string): string;
public static isASN1HEX(hex: string): hex is HexString;
public static oidname(oidDotOrHex: OID | ASN1OIDV): OIDName;
}
//// BIG INTEGER TYPES (PARTIAL)
class BigInteger {
constructor(a: null);
constructor(a: number, b: SecureRandom);
constructor(a: number, b: number, c: SecureRandom);
constructor(a: unknown);
constructor(a: string, b: number);
public am(i: number, x: number, w: number, j: number, c: number, n: number): number;
public DB: number;
public DM: number;
public DV: number;
public FV: number;
public F1: number;
public F2: number;
protected copyTo(r: Mutable<BigInteger>): void;
protected fromInt(x: number): void;
protected fromString(s: string, b: number): void;
protected clamp(): void;
public toString(b: number): string;
public negate(): BigInteger;
public abs(): BigInteger;
public compareTo(a: BigInteger): number;
public bitLength(): number;
protected dlShiftTo(n: number, r: Mutable<BigInteger>): void;
protected drShiftTo(n: number, r: Mutable<BigInteger>): void;
protected lShiftTo(n: number, r: Mutable<BigInteger>): void;
protected rShiftTo(n: number, r: Mutable<BigInteger>): void;
protected subTo(a: BigInteger, r: Mutable<BigInteger>): void;
protected multiplyTo(a: BigInteger, r: Mutable<BigInteger>): void;
protected squareTo(r: Mutable<BigInteger>): void;
protected divRemTo(m: BigInteger, q: Mutable<BigInteger>, r: Mutable<BigInteger>): void;
public mod(a: BigInteger): BigInteger;
protected invDigit(): number;
protected isEven(): boolean;
protected exp(e: number, z: Classic | Montgomery): BigInteger;
public modPowInt(e: number, m: BigInteger): BigInteger;
public static ZERO: BigInteger;
public static ONE: BigInteger;
}
class Classic {
constructor(m: BigInteger);
public convert(x: BigInteger): BigInteger;
public revert(x: BigInteger): BigInteger;
public reduce(x: Mutable<BigInteger>): void;
public mulTo(x: BigInteger, r: Mutable<BigInteger>): void;
public sqrTo(x: BigInteger, y: BigInteger, r: Mutable<BigInteger>): void;
}
class Montgomery {
constructor(m: BigInteger);
public convert(x: BigInteger): BigInteger;
public revert(x: BigInteger): BigInteger;
public reduce(x: Mutable<BigInteger>): void;
public mulTo(x: BigInteger, r: Mutable<BigInteger>): void;
public sqrTo(x: BigInteger, y: BigInteger, r: Mutable<BigInteger>): void;
}
//// KEYUTIL TYPES
type DecryptAES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
type Decrypt3DES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
type DecryptDES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
type EncryptAES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
type Encrypt3DES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
type EncryptDES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
type AlgList = {
'AES-256-CBC': { 'proc': DecryptAES; 'eproc': EncryptAES; keylen: 32; ivlen: 16; };
'AES-192-CBC': { 'proc': DecryptAES; 'eproc': EncryptAES; keylen: 24; ivlen: 16; };
'AES-128-CBC': { 'proc': DecryptAES; 'eproc': EncryptAES; keylen: 16; ivlen: 16; };
'DES-EDE3-CBC': { 'proc': Decrypt3DES; 'eproc': Encrypt3DES; keylen: 24; ivlen: 8; };
'DES-CBC': { 'proc': DecryptDES; 'eproc': EncryptDES; keylen: 8; ivlen: 8; };
};
type AlgName = keyof AlgList;
type PEMHeadAlgName = 'RSA' | 'EC' | 'DSA';
type GetKeyRSAParam = RSAKey | {
n: BigInteger;
e: number;
} | Record<'n' | 'e', HexString> | Record<'n' | 'e', HexString> & Record<'d' | 'p' | 'q' | 'dp' | 'dq' | 'co', HexString | null> | {
n: BigInteger;
e: number;
d: BigInteger;
} | {
kty: 'RSA';
} & Record<'n' | 'e', Base64URLString> | {
kty: 'RSA';
} & Record<'n' | 'e' | 'd' | 'p' | 'q' | 'dp' | 'dq' | 'qi', Base64URLString> | {
kty: 'RSA';
} & Record<'n' | 'e' | 'd', Base64URLString>;
type GetKeyECDSAParam = KJUR.crypto.ECDSA | {
curve: KJUR.crypto.CurveName;
xy: HexString;
} | {
curve: KJUR.crypto.CurveName;
d: HexString;
} | {
kty: 'EC';
crv: KJUR.crypto.CurveName;
x: Base64URLString;
y: Base64URLString;
} | {
kty: 'EC';
crv: KJUR.crypto.CurveName;
x: Base64URLString;
y: Base64URLString;
d: Base64URLString;
};
type GetKeyDSAParam = KJUR.crypto.DSA | Record<'p' | 'q' | 'g', BigInteger> & Record<'y', BigInteger | null> | Record<'p' | 'q' | 'g' | 'x', BigInteger> & Record<'y', BigInteger | null>;
type GetKeyParam = GetKeyRSAParam | GetKeyECDSAParam | GetKeyDSAParam | string;
class KEYUTIL {
public version: '1.0.0';
public parsePKCS5PEM(sPKCS5PEM: PEM): Partial<Record<'type' | 's', string>> & (Record<'cipher' | 'ivsalt', string> | Record<'cipher' | 'ivsalt', undefined>);
public getKeyAndUnusedIvByPasscodeAndIvsalt(algName: AlgName, passcode: string, ivsaltHex: HexString): Record<'keyhex' | 'ivhex', HexString>;
public decryptKeyB64(privateKeyB64: Base64String, sharedKeyAlgName: AlgName, sharedKeyHex: HexString, ivsaltHex: HexString): Base64String;
public getDecryptedKeyHex(sEncryptedPEM: PEM, passcode: string): HexString;
public getEncryptedPKCS5PEMFromPrvKeyHex(pemHeadAlg: PEMHeadAlgName, hPrvKey: string, passcode: string, sharedKeyAlgName?: AlgName | null, ivsaltHex?: HexString | null): PEM;
public parseHexOfEncryptedPKCS8(sHEX: HexString): {
ciphertext: ASN1V;
encryptionSchemeAlg: 'TripleDES';
encryptionSchemeIV: ASN1V;
pbkdf2Salt: ASN1V;
pbkdf2Iter: number;
};
public getPBKDF2KeyHexFromParam(info: ReturnType<this['parseHexOfEncryptedPKCS8']>, passcode: string): HexString;
private _getPlainPKCS8HexFromEncryptedPKCS8PEM(pkcs8PEM: PEM, passcode: string): HexString;
public getKeyFromEncryptedPKCS8PEM(prvKeyHex: HexString): ReturnType<this['getKeyFromPlainPrivatePKCS8Hex']>;
public parsePlainPrivatePKCS8Hex(pkcs8PrvHex: HexString): {
algparam: ASN1V | null;
algoid: ASN1V;
keyidx: Idx<ASN1V>;
};
public getKeyFromPlainPrivatePKCS8PEM(prvKeyHex: HexString): ReturnType<this['getKeyFromPlainPrivatePKCS8Hex']>;
public getKeyFromPlainPrivatePKCS8Hex(prvKeyHex: HexString): RSAKey | KJUR.crypto.DSA | KJUR.crypto.ECDSA;
private _getKeyFromPublicPKCS8Hex(h: HexString): RSAKey | KJUR.crypto.DSA | KJUR.crypto.ECDSA;
public parsePublicRawRSAKeyHex(pubRawRSAHex: HexString): Record<'n' | 'e', ASN1V>;
public parsePublicPKCS8Hex(pkcs8PubHex: HexString): {
algparam: ASN1V | Record<'p' | 'q' | 'g', ASN1V> | null;
algoid: ASN1V;
key: ASN1V;
};
public static getKey(param: GetKeyRSAParam): RSAKey;
public static getKey(param: GetKeyECDSAParam): KJUR.crypto.ECDSA;
public static getKey(param: GetKeyDSAParam): KJUR.crypto.DSA;
public static getKey(param: string, passcode?: string, hextype?: string): RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA;
public static generateKeypair(alg: 'RSA', keylen: number): Record<'prvKeyObj' | 'pubKeyObj', RSAKey>;
public static generateKeypair(alg: 'EC', curve: KJUR.crypto.CurveName): Record<'prvKeyObj' | 'pubKeyObj', KJUR.crypto.ECDSA>;
public static getPEM(keyObjOrHex: RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA, formatType?: 'PKCS1PRV' | 'PKCS5PRV' | 'PKCS8PRV', passwd?: string, encAlg?: 'DES-CBC' | 'DES-EDE3-CBC' | 'AES-128-CBC' | 'AES-192-CBC' | 'AES-256-CBC', hexType?: string, ivsaltHex?: HexString): object; // To Do
public static getKeyFromCSRPEM(csrPEM: PEM): RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA;
public static getKeyFromCSRHex(csrHex: HexString): RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA;
public static parseCSRHex(csrHex: HexString): Record<'p8pubkeyhex', ASN1TLV>;
public static getJWKFromKey(keyObj: RSAKey): {
kty: 'RSA';
} & Record<'n' | 'e' | 'd' | 'p' | 'q' | 'dp' | 'dq' | 'qi', Base64URLString> | {
kty: 'RSA';
} & Record<'n' | 'e', Base64URLString>;
public static getJWKFromKey(keyObj: KJUR.crypto.ECDSA): {
kty: 'EC';
crv: KJUR.crypto.CurveName;
x: Base64URLString;
y: Base64URLString;
d: Base64URLString;
} | {
kty: 'EC';
crv: KJUR.crypto.CurveName;
x: Base64URLString;
y: Base64URLString;
};
}
//// KJUR NAMESPACE (PARTIAL)
namespace KJUR {
namespace crypto {
type CurveName = 'secp128r1' | 'secp160k1' | 'secp160r1' | 'secp192k1' | 'secp192r1' | 'secp224r1' | 'secp256k1' | 'secp256r1' | 'secp384r1' | 'secp521r1';
class DSA {
public p: BigInteger | null;
public q: BigInteger | null;
public g: BigInteger | null;
public y: BigInteger | null;
public x: BigInteger | null;
public type: 'DSA';
public isPrivate: boolean;
public isPublic: boolean;
public setPrivate(p: BigInteger, q: BigInteger, g: BigInteger, y: BigInteger | null, x: BigInteger): void;
public setPrivateHex(hP: HexString, hQ: HexString, hG: HexString, hY: HexString | null, hX: HexString): void;
public setPublic(p: BigInteger, q: BigInteger, g: BigInteger, y: BigInteger): void;
public setPublicHex(hP: HexString, hQ: HexString, hG: HexString, hY: HexString): void;
public signWithMessageHash(sHashHex: HexString): HexString;
public verifyWithMessageHash(sHashHex: HexString, hSigVal: HexString): boolean;
public parseASN1Signature(hSigVal: HexString): [BigInteger, BigInteger];
public readPKCS5PrvKeyHex(h: HexString): void;
public readPKCS8PrvKeyHex(h: HexString): void;
public readPKCS8PubKeyHex(h: HexString): void;
public readCertPubKeyHex(h: HexString, nthPKI: number): void;
}
class ECDSA {
constructor(params?: {
curve?: CurveName;
prv?: HexString;
pub?: HexString;
});
public p: BigInteger | null;
public q: BigInteger | null;
public g: BigInteger | null;
public y: BigInteger | null;
public x: BigInteger | null;
public type: 'EC';
public isPrivate: boolean;
public isPublic: boolean;
public getBigRandom(limit: BigInteger): BigInteger;
public setNamedCurve(curveName: CurveName): void;
public setPrivateKeyHex(prvKeyHex: HexString): void;
public setPublicKeyHex(pubKeyHex: HexString): void;
public getPublicKeyXYHex(): Record<'x' | 'y', HexString>;
public getShortNISTPCurveName(): 'P-256' | 'P-384' | null;
public generateKeyPairHex(): Record<'ecprvhex' | 'ecpubhex', HexString>;
public signWithMessageHash(hashHex: HexString): HexString;
public signHex(hashHex: HexString, privHex: HexString): HexString;
public verifyWithMessageHash(sHashHex: HexString, hSigVal: HexString): boolean;
public parseASN1Signature(hSigVal: HexString): [BigInteger, BigInteger];
public readPKCS5PrvKeyHex(h: HexString): void;
public readPKCS8PrvKeyHex(h: HexString): void;
public readPKCS8PubKeyHex(h: HexString): void;
public readCertPubKeyHex(h: HexString, nthPKI: number): void;
public static parseSigHex(sigHex: HexString): Record<'r' | 's', BigInteger>;
public static parseSigHexInHexRS(sigHex: HexString): Record<'r' | 's', ASN1V>;
public static asn1SigToConcatSig(asn1Sig: HexString): HexString;
public static concatSigToASN1Sig(concatSig: HexString): ASN1TLV;
public static hexRSSigToASN1Sig(hR: HexString, hS: HexString): ASN1TLV;
public static biRSSigToASN1Sig(biR: BigInteger, biS: BigInteger): ASN1TLV;
public static getName(s: CurveName | HexString): 'secp256r1' | 'secp256k1' | 'secp384r1' | null;
}
class Signature {
constructor(params?: ({
alg: string;
prov?: string;
} | {}) & ({
psssaltlen: number;
} | {}) & ({
prvkeypem: PEM;
prvkeypas?: never;
} | {}));
private _setAlgNames(): void;
private _zeroPaddingOfSignature(hex: HexString, bitLength: number): HexString;
public setAlgAndProvider(alg: string, prov: string): void;
public init(key: GetKeyParam, pass?: string): void;
public updateString(str: string): void;
public updateHex(hex: HexString): void;
public sign(): HexString;
public signString(str: string): HexString;
public signHex(hex: HexString): HexString;
public verify(hSigVal: string): boolean | 0;
}
}
}
//// RSAKEY TYPES
class RSAKey {
public n: BigInteger | null;
public e: number;
public d: BigInteger | null;
public p: BigInteger | null;
public q: BigInteger | null;
public dmp1: BigInteger | null;
public dmq1: BigInteger | null;
public coeff: BigInteger | null;
public type: 'RSA';
public isPrivate?: boolean;
public isPublic?: boolean;
//// RSA PUBLIC
protected doPublic(x: BigInteger): BigInteger;
public setPublic(N: BigInteger, E: number): void;
public setPublic(N: HexString, E: HexString): void;
public encrypt(text: string): HexString | null;
public encryptOAEP(text: string, hash?: string, hashLen?: number): HexString | null;
public encryptOAEP(text: string, hash?: (s: string) => string, hashLen?: number): HexString | null;
//// RSA PRIVATE
protected doPrivate(x: BigInteger): BigInteger;
public setPrivate(N: BigInteger, E: number, D: BigInteger): void;
public setPrivate(N: HexString, E: HexString, D: HexString): void;
public setPrivateEx(N: HexString, E: HexString, D?: HexString | null, P?: HexString | null, Q?: HexString | null, DP?: HexString | null, DQ?: HexString | null, C?: HexString | null): void;
public generate(B: number, E: HexString): void;
public decrypt(ctext: HexString): string;
public decryptOAEP(ctext: HexString, hash?: string, hashLen?: number): string | null;
public encryptOAEP(ctext: HexString, hash?: (s: string) => string, hashLen?: number): string | null;
//// RSA PEM
public getPosArrayOfChildrenFromHex(hPrivateKey: PEM): Idx<ASN1ObjectString>[];
public getHexValueArrayOfChildrenFromHex(hPrivateKey: PEM): Idx<ASN1ObjectString>[];
public readPrivateKeyFromPEMString(keyPEM: PEM): void;
public readPKCS5PrvKeyHex(h: HexString): void;
public readPKCS8PrvKeyHex(h: HexString): void;
public readPKCS5PubKeyHex(h: HexString): void;
public readPKCS8PubKeyHex(h: HexString): void;
public readCertPubKeyHex(h: HexString, nthPKI: Nth): void;
//// RSA SIGN
public sign(s: string, hashAlg: string): HexString;
public signWithMessageHash(sHashHex: HexString, hashAlg: string): HexString;
public signPSS(s: string, hashAlg: string, sLen: number): HexString;
public signWithMessageHashPSS(hHash: HexString, hashAlg: string, sLen: number): HexString;
public verify(sMsg: string, hSig: HexString): boolean | 0;
public verifyWithMessageHash(sHashHex: HexString, hSig: HexString): boolean | 0;
public verifyPSS(sMsg: string, hSig: HexString, hashAlg: string, sLen: number): boolean;
public verifyWithMessageHashPSS(hHash: HexString, hSig: HexString, hashAlg: string, sLen: number): boolean;
public static SALT_LEN_HLEN: -1;
public static SALT_LEN_MAX: -2;
public static SALT_LEN_RECOVER: -2;
}
/// RNG TYPES
class SecureRandom {
public nextBytes(ba: Mutable<ByteNumber[]>): void;
}
//// X509 TYPES
type ExtInfo = {
critical: boolean;
oid: OID;
vidx: Idx<ASN1V>;
};
type ExtAIAInfo = Record<'ocsp' | 'caissuer', string>;
type ExtCertificatePolicy = {
id: OIDName;
} & Partial<{
cps: string;
} | {
unotice: string;
}>;
class X509 {
public hex: HexString | null;
public version: number;
public foffset: number;
public aExtInfo: null;
public getVersion(): number;
public getSerialNumberHex(): ASN1V;
public getSignatureAlgorithmField(): OIDName;
public getIssuerHex(): ASN1TLV;
public getIssuerString(): HexString;
public getSubjectHex(): ASN1TLV;
public getSubjectString(): HexString;
public getNotBefore(): TimeValue;
public getNotAfter(): TimeValue;
public getPublicKeyHex(): ASN1TLV;
public getPublicKeyIdx(): Idx<Mutable<Nth[]>>;
public getPublicKeyContentIdx(): Idx<Mutable<Nth[]>>;
public getPublicKey(): RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA;
public getSignatureAlgorithmName(): OIDName;
public getSignatureValueHex(): ASN1V;
public verifySignature(pubKey: GetKeyParam): boolean | 0;
public parseExt(): void;
public getExtInfo(oidOrName: OID | string): ExtInfo | undefined;
public getExtBasicConstraints(): ExtInfo | {} | {
cA: true;
pathLen?: number;
};
public getExtKeyUsageBin(): BinString;
public getExtKeyUsageString(): string;
public getExtSubjectKeyIdentifier(): ASN1V | undefined;
public getExtAuthorityKeyIdentifier(): {
kid: ASN1V;
} | undefined;
public getExtExtKeyUsageName(): OIDName[] | undefined;
public getExtSubjectAltName(): Deprecated<string[]>;
public getExtSubjectAltName2(): ['MAIL' | 'DNS' | 'DN' | 'URI' | 'IP', string][] | undefined;
public getExtCRLDistributionPointsURI(): string[] | undefined;
public getExtAIAInfo(): ExtAIAInfo | undefined;
public getExtCertificatePolicies(): ExtCertificatePolicy[] | undefined;
public readCertPEM(sCertPEM: PEM): void;
public readCertHex(sCertHex: HexString): void;
public getInfo(): string;
public static hex2dn(hex: HexString, idx?: Idx<HexString>): string;
public static hex2rdn(hex: HexString, idx?: Idx<HexString>): string;
public static hex2attrTypeValue(hex: HexString, idx?: Idx<HexString>): string;
public static getPublicKeyFromCertPEM(sCertPEM: PEM): RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA;
public static getPublicKeyInfoPropOfCertPEM(sCertPEM: PEM): {
algparam: ASN1V | null;
leyhex: ASN1V;
algoid: ASN1V;
};
}
}

View File

@ -1,17 +1,9 @@
declare module 'lookup-dns-cache' {
type IPv4 = 4;
import { LookupOneOptions, LookupAllOptions, LookupOptions, LookupAddress } from 'dns';
type IPv6 = 6;
type Family = IPv4 | IPv6 | undefined;
interface IRunOptions {
family?: Family;
all?: boolean;
}
type RunCallback = (error: Error | null, address?: string | string[], family?: Family) => void;
export function lookup(hostname: string, options: IRunOptions | Family, callback: RunCallback): {} | undefined;
export function lookup(hostname: string, callback: RunCallback): {} | undefined;
function lookup(hostname: string, family: number, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void;
function lookup(hostname: string, options: LookupOneOptions, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void;
function lookup(hostname: string, options: LookupAllOptions, callback: (err: NodeJS.ErrnoException | null, addresses: LookupAddress[]) => void): void;
function lookup(hostname: string, options: LookupOptions, callback: (err: NodeJS.ErrnoException | null, address: string | LookupAddress[], family: number) => void): void;
function lookup(hostname: string, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void;
}

View File

@ -1,7 +0,0 @@
declare module 'promise-any' {
function promiseAny<T>(iterable: Iterable<T | PromiseLike<T>>): Promise<T>;
namespace promiseAny {} // Hack
export = promiseAny;
}

View File

@ -1,8 +1,8 @@
import * as program from 'commander';
import * as pkg from '../package.json';
import config from './config';
program
.version(pkg.version)
.version(config.version)
.option('--no-daemons', 'Disable daemon processes (for debbuging)')
.option('--disable-clustering', 'Disable clustering')
.option('--only-server', 'Run server only (without job queue processing)')

View File

@ -1,5 +1,5 @@
import * as cluster from 'cluster';
import chalk from 'chalk';
import * as chalk from 'chalk';
import Xev from 'xev';
import Logger from '../services/logger';

View File

@ -1,6 +1,6 @@
import * as os from 'os';
import * as cluster from 'cluster';
import chalk from 'chalk';
import * as chalk from 'chalk';
import * as portscanner from 'portscanner';
import * as isRoot from 'is-root';
@ -8,10 +8,10 @@ import Logger from '../services/logger';
import loadConfig from '../config/load';
import { Config } from '../config/types';
import { lessThan } from '../prelude/array';
import * as pkg from '../../package.json';
import { program } from '../argv';
import { showMachineInfo } from '../misc/show-machine-info';
import { initDb } from '../db/postgre';
import * as meta from '../meta.json';
const logger = new Logger('core', 'cyan');
const bootLogger = logger.createSubLogger('boot', 'magenta', false);
@ -19,7 +19,7 @@ const bootLogger = logger.createSubLogger('boot', 'magenta', false);
function greet() {
if (!program.quiet) {
//#region Misskey logo
const v = `v${pkg.version}`;
const v = `v${meta.version}`;
console.log(' _____ _ _ ');
console.log(' | |_|___ ___| |_ ___ _ _ ');
console.log(' | | | | |_ -|_ -| \'_| -_| | |');
@ -35,18 +35,18 @@ function greet() {
}
bootLogger.info('Welcome to Misskey!');
bootLogger.info(`Misskey v${pkg.version}`, null, true);
bootLogger.info(`Misskey v${meta.version}`, null, true);
}
/**
* Init master process
*/
export async function masterMain() {
greet();
let config!: Config;
try {
greet();
// initialize app
config = await init();
@ -79,6 +79,7 @@ export async function masterMain() {
require('../daemons/server-stats').default();
require('../daemons/notes-stats').default();
require('../daemons/queue-stats').default();
require('../daemons/janitor').default();
}
bootLogger.succ(`Now listening on port ${config.port} on ${config.url}`, null, true);
@ -158,7 +159,7 @@ async function init(): Promise<Config> {
return config;
}
async function spawnWorkers(limit: number = Infinity) {
async function spawnWorkers(limit: number = 1) {
const workers = Math.min(limit, os.cpus().length);
bootLogger.info(`Starting ${workers} worker${workers === 1 ? '' : 's'}...`);
await Promise.all([...Array(workers)].map(spawnWorker));

View File

@ -19,7 +19,8 @@ init(launch => {
mode: 'history',
base: '/admin/',
routes: [
{ path: '/', component: Index },
{ path: '/:page', component: Index },
{ path: '/', redirect: '/dashboard' },
{ path: '*', component: NotFound }
]
});

View File

@ -115,7 +115,6 @@ export default Vue.extend({
connection: null,
meta: null,
instances: [],
clock: null,
faDatabase
};
},
@ -124,7 +123,6 @@ export default Vue.extend({
this.connection = this.$root.stream.useSharedConnection('serverStats');
this.updateStats();
this.clock = setInterval(this.updateStats, 1000);
this.$root.getMeta().then(meta => {
this.meta = meta;
@ -145,7 +143,6 @@ export default Vue.extend({
beforeDestroy() {
this.connection.dispose();
clearInterval(this.clock);
},
methods: {

View File

@ -0,0 +1,61 @@
<template>
<div>
<ui-card>
<template #title><fa :icon="faDatabase"/> {{ $t('tables') }}</template>
<section v-if="tables">
<div v-for="table in Object.keys(tables)"><b>{{ table }}</b> {{ tables[table].count | number }} {{ tables[table].size | bytes }}</div>
</section>
<section>
<header><fa :icon="faBroom"/> {{ $t('vacuum') }}</header>
<ui-info>{{ $t('vacuum-info') }}</ui-info>
<ui-switch v-model="fullVacuum">FULL</ui-switch>
<ui-switch v-model="analyzeVacuum">ANALYZE</ui-switch>
<ui-button @click="vacuum()"><fa :icon="faBroom"/> {{ $t('vacuum') }}</ui-button>
<ui-info warn>{{ $t('vacuum-exclamation') }}</ui-info>
</section>
</ui-card>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../i18n';
import { faDatabase, faBroom } from '@fortawesome/free-solid-svg-icons';
export default Vue.extend({
i18n: i18n('admin/views/db.vue'),
data() {
return {
tables: null,
fullVacuum: true,
analyzeVacuum: true,
faDatabase, faBroom
};
},
mounted() {
this.fetch();
},
methods: {
fetch() {
this.$root.api('admin/get-table-stats').then(tables => {
this.tables = tables;
});
},
vacuum() {
this.$root.api('admin/vacuum', {
full: this.fullVacuum,
analyze: this.analyzeVacuum,
}).then(() => {
this.$root.dialog({
type: 'success',
splash: true
});
});
},
}
});
</script>

View File

@ -8,6 +8,9 @@
<span>{{ $t('add-emoji.name') }}</span>
<template #desc>{{ $t('add-emoji.name-desc') }}</template>
</ui-input>
<ui-input v-model="category" :datalist="categoryList">
<span>{{ $t('add-emoji.category') }}</span>
</ui-input>
<ui-input v-model="aliases">
<span>{{ $t('add-emoji.aliases') }}</span>
<template #desc>{{ $t('add-emoji.aliases-desc') }}</template>
@ -24,7 +27,7 @@
<ui-card>
<template #title><fa :icon="faGrin"/> {{ $t('emojis.title') }}</template>
<section v-for="emoji in emojis" class="oryfrbft">
<section v-for="emoji in emojis" :key="emoji.name" class="oryfrbft">
<div>
<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/>
</div>
@ -33,6 +36,9 @@
<ui-input v-model="emoji.name">
<span>{{ $t('add-emoji.name') }}</span>
</ui-input>
<ui-input v-model="emoji.category" :datalist="categoryList">
<span>{{ $t('add-emoji.category') }}</span>
</ui-input>
<ui-input v-model="emoji.aliases">
<span>{{ $t('add-emoji.aliases') }}</span>
</ui-input>
@ -55,12 +61,14 @@
import Vue from 'vue';
import i18n from '../../i18n';
import { faGrin } from '@fortawesome/free-regular-svg-icons';
import { unique } from '../../../../prelude/array';
export default Vue.extend({
i18n: i18n('admin/views/emoji.vue'),
data() {
return {
name: '',
category: '',
url: '',
aliases: '',
emojis: [],
@ -72,10 +80,17 @@ export default Vue.extend({
this.fetchEmojis();
},
computed: {
categoryList() {
return unique(this.emojis.map((x: any) => x.category || '').filter((x: string) => x !== ''));
}
},
methods: {
add() {
this.$root.api('admin/emoji/add', {
name: this.name,
category: this.category,
url: this.url,
aliases: this.aliases.split(' ').filter(x => x.length > 0)
}).then(() => {
@ -94,7 +109,6 @@ export default Vue.extend({
fetchEmojis() {
this.$root.api('admin/emoji/list').then(emojis => {
emojis.reverse();
for (const e of emojis) {
e.aliases = (e.aliases || []).join(' ');
}
@ -106,6 +120,7 @@ export default Vue.extend({
this.$root.api('admin/emoji/update', {
id: emoji.id,
name: emoji.name,
category: emoji.category,
url: emoji.url,
aliases: emoji.aliases.split(' ').filter(x => x.length > 0)
}).then(() => {

View File

@ -509,7 +509,7 @@ export default Vue.extend({
saveBlockedHosts() {
this.$root.api('admin/update-meta', {
blockedHosts: this.blockedHosts.split('\n')
blockedHosts: this.blockedHosts ? this.blockedHosts.split('\n') : []
}).then(() => {
this.$root.dialog({
type: 'success',

View File

@ -18,17 +18,18 @@
<p class="name"><mk-user-name :user="$store.state.i"/></p>
</div>
<ul>
<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }"><fa icon="home" fixed-width/>{{ $t('dashboard') }}</li>
<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>{{ $t('instance') }}</li>
<li @click="nav('queue')" :class="{ active: page == 'queue' }"><fa :icon="faTasks" fixed-width/>{{ $t('queue') }}</li>
<li @click="nav('logs')" :class="{ active: page == 'logs' }"><fa :icon="faStream" fixed-width/>{{ $t('logs') }}</li>
<li @click="nav('moderators')" :class="{ active: page == 'moderators' }"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</li>
<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>{{ $t('users') }}</li>
<li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</li>
<li @click="nav('federation')" :class="{ active: page == 'federation' }"><fa :icon="faGlobe" fixed-width/>{{ $t('federation') }}</li>
<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="faGrin" fixed-width/>{{ $t('emoji') }}</li>
<li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>{{ $t('announcements') }}</li>
<li @click="nav('abuse')" :class="{ active: page == 'abuse' }"><fa :icon="faExclamationCircle" fixed-width/>{{ $t('abuse') }}</li>
<li><router-link to="/dashboard" active-class="active"><fa icon="home" fixed-width/>{{ $t('dashboard') }}</router-link></li>
<li><router-link to="/instance" active-class="active"><fa icon="cog" fixed-width/>{{ $t('instance') }}</router-link></li>
<li><router-link to="/queue" active-class="active"><fa :icon="faTasks" fixed-width/>{{ $t('queue') }}</router-link></li>
<li><router-link to="/logs" active-class="active"><fa :icon="faStream" fixed-width/>{{ $t('logs') }}</router-link></li>
<li><router-link to="/db" active-class="active"><fa :icon="faDatabase" fixed-width/>{{ $t('db') }}</router-link></li>
<li><router-link to="/moderators" active-class="active"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</router-link></li>
<li><router-link to="/users" active-class="active"><fa icon="users" fixed-width/>{{ $t('users') }}</router-link></li>
<li><router-link to="/drive" active-class="active"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</router-link></li>
<li><router-link to="/federation" active-class="active"><fa :icon="faGlobe" fixed-width/>{{ $t('federation') }}</router-link></li>
<li><router-link to="/emoji" active-class="active"><fa :icon="faGrin" fixed-width/>{{ $t('emoji') }}</router-link></li>
<li><router-link to="/announcements" active-class="active"><fa icon="broadcast-tower" fixed-width/>{{ $t('announcements') }}</router-link></li>
<li><router-link to="/abuse" active-class="active"><fa :icon="faExclamationCircle" fixed-width/>{{ $t('abuse') }}</router-link></li>
</ul>
<div class="back-to-misskey">
<a href="/"><fa :icon="faArrowLeft"/> {{ $t('back-to-misskey') }}</a>
@ -43,6 +44,7 @@
<div v-if="page == 'instance'"><x-instance/></div>
<div v-if="page == 'queue'"><x-queue/></div>
<div v-if="page == 'logs'"><x-logs/></div>
<div v-if="page == 'db'"><x-db/></div>
<div v-if="page == 'moderators'"><x-moderators/></div>
<div v-if="page == 'users'"><x-users/></div>
<div v-if="page == 'emoji'"><x-emoji/></div>
@ -59,19 +61,20 @@
import Vue from 'vue';
import i18n from '../../i18n';
import { version } from '../../config';
import XDashboard from "./dashboard.vue";
import XInstance from "./instance.vue";
import XQueue from "./queue.vue";
import XLogs from "./logs.vue";
import XModerators from "./moderators.vue";
import XEmoji from "./emoji.vue";
import XAnnouncements from "./announcements.vue";
import XUsers from "./users.vue";
import XDrive from "./drive.vue";
import XAbuse from "./abuse.vue";
import XFederation from "./federation.vue";
import XDashboard from './dashboard.vue';
import XInstance from './instance.vue';
import XQueue from './queue.vue';
import XLogs from './logs.vue';
import XDb from './db.vue';
import XModerators from './moderators.vue';
import XEmoji from './emoji.vue';
import XAnnouncements from './announcements.vue';
import XUsers from './users.vue';
import XDrive from './drive.vue';
import XAbuse from './abuse.vue';
import XFederation from './federation.vue';
import { faHeadset, faArrowLeft, faGlobe, faExclamationCircle, faTasks, faStream } from '@fortawesome/free-solid-svg-icons';
import { faHeadset, faArrowLeft, faGlobe, faExclamationCircle, faTasks, faStream, faDatabase } from '@fortawesome/free-solid-svg-icons';
import { faGrin } from '@fortawesome/free-regular-svg-icons';
// Detect the user agent
@ -85,6 +88,7 @@ export default Vue.extend({
XInstance,
XQueue,
XLogs,
XDb,
XModerators,
XEmoji,
XAnnouncements,
@ -98,7 +102,6 @@ export default Vue.extend({
},
data() {
return {
page: 'dashboard',
version,
isMobile,
navOpend: !isMobile,
@ -108,12 +111,13 @@ export default Vue.extend({
faGlobe,
faExclamationCircle,
faTasks,
faStream
faStream,
faDatabase,
};
},
methods: {
nav(page: string) {
this.page = page;
computed: {
page() {
return this.$route.params.page;
}
}
});
@ -235,11 +239,10 @@ export default Vue.extend({
list-style none
font-size 15px
> li
> li > a
display block
padding 10px 16px
margin 0
cursor pointer
user-select none
color #eee
transition margin-left 0.2s ease

View File

@ -81,6 +81,7 @@
</section>
<section>
<ui-switch v-model="cacheRemoteFiles">{{ $t('cache-remote-files') }}<template #desc>{{ $t('cache-remote-files-desc') }}</template></ui-switch>
<ui-switch v-model="proxyRemoteFiles">{{ $t('proxy-remote-files') }}<template #desc>{{ $t('proxy-remote-files-desc') }}</template></ui-switch>
</section>
<section class="fit-top fit-bottom">
<ui-input v-model="localDriveCapacityMb" type="number">{{ $t('local-drive-capacity-mb') }}<template #suffix>MB</template><template #desc>{{ $t('mb') }}</template></ui-input>
@ -129,6 +130,7 @@
<ui-input v-model="smtpPass" type="password" :with-password-toggle="true" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-pass') }}</ui-input>
</ui-horizon-group>
<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template #desc>{{ $t('smtp-secure-info') }}</template></ui-switch>
<ui-button @click="testEmail()">{{ $t('test-email') }}</ui-button>
</template>
</section>
<section>
@ -274,6 +276,7 @@ export default Vue.extend({
description: null,
languages: null,
cacheRemoteFiles: false,
proxyRemoteFiles: false,
localDriveCapacityMb: null,
remoteDriveCapacityMb: null,
maxNoteTextLength: null,
@ -338,6 +341,7 @@ export default Vue.extend({
this.description = meta.description;
this.languages = meta.langs.join(' ');
this.cacheRemoteFiles = meta.cacheRemoteFiles;
this.proxyRemoteFiles = meta.proxyRemoteFiles;
this.localDriveCapacityMb = meta.driveCapacityPerLocalUserMb;
this.remoteDriveCapacityMb = meta.driveCapacityPerRemoteUserMb;
this.maxNoteTextLength = meta.maxNoteTextLength;
@ -424,6 +428,24 @@ export default Vue.extend({
});
},
async testEmail() {
this.$root.api('admin/send-email', {
to: this.maintainerEmail,
subject: 'Test email',
text: 'Yo'
}).then(x => {
this.$root.dialog({
type: 'success',
splash: true
});
}).catch(e => {
this.$root.dialog({
type: 'error',
text: e
});
});
},
updateMeta() {
this.$root.api('admin/update-meta', {
maintainerName: this.maintainerName,
@ -442,8 +464,9 @@ export default Vue.extend({
iconUrl: this.iconUrl,
name: this.name,
description: this.description,
langs: this.languages.split(' '),
langs: this.languages ? this.languages.split(' ') : [],
cacheRemoteFiles: this.cacheRemoteFiles,
proxyRemoteFiles: this.proxyRemoteFiles,
localDriveCapacityMb: parseInt(this.localDriveCapacityMb, 10),
remoteDriveCapacityMb: parseInt(this.remoteDriveCapacityMb, 10),
maxNoteTextLength: parseInt(this.maxNoteTextLength, 10),
@ -471,8 +494,8 @@ export default Vue.extend({
enableServiceWorker: this.enableServiceWorker,
swPublicKey: this.swPublicKey,
swPrivateKey: this.swPrivateKey,
pinnedUsers: this.pinnedUsers.split('\n'),
hiddenTags: this.hiddenTags.split('\n'),
pinnedUsers: this.pinnedUsers ? this.pinnedUsers.split('\n') : [],
hiddenTags: this.hiddenTags ? this.hiddenTags.split('\n') : [],
useObjectStorage: this.useObjectStorage,
objectStorageBaseUrl: this.objectStorageBaseUrl ? this.objectStorageBaseUrl : null,
objectStorageBucket: this.objectStorageBucket ? this.objectStorageBucket : null,

View File

@ -12,6 +12,31 @@
</ui-horizon-group>
</section>
</ui-card>
<ui-card>
<template #title>{{ $t('logs.title') }}</template>
<section class="fit-top">
<sequential-entrance animation="entranceFromTop" delay="25">
<div v-for="log in logs" :key="log.id" class="">
<ui-horizon-group inputs>
<ui-input :value="log.user | acct" type="text" readonly>
<span>{{ $t('logs.moderator') }}</span>
</ui-input>
<ui-input :value="log.type" type="text" readonly>
<span>{{ $t('logs.type') }}</span>
</ui-input>
<ui-input :value="log.createdAt | date" type="text" readonly>
<span>{{ $t('logs.at') }}</span>
</ui-input>
</ui-horizon-group>
<ui-textarea :value="JSON.stringify(log.info, null, 4)" readonly>
<span>{{ $t('logs.info') }}</span>
</ui-textarea>
</div>
</sequential-entrance>
<ui-button v-if="existMoreLogs" @click="fetchLogs">{{ $t('@.load-more') }}</ui-button>
</section>
</ui-card>
</div>
</template>
@ -26,10 +51,17 @@ export default Vue.extend({
data() {
return {
username: '',
changing: false
changing: false,
logs: [],
untilLogId: null,
existMoreLogs: false
};
},
created() {
this.fetchLogs();
},
methods: {
async add() {
this.changing = true;
@ -74,6 +106,22 @@ export default Vue.extend({
this.changing = false;
},
fetchLogs() {
this.$root.api('admin/show-moderation-logs', {
untilId: this.untilId,
limit: 10 + 1
}).then(logs => {
if (logs.length == 10 + 1) {
logs.pop();
this.existMoreLogs = true;
} else {
this.existMoreLogs = false;
}
this.logs = this.logs.concat(logs);
this.untilLogId = this.logs[this.logs.length - 1].id;
});
},
}
});
</script>

View File

@ -48,14 +48,15 @@
</ui-select>
</ui-horizon-group>
<sequential-entrance animation="entranceFromTop" delay="25">
<div class="xvvuvgsv" v-for="job in jobs">
<div class="xvvuvgsv" v-for="job in jobs" :key="job.id">
<b>{{ job.id }}</b>
<template v-if="domain === 'deliver'">
<span>{{ job.data.to }}</span>
</template>
<template v-if="domain === 'inbox'">
<span>{{ job.activity.id }}</span>
<span>{{ job.data.activity.id }}</span>
</template>
<span>{{ `(${job.attempts}/${job.maxAttempts}, ${Math.floor((jobsFetched - job.timestamp) / 1000 / 60)}min)` }}</span>
</div>
</sequential-entrance>
<ui-info v-if="jobs.length == jobsLimit">{{ $t('result-is-truncated', { n: jobsLimit }) }}</ui-info>
@ -84,6 +85,7 @@ export default Vue.extend({
chartLimit: 200,
jobs: [],
jobsLimit: 50,
jobsFetched: Date.now(),
domain: 'deliver',
state: 'delayed',
faTasks, faPaperPlane, faInbox, faChartBar, faDatabase, faCloud
@ -140,6 +142,7 @@ export default Vue.extend({
state: this.state,
limit: this.jobsLimit
}).then(jobs => {
this.jobsFetched = Date.now(),
this.jobs = jobs;
});
},
@ -149,7 +152,8 @@ export default Vue.extend({
<style lang="stylus" scoped>
.xvvuvgsv
> b
margin-right 16px
margin-left -6px
> b, span
margin 0 6px
</style>

View File

@ -5,7 +5,7 @@
<mk-avatar class="avatar" :user="user" :disable-link="true"/>
</a>
</div>
<div>
<div @click="click(user.id)">
<header>
<b><mk-user-name :user="user"/></b>
<span class="username">@{{ user | acct }}</span>
@ -32,7 +32,7 @@ import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
export default Vue.extend({
i18n: i18n('admin/views/users.vue'),
props: ['user'],
props: ['user', 'click'],
data() {
return {
faSnowflake, faMicrophoneSlash
@ -44,7 +44,7 @@ export default Vue.extend({
<style lang="stylus" scoped>
.kofvwchc
display flex
padding 16px 0
padding 16px
border-top solid 1px var(--faceDivider)
> div:first-child
@ -55,6 +55,7 @@ export default Vue.extend({
> div:last-child
flex 1
cursor pointer
padding-left 16px
@media (max-width 500px)
@ -80,4 +81,15 @@ export default Vue.extend({
> .is-suspended
margin 0 0 0 .5em
color #4dabf7
&:hover
color var(--primaryForeground)
background var(--primary)
text-decoration none
border-radius 3px
&:active
color var(--primaryForeground)
background var(--primaryDarken10)
border-radius 3px
</style>

View File

@ -8,7 +8,7 @@
</ui-input>
<ui-button @click="showUser"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
<div class="user" v-if="user">
<div ref="user" class="user" v-if="user" :key="user.id">
<x-user :user="user"/>
<div class="actions">
<ui-button v-if="user.host != null" @click="updateRemoteUser"><fa :icon="faSync"/> {{ $t('update-remote-user') }}</ui-button>
@ -42,6 +42,7 @@
<ui-select v-model="state">
<template #label>{{ $t('users.state.title') }}</template>
<option value="all">{{ $t('users.state.all') }}</option>
<option value="available">{{ $t('users.state.available') }}</option>
<option value="admin">{{ $t('users.state.admin') }}</option>
<option value="moderator">{{ $t('users.state.moderator') }}</option>
<option value="silenced">{{ $t('users.state.silenced') }}</option>
@ -54,8 +55,16 @@
<option value="remote">{{ $t('users.origin.remote') }}</option>
</ui-select>
</ui-horizon-group>
<ui-horizon-group searchboxes>
<ui-input v-model="searchUsername" type="text" spellcheck="false" @input="fetchUsers(true)">
<span>{{ $t('username') }}</span>
</ui-input>
<ui-input v-model="searchHost" type="text" spellcheck="false" @input="fetchUsers(true)" :disabled="origin === 'local'">
<span>{{ $t('host') }}</span>
</ui-input>
</ui-horizon-group>
<sequential-entrance animation="entranceFromTop" delay="25">
<x-user v-for="user in users" :user='user' :key="user.id"/>
<x-user v-for="user in users" :key="user.id" :user='user' :click="showUserOnClick"/>
</sequential-entrance>
<ui-button v-if="existMore" @click="fetchUsers">{{ $t('@.load-more') }}</ui-button>
</section>
@ -85,6 +94,8 @@ export default Vue.extend({
sort: '+createdAt',
state: 'all',
origin: 'local',
searchUsername: '',
searchHost: '',
limit: 10,
offset: 0,
users: [],
@ -107,6 +118,7 @@ export default Vue.extend({
},
origin() {
if (this.origin === 'local') this.searchHost = '';
this.users = [];
this.offset = 0;
this.fetchUsers();
@ -157,6 +169,15 @@ export default Vue.extend({
this.target = '';
},
async showUserOnClick(userId: string) {
this.$root.api('admin/show-user', { userId: userId }).then(info => {
this.user = info;
this.$nextTick(() => {
this.$refs.user.scrollIntoView();
});
});
},
/** 処理対象ユーザーの情報を更新する */
async refreshUser() {
this.$root.api('admin/show-user', { userId: this.user.id }).then(info => {
@ -308,13 +329,16 @@ export default Vue.extend({
return !confirm.canceled;
},
fetchUsers() {
fetchUsers(truncate?: boolean) {
if (truncate) this.offset = 0;
this.$root.api('admin/show-users', {
state: this.state,
origin: this.origin,
sort: this.sort,
offset: this.offset,
limit: this.limit + 1
limit: this.limit + 1,
username: this.searchUsername,
hostname: this.searchHost
}).then(users => {
if (users.length == this.limit + 1) {
users.pop();
@ -322,7 +346,7 @@ export default Vue.extend({
} else {
this.existMore = false;
}
this.users = this.users.concat(users);
this.users = truncate ? users : this.users.concat(users);
this.offset += this.limit;
});
}

View File

@ -1,7 +1,7 @@
<template>
<div class="form">
<header>
<h1 v-html="$t('share-access', { name: app.name })"></h1>
<h1 v-html="$t('share-access', { name })"></h1>
<img :src="app.iconUrl"/>
</header>
<div class="app">
@ -34,6 +34,11 @@ export default Vue.extend({
i18n: i18n('auth/views/form.vue'),
props: ['session'],
computed: {
name(): string {
const el = document.createElement('div');
el.textContent = this.app.name
return el.innerHTML;
},
app(): any {
return this.session.app;
}

View File

@ -41,7 +41,6 @@
if (`${url.pathname}/`.startsWith('/dev/')) app = 'dev';
if (`${url.pathname}/`.startsWith('/auth/')) app = 'auth';
if (`${url.pathname}/`.startsWith('/admin/')) app = 'admin';
if (`${url.pathname}/`.startsWith('/test/')) app = 'test';
//#endregion
// Script version
@ -73,34 +72,39 @@
//#region Fetch locale data
const cachedLocale = localStorage.getItem('locale');
const localeKey = localStorage.getItem('localeKey');
let localeData = null;
if (cachedLocale == null || localeKey != `${ver}.${lang}`) {
const locale = await fetch(`/assets/locales/${lang}.json?ver=${ver}`)
.then(response => response.json());
localeData = locale;
localStorage.setItem('locale', JSON.stringify(locale));
localStorage.setItem('localeKey', `${ver}.${lang}`);
} else {
localeData = JSON.parse(cachedLocale);
}
//#endregion
// Detect the user agent
const ua = navigator.userAgent.toLowerCase();
const isMobile = /mobile|iphone|ipad|android/.test(ua);
let isMobile = /mobile|iphone|ipad|android/.test(ua) || window.innerWidth < 576;
if (settings && settings.device.appTypeForce) {
if (settings.device.appTypeForce === 'mobile') {
isMobile = true;
} else if (settings.device.appTypeForce === 'desktop') {
isMobile = false;
}
}
// Get the <head> element
const head = document.getElementsByTagName('head')[0];
// If mobile, insert the viewport meta tag
if (isMobile) {
const meta = document.createElement('meta');
meta.setAttribute('name', 'viewport');
meta.setAttribute('content',
'width=device-width,' +
'initial-scale=1,' +
'minimum-scale=1,' +
'maximum-scale=1,' +
'user-scalable=no');
head.appendChild(meta);
const viewport = document.getElementsByName("viewport").item(0);
viewport.content = `${viewport.content},minimum-scale=1,maximum-scale=1,user-scalable=no`;
head.appendChild(viewport);
}
// Switch desktop or mobile version
@ -112,9 +116,9 @@
// Note: 'async' make it possible to load the script asyncly.
// 'defer' make it possible to run the script when the dom loaded.
const script = document.createElement('script');
script.setAttribute('src', `/assets/${app}.${ver}.js`);
script.setAttribute('async', 'true');
script.setAttribute('defer', 'true');
script.src = `/assets/${app}.${ver}.js`;
script.async = true;
script.defer = true;
head.appendChild(script);
// 3秒経ってもスクリプトがロードされない場合はバージョンが古くて
@ -137,10 +141,10 @@
localStorage.setItem('v', meta.version);
alert(
'Misskeyの新しいバージョンがあります。ページを再度読み込みします。' +
'\n\n' +
'New version of Misskey available. The page will be reloaded.');
localeData.common._settings["update-available"] +
'\n' +
localeData.common._settings["update-available-desc"]
);
refresh();
}
}, 3000);

View File

@ -60,9 +60,9 @@ export default function <T extends object>(data: {
save() {
if (this.platform == 'deck') {
this.$store.commit('device/updateDeckColumn', this.column);
this.$store.commit('updateDeckColumn', this.column);
} else {
this.$store.commit('device/updateWidget', this.widget);
this.$store.commit('updateWidget', this.widget);
}
}
}

View File

@ -0,0 +1,5 @@
export function hexifyAB(buffer) {
return Array.from(new Uint8Array(buffer))
.map(item => item.toString(16).padStart(2, 0))
.join('');
}

View File

@ -32,6 +32,12 @@ export function collectPageVars(content) {
type: 'number',
value: 0
});
} else if (x.type === 'radioButton') {
pageVars.push({
name: x.name,
type: 'string',
value: x.default || ''
});
} else if (x.children) {
collect(x.children);
}

View File

@ -1,18 +0,0 @@
declare const fuckAdBlock: any;
export default ($root: any) => {
require('fuckadblock');
function adBlockDetected() {
$root.dialog({
title: $root.$t('@.adblock.detected'),
text: $root.$t('@.adblock.warning')
});
}
if (fuckAdBlock === undefined) {
adBlockDetected();
} else {
fuckAdBlock.onDetected(adBlockDetected);
}
};

View File

@ -4,7 +4,8 @@ const faces = [
'🐡( \'-\' 🐡 )フグパンチ!!!!',
'✌️(´・_・`)✌️',
'(。><。)',
'(Δ・x・Δ)'
'(Δ・x・Δ)',
'(コ`・ヘ・´ケ)'
];
export default () => faces[Math.floor(Math.random() * faces.length)];

View File

@ -3,6 +3,8 @@ import { sum, unique } from '../../../../prelude/array';
import shouldMuteNote from './should-mute-note';
import MkNoteMenu from '../views/components/note-menu.vue';
import MkReactionPicker from '../views/components/reaction-picker.vue';
import pleaseLogin from './please-login';
import i18n from '../../i18n';
function focus(el, fn) {
const target = fn(el);
@ -20,10 +22,13 @@ type Opts = {
};
export default (opts: Opts = {}) => ({
i18n: i18n(),
data() {
return {
showContent: false,
hideThisNote: false
hideThisNote: false,
openingMenu: false
};
},
@ -38,7 +43,7 @@ export default (opts: Opts = {}) => ({
'ctrl+q': this.renoteDirectly,
'up|k|shift+tab': this.focusBefore,
'down|j|tab': this.focusAfter,
'esc': this.blur,
//'esc': this.blur,
'm|o': () => this.menu(true),
's': this.toggleShowContent,
'1': () => this.reactDirectly('like'),
@ -83,9 +88,19 @@ export default (opts: Opts = {}) => ({
if (this.appearNote.text) {
const ast = parse(this.appearNote.text);
// TODO: 再帰的にURL要素がないか調べる
return unique(ast
const urls = unique(ast
.filter(t => ((t.node.type == 'url' || t.node.type == 'link') && t.node.props.url && !t.node.props.silent))
.map(t => t.node.props.url));
// unique without hash
// [ http://a/#1, http://a/#2, http://b/#3 ] => [ http://a/#1, http://b/#3 ]
const removeHash = x => x.replace(/#[^#]*$/, '');
return urls.reduce((array, url) => {
const removed = removeHash(url);
if (!array.map(x => removeHash(x)).includes(removed)) array.push(url);
return array;
}, []);
} else {
return null;
}
@ -98,6 +113,7 @@ export default (opts: Opts = {}) => ({
methods: {
reply(viaKeyboard = false) {
pleaseLogin(this.$root);
this.$root.$post({
reply: this.appearNote,
animation: !viaKeyboard,
@ -108,6 +124,7 @@ export default (opts: Opts = {}) => ({
},
renote(viaKeyboard = false) {
pleaseLogin(this.$root);
this.$root.$post({
renote: this.appearNote,
animation: !viaKeyboard,
@ -124,13 +141,22 @@ export default (opts: Opts = {}) => ({
},
react(viaKeyboard = false) {
pleaseLogin(this.$root);
this.blur();
this.$root.new(MkReactionPicker, {
const w = this.$root.new(MkReactionPicker, {
source: this.$refs.reactButton,
note: this.appearNote,
showFocus: viaKeyboard,
animation: !viaKeyboard
}).$once('closed', this.focus);
});
w.$once('chosen', reaction => {
this.$root.api('notes/reactions/create', {
noteId: this.appearNote.id,
reaction: reaction
}).then(() => {
w.close();
});
});
w.$once('closed', this.focus);
},
reactDirectly(reaction) {
@ -149,6 +175,7 @@ export default (opts: Opts = {}) => ({
},
favorite() {
pleaseLogin(this.$root);
this.$root.api('notes/favorites/create', {
noteId: this.appearNote.id
}).then(() => {
@ -160,17 +187,33 @@ export default (opts: Opts = {}) => ({
},
del() {
this.$root.api('notes/delete', {
noteId: this.appearNote.id
this.$root.dialog({
type: 'warning',
text: this.$t('@.delete-confirm'),
showCancelButton: true
}).then(({ canceled }) => {
if (canceled) return;
this.$root.api('notes/delete', {
noteId: this.appearNote.id
});
});
},
menu(viaKeyboard = false) {
this.$root.new(MkNoteMenu, {
if (this.openingMenu) return;
this.openingMenu = true;
const w = this.$root.new(MkNoteMenu, {
source: this.$refs.menuButton,
note: this.appearNote,
animation: !viaKeyboard
}).$once('closed', this.focus);
}).$once('closed', () => {
this.openingMenu = false;
this.focus();
});
this.$once('hook:beforeDestroy', () => {
w.destroyDom();
});
},
toggleShowContent() {

View File

@ -5,6 +5,7 @@ export default (opts) => ({
return {
items: [],
queue: [],
offset: 0,
fetching: true,
moreFetching: false,
inited: false,
@ -43,13 +44,21 @@ export default (opts) => ({
return window.scrollY <= 8;
};
window.addEventListener('scroll', this.onWindowScroll, { passive: true });
window.addEventListener('scroll', this.onScroll, { passive: true });
} else if (opts.isContainer) {
this.isScrollTop = () => {
return this.$el.scrollTop <= 8;
};
this.$el.addEventListener('scroll', this.onScroll, { passive: true });
}
},
beforeDestroy() {
if (opts.captureWindowScroll) {
window.removeEventListener('scroll', this.onWindowScroll);
window.removeEventListener('scroll', this.onScroll);
} else if (opts.isContainer) {
this.$el.removeEventListener('scroll', this.onScroll);
}
},
@ -66,6 +75,7 @@ export default (opts) => ({
async init() {
this.fetching = true;
if (opts.beforeInit) opts.beforeInit(this);
let params = typeof this.pagination.params === 'function' ? this.pagination.params(true) : this.pagination.params;
if (params && params.then) params = await params;
await this.$root.api(this.pagination.endpoint, {
@ -80,6 +90,7 @@ export default (opts) => ({
this.items = x;
this.more = false;
}
this.offset = x.length;
this.inited = true;
this.fetching = false;
if (opts.onInited) opts.onInited(this);
@ -96,7 +107,11 @@ export default (opts) => ({
if (params && params.then) params = await params;
await this.$root.api(this.pagination.endpoint, {
limit: (this.pagination.limit || 10) + 1,
untilId: this.items[this.items.length - 1].id,
...(this.pagination.endpoint === 'notes/search' ? {
offset: this.offset,
} : {
untilId: this.items[this.items.length - 1].id,
}),
...params
}).then(x => {
if (x.length == (this.pagination.limit || 10) + 1) {
@ -107,6 +122,7 @@ export default (opts) => ({
this.items = this.items.concat(x);
this.more = false;
}
this.offset += x.length;
this.moreFetching = false;
}, e => {
this.moreFetching = false;
@ -144,7 +160,7 @@ export default (opts) => ({
this.queue = [];
},
onWindowScroll() {
onScroll() {
if (this.isScrollTop()) {
this.onTop();
}
@ -155,8 +171,10 @@ export default (opts) => ({
// http://d.hatena.ne.jp/favril/20091105/1257403319
if (this.$el.offsetHeight == 0) return;
const current = window.scrollY + window.innerHeight;
if (current > document.body.offsetHeight - 8) this.onBottom();
const bottomPosition = opts.isContainer ? this.$el.scrollHeight : document.body.offsetHeight;
const currentBottomPosition = opts.isContainer ? this.$el.scrollTop + this.$el.clientHeight : window.scrollY + window.innerHeight;
if (currentBottomPosition > (bottomPosition - 8)) this.onBottom();
}
},

View File

@ -0,0 +1,10 @@
export default ($root: any) => {
if ($root.$store.getters.isSignedIn) return;
$root.dialog({
title: $root.$t('@.signin-required'),
text: null
});
throw new Error('signin required');
};

View File

@ -8,6 +8,7 @@ import { host, url } from '../../config';
import i18n from '../../i18n';
import { erase, unique } from '../../../../prelude/array';
import extractMentions from '../../../../misc/extract-mentions';
import { formatTimeString } from '../../../../misc/format-time-string';
export default (opts) => ({
i18n: i18n(),
@ -34,6 +35,10 @@ export default (opts) => ({
type: String,
required: false
},
initialNote: {
type: Object,
required: false
},
instant: {
type: Boolean,
required: false,
@ -148,15 +153,26 @@ export default (opts) => ({
// デフォルト公開範囲
this.applyVisibility(this.$store.state.settings.rememberNoteVisibility ? (this.$store.state.device.visibility || this.$store.state.settings.defaultNoteVisibility) : this.$store.state.settings.defaultNoteVisibility);
if (this.reply && this.reply.localOnly) {
this.localOnly = true;
}
// 公開以外へのリプライ時は元の公開範囲を引き継ぐ
if (this.reply && ['home', 'followers', 'specified'].includes(this.reply.visibility)) {
this.visibility = this.reply.visibility;
}
if (this.reply.visibility === 'specified') {
this.$root.api('users/show', {
userIds: this.reply.visibleUserIds.filter(uid => uid !== this.$store.state.i.id && uid !== this.reply.userId)
}).then(users => {
this.visibleUsers.push(...users);
});
if (this.reply) {
this.$root.api('users/show', { userId: this.reply.userId }).then(user => {
this.visibleUsers.push(user);
});
if (this.reply.userId !== this.$store.state.i.id) {
this.$root.api('users/show', { userId: this.reply.userId }).then(user => {
this.visibleUsers.push(user);
});
}
}
}
// keep cw when reply
@ -188,6 +204,29 @@ export default (opts) => ({
}
}
// 削除して編集
if (this.initialNote) {
const init = this.initialNote;
this.text = init.text ? init.text : '';
this.files = init.files;
this.cw = init.cw;
this.useCw = init.cw != null;
if (init.poll) {
this.poll = true;
this.$nextTick(() => {
(this.$refs.poll as any).set({
choices: init.poll.choices.map(c => c.text),
multiple: init.poll.multiple
});
});
}
// hack 位置情報投稿が動くようになったら適用する
this.geo = null;
this.visibility = init.visibility;
this.localOnly = init.localOnly;
this.quoteId = init.renote ? init.renote.id : null;
}
this.$nextTick(() => this.watch());
});
},
@ -237,8 +276,8 @@ export default (opts) => ({
for (const x of Array.from((this.$refs.file as any).files)) this.upload(x);
},
upload(file) {
(this.$refs.uploader as any).upload(file);
upload(file: File, name?: string) {
(this.$refs.uploader as any).upload(file, this.$store.state.settings.uploadFolder, name);
},
onChangeUploadings(uploads) {
@ -284,11 +323,14 @@ export default (opts) => ({
setVisibility() {
const w = this.$root.new(MkVisibilityChooser, {
source: this.$refs.visibilityButton,
currentVisibility: this.visibility
currentVisibility: this.localOnly ? `local-${this.visibility}` : this.visibility
});
w.$once('chosen', v => {
this.applyVisibility(v);
});
this.$once('hook:beforeDestroy', () => {
w.close();
});
},
applyVisibility(v: string) {
@ -320,6 +362,7 @@ export default (opts) => ({
this.text = '';
this.files = [];
this.poll = false;
this.quoteId = null;
this.$emit('change-attached-files', this.files);
},
@ -327,16 +370,29 @@ export default (opts) => ({
if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey) && this.canPost) this.post();
},
async onPaste(e) {
for (const item of Array.from(e.clipboardData.items)) {
async onPaste(e: ClipboardEvent) {
for (const { item, i } of Array.from(e.clipboardData.items).map((item, i) => ({item, i}))) {
if (item.kind == 'file') {
this.upload(item.getAsFile());
const file = item.getAsFile();
const lio = file.name.lastIndexOf('.');
const ext = lio >= 0 ? file.name.slice(lio) : '';
const formatted = `${formatTimeString(new Date(file.lastModified), this.$store.state.settings.pastedFileName).replace(/{{number}}/g, `${i + 1}`)}${ext}`;
const name = this.$store.state.settings.pasteDialog
? await this.$root.dialog({
title: this.$t('@.post-form.enter-file-name'),
input: {
default: formatted
},
allowEmpty: false
}).then(({ canceled, result }) => canceled ? false : result)
: formatted;
if (name) this.upload(file, name);
}
}
const paste = e.clipboardData.getData('text');
if (paste.startsWith(url + '/notes/')) {
if (!this.renote && !this.quoteId && paste.startsWith(url + '/notes/')) {
e.preventDefault();
this.$root.dialog({
@ -404,6 +460,9 @@ export default (opts) => ({
vm.$once('chosen', emoji => {
insertTextAtCursor(this.$refs.text, emoji);
});
this.$once('hook:beforeDestroy', () => {
vm.close();
});
},
saveDraft() {

View File

@ -0,0 +1,21 @@
export type RoomInfo = {
roomType: string;
carpetColor: string;
furnitures: Furniture[];
};
export type Furniture = {
id: string; // 同じ家具が複数ある場合にそれぞれを識別するためのIDであり、家具IDではない
type: string; // こっちが家具ID(chairとか)
position: {
x: number;
y: number;
z: number;
};
rotation: {
x: number;
y: number;
z: number;
};
props?: Record<string, any>;
};

View File

@ -0,0 +1,397 @@
// 家具メタデータ
// 家具にはユーザーが設定できるプロパティを設定可能です:
//
// props: {
// <propname>: <proptype>
// }
//
// proptype一覧:
// * image ... 画像選択ダイアログを出し、その画像のURLが格納されます
// * color ... 色選択コントロールを出し、選択された色が格納されます
// 家具にカスタムテクスチャを適用できるようにするには、textureプロパティに以下の追加の情報を含めます:
// 便宜上そのUVのどの部分にカスタムテクスチャを貼り合わせるかのエリアをテクスチャエリアと呼びます。
// UVは1024*1024だと仮定します。
//
// <key>: {
// prop: <プロパティ名>,
// uv: {
// x: <テクスチャエリアX座標>,
// y: <テクスチャエリアY座標>,
// width: <テクスチャエリアの幅>,
// height: <テクスチャエリアの高さ>,
// },
// }
//
// <key>には、カスタムテクスチャを適用したいメッシュ名を指定します
// <プロパティ名>には、カスタムテクスチャとして使用する画像を格納するプロパティ(前述)名を指定します
// 家具にカスタムカラーを適用できるようにするには、colorプロパティに以下の追加の情報を含めます:
//
// <key>: <プロパティ名>
//
// <key>には、カスタムカラーを適用したいマテリアル名を指定します
// <プロパティ名>には、カスタムカラーとして使用する色を格納するプロパティ(前述)名を指定します
[
{
id: "milk",
place: "floor"
},
{
id: "bed",
place: "floor"
},
{
id: "low-table",
place: "floor",
props: {
color: 'color'
},
color: {
Table: 'color'
}
},
{
id: "desk",
place: "floor",
props: {
color: 'color'
},
color: {
Board: 'color'
}
},
{
id: "chair",
place: "floor",
props: {
color: 'color'
},
color: {
Chair: 'color'
}
},
{
id: "chair2",
place: "floor",
props: {
color1: 'color',
color2: 'color'
},
color: {
Cushion: 'color1',
Leg: 'color2'
}
},
{
id: "fan",
place: "wall"
},
{
id: "pc",
place: "floor"
},
{
id: "plant",
place: "floor"
},
{
id: "plant2",
place: "floor"
},
{
id: "eraser",
place: "floor"
},
{
id: "pencil",
place: "floor"
},
{
id: "pudding",
place: "floor"
},
{
id: "cardboard-box",
place: "floor"
},
{
id: "cardboard-box2",
place: "floor"
},
{
id: "cardboard-box3",
place: "floor"
},
{
id: "book",
place: "floor",
props: {
color: 'color'
},
color: {
Cover: 'color'
}
},
{
id: "book2",
place: "floor"
},
{
id: "piano",
place: "floor"
},
{
id: "facial-tissue",
place: "floor"
},
{
id: "server",
place: "floor"
},
{
id: "moon",
place: "floor"
},
{
id: "corkboard",
place: "wall"
},
{
id: "mousepad",
place: "floor",
props: {
color: 'color'
},
color: {
Pad: 'color'
}
},
{
id: "monitor",
place: "floor",
props: {
screen: 'image'
},
texture: {
Screen: {
prop: 'screen',
uv: {
x: 0,
y: 434,
width: 1024,
height: 588,
},
},
},
},
{
id: "tv",
place: "floor",
props: {
screen: 'image'
},
texture: {
Screen: {
prop: 'screen',
uv: {
x: 0,
y: 434,
width: 1024,
height: 588,
},
},
},
},
{
id: "keyboard",
place: "floor"
},
{
id: "carpet-stripe",
place: "floor",
props: {
color1: 'color',
color2: 'color'
},
color: {
CarpetAreaA: 'color1',
CarpetAreaB: 'color2'
},
},
{
id: "mat",
place: "floor",
props: {
color: 'color'
},
color: {
Mat: 'color'
}
},
{
id: "color-box",
place: "floor",
props: {
color: 'color'
},
color: {
main: 'color'
}
},
{
id: "wall-clock",
place: "wall"
},
{
id: "cube",
place: "floor",
props: {
color: 'color'
},
color: {
Cube: 'color'
}
},
{
id: "photoframe",
place: "wall",
props: {
photo: 'image',
color: 'color'
},
texture: {
Photo: {
prop: 'photo',
uv: {
x: 0,
y: 342,
width: 1024,
height: 683,
},
},
},
color: {
Frame: 'color'
}
},
{
id: "pinguin",
place: "floor",
props: {
body: 'color',
belly: 'color'
},
color: {
Body: 'body',
Belly: 'belly',
}
},
{
id: "rubik-cube",
place: "floor",
},
{
id: "poster-h",
place: "wall",
props: {
picture: 'image'
},
texture: {
Poster: {
prop: 'picture',
uv: {
x: 0,
y: 277,
width: 1024,
height: 745,
},
},
},
},
{
id: "poster-v",
place: "wall",
props: {
picture: 'image'
},
texture: {
Poster: {
prop: 'picture',
uv: {
x: 0,
y: 0,
width: 745,
height: 1024,
},
},
},
},
{
id: "sofa",
place: "floor",
props: {
color: 'color'
},
color: {
Sofa: 'color'
}
},
{
id: "spiral",
place: "floor",
props: {
color: 'color'
},
color: {
Step: 'color'
}
},
{
id: "bin",
place: "floor",
props: {
color: 'color'
},
color: {
Bin: 'color'
}
},
{
id: "cup-noodle",
place: "floor"
},
{
id: "holo-display",
place: "floor",
props: {
image: 'image'
},
texture: {
Image_Front: {
prop: 'image',
uv: {
x: 0,
y: 0,
width: 1024,
height: 1024,
},
},
Image_Back: {
prop: 'image',
uv: {
x: 0,
y: 0,
width: 1024,
height: 1024,
},
},
},
},
{
id: 'energy-drink',
place: "floor",
}
]

View File

@ -0,0 +1,776 @@
import autobind from 'autobind-decorator';
import { v4 as uuid } from 'uuid';
import * as THREE from 'three';
import { GLTFLoader, GLTF } from 'three/examples/jsm/loaders/GLTFLoader';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';
import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js';
import { BloomPass } from 'three/examples/jsm/postprocessing/BloomPass.js';
import { FXAAShader } from 'three/examples/jsm/shaders/FXAAShader.js';
import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js';
import { Furniture, RoomInfo } from './furniture';
import { query as urlQuery } from '../../../../../prelude/url';
const furnitureDefs = require('./furnitures.json5');
THREE.ImageUtils.crossOrigin = '';
type Options = {
graphicsQuality: Room['graphicsQuality'];
onChangeSelect: Room['onChangeSelect'];
useOrthographicCamera: boolean;
};
/**
* MisskeyRoom Core Engine
*/
export class Room {
private clock: THREE.Clock;
private scene: THREE.Scene;
private renderer: THREE.WebGLRenderer;
private camera: THREE.PerspectiveCamera | THREE.OrthographicCamera;
private controls: OrbitControls;
private composer: EffectComposer;
private mixers: THREE.AnimationMixer[] = [];
private furnitureControl: TransformControls;
private roomInfo: RoomInfo;
private graphicsQuality: 'cheep' | 'low' | 'medium' | 'high' | 'ultra';
private roomObj: THREE.Object3D;
private objects: THREE.Object3D[] = [];
private selectedObject: THREE.Object3D = null;
private onChangeSelect: Function;
private isTransformMode = false;
private renderFrameRequestId: number;
private get canvas(): HTMLCanvasElement {
return this.renderer.domElement;
}
private get furnitures(): Furniture[] {
return this.roomInfo.furnitures;
}
private set furnitures(furnitures: Furniture[]) {
this.roomInfo.furnitures = furnitures;
}
private get enableShadow() {
return this.graphicsQuality != 'cheep';
}
private get usePostFXs() {
return this.graphicsQuality !== 'cheep' && this.graphicsQuality !== 'low';
}
private get shadowQuality() {
return (
this.graphicsQuality === 'ultra' ? 16384 :
this.graphicsQuality === 'high' ? 8192 :
this.graphicsQuality === 'medium' ? 4096 :
this.graphicsQuality === 'low' ? 1024 :
0); // cheep
}
constructor(user, isMyRoom, roomInfo: RoomInfo, container, options: Options) {
this.roomInfo = roomInfo;
this.graphicsQuality = options.graphicsQuality;
this.onChangeSelect = options.onChangeSelect;
this.clock = new THREE.Clock(true);
//#region Init a scene
this.scene = new THREE.Scene();
const width = window.innerWidth;
const height = window.innerHeight;
//#region Init a renderer
this.renderer = new THREE.WebGLRenderer({
antialias: false,
stencil: false,
alpha: false,
powerPreference:
this.graphicsQuality === 'ultra' ? 'high-performance' :
this.graphicsQuality === 'high' ? 'high-performance' :
this.graphicsQuality === 'medium' ? 'default' :
this.graphicsQuality === 'low' ? 'low-power' :
'low-power' // cheep
});
this.renderer.setPixelRatio(window.devicePixelRatio);
this.renderer.setSize(width, height);
this.renderer.autoClear = false;
this.renderer.setClearColor(new THREE.Color(0x051f2d));
this.renderer.shadowMap.enabled = this.enableShadow;
this.renderer.shadowMap.type =
this.graphicsQuality === 'ultra' ? THREE.PCFSoftShadowMap :
this.graphicsQuality === 'high' ? THREE.PCFSoftShadowMap :
this.graphicsQuality === 'medium' ? THREE.PCFShadowMap :
this.graphicsQuality === 'low' ? THREE.BasicShadowMap :
THREE.BasicShadowMap; // cheep
container.appendChild(this.canvas);
//#endregion
//#region Init a camera
this.camera = options.useOrthographicCamera
? new THREE.OrthographicCamera(
width / - 2, width / 2, height / 2, height / - 2, -10, 10)
: new THREE.PerspectiveCamera(45, width / height);
if (options.useOrthographicCamera) {
this.camera.position.x = 2;
this.camera.position.y = 2;
this.camera.position.z = 2;
this.camera.zoom = 100;
this.camera.updateProjectionMatrix();
} else {
this.camera.position.x = 5;
this.camera.position.y = 2;
this.camera.position.z = 5;
}
this.scene.add(this.camera);
//#endregion
//#region AmbientLight
const ambientLight = new THREE.AmbientLight(0xffffff, 1);
this.scene.add(ambientLight);
//#endregion
if (this.graphicsQuality !== 'cheep') {
//#region Room light
const roomLight = new THREE.SpotLight(0xffffff, 0.1);
roomLight.position.set(0, 8, 0);
roomLight.castShadow = this.enableShadow;
roomLight.shadow.bias = -0.0001;
roomLight.shadow.mapSize.width = this.shadowQuality;
roomLight.shadow.mapSize.height = this.shadowQuality;
roomLight.shadow.camera.near = 0.1;
roomLight.shadow.camera.far = 9;
roomLight.shadow.camera.fov = 45;
this.scene.add(roomLight);
//#endregion
}
//#region Out light
const outLight1 = new THREE.SpotLight(0xffffff, 0.4);
outLight1.position.set(9, 3, -2);
outLight1.castShadow = this.enableShadow;
outLight1.shadow.bias = -0.001; // アクネ、アーチファクト対策 その代わりピーターパンが発生する可能性がある
outLight1.shadow.mapSize.width = this.shadowQuality;
outLight1.shadow.mapSize.height = this.shadowQuality;
outLight1.shadow.camera.near = 6;
outLight1.shadow.camera.far = 15;
outLight1.shadow.camera.fov = 45;
this.scene.add(outLight1);
const outLight2 = new THREE.SpotLight(0xffffff, 0.2);
outLight2.position.set(-2, 3, 9);
outLight2.castShadow = false;
outLight2.shadow.bias = -0.001; // アクネ、アーチファクト対策 その代わりピーターパンが発生する可能性がある
outLight2.shadow.camera.near = 6;
outLight2.shadow.camera.far = 15;
outLight2.shadow.camera.fov = 45;
this.scene.add(outLight2);
//#endregion
//#region Init a controller
this.controls = new OrbitControls(this.camera, this.canvas);
this.controls.target.set(0, 1, 0);
this.controls.enableZoom = true;
this.controls.enablePan = isMyRoom;
this.controls.minPolarAngle = 0;
this.controls.maxPolarAngle = Math.PI / 2;
this.controls.minAzimuthAngle = 0;
this.controls.maxAzimuthAngle = Math.PI / 2;
this.controls.enableDamping = true;
this.controls.dampingFactor = 0.2;
this.controls.mouseButtons.LEFT = 1;
this.controls.mouseButtons.MIDDLE = 2;
this.controls.mouseButtons.RIGHT = 0;
//#endregion
//#region POST FXs
if (!this.usePostFXs) {
this.composer = null;
} else {
const renderTarget = new THREE.WebGLRenderTarget(width, height, {
minFilter: THREE.LinearFilter,
magFilter: THREE.LinearFilter,
format: THREE.RGBFormat,
stencilBuffer: false,
});
const fxaa = new ShaderPass(FXAAShader);
fxaa.uniforms['resolution'].value = new THREE.Vector2(1 / width, 1 / height);
fxaa.renderToScreen = true;
this.composer = new EffectComposer(this.renderer, renderTarget);
this.composer.addPass(new RenderPass(this.scene, this.camera));
if (this.graphicsQuality === 'ultra') {
this.composer.addPass(new BloomPass(0.25, 30, 128.0, 512));
}
this.composer.addPass(fxaa);
}
//#endregion
//#endregion
//#region Label
//#region Avatar
const avatarUrl = `/proxy/?${urlQuery({ url: user.avatarUrl })}`;
const textureLoader = new THREE.TextureLoader();
textureLoader.crossOrigin = 'anonymous';
const iconTexture = textureLoader.load(avatarUrl);
iconTexture.wrapS = THREE.RepeatWrapping;
iconTexture.wrapT = THREE.RepeatWrapping;
iconTexture.anisotropy = 16;
const avatarMaterial = new THREE.MeshBasicMaterial({
map: iconTexture,
side: THREE.DoubleSide,
alphaTest: 0.5
});
const iconGeometry = new THREE.PlaneGeometry(1, 1);
const avatarObject = new THREE.Mesh(iconGeometry, avatarMaterial);
avatarObject.position.set(-3, 2.5, 2);
avatarObject.rotation.y = Math.PI / 2;
avatarObject.castShadow = false;
this.scene.add(avatarObject);
//#endregion
//#region Username
const name = user.username;
new THREE.FontLoader().load('/assets/fonts/helvetiker_regular.typeface.json', font => {
const nameGeometry = new THREE.TextGeometry(name, {
size: 0.5,
height: 0,
curveSegments: 8,
font: font,
bevelThickness: 0,
bevelSize: 0,
bevelEnabled: false
});
const nameMaterial = new THREE.MeshLambertMaterial({
color: 0xffffff
});
const nameObject = new THREE.Mesh(nameGeometry, nameMaterial);
nameObject.position.set(-3, 2.25, 1.25);
nameObject.rotation.y = Math.PI / 2;
nameObject.castShadow = false;
this.scene.add(nameObject);
});
//#endregion
//#endregion
//#region Interaction
if (isMyRoom) {
this.furnitureControl = new TransformControls(this.camera, this.canvas);
this.scene.add(this.furnitureControl);
// Hover highlight
this.canvas.onmousemove = this.onmousemove;
// Click
this.canvas.onmousedown = this.onmousedown;
}
//#endregion
//#region Init room
this.loadRoom();
//#endregion
//#region Load furnitures
for (const furniture of this.furnitures) {
this.loadFurniture(furniture).then(obj => {
this.scene.add(obj.scene);
this.objects.push(obj.scene);
});
}
//#endregion
// Start render
if (this.usePostFXs) {
this.renderWithPostFXs();
} else {
this.renderWithoutPostFXs();
}
}
@autobind
private renderWithoutPostFXs() {
this.renderFrameRequestId =
window.requestAnimationFrame(this.renderWithoutPostFXs);
// Update animations
const clock = this.clock.getDelta();
for (const mixer of this.mixers) {
mixer.update(clock);
}
this.controls.update();
this.renderer.render(this.scene, this.camera);
}
@autobind
private renderWithPostFXs() {
this.renderFrameRequestId =
window.requestAnimationFrame(this.renderWithPostFXs);
// Update animations
const clock = this.clock.getDelta();
for (const mixer of this.mixers) {
mixer.update(clock);
}
this.controls.update();
this.renderer.clear();
this.composer.render();
}
@autobind
private loadRoom() {
const type = this.roomInfo.roomType;
new GLTFLoader().load(`/assets/room/rooms/${type}/${type}.glb`, gltf => {
gltf.scene.traverse(child => {
if (!(child instanceof THREE.Mesh)) return;
child.receiveShadow = this.enableShadow;
child.material = new THREE.MeshLambertMaterial({
color: (child.material as THREE.MeshStandardMaterial).color,
map: (child.material as THREE.MeshStandardMaterial).map,
name: (child.material as THREE.MeshStandardMaterial).name,
});
// 異方性フィルタリング
if ((child.material as THREE.MeshLambertMaterial).map && this.graphicsQuality !== 'cheep') {
(child.material as THREE.MeshLambertMaterial).map.minFilter = THREE.LinearMipMapLinearFilter;
(child.material as THREE.MeshLambertMaterial).map.magFilter = THREE.LinearMipMapLinearFilter;
(child.material as THREE.MeshLambertMaterial).map.anisotropy = 8;
}
});
gltf.scene.position.set(0, 0, 0);
this.scene.add(gltf.scene);
this.roomObj = gltf.scene;
if (this.roomInfo.roomType === 'default') {
this.applyCarpetColor();
}
});
}
@autobind
private loadFurniture(furniture: Furniture) {
const def = furnitureDefs.find(d => d.id === furniture.type);
return new Promise<GLTF>((res, rej) => {
const loader = new GLTFLoader();
loader.load(`/assets/room/furnitures/${furniture.type}/${furniture.type}.glb`, gltf => {
const model = gltf.scene;
// Load animation
if (gltf.animations.length > 0) {
const mixer = new THREE.AnimationMixer(model);
this.mixers.push(mixer);
for (const clip of gltf.animations) {
mixer.clipAction(clip).play();
}
}
model.name = furniture.id;
model.position.x = furniture.position.x;
model.position.y = furniture.position.y;
model.position.z = furniture.position.z;
model.rotation.x = furniture.rotation.x;
model.rotation.y = furniture.rotation.y;
model.rotation.z = furniture.rotation.z;
model.traverse(child => {
if (!(child instanceof THREE.Mesh)) return;
child.castShadow = this.enableShadow;
child.receiveShadow = this.enableShadow;
(child.material as THREE.MeshStandardMaterial).metalness = 0;
// 異方性フィルタリング
if ((child.material as THREE.MeshStandardMaterial).map && this.graphicsQuality !== 'cheep') {
(child.material as THREE.MeshStandardMaterial).map.minFilter = THREE.LinearMipMapLinearFilter;
(child.material as THREE.MeshStandardMaterial).map.magFilter = THREE.LinearMipMapLinearFilter;
(child.material as THREE.MeshStandardMaterial).map.anisotropy = 8;
}
});
if (def.color) { // カスタムカラー
this.applyCustomColor(model);
}
if (def.texture) { // カスタムテクスチャ
this.applyCustomTexture(model);
}
res(gltf);
}, null, rej);
});
}
@autobind
private applyCarpetColor() {
this.roomObj.traverse(child => {
if (!(child instanceof THREE.Mesh)) return;
if (child.material &&
(child.material as THREE.MeshStandardMaterial).name &&
(child.material as THREE.MeshStandardMaterial).name === 'Carpet'
) {
const colorHex = parseInt(this.roomInfo.carpetColor.substr(1), 16);
(child.material as THREE.MeshStandardMaterial).color.setHex(colorHex);
}
});
}
@autobind
private applyCustomColor(model: THREE.Object3D) {
const furniture = this.furnitures.find(furniture => furniture.id === model.name);
const def = furnitureDefs.find(d => d.id === furniture.type);
if (def.color == null) return;
model.traverse(child => {
if (!(child instanceof THREE.Mesh)) return;
for (const t of Object.keys(def.color)) {
if (!child.material ||
!(child.material as THREE.MeshStandardMaterial).name ||
(child.material as THREE.MeshStandardMaterial).name !== t
) continue;
const prop = def.color[t];
const val = furniture.props ? furniture.props[prop] : undefined;
if (val == null) continue;
const colorHex = parseInt(val.substr(1), 16);
(child.material as THREE.MeshStandardMaterial).color.setHex(colorHex);
}
});
}
@autobind
private applyCustomTexture(model: THREE.Object3D) {
const furniture = this.furnitures.find(furniture => furniture.id === model.name);
const def = furnitureDefs.find(d => d.id === furniture.type);
if (def.texture == null) return;
model.traverse(child => {
if (!(child instanceof THREE.Mesh)) return;
for (const t of Object.keys(def.texture)) {
if (child.name !== t) continue;
const prop = def.texture[t].prop;
const val = furniture.props ? furniture.props[prop] : undefined;
if (val == null) continue;
const canvas = document.createElement('canvas');
canvas.height = 1024;
canvas.width = 1024;
child.material = new THREE.MeshLambertMaterial({
emissive: 0x111111,
side: THREE.DoubleSide,
alphaTest: 0.5,
});
const img = new Image();
img.crossOrigin = 'anonymous';
img.onload = () => {
const uvInfo = def.texture[t].uv;
const ctx = canvas.getContext('2d');
ctx.drawImage(img,
0, 0, img.width, img.height,
uvInfo.x, uvInfo.y, uvInfo.width, uvInfo.height);
const texture = new THREE.Texture(canvas);
texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.RepeatWrapping;
texture.anisotropy = 16;
texture.flipY = false;
(child.material as THREE.MeshLambertMaterial).map = texture;
(child.material as THREE.MeshLambertMaterial).needsUpdate = true;
(child.material as THREE.MeshLambertMaterial).map.needsUpdate = true;
};
img.src = val;
}
});
}
@autobind
private onmousemove(ev: MouseEvent) {
if (this.isTransformMode) return;
const rect = (ev.target as HTMLElement).getBoundingClientRect();
const x = (((ev.clientX * window.devicePixelRatio) - rect.left) / this.canvas.width) * 2 - 1;
const y = -(((ev.clientY * window.devicePixelRatio) - rect.top) / this.canvas.height) * 2 + 1;
const pos = new THREE.Vector2(x, y);
this.camera.updateMatrixWorld();
const raycaster = new THREE.Raycaster();
raycaster.setFromCamera(pos, this.camera);
const intersects = raycaster.intersectObjects(this.objects, true);
for (const object of this.objects) {
if (this.isSelectedObject(object)) continue;
object.traverse(child => {
if (child instanceof THREE.Mesh) {
(child.material as THREE.MeshStandardMaterial).emissive.setHex(0x000000);
}
});
}
if (intersects.length > 0) {
const intersected = this.getRoot(intersects[0].object);
if (this.isSelectedObject(intersected)) return;
intersected.traverse(child => {
if (child instanceof THREE.Mesh) {
(child.material as THREE.MeshStandardMaterial).emissive.setHex(0x191919);
}
});
}
}
@autobind
private onmousedown(ev: MouseEvent) {
if (this.isTransformMode) return;
if (ev.target !== this.canvas || ev.button !== 0) return;
const rect = (ev.target as HTMLElement).getBoundingClientRect();
const x = (((ev.clientX * window.devicePixelRatio) - rect.left) / this.canvas.width) * 2 - 1;
const y = -(((ev.clientY * window.devicePixelRatio) - rect.top) / this.canvas.height) * 2 + 1;
const pos = new THREE.Vector2(x, y);
this.camera.updateMatrixWorld();
const raycaster = new THREE.Raycaster();
raycaster.setFromCamera(pos, this.camera);
const intersects = raycaster.intersectObjects(this.objects, true);
for (const object of this.objects) {
object.traverse(child => {
if (child instanceof THREE.Mesh) {
(child.material as THREE.MeshStandardMaterial).emissive.setHex(0x000000);
}
});
}
if (intersects.length > 0) {
const selectedObj = this.getRoot(intersects[0].object);
this.selectFurniture(selectedObj);
} else {
this.selectedObject = null;
this.onChangeSelect(null);
}
}
@autobind
private getRoot(obj: THREE.Object3D): THREE.Object3D {
let found = false;
let x = obj.parent;
while (!found) {
if (x.parent.parent == null) {
found = true;
} else {
x = x.parent;
}
}
return x;
}
@autobind
private isSelectedObject(obj: THREE.Object3D): boolean {
if (this.selectedObject == null) {
return false;
} else {
return obj.name === this.selectedObject.name;
}
}
@autobind
private selectFurniture(obj: THREE.Object3D) {
this.selectedObject = obj;
this.onChangeSelect(obj);
obj.traverse(child => {
if (child instanceof THREE.Mesh) {
(child.material as THREE.MeshStandardMaterial).emissive.setHex(0xff0000);
}
});
}
/**
* 家具の移動/回転モードにします
* @param type 移動か回転か
*/
@autobind
public enterTransformMode(type: 'translate' | 'rotate') {
this.isTransformMode = true;
this.furnitureControl.setMode(type);
this.furnitureControl.attach(this.selectedObject);
}
/**
* 家具の移動/回転モードを終了します
*/
@autobind
public exitTransformMode() {
this.isTransformMode = false;
this.furnitureControl.detach();
}
/**
* 家具プロパティを更新します
* @param key プロパティ名
* @param value 値
*/
@autobind
public updateProp(key: string, value: any) {
const furniture = this.furnitures.find(furniture => furniture.id === this.selectedObject.name);
if (furniture.props == null) furniture.props = {};
furniture.props[key] = value;
this.applyCustomColor(this.selectedObject);
this.applyCustomTexture(this.selectedObject);
}
/**
* 部屋に家具を追加します
* @param type 家具の種類
*/
@autobind
public addFurniture(type: string) {
const furniture = {
id: uuid(),
type: type,
position: {
x: 0,
y: 0,
z: 0,
},
rotation: {
x: 0,
y: 0,
z: 0,
},
};
this.furnitures.push(furniture);
this.loadFurniture(furniture).then(obj => {
this.scene.add(obj.scene);
this.objects.push(obj.scene);
});
}
/**
* 現在選択されている家具を部屋から削除します
*/
@autobind
public removeFurniture() {
this.exitTransformMode();
const obj = this.selectedObject;
this.scene.remove(obj);
this.objects = this.objects.filter(object => object.name !== obj.name);
this.furnitures = this.furnitures.filter(furniture => furniture.id !== obj.name);
this.selectedObject = null;
this.onChangeSelect(null);
}
/**
* 全ての家具を部屋から削除します
*/
@autobind
public removeAllFurnitures() {
this.exitTransformMode();
for (const obj of this.objects) {
this.scene.remove(obj);
}
this.objects = [];
this.furnitures = [];
this.selectedObject = null;
this.onChangeSelect(null);
}
/**
* 部屋の床の色を変更します
* @param color 色
*/
@autobind
public updateCarpetColor(color: string) {
this.roomInfo.carpetColor = color;
this.applyCarpetColor();
}
/**
* 部屋の種類を変更します
* @param type 種類
*/
@autobind
public changeRoomType(type: string) {
this.roomInfo.roomType = type;
this.scene.remove(this.roomObj);
this.loadRoom();
}
/**
* 部屋データを取得します
*/
@autobind
public getRoomInfo() {
for (const obj of this.objects) {
const furniture = this.furnitures.find(f => f.id === obj.name);
furniture.position.x = obj.position.x;
furniture.position.y = obj.position.y;
furniture.position.z = obj.position.z;
furniture.rotation.x = obj.rotation.x;
furniture.rotation.y = obj.rotation.y;
furniture.rotation.z = obj.rotation.z;
}
return this.roomInfo;
}
/**
* 選択されている家具を取得します
*/
@autobind
public getSelectedObject() {
return this.selectedObject;
}
@autobind
public findFurnitureById(id: string) {
return this.furnitures.find(furniture => furniture.id === id);
}
/**
* レンダリングを終了します
*/
@autobind
public destroy() {
// Stop render loop
window.cancelAnimationFrame(this.renderFrameRequestId);
this.controls.dispose();
this.scene.dispose();
}
}

View File

@ -72,6 +72,9 @@ export default Vue.extend({
columnWidth: '80%'
}
},
dataLabels: {
enabled: false
},
grid: {
clipMarkers: false,
padding: {

View File

@ -16,7 +16,7 @@
</ol>
<ol class="emojis" ref="suggests" v-if="emojis.length > 0">
<li v-for="emoji in emojis" @click="complete(type, emoji.emoji)" @keydown="onKeydown" tabindex="-1">
<span class="emoji" v-if="emoji.isCustomEmoji"><img :src="emoji.url" :alt="emoji.emoji"/></span>
<span class="emoji" v-if="emoji.isCustomEmoji"><img :src="$store.state.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url" :alt="emoji.emoji"/></span>
<span class="emoji" v-else-if="!useOsDefaultEmojis"><img :src="emoji.url" :alt="emoji.emoji"/></span>
<span class="emoji" v-else>{{ emoji.emoji }}</span>
<span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
@ -28,9 +28,10 @@
<script lang="ts">
import Vue from 'vue';
import * as emojilib from 'emojilib';
import { emojilist } from '../../../../../misc/emojilist';
import contains from '../../../common/scripts/contains';
import { twemojiBase } from '../../../../../misc/twemoji-base';
import { twemojiSvgBase } from '../../../../../misc/twemoji-base';
import { getStaticImageUrl } from '../../../common/scripts/get-static-image-url';
type EmojiDef = {
emoji: string;
@ -40,9 +41,7 @@ type EmojiDef = {
isCustomEmoji?: boolean;
};
const lib = Object.entries(emojilib.lib).filter((x: any) => {
return x[1].category != 'flags';
});
const lib = emojilist.filter(x => x.category !== 'flags');
const char2file = (char: string) => {
let codes = Array.from(char).map(x => x.codePointAt(0).toString(16));
@ -51,21 +50,21 @@ const char2file = (char: string) => {
return codes.join('-');
};
const emjdb: EmojiDef[] = lib.map((x: any) => ({
emoji: x[1].char,
name: x[0],
const emjdb: EmojiDef[] = lib.map(x => ({
emoji: x.char,
name: x.name,
aliasOf: null,
url: `${twemojiBase}/2/svg/${char2file(x[1].char)}.svg`
url: `${twemojiSvgBase}/${char2file(x.char)}.svg`
}));
for (const x of lib as any) {
if (x[1].keywords) {
for (const k of x[1].keywords) {
for (const x of lib) {
if (x.keywords) {
for (const k of x.keywords) {
emjdb.push({
emoji: x[1].char,
emoji: x.char,
name: k,
aliasOf: x[0],
url: `${twemojiBase}/2/svg/${char2file(x[1].char)}.svg`
aliasOf: x.name,
url: `${twemojiSvgBase}/${char2file(x.char)}.svg`
});
}
}
@ -78,12 +77,13 @@ export default Vue.extend({
data() {
return {
getStaticImageUrl,
fetching: true,
users: [],
hashtags: [],
emojis: [],
select: -1,
emojilib,
emojilist,
emojiDb: [] as EmojiDef[]
}
},

View File

@ -1,16 +1,16 @@
<template>
<prism :inline="inline" :language="lang || 'js'">{{ code }}</prism>
<x-prism :inline="inline" :language="prismLang">{{ code }}</x-prism>
</template>
<script lang="ts">
import Vue from 'vue';
import 'prismjs';
import 'prismjs/themes/prism-okaidia.css';
import Prism from 'vue-prism-component';
import XPrism from 'vue-prism-component';
export default Vue.extend({
components: {
Prism
XPrism
},
props: {
code: {
@ -25,6 +25,12 @@ export default Vue.extend({
type: Boolean,
required: false
}
},
computed: {
prismLang() {
return Prism.languages[this.lang] ? this.lang : 'js';
}
}
});
</script>

View File

@ -1,6 +1,6 @@
<template>
<div class="mk-connect-failed">
<img src="https://raw.githubusercontent.com/syuilo/misskey/develop/src/client/assets/error.jpg" alt=""/>
<img src="/assets/error.jpg" onerror="this.src='https://raw.githubusercontent.com/syuilo/misskey/develop/src/client/assets/error.jpg';" alt=""/>
<h1>{{ $t('title') }}</h1>
<p class="text">
<span>{{ this.$t('description').substr(0, this.$t('description').indexOf('{')) }}</span>

View File

@ -1,6 +1,12 @@
<template>
<div class="felqjxyj" :class="{ splash }">
<div class="bg" ref="bg" @click="onBgClick"></div>
<ui-modal
ref="modal"
class="modal"
:class="{ splash }"
:close-anime-duration="300"
:close-on-bg-click="false"
@bg-click="onBgClick"
@before-close="onBeforeClose">
<div class="main" ref="main" :class="{ round: $store.state.device.roundedCorners }">
<template v-if="type == 'signin'">
<mk-signin/>
@ -33,12 +39,12 @@
</template>
</ui-select>
<ui-horizon-group no-grow class="buttons fit-bottom" v-if="!splash && (showOkButton || showCancelButton)">
<ui-button @click="ok" v-if="showOkButton" primary :autofocus="!input && !select && !user">{{ (showCancelButton || input || select || user) ? $t('@.ok') : $t('@.got-it') }}</ui-button>
<ui-button @click="ok" v-if="showOkButton" primary :autofocus="!input && !select && !user" :disabled="!canOk">{{ (showCancelButton || input || select || user) ? $t('@.ok') : $t('@.got-it') }}</ui-button>
<ui-button @click="cancel" v-if="showCancelButton || input || select || user">{{ $t('@.cancel') }}</ui-button>
</ui-horizon-group>
</template>
</div>
</div>
</ui-modal>
</template>
<script lang="ts">
@ -98,21 +104,28 @@ export default Vue.extend({
return {
inputValue: this.input && this.input.default ? this.input.default : null,
userInputValue: null,
selectedValue: this.select ? this.select.items ? this.select.items[0].value : this.select.groupedItems[0].items[0].value : null,
selectedValue: this.select ? this.select.default ? this.select.default : this.select.items ? this.select.items[0].value : this.select.groupedItems[0].items[0].value : null,
canOk: true,
faTimesCircle, faQuestionCircle
};
},
mounted() {
this.$nextTick(() => {
(this.$refs.bg as any).style.pointerEvents = 'auto';
anime({
targets: this.$refs.bg,
opacity: 1,
duration: 100,
easing: 'linear'
});
watch: {
userInputValue() {
if (this.user) {
this.$root.api('users/show', parseAcct(this.userInputValue)).then(u => {
this.canOk = u != null;
}).catch(() => {
this.canOk = false;
});
}
}
},
mounted() {
if (this.user) this.canOk = false;
this.$nextTick(() => {
anime({
targets: this.$refs.main,
opacity: 1,
@ -131,6 +144,7 @@ export default Vue.extend({
methods: {
async ok() {
if (!this.canOk) return;
if (!this.showOkButton) return;
if (this.user) {
@ -154,33 +168,27 @@ export default Vue.extend({
this.close();
},
onBgClick() {
if (this.cancelableByBgClick) this.cancel();
}
close() {
this.$refs.modal.close();
},
onBeforeClose() {
this.$el.style.pointerEvents = 'none';
(this.$refs.bg as any).style.pointerEvents = 'none';
(this.$refs.main as any).style.pointerEvents = 'none';
anime({
targets: this.$refs.bg,
opacity: 0,
duration: 300,
easing: 'linear'
});
anime({
targets: this.$refs.main,
opacity: 0,
scale: 0.8,
duration: 300,
easing: 'cubicBezier(0, 0.5, 0.5, 1)',
complete: () => this.destroyDom()
});
},
onBgClick() {
if (this.cancelableByBgClick) {
this.cancel();
}
},
onInputKeydown(e) {
if (e.which == 13) { // Enter
e.preventDefault();
@ -193,80 +201,63 @@ export default Vue.extend({
</script>
<style lang="stylus" scoped>
.felqjxyj
.modal
display flex
align-items center
justify-content center
position fixed
z-index 30000
top 0
left 0
width 100%
height 100%
&.splash
> .main
min-width 0
width initial
> .bg
display block
position fixed
top 0
left 0
width 100%
height 100%
background rgba(#000, 0.7)
opacity 0
pointer-events none
.main
display block
position fixed
margin auto
padding 32px
min-width 320px
max-width 480px
width calc(100% - 32px)
text-align center
background var(--face)
color var(--faceText)
opacity 0
> .main
display block
position fixed
margin auto
padding 32px
min-width 320px
max-width 480px
width calc(100% - 32px)
text-align center
background var(--face)
color var(--faceText)
opacity 0
&.round
border-radius 8px
&.round
border-radius 8px
> .icon
font-size 32px
> .icon
font-size 32px
&.success
color #85da5a
&.success
color #85da5a
&.error
color #ec4137
&.error
color #ec4137
&.warning
color #ecb637
&.warning
color #ecb637
> *
display block
margin 0 auto
> *
display block
margin 0 auto
& + header
margin-top 16px
> header
margin 0 0 8px 0
font-weight bold
font-size 20px
& + .body
margin-top 8px
> .body
margin 16px 0 0 0
> .buttons
& + header
margin-top 16px
> header
margin 0 0 8px 0
font-weight bold
font-size 20px
& + .body
margin-top 8px
> .body
margin 16px 0 0 0
> .buttons
margin-top 16px
</style>

View File

@ -57,7 +57,8 @@ export default Vue.extend({
},
fit: {
type: String,
required: true
required: false,
default: 'cover'
},
detail: {
type: Boolean,

View File

@ -5,29 +5,52 @@
:title="category.text"
@click="go(category)"
:class="{ active: category.isActive }"
:key="category.text"
>
<fa :icon="category.icon" fixed-width/>
</button>
</header>
<div class="emojis">
<header><fa :icon="categories.find(x => x.isActive).icon" fixed-width/> {{ categories.find(x => x.isActive).text }}</header>
<div v-if="categories.find(x => x.isActive).name">
<button v-for="emoji in Object.entries(lib).filter(([k, v]) => v.category === categories.find(x => x.isActive).name)"
:title="emoji[0]"
@click="chosen(emoji[1].char)"
:key="emoji[0]"
>
<mk-emoji :emoji="emoji[1].char"/>
</button>
</div>
<div v-else>
<button v-for="emoji in customEmojis"
:title="emoji.name"
@click="chosen(`:${emoji.name}:`)"
>
<img :src="emoji.url" :alt="emoji.name"/>
</button>
</div>
<template v-if="categories[0].isActive">
<header class="category"><fa :icon="faHistory" fixed-width/> {{ $t('recent-emoji') }}</header>
<div class="list">
<button v-for="(emoji, i) in ($store.state.device.recentEmojis || [])"
:title="emoji.name"
@click="chosen(emoji)"
:key="i"
>
<mk-emoji v-if="emoji.char != null" :emoji="emoji.char"/>
<img v-else :src="$store.state.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url"/>
</button>
</div>
</template>
<header class="category"><fa :icon="categories.find(x => x.isActive).icon" fixed-width/> {{ categories.find(x => x.isActive).text }}</header>
<template v-if="categories.find(x => x.isActive).name">
<div class="list">
<button v-for="emoji in emojilist.filter(e => e.category === categories.find(x => x.isActive).name)"
:title="emoji.name"
@click="chosen(emoji)"
:key="emoji.name"
>
<mk-emoji :emoji="emoji.char"/>
</button>
</div>
</template>
<template v-else>
<div v-for="(key, i) in Object.keys(customEmojis)" :key="i">
<header class="sub">{{ key || $t('no-category') }}</header>
<div class="list">
<button v-for="emoji in customEmojis[key]"
:title="emoji.name"
@click="chosen(emoji)"
:key="emoji.name"
>
<img :src="$store.state.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url"/>
</button>
</div>
</div>
</template>
</div>
</div>
</template>
@ -35,17 +58,21 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
import { lib } from 'emojilib';
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice } from '@fortawesome/free-solid-svg-icons';
import { emojilist } from '../../../../../misc/emojilist';
import { getStaticImageUrl } from '../../../common/scripts/get-static-image-url';
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice, faGlobe, faHistory } from '@fortawesome/free-solid-svg-icons';
import { faHeart, faFlag } from '@fortawesome/free-regular-svg-icons';
import { groupByX } from '../../../../../prelude/array';
export default Vue.extend({
i18n: i18n('common/views/components/emoji-picker.vue'),
data() {
return {
lib,
customEmojis: [],
emojilist,
getStaticImageUrl,
customEmojis: {},
faGlobe, faHistory,
categories: [{
text: this.$t('custom-emoji'),
icon: faAsterisk,
@ -95,18 +122,43 @@ export default Vue.extend({
},
created() {
this.customEmojis = (this.$root.getMetaSync() || { emojis: [] }).emojis || [];
let local = (this.$root.getMetaSync() || { emojis: [] }).emojis || [];
local = groupByX(local, (x: any) => x.category || '');
this.customEmojis = local;
if (this.$store.state.device.activeEmojiCategoryName) {
this.goCategory(this.$store.state.device.activeEmojiCategoryName);
}
},
methods: {
go(category) {
go(category: any) {
this.goCategory(category.name);
},
goCategory(name: string) {
let matched = false;
for (const c of this.categories) {
c.isActive = c.name === category.name;
c.isActive = c.name === name;
if (c.isActive) {
matched = true;
this.$store.commit('device/set', { key: 'activeEmojiCategoryName', value: c.name });
}
}
if (!matched) {
this.categories[0].isActive = true;
}
},
chosen(emoji) {
this.$emit('chosen', emoji);
chosen(emoji: any) {
const getKey = (emoji: any) => emoji.char || `:${emoji.name}:`;
let recents = this.$store.state.device.recentEmojis || [];
recents = recents.filter((e: any) => getKey(e) !== getKey(emoji));
recents.unshift(emoji)
this.$store.commit('device/set', { key: 'recentEmojis', value: recents.splice(0, 16) });
this.$emit('chosen', getKey(emoji));
}
}
});
@ -140,7 +192,7 @@ export default Vue.extend({
overflow-y auto
overflow-x hidden
> header
> header.category
position sticky
top 0
left 0
@ -150,7 +202,12 @@ export default Vue.extend({
color var(--text)
font-size 12px
> div
>>> header.sub
padding 4px 8px
color var(--text)
font-size 12px
>>> div.list
display grid
grid-template-columns 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr
gap 4px
@ -178,6 +235,7 @@ export default Vue.extend({
left 0
width 100%
height 100%
object-fit contain
font-size 28px
transition transform 0.2s ease
pointer-events none

View File

@ -7,10 +7,8 @@
<script lang="ts">
import Vue from 'vue';
// スクリプトサイズがデカい
//import { lib } from 'emojilib';
import { getStaticImageUrl } from '../../../common/scripts/get-static-image-url';
import { twemojiBase } from '../../../../../misc/twemoji-base';
import { twemojiSvgBase } from '../../../../../misc/twemoji-base';
export default Vue.extend({
props: {
@ -55,6 +53,20 @@ export default Vue.extend({
}
},
watch: {
customEmojis() {
if (this.name) {
const customEmoji = this.customEmojis.find(x => x.name == this.name);
if (customEmoji) {
this.customEmoji = customEmoji;
this.url = this.$store.state.device.disableShowingAnimatedImages
? getStaticImageUrl(customEmoji.url)
: customEmoji.url;
}
}
},
},
created() {
if (this.name) {
const customEmoji = this.customEmojis.find(x => x.name == this.name);
@ -78,9 +90,9 @@ export default Vue.extend({
if (!codes.includes('200d')) codes = codes.filter(x => x != 'fe0f');
codes = codes.filter(x => x && x.length);
this.url = `${twemojiBase}/2/svg/${codes.join('-')}.svg`;
this.url = `${twemojiSvgBase}/${codes.join('-')}.svg`;
}
}
},
});
</script>

View File

@ -92,6 +92,14 @@ export default Vue.extend({
try {
if (this.isFollowing) {
const { canceled } = await this.$root.dialog({
type: 'warning',
text: this.$t('@.unfollow-confirm', { name: this.user.name || this.user.username }),
showCancelButton: true
});
if (canceled) return;
await this.$root.api('following/delete', {
userId: this.user.id
});

View File

@ -0,0 +1,49 @@
<template>
<span class="mk-frac"><span>{{ pad }}</span><span>{{ value }} / {{ total }}</span></span>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
export default Vue.extend({
i18n: i18n(),
props: {
value: {
type: Number,
required: true,
},
total: {
type: Number,
required: true,
},
},
computed: {
pad(this: {
value: number;
total: number;
length(value: number): number;
}) {
return '0'.repeat(this.length(this.total) - this.length(this.value));
},
},
methods: {
length(value: number) {
const string = value.toString();
return string.includes('e') ? -~string.substr(string.indexOf('e')) : string.length;
},
},
});
</script>
<style lang="stylus" scoped>
.mk-frac
-webkit-font-feature-settings 'tnum'
-moz-font-feature-settings 'tnum'
font-feature-settings 'tnum'
font-variant-numeric tabular-nums
> :first-child
visibility hidden
</style>

View File

@ -5,17 +5,17 @@
<div style="overflow: hidden; line-height: 28px;">
<p class="turn" v-if="!iAmPlayer && !game.isEnded">
<mfm :key="'turn:' + $options.filters.userName(turnUser)" :text="$t('@.reversi.turn-of', { name: $options.filters.userName(turnUser) })" :should-break="false" :plain-text="true" :custom-emojis="turnUser.emojis"/>
<mfm :key="'turn:' + $options.filters.userName(turnUser)" :text="$t('@.reversi.turn-of', { name: $options.filters.userName(turnUser) })" :plain="true" :custom-emojis="turnUser.emojis"/>
<mk-ellipsis/>
</p>
<p class="turn" v-if="logPos != logs.length">
<mfm :key="'past-turn-of:' + $options.filters.userName(turnUser)" :text="$t('@.reversi.past-turn-of', { name: $options.filters.userName(turnUser) })" :should-break="false" :plain-text="true" :custom-emojis="turnUser.emojis"/>
<mfm :key="'past-turn-of:' + $options.filters.userName(turnUser)" :text="$t('@.reversi.past-turn-of', { name: $options.filters.userName(turnUser) })" :plain="true" :custom-emojis="turnUser.emojis"/>
</p>
<p class="turn1" v-if="iAmPlayer && !game.isEnded && !isMyTurn">{{ $t('@.reversi.opponent-turn') }}<mk-ellipsis/></p>
<p class="turn2" v-if="iAmPlayer && !game.isEnded && isMyTurn" v-animate-css="{ classes: 'tada', iteration: 'infinite' }">{{ $t('@.reversi.my-turn') }}</p>
<p class="result" v-if="game.isEnded && logPos == logs.length">
<template v-if="game.winner">
<mfm :key="'won'" :text="$t('@.reversi.won', { name: $options.filters.userName(game.winner) })" :should-break="false" :plain-text="true" :custom-emojis="game.winner.emojis"/>
<mfm :key="'won'" :text="$t('@.reversi.won', { name: $options.filters.userName(game.winner) })" :plain="true" :custom-emojis="game.winner.emojis"/>
<span v-if="game.surrendered != null"> ({{ $t('surrendered') }})</span>
</template>
<template v-else>{{ $t('@.reversi.drawn') }}</template>

View File

@ -41,7 +41,6 @@ export default Vue.extend({
padding 10px
width 100%
height 40px
font-family sans-serif
font-size 16px
color var(--googleSearchFg)
background var(--googleSearchBg)

View File

@ -1,70 +1,41 @@
<template>
<div class="dkjvrdxtkvqrwmhfickhndpmnncsgacq">
<div class="bg" @click="close"></div>
<img :src="image.url" :alt="image.name" :title="image.name" @click="close"/>
</div>
<ui-modal ref="modal" v-hotkey.global="keymap">
<img :src="image.url" :alt="image.name" :title="image.name" @click="close" />
</ui-modal>
</template>
<script lang="ts">
import Vue from 'vue';
import anime from 'animejs';
export default Vue.extend({
props: ['image'],
mounted() {
anime({
targets: this.$el,
opacity: 1,
duration: 100,
easing: 'linear'
});
computed: {
keymap(): any {
return {
'esc': this.close,
};
}
},
methods: {
close() {
anime({
targets: this.$el,
opacity: 0,
duration: 100,
easing: 'linear',
complete: () => this.destroyDom()
});
(this.$refs.modal as any).close();
}
}
});
</script>
<style lang="stylus" scoped>
.dkjvrdxtkvqrwmhfickhndpmnncsgacq
display block
img
position fixed
z-index 2048
z-index 2
top 0
right 0
bottom 0
left 0
width 100%
height 100%
opacity 0
> .bg
display block
position fixed
z-index 1
top 0
left 0
width 100%
height 100%
background rgba(#000, 0.7)
> img
position fixed
z-index 2
top 0
right 0
bottom 0
left 0
max-width 100%
max-height 100%
margin auto
cursor zoom-out
image-orientation from-image
max-width 100%
max-height 100%
margin auto
cursor zoom-out
image-orientation from-image
</style>

View File

@ -33,6 +33,7 @@ import fileTypeIcon from './file-type-icon.vue';
import emoji from './emoji.vue';
import welcomeTimeline from './welcome-timeline.vue';
import userList from './user-list.vue';
import frac from './frac.vue';
import uiInput from './ui/input.vue';
import uiButton from './ui/button.vue';
import uiHorizonGroup from './ui/horizon-group.vue';
@ -46,6 +47,7 @@ import uiInfo from './ui/info.vue';
import uiMargin from './ui/margin.vue';
import uiHr from './ui/hr.vue';
import uiPagination from './ui/pagination.vue';
import uiModal from './ui/modal.vue';
import formButton from './ui/form/button.vue';
import formRadio from './ui/form/radio.vue';
@ -82,6 +84,7 @@ Vue.component('mk-file-type-icon', fileTypeIcon);
Vue.component('mk-emoji', emoji);
Vue.component('mk-welcome-timeline', welcomeTimeline);
Vue.component('mk-user-list', userList);
Vue.component('mk-frac', frac);
Vue.component('ui-input', uiInput);
Vue.component('ui-button', uiButton);
Vue.component('ui-horizon-group', uiHorizonGroup);
@ -95,5 +98,6 @@ Vue.component('ui-info', uiInfo);
Vue.component('ui-margin', uiMargin);
Vue.component('ui-hr', uiHr);
Vue.component('ui-pagination', uiPagination);
Vue.component('ui-modal', uiModal);
Vue.component('form-button', formButton);
Vue.component('form-radio', formRadio);

View File

@ -59,9 +59,12 @@ export default Vue.extend({
},
methods: {
onClick() {
this.$root.new(ImageViewer, {
const viewer = this.$root.new(ImageViewer, {
image: this.image
});
this.$once('hook:beforeDestroy', () => {
viewer.close();
});
}
}
});

View File

@ -35,13 +35,14 @@ export default Vue.extend({
mounted() {
//#region for Safari bug
if (this.$refs.grid) {
this.$refs.grid.style.height = this.$refs.grid.clientHeight ? `${this.$refs.grid.clientHeight}px` : '128px';
this.$refs.grid.style.height = this.$refs.grid.clientHeight ? `${this.$refs.grid.clientHeight}px`
: this.$store.state.device.inDeckMode ? '128px' : this.$root.isMobile ? '173px' : '287px';
}
//#endregion
},
methods: {
previewable(file) {
return file.type.startsWith('video') || file.type.startsWith('image');
return (file.type.startsWith('video') || file.type.startsWith('image')) && file.thumbnailUrl;
}
}
});

View File

@ -1,11 +1,17 @@
<template>
<router-link class="ldlomzub" :to="`/${ canonical }`" v-user-preview="canonical">
<router-link class="ldlomzub" :to="url" v-user-preview="canonical" v-if="url.startsWith('/')">
<span class="me" v-if="isMe">{{ $t('@.you') }}</span>
<span class="main">
<span class="username">@{{ username }}</span>
<span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="(host != localHost) || $store.state.settings.showFullAcct">@{{ toUnicode(host) }}</span>
</span>
</router-link>
<a class="ldlomzub" :href="url" target="_blank" rel="noopener" v-else>
<span class="main">
<span class="username">@{{ username }}</span>
<span class="host" :class="{ fade: $store.state.settings.contrastedAcct }">@{{ toUnicode(host) }}</span>
</span>
</a>
</template>
<script lang="ts">
@ -32,6 +38,15 @@ export default Vue.extend({
};
},
computed: {
url(): string {
switch (this.host) {
case 'twitter.com':
case 'github.com':
return `https://${this.host}/${this.username}`;
default:
return `/${this.canonical}`;
}
},
canonical(): string {
return this.host === localHost ? `@${this.username}` : `@${this.username}@${toUnicode(this.host)}`;
},

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