Compare commits

...

375 Commits

Author SHA1 Message Date
syuilo
5af8b77d28 Merge branch 'develop' 2023-02-11 14:08:58 +09:00
syuilo
f74d9c7ed0 13.6.0 2023-02-11 14:08:42 +09:00
syuilo
7d9c273dac New Crowdin updates (#9871)
* New translations ja-JP.yml (Romanian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Catalan)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Greek)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Slovak)

* New translations ja-JP.yml (Swedish)

* New translations ja-JP.yml (Turkish)

* New translations ja-JP.yml (Ukrainian)

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

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Vietnamese)

* New translations ja-JP.yml (Indonesian)

* New translations ja-JP.yml (Bengali)

* New translations ja-JP.yml (Thai)

* New translations ja-JP.yml (Uyghur)

* New translations ja-JP.yml (Kannada)

* New translations ja-JP.yml (Kabyle)

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

* New translations ja-JP.yml (Lao)
2023-02-11 14:07:57 +09:00
syuilo
f2da79ad43 Update CHANGELOG.md 2023-02-11 14:00:38 +09:00
syuilo
73a1372940 enhance(client): 迷惑になる可能性のある投稿を行う前に警告を表示
Resolve #9862
2023-02-11 13:54:27 +09:00
tamaina
0138c3b00e enhance(client): ヘッダー(MkPageHeader)関連 (#9869)
* MkPageHeader大改造

* ユーザーページのノート一覧をタブにするなど

* ✌️

* 🎨

* fix

* wheel

* clean up

* 🎨

* 🎨

* remove console.log

* update CHANGELOG.md

* fix

* fix

* fix

* ✌️

* header avatar clickable

* !hideTitle

* Revert "!hideTitle"

This reverts commit 19cad428c9.

* fix changelog
2023-02-11 13:08:18 +09:00
tamaina
6f33be6c75 enhance(client): MkNoteのリアクションの表示数は16に制限 (#9841)
* enhance(client): MkNoteのリアクションの表示数は16に制限・リアクションの横の?ボタンでリアクション詳細

* info-circleにする

* - Layout Shiftが起こらないように
- 自分のリアクションは必ずつける

* https://github.com/misskey-dev/misskey/pull/9841#issuecomment-1423786235

* remove logger

* refactor

* refactor

Co-authored-by: acid-chicken <root@acid-chicken.com>

* Revert "https://github.com/misskey-dev/misskey/pull/9841#issuecomment-1423786235"

This reverts commit ec1315b1fb.

* wip

* wip

* 🎨

* fix

* fix

* fix

* 🎨

* wip

* remove extras from MkNoteDetailed

* もっと!

* no v-if

* dashed

---------

Co-authored-by: acid-chicken <root@acid-chicken.com>
2023-02-11 13:05:36 +09:00
syuilo
3004fe573d enhance(client): URLが4つ以上添付されている場合折りたたむように 2023-02-11 13:01:56 +09:00
syuilo
040f9927dd enhance(client): ロールをより簡単に付与できるように 2023-02-11 12:55:22 +09:00
syuilo
abc1bdf218 Update CHANGELOG.md 2023-02-11 12:34:35 +09:00
syuilo
e73e56be8f 一部のMFM構文をopt-outに 2023-02-11 12:31:56 +09:00
syuilo
b0616b52ea 一部のMFM構文をopt-inに
あとMFMチートシートはMisskey Hubに移動
2023-02-11 11:31:18 +09:00
syuilo
6b6b767199 refactor: use defaultStore instead of this.$store 2023-02-11 11:21:06 +09:00
syuilo
e1bdecb9c1 Update about-misskey.vue 2023-02-11 11:20:50 +09:00
syuilo
a32c6267be 🎨 2023-02-11 11:08:50 +09:00
syuilo
54df243b90 fix: typeorm migrations not working
Fix #9868
2023-02-11 10:49:17 +09:00
syuilo
b44597d5d8 🎨 2023-02-11 10:45:39 +09:00
Acid Chicken (硫酸鶏)
7b70b6c3cd fix: newNoteReceived indicator causes Layout Shift (#9843)
* fix: newNoteReceived indicator causes Layout Shift

* chore: tweak position

* chore: apply to user-list-timeline

* style: unitless

* chore: apply to antenna-timeline

* fix: redundant margin
2023-02-11 10:36:14 +09:00
syuilo
5cc0219ff2 tweak MkNote 2023-02-11 10:27:59 +09:00
syuilo
4a0b0b135a enhance(client): 添付ファイルが5つ以上あるときは折りたたむように 2023-02-11 10:25:33 +09:00
syuilo
8bd2d6328a enhance(client): 一度見たノートのRenoteは省略して表示するように
Resolve #1792
2023-02-11 09:41:54 +09:00
syuilo
9351fb9617 コンディショナルロールもバッジとして表示可能に 2023-02-11 09:03:43 +09:00
tamaina
7b29e36d64 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2023-02-10 11:52:27 +00:00
tamaina
9cc36ef32d fix share page 2023-02-10 11:52:13 +00:00
syuilo
000f876084 Merge branch 'develop' 2023-02-10 20:14:47 +09:00
syuilo
2d11c558fa 13.5.6 2023-02-10 20:14:38 +09:00
syuilo
ac6b02af40 New Crowdin updates (#9852)
* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

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

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Thai)

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

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

* New translations ja-JP.yml (Lao)

* New translations ja-JP.yml (German)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)
2023-02-10 20:13:07 +09:00
Nya Candy
7d91912cfd fix: prevent clipping audio plyr's tooltip (#9850) 2023-02-10 18:29:54 +09:00
syuilo
3c504b4b08 chore(client): improve usability 2023-02-10 11:04:11 +09:00
syuilo
adad4bcfe3 クロップ時の質問を分かりやすく 2023-02-10 10:45:32 +09:00
syuilo
b3e8671dd9 利用規約同意UIの調整 2023-02-10 10:36:25 +09:00
syuilo
0f8c890761 🎨 2023-02-10 09:49:52 +09:00
tamaina
512e451f24 app auth / miauthの文言編集 2023-02-09 17:29:22 +00:00
tamaina
ca0d53ec5d enhance(client): /authおよびMiAuthのUIをブラッシュアップ
Fix #9742
2023-02-09 17:18:27 +00:00
Acid Chicken (硫酸鶏)
686a709e87 chore: determine dimensions of the helix of cat ears based on the size of avatars (#9836)
* chore: determine dimensions of the helix of cat ears based on the size of avatars

* Update MkAvatar.vue

* Update packages/frontend/src/components/global/MkAvatar.vue

---------

Co-authored-by: tamaina <tamaina@hotmail.co.jp>
2023-02-10 00:36:05 +09:00
tamaina
83fb629f0b 🎨 2023-02-09 15:34:49 +00:00
tamaina
35eeeb25e3 update pnpm to 7.27.0 2023-02-09 15:05:23 +00:00
tamaina
19035c676c /proxyでemoji, avatarなどの命令がありかつ画像でないなら404を返すように 2023-02-09 12:39:24 +00:00
syuilo
61ffe7417c Merge branch 'develop' 2023-02-09 20:48:07 +09:00
syuilo
7651353f39 13.5.5 2023-02-09 20:47:56 +09:00
syuilo
3f5b81060f New Crowdin updates (#9844)
* New translations ja-JP.yml (German)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Thai)

* New translations ja-JP.yml (Lao)
2023-02-09 20:47:33 +09:00
syuilo
63dc66769f fix(client): webkitでMkMediaListが崩れるのを修正 2023-02-09 20:12:36 +09:00
syuilo
e0fc8cbf8f Merge branch 'develop' 2023-02-09 18:12:04 +09:00
syuilo
f9d1bc340e 13.5.4 2023-02-09 18:11:48 +09:00
syuilo
0b269e79fd i/notificationsのレートリミットを緩和 2023-02-09 18:11:11 +09:00
syuilo
6159cfd138 enhance(client): improve api error handling 2023-02-09 18:07:51 +09:00
syuilo
6a5bbd335b Update CHANGELOG.md 2023-02-09 18:03:04 +09:00
syuilo
39e269db8c Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2023-02-09 18:01:15 +09:00
syuilo
70fe23a3ce fix(client): validate url to improve security 2023-02-09 18:01:12 +09:00
KOKO
a6a8a7fb85 fix: dateの初期値が正常に入らない時がある (#9827)
* fix: dateの初期値が正常に入らない時がある

* feat: datettime-localをとれるように

* chore: いらない差分を戻す
2023-02-09 17:54:30 +09:00
syuilo
6641b13b4c Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2023-02-09 17:54:14 +09:00
syuilo
5136b05c9b New translations ja-JP.yml (Spanish) (#9839) 2023-02-09 17:53:21 +09:00
syuilo
803c2144f4 Update about-misskey.vue 2023-02-09 17:44:18 +09:00
syuilo
b69a079514 lint 2023-02-09 17:36:16 +09:00
syuilo
2aa800cd55 Update about-misskey.vue 2023-02-09 17:34:45 +09:00
tamaina
6e61a36d05 i/notificationsのレートリミットを緩和
SubwayTooterのバグ対策でレートリミットを設定していたが、通常の使い方でも引っかかることもあるため緩和
2023-02-09 08:32:42 +00:00
tamaina
f80bf1fb1c perf: renderBaseでCache-Controlを300秒から30秒に 2023-02-09 08:19:12 +00:00
syuilo
d465e85239 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2023-02-09 17:03:21 +09:00
tamaina
deed25a2ff Fix #9842 2023-02-09 08:00:45 +00:00
tamaina
a486716520 perf: renderBaseでCache-Controlを15秒から300秒に 2023-02-09 07:49:39 +00:00
syuilo
2361e11e98 Update about-misskey.vue 2023-02-09 16:42:22 +09:00
syuilo
cd1f2adca7 🎨 2023-02-09 13:21:11 +09:00
syuilo
a558767b7a Merge branch 'develop' 2023-02-09 11:54:49 +09:00
syuilo
399ce9b999 13.5.3 2023-02-09 11:54:41 +09:00
syuilo
a94a0b5b0b New Crowdin updates (#9838)
* New translations ja-JP.yml (Romanian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Slovak)

* New translations ja-JP.yml (Ukrainian)

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

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Vietnamese)

* New translations ja-JP.yml (Indonesian)

* New translations ja-JP.yml (Bengali)

* New translations ja-JP.yml (Thai)

* New translations ja-JP.yml (Japanese, Kansai)
2023-02-09 11:52:08 +09:00
syuilo
76faec2115 refactor: fix types 2023-02-09 11:46:08 +09:00
syuilo
33c4e57994 refactor: fix types 2023-02-09 11:42:55 +09:00
syuilo
bc23496998 refactor: fix types 2023-02-09 11:31:40 +09:00
syuilo
d35ad95c18 refactor: fix types 2023-02-09 11:03:40 +09:00
syuilo
5facd11592 refactor: fix types 2023-02-09 11:02:37 +09:00
syuilo
e1e885d6b2 refactor: fix types 2023-02-09 10:55:15 +09:00
syuilo
5b6695114f refactor: fix types 2023-02-09 10:50:53 +09:00
syuilo
71dd7f89e9 clean up 2023-02-09 10:47:03 +09:00
syuilo
21331e53fe refactor: fix types 2023-02-09 10:46:01 +09:00
syuilo
7afee5977f feat(client): add channel column to deck 2023-02-09 10:35:28 +09:00
syuilo
d195b0dec7 refactor(client): use css modules 2023-02-09 10:11:33 +09:00
syuilo
8a95e850ad Update ROADMAP.md 2023-02-09 09:54:30 +09:00
syuilo
a4d74d7d7e 🎨 2023-02-09 09:48:35 +09:00
syuilo
256e0db36d 多分 #9815 2023-02-09 09:33:46 +09:00
syuilo
d593c1358a 🎨 2023-02-09 09:32:39 +09:00
syuilo
1ff14d81c1 update deps 2023-02-09 09:25:31 +09:00
syuilo
4369d12eec Merge branch 'develop' 2023-02-08 20:17:24 +09:00
syuilo
91cc033eb5 13.5.2 2023-02-08 20:17:13 +09:00
syuilo
57543e6b44 fix(client): ログイントークンの再生成が出来ない
Fix #9822
2023-02-08 20:12:44 +09:00
syuilo
a1b8cd15c4 fix(client): register_note_view_interruptor not working
Fix #9826
2023-02-08 20:11:53 +09:00
syuilo
73f06e591a revert: 650187deaf 2023-02-08 20:07:19 +09:00
tamaina
6f7cfa82b5 fix(client): 通知のノート表示で_nowrapが効いていない問題を修正
Fix #9834
2023-02-08 09:50:34 +00:00
syuilo
ff97a003d1 Merge branch 'develop' 2023-02-08 18:14:27 +09:00
syuilo
53c92e3e23 13.5.1 2023-02-08 18:14:17 +09:00
syuilo
13d13bc2f6 fix broken component 2023-02-08 18:13:45 +09:00
syuilo
03744a25ed Merge branch 'develop' 2023-02-08 18:03:28 +09:00
syuilo
eac3bf8bff 13.5.0 2023-02-08 18:03:13 +09:00
syuilo
2e1fbb5b16 New Crowdin updates (#9812)
* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Thai)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Italian)

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

* New translations ja-JP.yml (Lao)

* New translations ja-JP.yml (Lao)

* New translations ja-JP.yml (Chinese Traditional)
2023-02-08 18:00:45 +09:00
Masaya Suzuki
98b3517d36 package.json内のscriptsでbackendのpackage.json内のscriptsを実行する (#9833) 2023-02-08 18:00:20 +09:00
파링
dee662705e fix docker health check (#9810)
* fix(healthcheck): use default commands instead of yq

this removes yq command and uses grep and awk to get port

* fix: use correct config file

* fix: install curl in runner instead of builder

* fix: remove unused packages
2023-02-08 17:59:10 +09:00
syuilo
0da0cc80b9 fix(server): validate url from ap to improve security 2023-02-08 17:50:23 +09:00
syuilo
650187deaf perf(client): do not render custom emojis in user names
#9778
2023-02-08 17:48:02 +09:00
syuilo
2e565cac2c enhance(client): use VuePlyr
Close #9797

Co-Authored-By: Rox Squires <rox@roxsquires.gay>
2023-02-08 17:05:36 +09:00
syuilo
ac7537278c enhance(client): tweak medialist style 2023-02-08 16:54:51 +09:00
itiradi
f9a2e98831 fix(mfm): default degree not used in rotate (#9831) 2023-02-08 08:20:27 +09:00
tamaina
54f789bd55 fix(server): DriveFileEntityService.getPublicUrl調整
- 外部MediaProxyではビデオのサムネイルを生成できないので外部に投げない
- thumbnailUrlが存在しない場合、画像の場合はプロキシで圧縮させる
2023-02-07 14:24:15 +00:00
syuilo
5ac9d13516 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2023-02-07 19:59:00 +09:00
syuilo
2be1a39d13 fix(server): validate urls from ap to improve security 2023-02-07 19:58:58 +09:00
Masaya Suzuki
f3c5edc852 fix: postgre -> postgres (#9814) 2023-02-07 19:50:38 +09:00
tamaina
30704e6de8 update CHANGELOG 2023-02-06 12:13:43 +00:00
tamaina
41932ac409 MkEmojiPickerでも Fix #9598 2023-02-06 12:05:33 +00:00
tamaina
9843c596d8 disableShowingAnimatedImagesのデフォルト値をprefers-reduced-motionにする
Resolve #9821
Related to #6501
2023-02-06 11:29:48 +00:00
syuilo
baf65bfa69 Merge branch 'develop' 2023-02-05 20:55:51 +09:00
syuilo
6501f80fc7 13.4.0 2023-02-05 20:55:42 +09:00
syuilo
b037f6566b Add Thai to language selection
Resolve #9809
2023-02-05 20:53:40 +09:00
syuilo
0ec8ebeba3 fix(client): tweak notification style
Fix #8633
2023-02-05 20:47:27 +09:00
syuilo
af1c9251fc chore(client): add type check 2023-02-05 20:38:33 +09:00
Masaya Suzuki
4ad399c593 fix: テスト実行時のDB立ち上げコマンド修正 (#9804) 2023-02-05 20:34:22 +09:00
syuilo
55a9646f23 New Crowdin updates (#9798)
* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (German)

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

* New translations ja-JP.yml (English)

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

* New translations ja-JP.yml (Thai)

* New translations ja-JP.yml (Thai)

* New translations ja-JP.yml (Lao)

* New translations ja-JP.yml (Lao)
2023-02-05 20:32:19 +09:00
syuilo
46017f5725 Update CHANGELOG.md 2023-02-05 20:32:12 +09:00
Caipira
c20ce12f86 enhance(client): add webhook delete button (#9806) 2023-02-05 20:31:38 +09:00
syuilo
1e28db2396 Update CHANGELOG.md 2023-02-05 20:30:46 +09:00
syuilo
5f3640c7fd fix(client): validate input response in aiscript 2023-02-05 20:29:10 +09:00
syuilo
d65e5f6794 単なるラッキーの獲得確立を調整 2023-02-05 14:38:21 +09:00
syuilo
e67d7bc0ea tweak animation 2023-02-05 14:35:00 +09:00
syuilo
1139632f95 fix(server): 自分のノートをお気に入りに登録しても実績解除される問題を修正 2023-02-05 14:30:07 +09:00
syuilo
b51a8c3f82 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2023-02-05 14:25:39 +09:00
syuilo
0d7256678e fix(server): validate filename and emoji name to improve security 2023-02-05 14:25:37 +09:00
Masaya Suzuki
eea33d07fd fix: aptのキャッシュを削除しないようにする (#9803) 2023-02-05 14:15:59 +09:00
Masaya Suzuki
f599337320 DockleのCI追加 (#9568)
* Dockerイメージ検査のCI追加

* Add cp

* step分離

* step分離

* rm depends_on

* Dockle実行時に必要なイメージタグ付与処理をCI内で行う

* 末尾に移動

* Add comment

* .git削除処理をビルドステージに移動

* docker-compose.yml作成処理追加

* aptのキャッシュ削除処理追加

* ヘルスチェック用スクリプト追加

* yqインストール処理修正

* Add ca-certificates

* yqインストール処理をビルドステージに移動

* インデントを揃える

* インデントをタブに変更
2023-02-05 14:04:02 +09:00
Takuya Yoshida
7df019db0e BuildX設定漏れ修正 (#9741)
* BuildX設定漏れ

* Update .github/workflows/docker-develop.yml

Co-authored-by: Masaya Suzuki <15100604+massongit@users.noreply.github.com>

---------

Co-authored-by: Masaya Suzuki <15100604+massongit@users.noreply.github.com>
2023-02-05 14:03:26 +09:00
futchitwo
04f92bd688 feat: timeline page for non-login users (#9795) 2023-02-05 14:02:54 +09:00
MeiMei
505ecf6c1f Deny UNIX domain socket (#9802)
* Deny UNIX domain socket

* got v12ならこれが使える?
2023-02-05 13:51:59 +09:00
Masaya Suzuki
c9ec08704e fix: インラインコードを折り返して表示する (#9801) 2023-02-05 13:33:21 +09:00
syuilo
6a3039f7b7 feat: ロールにアイコンを設定してユーザー名の横に表示できるように
Resolve #9761
2023-02-05 10:37:03 +09:00
tamaina
868c8fffb3 update CHANGELOG.md 2023-02-04 15:05:13 +00:00
tamaina
faed3b438e fix(server): clean up file in FileServer 2023-02-04 13:46:19 +00:00
syuilo
6c982629ea Merge branch 'develop' 2023-02-04 19:19:57 +09:00
syuilo
110bbbc7dc 13.3.4 2023-02-04 19:19:48 +09:00
syuilo
4ad0345f20 fix(server): cannot follow user 2023-02-04 19:19:30 +09:00
syuilo
9d84214462 Merge branch 'develop' 2023-02-04 18:22:08 +09:00
syuilo
3f199c7113 13.3.3 2023-02-04 18:22:00 +09:00
syuilo
e9417fb741 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2023-02-04 18:21:23 +09:00
syuilo
ee74df6823 fix(server): improve security 2023-02-04 18:21:07 +09:00
syuilo
26630bae81 New translations ja-JP.yml (Chinese Simplified) (#9792) 2023-02-04 18:19:49 +09:00
syuilo
9bde9edcf6 Merge branch 'develop' 2023-02-04 14:23:38 +09:00
syuilo
a12f07c42b 13.3.2 2023-02-04 14:23:29 +09:00
syuilo
e7334c4fb0 Update CHANGELOG.md 2023-02-04 14:21:08 +09:00
syuilo
38f9d1e764 fix(client): validate urls to improve security 2023-02-04 14:20:07 +09:00
tamaina
2dfed75402 perf(server): improvement of external mediaProxy (#9787)
* perf(server): improvement of external mediaProxy

* add a comment

* ✌️

* /filesでsharpの処理を行わずリダイレクトする

* fix

* thumbnail => static

* Fix #9788

* add avatar mode

* add url

* fix

* static.webp

* remove encodeURIComponent from media proxy path

* remove existance check
2023-02-04 13:38:51 +09:00
syuilo
0c12e80106 perf(server): cache blocking 2023-02-04 12:40:40 +09:00
syuilo
b7522f69e7 fix typo 2023-02-04 10:02:03 +09:00
syuilo
24705a7e39 Merge branch 'develop' 2023-02-04 09:12:26 +09:00
syuilo
8add8025a0 13.3.1 2023-02-04 09:12:18 +09:00
syuilo
32fa79d928 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2023-02-04 09:11:36 +09:00
syuilo
534be6ff25 Update CHANGELOG.md 2023-02-04 09:11:33 +09:00
syuilo
f684c07567 New Crowdin updates (#9789)
* New translations ja-JP.yml (Spanish)

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

* New translations ja-JP.yml (German)

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

* New translations ja-JP.yml (English)
2023-02-04 09:10:16 +09:00
syuilo
788ae2f6ca fix(client): validate urls to improve security 2023-02-04 09:10:01 +09:00
syuilo
572000f868 clean up 2023-02-04 09:01:26 +09:00
Rox Squires
57f5df2d22 Fix | Vue-plyr CORS issue (#9790)
* Added Video player

Added vue-plyr as the video play

* Create node.js.yml

* Delete node.js.yml

* Added vue-plyr into pnpm-lock.yaml

* tweak

* Fixed the pnpm-lock.yaml

For some reason on the dependencies there was to instances of vue-plyr

* Added MkMediaAudio

* Update MkMediaList.vue

* CORS checks

* Update MkMediaVideo.vue

* Update MkMediaVideo.vue

* Fixed CORS

the property made the video player use the CORS policy that stopped instance not using media caching not able to load the video from remote instance

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2023-02-04 09:00:16 +09:00
tamaina
b2a67ba5ca fix(client): オートコンプリートでUnicode絵文字がカスタム絵文字として表示されてしまうのを修正 2023-02-03 21:21:36 +00:00
tamaina
d78e15cc1a fix(client): カスタム絵文字にアニメーション画像を再生しない設定が適用されていない問題を修正 2023-02-03 20:37:15 +00:00
syuilo
ceab34f5f3 Merge branch 'develop' 2023-02-03 17:57:40 +09:00
syuilo
3a62625bbc 13.3.0 2023-02-03 17:57:27 +09:00
Roxy Squires
ad6844ac4a Bug | Fixed the error when running pnpm i --frozen-lockfile (#9782)
* Added Video player

Added vue-plyr as the video play

* Create node.js.yml

* Delete node.js.yml

* Added vue-plyr into pnpm-lock.yaml

* tweak

* Fixed the pnpm-lock.yaml

For some reason on the dependencies there was to instances of vue-plyr

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2023-02-03 17:46:16 +09:00
syuilo
a8c252a613 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2023-02-03 17:44:28 +09:00
syuilo
1d39f785f1 perf: use replaceAll instead of regex 2023-02-03 17:44:25 +09:00
Roxy Squires
4b8b29b862 enhance - Added vue-plyr as the standard video player (#9766)
* Added Video player

Added vue-plyr as the video play

* Create node.js.yml

* Delete node.js.yml

* Added vue-plyr into pnpm-lock.yaml

* tweak

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2023-02-03 17:15:25 +09:00
tamaina
0d148bd23b Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2023-02-03 08:07:25 +00:00
tamaina
ebedb81e3f update idb-proxy.ts
Maybe fixed #9769
2023-02-03 08:07:17 +00:00
syuilo
d195406fdc New Crowdin updates (#9760)
* 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 (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Spanish)
2023-02-03 15:14:02 +09:00
syuilo
5173ed37f9 Update CHANGELOG.md 2023-02-03 15:13:28 +09:00
syuilo
825551d64f drop syslog
Close #9774
2023-02-03 15:08:36 +09:00
syuilo
449761bada Update CHANGELOG.md 2023-02-03 15:06:24 +09:00
syuilo
5859df389f Create 1675404035646-cleanup.js 2023-02-03 15:02:54 +09:00
syuilo
562b02310f drop twitter/github/discord integrations
Close #9775
2023-02-03 15:01:31 +09:00
syuilo
65ed702d87 update deps 2023-02-03 14:44:09 +09:00
syuilo
c559a9843f drop hashtag chart 2023-02-03 14:10:14 +09:00
syuilo
88c3957085 enhance(client): hidden ads when canHideAds is true 2023-02-03 14:03:34 +09:00
Masaya Suzuki
01778e11dc CONTRIBUTING: テストが配置されている場所の記述修正 (#9772) 2023-02-03 03:11:50 +09:00
Masaya Suzuki
9d9e8a3c4e CONTRIBUTING: yarn -> pnpm (#9771) 2023-02-03 03:11:26 +09:00
syuilo
ed3e035ad6 refactor: use test 2023-02-02 18:18:25 +09:00
syuilo
07f885fea8 refactor 2023-02-02 18:08:34 +09:00
syuilo
2cc98226ca improve RoleService test 2023-02-02 18:06:23 +09:00
tamaina
8a6f73c5ff enhance: PizzaxデータをindexedDBに保存するように (#9225)
* Revert "Revert #8098"

This reverts commit 8b9dc962ae.

* fix

* use deepClone instead of deepclone

* defaultStore.loaded

* fix load

* wait ready

* use top-level await, await in device-kind.ts
2023-02-02 16:43:56 +09:00
syuilo
00e3453ce1 improve role test 2023-02-02 14:28:29 +09:00
syuilo
16646dd77a Update README.md 2023-02-02 10:31:13 +09:00
syuilo
1f39d1fe26 test: add test of RoleService 2023-02-02 10:26:59 +09:00
syuilo
e8f3c587c9 Update pnpm-lock.yaml 2023-02-02 10:26:43 +09:00
syuilo
4b43745e7c fix(test): add @jest/globals 2023-02-02 10:26:29 +09:00
syuilo
9db2f60053 refactor(client): use top-level await 2023-02-02 09:00:34 +09:00
syuilo
4610d8dfe3 refactor: fix type 2023-02-01 20:15:11 +09:00
syuilo
fa296efdf6 refactor: fix type 2023-02-01 20:13:22 +09:00
syuilo
d9d98f84bf refactor: fix type 2023-02-01 20:12:42 +09:00
tamaina
7c3143b8e5 enhance(backend): enhance SchemaType handling of anyOf (#9762)
* enhance(backend): enhance anyOf handling

* clean up
2023-02-01 20:04:01 +09:00
syuilo
387fcd5c5d refactor: fix type 2023-02-01 17:29:28 +09:00
syuilo
ebc6437977 refactor: tweak variable name 2023-02-01 16:24:50 +09:00
syuilo
dbc23b5d20 Merge branch 'develop' 2023-02-01 11:29:30 +09:00
syuilo
843f1aed4f 13.2.6 2023-02-01 11:29:17 +09:00
syuilo
e42938cad6 Update CHANGELOG.md 2023-02-01 11:27:37 +09:00
YS
2a41f6c383 enhance: Unicode絵文字名逆引き効率化 (#9757)
* Unicode絵文字名前取得を連想配列で行う

* Unicode絵文字事前カテゴリ集計

* Mapを使用

* Update packages/frontend/src/scripts/emojilist.ts

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

---------

Co-authored-by: tamaina <tamaina@hotmail.co.jp>
Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com>
2023-02-01 11:25:13 +09:00
syuilo
671d21a2c1 New Crowdin updates (#9737)
* 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 (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

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

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Indonesian)

* New translations ja-JP.yml (Indonesian)

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

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

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

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

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

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Thai)

* New translations ja-JP.yml (Thai)

* New translations ja-JP.yml (Thai)

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

* New translations ja-JP.yml (Thai)

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

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

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

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

* New translations ja-JP.yml (Thai)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Thai)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)
2023-02-01 11:21:58 +09:00
syuilo
515692d7a6 update aiscript 2023-02-01 11:20:28 +09:00
Nya Candy
00d28826b9 fix(try): ld signature normalizer (#9758) 2023-01-31 19:37:39 +09:00
tamaina
5b38f76254 update CHANGELOG.md 2023-01-28 12:37:28 +00:00
tamaina
ca7dbd6010 gitignore docker-compose.yml 2023-01-28 11:34:34 +00:00
tamaina
133644e5a9 Rename docker-compose.yml to docker-compose.yml.example 2023-01-28 11:33:44 +00:00
tamaina
04d60426c7 modify CHANGELOG.md 2023-01-28 06:22:38 +00:00
tamaina
8282bbd07c fix(client): Chromeで検索ダイアログで変換確定するとそのまま検索されてしまう
Fix #9598
2023-01-28 06:15:29 +00:00
yupix
7190bd00c9 feat: classicモードでテーマが自動変更された際元に戻すように (#9669)
* feat: classicモードでテーマが自動変更された際元に戻すように

* docs: update CHANGELOG.md

* fix: prefixを miux:ui_temp から ui_temp に変更
2023-01-27 13:52:51 +09:00
syuilo
44b9539818 Merge branch 'develop' 2023-01-27 12:33:36 +09:00
syuilo
b2ed4c9508 13.2.5 2023-01-27 12:33:20 +09:00
syuilo
c7b5c8b19e swがビルドできないのを修正 2023-01-27 12:33:15 +09:00
syuilo
f4bee24ccf Merge branch 'develop' 2023-01-27 11:44:14 +09:00
syuilo
e9cb18c5aa 13.2.4 2023-01-27 11:44:04 +09:00
syuilo
d8f33bc0af update deps 2023-01-27 11:40:18 +09:00
syuilo
663999556f New Crowdin updates (#9734)
* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)
2023-01-27 11:35:27 +09:00
syuilo
c5a12ca2c7 fix(client): フォロー申請・フォローのボタンが、通知から消えている問題を修正
Fix #9717
2023-01-27 11:35:04 +09:00
Takuya Yoshida
7af0e38dd3 Use cache on build (#9639) 2023-01-27 11:30:22 +09:00
syuilo
7d9d1ae7c2 enhance(client): tweak custom emoji cache 2023-01-27 11:28:51 +09:00
syuilo
cef448f0f2 tweak blur setting 2023-01-27 11:18:44 +09:00
syuilo
67d64c9365 refactor 2023-01-27 11:16:22 +09:00
syuilo
269af9d6b9 fix(client): ダッシュボードでオンラインユーザー数が表示されない問題を修正 2023-01-27 11:11:56 +09:00
syuilo
d37a734379 fix(server): fix aggregation of retention 2023-01-27 11:10:37 +09:00
syuilo
7cb13cf839 proxyRemoteFilesがfalseならリモートカスタム絵文字は直リンにする 2023-01-26 18:44:43 +09:00
syuilo
d7dda8f6e3 絵文字ピッカーでカスタム絵文字が表示されないのを修正 2023-01-26 18:28:17 +09:00
tamaina
6670c72f8b fix(client): note reacted reflection failed
Fix #9730
2023-01-26 08:48:36 +00:00
hayabusa
b21064ffa4 リアクション履歴が公開なら、ログインしていなくても表示できるように (#9728) 2023-01-26 16:10:32 +09:00
Kagami Sascha Rosylight
1959cb462b Default to animation: false when prefers-reduced-motion is set (#9690)
* Default to `animation: false` when prefers-reduced-motion is set

* `.matches`
2023-01-26 16:08:45 +09:00
Kagami Sascha Rosylight
1d6767ef0c Try reinstalling cypress in CI (#9694) 2023-01-26 16:07:15 +09:00
tamaina
4735ae6451 refactor: /proxyをFileServerServiceに統合し、/proxyのurlで/filesが指定されていた場合は直接ファイルを解決するようにする (#9709)
* wip?

* clean up

* Implement? HttpFetchService

* ✌️

* remove node-fetch

* fix

* refactor

* fix

* gateway timeout

* UndiciFetcherクラスを追加 (仮コミット, ビルドもstartもさせていない)

* fix

* add logger and fix url preview

* fix ip check

* enhance logger and error handling

* fix

* fix

* clean up

* Use custom fetcher for ApRequest / ApResolver

* bypassProxyはproxyBypassHostsに判断を委譲するように

* set maxRedirections (default 3, ApRequest/ApResolver: 0)

* fix

* wip????

* wip

* ✌️

* set .node-version

* clean up

* refactor

* clean up

* refactor

* refactor detectRequestType

* rename detectResponseType

* ✌️

* fix

* wip

* clean up

* no got

* remove got

* wip

* ✌️

* fix

* clean up

* remove unnnecessary const

* good cleanup

* no stream

* Revert "no stream"

This reverts commit 636f9192fc.

* fix

* cache-control: max-age=300 to error

* refactor cleanup
2023-01-26 16:06:29 +09:00
syuilo
452bd6db25 tweak custom emoji handling
Close #9721
2023-01-26 15:48:12 +09:00
syuilo
f5d6b84381 chore: check emoji host 2023-01-26 14:29:28 +09:00
syuilo
34f5d81d1f Merge branch 'develop' 2023-01-26 11:40:46 +09:00
syuilo
aa8adc07aa 13.2.3 2023-01-26 11:40:36 +09:00
syuilo
d87bb807c3 tweak error screen 2023-01-26 11:39:21 +09:00
syuilo
7646d6ed47 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2023-01-26 11:33:34 +09:00
syuilo
41a6ed0de0 lint 2023-01-26 11:33:31 +09:00
syuilo
ec8074cd49 New Crowdin updates (#9724)
* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)
2023-01-26 11:32:43 +09:00
syuilo
7131eb1827 fix(server): turnstile-failed: missing-input-secret
Fix #9726
2023-01-26 11:31:43 +09:00
tamaina
605b0f27e4 Merge branch 'develop' into emoji-re 2023-01-25 14:22:26 +00:00
syuilo
80d2e157f6 🎨 2023-01-25 19:49:17 +09:00
syuilo
1e3447bccb 🎨 2023-01-25 19:45:25 +09:00
syuilo
5ffa106cc1 サードパーティからも自身のロールを確認できるように
Close #9700
2023-01-25 19:34:10 +09:00
tamaina
fc641c9b96 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2023-01-25 06:21:17 +00:00
tamaina
5f49ac1b11 fix(client): アニメーションをオフに設定しても絵文字のアニメーションが止まらない
Fix #9720
2023-01-25 06:21:08 +00:00
syuilo
9ffecf25dc Merge branch 'develop' 2023-01-25 15:16:07 +09:00
syuilo
35fd523edf 13.2.2 2023-01-25 15:15:59 +09:00
syuilo
6721d4216c New Crowdin updates (#9716)
* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)
2023-01-25 15:15:29 +09:00
syuilo
e3275e916b fix(client): MFMのposition、rotate、scaleで小数が使えない問題を修正 2023-01-25 15:15:15 +09:00
syuilo
3ba5541a66 Update ApResolverService.ts 2023-01-25 12:36:39 +09:00
syuilo
945c50db1f Update ApRequestService.ts 2023-01-25 12:31:03 +09:00
syuilo
30dce42e03 fix deps 2023-01-25 12:17:53 +09:00
syuilo
d4fb201d05 fix(server): node-fetchおよびgotを使う以前の実装に戻す
see #9710
2023-01-25 12:00:04 +09:00
syuilo
2a2e8d0cf6 refactor(server): fix type errors 2023-01-25 11:23:57 +09:00
syuilo
520ed8cb4d refactor(server): fix type errors 2023-01-25 11:18:16 +09:00
syuilo
8cab16c824 fix(server): /api/signin always returns 429 when request header x-forwarded-for contains client port
Fix #9408
2023-01-24 17:51:09 +09:00
syuilo
ae63a1f494 Merge branch 'develop' 2023-01-24 17:30:59 +09:00
syuilo
117ac53505 13.2.1 2023-01-24 17:30:51 +09:00
syuilo
2c379732d2 New Crowdin updates (#9696)
* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Thai)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Thai)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Ukrainian)

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

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Chinese Traditional)
2023-01-24 17:28:38 +09:00
syuilo
9ca1197759 🎨 2023-01-24 17:26:49 +09:00
syuilo
8d3283e2a5 tweak ti style 2023-01-24 17:25:52 +09:00
tamaina
6589e8a390 Fix #9710 ? (#9712)
* wip

* update pnpm-lock

* use our own DevNull

* fix

* deliverJobConcurrencyをmacSocketsで割ってソケット数にする
2023-01-24 15:54:14 +09:00
syuilo
b62894ff56 use minified css 2023-01-24 15:02:16 +09:00
syuilo
da274cd458 update deps 2023-01-24 14:49:29 +09:00
syuilo
a2268a95be 🎨 2023-01-24 14:10:26 +09:00
tamaina
9fd1b35d95 fix TypeError: Cannot read properties of undefined (reading 'getLogger') 2023-01-24 01:34:14 +00:00
syuilo
869854eae7 コミット漏れ 2023-01-24 08:32:17 +09:00
syuilo
238f923b41 refactor(server): httpRequestServiceのUndiciFetcher依存をなるべくカプセル化 2023-01-24 08:31:02 +09:00
syuilo
a5df2b0293 Merge branch 'develop' 2023-01-23 20:13:46 +09:00
syuilo
e6eae558d3 13.2.0 2023-01-23 20:13:38 +09:00
syuilo
083fa53d9c update deps 2023-01-23 20:13:18 +09:00
syuilo
7b73dd2d62 enhance(server): onlyServer / onlyQueue オプションを復活 2023-01-23 20:07:48 +09:00
syuilo
7028b7331b 他人の実績閲覧時は獲得条件を表示しないように 2023-01-23 16:40:31 +09:00
syuilo
eefebab530 アニメーション減らすオプション有効時はリアクションのアニメーションを無効に 2023-01-23 16:36:47 +09:00
syuilo
683ddbef3e update contributors 2023-01-23 16:33:47 +09:00
syuilo
bd23522c76 enhance(client): カスタム絵文字一覧のパフォーマンスを改善 2023-01-23 16:19:13 +09:00
nexryai
c1dfbe2623 Hide the value of the object storage secret key input form in the control panel (#9706) 2023-01-23 16:08:09 +09:00
syuilo
ed9facbb33 fix(client): Aiscript: button is not defined
Fix #9704
2023-01-23 12:53:44 +09:00
tamaina
26fbb3a560 fix 2023-01-22 17:39:11 +00:00
tamaina
93dd0638ad better category null handling 2023-01-22 17:33:20 +00:00
tamaina
0d44129ae3 remove console.log 2023-01-22 17:20:53 +00:00
tamaina
0cffe60abc 1時間に 2023-01-22 17:14:05 +00:00
tamaina
8a6750278e ✌️ 2023-01-22 17:11:28 +00:00
tamaina
d347f0a087 wip 2023-01-22 16:07:17 +00:00
tamaina
226e0c4714 ✌️ 2023-01-22 15:17:20 +00:00
tamaina
0b2f945bb6 wip 2023-01-22 15:13:03 +00:00
tamaina
2f6c45e118 wip 2023-01-22 14:53:24 +00:00
tamaina
a5f54580a9 fix 2023-01-22 12:57:51 +00:00
syuilo
70df8c77fa Merge branch 'develop' 2023-01-22 21:30:06 +09:00
syuilo
2c52655b17 13.1.8 2023-01-22 21:29:57 +09:00
syuilo
6c4c071ae9 New Crowdin updates (#9692)
* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Ukrainian)
2023-01-22 21:28:34 +09:00
tamaina
b19dba80f4 Fix #9691 2023-01-22 12:25:55 +00:00
tamaina
a8b19f4aa8 Merge branch 'develop' into emoji-re 2023-01-22 12:07:38 +00:00
syuilo
09f4b9e546 Merge branch 'develop' 2023-01-22 21:01:52 +09:00
syuilo
2e6d8c792b 13.1.7 2023-01-22 21:01:42 +09:00
syuilo
e6338a555d mfmにscaleを追加
Resolve #9609
2023-01-22 20:58:52 +09:00
syuilo
313a489ba0 New Crowdin updates (#9689)
* New translations ja-JP.yml (Chinese Traditional)

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

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Ukrainian)
2023-01-22 20:46:43 +09:00
syuilo
b906ff3fed add an achievement 2023-01-22 20:30:56 +09:00
syuilo
ede96eca28 🎨 2023-01-22 20:25:10 +09:00
syuilo
42f3d9188b add a secret achievement 2023-01-22 20:22:38 +09:00
syuilo
a35e0e9261 Merge branch 'develop' 2023-01-22 17:30:12 +09:00
syuilo
80a400a67c 13.1.6 2023-01-22 17:30:04 +09:00
syuilo
7a6534f30b カスタム絵文字のURLが空文字列になる場合があるのを修正 2023-01-22 17:29:31 +09:00
syuilo
68a523ec6d Merge branch 'develop' 2023-01-22 17:19:13 +09:00
syuilo
97d6c1ee86 13.1.5 2023-01-22 17:19:03 +09:00
syuilo
19c93151ce tweak boot.js 2023-01-22 17:18:48 +09:00
syuilo
039a2af3ab tweak boot.js 2023-01-22 17:18:39 +09:00
syuilo
945129c371 Merge branch 'develop' 2023-01-22 17:11:00 +09:00
syuilo
da32be3ef3 13.1.4 2023-01-22 17:10:49 +09:00
syuilo
468ec36830 New Crowdin updates (#9685)
* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

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

* New translations ja-JP.yml (Russian)

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

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Chinese Traditional)
2023-01-22 17:09:26 +09:00
syuilo
492fb9a115 Update CHANGELOG.md 2023-01-22 17:06:18 +09:00
syuilo
bd8b624bae tweak bootstrap of client 2023-01-22 17:04:51 +09:00
syuilo
9dacf11702 fix(client): ローカリゼーション更新時にリロードが繰り返されることがあるのを修正 2023-01-22 16:52:15 +09:00
syuilo
26ae2dfc0f add achievement 2023-01-22 08:00:42 +09:00
syuilo
a7f43d5312 Merge branch 'develop' 2023-01-22 07:05:13 +09:00
syuilo
7fdf298bd4 13.1.3 2023-01-22 07:04:58 +09:00
syuilo
7d7167df6d New Crowdin updates (#9680)
* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Russian)
2023-01-22 07:04:30 +09:00
syuilo
aa339be2ab fix(client): リアクションのカスタム絵文字が表示されないことがあるのを修正
Fix #9683
2023-01-22 07:04:20 +09:00
syuilo
1217d6fbb4 Merge branch 'develop' 2023-01-22 05:40:56 +09:00
syuilo
ccb22539e1 13.1.2 2023-01-22 05:40:48 +09:00
syuilo
957eff0e63 fix(client): リアクションのカスタム絵文字が表示されないのを修正
Fix #9682
2023-01-22 05:39:33 +09:00
syuilo
363d727c55 refactor 2023-01-22 05:33:26 +09:00
syuilo
31dcf713cc Merge branch 'develop' 2023-01-22 04:28:55 +09:00
syuilo
7800a12e52 13.1.1 2023-01-22 04:28:43 +09:00
syuilo
d6ff50a30b New Crowdin updates (#9676)
* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Korean)

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

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Russian)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Russian)

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

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Russian)

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

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Russian)
2023-01-22 04:28:19 +09:00
syuilo
ead931211c fix(client): 実績解除リクエストの間隔をあけるように
Fix #9674
2023-01-22 04:24:38 +09:00
syuilo
a3aafa03ad update deps 2023-01-22 04:17:58 +09:00
syuilo
307a882649 tweak fetchCustomEmojis timing 2023-01-21 20:53:11 +09:00
syuilo
3e112da486 ローカルのカスタム絵文字については直接オリジナルURLにリクエストするように 2023-01-21 20:40:09 +09:00
syuilo
bd469420fa fix(client): クライアント起動時にも言語ファイルのチェックを行うように
Fix #9005
2023-01-21 20:24:15 +09:00
syuilo
38fde26d60 Merge branch 'develop' 2023-01-21 18:45:50 +09:00
syuilo
dc4fd3e505 13.1.0 2023-01-21 18:45:41 +09:00
syuilo
4dc00ee72a New translations ja-JP.yml (English) (#9673) 2023-01-21 18:41:53 +09:00
CyberRex
bd3d75df6b Update chokidar and use pnpm exec (#9640)
* Fix for dev mode

* Update packages/frontend/package.json

Co-authored-by: tamaina <tamaina@hotmail.co.jp>

Co-authored-by: tamaina <tamaina@hotmail.co.jp>
2023-01-21 18:41:30 +09:00
syuilo
69bb377cb1 13.1.0-beta.2 2023-01-21 17:02:44 +09:00
syuilo
80bfa02831 New Crowdin updates (#9666)
* New translations ja-JP.yml (Thai)

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

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

* New translations ja-JP.yml (Romanian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Catalan)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Greek)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Slovak)

* New translations ja-JP.yml (Swedish)

* New translations ja-JP.yml (Ukrainian)

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

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Vietnamese)

* New translations ja-JP.yml (Indonesian)

* New translations ja-JP.yml (Bengali)

* New translations ja-JP.yml (Thai)

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

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

* New translations ja-JP.yml (Thai)

* New translations ja-JP.yml (Korean)

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

* New translations ja-JP.yml (Korean)
2023-01-21 17:01:43 +09:00
syuilo
8631740ca4 fix(server): twitterと連携するときに autwh is not a function になるのを修正
Fix #9658
2023-01-21 17:01:02 +09:00
syuilo
4b75c68753 fix(client): The … button on notes does nothing when not logged in
Fix #9659
2023-01-21 16:59:58 +09:00
syuilo
3bf775c9a8 ユーザーの実績一覧を見れるように 2023-01-21 16:57:23 +09:00
syuilo
8dc0e0abbb Update ja-JP.yml 2023-01-21 16:08:42 +09:00
syuilo
2b377a3dc5 add some achievements 2023-01-21 16:06:49 +09:00
syuilo
9d367882fb add some achievements 2023-01-21 15:30:29 +09:00
syuilo
951ab90b1a Update CHANGELOG.md 2023-01-21 14:10:09 +09:00
syuilo
7e89e70934 enhance(server): separate job queue process (#9662)
* enhance(server): separate job queue process

* add commands for build with swc
2023-01-21 14:09:01 +09:00
syuilo
0b4a7e8166 enhance(server): set Cache-Control header for some routes 2023-01-21 13:20:09 +09:00
syuilo
59748f07d1 Update CHANGELOG.md 2023-01-21 13:18:17 +09:00
syuilo
65cd605b73 Achievements (#9665)
* wip

* Update ja-JP.yml

* wip

* wip

* Update MkAchievements.vue

* wip

* 🎨

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip
2023-01-21 13:14:55 +09:00
syuilo
b8afabde2c add commands for build with swc 2023-01-19 16:58:09 +09:00
syuilo
02b6595d76 🎨 2023-01-19 10:39:23 +09:00
syuilo
336d8fe785 feat(client): リアクション一覧詳細ダイアログを表示できるように
Resolve #9634
2023-01-19 10:29:30 +09:00
syuilo
ed9a49687e Update CHANGELOG.md 2023-01-19 09:17:18 +09:00
nullobsi
a160b01cff enhance: Alt text in image viewer (#9109)
* Alt text in image viewer

* 🎨

Co-authored-by: tamaina <tamaina@hotmail.co.jp>
2023-01-19 09:16:52 +09:00
syuilo
d05ffc0a7c New Crowdin updates (#9616)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

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

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Indonesian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Italian)

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

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

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

* New translations ja-JP.yml (Korean)

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

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)
2023-01-19 09:12:52 +09:00
syuilo
afc0be6790 enhance: playのscriptの文字数制限を緩和 2023-01-19 09:06:11 +09:00
tamaina
85f3df4c0e fix(client): messaging-room周り (#9643)
* wip

* ✌️

* clean up
2023-01-18 20:26:38 +09:00
Takuya Yoshida
eea47ca2e8 Update redis to 7 (#9654) 2023-01-18 16:18:23 +09:00
atsuchan
57b1fe44d4 Bump Postgres 12.2 to 15.x on docker-compose.yml (#9641) 2023-01-18 06:13:44 +09:00
tamaina
79212bbd37 refactor(server): notify url when fetch error 2023-01-17 17:12:41 +00:00
tamaina
d456308653 pref: Optimize client imports (#9506)
* pref: Optimize client imports

* split api?

* fix

* ✌️

* no vue split?

* Revert "no vue split?"

This reverts commit 27ccec971e.

* function => const

* ✌️

* Revert "function => const"

This reverts commit 34f2feb224.

* function api
2023-01-17 17:36:18 +09:00
syuilo
424919ffd0 Update CHANGELOG.md 2023-01-17 17:11:02 +09:00
syuilo
d75225e23b add new play preset 2023-01-17 17:10:33 +09:00
syuilo
8f0c598772 improve aiscript ui 2023-01-17 17:09:43 +09:00
syuilo
fe4fbafcf0 存在しないカスタム絵文字をテキストで表示するように
Resolve #9516
2023-01-17 15:58:12 +09:00
syuilo
0db2abd56c Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2023-01-17 15:48:45 +09:00
Takuya Yoshida
c62a4d6282 Update actions (#9638) 2023-01-17 15:27:01 +09:00
syuilo
0de41063da 🎨 2023-01-17 14:10:25 +09:00
syuilo
d79478c265 fix(client): playを削除する手段がなかったのを修正
Fix #9630
2023-01-17 13:40:27 +09:00
tamaina
f8d0902080 enhahce(client): 🎨 通知のノートサマリーを1行にする (#9625)
* 🎨 add nowrap to notification

* 🎨 通知のノートサマリーを1行にする
2023-01-17 06:22:57 +09:00
Takuya Yoshida
a69c78e709 Use corepack (#9620) 2023-01-17 05:34:14 +09:00
Kainoa Kanter
84b8ffb7d0 enhance(client): Force error screen (#8947) 2023-01-17 03:26:41 +09:00
Mary
3feaf39294 ApRequestService: don't generate our own Host header (#9378) 2023-01-17 02:21:15 +09:00
tamaina
fe98ad8849 add comments to CHANGELOG 2023-01-16 14:53:57 +00:00
tamaina
65577e43c8 add docker note to CHANGELOG 2023-01-16 14:41:11 +00:00
tamaina
890564e1da refactor 2023-01-16 10:56:43 +00:00
tamaina
002f98987d fix 2023-01-16 10:51:51 +00:00
tamaina
43956f3ffb customEmojiCategories as computed 2023-01-16 10:36:29 +00:00
tamaina
f2a9194c79 ✌️ 2023-01-16 10:13:19 +00:00
tamaina
4cd70df7f4 setInterval 2023-01-16 09:52:45 +00:00
tamaina
21e4c3dfe9 wip 2023-01-16 09:39:58 +00:00
358 changed files with 11637 additions and 7617 deletions

View File

@@ -114,11 +114,6 @@ id: 'aid'
# 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

View File

@@ -114,11 +114,6 @@ id: 'aid'
# 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
@@ -135,6 +130,7 @@ proxyBypassHosts:
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
# Media Proxy
# Reference Implementation: https://github.com/misskey-dev/media-proxy
#mediaProxy: https://example.com/proxy
# Proxy remote files (default: false)

View File

@@ -16,9 +16,15 @@ files/
misskey-assets/
fluent-emojis/
.pnp.*
# .yarn関連
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
.idea/
packages/*/.vscode/
packages/backend/test/docker-compose.yml

3
.dockleignore Normal file
View File

@@ -0,0 +1,3 @@
DKL-DI-0005
DKL-DI-0006
DKL-LI-0003

View File

@@ -14,20 +14,24 @@ jobs:
steps:
- name: Check out the repo
uses: actions/checkout@v3.3.0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2.3.0
- name: Docker meta
id: meta
uses: docker/metadata-action@v3
uses: docker/metadata-action@v4
with:
images: misskey/misskey
- name: Log in to Docker Hub
uses: docker/login-action@v1
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push to Docker Hub
uses: docker/build-push-action@v2
uses: docker/build-push-action@v3
with:
context: .
push: true
tags: misskey/misskey:develop
labels: develop
cache-from: type=gha
cache-to: type=gha,mode=max

View File

@@ -15,7 +15,7 @@ jobs:
uses: actions/checkout@v3.3.0
- name: Docker meta
id: meta
uses: docker/metadata-action@v3
uses: docker/metadata-action@v4
with:
images: misskey/misskey
tags: |
@@ -26,12 +26,12 @@ jobs:
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
- name: Log in to Docker Hub
uses: docker/login-action@v1
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push to Docker Hub
uses: docker/build-push-action@v2
uses: docker/build-push-action@v3
with:
context: .
push: true

30
.github/workflows/dockle.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
---
name: Dockle
on:
push:
branches:
- master
- develop
pull_request:
jobs:
dockle:
runs-on: ubuntu-latest
env:
DOCKER_CONTENT_TRUST: 1
steps:
- uses: actions/checkout@v3.2.0
- run: |
curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v0.4.10/dockle_0.4.10_Linux-64bit.deb"
sudo dpkg -i dockle.deb
- run: |
cp .config/docker_example.env .config/docker.env
cp ./docker-compose.yml.example ./docker-compose.yml
- run: |
docker compose up -d web
docker tag "$(docker compose images web | awk 'OFS=":" {print $4}' | tail -n +2)" misskey-web:latest
- run: |
cmd="dockle --exit-code 1 misskey-web:latest ${image_name}"
echo "> ${cmd}"
eval "${cmd}"

View File

@@ -109,8 +109,12 @@ jobs:
# https://github.com/cypress-io/cypress/issues/4351#issuecomment-559489091
- name: ALSA Env
run: echo -e 'pcm.!default {\n type hw\n card 0\n}\n\nctl.!default {\n type hw\n card 0\n}' > ~/.asoundrc
# XXX: This tries reinstalling Cypress if the binary is not cached
# Remove this when the cache issue is fixed
- name: Cypress install
run: pnpm exec cypress install
- name: Cypress run
uses: cypress-io/github-action@v4
uses: cypress-io/github-action@v5
with:
install: false
start: pnpm start:test

1
.gitignore vendored
View File

@@ -32,6 +32,7 @@ coverage
!/.config/example.yml
!/.config/docker_example.yml
!/.config/docker_example.env
docker-compose.yml
# misskey
/build

View File

@@ -1 +1 @@
v18.12.1
v18.13.0

View File

@@ -9,6 +9,233 @@
You should also include the user name that made the change.
-->
## 13.6.0 (2023/02/11)
### Improvements
- MkPageHeaderをごっそり変えた
* モバイルではヘッダーは上下に分割され、下段にタブが表示されるように
* iconOnlyのタブ項目がアクティブな場合にはタブのタイトルを表示するように
* メインタイムラインではタイトルを表示しない
* メインタイムラインかつモバイルで表示される左上のアバターを選択するとアカウントメニューが開くように
- ユーザーページのノート一覧をタブとして分離
- コンディショナルロールもバッジとして表示可能に
- enhance(client): ロールをより簡単に付与できるように
- enhance(client): 一度見たートのRenoteは省略して表示するように
- enhance(client): 迷惑になる可能性のある投稿を行う前に警告を表示
- リアクションの数が多い場合の表示を改善
- 一部のMFM構文をopt-outに
### Bugfixes
- Client: ユーザーページでタブがほとんど見れないことがないように
## 13.5.6 (2023/02/10)
### Improvements
- 非ログイン時にMiAuthを踏んだ際にMiAuthであることを表示する
- /auth/のUIをアップデート
- 利用規約同意UIの調整
- クロップ時の質問を分かりやすく
### Bugfixes
- fix: prevent clipping audio plyr's tooltip
## 13.5.4 (2023/02/09)
### Improvements
- Server: UIのHTMLートなどの特別なページを除くのキャッシュ時間を15秒から30秒に
- i/notificationsのレートリミットを緩和
### Bugfixes
- fix(client): validate url to improve security
- fix(client): dateの初期値が正常に入らない時がある
## 13.5.3 (2023/02/09)
### Improvements
- Client: デッキにチャンネルカラムを追加
## 13.5.2 (2023/02/08)
### Changes
- Revert: perf(client): do not render custom emojis in user names
### Bugfixes
- Client: register_note_view_interruptor not working
- Client: ログイントークンの再生成が出来ない
## 13.5.0 (2023/02/08)
### Changes
- perf(client): do not render custom emojis in user names
### Improvements
- Client: disableShowingAnimatedImagesのデフォルト値をprefers-reduced-motionにする
- enhance(client): tweak medialist style
### Bugfixes
- fix docker health check
- Client: MkEmojiPickerでもChromeで検索ダイアログで変換確定するとそのまま検索されてしまうのを修正
- fix(mfm): default degree not used in rotate
- fix(server): validate urls from ap to improve security
## 13.4.0 (2023/02/05)
### Improvements
- ロールにアイコンを設定してユーザー名の横に表示できるように
- feat: timeline page for non-login users
- 実績の単なるラッキーの獲得確立を調整
- Add Thai language support
### Bugfixes
- fix(server): 自分のノートをお気に入りに登録しても実績解除される問題を修正
- fix(server): clean up file in FileServer
- fix(server): Deny UNIX domain socket
- fix(server): validate filename and emoji name to improve security
- fix(client): validate input response in aiscript
- fix(client): add webhook delete button
- fix(client): tweak notification style
- fix(client): インラインコードを折り返して表示する
## 13.3.3 (2023/02/04)
### Bugfixes
- Server: improve security
## 13.3.2 (2023/02/04)
### Improvements
- 外部メディアプロキシへの対応を強化しました
外部メディアプロキシのFastify実装を作りました
https://github.com/misskey-dev/media-proxy
- Server: improve performance
### Bugfixes
- Client: validate urls to improve security
## 13.3.1 (2023/02/04)
### Bugfixes
- Client: カスタム絵文字にアニメーション画像を再生しない設定が適用されていない問題を修正
- Client: オートコンプリートでUnicode絵文字がカスタム絵文字として表示されてしまうのを修正
- Client: Fix Vue-plyr CORS issue
- Client: validate urls to improve security
## 13.3.0 (2023/02/03)
### Changes
- twitter/github/discord連携機能が削除されました
- ハッシュタグごとのチャートが削除されました
- syslogのサポートが削除されました
### Improvements
- ロールで広告の非表示が有効になっている場合は最初から広告を非表示にするように
## 13.2.6 (2023/02/01)
### Changes
- docker-compose.ymlをdocker-compose.yml.exampleにしました。docker-compose.ymlとしてコピーしてから使用してください。
### Improvements
- 絵文字ピッカーのパフォーマンスを改善
- AiScriptを0.12.4に更新
### Bugfixes
- Server: リレーと通信できない問題を修正
- Client: classicモード使用時にwindowサイズによってdefaultに変更された後に、windowサイズが元に戻ったらclassicに戻すように修正 #9669
- Client: Chromeで検索ダイアログで変換確定するとそのまま検索されてしまう問題を修正
## 13.2.4 (2023/01/27)
### Improvements
- リモートカスタム絵文字表示時のパフォーマンスを改善
- Default to `animation: false` when prefers-reduced-motion is set
- リアクション履歴が公開なら、ログインしていなくても表示できるように
- tweak blur setting
- tweak custom emoji cache
### Bugfixes
- fix aggregation of retention
- ダッシュボードでオンラインユーザー数が表示されない問題を修正
- フォロー申請・フォローのボタンが、通知から消えている問題を修正
## 13.2.3 (2023/01/26)
### Improvements
- カスタム絵文字の更新をリアルタイムで反映するように
### Bugfixes
- turnstile-failed: missing-input-secret
## 13.2.2 (2023/01/25)
### Improvements
- サーバーのパフォーマンスを改善
### Bugfixes
- サインイン時に誤ったレートリミットがかかることがある問題を修正
- MFMのposition、rotate、scaleで小数が使えない問題を修正
## 13.2.1 (2023/01/24)
### Improvements
- デザインの調整
- サーバーのパフォーマンスを改善
## 13.2.0 (2023/01/23)
### Improvements
- onlyServer / onlyQueue オプションを復活
- 他人の実績閲覧時は獲得条件を表示しないように
- アニメーション減らすオプション有効時はリアクションのアニメーションを無効に
- カスタム絵文字一覧のパフォーマンスを改善
### Bugfixes
- Aiscript: button is not defined
## 13.1.7 (2023/01/22)
### Improvements
- 新たな実績を追加
- MFMにscaleタグを追加
## 13.1.4 (2023/01/22)
### Improvements
- 新たな実績を追加
### Bugfixes
- Client: ローカリゼーション更新時にリロードが繰り返されることがあるのを修正
## 13.1.3 (2023/01/22)
### Bugfixes
- Client: リアクションのカスタム絵文字の表示の問題を修正
## 13.1.2 (2023/01/22)
### Bugfixes
- Client: リアクションのカスタム絵文字の表示の問題を修正
## 13.1.1 (2023/01/22)
### Improvements
- ローカルのカスタム絵文字を表示する際のパフォーマンスを改善
- Client: 瞬間的に大量の実績を解除した際の挙動を改善
### Bugfixes
- Client: アップデート時にローカリゼーションデータが更新されないことがあるのを修正
## 13.1.0 (2023/01/21)
### Improvements
- 実績機能
- Playのプリセットを追加
- Playのscriptの文字数制限を緩和
- AiScript GUIの強化
- リアクション一覧詳細ダイアログを表示できるように
- 存在しないカスタム絵文字をテキストで表示するように
- Alt text in image viewer
- ジョブキューのプロセスとWebサーバーのプロセスを分離
### Bugfixes
- playを削除する手段がなかったのを修正
- The … button on notes does nothing when not logged in
- twitterと連携するときに autwh is not a function になるのを修正
## 13.0.0 (2023/01/16)
### TL;DR
@@ -29,16 +256,20 @@ You should also include the user name that made the change.
- Node.js 18.x or later is required
- PostgreSQL 15.x is required
- Misskey not using 15 specific features at 13.0.0, but may do so in the future.
- Docker環境でPostgreSQLのアップデートを行う際のガイドはこちら: https://github.com/misskey-dev/misskey/pull/9641#issue-1536336620
- Elasticsearchのサポートが削除されました
- 代わりに今後任意の検索プロバイダを設定できる仕組みを構想しています。その仕組みを使えば今まで通りElasticsearchも利用できます
- Yarnからpnpmに移行されました
corepackの有効化を推奨します: `sudo corepack enable`
- インスタンスブロックはサブドメインにも適用されるようになります
- ロールの導入に伴い、いくつかの機能がロールと統合されました
- モデレーターはロールに統合されました。今までのモデレーター情報は失われるため、予めモデレーター一覧を記録しておき、アップデート後にモデレーターロールを作りアサインし直してください。
- サイレンスはロールに統合されました。今までのユーザーは恩赦されるため、予めサイレンス一覧を記録しておくのをおすすめします。
- ユーザーごとのドライブ容量設定はロールに統合されました。
- インスタンスデフォルトのドライブ容量設定はロールに統合されました。アップデート後、ベースロールドライブ容量を編集してください。
- インスタンスデフォルトのドライブ容量設定はロールに統合されました。アップデート後、ベースロールもしくはコンディショナルロールでドライブ容量を編集してください。
- LTL/GTLの解放状態はロールに統合されました。
- Dockerの実行をrootで行わないようにしました。Dockerかつオブジェクトストレージを使用していない場合は`chown -hR 991.991 ./files`を実行してください。
https://github.com/misskey-dev/misskey/pull/9560
#### For users
- ノートのウォッチ機能が削除されました

View File

@@ -44,7 +44,7 @@ Thank you for your PR! Before creating a PR, please check the following:
- Check if there are any documents that need to be created or updated due to this change.
- If you have added a feature or fixed a bug, please add a test case if possible.
- Please make sure that tests and Lint are passed in advance.
- You can run it with `yarn test` and `yarn lint`. [See more info](#testing)
- You can run it with `pnpm test` and `pnpm lint`. [See more info](#testing)
- If this PR includes UI changes, please attach a screenshot in the text.
Thanks for your cooperation 🤗
@@ -102,7 +102,7 @@ If your language is not listed in Crowdin, please open an issue.
During development, it is useful to use the
```
yarn dev
pnpm dev
```
command.
@@ -112,7 +112,7 @@ command.
- Service Worker is watched by esbuild.
## Testing
- Test codes are located in [`/test`](/test).
- Test codes are located in [`/packages/backend/test`](/packages/backend/test).
### Run test
Create a config file.
@@ -121,18 +121,18 @@ cp .github/misskey/test.yml .config/
```
Prepare DB/Redis for testing.
```
docker-compose -f packages/backend/test/docker-compose.yml up
docker compose -f packages/backend/test/docker-compose.yml up
```
Alternatively, prepare an empty (data can be erased) DB and edit `.config/test.yml`.
Run all test.
```
yarn test
pnpm test
```
#### Run specify test
```
yarn jest -- foo.ts
pnpm jest -- foo.ts
```
### e2e tests
@@ -177,9 +177,9 @@ vue-routerとの最大の違いは、niraxは複数のルーターが存在す
これにより、アプリ内ウィンドウでブラウザとは個別にルーティングすることなどが可能になります。
## Notes
### How to resolve conflictions occurred at yarn.lock?
### How to resolve conflictions occurred at pnpm-lock.yaml?
Just execute `yarn` to fix it.
Just execute `pnpm` to fix it.
### INSERTするときにはsaveではなくinsertを使用する
#6441
@@ -265,7 +265,7 @@ MongoDBは`null`で返してきてたので、その感覚で`if (x === null)`
### Migration作成方法
packages/backendで:
```sh
yarn dlx typeorm migration:generate -d ormconfig.js -o <migration name>
pnpm dlx typeorm migration:generate -d ormconfig.js -o <migration name>
```
- 生成後、ファイルをmigration下に移してください

View File

@@ -2,10 +2,16 @@ ARG NODE_VERSION=18.13.0-bullseye
FROM node:${NODE_VERSION} AS builder
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
rm -f /etc/apt/apt.conf.d/docker-clean \
; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache \
&& apt-get update \
&& apt-get install -yqq --no-install-recommends \
build-essential
RUN corepack enable
WORKDIR /misskey
COPY ["pnpm-lock.yaml", "pnpm-workspace.yaml", "package.json", "./"]
@@ -14,8 +20,8 @@ COPY ["packages/backend/package.json", "./packages/backend/"]
COPY ["packages/frontend/package.json", "./packages/frontend/"]
COPY ["packages/sw/package.json", "./packages/sw/"]
RUN npm i -g pnpm
RUN pnpm i --frozen-lockfile
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
pnpm i --frozen-lockfile --aggregate-output
COPY . ./
@@ -23,21 +29,26 @@ ARG NODE_ENV=production
RUN git submodule update --init
RUN pnpm build
RUN rm -rf .git/
FROM node:${NODE_VERSION}-slim AS runner
ARG UID="991"
ARG GID="991"
RUN apt-get update \
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
rm -f /etc/apt/apt.conf.d/docker-clean \
; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache \
&& apt-get update \
&& apt-get install -y --no-install-recommends \
ffmpeg tini \
&& apt-get -y clean \
&& rm -rf /var/lib/apt/lists/* \
ffmpeg tini curl \
&& corepack enable \
&& groupadd -g "${GID}" misskey \
&& useradd -l -u "${UID}" -g "${GID}" -m -d /misskey misskey
&& useradd -l -u "${UID}" -g "${GID}" -m -d /misskey misskey \
&& find / -type f -perm /u+s -ignore_readdir_race -exec chmod u-s {} \; \
&& find / -type f -perm /g+s -ignore_readdir_race -exec chmod g-s {} \;
RUN npm i -g pnpm
USER misskey
WORKDIR /misskey
@@ -50,5 +61,6 @@ COPY --chown=misskey:misskey --from=builder /misskey/fluent-emojis /misskey/flue
COPY --chown=misskey:misskey . ./
ENV NODE_ENV=production
HEALTHCHECK --interval=5s --retries=20 CMD ["/bin/bash", "/misskey/healthcheck.sh"]
ENTRYPOINT ["/usr/bin/tini", "--"]
CMD ["pnpm", "run", "migrateandstart"]

View File

@@ -24,6 +24,8 @@
---
[![codecov](https://codecov.io/gh/misskey-dev/misskey/branch/develop/graph/badge.svg?token=R6IQZ3QJOL)](https://codecov.io/gh/misskey-dev/misskey)
</div>
<div>

View File

@@ -6,16 +6,13 @@ Also, the later tasks are more indefinite and are subject to change as developme
This is the phase we are at now. We need to make a high-maintenance environment that can withstand future development.
- Make the number of type errors zero (backend)
- Probably need to switch some libraries to others that make it difficult to reduce type errors
- e.g. koa to fastify https://github.com/misskey-dev/misskey/issues/7537
- Improve CI
- Fix tests
- mocha, jest, etc. do not support the combination of `TypeScript + ESM + Path alias`, and the tests currently do not work.
- Fix random test failures - https://github.com/misskey-dev/misskey/issues/7985 and https://github.com/misskey-dev/misskey/issues/7986
- Add more tests
- May need to implement a mechanism that allows for DI
- ~~May need to implement a mechanism that allows for DI~~ → Done ✔️
- https://github.com/misskey-dev/misskey/pull/9085
- Measure coverage
- ~~Measure coverage~~ → Done ✔️
- https://github.com/misskey-dev/misskey/pull/9081
- Improve documentation
- Refactoring

View File

@@ -133,11 +133,6 @@ id: "aid"
# 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

View File

@@ -24,7 +24,7 @@ services:
redis:
restart: always
image: redis:4.0-alpine
image: redis:7-alpine
networks:
- internal_network
volumes:
@@ -36,7 +36,7 @@ services:
db:
restart: always
image: postgres:12.2-alpine
image: postgres:15-alpine
networks:
- internal_network
env_file:

View File

@@ -20,7 +20,7 @@ gulp.task('copy:frontend:fonts', () =>
);
gulp.task('copy:frontend:tabler-icons', () =>
gulp.src('./packages/frontend/node_modules/@tabler/icons/iconfont/**/*').pipe(gulp.dest('./built/_frontend_dist_/tabler-icons/'))
gulp.src('./packages/frontend/node_modules/@tabler/icons-webfont/**/*').pipe(gulp.dest('./built/_frontend_dist_/tabler-icons/'))
);
gulp.task('copy:frontend:locales', cb => {

4
healthcheck.sh Normal file
View File

@@ -0,0 +1,4 @@
#!/bin/bash
PORT=$(grep '^port:' /misskey/.config/default.yml | awk 'NR==1{print $2; exit}')
curl -s -S -o /dev/null "http://localhost:${PORT}"

View File

@@ -108,6 +108,7 @@ clickToShow: "اضغط للعرض"
sensitive: "محتوى حساس"
add: "إضافة"
reaction: "التفاعلات"
reactions: "التفاعلات"
reactionSetting: "التفاعلات المراد عرضها في منتقي التفاعلات."
reactionSettingDescription2: "اسحب لترتيب ، انقر للحذف ، استخدم \"+\" للإضافة."
rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات"
@@ -885,56 +886,6 @@ _nsfw:
respect: "اخف الوسائط ذات المحتوى الحساس"
ignore: "اعرض الوسائط ذات المحتوى الحساس"
force: "اخف كل الوسائط"
_mfm:
cheatSheet: "مرجع ملخص عن MFM"
intro: "MFM هي لغة ترميزية مخصصة يمكن استخدامها في عدّة أماكن في ميسكي. يمكنك مراجعة كل تعابيرها مع كيفية استخدامها هنا."
mention: "أشر الى"
mentionDescription: "يمكنك الإشارة لمستخدم معيّن من خلال كتابة @ متبوعة باسم مستخدم."
hashtag: "الوسوم"
hashtagDescription: "يمكنك تعيين وسم من خلال كتابة # متبوعة بالنص المطلوب."
url: "الرابط"
urlDescription: "يمكن عرض الروابط"
link: "رابط"
bold: "عريض"
boldDescription: "جعل الحروف أثخن لإبرازها."
small: "صغير"
smallDescription: "يعرض المحتوى صغيرًا ورفيعًا."
center: "وسط"
centerDescription: "يمركز المحتوى في الوَسَط."
quote: "اقتبس"
quoteDescription: "يعرض المحتوى كاقتباس"
emoji: "إيموجي مخصص"
emojiDescription: "إحاطة اسم الإيموجي بنقطتي تفسير سيستبدله بصورة الإيموجي."
search: "البحث"
searchDescription: "يعرض نصًا في صندوق البحث"
flip: "اقلب"
flipDescription: "يقلب المحتوى عموديًا أو أفقيًا"
jelly: "تأثير (هلام)"
jellyDescription: "يمنح المحتوى حركة هلامية."
tada: "تأثير (تادا)"
tadaDescription: "يمنح للمحتوى تأثير تادا"
jump: "تأثير (قفز)"
jumpDescription: "يمنح للمحتوى حركة قفز."
bounce: "تأثير (ارتداد)"
bounceDescription: "يمنح للمحتوى حركة ارتدادية"
shake: "تأثير (اهتزاز)"
shakeDescription: "يمنح المحتوى حركة اهتزازية."
spin: "تأثير (دوران)"
spinDescription: "يمنح المحتوى حركة دورانية."
x2: "كبير"
x2Description: "يُكبر المحتوى"
x3: "كبير جداً"
x3Description: "يُضخم المحتوى"
x4: "هائل"
x4Description: "يُضخم المحتوى أكثر مما سبق."
blur: "طمس"
blurDescription: "يطمس المحتوى، لكن بالتمرير فوقه سيظهر بوضوح."
font: "الخط"
fontDescription: "الخط المستخدم لعرض المحتوى."
rainbow: "قوس قزح"
rainbowDescription: "اجعل المحتوى يظهر بألوان الطيف"
rotate: "تدوير"
rotateDescription: "يُدير المحتوى بزاوية معيّنة."
_instanceTicker:
none: "لا تظهره بتاتًا"
remote: "أظهر للمستخدمين البِعاد"
@@ -1344,5 +1295,6 @@ _deck:
tl: "الخيط الزمني"
antenna: "الهوائيات"
list: "القوائم"
channel: "القنوات"
mentions: "الإشارات"
direct: "مباشرة"

View File

@@ -107,6 +107,7 @@ clickToShow: "দেখার জন্য ক্লিক করুন"
sensitive: "সংবেদনশীল বিষয়বস্তু"
add: "যুক্ত করুন"
reaction: "প্রতিক্রিয়া"
reactions: "প্রতিক্রিয়া"
reactionSetting: "রিঅ্যাকশন পিকারে যেসকল প্রতিক্রিয়া দেখানো হবে"
reactionSettingDescription2: "পুনরায় সাজাতে টেনে আনুন, মুছতে ক্লিক করুন, যোগ করতে + টিপুন।"
rememberNoteVisibility: "নোটের দৃশ্যমান্যতার সেটিংস মনে রাখুন"
@@ -454,7 +455,6 @@ youHaveNoGroups: "আপনার কোন গ্রুপ নেই "
joinOrCreateGroup: "একটি বিদ্যমান গ্রুপের আমন্ত্রণ পান বা একটি নতুন গ্রুপ তৈরি করুন৷"
noHistory: "কোনো ইতিহাস নেই"
signinHistory: "প্রবেশ করার ইতিহাস"
disableAnimatedMfm: "অ্যানিমেটেড MFM অক্ষম করুন"
doing: "প্রক্রিয়া করছে..."
category: "বিভাগ"
tags: "ট‍্যাগসমূহ"
@@ -922,70 +922,6 @@ _nsfw:
respect: "স্পর্শকাতর মিডিয়া লুকান"
ignore: "স্পর্শকাতর মিডিয়া লুকাবেন না"
force: "সকল মিডিয়া লুকান"
_mfm:
cheatSheet: "MFM চিটশিট"
intro: "MFM একটি মার্কআপ ভাষা যা Misskey-এর মধ্যে বিভিন্ন জায়গায় ব্যবহার করা যেতে পারে। এখানে আপনি MFM-এর সিনট্যাক্সগুলির একটি তালিকা দেখতে পারবেন।"
dummy: "মিসকি ফেডিভার্সের বিশ্বকে প্রসারিত করে"
mention: "উল্লেখ"
mentionDescription: "@ চিহ্ন + ব্যবহারকারীর নাম একটি নির্দিষ্ট ব্যবহারকারীকে নির্দেশ করতে ব্যবহার করা যায়।"
hashtag: "হ্যাশট্যাগ"
hashtagDescription: "আপনি একটি # চিহ্ন + ট্যাগ সহ একটি হ্যাশট্যাগ নির্দেশ করতে পারেন।"
url: "URL"
urlDescription: "URL দেখানো সম্ভব।"
link: "লিংক"
linkDescription: "আপনি পাঠ্যের একটি নির্দিষ্ট অংশকে URL হিসাবে দেখাতে পারেন৷"
bold: "গাঢ়"
boldDescription: "অক্ষরগুলিকে মোটাকরে প্রদর্শন করা হবে।"
small: "ছোট"
smallDescription: "লেখা ছোট এবং পাতলা করে দেখানো হবে।"
center: "সেন্টার"
centerDescription: "লেখা মাঝ বরাবর দেখানো হবে"
inlineCode: "কোড (ইনলাইন)"
inlineCodeDescription: " প্রোগ্রামের কোডের জন্য ইনলাইন সিনট্যাক্স হাইলাইটিং করা হবে"
blockCode: "কোড (ব্লক)"
blockCodeDescription: "মাল্টি-লাইন প্রোগ্রামের কোডের জন্য সিনট্যাক্স হাইলাইট করে।"
inlineMath: "গাণিতিক সূত্র (ইনলাইন)"
inlineMathDescription: "গাণিতিক সূত্র প্রদর্শন করুন (KaTeX) ইনলাইন।"
blockMath: "গাণিতিক সূত্র (ব্লক)"
blockMathDescription: "একটি ব্লকে একাধিক লাইনের গাণিতিক সূত্র প্রদর্শন করুন (KaTeX)।"
quote: "উদ্ধৃতি"
quoteDescription: "বিষয়বস্তুকে একটি উদ্ধৃতি হিসাবে দেখানো হবে।"
emoji: "স্বনির্ধারিত ইমোজিগুলি"
emojiDescription: "আপনি একটি কাস্টম ইমোজির নাম কোলনে আবদ্ধ করে কাস্টম ইমোজিটি দেখাতে পারেন৷"
search: "খুঁজুন"
searchDescription: "পূর্ব-টাইপ করা পাঠ্য সহ একটি অনুসন্ধান বাক্স প্রদর্শন করে।"
flip: "উল্টান"
flipDescription: "বিষয়বস্তু উপরে/নীচে বা বাম/ডানে উল্টান।"
jelly: "অ্যানিমেশন (জেলি)"
jellyDescription: "জেলির মত অ্যানিমেশন দেখায়।"
tada: "অ্যানিমেশন (টাডা)"
tadaDescription: "\"টাডা!\" এর মত অ্যানিমেশন দেখায়।"
jump: "অ্যানিমেশন (লাফ)"
jumpDescription: "বিষয়বস্তুতে লাফ মারার মত অ্যানিমেশন দেখায়।"
bounce: "অ্যানিমেশন (তিড়িং বিড়িং)"
bounceDescription: "তিড়িং বিড়িং করার মত অ্যানিমেশন দেখায়।"
shake: "অ্যানিমেশন (ঝাঁকি)"
shakeDescription: "ঝাঁকির মত অ্যানিমেশন দেখায়।"
twitch: "অ্যানিমেশন (মোচড়ানো)"
twitchDescription: "মোচড়ানোর মত অ্যানিমেশন দেখায়।"
spin: "অ্যানিমেশন (ঘুরা)"
spinDescription: "ঘুরার মত অ্যানিমেশন দেখায়।"
x2: "বড়"
x2Description: "বিষয়বস্তু বড় করে দেখায়।"
x3: "অনেক বড়"
x3Description: "বিষয়বস্তু আরও বড় করে দেখায়।"
x4: "অস্বাভাবিক বড়"
x4Description: "বিষয়বস্তুকে আগের থেকেও আরও বড় করে দেখায়।"
blur: "ব্লার"
blurDescription: "বিষয়বস্তুকে ব্লার করতে পারেন। আপনি এর উপর মাউস কার্সার রাখলে, এটি পরিষ্কারভাবে দেখতে পাবেন।"
font: "ফন্ট"
fontDescription: "বিষয়বস্তুকে কোন ফন্টে দেখানো হবে তা নির্ধারণ করে।"
rainbow: "রেইনবো"
rainbowDescription: "বিষয়বস্তুকে রংধনুর রং গুলিতে প্রদর্শন করে।"
sparkle: "চিক চিক"
sparkleDescription: "বিষয়বস্তুকে একটি চিকচিকে কণা প্রভাব দেয়।"
rotate: "ঘুরান"
rotateDescription: "বিষয়বস্তুকে একটি নির্দিষ্ট কোনে ঘুরায়।"
_instanceTicker:
none: "দেখাবেন না"
remote: "রিমোট ব্যাবহারকারীদের জন্য দেখান"
@@ -1440,5 +1376,6 @@ _deck:
tl: "টাইমলাইন"
antenna: "অ্যান্টেনা"
list: "লিস্ট"
channel: "চ্যানেলগুলি"
mentions: "উল্লেখসমূহ"
direct: "ডাইরেক্ট নোটগুলি"

View File

@@ -108,6 +108,7 @@ clickToShow: "Fes clic per mostrar"
sensitive: "NSFW"
add: "Afegir"
reaction: "Reaccions"
reactions: "Reaccions"
reactionSetting: "Reaccions a mostrar al selector de reaccions"
reactionSettingDescription2: "Arrossega per reordenar, fes clic per suprimir, prem \"+\" per afegir."
rememberNoteVisibility: "Recorda la configuració de visibilitat de les notes"
@@ -374,11 +375,6 @@ file: "Fitxers"
_email:
_follow:
title: "t'ha seguit"
_mfm:
mention: "Menció"
quote: "Citar"
emoji: "Emojis personalitzats"
search: "Cercar"
_instanceMute:
instanceMuteDescription: "Silencia tots els impulsos dels servidors seleccionats, també els usuaris que responen a altres d'un servidor silenciat."
_theme:

View File

@@ -105,6 +105,7 @@ clickToShow: "Klikněte pro zobrazení"
sensitive: "NSFW"
add: "Přidat"
reaction: "Reakce"
reactions: "Reakce"
reactionSettingDescription2: "Přetažením změníte pořadí, kliknutím smažete, zmáčkněte \"+\" k přidání"
rememberNoteVisibility: "Zapamatovat nastavení zobrazení poznámky"
attachCancel: "Odstranit přílohu"
@@ -641,19 +642,6 @@ _registry:
_aboutMisskey:
allContributors: "Všichni přispěvatelé"
source: "Zdrojový kód"
_mfm:
mention: "Zmínění"
hashtag: "Hashtag"
link: "Odkaz"
bold: "Tučně"
quote: "Citovat"
emoji: "Vlastní emoji"
search: "Vyhledávání"
flip: "Otočit"
tada: "Animace (tadá)"
blur: "Rozmazání"
font: "Font"
rainbow: "Duha"
_channel:
featured: "Trendy"
_menuDisplay:
@@ -803,4 +791,5 @@ _deck:
tl: "Časová osa"
antenna: "Antény"
list: "Seznamy"
channel: "Kanály"
mentions: "Zmínění"

View File

@@ -68,7 +68,7 @@ export: "Export"
files: "Dateien"
download: "Herunterladen"
driveFileDeleteConfirm: "Möchtest du die Datei „{name}“ wirklich löschen? Notizen mit dieser Datei werden ebenso verschwinden."
unfollowConfirm: "Möchtest du {name} nicht mehr folgen?"
unfollowConfirm: "Möchtest du {name} wirklich nicht mehr folgen?"
exportRequested: "Du hast einen Export angefragt. Dies kann etwas Zeit in Anspruch nehmen. Sobald der Export abgeschlossen ist, wird er deiner Drive hinzugefügt."
importRequested: "Du hast einen Import angefragt. Dies kann etwas Zeit in Anspruch nehmen."
lists: "Listen"
@@ -94,7 +94,7 @@ defaultNoteVisibility: "Standardsichtbarkeit"
follow: "Folgen"
followRequest: "Follow-Anfrage senden"
followRequests: "Follow-Anfragen"
unfollow: "Nicht mehr folgen"
unfollow: "Entfolgen"
followRequestPending: "Follow-Anfrage ausstehend"
enterEmoji: "Gib ein Emoji ein"
renote: "Renote"
@@ -110,6 +110,7 @@ clickToShow: "Zum Anzeigen anklicken"
sensitive: "NSFW"
add: "Hinzufügen"
reaction: "Reaktionen"
reactions: "Reaktionen"
reactionSetting: "In der Reaktionsauswahl anzuzeigende Reaktionen"
reactionSettingDescription2: "Ziehe um Anzuordnen, klicke um zu löschen, drücke „+“ um hinzuzufügen"
rememberNoteVisibility: "Notizsichtbarkeit merken"
@@ -128,6 +129,7 @@ unblockConfirm: "Möchtest du diese Blockierung wirklich aufheben?"
suspendConfirm: "Möchtest du diesen Benutzer wirklich sperren?"
unsuspendConfirm: "Möchtest du diesen Benutzer wirklich entsperren?"
selectList: "Liste auswählen"
selectChannel: "Kanal auswählen"
selectAntenna: "Antenne auswählen"
selectWidget: "Widget auswählen"
editWidgets: "Widgets bearbeiten"
@@ -255,6 +257,8 @@ noMoreHistory: "Kein weiterer Verlauf vorhanden"
startMessaging: "Neuen Chat erstellen"
nUsersRead: "Von {n} Benutzern gelesen"
agreeTo: "Ich stimme {0} zu"
agreeBelow: "Ich stimme Untenstehendem zu"
basicNotesBeforeCreateAccount: "Wichtige Infos"
tos: "Nutzungsbedingungen"
start: "Anfangen"
home: "Startseite"
@@ -463,7 +467,6 @@ youHaveNoGroups: "Keine Gruppen vorhanden"
joinOrCreateGroup: "Lass dich zu einer Gruppe einladen oder erstelle deine eigene."
noHistory: "Kein Verlauf gefunden"
signinHistory: "Anmeldungsverlauf"
disableAnimatedMfm: "MFM, die Animationen enthalten, deaktivieren"
doing: "In Bearbeitung …"
category: "Kategorie"
tags: "Schlagwörter"
@@ -860,6 +863,8 @@ failedToFetchAccountInformation: "Benutzerkontoinformationen konnten nicht abgef
rateLimitExceeded: "Versuchsanzahl überschritten"
cropImage: "Bild zuschneiden"
cropImageAsk: "Möchtest du das Bild zuschneiden?"
cropYes: "Zuschneiden"
cropNo: "Unbearbeitet verwenden"
file: "Datei"
recentNHours: "Letzten {n} Stunden"
recentNDays: "Letzten {n} Tage"
@@ -931,10 +936,251 @@ undefined: "Undefiniert"
assign: "Zuweisen"
unassign: "Entfernen"
color: "Farbe"
manageCustomEmojis: "Benutzerdefinierte Emojis verwalten"
manageCustomEmojis: "Kann benutzerdefinierte Emojis verwalten"
youCannotCreateAnymore: "Du hast das Erstellungslimit erreicht."
cannotPerformTemporary: "Vorübergehend nicht verfügbar"
cannotPerformTemporaryDescription: "Diese Aktion ist wegen des Überschreitenes des Ausführungslimits temporär nicht verfügbar. Bitte versuche es nach einiger Zeit erneut."
preset: "Vorlage"
selectFromPresets: "Aus Vorlagen wählen"
achievements: "Errungenschaften"
gotInvalidResponseError: "Ungültige Antwort des Servers"
gotInvalidResponseErrorDescription: "Eventuell ist der Server momentan nicht erreichbar oder untergeht Wartungsarbeiten. Bitte versuche es später noch einmal."
_achievements:
earnedAt: "Freigeschaltet am"
_types:
_notes1:
title: "Hallo Misskey!"
description: "Sende deine erste Notiz"
flavor: "Hab eine schöne Zeit mit Misskey!"
_notes10:
title: "Ein paar Notizen"
description: "10 Notizen gesendet"
_notes100:
title: "Viele Notizen"
description: "100 Notizen gesendet"
_notes500:
title: "Überschüttet mit Notizen"
description: "500 Notizen gesendet"
_notes1000:
title: "Berg an Notizen"
description: "1.000 Notizen gesendet"
_notes5000:
title: "Überquellende Notizen"
description: "5.000 Notizen gesendet"
_notes10000:
title: "Supernotiz"
description: "10.000 Notizen gesendet"
_notes20000:
title: "Brauche... mehr... Notizen"
description: "20.000 Notizen gesendet"
_notes30000:
title: "Notizen, Notizen, Notizen"
description: "30.000 Notizen gesendet"
_notes40000:
title: "Notizfabrik"
description: "40.000 Notizen gesendet"
_notes50000:
title: "Planet der Notizen"
description: "50.000 Notizen gesendet"
_notes60000:
title: "Notizquasar"
description: "60.000 Notizen gesendet"
_notes70000:
title: "Schwarzes Notizloch"
description: "70.000 Notizen gesendet"
_notes80000:
title: "Notizgalaxie"
description: "80.000 Notizen gesendet"
_notes90000:
title: "Notizversum"
description: "90.000 Notizen gesendet"
_notes100000:
title: "ALL YOUR NOTE ARE BELONG TO US"
description: "100.000 Notizen gesendet"
flavor: "Du hast wirklich viel zu sagen."
_login3:
title: "Anfänger "
description: "An 3 Tagen eingeloggt"
flavor: "Nenn' mich ab heute Misskist"
_login7:
title: "Anfänger Ⅱ"
description: "An 7 Tagen eingeloggt"
flavor: "Na, eingewöht?"
_login15:
title: "Anfänger Ⅲ"
description: "An 15 Tagen eingeloggt"
_login30:
title: "Misskist "
description: "An 30 Tagen eingeloggt"
_login60:
title: "Misskist Ⅱ"
description: "An 60 Tagen eingeloggt"
_login100:
title: "Misskist Ⅲ"
description: "An 100 Tagen eingeloggt"
flavor: "Violent Misskist"
_login200:
title: "Stammbesucher "
description: "An 200 Tagen eingeloggt"
_login300:
title: "Stammbesucher Ⅱ"
description: "An 300 Tagen eingeloggt"
_login400:
title: "Stammbesucher Ⅲ"
description: "An 400 Tagen eingeloggt"
_login500:
title: "Veteran "
description: "An 500 Tagen eingeloggt"
flavor: "Meine Kameraden, ich liebe sie, die Notizen."
_login600:
title: "Veteran Ⅱ"
description: "An 600 Tagen eingeloggt"
_login700:
title: "Veteran Ⅲ"
description: "An 700 Tagen eingeloggt"
_login800:
title: "Meister der Notizen "
description: "An 800 Tagen eingeloggt"
_login900:
title: "Meister der Notizen Ⅱ"
description: "An 900 Tagen eingeloggt"
_login1000:
title: "Meister der Notizen Ⅲ"
description: "An 1000 Tagen eingeloggt"
flavor: "Danke, dass du Misskey nutzt!"
_noteClipped1:
title: "Muss... clippen..."
description: "Die erste Notiz geclippt"
_noteFavorited1:
title: "Sternengucker"
description: "Eine Notiz als Favorit markiert"
_myNoteFavorited1:
title: "Sternensucher"
description: "Ein anderer Benutzer hat eine deiner Notizen als Favoriten markiert"
_profileFilled:
title: "Perfekte Vorbereitung"
description: "Fülle dein Profil aus"
_markedAsCat:
title: "Ich der Kater"
description: "Markiere dein Konto als Katze"
flavor: "Einen Namen bekommst du später. "
_following1:
title: "Das Folgen beginnt"
description: "Du folgst deiner ersten Person"
_following10:
title: "Folge ihnen... folge ihnen..."
description: "Du folgst über 10 Leuten"
_following50:
title: "Viele Freunde"
description: "Du folgst über 50 Leuten"
_following100:
title: "100 Freunde"
description: "Du folgst über 100 Leuten"
_following300:
title: "Freundeüberschuss"
description: "Du folgst über 300 Leuten"
_followers1:
title: "Der erste Follower"
description: "Du hast deinen ersten Follower erhalten"
_followers10:
title: "Mir nach!"
description: "Die Anzahl deiner Follower hat 10 überschritten"
_followers50:
title: "Wirrwarr"
description: "Die Anzahl deiner Follower hat 50 überschritten"
_followers100:
title: "Beliebt"
description: "Die Anzahl deiner Follower hat 100 überschritten"
_followers300:
title: "Stellt euch bitte in einer Reihe auf"
description: "Die Anzahl deiner Follower hat 300 überschritten"
_followers500:
title: "Funkmast"
description: "Die Anzahl deiner Follower hat 500 überschritten"
_followers1000:
title: "Influencer"
description: "Die Anzahl deiner Follower hat 1000 überschritten"
_collectAchievements30:
title: "Sammler der Errungenschaften"
description: "Schalte 30 Errungenschaften frei"
_viewAchievements3min:
title: "Fan von Errungenschaften"
description: "Schau dir die Liste deiner Errungenschaften für mindestens 3 Minuten an"
_iLoveMisskey:
title: "I Love Misskey"
description: "Sende \"I ❤ #Misskey\""
flavor: "Danke, dass du Misskey verwendest! - vom Entwicklerteam"
_foundTreasure:
title: "Schatzsuche"
description: "Du hast einen verborgenen Schatz gefunden"
_client30min:
title: "Kurze Pause"
description: "Habe Misskey für 30 Minuten geöffnet"
_noteDeletedWithin1min:
title: "Ups"
description: "Lösche eine Notiz innerhalb von 1 Minute nachdem sie gesendet wurde"
_postedAtLateNight:
title: "Nachtaktiv"
description: "Sende mitten in der Nacht eine Notiz"
flavor: "Geh bald schlafen."
_postedAt0min0sec:
title: "Zeitansage"
description: "Sende um 00:00 eine Notiz"
flavor: "Klick Klick Klick Dooong"
_selfQuote:
title: "Selbstzitat"
description: "Zitiere eine eigene Notiz"
_htl20npm:
title: "Fließende Chronik"
description: "Deine Startseitenchronik erreicht eine Geschwindigkeit von 20 npm (Notizen pro Minute)"
_viewInstanceChart:
title: "Analyst"
description: "Schau dir die Messwerte der Instanz an"
_outputHelloWorldOnScratchpad:
title: "Hallo Welt!"
description: "Gib \"hello world\" in der Testumgebung aus"
_open3windows:
title: "Splitscreen"
description: "Habe zur gleichen Zeit mindestens 3 Fenster offen"
_driveFolderCircularReference:
title: "Zyklischer Verweis"
description: "Versuche, in Drive einen Zirkelbezug von Ordnern herzustellen"
_reactWithoutRead:
title: "Hast du das wirklich gelesen?"
description: "Reagiere auf eine Notiz mit mindestens 100 Zeichen innerhalb von 3 Sekunden der Erstellung der Notiz"
_clickedClickHere:
title: "Klicke hier"
description: "Du hast hier geklickt"
_justPlainLucky:
title: "Pures Glück"
description: "Kann alle 10 Sekunden mit einer Warscheinlichkeit von 0.01% erhalten werden"
_setNameToSyuilo:
title: "Gottkomplex"
description: "Setze deinen Namen auf \"syuilo\""
_passedSinceAccountCreated1:
title: "Einjahresjubiläum"
description: "Seit der Erstellung deines Kontos ist 1 Jahr vergangen"
_passedSinceAccountCreated2:
title: "Zweijahresjubiläum"
description: "Seit der Erstellung deines Kontos sind 2 Jahre vergangen"
_passedSinceAccountCreated3:
title: "Dreijahresjubiläum"
description: "Seit der Erstellung deines Kontos sind 3 Jahre vergangen"
_loggedInOnBirthday:
title: "Alles Gute Zum Geburtstag"
description: "Logge dich an deinem Geburtstag ein"
_loggedInOnNewYearsDay:
title: "Frohes Neujahr"
description: "Logge dich am Neujahrstag ein"
flavor: "Auf ein weiteres tolles Jahr in dieser Instanz"
_cookieClicked:
title: "Ein Spiel, in dem du auf einen Keks klickst"
description: "Den Keks geklickt"
flavor: "Bist du hier richtig?"
_brainDiver:
title: "Brain Diver"
description: "Sende den Link zu Brain Diver"
flavor: "Misskey-Misskey La-Tu-Ma"
_role:
new: "Rolle erstellen"
edit: "Rolle bearbeiten"
@@ -943,7 +1189,7 @@ _role:
permission: "Rollenberechtigungen"
descriptionOfPermission: "<b>Moderatoren</b> können grundlegende Verwaltungsaufgaben erledigen.\n<b>Administratoren</b> können alle Einstellungen der Instanz verwalten."
assignTarget: "Zuweisungsart"
descriptionOfAssignTarget: "<b>Manuell</b> bedeutet, dass die Liste der Benutzer einer Rolle manuell verwaltet wird.\n<b>Konditionell</b> bedeutet, dass die Liste der Benutzer einer Rolle durch eine Bedingung automatisch verwaltet wird."
descriptionOfAssignTarget: "<b>Manuell</b> bedeutet, dass die Liste der Benutzer einer Rolle manuell verwaltet wird.\n<b>Konditional</b> bedeutet, dass die Liste der Benutzer einer Rolle durch eine Bedingung automatisch verwaltet wird."
manual: "Manuell"
conditional: "Konditional"
condition: "Bedingung"
@@ -955,6 +1201,9 @@ _role:
baseRole: "Rollenvorlage"
useBaseValue: "Wert der Rollenvorlage verwenden"
chooseRoleToAssign: "Zuzuweisende Rolle auswählen"
iconUrl: "Icon-URL"
asBadge: "Als Abzeichen anzeigen"
descriptionOfAsBadge: "Ist dies aktiviert, so wird das Icon dieser Rolle an der Seite der Namen von Benutzern mit dieser Rolle angezeigt."
canEditMembersByModerator: "Moderatoren können Benutzern diese Rolle zuweisen"
descriptionOfCanEditMembersByModerator: "Wenn aktiviert, so können Moderatoren und Adminstratoren anderen Benutzern diese Rolle zuweisen bzw. diese Zuweisung aufheben. Wenn deaktiviert, so ist es nur Administratoren möglich, Zuweisungen dieser Rolle zu verwalten."
priority: "Priorität"
@@ -966,7 +1215,7 @@ _role:
gtlAvailable: "Kann auf die globale Chronik zugreifen"
ltlAvailable: "Kann auf die lokale Chronik zugreifen"
canPublicNote: "Kann öffentliche Notizen erstellen"
canInvite: "Einladungscodes für diese Instanz erstellen"
canInvite: "Kann Einladungscodes für diese Instanz erstellen"
canManageCustomEmojis: "Benutzerdefinierte Emojis verwalten"
driveCapacity: "Drive-Kapazität"
pinMax: "Maximale Anzahl an angehefteten Notizen"
@@ -979,6 +1228,7 @@ _role:
userEachUserListsMax: "Maximale Anzahl an Benutzerlisten"
rateLimitFactor: "Versuchsanzahl"
descriptionOfRateLimitFactor: "Je niedriger desto weniger restriktiv, je höher destro restriktiver."
canHideAds: "Kann Werbung ausblenden"
_condition:
isLocal: "Lokaler Benutzer"
isRemote: "Benutzer fremder Instanz"
@@ -1023,7 +1273,7 @@ _accountDelete:
_ad:
back: "Zurück"
reduceFrequencyOfThisAd: "Diese Werbung weniger anzeigen"
hide: "Nie anzeigen"
hide: "Ausblenden"
_forgotPassword:
enterEmail: "Gib die Email-Adresse ein, mit der du dich registriert hast. An diese wird ein Link gesendet, mit dem du dein Passwort zurücksetzen kannst."
ifNoEmail: "Solltest du bei der Registrierung keine Email-Adresse angegeben haben, wende dich bitte an den Administrator."
@@ -1079,72 +1329,6 @@ _nsfw:
respect: "Als NSFW markierte Bilder verbergen"
ignore: "Als NSFW markierte Bilder nicht verbergen"
force: "Alle Medien verbergen"
_mfm:
cheatSheet: "MFM Spickzettel"
intro: "MFM ist eine Misskey-exklusive Markup-Sprache, die in Misskey an vielen Stellen verwendet werden kann. Hier kannst du eine Liste von verfügbarer MFM-Syntax einsehen."
dummy: "Misskey erweitert die Welt des Fediverse"
mention: "Erwähnung"
mentionDescription: "Mit At-Zeichen und Benutzername kann ein individueller Nutzer angegeben werden."
hashtag: "Hashtag"
hashtagDescription: "Mit einer Raute und Text kann ein Hashtag angegeben werden."
url: "URL"
urlDescription: "Zeigt URLs an."
link: "Link"
linkDescription: "Zeigt spezifische Textabschnitte als URL an."
bold: "Fett"
boldDescription: "Zeichen zur Betonung dicker erscheinen lassen."
small: "Klein"
smallDescription: "Inhalt klein und dünn erscheinen lassen."
center: "Zentrieren"
centerDescription: "Inhalt zentriert anzeigen."
inlineCode: "Code (Eingebettet)"
inlineCodeDescription: "Syntax-Hervorhebung für (Programm-)Code eingebettet anzeigen."
blockCode: "Code (Block)"
blockCodeDescription: "Syntax-Hervorhebung für mehrzeiligen (Programm-)Code als Block anzeigen."
inlineMath: "Mathe (Eingebettet)"
inlineMathDescription: "Mathematische Formeln (KaTeX) eingebettet anzeigen."
blockMath: "Mathe (Block)"
blockMathDescription: "Mehrzeilige mathematische Formeln (KaTeX) als Block einbetten."
quote: "Zitationen"
quoteDescription: "Inhalt als Zitat anzeigen."
emoji: "Benutzerdefinierte Emojis"
emojiDescription: "Durch das Umschließen von Emoji-Namen durch Doppelpunkte können benutzerdefinierte Emojis angezeigt werden."
search: "Suche"
searchDescription: "Eine vorgefertige Suchanfragebox anzeigen."
flip: "Spiegelung"
flipDescription: "Inhalt horizontal oder vertikal gespiegelt anzeigen."
jelly: "Animation (Dehnen)"
jellyDescription: "Verleiht Inhalt eine sich dehnende Animation."
tada: "Animation (Tada)"
tadaDescription: "Verleiht Inhalt eine Animation mit \"Tada!\"-Gefühl"
jump: "Animation (Sprung)"
jumpDescription: "Verleiht Inhalt eine springende Animation."
bounce: "Animation (Federn)"
bounceDescription: "Verleiht Inhalt eine federnde Animation."
shake: "Animation (Zittern)"
shakeDescription: "Verleiht Inhalt eine zitternde Animation."
twitch: "Animation (Zucken)"
twitchDescription: "Verleiht Inhalt eine sehr stark zuckende Animation."
spin: "Animation (Rotieren)"
spinDescription: "Verleiht Inhalt eine rotierende Animation."
x2: "Groß"
x2Description: "Inhalte größer anzeigen."
x3: "Sehr groß"
x3Description: "Inhalte noch größer anzeigen."
x4: "Unglaublich groß"
x4Description: "Lässt Inhalte noch größer als größer als groß angezeigt werden."
blur: "Weichzeichnen"
blurDescription: "Inhalte durch Weihzeichnung verschwimmen lassen. Durch das Bewegen des Mauszeigers über den Inhalt wird er klar angezeigt."
font: "Schriftart"
fontDescription: "Setzt die Schriftart des Inhaltes fest."
rainbow: "Regenbogen"
rainbowDescription: "Lässt den Inhalt in Regenbogenfarben erscheinen."
sparkle: "Glitzer"
sparkleDescription: "Verleiht Inhalt einen glitzernden Partikeleffekt."
rotate: "Drehen"
rotateDescription: "Dreht den Inhalt um einen angegebenen Winkel."
plain: "Schlicht"
plainDescription: "Deaktiviert jegliche MFM-Syntax, die sich innerhalb dieses MFM-Effekts befindet."
_instanceTicker:
none: "Nie anzeigen"
remote: "Für Benutzer fremder Instanzen anzeigen"
@@ -1349,12 +1533,15 @@ _permissions:
"read:gallery-likes": "Liste deiner mit \"Gefällt mir\" markierten Galerie-Beiträge lesen"
"write:gallery-likes": "Liste deiner mit \"Gefällt mir\" markierten Galerie-Beiträge bearbeiten"
_auth:
shareAccessTitle: "Verteilung von App-Berechtigungen"
shareAccess: "Möchtest du „{name}“ authorisieren, auf dieses Benutzerkonto zugreifen zu können?"
shareAccessAsk: "Bist du dir sicher, dass du diese Anwendung authorisieren möchtest, auf dein Benutzerkonto zugreifen zu können?"
permission: "{name} fordert folgende Berechtigungen"
permissionAsk: "Diese Anwendung fordert folgende Berechtigungen"
pleaseGoBack: "Bitte kehre zur Anwendung zurück"
callback: "Es wird zur Anwendung zurückgekehrt"
denied: "Zugriff verweigert"
pleaseLogin: "Bitte logge dich ein, um Apps zu authorisieren."
_antennaSources:
all: "Alle Notizen"
homeTimeline: "Notizen von Benutzern, denen gefolgt wird"
@@ -1583,6 +1770,7 @@ _notification:
pollEnded: "Umfrageergebnisse sind verfügbar"
unreadAntennaNote: "Antenne {name}"
emptyPushNotificationMessage: "Push-Benachrichtigungen wurden aktualisiert"
achievementEarned: "Errungenschaft freigeschaltet"
_types:
all: "Alle"
follow: "Neue Follower"
@@ -1624,5 +1812,6 @@ _deck:
tl: "Chronik"
antenna: "Antennen"
list: "Listen"
channel: "Kanal"
mentions: "Erwähnungen"
direct: "Direktnachrichten"

View File

@@ -103,6 +103,7 @@ you: "Εσύ"
clickToShow: "Κάντε κλικ για εμφάνιση"
add: "Προσθέστε"
reaction: "Αντιδράσεις"
reactions: "Αντιδράσεις"
reactionSetting: "Αντιδράσεις για εμφάνιση στην επιλογή αντίδρασης"
reactionSettingDescription2: "Σύρετε για να αλλάξετε τη σειρά, κάντε κλικ για να διαγράψετε, πατήστε \"+\" για να προσθέσετε."
rememberNoteVisibility: "Θυμήσου τις ρυθμίσεις ορατότητας σημειώματος"
@@ -297,11 +298,6 @@ cannotUploadBecauseNoFreeSpace: "Το ανέβασμα απέτυχε λόγω
_email:
_follow:
title: "Έχετε ένα νέο ακόλουθο"
_mfm:
mention: "Επισήμανση"
quote: "Παράθεση"
emoji: "Επιπλέον emoji"
search: "Αναζήτηση"
_channel:
featured: "Δημοφιλή"
_theme:

View File

@@ -68,7 +68,7 @@ export: "Export"
files: "Files"
download: "Download"
driveFileDeleteConfirm: "Are you sure you want to delete the file \"{name}\"? Notes with this file attached will also be deleted."
unfollowConfirm: "Are you sure that you want to unfollow {name}?"
unfollowConfirm: "Are you sure you want to unfollow {name}?"
exportRequested: "You've requested an export. This may take a while. It will be added to your Drive once completed."
importRequested: "You've requested an import. This may take a while."
lists: "Lists"
@@ -110,6 +110,7 @@ clickToShow: "Click to show"
sensitive: "NSFW"
add: "Add"
reaction: "Reactions"
reactions: "Reactions"
reactionSetting: "Reactions to show in the reaction picker"
reactionSettingDescription2: "Drag to reorder, click to delete, press \"+\" to add."
rememberNoteVisibility: "Remember note visibility settings"
@@ -128,6 +129,7 @@ unblockConfirm: "Are you sure that you want to unblock this account?"
suspendConfirm: "Are you sure that you want to suspend this account?"
unsuspendConfirm: "Are you sure that you want to unsuspend this account?"
selectList: "Select a list"
selectChannel: "Select a channel"
selectAntenna: "Select an antenna"
selectWidget: "Select a widget"
editWidgets: "Edit widgets"
@@ -255,6 +257,8 @@ noMoreHistory: "There is no further history"
startMessaging: "Start a new chat"
nUsersRead: "read by {n}"
agreeTo: "I agree to {0}"
agreeBelow: "I agree to the below"
basicNotesBeforeCreateAccount: "Important notes"
tos: "Terms of Service"
start: "Begin"
home: "Home"
@@ -463,7 +467,6 @@ youHaveNoGroups: "You have no groups"
joinOrCreateGroup: "Get invited to a group or create your own."
noHistory: "No history available"
signinHistory: "Login history"
disableAnimatedMfm: "Disable MFM with animation"
doing: "Processing..."
category: "Category"
tags: "Tags"
@@ -860,6 +863,8 @@ failedToFetchAccountInformation: "Could not fetch account information"
rateLimitExceeded: "Rate limit exceeded"
cropImage: "Crop image"
cropImageAsk: "Do you want to crop this image?"
cropYes: "Crop"
cropNo: "Use as-is"
file: "File"
recentNHours: "Last {n} hours"
recentNDays: "Last {n} days"
@@ -935,8 +940,247 @@ manageCustomEmojis: "Manage Custom Emojis"
youCannotCreateAnymore: "You've hit the creation limit."
cannotPerformTemporary: "Temporarily unavailable"
cannotPerformTemporaryDescription: "This action cannot be performed temporarily due to exceeding the execution limit. Please wait for a while and then try again."
preset: "Presets"
preset: "Preset"
selectFromPresets: "Choose from presets"
achievements: "Achievements"
gotInvalidResponseError: "Invalid server response"
gotInvalidResponseErrorDescription: "The server may be unreachable or undergoing maintenance. Please try again later."
_achievements:
earnedAt: "Unlocked at"
_types:
_notes1:
title: "just setting up my msky"
description: "Post your first note"
flavor: "Have a good time with Misskey!"
_notes10:
title: "Some notes"
description: "Post 10 notes"
_notes100:
title: "A lot of notes"
description: "Post 100 notes"
_notes500:
title: "Covered in notes"
description: "Post 500 notes"
_notes1000:
title: "A mountain of notes"
description: "Post 1,000 notes"
_notes5000:
title: "Overflowing notes"
description: "Post 5,000 notes"
_notes10000:
title: "Supernote"
description: "Post 10,000 notes"
_notes20000:
title: "Need... more... notes..."
description: "Post 20,000 notes"
_notes30000:
title: "Notes notes notes!"
description: "Post 30,000 notes"
_notes40000:
title: "Note factory"
description: "Post 40,000 notes"
_notes50000:
title: "Planet of notes"
description: "Post 50,000 notes"
_notes60000:
title: "Note quasar"
description: "Post 60,000 notes"
_notes70000:
title: "Note black hole"
description: "Post 70,000 notes"
_notes80000:
title: "Note galaxy"
description: "Post 80,000 notes"
_notes90000:
title: "Note universe"
description: "Post 90,000 notes"
_notes100000:
title: "ALL YOUR NOTE ARE BELONG TO US"
description: "Post 100,000 notes"
flavor: "You sure have a lot to say."
_login3:
title: "Beginner I"
description: "Log in for a total of 3 days"
flavor: "Starting today, just call me Misskist"
_login7:
title: "Beginner II"
description: "Log in for a total of 7 days"
flavor: "Feel like you've gotten the hang of things yet?"
_login15:
title: "Beginner III"
description: "Log in for a total of 15 days"
_login30:
title: "Misskist I"
description: "Log in for a total of 30 days"
_login60:
title: "Misskist II"
description: "Log in for a total of 60 days"
_login100:
title: "Misskist III"
description: "Log in for a total of 100 days"
flavor: "Violent Misskist"
_login200:
title: "Regular I"
description: "Log in for a total of 200 days"
_login300:
title: "Regular II"
description: "Log in for a total of 300 days"
_login400:
title: "Regular III"
description: "Log in for a total of 400 days"
_login500:
title: "Expert I"
description: "Log in for a total of 500 days"
flavor: "My friends, it has often been said that I like notes"
_login600:
title: "Expert II"
description: "Log in for a total of 600 days"
_login700:
title: "Expert III"
description: "Log in for a total of 700 days"
_login800:
title: "Master of Notes I"
description: "Log in for a total of 800 days"
_login900:
title: "Master of Notes II"
description: "Log in for a total of 900 days"
_login1000:
title: "Master of Notes III"
description: "Log in for a total of 1,000 days"
flavor: "Thank you for using Misskey!"
_noteClipped1:
title: "Must... clip..."
description: "Clip your first note"
_noteFavorited1:
title: "Stargazer"
description: "Favorite your first note"
_myNoteFavorited1:
title: "Seeking Stars"
description: "Have somebody else favorite one of your notes"
_profileFilled:
title: "Well-prepared"
description: "Set up your profile"
_markedAsCat:
title: "I Am a Cat"
description: "Mark your account as a cat"
flavor: "I'll give you a name later."
_following1:
title: "Following your first user"
description: "Follow a user"
_following10:
title: "Keep up... keep up..."
description: "Follow 10 users"
_following50:
title: "Lots of friends"
description: "Follow 50 accounts"
_following100:
title: "100 Friends"
description: "Follow 100 accounts"
_following300:
title: "Friend overload"
description: "Follow 300 accounts"
_followers1:
title: "First follower"
description: "Gain 1 follower"
_followers10:
title: "Follow me!"
description: "Gain 10 followers"
_followers50:
title: "Coming in crowds"
description: "Gain 50 followers"
_followers100:
title: "Popular"
description: "Gain 100 followers"
_followers300:
title: "Please form a single line"
description: "Gain 300 followers"
_followers500:
title: "Radio Tower"
description: "Gain 500 followers"
_followers1000:
title: "Influencer"
description: "Gain 1,000 followers"
_collectAchievements30:
title: "Achievement Collector"
description: "Earn 30 achievements"
_viewAchievements3min:
title: "Likes Achievements"
description: "Look at your list of achievements for at least 3 minutes"
_iLoveMisskey:
title: "I Love Misskey"
description: "Post \"I ❤ #Misskey\""
flavor: "Misskey's development team greatly appreciates your support!"
_foundTreasure:
title: "Treasure Hunt"
description: "You've found the hidden treasure"
_client30min:
title: "Short break"
description: "Spend 30 minutes on Misskey"
_noteDeletedWithin1min:
title: "Nevermind"
description: "Delete a note within a minute of posting it"
_postedAtLateNight:
title: "Nocturnal"
description: "Post a note late at night"
flavor: "It's about time to go to bed."
_postedAt0min0sec:
title: "Speaking Clock"
description: "Post a note at 00:00"
flavor: "Click Click Click Claaang"
_selfQuote:
title: "Self-Reference"
description: "Quote your own note"
_htl20npm:
title: "Flowing Timeline"
description: "Have the speed of your home timeline exceed 20 npm (notes per minute)"
_viewInstanceChart:
title: "Analyst"
description: "View your instance's charts"
_outputHelloWorldOnScratchpad:
title: "Hello, world!"
description: "Output \"hello world\" in the Scratchpad"
_open3windows:
title: "Multi-Window"
description: "Have at least 3 windows open at the same time"
_driveFolderCircularReference:
title: "Circular Reference"
description: "Attempt to create a recursively nested folder in Drive"
_reactWithoutRead:
title: "Did you really read that?"
description: "React on a note that's over 100 characters long within 3 seconds of it being posted"
_clickedClickHere:
title: "Click here"
description: "You've clicked here"
_justPlainLucky:
title: "Just Plain Lucky"
description: "Has a chance to be obtained with a probability of 0.01% every 10 seconds"
_setNameToSyuilo:
title: "God Complex"
description: "Set your name to \"syuilo\""
_passedSinceAccountCreated1:
title: "One Year Anniversary"
description: "One year has passed since your account was created"
_passedSinceAccountCreated2:
title: "Two Year Anniversary"
description: "Two years have passed since your account was created"
_passedSinceAccountCreated3:
title: "Three Year Anniversary"
description: "Three years have passed since your account was created"
_loggedInOnBirthday:
title: "Happy Birthday"
description: "Log in on your birthday"
_loggedInOnNewYearsDay:
title: "Happy New Year!"
description: "Logged in on the first day of the year"
flavor: "To another great year on this instance"
_cookieClicked:
title: "A game in which you click cookies"
description: "Clicked the cookie"
flavor: "Wait, are you on the correct website?"
_brainDiver:
title: "Brain Diver"
description: "Post the link to Brain Diver"
flavor: "Misskey-Misskey La-Tu-Ma"
_role:
new: "New role"
edit: "Edit role"
@@ -954,10 +1198,13 @@ _role:
descriptionOfIsPublic: "Anyone will be able to view a list of users assigned to this role. In addition, this role will be displayed in the profiles of assigned users."
options: "Role options"
policies: "Policies"
baseRole: "Base role"
useBaseValue: "Use base role value"
baseRole: "Role template"
useBaseValue: "Use role template value"
chooseRoleToAssign: "Select the role to assign"
canEditMembersByModerator: "Allow moderators to edit the list members of this role"
iconUrl: "Icon URL"
asBadge: "Show as badge"
descriptionOfAsBadge: "This role's icon will be displayed next to the username of users with this role if turned on."
canEditMembersByModerator: "Allow moderators to edit the list of members for this role"
descriptionOfCanEditMembersByModerator: "When turned on, moderators as well as administrators will be able to assign and unassign users to this role. When turned off, only administrators will be able to assign users."
priority: "Priority"
_priority:
@@ -965,11 +1212,11 @@ _role:
middle: "Medium"
high: "High"
_options:
gtlAvailable: "Viewing the global timeline"
ltlAvailable: "Viewing the local timeline"
gtlAvailable: "Can view the global timeline"
ltlAvailable: "Can view the local timeline"
canPublicNote: "Can send public notes"
canInvite: "Create instance invite codes"
canManageCustomEmojis: "Manage Custom Emojis"
canInvite: "Can create instance invite codes"
canManageCustomEmojis: "Can manage custom emojis"
driveCapacity: "Drive capacity"
pinMax: "Maximum number of pinned notes"
antennaMax: "Maximum number of antennas"
@@ -981,7 +1228,7 @@ _role:
userEachUserListsMax: "Maximum number of users within a user list"
rateLimitFactor: "Rate limit"
descriptionOfRateLimitFactor: "Lower rate limits are less restrictive, higher ones more restrictive. "
canHideAds: "Remove ads"
canHideAds: "Can hide ads"
_condition:
isLocal: "Local user"
isRemote: "Remote user"
@@ -1026,7 +1273,7 @@ _accountDelete:
_ad:
back: "Back"
reduceFrequencyOfThisAd: "Show this ad less"
hide: "Never show"
hide: "Hide"
_forgotPassword:
enterEmail: "Enter the email address you used to register. A link with which you can reset your password will then be sent to it."
ifNoEmail: "If you did not use an email during registration, please contact the instance administrator instead."
@@ -1082,72 +1329,6 @@ _nsfw:
respect: "Hide NSFW media"
ignore: "Don't hide NSFW media"
force: "Hide all media"
_mfm:
cheatSheet: "MFM Cheatsheet"
intro: "MFM is a Misskey-exclusive markup language that can be used in many places. Here you can view a list of all available MFM syntax."
dummy: "Misskey expands the world of the Fediverse"
mention: "Mention"
mentionDescription: "You can specify a user by using an At-Symbol and a username."
hashtag: "Hashtag"
hashtagDescription: "You can specify a hashtag using a number sign and text."
url: "URL"
urlDescription: "URLs can be displayed."
link: "Link"
linkDescription: "Specific parts of text can be displayed as a URL."
bold: "Bold"
boldDescription: "Highlights letters by making them thicker."
small: "Small"
smallDescription: "Displays content small and thin."
center: "Center"
centerDescription: "Displays content centered."
inlineCode: "Code (Inline)"
inlineCodeDescription: "Displays inline syntax highlighting for (program) code."
blockCode: "Code (Block)"
blockCodeDescription: "Displays syntax highlighting for multi-line (program) code in a block."
inlineMath: "Math (Inline)"
inlineMathDescription: "Display math formulas (KaTeX) in-line"
blockMath: "Math (Block)"
blockMathDescription: "Display multi-line math formulas (KaTeX) in a block"
quote: "Quote"
quoteDescription: "Displays content as a quote."
emoji: "Custom Emoji"
emojiDescription: "By surrounding a custom emoji name with colons, custom emoji can be displayed."
search: "Search"
searchDescription: "Displays a search box with pre-entered text."
flip: "Flip"
flipDescription: "Flips content horizontally or vertically."
jelly: "Animation (Jelly)"
jellyDescription: "Gives content a jelly-like animation."
tada: "Animation (Tada)"
tadaDescription: "Gives content a \"Tada!\"-like animation."
jump: "Animation (Jump)"
jumpDescription: "Gives content a jumping animation."
bounce: "Animation (Bounce)"
bounceDescription: "Gives content a bouncy animation."
shake: "Animation (Shake)"
shakeDescription: "Gives content a shaking animation."
twitch: "Animation (Twitch)"
twitchDescription: "Gives content a strongly twitching animation."
spin: "Animation (Spin)"
spinDescription: "Gives content a spinning animation."
x2: "Big"
x2Description: "Displays content bigger."
x3: "Very big"
x3Description: "Displays content even bigger."
x4: "Unbelievably big"
x4Description: "Displays content even bigger than bigger than big."
blur: "Blur"
blurDescription: "Blurs content. It will be displayed clearly when hovered over."
font: "Font"
fontDescription: "Sets the font to display content in."
rainbow: "Rainbow"
rainbowDescription: "Makes the content appear in rainbow colors."
sparkle: "Sparkle"
sparkleDescription: "Gives content a sparkling particle effect."
rotate: "Rotate"
rotateDescription: "Turns content by a specified angle."
plain: "Plain"
plainDescription: "Deactivates the effects of all MFM contained within this MFM effect."
_instanceTicker:
none: "Never show"
remote: "Show for remote users"
@@ -1352,12 +1533,15 @@ _permissions:
"read:gallery-likes": "View your list of liked gallery posts"
"write:gallery-likes": "Edit your list of liked gallery posts"
_auth:
shareAccessTitle: "Granting application permissions"
shareAccess: "Would you like to authorize \"{name}\" to access this account?"
shareAccessAsk: "Are you sure you want to authorize this application to access your account?"
permission: "{name} requests the following permissions"
permissionAsk: "This application requests the following permissions"
pleaseGoBack: "Please go back to the application"
callback: "Returning to the application"
denied: "Access denied"
pleaseLogin: "Please log in to authorize applications."
_antennaSources:
all: "All notes"
homeTimeline: "Notes from followed users"
@@ -1586,6 +1770,7 @@ _notification:
pollEnded: "Poll results have become available"
unreadAntennaNote: "Antenna {name}"
emptyPushNotificationMessage: "Push notifications have been updated"
achievementEarned: "Achievement unlocked"
_types:
all: "All"
follow: "New followers"
@@ -1627,5 +1812,6 @@ _deck:
tl: "Timeline"
antenna: "Antennas"
list: "List"
channel: "Channel"
mentions: "Mentions"
direct: "Direct notes"

View File

@@ -56,7 +56,7 @@ reply: "Responder"
loadMore: "Ver más"
showMore: "Ver más"
showLess: "Cerrar"
youGotNewFollower: "te ha seguido"
youGotNewFollower: "ahora te sigue"
receiveFollowRequest: "Recibiste una solicitud de seguimiento"
followRequestAccepted: "La solicitud de seguimiento fue aceptada"
mention: "Menciones"
@@ -110,6 +110,7 @@ clickToShow: "Click para ver"
sensitive: "Marcado como sensible"
add: "Agregar"
reaction: "Reacción"
reactions: "Reacción"
reactionSetting: "Reacciones para mostrar en el menú de reacciones"
reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete la tecla + para añadir."
rememberNoteVisibility: "Recordar visibilidad"
@@ -128,6 +129,7 @@ unblockConfirm: "¿Quiere dejar de bloquear esta cuenta?"
suspendConfirm: "¿Quiere suspender esta cuenta?"
unsuspendConfirm: "¿Quiere dejar de suspender esta cuenta?"
selectList: "Seleccione una lista"
selectChannel: "Seleccionar canal"
selectAntenna: "Seleccionar antena"
selectWidget: "Seleccionar widget"
editWidgets: "Editar widgets"
@@ -255,6 +257,8 @@ noMoreHistory: "El historial se ha acabado"
startMessaging: "Iniciar chat"
nUsersRead: "Leído por {n} personas"
agreeTo: "De acuerdo con {0}"
agreeBelow: "Estoy de acuerdo con lo siguiente"
basicNotesBeforeCreateAccount: "Notas básicas"
tos: "Términos de uso"
start: "Comenzar"
home: "Inicio"
@@ -463,7 +467,6 @@ youHaveNoGroups: "Sin grupos"
joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su propio grupo."
noHistory: "No hay datos en el historial"
signinHistory: "Historial de ingresos"
disableAnimatedMfm: "Deshabilitar MFM que tiene animaciones"
doing: "Voy en camino"
category: "Categoría"
tags: "Etiqueta"
@@ -508,7 +511,7 @@ objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir "
serverLogs: "Registros del servidor"
deleteAll: "Eliminar todos"
showFixedPostForm: "Mostrar el formulario de las entradas encima de la línea de tiempo"
newNoteRecived: "Tienes una nota nuevo"
newNoteRecived: "Tienes una nota nueva"
sounds: "Sonidos"
sound: "Sonidos"
listen: "Escuchar"
@@ -917,17 +920,328 @@ tools: "Utilidades"
cannotLoad: "No se puede cargar."
numberOfProfileView: "Número de vistas de perfil"
like: "¡Muy bien!"
unlike: "Quitar 'me gusta'"
numberOfLikes: "Cantidad de 'Me gusta'"
show: "Apariencia"
neverShow: "No mostrar de nuevo"
remindMeLater: "Recordar después"
didYouLikeMisskey: "¿Te gusta Misskey?"
pleaseDonate: "Misskey es software libre, y es usado por {host} . Por favor, ¡considera donar al proyecto principal para que podamos continuar!"
roles: "Roles"
role: "Roles"
normalUser: "Usuario normal"
undefined: "Indefinido"
assign: "Asignar"
unassign: "Quitar"
color: "Color"
manageCustomEmojis: "Administrar emojis personalizados"
youCannotCreateAnymore: "Se alcanzó el límite de creación"
cannotPerformTemporary: "Indisponible temporalmente"
cannotPerformTemporaryDescription: "Esta acción no se puede realizar porque se excedió el límite de ejecución. Espera un poco y prueba de nuevo."
preset: "Predefinido"
selectFromPresets: "Escoger desde predefinidos"
achievements: "Logros"
gotInvalidResponseError: "Respuesta del servidor inválida"
gotInvalidResponseErrorDescription: "Puede que el servidor esté caído o en mantenimiento. Favor de intentar más tarde"
_achievements:
earnedAt: "Desbloqueado el"
_types:
_notes1:
title: "¡Hola Misskey!"
description: "Publicaste tu primera nota"
flavor: "¡Pasándola bien con Misskey!"
_notes10:
title: "Algunas notas"
description: "10 notas publicadas"
_notes100:
title: "¡Muchas notas!"
description: "100 notas publicadas"
_notes500:
title: "¡Cubierto de notas!"
description: "500 notas publicadas"
_notes1000:
title: "¡Una montaña de notas!"
description: "1000 notas publicadas"
_notes5000:
title: "¡Exceso de notas!"
description: "5000 notas publicadas"
_notes10000:
title: "¡Súpernota!"
description: "10000 notas publicadas"
_notes20000:
title: "Necesito... Más... ¡Notas!"
description: "20000 notas publicadas"
_notes30000:
title: "¡Notas! ¡Notas! ¡Notas!"
description: "30000 notas publicadas"
_notes40000:
title: "Fábrica de notas"
description: "40000 notas publicadas"
_notes50000:
title: "¡Un planeta de notas!"
description: "50000 notas publicadas"
_notes60000:
title: "¡Un cuásar de notas!"
description: "60000 notas publicadas"
_notes70000:
title: "¡Un hoyo negro de notas!"
description: "70000 notas publicadas"
_notes80000:
title: "¡Una galaxia de notas!"
description: "80000 notas publicadas"
_notes90000:
title: "¡Todo un universo de notas!"
description: "90000 notas publicadas"
_notes100000:
title: "ALL YOUR NOTE ARE BELONG TO US"
description: "100000 notas publicadas"
flavor: "¿Tienes tanto para publicar?"
_login3:
title: "Principiante I"
description: "Días desde el inicio de sesión: 3"
flavor: "Desde hoy, soy Misskero"
_login7:
title: "Principiante II"
description: "Días desde el inicio de sesión: 7"
flavor: "¿Ya te acostumbraste?"
_login15:
title: "Principiante III"
description: "Días desde el inicio de sesión: 15"
_login30:
title: "Misskero I"
description: "Días desde el inicio de sesión: 30"
_login60:
title: "Misskero II"
description: "Días desde el inicio de sesión: 60"
_login100:
title: "Misskero III"
description: "Días desde el inicio de sesión: 100"
flavor: "Para este usuario, Misskaína"
_login200:
title: "Regular I"
description: "Días desde el inicio de sesión: 200"
_login300:
title: "Regular II"
description: "Días desde el inicio de sesión: 300"
_login400:
title: "Regular III"
description: "Días desde el inicio de sesión: 400"
_login500:
title: "Veterano I"
description: "Días desde el inicio de sesión: 500"
flavor: "Chicos, me encantan las libretas..."
_login600:
title: "Veterano II"
description: "Días desde el inicio de sesión: 600"
_login700:
title: "Veterano III"
description: "Días desde el inicio de sesión: 700"
_login800:
title: "Maestro I"
description: "Días desde el inicio de sesión: 800"
_login900:
title: "Maestro II"
description: "Días desde el inicio de sesión: 900"
_login1000:
title: "Maestro III"
description: "Días desde el inicio de sesión: 1000"
flavor: "¡Gracias por usar Misskey!"
_noteClipped1:
title: "No puedo evitar clipearte..."
description: "Hacer un clip por primera vez"
_noteFavorited1:
title: "Contemplando las estrellas"
description: "Poner una nota como favorito por primera vez"
_myNoteFavorited1:
title: "¡Quiero una estrella!"
description: "Tu nota ha sido marcada como favorito por primera vez"
_profileFilled:
title: "¡Listo!"
description: "Perfil completado"
_markedAsCat:
title: "Soy un gato"
description: "Configurar la cuenta como cuenta de un gato"
flavor: "Aún no tengo nombre"
_following1:
title: "Primera vez siguiendo a alguien"
description: "Seguir a un usuario"
_following10:
title: "Ahí la llevas, ahí la llevas..."
description: "10 usuarios seguidos"
_following50:
title: "¡Un puñado de amigos!"
description: "50 cuentas seguidas"
_following100:
title: "100 amigos"
description: "100 cuentas seguidas"
_following300:
title: "¡Sobrecarga de amigos!"
description: "300 cuentas seguidas"
_followers1:
title: "¡Tu primer seguidor!"
description: "1 seguidor ganado"
_followers10:
title: "¡Sígueme!"
description: "10 seguidores ganados"
_followers50:
title: "Viniendo en manada"
description: "50 seguidores ganados"
_followers100:
title: "Popular"
description: "100 cuentas seguidas"
_followers300:
title: "Por favor, hagan una fila"
description: "300 seguidores ganados"
_followers500:
title: "¡Toda una torre de radio!"
description: "500 seguidores ganados"
_followers1000:
title: "\"Influyente\""
description: "1000 seguidores gandos"
_collectAchievements30:
title: "Coleccionista"
description: "30 logros ganados"
_viewAchievements3min:
title: "¡Te gustan los logros!"
description: "Mirando tus logros por 3 minutos"
_iLoveMisskey:
title: "¡AMO Misskey!"
description: "\"I ❤ #Misskey\" Publicado"
flavor: "El equipo de desarrollo de Misskey, en verdad, ¡aprecia tu apoyo!"
_foundTreasure:
title: "Búsqueda del tesoro"
description: "Encontraste un tesoro"
_client30min:
title: "Un descansito"
description: "30 minutos dedicados a Misskey"
_noteDeletedWithin1min:
title: "Ah... Mejor no..."
description: "Borrar una nota antes que de pase 1 minuto"
_postedAtLateNight:
title: "Nocturno"
description: "Una nota publicada por la noche"
flavor: "¡Ya casi es hora de dormir!"
_postedAt0min0sec:
title: "Reloj parlante"
description: "Publicar una nota a las 00:00 de la madrugada"
flavor: "Tic, tic, tic ¡TUUUUUN!"
_selfQuote:
title: "Autoreferencia"
description: "Citar tu propia nota"
_htl20npm:
title: "Línea de tiempo fluyendo"
description: "La velocidad de tu línea de tiempo excede las 20 npm (notas por minuto)"
_viewInstanceChart:
title: "Analista"
description: "Gráficas de la instancia mostradas"
_outputHelloWorldOnScratchpad:
title: "¡Hola mundo!"
description: "Escribir \"hello world\" en el compositor"
_open3windows:
title: "Multiventana"
description: "Tener más de 3 ventanas al mismo tiempo"
_driveFolderCircularReference:
title: "Referencia circular"
description: "Intento de crear carpetas recursivamente"
_reactWithoutRead:
title: "¡Sí lo leíste bien?"
description: "Reaccionar a los 3 segundos de publicación de una nota con más de 100 caracteres"
_clickedClickHere:
title: "Pícale aquí"
description: "Le picó ahí"
_justPlainLucky:
title: "Pura suerte"
description: "Obtenido con una probabilidad del 0.01% cada 10 segundos"
_setNameToSyuilo:
title: "Complejo de superioridad"
description: "Configurar el nombre como 'Syuilo'"
_passedSinceAccountCreated1:
title: "Primer aniversario"
description: "Pasó un año desde la creación de la cuenta"
_passedSinceAccountCreated2:
title: "Segundo aniversario"
description: "Pasaron dos años desde la creación de la cuenta"
_passedSinceAccountCreated3:
title: "Tercer aniversario"
description: "Pasaron tres años desde la creación de la cuenta"
_loggedInOnBirthday:
title: "¡Feliz cumpleaños!"
description: "En linea el día de tu cumpleaños"
_loggedInOnNewYearsDay:
title: "¡Feliz Año Nuevo!"
description: "En linea en año nuevo"
flavor: "¡Gracias por tu apoyo a la instancia durante todo este año!"
_cookieClicked:
title: "Un juego para picarle a una galleta"
description: "Picaste una galleta"
flavor: "¿Está mal este juego?"
_brainDiver:
title: "Brain Diver"
description: "Publicaste un vínculo a \"Brain Diver\""
flavor: "Misskey-Misskey La-Tu-Ma"
_role:
new: "Crear rol"
edit: "Editar rol"
name: "Nombre del rol"
description: "Descripción del rol"
permission: "Permisos del rol"
descriptionOfPermission: "<b>Moderador</b> Te permite ejecutar acciones básicas de moderación.\n<b>Administradores</b> puede cambiar todas las configuraciones de la instancia."
assignTarget: "Asignar objetivo"
descriptionOfAssignTarget: "<b>Manual</b> Para cambiar manualmente lo que se incluye en este rol.\n<b>Condicional</b> configura una condición, y los usuarios que cumplan la condición serán incluídos automáticamente."
manual: "manual"
conditional: "condicional"
condition: "condición"
isConditionalRole: "Esto es un rol condicional"
isPublic: "Publicar rol"
descriptionOfIsPublic: "Cualquiera puede ver los usuarios asignados a este rol. También, el perfil del usuario mostrará este rol."
options: "Opción"
policies: "Política"
baseRole: "Rol base"
useBaseValue: "Usar los valores del rol base"
chooseRoleToAssign: "Selecciona el rol para asignar"
iconUrl: "URL del ícono"
asBadge: "Mostrar como emblema"
descriptionOfAsBadge: "Este ícono de rol se mostrará a lado del nombre de usuario cuando este rol se encuentre activo."
canEditMembersByModerator: "Permitir a los moderadores editar los miembros"
descriptionOfCanEditMembersByModerator: "Si se activa, los moderadores, al igual que los administradores, serán capaces de asignar/quitar usuarios a éste rol. Si se desactiva, sólo los administradores podrán hacerlo."
priority: "Prioridad"
_priority:
low: "Baja"
middle: "Mediano"
high: "Alta"
_options:
gtlAvailable: "Explorar la línea de tiempo global"
ltlAvailable: "Explorar la línea de tiempo local"
canPublicNote: "Permitir la publicación"
canInvite: "Puede crear códigos de invitación"
canManageCustomEmojis: "Administrar emojis personalizados"
driveCapacity: "Capacidad de almacenamiento"
pinMax: "Máximo de notas fijadas"
antennaMax: "Máximo de antenas"
wordMuteMax: "Máximo de caracteres en palabras silenciadas"
webhookMax: "Máximo de Webhooks"
clipMax: "Máximo de clips"
noteEachClipsMax: "Máximo de notas con clip"
userListMax: "Máximo de listas de usuarios"
userEachUserListsMax: "Máximo de usuarios en una lista"
rateLimitFactor: "Limitador"
descriptionOfRateLimitFactor: "Límites más bajos son menos restrictivos, más altos menos restrictivos"
canHideAds: "Puede ocultar anuncios"
_condition:
isLocal: "Usuario local"
isRemote: "Usuario remoto"
createdLessThan: "Menos de X han pasado desde la creación de la cuenta"
createdMoreThan: "Más de X han pasado desde la creación de la cuenta"
followersLessThanOrEq: "Tiene X o menos seguidores"
followersMoreThanOrEq: "Tiene X o más seguidores"
followingLessThanOrEq: "Sigue X o menos cuentas"
followingMoreThanOrEq: "Sigue X o más cuentas"
and: "Condicional AND"
or: "Condicional OR"
not: "Condicional NOT"
_sensitiveMediaDetection:
description: "Reduce el esfuerzo de la moderación el el servidor a través del reconocimiento automático de contenido NSFW usando 'Machine Learning'. Esto puede incrementar ligeramente la carga en el servidor."
sensitivity: "Sensibilidad de detección"
description: "Reduce el esfuerzo de la moderación en el servidor a través del reconocimiento automático de contenido NSFW usando 'Machine Learning'. Esto puede incrementar ligeramente la carga en el servidor."
sensitivity: "Sensibilidad de la detección"
sensitivityDescription: "Reducir la sensibilidad puede acarrear a varios falsos positivos, mientras que incrementarla puede reducir las detecciones (falsos negativos)."
setSensitiveFlagAutomatically: "Marcar como NSFW"
setSensitiveFlagAutomaticallyDescription: "Los resultados de la detección interna pueden ser retenidos incluso si la opción está desactivada."
@@ -1013,72 +1327,6 @@ _nsfw:
respect: "Ocultar medios NSFW"
ignore: "No esconder medios NSFW "
force: "Ocultar todos los medios"
_mfm:
cheatSheet: "Hoja de referencia de MFM"
intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares dentro de Misskey. Aquí puede ver una lista de sintaxis disponibles en MFM."
dummy: "Misskey expande el mundo de la Fediverso"
mention: "Menciones"
mentionDescription: "El signo @ seguido de un nombre de usuario se puede utilizar para notificar a un usuario en particular."
hashtag: "Hashtag"
hashtagDescription: "Puede especificar un hashtag con un numeral y el texto."
url: "URL"
urlDescription: "Se pueden mostrar las URL"
link: "Vínculo"
linkDescription: "Se pueden asociar partes de texto a la URL"
bold: "Negrita"
boldDescription: "Muestra el texto con las letras más gruesas"
small: "Pequeño"
smallDescription: "Muestra el texto más pequeño y delgado"
center: "Centrar"
centerDescription: "Muestra el texto centrado"
inlineCode: "Código (insertado)"
inlineCodeDescription: "Muestra el código de un programa resaltando su sintaxis"
blockCode: "Código (bloque)"
blockCodeDescription: "Código de resaltado de sintaxis, como programas de varias líneas con bloques."
inlineMath: "Fórmula (insertado)"
inlineMathDescription: "Muestra fórmulas (KaTeX) insertadas"
blockMath: "Fórmula (bloque)"
blockMathDescription: "Muestra fórmulas (KaTeX) de varias líneas en un bloque"
quote: "Citar"
quoteDescription: "Muestra el contenido como una cita"
emoji: "Emojis personalizados"
emojiDescription: "Muestra los emojis personalizados encerrados entre dos puntos."
search: "Buscar"
searchDescription: "Muestra una caja de búsqueda con texto pre-escrito"
flip: "Echar de un capirotazo"
flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda / derecha."
jelly: "Animación (gelatina)"
jellyDescription: "Aplica un efecto de animación tipo gelatina"
tada: "Animación (tadá)"
tadaDescription: "Aplica un efecto de animación al estilo \"Tadá\""
jump: "Animación (saltar)"
jumpDescription: "Aplica un efecto de animación tipo salto"
bounce: "Animación (rebotar)"
bounceDescription: "Aplica un efecto de animación tipo rebote"
shake: "Animación (temblor)"
shakeDescription: "Aplica un efecto de animación tipo temblor"
twitch: "Animación (sacudida)"
twitchDescription: "Aplica un efecto de animación tipo sacudida"
spin: "Animación (giro)"
spinDescription: "Aplica un efecto de animación tipo rotación"
x2: "Grande"
x2Description: "Muestra el contenido más grande"
x3: "Muy grande"
x3Description: "Muestra el contenido mucho más grande"
x4: "Totalmente grande"
x4Description: "Muestra el contenido totalmente grande"
blur: "Desenfoque"
blurDescription: "Para desenfocar el contenido. Se muestra claramente al colocar el puntero encima."
font: "Fuente"
fontDescription: "Elegir la fuente del contenido"
rainbow: "Arcoíris"
rainbowDescription: "Muestra el contenido con los colores del arcoíris"
sparkle: "Parpadeante"
sparkleDescription: "Aplica un efecto de partículas parpadeantes"
rotate: "Rotar"
rotateDescription: "Rota el contenido a un ángulo especificado."
plain: "Plano"
plainDescription: "Desactiva los efectos de todo el contenido MFM con este efecto MFM."
_instanceTicker:
none: "No mostrar"
remote: "Mostrar a usuarios remotos"
@@ -1283,12 +1531,15 @@ _permissions:
"read:gallery-likes": "Ver favoritos de la galería"
"write:gallery-likes": "Editar favoritos de la galería"
_auth:
shareAccessTitle: "Permisos de la aplicación"
shareAccess: "¿Desea permitir el acceso a la cuenta \"{name}\"?"
shareAccessAsk: "¿Está seguro de que desea autorizar esta aplicación para acceder a su cuenta?"
permission: "{name} solicita los siguientes permisos"
permissionAsk: "Esta aplicación requiere los siguientes permisos"
pleaseGoBack: "Por favor, vuelve a la aplicación"
callback: "Volviendo a la aplicación"
denied: "Acceso denegado"
pleaseLogin: "Se requiere un inicio de sesión para darle permisos a la aplicación"
_antennaSources:
all: "Todas las notas"
homeTimeline: "Notas de los usuarios que sigues"
@@ -1327,10 +1578,12 @@ _widgets:
jobQueue: "Cola de trabajos"
serverMetric: "Estadísticas del servidor"
aiscript: "Consola de AiScript"
aiscriptApp: "Aplicación AiScript"
aichan: "indigo"
userList: "Lista de usuarios"
_userList:
chooseList: "Seleccione una lista"
clicker: "Cliqueador"
_cw:
hide: "Ocultar"
show: "Ver más"
@@ -1433,7 +1686,16 @@ _timelines:
social: "Social"
global: "Global"
_play:
new: "Crear guión"
edit: "Editar guión"
created: "Guión creado"
updated: "Guión editado"
deleted: "Guión eliminado"
pageSetting: "Configuración de guión"
editThisPage: "Editar este guión"
viewSource: "Ver la fuente"
my: "Mis guiones"
liked: "Guiones que te gustaron"
featured: "Popular"
title: "Título"
script: "Script"
@@ -1506,6 +1768,7 @@ _notification:
pollEnded: "Estan disponibles los resultados de la encuesta"
unreadAntennaNote: "Antena {name}"
emptyPushNotificationMessage: "Se han actualizado las notificaciones push"
achievementEarned: "Logro desbloqueado"
_types:
all: "Todo"
follow: "Siguiendo"
@@ -1547,5 +1810,6 @@ _deck:
tl: "Linea de tiempo"
antenna: "Antenas"
list: "Listas"
channel: "Canal"
mentions: "Menciones"
direct: "Mensaje directo"

View File

@@ -110,6 +110,7 @@ clickToShow: "Cliquer pour afficher"
sensitive: "Contenu sensible"
add: "Ajouter"
reaction: "Réactions"
reactions: "Réactions"
reactionSetting: "Réactions à afficher dans le sélecteur de réactions"
reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser « + » pour ajouter."
rememberNoteVisibility: "Activer l'option \" se souvenir de la visibilité des notes \" vous permet de réutiliser automatiquement la visibilité utilisée lors de la publication de votre note précédente."
@@ -463,7 +464,6 @@ youHaveNoGroups: "Vous navez aucun groupe"
joinOrCreateGroup: "Vous pouvez être invité·e à rejoindre des groupes existants ou créer votre propre nouveau groupe."
noHistory: "Pas d'historique"
signinHistory: "Historique de connexion"
disableAnimatedMfm: "Désactiver MFM ayant des animations"
doing: "En cours..."
category: "Catégorie"
tags: "Étiquettes"
@@ -1010,72 +1010,6 @@ _nsfw:
respect: "Cacher les médias marqués comme contenu sensible"
ignore: "Afficher les médias sensibles"
force: "Cacher tous les médias"
_mfm:
cheatSheet: "Antisèche MFM"
intro: "MFM est un langage Markdown spécifique utilisable ici et là dans Misskey. Vous pouvez vérifier ici les structures utilisables avec MFM."
dummy: "La Fédiverse s'agrandit avec Misskey"
mention: "Mentionner"
mentionDescription: "Vous pouvez afficher un utilisateur spécifique en indiquant une arobase suivie d'un nom d'utilisateur"
hashtag: "Hashtags"
hashtagDescription: "Vous pouvez afficher un mot-dièse en utilisant un croisillon et du texte"
url: "URL"
urlDescription: "L'adresse web peut être affichée."
link: "Lien"
linkDescription: "Une partie précise d'une phrase peut être liée à l'adresse web."
bold: "Gras"
boldDescription: "Il est possible de mettre le texte en exergue en le mettant en gras."
small: "Diminuer l'emphase"
smallDescription: "Le contenu peut être affiché en petit et fin."
center: "Centrer"
centerDescription: "Le contenu peut être centré"
inlineCode: "Code (inline)"
inlineCodeDescription: "Coloration syntaxique des lignes de code."
blockCode: "Bloc de code"
blockCodeDescription: "Coloration syntaxique des lignes de code pour les blocs multi-lignes."
inlineMath: "Formule mathématique (inline)"
inlineMathDescription: "Afficher les formules mathématiques (KaTeX)."
blockMath: "Formule mathématique (bloc)"
blockMathDescription: "Afficher les formules mathématiques (KaTeX) multi-lignes dans un bloc."
quote: "Citer"
quoteDescription: "Affiche le contenu sous forme de citation."
emoji: "Émojis personnalisés"
emojiDescription: "Entourez le nom de l'émoji personnalisé de deux points pour l'afficher."
search: "Rechercher"
searchDescription: "Affiche une boîte de recherche avec du texte pré-saisi."
flip: "Inverser"
flipDescription: "Rotation verticale ou horizontale du contenu"
jelly: "Animation (Gelée)"
jellyDescription: "Donne une animation d'étirement."
tada: "Animation (Tada)"
tadaDescription: "Donne une animation qui donne une impression de \"Tada !\""
jump: "Animation (Saut)"
jumpDescription: "Donne une animation qui saute."
bounce: "Animation (Rebond)"
bounceDescription: "Donne une animation de rebondissement."
shake: "Animation (Secousse)"
shakeDescription: "Donne une animation tremblante."
twitch: "Animation (Tremblement)"
twitchDescription: "Donne une animation de tremblement intense."
spin: "Animation (Rotation)"
spinDescription: "Donne une animation de rotation."
x2: "Grand"
x2Description: "Afficher le contenu en grand."
x3: "Très grand"
x3Description: "Afficher le contenu en très grand."
x4: "Plus grand"
x4Description: "Afficher le contenu en plus grand."
blur: "Flou"
blurDescription: "Le contenu peut être flouté ; il sera visible en le survolant avec le curseur."
font: "Police de caractères"
fontDescription: "Il est possible de choisir la police."
rainbow: "Arc-en-ciel"
rainbowDescription: "Permet d'afficher le contenu en couleurs arc-en-ciel."
sparkle: "Paillettes"
sparkleDescription: "Ajoute un effet scintillant au contenu."
rotate: "Pivoter"
rotateDescription: "Faire pivoter à un angle spécifié."
plain: "Vu texte non formaté"
plainDescription: "Désactive toute la syntaxe interne."
_instanceTicker:
none: "Cacher "
remote: "Montrer pour les utilisateur·ice·s distant·e·s"
@@ -1540,5 +1474,6 @@ _deck:
tl: "Fil"
antenna: "Antennes"
list: "Listes"
channel: "Canaux"
mentions: "Mentions"
direct: "Direct"

View File

@@ -2,6 +2,7 @@
_lang_: "Bahasa Indonesia"
headlineMisskey: "Jaringan terhubung melalui catatan"
introMisskey: "Selamat datang! Misskey adalah perangkat mikroblog tercatu bersifat sumber terbuka.\nMulailah menuliskan catatan, bagikan peristiwa terkini, serta ceritakan segala tentangmu.📡\nTunjukkan juga reaksimu pada catatan pengguna lain.👍\nMari jelajahi dunia baru🚀"
poweredByMisskeyDescription: "{name} adalah sebuah layanan (instance) yang menggunakan platform sumber terbuka <b>Misskey</b>."
monthAndDay: "{day} {month}"
search: "Penelusuran"
notifications: "Pemberitahuan"
@@ -12,6 +13,7 @@ fetchingAsApObject: "Mengambil data dari Fediverse..."
ok: "OK"
gotIt: "Saya mengerti"
cancel: "Batalkan"
noThankYou: "Tidak sekarang."
enterUsername: "Masukkan nama pengguna"
renotedBy: "direnote oleh {user}"
noNotes: "Tidak ada catatan"
@@ -47,6 +49,7 @@ deleteAndEdit: "Hapus dan sunting"
deleteAndEditConfirm: "Apakah kamu yakin ingin menghapus note ini dan menyuntingnya? Kamu akan kehilangan semua reaksi, renote dan balasan di note ini."
addToList: "Tambahkan ke daftar"
sendMessage: "Kirim pesan"
copyRSS: "Salin RSS"
copyUsername: "Salin nama pengguna"
searchUser: "Cari pengguna"
reply: "Balas"
@@ -107,6 +110,7 @@ clickToShow: "Klik untuk melihat"
sensitive: "Konten sensitif"
add: "Tambahkan"
reaction: "Reaksi"
reactions: "Reaksi"
reactionSetting: "Reaksi untuk dimunculkan di bilah reaksi"
reactionSettingDescription2: "Geser untuk memindah urutkan, klik untuk menghapus, tekan \"+\" untuk menambahkan"
rememberNoteVisibility: "Ingat pengaturan visibilitas catatan"
@@ -203,6 +207,7 @@ done: "Selesai"
processing: "Memproses"
preview: "Pratinjau"
default: "Bawaan"
defaultValueIs: "Bawaan: {value}"
noCustomEmojis: "Tidak ada emoji kustom"
noJobs: "Tidak ada kerja"
federating: "memfederasi"
@@ -346,6 +351,8 @@ recaptcha: "reCAPTCHA"
enableRecaptcha: "Nyalakan reCAPTCHA"
recaptchaSiteKey: "Site key"
recaptchaSecretKey: "Secret Key"
turnstile: "Turnstile"
enableTurnstile: "Nyalakan Turnstile"
turnstileSiteKey: "Site key"
turnstileSecretKey: "Secret Key"
avoidMultiCaptchaConfirm: "Menggunakan banyak Captcha dapat menyebabkan gangguan. Apakah kamu ingin untuk menonaktifkan Captcha yang lain? Kamu dapat membiarkan fitur ini tetap aktif dengan menekan tombol batal."
@@ -383,6 +390,7 @@ administrator: "Admin"
token: "Token"
twoStepAuthentication: "Otentikasi dua faktor"
moderator: "Moderator"
moderation: "Moderasi"
nUsersMentioned: "{n} pengguna disebut"
securityKey: "Kunci keamanan"
securityKeyName: "Nama kunci"
@@ -449,12 +457,13 @@ language: "Bahasa"
uiLanguage: "Bahasa antarmuka pengguna"
groupInvited: "Telah diundang ke grup"
aboutX: "Tentang {x}"
emojiStyle: "Gaya emoji"
native: "Native"
disableDrawer: "Jangan gunakan menu bergaya laci"
youHaveNoGroups: "Kamu tidak memiliki grup"
joinOrCreateGroup: "Bergabunglah dengan grup atau kamu dapat membuat grupmu sendiri."
noHistory: "Tidak ada riwayat"
signinHistory: "Riwayat masuk"
disableAnimatedMfm: "Nonaktifkan MFM dengan animasi"
doing: "Sedang berkerja..."
category: "Kategori"
tags: "Tandai"
@@ -561,6 +570,7 @@ author: "Pembuat"
leaveConfirm: "Ada perubahan yang belum disimpan. Apakah kamu ingin membuangnya?"
manage: "Manajemen"
plugins: "Plugin"
preferencesBackups: "Aturan pencadangan"
deck: "Dek"
undeck: "Keluar dari dek"
useBlurEffectForModal: "Gunakan efek buram untuk modal"
@@ -706,6 +716,7 @@ accentColor: "Aksen"
textColor: "Teks"
saveAs: "Simpan sebagai…"
advanced: "Tingkat lanjut"
advancedSettings: "Pengaturan Lanjut"
value: "Nilai"
createdAt: "Dibuat pada"
updatedAt: "Diperbarui pada"
@@ -850,22 +861,213 @@ rateLimitExceeded: "Batas sudah terlampaui"
cropImage: "potong gambar"
cropImageAsk: "Ingin memotong gambar?"
file: "Berkas"
recentNHours: "{n} jam terakhir"
recentNDays: "{n} hari terakhir"
noEmailServerWarning: "Mail Server tidak disetel."
thereIsUnresolvedAbuseReportWarning: "Ada laporan yang belum diselesaikan."
recommended: "Disarankan"
check: "Cek"
driveCapOverrideLabel: "Ubah kapasitas drive untuk user ini"
driveCapOverrideCaption: "Setel ulang kapasitas ke bawaan dengan memasukkan nilai 0 atau lebih rendah."
requireAdminForView: "Kamu harus login dengan akun administrator untuk melihat ini."
isSystemAccount: "Akun yang dibuat dan otomatis dioperasikan oleh sistem."
typeToConfirm: "Mohon masukkan {x} untuk mengonfirmasi"
deleteAccount: "Hapus Akun"
document: "Dokumen"
numberOfPageCache: "Jumlah halaman ditembolokkan"
numberOfPageCacheDescription: "Menaikkan jumlah ini akan meningkatkan kenyamanan untuk pengguna, namun dapat menyebabkan lonjakan beban pada peladen dan juga memori yang digunakan."
logoutConfirm: "Anda yakin ingin keluar?"
lastActiveDate: "Terakhir digunakan"
statusbar: "Bilah status"
pleaseSelect: "Pilih opsi..."
reverse: "Balik"
colored: "Diwarnai"
refreshInterval: "Jeda pembaharuan"
label: "Label"
type: "Tipe"
speed: "Kecepatan"
slow: "Lambat"
fast: "Cepat"
sensitiveMediaDetection: "Deteksi media NSFW"
localOnly: "Hanya lokal"
remoteOnly: "Hanya remot"
failedToUpload: "Gagal mengunggah"
cannotUploadBecauseInappropriate: "Berkas ini tidak dapat diunggah karena sebagian dari berkas terdeteksi berpotensi NSFW."
cannotUploadBecauseNoFreeSpace: "Gagal mengunggah karena kekurangan kapasitas Drive."
beta: "Beta"
enableAutoSensitive: "Penandaan NSFW otomatis"
enableAutoSensitiveDescription: "Mendeteksi otomatis dan menandai media NSFW menggunakan Machine Learning jika memungkinkan. Meskipun opsi ini dimatikan, ada kemungkinan dinyalakan secara menyeluruh pada instansi peladen."
activeEmailValidationDescription: "Membolehkan validasi alamat surel ketat dengan mengecek apakah alamat surel tersebut temporer dan bisa berkomunikasi dengan surel tersebut. Ketidak tidak dicentang, hanya format surel yang divalidasi."
navbar: "Bilah navigasi"
shuffle: "Acak"
account: "Akun"
move: "Pindah"
pushNotification: "Pemberitahuan push"
subscribePushNotification: "Nyalakan pemberitahuan push"
unsubscribePushNotification: "Matikan pemberitahuan push"
pushNotificationAlreadySubscribed: "Pemberitahuan push telah dinyalakan"
pushNotificationNotSupported: "Browser atau instansi kamu tidak mendukung pemberitahuan push"
sendPushNotificationReadMessage: "Hapus pemberitahuan push ketika pemberitahuan relevan atau pesan telah dibaca"
sendPushNotificationReadMessageCaption: "Pemberitahuan berisi teks「{emptyPushNotificationMessage}」akan ditampilkan dalam waktu pendek. Ini mungkin dapat menambah pemakaian baterai pada perangkat kamu."
windowMaximize: "Maksimalkan"
windowRestore: "Kembalikan"
caption: "Keterangan"
loggedInAsBot: "Sedang login sebagai bot"
tools: "Alat"
cannotLoad: "Tidak dapat memuat"
numberOfProfileView: "tayang profil"
like: "Suka"
unlike: "Tidak Suka"
numberOfLikes: "Jumlah yang disukai"
show: "Tampilkan"
neverShow: "Jangan tampilkan lagi"
remindMeLater: "Mungkin nanti"
didYouLikeMisskey: "Apakah kamu mulai menyukai Misskey?"
pleaseDonate: "{host} menggunakan perangkat lunak bebas yaitu Misskey. Kami sangat mengapresiasi sekali donasi dari kamu agar pengembangan Misskey tetap dapat berlanjut!"
roles: "Peran"
role: "Peran"
color: "Warna"
_achievements:
_types:
_login7:
description: "Login selama 7 hari"
flavor: "Sudah mulai terbiasa?"
_login15:
title: "Pemula III"
description: "Login selama 15 hari"
_login30:
title: "Misskist I"
description: "Login selama 30 hari"
_login60:
title: "Misskist II"
description: "Login selama 60 hari"
_login100:
title: "Misskist III"
description: "Login selama 100 hari"
flavor: "Violent Misskist"
_login200:
title: "Reguler I"
description: "Login selama 200 hari"
_login300:
title: "Reguler II"
description: "Login selama 300 hari"
_login400:
title: "Reguler III"
description: "Login selama 400 hari"
_login500:
title: "Veteran I"
description: "Login selama 500 hari"
flavor: "Kawanku, aku suka catatan."
_login600:
title: "Veteran II"
description: "Login selama 600 hari"
_login700:
title: "Veteran III"
description: "Login selama 700 hari"
_login800:
title: "Sepuh Catatan I"
description: "Login selama 800 hari"
_login900:
title: "Sepuh Catatan II"
description: "Login selama 900 hari"
_login1000:
title: "Sepuh Catatan III"
description: "Login selama 1000 hari"
flavor: "Terima kasih telah menggunakan Misskey!"
_noteClipped1:
title: "Harus... Ngeklip..."
description: "Klip catatan pertamamu"
_noteFavorited1:
title: "Pengamat Bintang"
description: "Favoritkan catatan pertamamu"
_myNoteFavorited1:
title: "Pencari Bintang"
description: "Minta orang lain memfavoritkan salah satu catatanmu"
_profileFilled:
title: "Siap Sedia"
description: "Atur profil kamu"
_markedAsCat:
title: "Aku Seekor Kucing"
description: "Tandai akunmu sebagai kucing"
flavor: "Aku beri kamu nama nanti"
_following1:
title: "Ikuti pengguna lain pertamamu"
description: "Ikuti pengguna"
_following10:
title: "Terusin... terusin..."
description: "Ikuti 10 pengguna lain"
_following50:
title: "Banyak teman"
description: "Ikuti 50 pengguna lain"
_following100:
title: "100 Teman"
description: "Ikuti 100 pengguna lain"
_clickedClickHere:
description: "Kamu telah mengeklik disini"
_justPlainLucky:
title: "Lagi Beruntung"
description: "Mendapatkan kesempatan dengan kemungkinan 0.01% setiap 10 detik"
_setNameToSyuilo:
title: "God Complex"
description: "Atur namamu jadi \"syuilo\""
_passedSinceAccountCreated1:
title: "Perayaan Satu Tahun"
description: "Satu tahun telah lewat sejak akunmu dibuat"
_passedSinceAccountCreated2:
title: "Perayaan Dua Tahun"
description: "Dua tahun telah lewat sejak akunmu dibuat"
_passedSinceAccountCreated3:
title: "Perayaan Tiga Tahun"
description: "Tiga tahun telah lewat sejak akunmu dibuat"
_loggedInOnBirthday:
title: "Selamat Ulang Tahun"
description: "Login di hari ulang tahunmu"
_loggedInOnNewYearsDay:
title: "Selamat Tahun Baru!"
description: "Login di hari pertama tahun baru"
_cookieClicked:
title: "Permainan dimana kamu mengeklik kue"
description: "Mengeklik kue"
flavor: "Tunggu, apakah kamu sedang berada di website yang benar?"
_brainDiver:
title: "Brain Diver"
description: "Posting tautan mengenai Brain Diver"
flavor: "Misskey-Misskey La-Tu-Ma"
_role:
new: "Buat peran"
edit: "Sunting peran"
name: "Nama peran"
description: "Deskripsi peran"
permission: "Perijinan peran"
descriptionOfPermission: "<b>Moderator</b> dapat melakukan operasi moderasi dasar.\n<b>Administrator</b> dapat mengubah seluruh pengaturan instansi."
assignTarget: "Tipe tugas"
descriptionOfAssignTarget: "<b>Manual</b> untuk mengganti secara manual siapa yang mendapatkan peran ini dan siapa yang tidak.\n<b>Kondisional</b> untuk pengguna secara otomatis dimasukkan atau dihapus dari peran berdasarkan kondisi yang ditentukan."
manual: "Manual"
conditional: "Kondisional"
condition: "Kondisi"
isConditionalRole: "Ini adalah peran kondisional"
isPublic: "Publikkan Peran"
descriptionOfIsPublic: "Siapapun dapat melihat daftar pengguna yang ditugaskan pada peran ini. Tambahan juga peran ini akan ditampilkan ke dalam profil pengguna tentang peran yang ditugaskan."
options: "Opsi peran"
policies: "Kebijakan"
baseRole: "Templat peran"
useBaseValue: "Gunakan nilai templat peran"
chooseRoleToAssign: "Pilih peran yang ditugaskan"
canEditMembersByModerator: "Perbolehkan moderator untuk menyunting daftar anggota untuk peran ini"
descriptionOfCanEditMembersByModerator: "Ketika dinyalakan, moderator beserta administrator dapat menugaskan ataupun mencabut pengguna ke peran ini. Ketika dimatikan, hanya administrator saja yang dapat menugaskan pengguna ke peran ini."
priority: "Prioritas"
_priority:
low: "Rendah"
middle: "Sedang"
high: "Tinggi"
_options:
gtlAvailable: "Dapat melihat linimasa global"
ltlAvailable: "Dapat melihat linimasa lokal"
canPublicNote: "Dapat mengirim catatan publik"
canInvite: "Dapat membuat kode undangan instansi"
canManageCustomEmojis: "Dapat mengelola Emoji kustom"
driveCapacity: "Kapasitas Drive"
pinMax: "Jumlah maksimal catatan yang disematkan"
_emailUnavailable:
used: "Alamat surel ini telah digunakan"
format: "Format tidak valid."
@@ -928,70 +1130,6 @@ _nsfw:
respect: "Sembunyikan media NSFW"
ignore: "Jangan sembunyikan media NSFW"
force: "Sembunyikan semua media"
_mfm:
cheatSheet: "Contekan MFM"
intro: "MFM adalah Misskey-exclusive Markup Language yang dapat digunakan di banyak tempat. Berikut kamu bisa melihat daftar dari syntax MFM yang ada."
dummy: "Misskey membentangkan dunia Fediverse"
mention: "Sebut"
mentionDescription: "Kamu dapat menentukan pengguna tertentu dengan menggunakan simbol-At dan nama engguna mereka."
hashtag: "Tagar"
hashtagDescription: "Kamu dapat menentukan tagar dengan menggunakan angka dan teks."
url: "URL"
urlDescription: "URL dapat ditampilkan."
link: "Tautan"
linkDescription: "Bagian tertentu dari teks dapat ditampilka sebagai URL."
bold: "Tebal"
boldDescription: "Sorot tulisan dengan membuatnya tebal."
small: "Kecil"
smallDescription: "Tampilkan konten kecil dan tipis."
center: "Tengah"
centerDescription: "Tampilkan konten di tengah."
inlineCode: "Kode (Dalam baris)"
inlineCodeDescription: "Menampilkan sorotan sintaks dalam baris untuk kode(program-)."
blockCode: "Kode (Blok)"
blockCodeDescription: "Menampilkan sorotan sintaks untuk kode(program-) multi baris dalam sebuah blok."
inlineMath: "Matematika (Dalam baris)"
inlineMathDescription: "Menampilkan formula matematika (KaTeX) dalam baris."
blockMath: "Matematika (Blok)"
blockMathDescription: "Menampilkan formula matematika (KaTeX) multibaris dalam sebuah blok."
quote: "Kutip"
quoteDescription: "Menampilkan konten sebagai kutipan."
emoji: "Emoji kustom"
emojiDescription: "Emoji kustom dapat ditampilkan dengan mengurung nama emoji kustom menggunakan tanda titik dua."
search: "Penelusuran"
searchDescription: "Menampilkan kotak pencarian dengan teks yang sudah dimasukkan."
flip: "Balik"
flipDescription: "Balikkan konten secara horizontal atau vertikal."
jelly: "Animasi (Jelly)"
jellyDescription: "Menerapkan animasi seperti jelly"
tada: "Animasi (Tada)"
tadaDescription: "Menerapkan animasi seperti \"Kejutan!\"."
jump: "Animasi (Loncat)"
jumpDescription: "Menerapkan animasi melompat."
bounce: "Animasi (Melambung)"
bounceDescription: "Menerapkan animasi melambung."
shake: "Animasi (Goyang)"
shakeDescription: "Menerapkan animasi bergoyang."
twitch: "Animasi (Cubit)"
twitchDescription: "Terapkan animasi cubit yang kuat."
spin: "Animasi (Putar)"
spinDescription: "Terapkan animasi putar."
x2: "Besar"
x2Description: "Tampilkan konten menjadi besar."
x3: "Lebih besar"
x3Description: "Tampilkan konten menjadi lebih besar."
x4: "Sangat besar"
x4Description: "Tampilka konten menjadi sangat besar."
blur: "Buram"
blurDescription: "Konten dapat diburamkan dengan efek ini. Konten dapat ditampilkan dengan jelas dengan melayangkan kursor tetikus di atasnya."
font: "Font"
fontDescription: "Setel font yang ditampilkan untuk konten."
rainbow: "Pelangi"
rainbowDescription: "Membuat konten muncul dalam warna pelangi."
sparkle: "Kelap-kelip"
sparkleDescription: "Memberikan konten efek partikel kelap-kelip."
rotate: "Putar"
rotateDescription: "Putar konten sesuai sudut yang ditentukan."
_instanceTicker:
none: "Jangan tampilkan"
remote: "Tampilkan untuk pengguna luar"
@@ -1149,6 +1287,7 @@ _tutorial:
step7_1: "Yay, Selamat! Kamu sudah menyelesaikan tutorial dasar Misskey."
step7_2: "Jika kamu ingin mempelajari lebih lanjut tentang Misskey, cobalah berkunjung ke bagian {help}."
step7_3: "Semoga berhasil dan bersenang-senanglah! 🚀"
step8_3: "Kamu dapat mengganti pengaturan ini nanti."
_2fa:
alreadyRegistered: "Kamu telah mendaftarkan perangkat otentikasi dua faktor."
registerDevice: "Daftarkan perangkat baru"
@@ -1223,10 +1362,13 @@ _widgets:
trends: "Tren"
clock: "Jam"
rss: "Pembaca RSS"
rssTicker: "RSS-Ticker"
activity: "Aktivitas"
photos: "Foto"
digitalClock: "Jam digital"
unixClock: "Jam UNIX"
federation: "Federasi"
instanceCloud: "Instansi awan"
postForm: "Buat catatan"
slideshow: "Slideshow"
button: "Tombol"
@@ -1236,8 +1378,10 @@ _widgets:
aiscript: "Konsol AiScript"
aiscriptApp: "Aplikasi AiScript"
aichan: "Ai"
userList: "Daftar pengguna"
_userList:
chooseList: "Pilih daftar"
clicker: "Pengeklik"
_cw:
hide: "Sembunyikan"
show: "Lihat konten"
@@ -1301,6 +1445,7 @@ _profile:
changeBanner: "Ubah header"
_exportOrImport:
allNotes: "Semua catatan"
favoritedNotes: "Catatan favorit"
followingList: "Ikuti"
muteList: "Bisukan"
blockingList: "Blokir"
@@ -1419,7 +1564,9 @@ _notification:
yourFollowRequestAccepted: "Permintaan mengikuti kamu telah diterima"
youWereInvitedToGroup: "Telah diundang ke grup"
pollEnded: "Hasil Kuesioner telah keluar"
unreadAntennaNote: "Antena {name}"
emptyPushNotificationMessage: "Pembaruan notifikasi dorong"
achievementEarned: "Pencapaian didapatkan"
_types:
all: "Semua"
follow: "Ikuti"
@@ -1441,6 +1588,7 @@ _deck:
alwaysShowMainColumn: "Selalu tampilkan kolom utama"
columnAlign: "Luruskan kolom"
addColumn: "Tambahkan kolom"
configureColumn: "Atur kolom"
swapLeft: "Pindah ke kiri"
swapRight: "Pindah ke kanan"
swapUp: "Pindah ke atas"
@@ -1448,6 +1596,11 @@ _deck:
stackLeft: "Tumpukkan di kolom kiri"
popRight: "Keluarkan di kanan"
profile: "Profil"
newProfile: "Profil baru"
deleteProfile: "Hapus profil"
introduction: "Buat antarmuka sempurna untukmu dengan menata kolom secara bebas!"
introduction2: "Klik \"+\" pada kanan layar untuk menambahkan kolom baru kapanpun yang kamu mau."
widgetsIntroduction: "Mohon pilih \"Sunting gawit\" pada menu kolom dan tambahkan gawit."
_columns:
main: "Utama"
widgets: "Widget"
@@ -1455,5 +1608,6 @@ _deck:
tl: "Linimasa"
antenna: "Antena"
list: "Daftar"
channel: "Kanal"
mentions: "Sebutan"
direct: "Langsung"

View File

@@ -34,6 +34,7 @@ const languages = [
'pt-PT',
'ru-RU',
'sk-SK',
'th-TH',
'ug-CN',
'uk-UA',
'vi-VN',

View File

@@ -1,7 +1,7 @@
---
_lang_: "Italiano"
headlineMisskey: "Rete collegata tramite note"
introMisskey: "Eccoci! Misskey è un servizio di microblogging decentralizzato, libero e aperto. \n📡 Puoi pubblicare «Note» per condividere ciò che sta succedendo o per dire a tutti qualcosa su di te. \n👍 Puoi reagire inviando emoji rapidi alle «Note» provenienti da altri profili nel Fediverso.\n🚀 Esplora un nuovo mondo insieme a noi!"
introMisskey: "Eccoci! Misskey è un servizio di microblogging decentralizzato, libero e aperto. \n\n📡 Puoi pubblicare «Note» per condividere ciò che sta succedendo o per dire a tutti qualcosa su di te. \n\n👍 Puoi reagire inviando emoji rapidi alle «Note» provenienti da altri profili nel Fediverso.\n\n🚀 Esplora un nuovo mondo insieme a noi!"
poweredByMisskeyDescription: "{name} è uno dei servizi (chiamati istanze) che utilizzano la piattaforma open source <b>Misskey</b>."
monthAndDay: "{day}/{month}"
search: "Cerca"
@@ -95,7 +95,7 @@ follow: "Segui"
followRequest: "Richiesta di follow"
followRequests: "Richieste di follow"
unfollow: "Smetti di seguire"
followRequestPending: "La richiesta di follow deve essere approvata"
followRequestPending: "Richiesta in approvazione"
enterEmoji: "Inserisci emoji"
renote: "Rinota"
unrenote: "Annulla rinota"
@@ -110,6 +110,7 @@ clickToShow: "Clicca per visualizzare"
sensitive: "Contenuto sensibile"
add: "Aggiungi"
reaction: "Reazioni"
reactions: "Reazioni"
reactionSetting: "Reazioni visualizzate sul pannello"
reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa il pulsante \"+\" per aggiungere."
rememberNoteVisibility: "Ricordare le impostazioni di visibilità delle note"
@@ -463,7 +464,6 @@ youHaveNoGroups: "Nessun gruppo"
joinOrCreateGroup: "Puoi creare il tuo gruppo o essere invitat@ a gruppi che già esistono."
noHistory: "Nessuna cronologia"
signinHistory: "Storico degli accessi al profilo"
disableAnimatedMfm: "Disabilità i MFM animati"
doing: "In corso..."
category: "Categoria"
tags: "Tag"
@@ -836,7 +836,7 @@ hide: "Nascondere"
leaveGroup: "Esci dal gruppo"
leaveGroupConfirm: "Uscire da「{name}」?"
useDrawerReactionPickerForMobile: "Mostra sul drawer da dispositivo mobile"
welcomeBackWithName: "Eccoti di nuovo, {name}! Ciao!"
welcomeBackWithName: "Ciao, {name}! Eccoti di nuovo!"
clickToFinishEmailVerification: "Fai click su [{ok}] per completare la verifica dell'indirizzo email."
overridedDeviceKind: "Tipo di dispositivo"
smartphone: "Smartphone"
@@ -935,6 +935,245 @@ manageCustomEmojis: "Gestisci le emoji personalizzate"
youCannotCreateAnymore: "Non puoi creare, hai raggiunto il limite."
cannotPerformTemporary: "Indisponibilità temporanea"
cannotPerformTemporaryDescription: "L'attività non può essere svolta, poiché si è raggiunto il limite di esecuzioni possibili. Per favore, riprova più tardi."
preset: "Preimpostato"
selectFromPresets: "Seleziona preimpostato"
achievements: "Obiettivi raggiunti"
_achievements:
earnedAt: "Data di conseguimento"
_types:
_notes1:
title: "Hai iniziato a usare Misskey"
description: "Hai pubblicato la prima Nota"
flavor: "Goditi la vita su Misskey!"
_notes10:
title: "Alcune Note"
description: "Hai inserito 10 Note"
_notes100:
title: "Un po' di Note"
description: "Hai inserito 100 Note"
_notes500:
title: "Un bel po' di Note"
description: "Hai inserito 500 Note"
_notes1000:
title: "Una montagna di Note"
description: "Hai inserito 1.000 Note"
_notes5000:
title: "Un sovraccarico di Note!"
description: "Hai inserito 5.000 Note"
_notes10000:
title: "SuperNote!"
description: "Hai inserito 10.000 Note"
_notes20000:
title: "Voglio più... Note!"
description: "Hai inserito 20.000 Note"
_notes30000:
title: "Note, Note, Note!"
description: "Hai inserito 30.000 Note"
_notes40000:
title: "Una fabbrica di Note"
description: "Hai inserito 40.000 Note"
_notes50000:
title: "Un pianeta di Note"
description: "Hai inserito 50.000 Note"
_notes60000:
title: "Un quasar di Note"
description: "Hai inserito 60.000 Note"
_notes70000:
title: "Un buco nero supermassiccio di Note"
description: "Hai inserito 70.000 Note"
_notes80000:
title: "Una galassia di Note"
description: "Hai inserito 80.000 Note"
_notes90000:
title: "Un universo di Note!"
description: "Hai inserito 90.000 Note"
_notes100000:
title: "ALL YOUR NOTE ARE BELONG TO US"
description: "Hai inserito 100.000 Note"
flavor: "Hai molto da scrivere?"
_login3:
title: "Principiante I"
description: "Accedi per un totale di 3 giorni"
flavor: "Da oggi, chiamatemi Misskist"
_login7:
title: "Principiante II"
description: "Accedi per un totale di 7 giorni"
flavor: "Ti sembra di avere la situazione sotto controllo?"
_login15:
title: "Principiante III"
description: "Accedi per un totale di 15 giorni"
_login30:
title: "Misskist I"
description: "Accedi per un totale di 30 giorni"
_login60:
title: "Misskeist II"
description: "Accedi per un totale di 60 giorni"
_login100:
title: "Misskeist III"
description: "Accedi per un totale di 100 giorni"
flavor: "Violent Misskeist"
_login200:
title: "Regolare I"
description: "Accedi per un totale di 200 giorni"
_login300:
title: "Regolare II"
description: "Accedi per un totale di 300 giorni"
_login400:
title: "Regolare III"
description: "Accedi per un totale di 400 giorni"
_login500:
title: "Professionista I"
description: "Accedi per un totale di 500 giorni"
flavor: "Amici cari, mi piacciono le Note"
_login600:
title: "Professionista II"
description: "Accedi per un totale di 600 giorni"
_login700:
title: "Professionista III"
description: "Accedi per un totale di 700 giorni"
_login800:
title: "Maestro di Note I"
description: "Accedi per un totale di 800 giorni"
_login900:
title: "Maestro di Note II"
description: "Accedi per un totale di 900 giorni"
_login1000:
title: "Maestro di Note III"
description: "Accedi per un totale di 1.000 giorni"
flavor: "Grazie per aver usato Misskey!"
_noteClipped1:
title: "Devo clippare!"
description: "Hai raccolto la tua prima Nota in una Clip"
_noteFavorited1:
title: "Guarda le stelle"
description: "Aggiungi una Nota ai preferiti per la prima volta"
_myNoteFavorited1:
title: "Fornitura stelline"
description: "Qualcuno ha preferito una delle tue Note"
_profileFilled:
title: "Perfettamente"
description: "Imposta il tuo profilo"
_markedAsCat:
title: "Io sono un gatto"
description: "Aggiungi le orecchie da gatto al tuo profilo"
flavor: "Ti chiamerò..."
_following1:
title: "Il mio primo Follow"
description: "Hai seguito il tuo primo profilo"
_following10:
title: "Segui, segui!"
description: "Hai seguito 10 profili"
_following50:
title: "Tanti amici"
description: "Hai seguito 50 profili"
_following100:
title: "Cento amici"
description: "Hai seguito 100 profili"
_following300:
title: "Sovraccarico di amici"
description: "Hai seguito 300 profili"
_followers1:
title: "Il primo profilo tuo Follower"
description: "Hai ottenuto il tuo primo Follower"
_followers10:
title: "Follow me!"
description: "Hai ottenuto 10 profili Follower"
_followers50:
title: "Un gregge di Follower"
description: "Hai ottenuto 50 Follower"
_followers100:
title: "Popolare"
description: "Hai ottenuto 100 profili Follower"
_followers300:
title: "Mettetevi in fila"
description: "Hai ottenuto 300 Follower"
_followers500:
title: "Trasmettitore"
description: "Hai ottenuto 500 Follower"
_followers1000:
title: "Influenzer"
description: "Hai superato i 1.000 profili Follower"
_collectAchievements30:
title: "Collezionista di successi"
description: "Hai raggiunto 30 obiettivi"
_viewAchievements3min:
title: "Mi piacciono i risultati"
description: "Guarda la tua collezione di obiettivi per almeno 3 minuti"
_iLoveMisskey:
title: "I LOVE Misskey"
description: "Pubblica «I ♥ #Misskey»"
flavor: "Grazie per aver utilizzato Misskey! Dal team di sviluppo"
_foundTreasure:
title: "Caccia al tesoro"
description: "Hai trovato un tesoro nascosto"
_client30min:
title: "Piccola grande pausa"
description: "Hai passato più di 30 minuti su Misskey"
_noteDeletedWithin1min:
title: "Ooops!"
description: "Hai eliminato una nota entro un minuto dalla sua pubblicazione"
_postedAtLateNight:
title: "Biassanot!"
description: "Hai pubblicato una nota in tarda notte"
flavor: "Andiamo a dormire presto"
_postedAt0min0sec:
title: "Mezzanotte"
description: "Hai pubblicato una Nota a mezzanotte in punto"
flavor: "tic, tac, tic, tac! Gong!"
_selfQuote:
title: "Autoreferenziale"
description: "Hai citato una delle tue Note"
_htl20npm:
title: "Timeline scorrevole"
description: "La tua Timeline personale ha superato la velocità di 20 Note orarie (Note al minuto)"
_viewInstanceChart:
title: "Analista"
description: "Visualizza i grafici dell'istanza"
_outputHelloWorldOnScratchpad:
title: "Hello, world!"
description: "Hai scritto «Hello world» nel blocco appunti"
_open3windows:
title: "Apri le finestre!"
description: "Hai aperto almeno 3 finestre contemporaneamente"
_driveFolderCircularReference:
title: "Riferimento circolare"
description: "Hai provato a nidificare in modo ricorsivo le cartelle del Drive"
_reactWithoutRead:
title: "Hai letto bene?"
description: "Hai reagito ad una Nota più lunga di 100 caratteri entro 3 secondi dalla sua pubblicazione"
_clickedClickHere:
title: "Clicca qui"
description: "Hai cliccato qui"
_justPlainLucky:
title: "Proprio fortunato"
description: "Ottenuto con una probabilità dello 0,01% ogni 10 secondi"
_setNameToSyuilo:
title: "Complesso divino"
description: "Hai impostati il tuo nome in «syuilo»"
_passedSinceAccountCreated1:
title: "Primo Anniversario"
description: "È passato un anno da quando hai creato il profilo"
_passedSinceAccountCreated2:
title: "Secondo Anniversario"
description: "Sono passati due anni da quando hai creato il profilo"
_passedSinceAccountCreated3:
title: "Terzo Anniversario"
description: "Sono passati tre anni da quando hai creato il profilo"
_loggedInOnBirthday:
title: "Buon compleanno!"
description: "Hai effettuato l'accesso il giorno del tuo compleanno"
_loggedInOnNewYearsDay:
title: "Buon anno nuovo!"
description: "Hai usato effettuato l'accesso il giorno di capodanno"
flavor: "Anche quest'anno, grazie per il tuo continuo supporto a questa istanza"
_cookieClicked:
title: "Clicca il biscotto"
description: "Hai giocato a cliccare il cookie"
flavor: "È il sito giusto?"
_brainDiver:
title: "Brain Diver"
description: "Pubblica un link a Brain Diver"
flavor: "Sulle note di Brain Diver"
_role:
new: "Nuovo ruolo"
edit: "Modifica ruolo"
@@ -955,6 +1194,9 @@ _role:
baseRole: "Ruolo di base"
useBaseValue: "Eredita dal ruolo base"
chooseRoleToAssign: "Seleziona il ruolo da assegnare"
iconUrl: "URL dell'icona"
asBadge: "Mostra come badge"
descriptionOfAsBadge: "Se indicato, accanto al nome utente viene visualizzata l'icona del ruolo."
canEditMembersByModerator: "Anche i Moderatori assegnano profili a questo ruolo"
descriptionOfCanEditMembersByModerator: "Se disattivo, potranno farlo solamente gli Amministratori."
priority: "Priorità"
@@ -979,6 +1221,7 @@ _role:
userEachUserListsMax: "Quantità massima di profili per lista"
rateLimitFactor: "Limite del rapporto"
descriptionOfRateLimitFactor: "I rapporti più bassi sono meno restrittivi, quelli più alti lo sono di più."
canHideAds: "Può nascondere i banner"
_condition:
isLocal: "Profilo locale"
isRemote: "Profilo remoto"
@@ -1079,72 +1322,6 @@ _nsfw:
respect: "Nascondere i media segnati come sensibli"
ignore: "Visualizzare i media segnati come sensibili"
force: "Nascondere tutti i media"
_mfm:
cheatSheet: "Bigliettino MFM"
intro: "MFM è un linguaggio Markdown particolare che si può usare in diverse parti di Misskey. Qui puoi visualizzare a colpo d'occhio tutta la sintassi MFM utile."
dummy: "Il Fediverso si espande con Misskey"
mention: "Menzioni"
mentionDescription: "Si può menzionare un utente specifico digitando il suo nome utente subito dopo il segno @."
hashtag: "Hashtag"
hashtagDescription: "Per indicare un hashtag si può usare il segno numerico + tag."
url: "URL"
urlDescription: "È possibile indicare gli URL"
link: "Link"
linkDescription: "È possibile associare specifici intervalli di testo agli URL"
bold: "Grassetto"
boldDescription: "Il testo può essere grassettato per enfasi"
small: "vistosamente"
smallDescription: "Il contenuto può essere visualizzato più piccolo e più sottile"
center: "centratura"
centerDescription: "Il contenuto può essere centrato"
inlineCode: "Codice (inline)"
inlineCodeDescription: "Evidenziazione della sintassi in linea di programmi e altro codice"
blockCode: "Codice (blocco)"
blockCodeDescription: "Evidenziazione della sintassi di programmi multilinea e di altro codice in blocchi"
inlineMath: "Espressione matematica(Immersione)"
inlineMathDescription: "Visualizza le formule (KaTeX) in linea."
blockMath: "Formula matematica (blocco)"
blockMathDescription: "Visualizzazione di formule multilinea (KaTeX) in blocchi."
quote: "Cita il nota"
quoteDescription: "Può indicare che il contenuto è una citazione."
emoji: "Emoji personalizzati"
emojiDescription: "Utilizzare i due punti per racchiudere il nome di un'emoji personalizzata e visualizzarla."
search: "Cerca"
searchDescription: "È possibile visualizzare una casella di ricerca precompilata."
flip: "Inverti"
flipDescription: "Capovolgere il contenuto verso l'alto o verso il basso, a sinistra o a destra."
jelly: "Animazione (Biyon Biyon)."
jellyDescription: "Dà un'animazione di salto."
tada: "Animazione (jang)."
tadaDescription: "Ta-da! dà un'animazione che assomiglia a."
jump: "Animazione(salto)"
jumpDescription: "Da un animazione che salta su e giù."
bounce: "Animazione(rimbalzo)"
bounceDescription: "Rende il testo rimbalzante"
shake: "rimbalzante"
shakeDescription: "Rende il testo traballante"
twitch: "testo"
twitchDescription: "Fa tremare il testo"
spin: "Animazione (rotazione)"
spinDescription: "Fornisce un'animazione rotante."
x2: "Più grande"
x2Description: "Mostra il contenuto ingrandito."
x3: "Molto più grande"
x3Description: "Mostra il contenuto molto più ingrandito."
x4: "Estremamente più grande"
x4Description: "Mostra il contenuto estremamente più ingrandito."
blur: "Sfocatura"
blurDescription: "È possibile rendere sfocato il contenuto. Spostando il cursore su di esso tornerà visibile chiaramente."
font: "Tipo di carattere"
fontDescription: "Puoi scegliere il tipo di carattere per il contenuto."
rainbow: "Arcobaleno"
rainbowDescription: "Arcobaleno il contenuto."
sparkle: "brillantini"
sparkleDescription: "Aggiungere effetti particellari scintillanti."
rotate: "Ruota"
rotateDescription: "Ruota con un angolo specificato."
plain: "Testo semplice"
plainDescription: "Disattiva tutta la sintassi interna."
_instanceTicker:
none: "Nascondi"
remote: "Mostra solo per i profili remoti"
@@ -1266,8 +1443,8 @@ _sfx:
channel: "Notifiche di canale"
_ago:
future: "Futuro"
justNow: "Ora"
secondsAgo: "{n}s fa"
justNow: "Adesso"
secondsAgo: "{n} sec fa"
minutesAgo: "{n} min fa"
hoursAgo: "{n} ore fa"
daysAgo: "{n} gg fa"
@@ -1289,7 +1466,7 @@ _tutorial:
step3_1: "Hai finito di impostare il tuo profilo?"
step3_2: "Ora puoi pubblicare una «Nota». Proviamo subito! Premi il bottone con l'icona «penna» per iniziare a scrivere in una finestra di dialogo. "
step3_3: "Scritto il testo della nota, puoi pubblicarla premendo il pulsante nella parte superiore destra della finestra di dialogo."
step3_4: "Non ti viene niente in mente? Perché non scrivi semplicemente \"Ho appena cominciato a usare Misskey\"?"
step3_4: "Non ti viene niente in mente? Perché non scrivi semplicemente \"Ho appena iniziato a usare Misskey\"?"
step4_1: "Hai pubblicato qualcosa?"
step4_2: "Se puoi visualizzare la tua nota sulla timeline, ce l'hai fatta!"
step5_1: "Adesso, cerca di seguire altre persone per vivacizzare la tua timeline. "
@@ -1583,6 +1760,7 @@ _notification:
pollEnded: "Risultati del sondaggio."
unreadAntennaNote: "Antenna {name}"
emptyPushNotificationMessage: "Le notifiche push sono state aggiornate."
achievementEarned: "Obiettivo raggiunto"
_types:
all: "Tutto"
follow: "Novità follower"
@@ -1624,5 +1802,6 @@ _deck:
tl: "Timeline"
antenna: "Antenne"
list: "Liste"
channel: "Canale"
mentions: "Menzioni"
direct: "Diretta"

View File

@@ -110,6 +110,7 @@ clickToShow: "クリックして表示"
sensitive: "閲覧注意"
add: "追加"
reaction: "リアクション"
reactions: "リアクション"
reactionSetting: "ピッカーに表示するリアクション"
reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押して追加します。"
rememberNoteVisibility: "公開範囲を記憶する"
@@ -128,6 +129,7 @@ unblockConfirm: "ブロック解除しますか?"
suspendConfirm: "凍結しますか?"
unsuspendConfirm: "解凍しますか?"
selectList: "リストを選択"
selectChannel: "チャンネルを選択"
selectAntenna: "アンテナを選択"
selectWidget: "ウィジェットを選択"
editWidgets: "ウィジェットを編集"
@@ -255,6 +257,8 @@ noMoreHistory: "これより過去の履歴はありません"
startMessaging: "チャットを開始"
nUsersRead: "{n}人が読みました"
agreeTo: "{0}に同意"
agreeBelow: "下記に同意する"
basicNotesBeforeCreateAccount: "基本的な注意事項"
tos: "利用規約"
start: "始める"
home: "ホーム"
@@ -463,7 +467,8 @@ youHaveNoGroups: "グループがありません"
joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループを作成してください。"
noHistory: "履歴はありません"
signinHistory: "ログイン履歴"
disableAnimatedMfm: "動きのあるMFMを効にする"
enableAdvancedMfm: "高度なMFMを効にする"
enableAnimatedMfm: "動きのあるMFMを有効にする"
doing: "やっています"
category: "カテゴリ"
tags: "タグ"
@@ -860,6 +865,8 @@ failedToFetchAccountInformation: "アカウント情報の取得に失敗しま
rateLimitExceeded: "レート制限を超えました"
cropImage: "画像のクロップ"
cropImageAsk: "画像をクロップしますか?"
cropYes: "クロップする"
cropNo: "そのまま使う"
file: "ファイル"
recentNHours: "直近{n}時間"
recentNDays: "直近{n}日"
@@ -937,6 +944,250 @@ cannotPerformTemporary: "一時的に利用できません"
cannotPerformTemporaryDescription: "操作回数が制限を超過するため一時的に利用できません。しばらく時間を置いてから再度お試しください。"
preset: "プリセット"
selectFromPresets: "プリセットから選択"
achievements: "実績"
gotInvalidResponseError: "サーバーの応答が無効です"
gotInvalidResponseErrorDescription: "サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから再度お試しください。"
thisPostMayBeAnnoying: "この投稿は迷惑になる可能性があります。"
thisPostMayBeAnnoyingHome: "ホームに投稿"
thisPostMayBeAnnoyingCancel: "やめる"
thisPostMayBeAnnoyingIgnore: "このまま投稿"
_achievements:
earnedAt: "獲得日時"
_types:
_notes1:
title: "just setting up my msky"
description: "初めてノートを投稿した"
flavor: "良いMisskeyライフを"
_notes10:
title: "いくつかのノート"
description: "ートを10回投稿した"
_notes100:
title: "たくさんのノート"
description: "ートを100回投稿した"
_notes500:
title: "ノートまみれ"
description: "ートを500回投稿した"
_notes1000:
title: "ノートの山"
description: "ートを1,000回投稿した"
_notes5000:
title: "湧き出るノート"
description: "ートを5,000回投稿した"
_notes10000:
title: "スーパーノート"
description: "ートを10,000回投稿した"
_notes20000:
title: "ニードモアノート"
description: "ートを20,000回投稿した"
_notes30000:
title: "ノートノートノート"
description: "ートを30,000回投稿した"
_notes40000:
title: "ノート工場"
description: "ートを40,000回投稿した"
_notes50000:
title: "ノートの惑星"
description: "ートを50,000回投稿した"
_notes60000:
title: "ノートクエーサー"
description: "ートを60,000回投稿した"
_notes70000:
title: "ブラックノートホール"
description: "ートを70,000回投稿した"
_notes80000:
title: "ノートギャラクシー"
description: "ートを80,000回投稿した"
_notes90000:
title: "ノートバース"
description: "ートを90,000回投稿した"
_notes100000:
title: "ALL YOUR NOTE ARE BELONG TO US"
description: "ートを100,000回投稿した"
flavor: "そんなに書くことある?"
_login3:
title: "ビギナーⅠ"
description: "通算ログイン日数が3日"
flavor: "今日からね僕は ミスキストってことで"
_login7:
title: "ビギナーⅡ"
description: "通算ログイン日数が7日"
flavor: "慣れてきましたか?"
_login15:
title: "ビギナーⅢ"
description: "通算ログイン日数が15日"
_login30:
title: "ミスキストⅠ"
description: "通算ログイン日数が30日"
_login60:
title: "ミスキストⅡ"
description: "通算ログイン日数が60日"
_login100:
title: "ミスキストⅢ"
description: "通算ログイン日数が100日"
flavor: "そのユーザー、ミスキストにつき"
_login200:
title: "常連Ⅰ"
description: "通算ログイン日数が200日"
_login300:
title: "常連Ⅱ"
description: "通算ログイン日数が300日"
_login400:
title: "常連Ⅲ"
description: "通算ログイン日数が400日"
_login500:
title: "ベテランⅠ"
description: "通算ログイン日数が500日"
flavor: "諸君、私はノートが好きだ"
_login600:
title: "ベテランⅡ"
description: "通算ログイン日数が600日"
_login700:
title: "ベテランⅢ"
description: "通算ログイン日数が700日"
_login800:
title: "ノートマスターⅠ"
description: "通算ログイン日数が800日"
_login900:
title: "ノートマスターⅡ"
description: "通算ログイン日数が900日"
_login1000:
title: "ノートマスターⅢ"
description: "通算ログイン日数が1,000日"
flavor: "Misskeyを使ってくれてありがとう"
_noteClipped1:
title: "クリップせずにはいられないな"
description: "初めてノートをクリップした"
_noteFavorited1:
title: "星をみるひと"
description: "初めてノートをお気に入りに登録した"
_myNoteFavorited1:
title: "星が欲しい"
description: "自分のノートが他の人からお気に入りに登録された"
_profileFilled:
title: "準備万端"
description: "プロフィール設定を行った"
_markedAsCat:
title: "吾輩は猫である"
description: "アカウントをCatとして設定した"
flavor: "名前はまだない。"
_following1:
title: "はじめてのフォロー"
description: "初めてフォローした"
_following10:
title: "ついてく、ついてく"
description: "フォローが10人を超した"
_following50:
title: "友達たくさん"
description: "フォローが50人を超した"
_following100:
title: "友達100人"
description: "フォローが100人を超した"
_following300:
title: "友達過多"
description: "フォローが300人を超した"
_followers1:
title: "はじめてのフォロワー"
description: "初めてフォローされた"
_followers10:
title: "フォローミー!"
description: "フォロワーが10人を超した"
_followers50:
title: "ぞろぞろ"
description: "フォロワーが50人を超した"
_followers100:
title: "人気者"
description: "フォロワーが100人を超した"
_followers300:
title: "一列でお並びください"
description: "フォロワーが300人を超した"
_followers500:
title: "基地局"
description: "フォロワーが500人を超した"
_followers1000:
title: "インフルエンサー"
description: "フォロワーが1,000人を超した"
_collectAchievements30:
title: "実績コレクター"
description: "実績を30個以上獲得した"
_viewAchievements3min:
title: "実績好き"
description: "実績一覧を3分以上眺め続けた"
_iLoveMisskey:
title: "I Love Misskey"
description: "\"I ❤ #Misskey\"を投稿した"
flavor: "Misskeyを使ってくださりありがとうございます by 開発チーム"
_foundTreasure:
title: "宝探し"
description: "隠されたお宝を発見した"
_client30min:
title: "ひとやすみ"
description: "クライアントを起動してから30分以上経過した"
_noteDeletedWithin1min:
title: "いまのなし"
description: "投稿してから1分以内にその投稿を削除した"
_postedAtLateNight:
title: "夜行性"
description: "深夜にノートを投稿した"
flavor: "そろそろ寝よう。"
_postedAt0min0sec:
title: "時報"
description: "0分0秒にートを投稿した"
flavor: "ポッ ポッ ポッ ピーン"
_selfQuote:
title: "自己言及"
description: "自分のノートを引用した"
_htl20npm:
title: "流れるTL"
description: "ホームタイムラインの流速が20npmを越す"
_viewInstanceChart:
title: "アナリスト"
description: "インスタンスのチャートを表示した"
_outputHelloWorldOnScratchpad:
title: "Hello, world!"
description: "スクラッチパッドで hello world を出力した"
_open3windows:
title: "マルチウィンドウ"
description: "ウィンドウを3つ以上開いた状態にした"
_driveFolderCircularReference:
title: "循環参照"
description: "ドライブのフォルダを再帰的な入れ子にしようとした"
_reactWithoutRead:
title: "ちゃんと読んだ?"
description: "100文字以上のテキストを含むートに投稿されてから3秒以内にリアクションした"
_clickedClickHere:
title: "ここをクリック"
description: "ここをクリックした"
_justPlainLucky:
title: "単なるラッキー"
description: "10秒ごとに0.005%の確率で獲得"
_setNameToSyuilo:
title: "神様コンプレックス"
description: "名前を syuilo に設定した"
_passedSinceAccountCreated1:
title: "一周年"
description: "アカウント作成から1年経過した"
_passedSinceAccountCreated2:
title: "二周年"
description: "アカウント作成から2年経過した"
_passedSinceAccountCreated3:
title: "三周年"
description: "アカウント作成から3年経過した"
_loggedInOnBirthday:
title: "ハッピーバースデー"
description: "誕生日にログインした"
_loggedInOnNewYearsDay:
title: "あけましておめでとうございます"
description: "元日にログインした"
flavor: "今年も弊インスタンスをよろしくお願いします"
_cookieClicked:
title: "クッキーをクリックするゲーム"
description: "クッキーをクリックした"
flavor: "ソフト間違ってない?"
_brainDiver:
title: "Brain Diver"
description: "Brain Diverへのリンクを投稿した"
flavor: "Misskey-Misskey La-Tu-Ma"
_role:
new: "ロールの作成"
@@ -945,7 +1196,7 @@ _role:
description: "ロールの説明"
permission: "ロールの権限"
descriptionOfPermission: "<b>モデレーター</b>は基本的なモデレーションに関する操作を行えます。\n<b>管理者</b>はインスタンスの全ての設定を変更できます。"
assignTarget: "アサインターゲット"
assignTarget: "アサイン"
descriptionOfAssignTarget: "<b>マニュアル</b>は誰がこのロールに含まれるかを手動で管理します。\n<b>コンディショナル</b>は条件を設定し、それに合致するユーザーが自動で含まれるようになります。"
manual: "マニュアル"
conditional: "コンディショナル"
@@ -958,6 +1209,9 @@ _role:
baseRole: "ベースロール"
useBaseValue: "ベースロールの値を使用"
chooseRoleToAssign: "アサインするロールを選択"
iconUrl: "アイコン画像のURL"
asBadge: "バッジとして表示"
descriptionOfAsBadge: "オンにすると、ユーザー名の横にロールのアイコンが表示されます。"
canEditMembersByModerator: "モデレーターのメンバー編集を許可"
descriptionOfCanEditMembersByModerator: "オンにすると、管理者に加えてモデレーターもこのロールへユーザーをアサイン/アサイン解除できるようになります。オフにすると管理者のみが行えます。"
priority: "優先度"
@@ -1098,73 +1352,6 @@ _nsfw:
ignore: "閲覧注意のメディアを隠さない"
force: "常にメディアを隠す"
_mfm:
cheatSheet: "MFMチートシート"
intro: "MFMは、Misskey内の様々な場所で使用できる専用のマークアップ言語です。ここでは、MFMで使用可能な構文一覧が確認できます。"
dummy: "MisskeyでFediverseの世界が広がります"
mention: "メンション"
mentionDescription: "アットマーク + ユーザー名で、特定のユーザーを示すことができます。"
hashtag: "ハッシュタグ"
hashtagDescription: "ナンバーサイン + タグで、ハッシュタグを示すことができます。"
url: "URL"
urlDescription: "URLを示すことができます。"
link: "リンク"
linkDescription: "文章の特定の範囲を、URLに紐づけることができます。"
bold: "太字"
boldDescription: "文字を太く表示して強調することができます。"
small: "目立たなく"
smallDescription: "内容を小さく・薄く表示させることができます。"
center: "中央寄せ"
centerDescription: "内容を中央寄せで表示させることができます。"
inlineCode: "コード(インライン)"
inlineCodeDescription: "プログラムなどのコードをインラインでシンタックスハイライトします。"
blockCode: "コード(ブロック)"
blockCodeDescription: "複数行のプログラムなどのコードをブロックでシンタックスハイライトします。"
inlineMath: "数式(インライン)"
inlineMathDescription: "数式(KaTeX)をインラインで表示します。"
blockMath: "数式(ブロック)"
blockMathDescription: "複数行の数式(KaTeX)をブロックで表示します。"
quote: "引用"
quoteDescription: "内容が引用であることを示すことができます。"
emoji: "カスタム絵文字"
emojiDescription: "コロンでカスタム絵文字名を囲むと、カスタム絵文字を表示させることができます。"
search: "検索"
searchDescription: "入力済み検索ボックスを表示させることができます。"
flip: "反転"
flipDescription: "内容を上下または左右に反転させます。"
jelly: "アニメーション(びよんびよん)"
jellyDescription: "びよんびよんするアニメーションを与えます。"
tada: "アニメーション(じゃーん)"
tadaDescription: "ジャーン!という感じのアニメーションを与えます。"
jump: "アニメーション(ジャンプ)"
jumpDescription: "飛び跳ねるようなアニメーションを与えます。"
bounce: "アニメーション(バウンド)"
bounceDescription: "ぽよんぽよん弾むようなアニメーションを与えます。"
shake: "アニメーション(ぶるぶる)"
shakeDescription: "ぶるぶる震えるアニメーションを与えます。"
twitch: "アニメーション(ブレ)"
twitchDescription: "激しくブレるアニメーションを与えます。"
spin: "アニメーション(回転)"
spinDescription: "回転するアニメーションを与えます。"
x2: "大きく"
x2Description: "内容を大きく表示します。"
x3: "とても大きく"
x3Description: "内容をとても大きく表示します。"
x4: "究極に大きく"
x4Description: "内容を究極に大きく表示します。"
blur: "ぼかし"
blurDescription: "内容をぼかすことができます。ポインターを上に乗せるとはっきり見えるようになります。"
font: "フォント"
fontDescription: "内容のフォントを指定することができます。"
rainbow: "レインボー"
rainbowDescription: "内容をレインボーにします。"
sparkle: "キラキラ"
sparkleDescription: "キラキラしたパーティクルのエフェクトを追加します。"
rotate: "回転"
rotateDescription: "指定した角度で回転させます。"
plain: "プレーン"
plainDescription: "内側の構文を全て無効にします。"
_instanceTicker:
none: "表示しない"
remote: "リモートユーザーに表示"
@@ -1383,12 +1570,15 @@ _permissions:
"write:gallery-likes": "ギャラリーのいいねを操作する"
_auth:
shareAccessTitle: "アプリへのアクセス許可"
shareAccess: "「{name}」がアカウントにアクセスすることを許可しますか?"
shareAccessAsk: "アカウントへのアクセスを許可しますか?"
permission: "{name}は次の権限を要求しています"
permissionAsk: "このアプリは次の権限を要求しています"
pleaseGoBack: "アプリケーションに戻ってやっていってください"
callback: "アプリケーションに戻っています"
denied: "アクセスを拒否しました"
pleaseLogin: "アプリケーションにアクセス許可を与えるには、ログインが必要です。"
_antennaSources:
all: "全てのノート"
@@ -1634,6 +1824,7 @@ _notification:
pollEnded: "アンケートの結果が出ました"
unreadAntennaNote: "アンテナ {name}"
emptyPushNotificationMessage: "プッシュ通知の更新をしました"
achievementEarned: "実績を獲得"
_types:
all: "すべて"
@@ -1679,5 +1870,6 @@ _deck:
tl: "タイムライン"
antenna: "アンテナ"
list: "リスト"
channel: "チャンネル"
mentions: "あなた宛て"
direct: "ダイレクト"

View File

@@ -8,9 +8,9 @@ search: "探す"
notifications: "通知"
username: "ユーザー名"
password: "パスワード"
forgotPassword: "パスワード忘れて"
forgotPassword: "パスワード忘れてもうた"
fetchingAsApObject: "今ちと連合に照会しとるで"
ok: "OKや"
ok: "ええで"
gotIt: "ほい"
cancel: "やめとく"
noThankYou: "やめとく"
@@ -46,7 +46,7 @@ copyContent: "内容をコピー"
copyLink: "リンクをコピー"
delete: "ほかす"
deleteAndEdit: "ほかして直す"
deleteAndEditConfirm: "このノートをほかして書き直すんかこのートへのリアクション、Renote、返信も全部消えてまうで。"
deleteAndEditConfirm: "このノートをほかしてもっかい直すこのートへのリアクション、Renote、返信も全部消えるんやけどそれでもええん?"
addToList: "リストに入れたる"
sendMessage: "メッセージを送る"
copyRSS: "RSSをコピー"
@@ -89,7 +89,7 @@ serverIsDead: "サーバーからの応答がないで。もうちょい待っ
youShouldUpgradeClient: "このページを表示するには、リロードして新しいバージョンのクライアントを使ってなー。"
enterListName: "リスト名を入れてや"
privacy: "プライバシー"
makeFollowManuallyApprove: "自分が認めた人だけがこのアカウントをフォローできるようにする"
makeFollowManuallyApprove: "他人のフォローは許可してからや!"
defaultNoteVisibility: "もとからの公開範囲"
follow: "フォロー"
followRequest: "フォローを頼む"
@@ -110,6 +110,7 @@ clickToShow: "押したら見えるで"
sensitive: "ちょっとアカンやつやで"
add: "増やす"
reaction: "リアクション"
reactions: "リアクション"
reactionSetting: "Reaction that will be displayed in Picker. "
reactionSettingDescription2: "ドラッグで並び替え、クリックで削除、+を押して追加やで。"
rememberNoteVisibility: "公開範囲覚えといて"
@@ -128,6 +129,7 @@ unblockConfirm: "ブロックやめたるってほんまか?"
suspendConfirm: "凍結してしもうてええか?"
unsuspendConfirm: "解凍するけどええか?"
selectList: "リストを選ぶ"
selectChannel: "チャンネルを選ぶ"
selectAntenna: "アンテナを選ぶ"
selectWidget: "ウィジェットを選ぶ"
editWidgets: "ウィジェットをいじる"
@@ -255,6 +257,8 @@ noMoreHistory: "これより過去の履歴はあらへんで"
startMessaging: "チャットやるで"
nUsersRead: "{n}人が読んでもうた"
agreeTo: "{0}に同意したで"
agreeBelow: "下記に同意したる"
basicNotesBeforeCreateAccount: "よう読んでやってや"
tos: "利用規約"
start: "始める"
home: "ホーム"
@@ -299,7 +303,7 @@ avatar: "アイコン"
banner: "バナー"
nsfw: "閲覧注意"
whenServerDisconnected: "サーバーとの接続が切れたとき"
disconnectedFromServer: "サーバーとの通信が切れたで"
disconnectedFromServer: "サーバーが機嫌悪いねん"
reload: "リロード"
doNothing: "何もせんとく"
reloadConfirm: "リロードしてええか?"
@@ -463,7 +467,8 @@ youHaveNoGroups: "グループがあらへんねぇ。"
joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループ作ってからやってな"
noHistory: "履歴はあらへんねぇ。"
signinHistory: "ログイン履歴"
disableAnimatedMfm: "動きがやかましいMFMを止める"
enableAdvancedMfm: "ややこしいMFMもありにする"
enableAnimatedMfm: "動きがやかましいMFMも許したる"
doing: "やっとるがな"
category: "カテゴリ"
tags: "タグ"
@@ -607,7 +612,7 @@ wordMute: "ワードミュート"
regexpError: "正規表現エラー"
regexpErrorDescription: "{tab}ワードミュートの{line}行目の正規表現にエラーが出てきたで:"
instanceMute: "インスタンスミュート"
userSaysSomething: "{name}が何か言ったようやで"
userSaysSomething: "{name}が何か言うとるわ"
makeActive: "使うで"
display: "表示"
copy: "コピー"
@@ -672,8 +677,8 @@ sentReactionsCount: "リアクションした数やで"
receivedReactionsCount: "リアクションされた数"
pollVotesCount: "アンケートに投票した数"
pollVotedCount: "アンケートに投票された数"
yes: "はい"
no: "いいえ"
yes: "ええで"
no: "あかんで"
driveFilesCount: "ドライブのファイル数"
driveUsage: "ドライブ使用量やで"
noCrawle: "クローラーによるインデックスを拒否するで"
@@ -860,6 +865,8 @@ failedToFetchAccountInformation: "アカウントの取得に失敗したみた
rateLimitExceeded: "レート制限が超えたみたいやで"
cropImage: "画像のクロップ"
cropImageAsk: "画像をクロップしたってええか?"
cropYes: "切り抜いたる"
cropNo: "切り抜かへん"
file: "ファイル"
recentNHours: "直近{n}時間"
recentNDays: "直近{n}日"
@@ -937,6 +944,37 @@ cannotPerformTemporary: "一時的に利用できへんで"
cannotPerformTemporaryDescription: "操作回数が制限を超えたから一時的に利用できへんくなったで。ちょっと時間置いてからもう一回やってやー。"
preset: "プリセット"
selectFromPresets: "プリセットから選ぶ"
achievements: "実績"
gotInvalidResponseError: "サーバー黙っとるわ、知らんけど"
gotInvalidResponseErrorDescription: "サーバーいま日曜日。またきて月曜日。"
_achievements:
earnedAt: "貰った日ぃ"
_types:
_notes1:
title: "まいど!"
description: "初めてノート投稿したった"
_notes10:
title: "ノートの天保山"
_notes100:
title: "ノートの真田山"
_notes500:
title: "ノートの生駒山"
_notes5000:
title: "箕面の滝からノート"
_login3:
flavor: "今日からワシはミスキストやで"
_iLoveMisskey:
title: "Misskey好きやねん"
_foundTreasure:
title: "なんでも鑑定団"
_client30min:
title: "ねんね"
_noteDeletedWithin1min:
title: "*おおっと*"
_open3windows:
title: "マド開けすぎ"
_driveFolderCircularReference:
title: "環状線"
_role:
new: "ロールの作成"
edit: "ロールの編集"
@@ -1082,72 +1120,6 @@ _nsfw:
respect: "閲覧注意のメディアは隠すで"
ignore: "閲覧注意のメディアは隠さへんで"
force: "常にメディアを隠すで"
_mfm:
cheatSheet: "MFMチートシート"
intro: "MFMは、Misskey内の色んな所で使える専用のマークアップ言語やで。このページでMFMで使える構文一覧が確認できるで。"
dummy: "MisskeyでFediverseの世界が広がります"
mention: "メンション"
mentionDescription: "アットマーク + ユーザー名で、特定のユーザーを示すことができるで。"
hashtag: "ハッシュタグ"
hashtagDescription: "ナンバーサイン + タグで、ハッシュタグを示すことができるで。"
url: "URL"
urlDescription: "URLを示すことができるで。"
link: "リンク"
linkDescription: "文章の特定の範囲をURLに紐づけることができるで"
bold: "太字"
boldDescription: "文字を太く表示して強調することができるで"
small: "目立たなく"
smallDescription: "内容を小さく・薄く表示することができるで"
center: "中央寄せ"
centerDescription: "内容を中央寄せで表示することができるで"
inlineCode: "コード(インライン)"
inlineCodeDescription: "プログラムとかのコードをインラインでシンタックスハイライトするで"
blockCode: "コード(ブロック)"
blockCodeDescription: "複数行のプログラムとかのコードをブロックでシンタックスハイライトするで"
inlineMath: "数式(インライン)"
inlineMathDescription: "数式(KaTeX)をインラインで表示するで"
blockMath: "数式(ブロック)"
blockMathDescription: "複数行の数式(KaTeX)をブロックで表示するで"
quote: "引用"
quoteDescription: "内容が引用ってことを示すことができるで"
emoji: "カスタム絵文字"
emojiDescription: "コロンでカスタム絵文字名を囲んだると、カスタム絵文字を表示させることができるで"
search: "探す"
searchDescription: "入力済み検索ボックスを表示することができるで"
flip: "反転"
flipDescription: "内容を上下または左右に反転するで"
jelly: "アニメーション(びよんびよん)"
jellyDescription: "びよんびよんするアニメーションやな。"
tada: "アニメーション(じゃーん)"
tadaDescription: "ジャーン!ってな感じのアニメーションやな。"
jump: "アニメーション(ジャンプ)"
jumpDescription: "飛び跳ねるようなアニメーションやな。"
bounce: "アニメーション(バウンド)"
bounceDescription: "ぽよんぽよん弾むようなアニメーションやな。"
shake: "アニメーション(ぶるぶる)"
shakeDescription: "ぶるぶる震えるアニメーションやな。"
twitch: "アニメーション(ブレ)"
twitchDescription: "激しくブレるアニメーションやな。"
spin: "アニメーション(回転)"
spinDescription: "回転するアニメーションやな。"
x2: "大きく"
x2Description: "内容を大きく表示するで"
x3: "とても大きく"
x3Description: "内容をとても大きく表示するで"
x4: "究極に大きく"
x4Description: "内容を究極に大きく表示するで"
blur: "ぼかし"
blurDescription: "内容をぼかすことができるで。ポインターを上に乗せるとはっきり見えるようになるで"
font: "フォント"
fontDescription: "内容のフォントを指定することができるで"
rainbow: "レインボー"
rainbowDescription: "内容をレインボーにするで"
sparkle: "キラキラ"
sparkleDescription: "キラキラしたバーティ来るのエフェクトを追加するで"
rotate: "回転"
rotateDescription: "指定した角度で回転させるで"
plain: "プレーン"
plainDescription: "内側の構文を全部無効にするで"
_instanceTicker:
none: "表示せん"
remote: "リモートユーザーに表示"
@@ -1354,10 +1326,12 @@ _permissions:
_auth:
shareAccess: "「{name}」がアカウントにアクセスすることを許可してええか?"
shareAccessAsk: "アカウントのアクセスを許可してもええか?"
permission: "{name}に次の権限つけたってやって"
permissionAsk: "このアプリは次の権限を要求しとるで"
pleaseGoBack: "アプリケーションに戻ってええよ"
callback: "アプリケーションに戻っとるで"
denied: "アクセスを拒否ったで"
pleaseLogin: "アプリにアクセスさせるんやったら、ログインしてや。"
_antennaSources:
all: "みんなのノート"
homeTimeline: "フォローしとるユーザーのノート"
@@ -1586,6 +1560,7 @@ _notification:
pollEnded: "アンケートの結果が出たみたいや"
unreadAntennaNote: "アンテナ {name}"
emptyPushNotificationMessage: "プッシュ通知の更新をしといたで"
achievementEarned: "実績を獲得しとるで"
_types:
all: "すべて"
follow: "フォロー"
@@ -1627,5 +1602,6 @@ _deck:
tl: "タイムライン"
antenna: "アンテナ"
list: "リスト"
channel: "チャンネル"
mentions: "あんた宛て"
direct: "ダイレクト"

View File

@@ -61,10 +61,6 @@ account: "Imiḍan"
_email:
_follow:
title: "Yeṭṭafaṛ-ik·em-id"
_mfm:
mention: "Bder"
search: "Nadi"
font: "Tasefsit"
_theme:
keys:
mention: "Bder"

View File

@@ -64,8 +64,6 @@ file: "ಕಡತಗಳು"
_email:
_follow:
title: "ಹಿಂಬಾಲಿಸಿದರು"
_mfm:
search: "ಹುಡುಕು"
_sfx:
notification: "ಅಧಿಸೂಚನೆಗಳು"
_widgets:

View File

@@ -110,6 +110,7 @@ clickToShow: "클릭하여 보기"
sensitive: "열람주의"
add: "추가"
reaction: "리액션"
reactions: "리액션"
reactionSetting: "선택기에 표시할 리액션"
reactionSettingDescription2: "끌어서 순서 변경, 클릭해서 삭제, +를 눌러서 추가할 수 있습니다."
rememberNoteVisibility: "공개 범위를 기억하기"
@@ -463,7 +464,6 @@ youHaveNoGroups: "그룹이 없습니다"
joinOrCreateGroup: "다른 그룹의 초대를 받거나, 직접 새 그룹을 만들어 보세요."
noHistory: "기록이 없습니다"
signinHistory: "로그인 기록"
disableAnimatedMfm: "움직임이 있는 MFM을 비활성화"
doing: "잠시만요"
category: "카테고리"
tags: "태그"
@@ -935,12 +935,251 @@ manageCustomEmojis: "커스텀 이모지 관리"
youCannotCreateAnymore: "더 이상 생성할 수 없습니다."
cannotPerformTemporary: "일시적으로 사용할 수 없음"
cannotPerformTemporaryDescription: "조작 횟수 제한을 초과하여 일시적으로 사용이 불가합니다. 잠시 후 다시 시도해 주세요."
preset: "프리셋"
selectFromPresets: "프리셋에서 선택"
achievements: "도전 과제"
_achievements:
earnedAt: "달성 일시"
_types:
_notes1:
title: "미스키 시작했는데요"
description: "첫 노트를 작성했습니다"
flavor: "Misskey에 오신 것을 환영합니다!"
_notes10:
title: "노트 조금"
description: "10개의 노트를 작성했습니다"
_notes100:
title: "노트 많이"
description: "100개의 노트를 작성했습니다"
_notes500:
title: "노트로 뒤덮여버렸어"
description: "500개의 노트를 작성했습니다"
_notes1000:
title: "노트만 산더미"
description: "1,000개의 노트를 작성했습니다"
_notes5000:
title: "노트가 어디서 솟아?"
description: "5,000개의 노트를 작성했습니다"
_notes10000:
title: "슈퍼 노트"
description: "10,000개의 노트를 작성했습니다"
_notes20000:
title: "노트 더 없어?"
description: "20,000개의 노트를 작성했습니다"
_notes30000:
title: "노트노트노트"
description: "30,000개의 노트를 작성했습니다"
_notes40000:
title: "노트 공장"
description: "40,000개의 노트를 작성했습니다"
_notes50000:
title: "노트 행성"
description: "50,000개의 노트를 작성했습니다"
_notes60000:
title: "노트 퀘이사"
description: "60,000개의 노트를 작성했습니다"
_notes70000:
title: "노트 블랙홀"
description: "70,000개의 노트를 작성했습니다"
_notes80000:
title: "노트 은하"
description: "80,000개의 노트를 작성했습니다"
_notes90000:
title: "노트 우주"
description: "90,000개의 노트를 작성했습니다"
_notes100000:
title: "ALL YOUR NOTE ARE BELONG TO US"
description: "100,000개의 노트를 작성했습니다"
flavor: "이만큼 쓸 일도 없겠지만... 다른 할 일이 있진 않으신가요?"
_login3:
title: "비기너 I"
description: "총 3일간 로그인했습니다"
flavor: "오늘부터 여러분도 미스키스트에요!"
_login7:
title: "비기너 II"
description: "총 7일간 로그인했습니다"
flavor: "슬슬 익숙해지셨나요?"
_login15:
title: "비기너 III"
description: "총 15일간 로그인했습니다"
_login30:
title: "미스키스트 I"
description: "총 30일간 로그인했습니다"
_login60:
title: "미스키스트 II"
description: "총 60일간 로그인했습니다"
_login100:
title: "미스키스트 III"
description: "총 100일간 로그인했습니다"
flavor: "그 유저, 미스키스트이다"
_login200:
title: "단골 I"
description: "총 200일간 로그인했습니다"
_login300:
title: "단골 II"
description: "총 300일간 로그인했습니다"
_login400:
title: "단골 III"
description: "총 400일간 로그인했습니다"
_login500:
title: "베테랑 I"
description: "총 500일간 로그인했습니다"
flavor: "제군, 나는 노트가 좋다"
_login600:
title: "베테랑 II"
description: "총 600일간 로그인했습니다"
_login700:
title: "베테랑 III"
description: "총 700일간 로그인했습니다"
_login800:
title: "노트 마스터 I"
description: "총 800일간 로그인했습니다"
_login900:
title: "노트 마스터 II"
description: "총 900일간 로그인했습니다"
_login1000:
title: "노트 마스터 III"
description: "총 1,000일간 로그인했습니다"
flavor: "Misskey를 사용해 주셔서 감사합니다!"
_noteClipped1:
title: "클립할 수밖에 없었어"
description: "처음으로 노트를 클립했습니다"
_noteFavorited1:
title: "별을 바라보는 자"
description: "처음으로 노트를 즐겨찾기했습니다"
_myNoteFavorited1:
title: "별을 원하는 자"
description: "다른 사람이 당신의 노트를 즐겨찾기했습니다"
_profileFilled:
title: "준비 완료"
description: "프로필 설정을 완료했습니다"
_markedAsCat:
title: "나는 고양이다냥!"
description: "계정을 고양이로 설정했습니다냥"
flavor: "냐냐냐냐냐냐아아아아앙!"
_following1:
title: "첫 팔로우"
description: "사용자를 처음으로 팔로우했습니다"
_following10:
title: "팔로우, 팔로우"
description: "10명의 사용자를 팔로우했습니다"
_following50:
title: "친구 잔뜩"
description: "50명의 사용자를 팔로우했습니다"
_following100:
title: "주소록 한 권으론 부족해"
description: "100명의 사용자를 팔로우했습니다"
_following300:
title: "친구가 넘쳐나"
description: "300명의 사용자를 팔로우했습니다"
_followers1:
title: "첫 팔로워"
description: "사용자가 처음으로 팔로잉했습니다"
_followers10:
title: "팔로우 미!"
description: "10명의 사용자가 팔로우했습니다"
_followers50:
title: "이곳저곳"
description: "50명의 사용자가 팔로우했습니다"
_followers100:
title: "인기왕"
description: "100명의 사용자가 팔로우했습니다"
_followers300:
title: "줄 좀 서봐요"
description: "100명의 사용자가 팔로우했습니다"
_followers500:
title: "기지국"
description: "500명의 사용자가 팔로우했습니다"
_followers1000:
title: "유명인사"
description: "1,000명의 사용자가 팔로우했습니다"
_collectAchievements30:
title: "도전 과제 콜렉터"
description: "30개의 도전과제를 획득했습니다"
_viewAchievements3min:
title: "저 도전과제 좋아해요"
description: "도전 과제 목록을 3분 이상 쳐다봤습니다"
_iLoveMisskey:
title: "I Love Misskey"
description: "\"I ❤ #Misskey\"를 포스트했습니다"
flavor: "Misskey를 이용해주셔서 감사합니다! - 개발팀 일동"
_foundTreasure:
title: "보물찾기"
description: "숨겨진 보물을 발견했습니다"
_client30min:
title: "잠깐 쉬어"
description: "클라이언트를 시작하고 30분이 경과하였습니다"
_noteDeletedWithin1min:
title: "있었는데요 없었습니다"
description: "노트를 포스트한 후 1분 이내에 삭제했습니다"
_postedAtLateNight:
title: "올빼미"
description: "한밤중에 노트를 포스트했습니다"
flavor: "잠 좀 자세요. 걱정돼요."
_postedAt0min0sec:
title: "정각"
description: "0분 0초 정각에 노트를 작성했습니다"
flavor: "째깍 째깍 째깍 땡!"
_selfQuote:
title: "혼잣말"
description: "자기 노트를 인용했습니다"
_htl20npm:
title: "타임라인 폭주 중"
description: "1분 사이에 홈 타임라인에 노트가 20개 넘게 생성되었습니다"
_viewInstanceChart:
title: "애널리스트"
description: "인스턴스의 차트를 열었습니다"
_outputHelloWorldOnScratchpad:
title: "Hello, world!"
description: "스크래치패드에서 hello world를 출력했습니다"
_open3windows:
title: "멀티 윈도우"
description: "3개 이상의 창을 열었습니다"
_driveFolderCircularReference:
title: "순환 참조"
description: "드라이브 폴더를 자신을 가리키도록 만드려 시도했습니다"
_reactWithoutRead:
title: "읽고 답하긴 하시는 건가요?"
description: "100자가 넘는 노트가 작성되고 3초 안에 반응했습니다"
_clickedClickHere:
title: "여길 눌러보세요"
description: "여길을 눌러봤습니다"
_justPlainLucky:
title: "그냥 운이 좋았어"
description: "매 10초마다 0.01%의 확률로 달성됩니다"
_setNameToSyuilo:
title: "신 콤플렉스"
description: "이름을 syuilo로 설정했습니다"
_passedSinceAccountCreated1:
title: "1주년"
description: "계정을 생성하고 1년이 지났습니다"
_passedSinceAccountCreated2:
title: "2주년"
description: "계정을 생성하고 2년이 지났습니다"
_passedSinceAccountCreated3:
title: "3주년"
description: "계정을 생성하고 3년이 지났습니다"
_loggedInOnBirthday:
title: "생일 축하합니다!"
description: "생일에 로그인했습니다"
_loggedInOnNewYearsDay:
title: "새해 복 많이 받으세요"
description: "새해 첫 날에 로그인했습니다"
flavor: "올해에도 저희 인스턴스에 관심을 가져 주셔서 감사합니다"
_cookieClicked:
title: "쿠키를 클릭하는 게임"
description: "쿠키를 클릭했습니다"
flavor: "소프트웨어 착각하지 않으셨나요?"
_brainDiver:
title: "Brain Diver"
description: "Brain Diver로의 링크를 첨부했습니다"
flavor: "Misskey-Misskey La-Tu-Ma"
_role:
new: "새 역할 생성"
edit: "역할 수정"
name: "역할 이름"
description: "역할 설명"
permission: "역할 권한"
permission: "역할 권한"
descriptionOfPermission: "<b>모더레이터</b>는 기본적인 중재와 관련된 작업을 수행할 수 있습니다.\n<b>관리자</b>는 인스턴스의 모든 설정을 변경할 수 있습니다."
assignTarget: "할당 대상"
descriptionOfAssignTarget: "<b>수동</b>을 선택하면 누가 이 역할에 포함되는지를 수동으로 관리할 수 있습니다.\n<b>조건부</b>를 선택하면 조건을 설정해 일치하는 사용자를 자동으로 포함되게 할 수 있습니다."
@@ -948,7 +1187,7 @@ _role:
conditional: "조건부"
condition: "조건"
isConditionalRole: "조건부 역할입니다."
isPublic: "공개 역할"
isPublic: "역할 공개"
descriptionOfIsPublic: "역할에 할당된 사용자를 누구나 볼 수 있습니다. 또한 사용자 프로필에 이 역할이 표시됩니다."
options: "옵션"
policies: "정책"
@@ -956,7 +1195,7 @@ _role:
useBaseValue: "기본값 사용"
chooseRoleToAssign: "할당할 역할 선택"
canEditMembersByModerator: "모더레이터의 역할 수정 허용"
descriptionOfCanEditMembersByModerator: "이 옵션을 켜면 모더레이터도 이 역할에 사용자를 추가하거나 삭제할 수 있습니다. 꺼져 있으면 관리자만 가능합니다."
descriptionOfCanEditMembersByModerator: "이 옵션을 켜면 모더레이터도 이 역할에 사용자를 할당하거나 삭제할 수 있습니다. 꺼져 있으면 관리자만 할당이 가능합니다."
priority: "우선순위"
_priority:
low: "낮음"
@@ -971,19 +1210,20 @@ _role:
driveCapacity: "드라이브 용량"
pinMax: "고정할 수 있는 노트 수"
antennaMax: "최대 안테나 생성 허용 수"
wordMuteMax: "뮤트할 수 있는 단어의 수"
webhookMax: "생성할 수 있는 WebHook의 수"
wordMuteMax: "단어 뮤트할 수 있는 문자 수"
webhookMax: "생성할 수 있는 웹훅 수"
clipMax: "생성할 수 있는 클립 수"
noteEachClipsMax: "각 클립에 추가할 수 있는 노트 수"
userListMax: "생성할 수 있는 리스트 수"
userEachUserListsMax: "리스트당 최대 사용자 수"
userListMax: "생성할 수 있는 유저 리스트 수"
userEachUserListsMax: "유저 리스트당 최대 사용자 수"
rateLimitFactor: "속도 제한"
descriptionOfRateLimitFactor: "작을수록 제한이 완화되고, 클수록 제한이 강화됩니다."
canHideAds: "광고 숨기기"
_condition:
isLocal: "로컬 사용자"
isRemote: "리모트 사용자"
createdLessThan: "다음 일수 이내에 가입한 유저"
createdMoreThan: "다음 일수 이상 활동한 유저"
createdLessThan: "가압한 지 다음 일수 이내 유저"
createdMoreThan: "가입한 지 다음 일수 이상 유저"
followersLessThanOrEq: "팔로워 수가 다음 이하인 유저"
followersMoreThanOrEq: "팔로워 수가 다음 이상인 유저"
followingLessThanOrEq: "팔로잉 수가 다음 이하인 유저"
@@ -1079,72 +1319,6 @@ _nsfw:
respect: "열람주의로 설정된 미디어 숨기기"
ignore: "열람 주의 미디어 항상 표시"
force: "미디어 항상 숨기기"
_mfm:
cheatSheet: "MFM 도움말"
intro: "MFM는 Misskey의 다양한 곳에서 사용할 수 있는 전용 마크업 언어입니다. 여기에서는 MFM에서 사용할 수 있는 구문을 확인할 수 있습니다."
dummy: "Misskey로 연합우주의 세계가 펼쳐집니다"
mention: "멘션"
mentionDescription: "골뱅이표(@) 뒤에 사용자명을 넣어 특정 유저를 나타낼 수 있습니다."
hashtag: "해시태그"
hashtagDescription: "샵 또는 우물정자(#)를 앞에 붙여서 해시태그를 나타낼 수 있습니다."
url: "URL"
urlDescription: "URL을 나타낼 수 있습니다."
link: "링크"
linkDescription: "문장의 특정 범위를 URL로 표시합니다."
bold: "굵음/볼드체"
boldDescription: "문자를 굵게 강조합니다."
small: "눈에 띄지 않음"
smallDescription: "내용을 작고 연하게 보이게 합니다."
center: "가운데 정렬"
centerDescription: "내용을 가운데 정렬로 보이게 합니다."
inlineCode: "코드(인라인)"
inlineCodeDescription: "여러 행의 코드를 문법 강조를 적용하여 인라인으로 표시합니다."
blockCode: "코드(블록)"
blockCodeDescription: "여러 행의 코드를 문법 강조를 적용하여 블록으로 표시합니다."
inlineMath: "수식(인라인)"
inlineMathDescription: "수식(KaTeX)를 인라인으로 보이게 합니다."
blockMath: "수식(블록)"
blockMathDescription: "여러 줄의 수식(KaTeX)를 블록으로 보이게 합니다."
quote: "인용"
quoteDescription: "내용을 인용문으로 표시합니다."
emoji: "커스텀 이모지"
emojiDescription: "커스텀 이모지의 이름을 쌍점(:)으로 감싸서 커스텀 이모지를 사용합니다."
search: "검색"
searchDescription: "주어진 키워드가 입력된 검색창을 보이게 합니다."
flip: "플립"
flipDescription: "내용을 상하 또는 좌우로 반전시킵니다."
jelly: "애니메이션 (젤리)"
jellyDescription: "젤리처럼 탱글탱글한 느낌의 효과를 줍니다."
tada: "애니메이션 (짠!)"
tadaDescription: "짠! 하는 느낌의 효과를 줍니다."
jump: "애니메이션(점프)"
jumpDescription: "펄쩍 뛸 듯한 느낌의 효과를 줍니다."
bounce: "애니메이션 (바운스)"
bounceDescription: "통통 튀는 느낌의 효과를 줍니다."
shake: "애니메이션 (부들부들)"
shakeDescription: "부들부들 떠는 느낌의 효과를 줍니다."
twitch: "애니메이션 (경련)"
twitchDescription: "격하게 흔들리는 느낌의 효과를 줍니다."
spin: "애니메이션 (회전)"
spinDescription: "회전 효과를 줍니다."
x2: "크게"
x2Description: "내용을 크게 표시합니다."
x3: "더 크게"
x3Description: "내용을 더 크게 표시합니다."
x4: "매우 크게"
x4Description: "내용을 매우 크게 표시합니다."
blur: "흐림"
blurDescription: "내용이 흐리게 보입니다. 마우스를 위에 올려두면 내용이 보입니다."
font: "폰트"
fontDescription: "내용의 글꼴을 지정할 수 있습니다."
rainbow: "무지개"
rainbowDescription: "내용을 무지개로 표시합니다."
sparkle: "반짝반짝"
sparkleDescription: "반짝이는 파티클 효과를 추가합니다."
rotate: "회전"
rotateDescription: "지정한 각도로 회전시킵니다."
plain: "평문"
plainDescription: "안에 있는 MFM 구문을 모두 무시하고 평문으로 표시합니다."
_instanceTicker:
none: "보이지 않음"
remote: "리모트 유저에게만 보이기"
@@ -1583,6 +1757,7 @@ _notification:
pollEnded: "투표 결과가 발표되었습니다"
unreadAntennaNote: "안테나 {name}"
emptyPushNotificationMessage: "푸시 알림이 갱신되었습니다"
achievementEarned: "도전 과제를 달성했습니다"
_types:
all: "전부"
follow: "팔로잉"
@@ -1624,5 +1799,6 @@ _deck:
tl: "타임라인"
antenna: "안테나"
list: "리스트"
channel: "채널"
mentions: "받은 멘션"
direct: "다이렉트"

239
locales/lo-LA.yml Normal file
View File

@@ -0,0 +1,239 @@
---
_lang_: "ພາສາລາວ"
headlineMisskey: "ເຊື່ອມຕໍ່ເຄືອຂ່າຍໂດຍຫມາຍເຫດ"
introMisskey: "ຍິນດີຕ້ອນຮັບ! Misskey ເປັນແຫຼ່ງເປີດ, ການບໍລິການ microblogging ກະຈາຍ\nສ້າງ \"ບັນທຶກ\" ເພື່ອແບ່ງປັນຄວາມຄິດຂອງທ່ານກັບທຸກໆຄົນທີ່ຢູ່ອ້ອມຮອບທ່ານ 📡\nດ້ວຍ \"ປະຕິກິລິຍາ\", ທ່ານຍັງສາມາດສະແດງຄວາມຮູ້ສຶກຂອງທ່ານຢ່າງໄວວາກ່ຽວກັບບັນທຶກຂອງທຸກໆຄົນ 👍\nມາສຳຫຼວດໂລກໃໝ່! 🚀"
poweredByMisskeyDescription: "{name} ແມ່ນສ່ວນໜຶ່ງຂອງການບໍລິການທີ່ຂັບເຄື່ອນໂດຍແພລດຟອມ open source. <b>Misskey</b> (ເອີ້ນວ່າ \"Misskey instance\")"
monthAndDay: "{ເດືອນ}/{ມື້}"
search: "ຄົ້ນຫາ"
notifications: "ການແຈ້ງເຕືອນ"
username: "ຊື່ຜູ້ໃຊ້"
password: "ລະຫັດຜ່ານ"
forgotPassword: "ລືມລະຫັດຜ່ານ"
fetchingAsApObject: "ກຳລັງດຶງຂໍ້ມູນຈາກ fediverse..."
ok: "ຕົກ​ລົງ"
gotIt: "ເຂົ້າໃຈແລ້ວ!"
cancel: "ຍົກເລີກ"
noThankYou: "ບໍ່​ແມ່ນ​ຕອນ​ນີ້"
enterUsername: "ປ້ອນຊື່ຜູ້ໃຊ້"
renotedBy: "Renoted ໂດຍ {ຜູ້ໃຊ້}"
noNotes: "ບໍ່ມີຫມາຍເຫດ"
noNotifications: "ບໍ່ມີການແຈ້ງເຕືອນ"
instance: "ອີນສະແຕນ"
settings: "ກຳນົດຄ່າ"
basicSettings: "ການຕັ້ງຄ່າພື້ນຖານ"
otherSettings: "ການຕັ້ງຄ່າອື່ນໆ"
openInWindow: "ເປີດຢູ່ໃນປ່ອງຢ້ຽມ"
profile: "ໂພຼຟາຍ"
timeline: "​ເສັ້ນກຳ​ນົດ​ເວ​ລາ​"
noAccountDescription: "ຜູ້ໃຊ້ນີ້ຍັງບໍ່ໄດ້ຂຽນໃນຊີວະປະຫວັດຂອງເຂົາເຈົ້າເທື່ອ"
login: "ເຂົ້າ​ສູ່​ລະ​ບົບ"
loggingIn: "ກຳລັງເຂົ້າສູ່ລະບົບ..."
logout: "ອອກ​ຈາກ​ລະ​ບົບ"
signup: "ລົງ​ທະ​ບຽນ"
uploading: "ການອັບໂຫຼດ..."
save: "ບັນທຶກ"
users: "ຜູ້ໃຊ້ຕ່າງໆ"
addUser: "ເພີ່ມຜູ້ໃຊ້"
favorite: "ເພີ່ມໃສ່ລາຍການທີ່ມັກ"
favorites: "ລາຍການທີ່ມັກ"
unfavorite: "ລຶບອອກຈາກລາຍການທີ່ມັກ"
favorited: "ເພີ່ມໃສ່ລາຍການທີ່ມັກແລ້ວ"
alreadyFavorited: "ເພີ່ມເຂົ້າໃນລາຍການທີ່ມັກແລ້ວ."
cantFavorite: "ບໍ່ສາມາດເພີ່ມໃສ່ລາຍການທີ່ມັກໄດ້."
pin: "ປັກໝຸດໄປຫາໂປຣໄຟລ໌"
unpin: "ຖອດປັກໝຸດອອກຈາກໂປຣໄຟລ໌"
copyContent: "ຄັດລອກເນື້ອຫາ"
copyLink: "ສຳເນົາລິ້ງ"
delete: "ລຶບ"
deleteAndEdit: "ລົບ​ແລະ​ແກ້​ໄຂ​"
deleteAndEditConfirm: "ເຈົ້າ​ແນ່​ໃຈ​ບໍ່? ທີ່ທ່ານຕ້ອງການທີ່ຈະລຶບບັນທຶກນີ້ແລະແກ້ໄຂມັນ ທ່ານອາດຈະສູນເສຍການໂຕ້ຕອບ, ບັນທຶກ, ແລະການຕອບກັບທັງໝົດ"
addToList: "ເພີ່ມໃສ່ລາຍຊື່"
sendMessage: "ສົ່ງຂໍ້ຄວາມ"
copyRSS: "ສຳເນົາ RSS"
copyUsername: "ສຳເນົາຊື່ຜູ້ໃຊ້"
searchUser: "ຄົ້ນຫາຜູ້ໃຊ້"
reply: "ຕອບ​ໄປ​ທີ"
loadMore: "ໂຫຼດເພີ່ມເຕີມ"
showMore: "ໂຫຼດເພີ່ມເຕີມ"
showLess: "ປິດ"
youGotNewFollower: "ໄດ້ຕິດຕາມທ່ານ"
receiveFollowRequest: "ປະຕິບັດຕາມຄໍາຮ້ອງຂໍທີ່ໄດ້ຮັບ"
followRequestAccepted: "ຜູ້ຕິດຕາມໄດ້ຍອມຮັບຄໍາຮ້ອງຂໍຂອງທ່ານ"
mention: "ໄດ້ກ່າວມາ"
mentions: "ກ່າວເຖິງ"
directNotes: "ໂດຍກົງຫມາຍເຫດ"
importAndExport: "ນໍາເຂົ້າ / ສົ່ງອອກ"
import: "ນຳເຂົ້າ"
export: "ນຳອອກ"
files: "ໄຟລ໌"
download: "ດາວໂຫລດ"
driveFileDeleteConfirm: "ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການລຶບໄຟລ໌ \"{name}\"? ບັນທຶກທີ່ມີໄຟລ໌ແນບນີ້ຈະຖືກລຶບຖິ້ມ"
unfollowConfirm: "ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການເຊົາຕິດຕາມ {name}?"
exportRequested: "ໃນເວລາທີ່ທ່ານໄດ້ຮ້ອງຂໍການສົ່ງອອກ ມັນອາດຈະໃຊ້ເວລາບາງເວລາ ແລະມັນຈະຖືກເພີ່ມໃສ່ drive ຂອງທ່ານເມື່ອມັນສຳເລັດແລ້ວ"
importRequested: "ໃນເວລາທີ່ທ່ານໄດ້ຮ້ອງຂໍການນໍາເຂົ້າ ມັນອາດຈະໃຊ້ເວລາບາງເວລາ"
lists: "ລາຍການ"
noLists: "ທ່ານ​ບໍ່​ມີ​ລາຍ​ການ​ໃດໆ​"
note: "ບັນທຶກ"
notes: "ບັນທຶກ"
following: "ກຳລັງຕິດຕາມ"
followers: "ຜູ້ຕິດຕາມ"
followsYou: "ຕິດ​ຕາມ​ເຈົ້າ"
createList: "ສ້າງລາຍຊື່"
manageLists: "ການບໍລິຫານບັນຊີລາຍການ"
error: "ຂໍ້ຜິດພາດ"
somethingHappened: "​ອຸຍ, ມີ​ບາງ​ຢ່າງ​ຜິ​ດ​ພາດ"
retry: "ລອງໃຫມ່"
pageLoadError: "ເກີດຄວາມຜິດພາດໃນການໂຫລດໜ້ານີ້"
pageLoadErrorDescription: "ປົກກະຕິແລ້ວມັນເກີດຈາກຄວາມຜິດພາດເຄືອຂ່າຍ ຫຼື cache ຂອງຕົວທ່ອງເວັບ ລອງລຶບລ້າງແຄດແລ້ວລອງໃໝ່ພາຍຫຼັງສອງສາມນາທີ"
serverIsDead: "ເຊີບເວີນີ້ບໍ່ຕອບສະໜອງ ກະລຸນາລໍຖ້າຈັກໜ່ອຍແລ້ວລອງໃໝ່ອີກຄັ້ງ"
youShouldUpgradeClient: "ເພື່ອເບິ່ງໜ້ານີ້, ກະລຸນາໂຫຼດຂໍ້ມູນຄືນໃໝ່ເພື່ອອັບເດດລູກຄ້າຂອງທ່ານ"
enterListName: "ໃສ່ຊື່ສຳລັບລາຍຊື່"
privacy: "ຄວາມເປັນສ່ວນຕົວ"
makeFollowManuallyApprove: "ປະຕິບັດຕາມການຮ້ອງຂໍຮຽກຮ້ອງໃຫ້ມີການອະນຸມັດ"
defaultNoteVisibility: "ເປັນຄ່າເລີ່ມຕົ້ນ"
follow: "ກຳລັງຕິດຕາມ"
followRequest: "ສົ່ງ​ການ​ຮ້ອງ​ຂໍ​ປະ​ຕິ​ບ​ຕາມ​"
followRequests: "ປະຕິບັດຕາມຄໍາຮ້ອງຂໍ"
unfollow: "ເຊົາຕິດຕາມ"
followRequestPending: "ປະຕິບັດຕາມຄໍາຮ້ອງຂໍທີ່ລໍຖ້າຢູ່"
enterEmoji: "ປ້ອນອີໂມຈິ"
renote: "Renote"
unrenote: "ເລີກ Renote"
renoted: "ເກັບບັນທຶກໄວ້"
quote: "ລວມຂໍ້ຄວາມອ້າງອີງ"
pinnedNote: "ບັນທຶກທີ່ປັກໝຸດໄວ້"
pinned: "ປັກໝຸດໄປຫາໂປຣໄຟລ໌"
you: "ເຈົ້າ"
clickToShow: "ກົດເພື່ອສະແດງໃຫ້ເຫັນ"
sensitive: "NSFW"
add: "ເພີ່ມ"
reaction: "ປະຕິກິລິຍາ"
reactions: "ປະຕິກິລິຍາ"
mute: "ປີດສຽງ"
unmute: "ເປີດສຽງ"
block: "ບ໋ອກ"
unblock: "ຍົກເລີກກາຮົບລັອກ"
suspend: "ລະງັບ"
unsuspend: "ເຊົາ​ລະ​ງັບ"
selectList: "ເລືອກບັນຊີລາຍການ"
selectWidget: "ເລືອກວິກເຈັດ"
editWidgets: "ແກ້ໄຂ Widget"
editWidgetsExit: "ສຳເລັດແລ້ວ"
customEmojis: "ອີໂມຈິແບບກຳນົດເອງ"
emoji: "ອີໂມຈິ"
emojis: "ອີໂມຈິ"
emojiName: "ຊື່ Emoji"
emojiUrl: "URL ອີໂມຈິ"
addEmoji: "ຕື່ມອີໂມຈິ"
flagAsBot: "ໝາຍບັນຊີນີ້ເປັນບັອດ"
flagAsCat: "ໝາຍບັນຊີນີ້ເປັນແມວ"
flagAsCatDescription: "ເປີດໃຊ້ຕົວເລືອກນີ້ເພື່ອໝາຍບັນຊີນີ້ເປັນແມວ"
flagShowTimelineReplies: "ສະແດງການຕອບກັບໃນທາມລາຍ"
flagShowTimelineRepliesDescription: "ສະແດງການຕອບກັບຂອງຜູ້ໃຊ້ຕໍ່ກັບບັນທຶກຂອງຜູ້ໃຊ້ອື່ນໃນທາມລາຍຖ້າເປີດໃຊ້ງານ"
autoAcceptFollowed: "ອະນຸມັດອັດຕະໂນມັດຕາມຄຳຮ້ອງຂໍຈາກຜູ້ໃຊ້ທີ່ທ່ານກຳລັງຕິດຕາມຢູ່"
addAccount: "ເພີ່ມບັນຊີ"
loginFailed: "ການເຂົ້າສູ່ລະບົບບໍ່ສຳເລັດ"
general: "ທົ່ວໄປ"
wallpaper: "ພາບພື້ນຫລັງ"
setWallpaper: "ຕັ້ງເປັນພາບພື້ນຫຼັງ"
instances: "ອີນສະແຕນ"
instanceInfo: "ອີນສະແຕນ"
statistics: "ສະຖິຕິ"
clearQueue: "ລ້າງຄິວ"
clearCachedFiles: "ລຶບລ້າງແຄສ"
editProfile: "ແກ້ໄຂໂປຣໄຟລ໌"
done: "ສຳເລັດ"
processing: "ກຳລັງປະມວນຜົນ"
preview: "ສະແດງເປັນຕົວຢ່າງ"
default: "ຄ່າເລີ່ມຕົ້ນ"
blocked: "ບລັອກແລ້ວ "
all: "ທັງໝົດ"
subscribing: "ສະໝັກສະມາຊິກແລັວ"
publishing: "ການ​ພິມ​ເຜີຍ​ແຜ່"
notResponding: "ບໍ່ຕອບສະໜອງ"
instanceFollowing: "ກຳລັງຕິດຕາມສຸດຕົວຢ່າງ"
instanceFollowers: "ຜູ້ຕິດຕາມຕົວຢ່າງ"
instanceUsers: "ຜູ້​ຊົມ​ໃຊ້​ຂອງ​ຕົວ​ຢ່າງ​ນີ້​"
changePassword: "ປ່ຽນ​ລະ​ຫັດ​ຜ່ານ"
featured: "ໄຮໄລທ໌"
announcements: "ປະກາດ"
remove: "ລຶບ"
messaging: "ແຊ໋ດ"
tos: "ເງື່ອນໄຂການໃຫ້ບໍລິການ"
start: "ເລີ່ມຕົ້ນນຳໃຊ້ເລີຍ"
home: "ໜ້າຫຼັກ"
images: "ຮູບພາບ"
birthday: "ວັນເກີດ"
registeredDate: "ວັນທີ່ເປັນສະມາຊິກ"
location: "ທີ່ຕັ້ງ"
theme: "ແທ໋ມ"
light: "ສະຫວ່າງ"
dark: "ມືດ"
lightThemes: "ຊຸດຮູບແບບສະຫວ່າງ"
darkThemes: "ຮູບແບບສີສັນມືດ"
fileName: "ຊື່ໄຟລ໌"
selectFile: "ເລືອກໄຟລ໌"
selectFiles: "ເລືອກໄຟລ໌"
nsfw: "NSFW"
accept: "ອະນຸຍາດ"
pinnedNotes: "ບັນທຶກທີ່ປັກໝຸດໄວ້"
userList: "ລາຍການ"
smtpUser: "ຊື່ຜູ້ໃຊ້"
smtpPass: "ລະຫັດຜ່ານ"
clearCache: "ລຶບລ້າງແຄສ"
user: "ຜູ້ໃຊ້ຕ່າງໆ"
searchByGoogle: "ຄົ້ນຫາ"
file: "ໄຟລ໌"
_email:
_follow:
title: "ໄດ້ຕິດຕາມທ່ານ"
_theme:
keys:
mention: "ໄດ້ກ່າວມາ"
renote: "Renote"
_sfx:
note: "ບັນທຶກ"
notification: "ການແຈ້ງເຕືອນ"
chat: "ແຊ໋ດ"
_widgets:
profile: "ໂພຼຟາຍ"
instanceInfo: "ອີນສະແຕນ"
notifications: "ການແຈ້ງເຕືອນ"
timeline: "​ເສັ້ນກຳ​ນົດ​ເວ​ລາ​"
_userList:
chooseList: "ເລືອກບັນຊີລາຍການ"
_cw:
show: "ໂຫຼດເພີ່ມເຕີມ"
_visibility:
home: "ໜ້າຫຼັກ"
followers: "ຜູ້ຕິດຕາມ"
_profile:
username: "ຊື່ຜູ້ໃຊ້"
_exportOrImport:
followingList: "ກຳລັງຕິດຕາມ"
muteList: "ປີດສຽງ"
blockingList: "ບ໋ອກ"
userLists: "ລາຍການ"
_timelines:
home: "ໜ້າຫຼັກ"
_pages:
blocks:
image: "ຮູບພາບ"
_notification:
youWereFollowed: "ໄດ້ຕິດຕາມທ່ານ"
_types:
follow: "ກຳລັງຕິດຕາມ"
mention: "ໄດ້ກ່າວມາ"
renote: "Renote"
quote: "ລວມຂໍ້ຄວາມອ້າງອີງ"
reaction: "ປະຕິກິລິຍາ"
_actions:
reply: "ຕອບ​ໄປ​ທີ"
renote: "Renote"
_deck:
_columns:
notifications: "ການແຈ້ງເຕືອນ"
tl: "​ເສັ້ນກຳ​ນົດ​ເວ​ລາ​"
list: "ລາຍການ"
channel: "ຊ່ອງ"
mentions: "ກ່າວເຖິງ"

View File

@@ -109,6 +109,7 @@ clickToShow: "Klik om te bekijken"
sensitive: "NSFW"
add: "Toevoegen"
reaction: "Reacties"
reactions: "Reacties"
reactionSetting: "Reacties die in de reactie-selector worden getoond"
reactionSettingDescription2: "Sleep om opnieuw te ordenen, Klik om te verwijderen, Druk op \"+\" om toe te voegen"
rememberNoteVisibility: "Vergeet niet de notitie zichtbaarheidsinstellingen"
@@ -426,11 +427,6 @@ loggedInAsBot: "Momenteel als bot ingelogd"
_email:
_follow:
title: "volgde jou"
_mfm:
mention: "Vermelding"
quote: "Quote"
emoji: "Maatwerk emoji"
search: "Zoeken"
_theme:
keys:
mention: "Vermelding"

View File

@@ -110,6 +110,7 @@ clickToShow: "Kliknij, aby wyświetlić"
sensitive: "NSFW"
add: "Dodaj"
reaction: "Reakcja"
reactions: "Reakcja"
reactionSetting: "Reakcje do pokazania w wyborniku reakcji"
reactionSettingDescription2: "Przeciągnij aby zmienić kolejność, naciśnij aby usunąć, naciśnij „+” aby dodać"
rememberNoteVisibility: "Zapamiętuj ustawienia widoczności wpisu"
@@ -460,7 +461,6 @@ youHaveNoGroups: "Nie masz żadnych grup"
joinOrCreateGroup: "Uzyskaj zaproszenie do dołączenia do grupy lub utwórz własną grupę."
noHistory: "Brak historii"
signinHistory: "Historia logowania"
disableAnimatedMfm: "Wyłącz MFM z animacją"
doing: "Przetwarzanie..."
category: "Kategoria"
tags: "Tagi"
@@ -957,68 +957,6 @@ _nsfw:
respect: "Ukrywaj media NSFW"
ignore: "Nie ukrywaj mediów NSFW"
force: "Ukrywaj wszystkie media"
_mfm:
cheatSheet: "Ściąga MFM"
intro: "MFM to język składniowy wyjątkowy dla Misskey, który może być użyty w wielu miejscach. Tu znajdziesz listę wszystkich możliwych elementów składni MFM."
dummy: "Misskey rozszerza świat Fediwersum"
mention: "Wspomnij"
mentionDescription: "Używając znaku @ i nazwy użytkownika, możesz określić danego użytkownika."
hashtag: "Hashtag"
hashtagDescription: "Używając kratki i tekstu, możesz określić hashtag."
url: "Adres URL"
urlDescription: "Adresy URL mogą być wyświetlane"
link: "Odnośnik"
linkDescription: "Określone części tekstu mogą być wyświetlane jako adres URL."
bold: "Pogrubienie"
boldDescription: "Wyróżnia litery pogrubiając je."
small: "Małe"
smallDescription: "Wyświetla treść jako małą i cienką."
center: "Wyśrodkowanie"
centerDescription: "Wyśrodkowuje zawartość."
inlineCode: "Kod (w wierszu)"
blockCode: "Kod (blok)"
blockCodeDescription: "Wyświetla kod z podświetlaną składnią składający się z wielu linii."
blockMath: "Matematyka (Blok)"
quote: "Cytuj"
quoteDescription: "Wyświetla treść jako cytat."
emoji: "Niestandardowe emoji"
emojiDescription: "Otaczając nazwę niestandardowego emoji dwukropkami, możesz użyć niestandardowego emoji."
search: "Szukaj"
searchDescription: "Wyświetla pole wyszukiwania z wcześniej wpisanym tekstem."
flip: "Odwróć"
flipDescription: "Przerzuca treść poziomo lub pionowo."
jelly: "Animacja (Galaretka)"
jellyDescription: "Nadaje treści galaretowatą animację."
tada: "Animation (Tada)"
tadaDescription: "Nadaje treści animację podobną do \"Tada!\"."
jump: "Animacja (Skok)"
jumpDescription: "Nadaje treści animację skakania."
bounce: "Animacja (Odbijanie)"
bounceDescription: "Nadaje treści animację odbijania się."
shake: "Animacja (Wstrząsanie)"
shakeDescription: "Nadaje treści animację wstrząsania."
twitch: "Animacja (Drganie)"
twitchDescription: "Nadaje treści mocno drgającą animację."
spin: "Animacja (Obrót)"
spinDescription: "Nadaje treści animację obracania."
x2: "Duże"
x2Description: "Czyni treść większą."
x3: "Bardzo duże"
x3Description: "Czyni treść jeszcze większą."
x4: "Ogromne"
x4Description: "Czyni treść jeszcze większą niż jeszcze większa."
blur: "Rozmycie"
blurDescription: "Rozmywa treść. Zostanie wyraźnie wyświetlona po najechaniu."
font: "Czcionka"
fontDescription: "Wybiera czcionkę do wyświetlania treści."
rainbow: "Tęcza"
rainbowDescription: "Sprawia, że zawartość pojawia się w kolorach tęczy."
sparkle: "Blask"
sparkleDescription: "Nadaje zawartości efekt lśniącego brokatu."
rotate: "Obróć"
rotateDescription: "Obraca zawartość o określony kąt."
plain: "Zwyczajny"
plainDescription: "Wyłącza efekty wszystkich MFM zawartych w tym efekcie MFM."
_instanceTicker:
none: "Nigdy nie pokazuj"
remote: "Pokaż dla zdalnych użytkowników"
@@ -1437,5 +1375,6 @@ _deck:
tl: "Oś czasu"
antenna: "Anteny"
list: "Listy"
channel: "Kanały"
mentions: "Wspomnienia"
direct: "Bezpośredni"

View File

@@ -107,6 +107,7 @@ clickToShow: "Clique para ver"
sensitive: "Conteúdo sensível"
add: "Adicionar"
reaction: "Reações"
reactions: "Reações"
reactionSetting: "Quais reações a mostrar no selecionador de reações"
reactionSettingDescription2: "Arraste para reordenar, clique para excluir, pressione + para adicionar."
rememberNoteVisibility: "Lembrar das configurações de visibilidade de notas"
@@ -474,11 +475,6 @@ file: "Ficheiros"
_email:
_follow:
title: "Você tem um novo seguidor"
_mfm:
mention: "Menção"
quote: "Citar"
emoji: "Emoji personalizado"
search: "Buscar"
_theme:
keys:
mention: "Menção"

View File

@@ -107,6 +107,7 @@ clickToShow: "Click pentru a afișa"
sensitive: "NSFW"
add: "Adaugă"
reaction: "Reacție"
reactions: "Reacție"
reactionSetting: "Reacții care să apară in selectorul de reacții"
reactionSettingDescription2: "Trage pentru a rearanja, apasă pe \"+\" pentru a adăuga."
rememberNoteVisibility: "Amintește setarea de vizibilitate a notelor"
@@ -454,7 +455,6 @@ youHaveNoGroups: "Nu ai niciun grup"
joinOrCreateGroup: "Primește o invitație într-un grup sau creează unul nou."
noHistory: "Nu există istoric"
signinHistory: "Istoric autentificări"
disableAnimatedMfm: "Dezactivează MFM cu animații"
doing: "Se procesează..."
category: "Categorie"
tags: "Etichete"
@@ -654,11 +654,6 @@ _role:
_email:
_follow:
title: "te-a urmărit"
_mfm:
mention: "Mențiune"
quote: "Citează"
emoji: "Emoji personalizat"
search: "Caută"
_theme:
description: "Descriere"
keys:
@@ -720,4 +715,5 @@ _deck:
tl: "Cronologie"
antenna: "Antene"
list: "Liste"
channel: "Canale"
mentions: "Mențiuni"

View File

@@ -2,6 +2,7 @@
_lang_: "Русский"
headlineMisskey: "Сеть, сплетённая из заметок"
introMisskey: "Добро пожаловать! Misskey — это децентрализованный сервис микроблогов с открытым исходным кодом.\nПишите «заметки» — делитесь со всеми происходящим вокруг или рассказывайте о себе 📡\nСтавьте «реакции» — выражайте свои чувства и эмоции от заметок других 👍\nОткройте для себя новый мир 🚀"
poweredByMisskeyDescription: "{name} один из инстансов (также называемый экземпляром Misskey), использующий платформу с открытым исходным кодом <b>Misskey</b>."
monthAndDay: "{day}.{month}"
search: "Поиск"
notifications: "Уведомления"
@@ -12,6 +13,7 @@ fetchingAsApObject: "Приём с других сайтов"
ok: "Окей"
gotIt: "Ясно!"
cancel: "Отмена"
noThankYou: "Нет, спасибо"
enterUsername: "Введите имя пользователя"
renotedBy: "{user} делится"
noNotes: "Нет ни одной заметки"
@@ -20,7 +22,7 @@ instance: "Инстанс"
settings: "Настройки"
basicSettings: "Основные настройки"
otherSettings: "Прочие настройки"
openInWindow: "Открывать в плавающих окнах"
openInWindow: "Открыть в плавающем окне"
profile: "Профиль"
timeline: "Лента"
noAccountDescription: "Пользователь ничего не написал про себя"
@@ -47,6 +49,7 @@ deleteAndEdit: "Удалить и отредактировать"
deleteAndEditConfirm: "Удалить эту заметку и создать отредактированную? Все реакции, ссылки и ответы на существующую будут будут потеряны."
addToList: "Добавить в список"
sendMessage: "Отправить сообщение"
copyRSS: "Скопировать RSS"
copyUsername: "Скопировать имя пользователя"
searchUser: "Поиск людей"
reply: "Ответить"
@@ -107,6 +110,7 @@ clickToShow: "Нажмите для просмотра"
sensitive: "Содержимое не для всех"
add: "Добавить"
reaction: "Реакции"
reactions: "Реакции"
reactionSetting: "Реакции, отображаемые в палитре"
reactionSettingDescription2: "Расставляйте перетаскиванием, удаляйте нажатием, добавляйте кнопкой «+»."
rememberNoteVisibility: "Запоминать видимость заметок"
@@ -269,7 +273,7 @@ light: "Светлый"
dark: "Тёмный"
lightThemes: "Светлые темы"
darkThemes: "Тёмные темы"
syncDeviceDarkMode: "Синхронизировать с темным режимом устройства"
syncDeviceDarkMode: "Синхронизировать с тёмной темой системы"
drive: "Диск"
fileName: "Имя файла"
selectFile: "Выберите файл"
@@ -451,12 +455,13 @@ language: "Язык"
uiLanguage: "Язык интерфейса"
groupInvited: "Приглашение в группу"
aboutX: "Описание {x}"
emojiStyle: "Стиль эмодзи"
native: "Системные"
disableDrawer: "Не использовать выдвижные меню"
youHaveNoGroups: "У вас нет ни одной группы"
joinOrCreateGroup: "Получайте приглашения в группы или создавайте свои собственные"
noHistory: "История пока пуста"
signinHistory: "Журнал посещений"
disableAnimatedMfm: "Отключение анимированной разметки MFM"
doing: "В процессе"
category: "Категория"
tags: "Метки"
@@ -598,6 +603,7 @@ smtpSecureInfo: "Выключите при использовании STARTTLS."
testEmail: "Проверка доставки электронной почты"
wordMute: "Скрытие слов"
regexpError: "Ошибка в регулярном выражении"
regexpErrorDescription: "В списке {tab} скрытых слов, в строке {line} обнаружена синтаксическая ошибка:"
instanceMute: "Глушение инстансов"
userSaysSomething: "{name} что-то сообщает"
makeActive: "Активировать"
@@ -708,6 +714,7 @@ accentColor: "Акцент"
textColor: "Текст"
saveAs: "Сохранить под названием…"
advanced: "Для продвинутых"
advancedSettings: "Расширенные настройки "
value: "Значения"
createdAt: "Создано"
updatedAt: "Обновлено"
@@ -798,7 +805,7 @@ translate: "Перевод"
translatedFrom: "Перевод. Язык оригинала — {x}"
accountDeletionInProgress: "В настоящее время выполняется удаление учетной записи"
usernameInfo: "Имя, которое отличает вашу учетную запись от других на этом сервере. Вы можете использовать алфавит (a~z, A~Z), цифры (0~9) или символы подчеркивания (_). Имена пользователей не могут быть изменены позже."
aiChanMode: "ИИ режим"
aiChanMode: "Режим Ай"
keepCw: "Сохраняйте Предупреждения о содержимом"
pubSub: "Учётные записи Pub/Sub"
lastCommunication: "Последнее сообщение"
@@ -815,8 +822,8 @@ manageAccounts: "Управление аккаунтом"
makeReactionsPublic: "Опубликовать список реакций"
makeReactionsPublicDescription: "Список сделанных вами реакций доступен для просмотра всем желающим."
classic: "Классика"
muteThread: "Заглушить цепочку"
unmuteThread: "Отменить глушение цепочки"
muteThread: "Скрыть цепочку"
unmuteThread: "Отменить сокрытие цепочки"
ffVisibility: "Видимость подписок и подписчиков"
ffVisibilityDescription: "Здесь можно настроить, кто будет видеть ваши подписки и подписчиков."
continueThread: "Показать следующие ответы"
@@ -839,40 +846,385 @@ numberOfColumn: "Количество столбцов"
searchByGoogle: "Поиск"
instanceDefaultLightTheme: "Светлая тема по умолчанию"
instanceDefaultDarkTheme: "Темная тема по умолчанию"
instanceDefaultThemeDescription: "Описание темы по умолчанию для инстанса"
mutePeriod: "Продолжительность скрытия"
indefinitely: "вечно"
tenMinutes: "10 минут"
oneHour: "1 час"
oneDay: "1 день"
oneWeek: "1 неделя"
reflectMayTakeTime: "Изменения могут занять время для отображения"
failedToFetchAccountInformation: "Не удалось получить информацию об аккаунте"
cropImage: "Кадрирование"
cropImageAsk: "Нужно ли кадрировать изображение?"
file: "Файлы"
recentNHours: "Последние {n} ч"
recentNDays: "Последние {n} сут"
noEmailServerWarning: "Почтовый сервер не установлен "
thereIsUnresolvedAbuseReportWarning: "Остались нерешённые жалобы"
recommended: "Рекомендуем"
check: "Проверить"
driveCapOverrideLabel: "Изменение лимита дискового пространства для этого пользователя"
driveCapOverrideCaption: "Укажите меньше или равное нулю для отмены"
requireAdminForView: "Для просмотра необходимо иметь аккаунт администратора"
isSystemAccount: "Данная учётная запись создана автоматически и управляется системой"
typeToConfirm: "Введите {x} для продолжения"
deleteAccount: "Удаление учётной записи"
document: "Документ"
numberOfPageCache: "Количество сохранённых страниц в кэше"
numberOfPageCacheDescription: "Описание количества страниц в кэше"
logoutConfirm: "Вы хотите выйти из аккаунта?"
lastActiveDate: "Последняя дата использования"
statusbar: "Статусбар"
pleaseSelect: "Пожалуйста, выберите"
reverse: "Переворот"
colored: "Выделена цветом"
refreshInterval: "Интервал перезагрузки"
label: "Метка"
type: "Тип"
speed: "Скорость"
sensitiveMediaDetection: "Определение содержимого деликатного характера"
localOnly: "Локально"
remoteOnly: "Только удалённо"
failedToUpload: "Сбой выгрузки"
cannotUploadBecauseInappropriate: "Файл не может быть загружен, так как было установлено, что он может содержать неприемлемое содержимое."
cannotUploadBecauseNoFreeSpace: "Файл не может быть загружен, так как не осталось места на диске"
beta: "Бета"
enableAutoSensitive: "Автоматическое определение NSFW"
enableAutoSensitiveDescription: "Если доступно, используйте машинное обучение для автоматической установки флага NSFW на носителе. Даже если эта функция отключена, она может быть установлена ​​автоматически в зависимости от инстанта."
activeEmailValidationDescription: "Если включено, будет проводиться более строгая проверка адреса электронной почты, в том числе на то, что он действительный и не временный. Если же отключено, то проверяется только корректность написания адреса."
navbar: "Панель навигации"
shuffle: "Перемешать"
account: "Учётные записи"
move: "Переместить"
pushNotification: "Push-уведомления"
subscribePushNotification: "Включить push-уведомления"
unsubscribePushNotification: "Выключить push-уведомления"
pushNotificationAlreadySubscribed: "Push-уведомления уже включены"
pushNotificationNotSupported: "Push-уведмления не поддерживаются инстансом или браузером"
sendPushNotificationReadMessage: "Удалять push-уведомления когда сообщение или прочитано"
sendPushNotificationReadMessageCaption: "На мгновение появится уведомление \"{emptyPushNotificationMessage}\". Расход заряда батареи может увеличиться "
windowMaximize: "Развернуть"
windowRestore: "Восстановить"
caption: "Подпись (Automatic Translation)"
loggedInAsBot: "Вы под аккаунтом бота!"
tools: "Инструменты"
cannotLoad: "Не удалось загрузить"
numberOfProfileView: "Количество профилей для просмотра"
like: "Нравится!"
unlike: "Отменить «нравится»"
numberOfLikes: "Количество лайков"
show: "Отображение"
neverShow: "Больше не показывать"
remindMeLater: "Напомнить позже"
didYouLikeMisskey: "Вам нравится Misskey?"
pleaseDonate: "Сайт {host} работает на Misskey. Это бесплатное программное обеспечение, и ваши пожертвования очень бы помогли продолжать его разработку!"
roles: "Роли"
role: "Роль"
normalUser: "Обычный пользователь"
undefined: "неопределён"
assign: "Назначить"
unassign: "Отменить назначение"
color: "Цвет"
manageCustomEmojis: "Управлять пользовательскими эмодзи"
youCannotCreateAnymore: "Вы достигли лимита создания."
cannotPerformTemporary: "Временно недоступен"
cannotPerformTemporaryDescription: "Это действие временно невозможно выполнить из-за превышения лимита выполнения."
preset: "Шаблоны"
selectFromPresets: "Выбрать из шаблонов"
achievements: "Достижения"
_achievements:
earnedAt: "Разблокировано в"
_types:
_notes1:
title: "Первые шаги в Misskey"
description: "Опубликована первая заметка"
flavor: "Приятных дней с Misskey!"
_notes10:
title: "Несколько заметок"
description: "Опубликовано 10 заметок"
_notes100:
title: "Много заметок"
description: "Опубликовано 100 заметок"
_notes500:
title: "Всё в заметках"
description: "Опубликовано 500 заметок"
_notes1000:
title: "Гора заметок"
description: "Опубликовано 1000 заметок"
_notes5000:
title: "Заметки льются рекой"
description: "Опубликовано 5000 заметок"
_notes10000:
title: "Превосходство в заметках"
description: "Опубликовано 10000 заметок"
_notes20000:
title: "Нужно больше заметок!"
description: "Опубликовано 20000 заметок"
_notes30000:
title: "Заметки, заметки, заметки"
description: "Опубликовано 30000 заметок"
_notes40000:
title: "Фабрика заметок"
description: "Опубликовано 40000 заметок"
_notes50000:
title: "Планета заметок"
description: "Опубликовано 50000 заметок"
_notes60000:
title: "Замет-квазар"
description: "Опубликовано 60000 заметок"
_notes70000:
title: "Чёрная дыра из заметок"
description: "Опубликовано 70000 заметок"
_notes80000:
title: "Галактика заметок"
description: "Опубликовано 80000 заметок"
_notes90000:
title: "Вселенная заметок"
description: "Опубликовано 90000 заметок"
_notes100000:
title: "ALL YOUR NOTE ARE BELONG TO US"
description: "Опубликовано 100000 заметок"
flavor: "Вам правда нужно столько писать?"
_login3:
title: "Новичок "
description: "3 дня на сайте"
flavor: "С сегодняшнего дня зовите меня просто мискиец"
_login7:
title: "Новичок Ⅱ"
description: "Неделя на сайте"
flavor: "Кажется, вы начали свыкаться с этим, нет?"
_login15:
title: "Новичок Ⅲ"
description: "15 дней на сайте"
_login30:
title: "Мискиец "
description: "30 дней на сайте"
_login60:
title: "Мискиец Ⅱ"
description: "60 дней на сайте"
_login100:
title: "Мискиец Ⅲ"
description: "100 дней на сайте"
flavor: "Жестокий мискиец"
_login200:
title: "Завсегдатай "
description: "200 дней на сайте"
_login300:
title: "Завсегдатай Ⅱ"
description: "300 дней на сайте"
_login400:
title: "Завсегдатай Ⅲ"
description: "400 дней на сайте"
_login500:
title: "Ветеран "
description: "500 дней на сайте"
flavor: "Господа, я люблю заметки"
_login600:
title: "Ветеран Ⅱ"
description: "600 дней на сайте"
_login700:
title: "Ветеран Ⅲ"
description: "700 дней на сайте"
_login800:
title: "Повелитель заметок "
description: "800 дней на сайте"
_login900:
title: "Повелитель заметок Ⅱ"
description: "900 дней на сайте"
_login1000:
title: "Повелитель заметок Ⅲ"
description: "1000 дней на сайте"
flavor: "Спасибо, что пользуетесь Misskey!"
_noteClipped1:
title: "Нельзя не сохранить"
description: "Первая заметка в подборке"
_noteFavorited1:
title: "Смотрящий на звёзды"
description: "Первое добавление в избранное"
_myNoteFavorited1:
title: "В поиске звёзд"
description: "Кому-то понравилась ваша заметка"
_profileFilled:
title: "Приготовления закончены"
description: "Заполнен профиль"
_markedAsCat:
title: "Ваш покорный слуга кот"
description: "Включена опция «Аккаунт кота»"
flavor: "Позвольте представиться: я — кот, просто кот, у меня еще нет имени."
_following1:
title: "Я не один"
description: "Сделана первая подписка"
_following10:
title: "Не останавливайся… Не останавливайся…"
description: "Количество подписок достигло 10"
_following50:
title: "Много друзей"
description: "Количество подписок достигло 50"
_following100:
title: "Сотня друзей"
description: "Количество подписок достигло 100"
_following300:
title: "Друзья в избытке"
description: "Количество подписок достигло 300"
_followers1:
title: "Первый подписчик"
description: "Появился 1 подписчик"
_followers10:
title: "Следуй за мной!"
description: "Количество подписчиков достигло 10"
_followers50:
title: "Один за другим"
description: "Количество подписчиков достигло 50"
_followers100:
title: "Всеобщий любимец"
description: "Количество подписчиков достигло 100"
_followers300:
title: "В очередь!"
description: "Количество подписчиков достигло 300"
_followers500:
title: "Радиостанция"
description: "Количество подписчиков достигло 500"
_followers1000:
title: "Авторитет"
description: "Количество подписчиков достигло 1000"
_collectAchievements30:
title: "Достигатор"
description: "Получено 30 достижений"
_viewAchievements3min:
title: "Любовь к успехам"
description: "Более 3 минут любования достижениями"
_iLoveMisskey:
title: "Я люблю Misskey"
description: "Написана заметка «I ❤ #Misskey»"
flavor: "Спасибо за поддержку Misskey! Ваша команда разработчиков"
_foundTreasure:
title: "Охота за сокровищами"
description: "Найдено спрятанное сокровище"
_client30min:
title: "Перерыв на обед"
description: "Прошло 30 минут с момента запуска клиента"
_noteDeletedWithin1min:
title: "Ой, нет!"
description: "Заметка удалена через минуту после публикации"
_postedAtLateNight:
title: "Житель ночи"
description: "Заметка опубликована в глухую ночь"
flavor: "Вроде бы пора спать"
_postedAt0min0sec:
title: "Говорящие часы"
description: "Заметка опубликована ровно в 0 минут 0 секунд"
flavor: "Дин-дон дин-дон"
_selfQuote:
title: "Самовоспроизведение"
description: "Процитирована собственная заметка"
_htl20npm:
title: "В потоке"
description: "Достигнута скорость домашней ленты в 20 з/мин (заметок минуту)"
_viewInstanceChart:
title: "Аналитик"
description: "Просмотрены статистические диаграммы инстанса"
_outputHelloWorldOnScratchpad:
title: "Привет, мир!"
description: "Выведен текст «hello world» в Когтеточке"
_open3windows:
title: "Многооконный"
description: "Открыто одновременно 3 окна"
_driveFolderCircularReference:
title: "Циклическая ссылка"
description: "Попытка создать на «диске» рекурсивно вложенную папку"
_reactWithoutRead:
title: "Не читай @ отвечай!"
description: "На заметку более чем 100 знаков написан ответ в первые же 3 секунды с её появления."
_clickedClickHere:
title: "Нажмите здесь"
description: "Нажато здесь"
_justPlainLucky:
title: "Чистая удача"
description: "Может достаться с вероятностью 0,01% каждые 10 секунд."
_setNameToSyuilo:
title: "Комплекс бога"
description: "Установлено «syuilo» в качестве имени"
_passedSinceAccountCreated1:
title: "Первая годовщина"
description: "Прошёл 1 год с момента регистрации"
_passedSinceAccountCreated2:
title: "Вторая годовщина"
description: "Прошло 2 года с момента регистрации"
_passedSinceAccountCreated3:
title: "Третья годовщина"
description: "Прошло 3 года с момента регистрации"
_loggedInOnBirthday:
title: "С днём рождения!"
description: "Вход на сайт в свой день рождения"
_loggedInOnNewYearsDay:
title: "С Новым годом!"
description: "Вход на сайт в первый день года"
flavor: "Желаем отличного года на нашем сайте!"
_cookieClicked:
title: "Игра, в которой вы щёлкаете по печенькам"
description: "Нажато печенье"
flavor: "Стоп, вы вообще на том сайте-то?"
_brainDiver:
title: "Brain Diver"
description: "Опубликована ссылка на песню «Brain Diver»"
flavor: "Мисски-Мисски Ла-Ту-Ма"
_role:
new: "Новая роль"
edit: "Изменить роль"
name: "Название роли"
description: "Описание роли"
permission: "Ролевые полномочия"
descriptionOfPermission: "<b>Модераторы</b> могут изменять базовые операции для модераторов.\n<b>Администраторы</b> могут изменять полностью настройки инстанса."
assignTarget: "Метод присвоения"
descriptionOfAssignTarget: "<b>Вручную</b> чтобы указать кому выдавать роль, а кому нет.\n<b>По условию<b> чтобы автоматически выдавать и удалять роль при условиях."
manual: "Вручную"
conditional: "По условию"
condition: "Условия"
isConditionalRole: "Эта роль выдаётся по условию."
isPublic: "Общедоступная роль"
descriptionOfIsPublic: "Список тех, кому назначена эта роль будет доступен всем. Кроме того эта роль будет отмечена у каждого в профиле."
options: "Настройки ролей"
policies: "Политики"
baseRole: "Шаблон роли"
useBaseValue: "Использовать значение из шаблона"
chooseRoleToAssign: "Выберите роль, которую хотите выдать"
canEditMembersByModerator: "Могут назначать модераторы"
descriptionOfCanEditMembersByModerator: "Если включено, на эту роль могут назначать пользователей как администраторы, так и модераторы. Если выключено, назначать могут только администраторы."
priority: "Приоритет"
_priority:
low: "Низкий"
middle: "Средне"
high: "Высокий"
_options:
gtlAvailable: "Может просматривать глобальную ленту"
ltlAvailable: "Может просматривать местную ленту"
canPublicNote: "Может публиковать общедоступные заметки"
canInvite: "Может создавать пригласительные коды"
canManageCustomEmojis: "Управлять пользовательскими эмодзи"
driveCapacity: "Доступное пространство на «диске»"
pinMax: "Доступное количество закреплённых заметок"
antennaMax: "Доступное количество антенн"
wordMuteMax: "Доступное количество знаков в списке скрытия слов"
clipMax: "Максимальное количество подборок"
noteEachClipsMax: "Максимальное количество заметок в подборке"
userListMax: "Максимальное количество списков аккаунтов"
userEachUserListsMax: "Максимальное количество аккаунтов в списке"
rateLimitFactor: "Ограничение активности"
descriptionOfRateLimitFactor: "Меньшее значение — слабые ограничения, большее — сильные"
canHideAds: "Может скрыть рекламу"
_condition:
isLocal: "Местный"
isRemote: "Неместный"
createdLessThan: "Аккаунт младше, чем..."
createdMoreThan: "Аккаунт старше, чем..."
followersLessThanOrEq: "Количество подписчиков не превышает…"
followersMoreThanOrEq: "Количество подписчиков не меньше чем…"
followingLessThanOrEq: "Количество подписок не превышает…"
followingMoreThanOrEq: "Количество подписок не меньше чем…"
and: "Выполнено несколько условий:.."
or: "Выполнено любое из условий:.."
not: "Кроме тех, у кого…"
_sensitiveMediaDetection:
description: "Машинное обучение может быть использовано для автоматического обнаружения чувствительных медиа для модерации. Нагрузка на сервер увеличивается незначительно."
setSensitiveFlagAutomatically: "Установить флаг NSFW"
@@ -919,6 +1271,24 @@ _plugin:
install: "Установка расширений"
installWarn: "Пожалуйста, не устанавливайте расширения, которым не доверяете."
manage: "Управление расширениями"
_preferencesBackups:
list: "Существующие резервные копии"
saveNew: "Создать резервную копию"
loadFile: "Прочесть из файла"
apply: "Восстановить на это устройство"
save: "Обновить из текущих настроек"
inputName: "Введите название для резервной копии"
cannotSave: "Сохранить не удалось"
nameAlreadyExists: "Резервная копия под названием «{name}» уже существует. Придумайте другое."
applyConfirm: "Правда хотите загрузить резервную копию «{name}» на это устройство? Этим будут потеряны текущие настройки."
saveConfirm: "Сохранить резервную копию под названием «{name}»?"
deleteConfirm: "Удалить резервную копию «{name}»?"
renameConfirm: "Переименовать резервную копию «{old}» в «{new}»?"
noBackups: "Здесь ещё нет резервных копий. Вы можете создать резервную копию настроек на этом сайте с помощью кнопки «Создать резервную копию»."
createdAt: "Создана {date} в {time}"
updatedAt: "Обновлена {date} в {time}"
cannotLoad: "Загрузить не удалось"
invalidFile: "Некорректный формат файла"
_registry:
scope: "Область"
key: "Ключ"
@@ -938,70 +1308,6 @@ _nsfw:
respect: "Скрывать содержимое не для всех"
ignore: "Показывать содержимое не для всех"
force: "Скрывать вообще все файлы"
_mfm:
cheatSheet: "Подсказка по разметке MFM"
intro: "MFM — язык оформления текста, который придуман специально для Misskey и готов для применения во многих местах. На этой странице собраны и кратко изложены способы его использовать."
dummy: "Misskey расширяет границы Федиверса."
mention: "Упоминание"
mentionDescription: "При помощи знака «собака» перед именем можно упомянуть какого-нибудь пользователя."
hashtag: "Хэштег"
hashtagDescription: "При помощи знака «решётка» перед словом задаётся хэштег."
url: "Простая ссылка (URL)"
urlDescription: "Ссылки могут отображаться непосредственно."
link: "Ссылка с пояснением"
linkDescription: "Можно ссылку оформить в виде произвольного текста."
bold: "Жирный шрифт"
boldDescription: "Выделяет текст, делая буквы жирнее."
small: "Мелкий шрифт"
smallDescription: "Делает текст маленьким и незаметным."
center: "Выровнять элементы по центру"
centerDescription: "Так можно выровнять что-то по центру."
inlineCode: "Программа (в тексте)"
inlineCodeDescription: "Подсвечивает фрагмент программы внутри сплошного текста."
blockCode: "Программа (блок)"
blockCodeDescription: "Оформляет текст программы в виде отдельного блокоа. Он может состоять из множества строк."
inlineMath: "Математическое выражение (в тексте)"
inlineMathDescription: "Позволяет вставлять математические выражения внутрь текста при помощи языка KaTeX."
blockMath: "Математическое выражение (блок)"
blockMathDescription: "Оформляет математическое выражение (KaTeX) на отдельной строке."
quote: "Цитата"
quoteDescription: "Так можно процитировать чей-то текст."
emoji: "Собственные эмодзи"
emojiDescription: "Можно вставить эмодзи в текст, окружив название двоеточиями."
search: "Поиск"
searchDescription: "Можно добавить форму для поиска, сразу задав, что искать."
flip: "Переворот"
flipDescription: "Позволяет отразить текст зеркально по вертикали или горизонтали."
jelly: "Анимация желе (шлёп-плёп)"
jellyDescription: "Напоминает горку джема, дёргающуюся от шлепков."
tada: "Анимация (та-дам!)"
tadaDescription: "Получается нечто выпрыгивающее, как бы крича: «а вот и я!»"
jump: "Анимация прыжков (прыг-скок)"
jumpDescription: "Побуждает радостно подпрыгивать."
bounce: "Анимация отскоков (бум-бум)"
bounceDescription: "Это будет скакать как мяч."
shake: "Анимация дрожи (б-р-р-р)"
shakeDescription: "Такое дрожит, словно от холода. Или от страха."
twitch: "Анимация тряски"
twitchDescription: "Заставляет трястись как одержимого"
spin: "Вращение"
spinDescription: "Так можно крутить содержимое в разных направлениях."
x2: "Крупный шрифт"
x2Description: "Увеличивает содержимое."
x3: "Ещё крупнее"
x3Description: "Сильнее увеличивает содержимое."
x4: "Совсем крупно"
x4Description: "Увеличивает содержимое совсем сильно."
blur: "Размытие"
blurDescription: "Размывает текст до нечитаемости, будто его поместили за матовое стекло. Наведение указателя мыши на размытый текст возвращает чёткость."
font: "Шрифт"
fontDescription: "Так можно писать произвольным шрифтом."
rainbow: "Радуга"
rainbowDescription: "Заставлять содержимое отображаться в цветах радуги."
sparkle: "Искры"
sparkleDescription: "Добавляет эффект искрящихся частиц."
rotate: "Повернуть"
rotateDescription: "Поворачивает на заданный угол."
_instanceTicker:
none: "Не показывать"
remote: "Только для других сайтов"
@@ -1031,12 +1337,14 @@ _wordMute:
muteWordsDescription2: "Здесь можно использовать регулярные выражения — просто заключите их между двумя дробными чертами (/)."
softDescription: "Соответствующие условиям заметки будут спрятаны из вашей ленты."
hardDescription: "Соответстующие условиям заметки вообще не будут попадать в вашу ленту. Даже если вы поменяете условия, отсеенные таким образом заметки уже не появятся."
soft: "Мягкий"
hard: "Жёсткий"
soft: "Мягко"
hard: "Жёстко"
mutedNotes: "Скрытые заметки"
_instanceMute:
instanceMuteDescription: "Заметки и репосты с указанных здесь инстансов, а также ответы пользователям оттуда же не будут отображаться."
instanceMuteDescription2: "Пишите каждый инстанс на отдельной строке"
title: "Скрывает заметки с заданных инстансов."
heading: "Список заглушенных инстансов"
heading: "Список скрытых инстансов"
_theme:
explore: "Обзор"
install: "Установить тему"
@@ -1157,12 +1465,16 @@ _tutorial:
step7_1: "На этом вводный урок по использованию Misskey закончен. Спасибо, что прошли его до конца!"
step7_2: "Хотите изучить Misskey глубже — добро пожаловать в раздел «{help}»."
step7_3: "Приятно вам провести время с Misskey🚀"
step8_1: "Ах, да, не хотите ли включить push-уведомления?"
step8_2: "С push-уведомлениями вы будете в курсе репостов, ответов, реакций и всего такого, даже когда закрыли Misskey."
step8_3: "Эту настройку вы всегда сможете поменять"
_2fa:
alreadyRegistered: "Двухфакторная аутентификация уже настроена."
registerDevice: "Зарегистрируйте ваше устройство"
registerKey: "Зарегистрировать ключ"
step1: "Прежде всего, установите на устройство приложение для аутентификации, например, {a} или {b}."
step2: "Далее отсканируйте отображаемый QR-код при помощи приложения."
step2Url: "Если пользуетесь приложением на компьютере, можете ввести в него эту строку (URL):"
step3: "И наконец, введите код, который покажет приложение."
step4: "Теперь при каждом входе на сайт вам нужно будет вводить код из приложения аналогичным образом."
securityKeyInfo: "Вы можете настроить вход с помощью аппаратного ключа безопасности, поддерживающего FIDO2, или отпечатка пальца или PIN-кода на устройстве."
@@ -1179,7 +1491,7 @@ _permissions:
"write:following": "Изменять спискок подписок"
"read:messaging": "Смотреть сообщения"
"write:messaging": "Писать и удалять сообщения"
"read:mutes": "Смотреть спискок скрытых пользователей"
"read:mutes": "Смотреть список скрытых пользователей"
"write:mutes": "Изменять список скрытых пользователей"
"write:notes": "Писать и удалять заметки"
"read:notifications": "Смотреть уведомления"
@@ -1230,10 +1542,13 @@ _widgets:
trends: "Актуальное"
clock: "Часы"
rss: "Просмотр RSS"
rssTicker: "Бегущая строка RSS"
activity: "Активность"
photos: "Фото"
digitalClock: "Цифровые часы"
unixClock: "Часы UNIX"
federation: "Федерация"
instanceCloud: "Облако инстансов"
postForm: "Форма отправки"
slideshow: "Показ слайдов"
button: "Кнопка"
@@ -1241,9 +1556,12 @@ _widgets:
jobQueue: "Очередь заданий"
serverMetric: "Показатели сервера"
aiscript: "Консоль AiScript"
aiscriptApp: "Приложение на AiScript"
aichan: "Ай"
userList: "Список аккаунтов"
_userList:
chooseList: "Выберите список"
clicker: "Счётчик щелчков"
_cw:
hide: "Спрятать"
show: "Показать еще"
@@ -1306,12 +1624,13 @@ _profile:
changeAvatar: "Поменять аватар"
changeBanner: "Поменять изображение в шапке"
_exportOrImport:
allNotes: "Все записи\n"
allNotes: "Все заметки\n"
favoritedNotes: "Избранное"
followingList: "Подписки"
muteList: "Скрытые"
blockingList: "Заблокированные"
userLists: "Списки"
excludeMutingUsers: "За исключением заглушенных пользователей"
excludeMutingUsers: "За исключением скрытых пользователей"
excludeInactiveUsers: "Без неактивных учётных записей"
_charts:
federation: "Федерация"
@@ -1415,6 +1734,9 @@ _notification:
youReceivedFollowRequest: "У вас новый запрос на подписку."
yourFollowRequestAccepted: "Ваш запрос на подписку одобрен."
youWereInvitedToGroup: "Вы приглашены в группу."
pollEnded: "Подведены окончательные итоги опроса"
emptyPushNotificationMessage: "Обновлены push-уведомления"
achievementEarned: "Получено достижение"
_types:
all: "Все"
follow: "Подписки"
@@ -1423,11 +1745,13 @@ _notification:
renote: "Репосты"
quote: "Цитаты"
reaction: "Реакции"
pollEnded: "Окончания опросов"
receiveFollowRequest: "Получен запрос на подписку"
followRequestAccepted: "Запрос на подписку одобрен"
groupInvited: "Приглашение в группы"
app: "Уведомления из приложений"
_actions:
followBack: "отвечает взаимной подпиской"
reply: "Ответить"
renote: "Репост"
_deck:
@@ -1441,7 +1765,12 @@ _deck:
swapDown: "Переставить ниже"
stackLeft: "В столбик влево"
popRight: "Из столбика вправо"
profile: "Профиль"
profile: "Расстановка"
newProfile: "Новая расстановка"
deleteProfile: "Удаление расстановки"
introduction: "Создайте идеальный интерфейс расставляя колонки как угодно"
introduction2: "Чтобы добавлять колонки в любом месте, жмите «+» справа экрана."
widgetsIntroduction: "Чтобы добавлять виджеты, выбирайте «Редактировать виджеты» в меню колонки."
_columns:
main: "Основная"
widgets: "Виджеты"
@@ -1449,5 +1778,6 @@ _deck:
tl: "Лента"
antenna: "Антенны"
list: "Списки"
channel: "Каналы"
mentions: "Упоминания"
direct: "Личное"

View File

@@ -110,6 +110,7 @@ clickToShow: "Kliknutím zobrazíte"
sensitive: "NSFW"
add: "Pridať"
reaction: "Reakcie"
reactions: "Reakcie"
reactionSetting: "Reakcie zobrazené vo výbere reakcií"
reactionSettingDescription2: "Ťahaním preusporiadate, kliknutím odstránite, Stlačením \"+\" pridáte"
rememberNoteVisibility: "Zapamätať nastavenia viditeľnosti poznámky"
@@ -463,7 +464,6 @@ youHaveNoGroups: "Nemáte žiadne skupiny"
joinOrCreateGroup: "Požiadajte o pozvanie do existujúcej skupiny alebo vytvorte novú."
noHistory: "Žiadna história"
signinHistory: "História prihlásení"
disableAnimatedMfm: "Vypnúť MFM s animáciou"
doing: "Pracujem..."
category: "Kategórie"
tags: "Značky"
@@ -1012,72 +1012,6 @@ _nsfw:
respect: "Skryť NSFW médiá"
ignore: "Neskrývať NSFW médiá"
force: "Skryť všetky médiá"
_mfm:
cheatSheet: "MFM Cheatsheet"
intro: "MFM je Misskey exkluzívny značkovací jazyk, ktorý sa dá používať na viacerých miestach. Tu môžete vidieť zoznam všetkej dostupnej MFM syntaxe."
dummy: "Misskey rozširuje svet Fediverza"
mention: "Zmienka"
mentionDescription: "Používateľa spomeniete použítím zavináča a mena používateľa"
hashtag: "Hashtag"
hashtagDescription: "Môžete zadať hashtag použitím mriežky a textu"
url: "URL"
urlDescription: "URL sa dajú zobraziť."
link: "Odkaz"
linkDescription: "Jednotlivé časti texty sa dajú zobraziť ako URL."
bold: "Tučné"
boldDescription: "Zvýrazní písmená tým, že budú tučnejšie."
small: "Malé"
smallDescription: "Zobrazí obsah malý a tenký."
center: "Vystrediť prvky"
centerDescription: "Zobrazí obsah v strede"
inlineCode: "Kód (inline)"
inlineCodeDescription: "Zobrazí kód so zvýraznením syntaxe."
blockCode: "Kód (blok)"
blockCodeDescription: "Zobrazí viacriadkový kód so zvýraznením syntaxe v bloku."
inlineMath: "Vzorec (inline)"
inlineMathDescription: "Zobrazí matematický vzorec (KaTeX) v riadku."
blockMath: "Vzorec (blok)"
blockMathDescription: "Zobrazí viacriadkový matematický vzorec (KaTeX) v bloku"
quote: "Citovať"
quoteDescription: "Zobrazí obsah ako citát."
emoji: "Vlastné emoji"
emojiDescription: "Pridaním dvojbodiek pred a za názov vlastnej emoji, sa dá zobraziť vlastná emoji."
search: "Hľadať"
searchDescription: "Zobrazí vyhľadávacie pole so zadaným textom."
flip: "Preklopiť"
flipDescription: "Preklopí obsah horizontálne alebo vertikálne"
jelly: "Animácia (želé)"
jellyDescription: "Obsah sa bude hýbať ako želé."
tada: "Animácia (tadá)"
tadaDescription: "Obsah sa bude hýbať ako Tada!"
jump: "Animácia (skok)"
jumpDescription: "Obsah skočí."
bounce: "Animácia (odraz)"
bounceDescription: "Obsah sa bude odrážať."
shake: "Animácia (trasenie)"
shakeDescription: "Obsah sa bude triasť."
twitch: "Animácia (myknutie)"
twitchDescription: "Obsahu dá animáciu silného trasenia."
spin: "Animácia (rotácia)"
spinDescription: "Obsahu pridá otáčajúcu animáciu."
x2: "Veľký"
x2Description: "Zobrazí obsah väčší."
x3: "Veľmi veľký"
x3Description: "Zobrazí obsah ešte väčší."
x4: "Neuveriteľne veľký"
x4Description: "Zobrazí obsah ešte viac veľký než veľmi veľký."
blur: "Rozmazanie"
blurDescription: "Týmto efektom môže byť obsah rozmazaný. Zaostrí sa keď ned neho príde kurzor."
font: "Písmo"
fontDescription: "Nastaví písmo, ktorým sa zobrazí text."
rainbow: "Dúha"
rainbowDescription: "Zobrazí obsah vo farbách dúhy."
sparkle: "Trblietky"
sparkleDescription: "Obsahu dodá trblietajúci efekt."
rotate: "Otáčať"
rotateDescription: "Otočí obsah o určitý uhol."
plain: "Obyčajné"
plainDescription: "Bez akejkoľvej syntaxe"
_instanceTicker:
none: "Nikdy nezobrazovať"
remote: "Zobraziť pre vzdialených používateľov"
@@ -1544,5 +1478,6 @@ _deck:
tl: "Časová os"
antenna: "Antény"
list: "Zoznam"
channel: "Kanály"
mentions: "Zmienky"
direct: "Priame poznámky"

View File

@@ -110,6 +110,7 @@ clickToShow: "Klicka för att visa"
sensitive: "Känsligt innehåll"
add: "Lägg till"
reaction: "Reaktioner"
reactions: "Reaktioner"
reactionSetting: "Reaktioner som ska visas i reaktionsväljaren"
reactionSettingDescription2: "Dra för att omordna, klicka för att radera, tryck \"+\" för att lägga till."
rememberNoteVisibility: "Komihåg notvisningsinställningar"
@@ -370,11 +371,6 @@ pushNotificationNotSupported: "Din webbläsare eller instans har inte stöd för
_email:
_follow:
title: "följde dig"
_mfm:
mention: "Nämn"
quote: "Citat"
emoji: "Anpassa emoji"
search: "Sök"
_channel:
setBanner: "Välj banner"
removeBanner: "Ta bort banner"

View File

@@ -110,6 +110,7 @@ clickToShow: "คลิกเพื่อแสดง"
sensitive: "เนื้อหาที่ละเอียดอ่อน NSFW"
add: "เพิ่ม"
reaction: "รีแอคชั่น"
reactions: "รีแอคชั่น"
reactionSetting: "รีแอคชั่นไปยังแสดงผลในตัวเลือกการรีแอคชั่น"
reactionSettingDescription2: "กดลากเพื่อจัดลำดับใหม่ กดคลิกเพื่อลบ กด \"+\" เพื่อเพิ่ม"
rememberNoteVisibility: "จดจำการตั้งค่าการมองเห็นตัวโน้ต"
@@ -128,6 +129,7 @@ unblockConfirm: "คุณแน่ใจแล้วเหรอ? ว่าต
suspendConfirm: "นายแน่ใจแล้วเหรอว่าต้องการระงับบัญชีนี้อ่ะ?"
unsuspendConfirm: "นายแน่ใจแล้วหรอ? ว่าต้องการยกเลิกการระงับบัญชีนี้"
selectList: "เลือกรายการ"
selectChannel: "เลือกแชนแนล"
selectAntenna: "เลือกเสาอากาศ"
selectWidget: "เลือกวิดเจ็ต"
editWidgets: "แก้ไขวิดเจ็ต"
@@ -463,7 +465,6 @@ youHaveNoGroups: "คุณยังไม่มีกลุ่ม"
joinOrCreateGroup: "รับเชิญเข้าร่วมกลุ่มหรือสร้างกลุ่มของคุณเองเลยนะ"
noHistory: "ไม่มีรายการ"
signinHistory: "ประวัติการเข้าสู่ระบบ"
disableAnimatedMfm: "ปิดการใช้งาน MFM ด้วยแอนิเมชั่น"
doing: "กำลังประมวลผล......"
category: "หมวดหมู่"
tags: "แท็ก"
@@ -932,6 +933,250 @@ assign: "กำหนด"
unassign: "ยังไม่มอบหมาย"
color: "สี"
manageCustomEmojis: "จัดการอีโมจิแบบกำหนดเอง"
youCannotCreateAnymore: "คุณถึงขีดจํากัดการสร้างแล้วนะ"
cannotPerformTemporary: "ไม่สามารถใช้การได้ชั่วคราว"
cannotPerformTemporaryDescription: "การดําเนินการนี้ไม่สามารถดําเนินการได้ชั่วคราว เนื่องจากเกินขีดจํากัดการดําเนินการ กรุณารอสักครู่แล้วลองใหม่อีกครั้งนะค่ะ"
preset: "พรีเซ็ต"
selectFromPresets: "เลือกจากการพรีเซ็ต"
achievements: "ความสำเร็จ"
gotInvalidResponseError: "การตอบสนองเซิร์ฟเวอร์ไม่ถูกต้อง"
gotInvalidResponseErrorDescription: "เซิร์ฟเวอร์อาจไม่สามารถเข้าถึงได้หรืออาจจะกำลังอยู่ในระหว่างปรับปรุง กรุณาลองใหม่อีกครั้งในภายหลังนะคะ"
_achievements:
earnedAt: "ได้รับเมื่อ"
_types:
_notes1:
title: "เพียงแค่ตั้งค่า msky ของฉัน"
description: "โพสต์โน้ตครั้งแรกของคุณ"
flavor: "ขอให้มีช่วงเวลาที่ดีกับ Misskey นะคะ!"
_notes10:
title: "โน้ตบางอย่าง"
description: "โพสต์ 10 โน้ต"
_notes100:
title: "โน้ตจำนวนมาก"
description: "โพสต์ 100 โน้ต"
_notes500:
title: "ครอบคลุมในโน้ต"
description: "โพสต์ 500 โน้ต"
_notes1000:
title: "ภูเขาแห่งโน้ต"
description: "โพสต์ 1,000 โน้ต"
_notes5000:
title: "โน้ตล้น"
description: "โพสต์ 5,000 โน้ต"
_notes10000:
title: "ซุปเปอร์โน้ต"
description: "โพสต์ 10,000 โน้ต"
_notes20000:
title: "ต้องการ... เพิ่มเติม... โน้ต..."
description: "โพสต์ 20,000 โน้ต"
_notes30000:
title: "โน้ต โน้ต โน้ต!"
description: "โพสต์ 30,000 โน้ต"
_notes40000:
title: "โน้ตโรงงาน"
description: "โพสต์ 40,000 โน้ต"
_notes50000:
title: "ดาวเคราะห์แห่งโน้ต"
description: "โพสต์ 50,000 โน้ต"
_notes60000:
title: "โน้ตควอซาร์"
description: "โพสต์ 60,000 โน้ต"
_notes70000:
title: "โน้ตหลุมดำ"
description: "โพสต์ 70,000 โน้ต"
_notes80000:
title: "โน้ต กาแล็กซี่"
description: "โพสต์ 80,000 โน้ต"
_notes90000:
title: "โน้ต จักรวาล"
description: "โพสต์ 90,000 โน้ต"
_notes100000:
title: "ALL YOUR NOTE ARE BELONG TO US"
description: "โพสต์ 100,000 โน้ต"
flavor: "นายแน่ใจล่ะก็ มีอะไรพูดมาได้นะ"
_login3:
title: "มือใหม่ I"
description: "เข้าสู่ระบบเป็นเวลารวม 3 วัน"
flavor: "เริ่มตั้งแต่วันนี้ เรียกฉันว่ามิสคิสต์"
_login7:
title: "มือใหม่ II"
description: "เข้าสู่ระบบเป็นเวลารวม 7 วัน"
flavor: "รู้สึกเหมือนคุณได้แขวนของสิ่งต่างๆ หรือยังคะ?"
_login15:
title: "มือใหม่ III"
description: "เข้าสู่ระบบเป็นเวลารวม 15 วัน"
_login30:
title: "มิสคิสท์ I"
description: "เข้าสู่ระบบเป็นเวลารวม 30 วัน"
_login60:
title: "มิสคิสท์ II"
description: "เข้าสู่ระบบเป็นเวลารวม 60 วัน"
_login100:
title: "มิสคิสท์ III"
description: "เข้าสู่ระบบเป็นเวลารวม 100 วัน"
flavor: "ความรุนแรง Misskist"
_login200:
title: "ลูกค้าประจำ I"
description: "เข้าสู่ระบบเป็นเวลารวม 200 วัน"
_login300:
title: "ลูกค้าประจำ II"
description: "เข้าสู่ระบบเป็นเวลารวม 300 วัน"
_login400:
title: "ลูกค้าประจำ III"
description: "เข้าสู่ระบบเป็นเวลารวม 400 วัน"
_login500:
title: "ผู้เชี่ยวชาญ I"
description: "เข้าสู่ระบบเป็นเวลารวม 500 วัน"
flavor: "เพื่อนของผมนะมักจะกล่าวว่าผมนะชอบจดโน้ต"
_login600:
title: "ผู้เชี่ยวชาญ II"
description: "เข้าสู่ระบบเป็นเวลารวม 600 วัน"
_login700:
title: "ผู้เชี่ยวชาญ III"
description: "เข้าสู่ระบบเป็นเวลารวม 700 วัน"
_login800:
title: "ปรมาจารย์ด้านโน้ต I"
description: "เข้าสู่ระบบเป็นเวลารวม 800 วัน"
_login900:
title: "ปรมาจารย์ด้านโน้ต II"
description: "เข้าสู่ระบบเป็นเวลารวม 900 วัน"
_login1000:
title: "ปรมาจารย์ด้านโน้ต III"
description: "เข้าสู่ระบบเป็นเวลารวม 1,000 วัน"
flavor: "ขอบคุณที่ใช้ Misskey นะ !"
_noteClipped1:
title: "จะต้อง... คลิป..."
description: "คลิปโน้ตตัวแรกของคุณ"
_noteFavorited1:
title: "สตาร์เกเซอร์"
description: "ชื่นชอบโน้ตแรกของคุณ"
_myNoteFavorited1:
title: "แสวงหาดวงดาว"
description: "มีคนอื่นๆที่ชื่นชอบหนึ่งในโน้ตของคุณ"
_profileFilled:
title: "เตรียมไว้อย่างดี"
description: "ตั้งค่าโปรไฟล์ของคุณ"
_markedAsCat:
title: "ฉันเป็นแมว"
description: "ทำเครื่องหมายบัญชีของคุณว่าเป็นแมว"
flavor: "ฉันจะให้ชื่อคุณภายหลังนะ"
_following1:
title: "กำลังติดตามผู้ใช้คนแรกของคุณ"
description: "ติดตามผู้ใช้"
_following10:
title: "ทำต่อไป... ทำต่อไป..."
description: "ติดตาม 10 บัญชีผู้ใช้"
_following50:
title: "มีเพื่อนมากมาย"
description: "ติดตาม 50 บัญชี"
_following100:
title: "เพื่อน 100 คน"
description: "ติดตาม 100 บัญชี"
_following300:
title: "เพื่อนโอเวอร์โหลด"
description: "ติดตาม 300 บัญชี"
_followers1:
title: "ผู้ติดตามคนแรก"
description: "ได้รับ 1 ผู้ติดตาม"
_followers10:
title: "ติดตามฉัน!"
description: "ได้รับ 10 คนผู้ติดตาม"
_followers50:
title: "มากันเป็นฝูง"
description: "ได้รับ 50 ผู้ติดตาม"
_followers100:
title: "บุคคลที่เป็นที่นิยม"
description: "ได้รับ 100 ผู้ติดตาม"
_followers300:
title: "กรุณาสร้างบรรทัดเดียวนะคะ"
description: "ได้รับ 300 คนผู้ติดตาม"
_followers500:
title: "เสาสัญญาณ"
description: "ได้รับ 500 คนผู้ติดตาม"
_followers1000:
title: "ผู้ทรงอิทธิพล"
description: "ได้รับ 1,000 ผู้ติดตาม"
_collectAchievements30:
title: "นักสะสมความสำเร็จ"
description: "ได้รับความสำเร็จ 30 ครั้ง"
_viewAchievements3min:
title: "ชอบบรรลุผลสําเร็จ"
description: "มองดูรายการความสำเร็จของคุณเป็นเวลาอย่างน้อย 3 นาที"
_iLoveMisskey:
title: "ฉันรัก Misskey"
description: "โพสต์ \"I ❤ #Misskey\""
flavor: "ทีมผู้พัฒนา Misskey ได้ขอบคุณสำหรับการสนับสนุนของคุณ!"
_foundTreasure:
title: "ล่าสมบัติ"
description: "คุณพบสมบัติที่ซ่อนอยู่"
_client30min:
title: "พักผ่อนสักหน่อย"
description: "ใช้เวลา 30 นาทีบน Misskey"
_noteDeletedWithin1min:
title: "ไม่เป็นไร"
description: "ลบโน้ตภายในหนึ่งนาทีหลังจากที่โพสต์"
_postedAtLateNight:
title: "กลางคืน"
description: "โพสต์โน้ตตอนดึกๆ"
flavor: "ได้เวลาเข้านอนแล้วนะ"
_postedAt0min0sec:
title: "นาฬิกาพูดได้"
description: "โพสต์บนโน้ตเมื่อเวลา 00:00 น."
flavor: "คลิก คลิก คลิก แกล๊งๆ"
_selfQuote:
title: "อ้างอิงตนเอง"
description: "อ้างโน้ตย่อของคุณเอง"
_htl20npm:
title: "ไทม์ไลน์ไหล"
description: "มีการทำความเร็วของไทม์ไลน์ที่บ้านของคุณเกิน 20 npm (โน้ตต่อนาที)"
_viewInstanceChart:
title: "วิเคราะห์"
description: "ดูแผนภูมิอินสแตนซ์ของคุณ"
_outputHelloWorldOnScratchpad:
title: "หวัดดีชาวโลก!"
description: "เอาพุต \"hello world\" ใน Scratchpad"
_open3windows:
title: "มัลติวินโดว์"
description: "มีการเปิดหน้าต่างอย่างน้อย 3 หน้าต่างพร้อมกัน"
_driveFolderCircularReference:
title: "อ้างอิงวงจร"
description: "พยายามสร้างโฟลเดอร์ที่ซ้อนกันแบบวนซ้ำในไดรฟ์"
_reactWithoutRead:
title: "คุณอ่านมันจริงๆหรือเปล่า?"
description: "มีการโต้ตอบกับโน้ตที่มีความยาวมากกว่า 100 ตัวอักษรภายใน 3 วินาทีหลังจากที่โพสต์"
_clickedClickHere:
title: "คลิ๊กที่นี่"
description: "คุณได้คลิกที่นี่"
_justPlainLucky:
title: "แค่ลัคกี้ธรรมดา"
description: "มีโอกาสที่จะได้รับด้วยความน่าจะเป็นไปได้ 0.005% ทุก ๆ 10 วินาที"
_setNameToSyuilo:
title: "พระเจ้าคอมเพล็กซ์"
description: "ตั้งชื่อของคุณเป็น \"syuilo\""
_passedSinceAccountCreated1:
title: "ครบรอบหนึ่งปี"
description: "ผ่านไปหนึ่งปีแล้วนะตั้งแต่บัญชีของคุณถูกสร้างขึ้นมาน่ะ"
_passedSinceAccountCreated2:
title: "ครบรอบสองปี"
description: "ผ่านไปสองปีแล้วนะตั้งแต่บัญชีของคุณถูกสร้างขึ้นมาน่ะ"
_passedSinceAccountCreated3:
title: "ครบรอบสามปี"
description: "ผ่านไปสามปีแล้วนะตั้งแต่บัญชีของคุณถูกสร้างขึ้นมาน่ะ"
_loggedInOnBirthday:
title: "สุขสันต์วันเกิด"
description: "เข้าสู่ระบบในวันเกิดของคุณ"
_loggedInOnNewYearsDay:
title: "สวัสดีปีใหม่!"
description: "เข้าสู่ระบบในวันแรกของปี"
flavor: "อีกปีที่ยอดเยี่ยมในโอกาสนี้เลย"
_cookieClicked:
title: "เกมที่คุณคลิกที่คุกกี้"
description: "คลิกคุกกี้"
flavor: "เดี๋ยวก่อนนะ คุณอยู่ในเว็บไซต์ที่ถูกต้องแน่อย่างงั้นเหรอ?"
_brainDiver:
title: "Brain Diver"
description: "โพสต์ลิงก์ไปยัง Brain Diver"
flavor: "Misskey-Misskey La-Tu-Ma"
_role:
new: "บทบาทใหม่"
edit: "แก้ไขบทบาท"
@@ -939,7 +1184,7 @@ _role:
description: "คำอธิบายบทบาท"
permission: "สิทธิ์ตามบทบาท"
descriptionOfPermission: "<b>ผู้ดูแลกลั่นกรองเนื้อหา</b> สามารถดำเนินการดูแลขั้นพื้นฐานได้นะ\n<b>ผู้ดูแลระบบ</b> สามารถเปลี่ยนการตั้งค่าทั้งหมดของอินสแตนซ์ได้นะ"
assignTarget: "กำหนดเป้าหมาย"
assignTarget: "มอบหมาย"
descriptionOfAssignTarget: "<b>แมนนวล</b> เพื่อเปลี่ยนผู้ที่เป็นส่วนหนึ่งของบทบาทนี้และใครที่ไม่ใช่ด้วยตนเอง\n<b>เงื่อนไข</b> เพื่อให้ผู้ใช้ได้รับการกำหนดและนำออกจากบทบาทนี้โดยอัตโนมัติตามเงื่อนไขชุดหนึ่ง"
manual: "ปรับเอง"
conditional: "มีเงื่อนไข"
@@ -948,9 +1193,13 @@ _role:
isPublic: "บทบาทสาธารณะ"
descriptionOfIsPublic: "ทุกคนสามารถดูได้ว่าผู้ใช้งานนั้นได้รับมอบหมายบทบาทด้วยหรือไม่ \n\nบทบาทจะแสดงในโปรไฟล์ของผู้ใช้ด้วย"
options: "ตัวเลือกบทบาท"
policies: "นโยบาย"
baseRole: "บทบาทพื้นฐาน"
useBaseValue: "ใช้บทบาทพื้นฐานเริ่มต้น"
chooseRoleToAssign: "เลือกบทบาทที่ต้องการกำหนด"
iconUrl: "ไอคอน URL"
asBadge: "แสดงเป็นตรา"
descriptionOfAsBadge: "ไอคอนของบทบาทนี้จะปรากฏถัดจากชื่อผู้ใช้ของผู้ใช้งานด้วยบทบาทนี้ถ้าหากเปิดใช้งาน"
canEditMembersByModerator: "อนุญาตให้ผู้ดูแลแก้ไขสมาชิก"
descriptionOfCanEditMembersByModerator: "เมื่อเปิดใช้ ผู้ดูแลนอกเหนือจากผู้ดูแลระบบแล้ว จะสามารถกำหนดและยกเลิกการมอบหมายบทบาทนี้ให้กับผู้ใช้ได้ เมื่อปิด เฉพาะผู้ดูแลระบบเท่านั้นที่จะสามารถกำหนดผู้ใช้ได้นะ"
priority: "ลำดับความสำคัญ"
@@ -965,7 +1214,17 @@ _role:
canInvite: "สร้างรหัสเชิญอินสแตนซ์"
canManageCustomEmojis: "จัดการอีโมจิแบบกำหนดเอง"
driveCapacity: "ความจุของไดรฟ์"
pinMax: "จํานวนสูงสุดของโน้ตที่ปักหมุดไว้"
antennaMax: "จำนวนสูงสุดของเสาอากาศ"
wordMuteMax: "จำนวนอักขระสูงสุดที่อนุญาตในการปิดเสียงคำ"
webhookMax: "จำนวนเว็บฮุคสูงสุด"
clipMax: "จำนวนคลิปสูงสุด"
noteEachClipsMax: "จำนวนโน้ตสูงสุดภายในคลิป"
userListMax: "จำนวนรายชื่อผู้ใช้สูงสุด"
userEachUserListsMax: "จำนวนผู้ใช้สูงสุดภายในรายการผู้ใช้"
rateLimitFactor: "ขีดจำกัดอัตรา"
descriptionOfRateLimitFactor: "ขีดจํากัดอัตราที่ต่ำกว่ามีข้อจํากัดน้อยกว่าข้อจํากัดที่สูงกว่า"
canHideAds: "ซ่อนโฆษณา"
_condition:
isLocal: "ผู้ใช้ภายใน"
isRemote: "ผู้ใช้ระยะไกล"
@@ -1066,72 +1325,6 @@ _nsfw:
respect: "ซ่อนสื่อ NSFW"
ignore: "อย่าซ่อนสื่อ NSFW"
force: "ซ่อนสื่อทั้งหมด"
_mfm:
cheatSheet: "โค้ด MFM Cheat Sheet"
intro: "MFM เป็นภาษามาร์กอัปพิเศษเฉพาะของ Misskey ที่สามารถใช้ได้ในหลายที่ คุณยังสามารถดูรายการไวยากรณ์ MFM ที่มีอยู่ทั้งหมดได้ที่นี่นะ"
dummy: "Misskey ขยายโลกของ Fediverse"
mention: "กล่าวถึง"
mentionDescription: "คุณสามารถระบุผู้ใช้โดยใช้ At-Symbol และชื่อผู้ใช้ได้นะ"
hashtag: "แฮชแท็ก"
hashtagDescription: "คุณสามารถระบุชื่อแฮชแท็กได้โดยใช้เครื่องหมายตัวเลขและข้อความได้นะ"
url: "URL"
urlDescription: "สามารถแสดง URL ได้นะ"
link: "ลิงก์"
linkDescription: "เจาะจงเฉพาะ ส่วนของข้อความที่สามารถแสดงเป็น URL ได้"
bold: "ตัวหนา"
boldDescription: "ไฮไลท์ตัวอักษรโดยทำให้หนาขึ้น"
small: "ขนาดเล็ก"
smallDescription: "แสดงผลเนื้อหาขนาดเล็กและบาง"
center: "เซ็นเตอร์"
centerDescription: "แสดงผลเนื้อหาเป็นศูนย์กลาง"
inlineCode: "โค้ด (อินไลน์)"
inlineCodeDescription: "แสดงผลการเน้นไวยากรณ์แบบอินไลน์สำหรับโค้ด (โปรแกรม)"
blockCode: "โค้ด (บล็อก)"
blockCodeDescription: "แสดงผลการเน้นไวยากรณ์สำหรับโค้ดหลายบรรทัด (โปรแกรม) ในบล็อก"
inlineMath: "คณิต (อินไลน์)"
inlineMathDescription: "แสดงผลสูตรคณิต (KaTeX) ในบรรทัด"
blockMath: "คณิต (บล็อก)"
blockMathDescription: "แสดงผลสูตรคณิตหลายบรรทัด (KaTeX) ในบล็อก"
quote: "อ้างคำพูด"
quoteDescription: "แสดงผลเนื้อหาเป็นใบเสนอราคา"
emoji: "กำหนดอีโมจิเอง"
emojiDescription: "โดยล้อมรอบชื่ออีโมจิที่กำหนดเองด้วยเครื่องหมายทวิภาค จะสามารถแสดงผลอีโมจิที่กำหนดเองได้"
search: "ค้นหา"
searchDescription: "แสดงผลกล่องค้นหาพร้อมกับข้อความที่ป้อนไว้ล่วงหน้า"
flip: "พลิก"
flipDescription: "พลิกเนื้อหาในแนวนอนหรือแนวตั้ง"
jelly: "แอนิเมชั่น (เยลลี่)"
jellyDescription: "ให้เนื้อหาเป็นแอนิเมชั่นเหมือนเยลลี่"
tada: "แอนิเมชั่น (ธาดา)"
tadaDescription: "ให้เนื้อหาเป็นแอนิเมชั่นเหมือน \"ทาด้า!\""
jump: "อนิเมชั่น (กระโดด)"
jumpDescription: "ให้เนื้อหามีภาพเคลื่อนไหวแบบกระโดด"
bounce: "อนิเมชั่น (เด้ง)"
bounceDescription: "ให้เนื้อหามีอนิเมชั่นเด้ง"
shake: "อนิเมชั่น (เขย่า)"
shakeDescription: "ให้เนื้อหามีภาพเคลื่อนไหวสั่น"
twitch: "แอนิเมชั่น (Twitch)"
twitchDescription: "ให้เนื้อหามีแอนิเมชั่นกระตุกอย่างแรง"
spin: "แอนิเมชั่น (สปิน)"
spinDescription: "ให้เนื้อหาเป็นภาพเคลื่อนไหวแบบหมุน"
x2: "ขนาดใหญ่"
x2Description: "แสดงเนื้อหาที่ใหญ่ขึ้น"
x3: "ใหญ่มาก"
x3Description: "แสดงเนื้อหาอีเว้นท์ที่ใหญ่ขึ้น"
x4: "ใหญ่อย่างไม่น่าเชื่อ"
x4Description: "แสดงผลเนื้อหาที่ใหญ่กว่าใหญ่กว่าขนาดใหญ่"
blur: "เบลอ"
blurDescription: "เบลอเนื้อหา จะแสดงผลอย่างชัดเจนต่อเมื่อวางเมาส์เหนือ"
font: "ตัวอักษร"
fontDescription: "ตั้งค่าตัวอักษรเพื่อแสดงเนื้อหาใน"
rainbow: "สายรุ้ง"
rainbowDescription: "ทำให้เนื้อหานั้นปรากฏเป็นสีรุ้ง"
sparkle: "กลิตเตอร์"
sparkleDescription: "ให้เนื้อหานั้นมีเอฟเฟกต์แบบอนุภาคประกาย"
rotate: "หมุนหน้าจอ"
rotateDescription: "เปลี่ยนเนื้อหาตามด้วยมุมที่ระบุไว้"
plain: "เรียบง่าย"
plainDescription: "ปิดการใช้งานเอฟเฟกต์ของ MFM ทั้งหมดที่มีอยู่ในเอฟเฟกต์ MFM นี้"
_instanceTicker:
none: "ไม่ต้องแสดง"
remote: "แสดงสำหรับผู้ใช้ระยะไกล"
@@ -1336,12 +1529,15 @@ _permissions:
"read:gallery-likes": "ดูรายการโพสต์ในแกลเลอรีที่ชอบของคุณ"
"write:gallery-likes": "แก้ไขรายการโพสต์ในแกลเลอรีที่ชอบของคุณ"
_auth:
shareAccessTitle: "การให้สิทธิ์แอปพลิเคชัน"
shareAccess: "คุณต้องการอนุญาตให้ \"{name}\" เข้าถึงบัญชีนี้เลยมั้ย?"
shareAccessAsk: "คุณแน่ใจแล้วจริงๆหรอว่าต้องการอนุญาตให้แอปพลิเคชันนี้เข้าถึงบัญชีของคุณแน่ใจแล้วหรอ?"
permission: "{name} ได้ขอสิทธิ์การเข้าถึงดังต่อไปนี้"
permissionAsk: "แอปพลิเคชันนี้ขอสิทธิ์ดังต่อไปนี้"
pleaseGoBack: "กรุณากลับไปที่แอปพลิเคชัน"
callback: "กำลังกลับไปที่แอปพลิเคชัน"
denied: "ปฏิเสธการเข้าใช้"
pleaseLogin: "กรุณาเข้าสู่ระบบเพื่ออนุมัติแอปพลิเคชัน"
_antennaSources:
all: "โน้ตทั้งหมด"
homeTimeline: "โน้ตจากผู้ใช้ที่ติดตาม"
@@ -1570,6 +1766,7 @@ _notification:
pollEnded: "โพลสำรวจความคิดเห็นผลลัพธ์มีพร้อมใช้งาน"
unreadAntennaNote: "เสาอากาศ {name}"
emptyPushNotificationMessage: "การแจ้งเตือนแบบพุชได้รับการอัพเดทแล้ว"
achievementEarned: "รับความสำเร็จ"
_types:
all: "ทั้งหมด"
follow: "กำลังติดตาม"
@@ -1611,5 +1808,6 @@ _deck:
tl: "ไทม์ไลน์"
antenna: "เสาอากาศ"
list: "รายการ"
channel: "แชนแนล"
mentions: "พูดถึง"
direct: "ไดเร็ค"

View File

@@ -48,8 +48,6 @@ smtpUser: "Kullanıcı Adı"
smtpPass: "Şifre"
user: "Kullanıcı"
searchByGoogle: "Arama"
_mfm:
search: "Arama"
_sfx:
notification: "Bildirim"
_widgets:

View File

@@ -2,5 +2,3 @@
_lang_: "ياپونچە"
search: "ئىزدەش"
searchByGoogle: "ئىزدەش"
_mfm:
search: "ئىزدەش"

View File

@@ -109,6 +109,7 @@ clickToShow: "Натисніть для перегляду"
sensitive: "NSFW"
add: "Додати"
reaction: "Реакції"
reactions: "Реакції"
reactionSetting: "Налаштування реакцій"
reactionSettingDescription2: "Перемістити щоб змінити порядок, Клацнути мишою щоб видалити, Натиснути \"+\" щоб додати."
rememberNoteVisibility: "Пам’ятати параметри видимісті"
@@ -460,7 +461,6 @@ youHaveNoGroups: "Немає груп"
joinOrCreateGroup: "Отримуйте запрошення до груп або створюйте свої власні групи."
noHistory: "Історія порожня"
signinHistory: "Історія входів"
disableAnimatedMfm: "Відключити анімації MFM"
doing: "Виконується"
category: "Категорія"
tags: "Теги"
@@ -528,7 +528,7 @@ state: "Стан"
sort: "Сортування"
ascendingOrder: "За зростанням"
descendingOrder: "За спаданням"
scratchpad: "Чернетка"
scratchpad: "Scratchpad"
scratchpadDescription: "Scratchpad надає середовище для експериментів з AiScript. Ви можете писати, виконувати його і тестувати взаємодію з Misskey."
output: "Вихід"
script: "Скрипт"
@@ -586,7 +586,7 @@ pluginTokenRequestedDescription: "Цей плагін зможе викорис
notificationType: "Тип сповіщення"
edit: "Редагувати"
useStarForReactionFallback: "Використовувати ★ як запасний варіант, якщо емодзі реакції невідомий"
emailServer: "Сервер електронної пошти"
emailServer: "Email сервер"
enableEmail: "Увімкнути функцію доставки пошти"
emailConfigInfo: "Використовується для підтвердження електронної пошти підчас реєстрації, а також для відновлення паролю."
email: "E-mail"
@@ -687,7 +687,7 @@ pageLikesCount: "Кількість отриманих вподобань сто
pageLikedCount: "Кількість вподобаних сторінок"
contact: "Контакт"
useSystemFont: "Використовувати стандартний шрифт системи"
clips: "Добірка"
clips: "Добірки"
experimentalFeatures: "Експериментальні функції"
developer: "Розробник"
makeExplorable: "Зробіть обліковий запис видимим у розділі \"Огляд\""
@@ -892,9 +892,228 @@ unsubscribePushNotification: "Вимкнути push-сповіщення"
windowMaximize: "Розгорнути"
windowRestore: "Відновити"
caption: "Підпис"
tools: "Інструменти"
like: "Вподобати"
unlike: "Не вподобати"
numberOfLikes: "Вподобання"
show: "Відображення"
color: "Колір"
achievements: "Досягнення"
_achievements:
earnedAt: "Відкрито"
_types:
_notes1:
title: "Привіт, Misskey!"
description: "Перша нотатка"
flavor: "Приємного часу з Misskey!"
_notes10:
title: "Декілька нотаток"
description: "10 нотаток відправлено"
_notes100:
title: "Купа нотаток"
description: "100 нотаток відправлено"
_notes500:
title: "Все в нотатках"
description: "500 нотаток відправлено"
_notes1000:
title: "Гора нотаток"
description: "1 000 нотаток відправлено"
_notes5000:
title: "Переповнюючі нотатки"
description: "5 000 нотаток відправлено"
_notes10000:
title: "Супернотатка"
description: "10 000 нотаток відправлено"
_notes20000:
title: "Треба Більше Нотаток"
description: "20 000 нотаток відправлено"
_notes30000:
title: "Нотатки нотатки нотатки"
description: "30 000 нотаток відправлено"
_notes40000:
title: "Фабрика нотаток"
description: "40 000 нотаток відправлено"
_notes50000:
title: "Планета нотаток"
description: "50 000 нотаток відправлено"
_notes60000:
title: "Нотатковий квазар"
description: "60 000 нотаток відправлено"
_notes70000:
title: "Чорна нотаткова діра"
description: "70 000 нотаток відправлено"
_notes80000:
title: "Галактика нотаток"
description: "80 000 нотаток відправлено"
_notes90000:
title: "Нотатковерс"
description: "90 000 нотаток відправлено"
_notes100000:
title: "ALL YOUR NOTE ARE BELONG TO US"
description: "100 000 нотаток відправлено"
flavor: "Так багато потрібно сказати?"
_login3:
title: "Новачок I"
description: "3 дні користування загально"
flavor: "Відсьогодні називайте мене \"Місскіст\""
_login7:
title: "Новачок II"
description: "7 днів користування загально"
flavor: "Ви звикли до цього?"
_login15:
title: "Новачок III"
description: "15 днів користування загально"
_login30:
title: "Міскієць I"
description: "30 днів користування загально"
_login60:
title: "Міскієць II"
description: "60 днів користування загально"
_login100:
title: "Міскієць III"
description: "100 днів користування загально"
flavor: "Цей юзер лютий місскіст"
_login200:
title: "Завсідник I"
description: "200 днів користування загально"
_login300:
title: "Завсідник II"
description: "300 днів користування загально"
_login400:
title: "Завсідник III"
description: "400 днів користування загально"
_login500:
title: "Ветеран I"
description: "500 днів користування загально"
flavor: "Meine Kameraden, ich liebe sie, die Notizen."
_login600:
title: "Ветеран II"
description: "600 днів користування загально"
_login700:
title: "Ветеран III"
description: "700 днів користування загально"
_login800:
title: "Майстер нотаток I"
description: "800 днів користування загально"
_login900:
title: "Майстер нотаток II"
description: "900 днів користування загально"
_login1000:
title: "Майстер нотаток III"
description: "1000 днів користування загально"
flavor: "Дякуємо, що користуєтеся Misskey!"
_noteClipped1:
title: "Не можна не зберегти"
description: "Перша нотатка у добірці"
_noteFavorited1:
title: "Дивитися на зірки"
_myNoteFavorited1:
title: "У пошуках зірок"
_profileFilled:
title: "Повна готовність"
description: "Профіль заповнено"
_markedAsCat:
title: "Я кіт"
description: "Позначено як акаунт кота"
flavor: "Я дам тобі ім'я пізніше"
_following1:
title: "Перша підписка"
_following10:
title: "Продовжуй, продовжуй"
_following50:
title: "Багато друзів"
description: "Кількість підписок сягнула 50"
_following100:
title: "100 друзів"
description: "Кількість підписок сягнула 100"
_following300:
title: "Надлишок друзів"
description: "Кількість підписок сягнула 300"
_followers1:
title: "Перший підписник"
description: "З'явився перший підписник"
_followers10:
title: "Follow me!"
description: "Кількість підписників досягла 10"
_followers50:
description: "Кількість підписників досягла 50"
_followers100:
title: "Популярна особа"
description: "Кількість підписників досягла 100"
_followers300:
title: "Ставайте в чергу"
description: "Кількість підписників досягла 300"
_followers500:
title: "Радіовежа"
description: "Кількість підписників досягла 500"
_followers1000:
title: "Інфлюенсер"
description: "Кількість підписників досягла 1000"
_collectAchievements30:
title: "Збирач досягнень"
description: "Отримано 30 досягнень"
_viewAchievements3min:
title: "Шанувальник досягнень"
description: "Переглядати список досягнень принаймні 3 хвилини"
_iLoveMisskey:
title: "I Love Misskey"
description: "Відправлено \"I ❤ #Misskey\""
flavor: "Дякуємо вам, що користуєтесь Misskey! команда розробників"
_foundTreasure:
title: "Пошуки скарбів"
description: "Ви знайшли прихований скарб"
_client30min:
title: "Коротка перерва"
description: "З моменту запуску клієнта минуло 30 хвилин"
_noteDeletedWithin1min:
title: "Не зважай"
description: "Допис видалено протягом 1 хвилини після публікації"
_postedAtLateNight:
title: "Нічне життя"
description: "Відправити нотатку посеред ночі"
flavor: "Час лягати спати"
_postedAt0min0sec:
title: "Сигнал часу"
description: "Відправити нотатку о 00:00"
_selfQuote:
title: "Самопосилання"
description: "Процитувати власну нотатку"
_htl20npm:
title: "Плинна стрічка"
description: "Перевищити швидкість домашньої стрічки 20npm (нотаток на хвилину)"
_viewInstanceChart:
title: "Аналітик"
_outputHelloWorldOnScratchpad:
title: "Hello, world!"
description: "Вивести \"hello world\" у Скретчпаді"
_clickedClickHere:
title: "Натисніть тут"
description: "Натиснуто тут"
_justPlainLucky:
title: "Просто вдача"
description: "Можна отримати з ймовірністю 0,01% кожні 10 секунд"
_setNameToSyuilo:
title: "Комплекс бога"
description: "Встановлено ім'я \"syuilo\""
_passedSinceAccountCreated1:
title: "Перша річниця"
description: "Минув рік з моменту створення акаунта"
_passedSinceAccountCreated2:
title: "Друга річниця"
description: "Минуло 2 роки з моменту створення акаунта"
_passedSinceAccountCreated3:
title: "Третя річниця"
description: "Минуло 3 роки з моменту створення акаунта"
_loggedInOnBirthday:
title: "З Днем народження!"
description: "Увійти у свій день народження"
_loggedInOnNewYearsDay:
title: "З Новим роком!"
description: "Увійшли в перший день року"
_brainDiver:
title: "Brain Diver"
description: "Відправити посилання на \"Brain Diver\""
flavor: "Misskey-Misskey La-Tu-Ma"
_role:
priority: "Пріоритет"
_priority:
@@ -971,65 +1190,6 @@ _nsfw:
respect: "Приховувати NSFW медіа"
ignore: "Не приховувати NSFW медіа"
force: "Приховувати всі медіа файли"
_mfm:
cheatSheet: " Довідка MFM"
intro: "MFM це ексклюзивна мова розмітки тексту в Misskey, яку можна використовувати в багатьох місцях. Тут ви можете переглянути приклади її синтаксису."
dummy: "Misskey розширює світ Федіверсу"
mention: "Згадка"
mentionDescription: "За допомогою знака \"@\" перед ім'ям можна згадати конкретного користувача."
hashtag: "Хештеґ"
hashtagDescription: "За допомогою знака \"решітка\" перед словом задається хештег."
url: "URL"
urlDescription: "Відображаються URL-адреси."
link: "Посилання"
linkDescription: "Окремі частини тексту можуть містити посилання"
bold: "Жирний шрифт"
boldDescription: "Виділяє літери, роблячи їх товще"
small: "Дрібний шрифт"
smallDescription: "Робить текст маленьким і тонким"
center: "По центру"
centerDescription: "Показує вміст у центрі"
inlineCode: "Код (у рядку)"
inlineCodeDescription: "Показує фрагмент тексту у рядку як програмний код"
blockCode: "Код (блок)"
blockCodeDescription: "Показує кілька рядків тексту як блок програмного кода"
inlineMath: "Формула (у рядку)"
inlineMathDescription: "Відображення математичних формул (KaTeX) у рядку"
blockMath: "Формули (блок)"
blockMathDescription: "Відображати багаторядкові формули (KaTeX) блоками"
quote: "Цитата"
quoteDescription: "Відображає зміст як цитату."
emoji: "Кастомні емоджі"
emojiDescription: "Щоб показати нетиповий емоджі, потрібно ввести його назву в двокрапках."
search: "Пошук"
searchDescription: "Відображає вікно пошуку з попередньо введеним текстом"
flip: "Перевернути"
flipDescription: "Віддзеркалює вміст по горизонталі або вертикалі"
jelly: "Анімація (желе)"
jellyDescription: "Створює желеподібну анімацію"
tada: "Анімація (Тада!)"
tadaDescription: "Створює анімацію з відчуттям \"Тада!\""
jump: "Анімація (стрибки)"
jumpDescription: "Показує стрибаючу анімацію"
bounce: "Анімація (пружина)"
bounceDescription: "Надає вмісту стрибаючу анімацію."
shake: "Анімація (Shake)"
shakeDescription: "Надає вмісту тремтливу анімацію."
twitch: "Анімація (Twitch)"
spin: "Анімація (Spin)"
x2: "Великий"
x2Description: "Показує контент збільшеним."
x3: "Дуже великий"
x3Description: "Показує контент ще більшим."
x4: "Надзвичайно великий"
x4Description: "Показує контент надзвичайно великим."
blur: "Розмиття"
blurDescription: "Цей ефект зробить контент розмитим. Контент можна зробити чітким, якщо навести на нього вказівник миші."
font: "Шрифт"
fontDescription: "Встановлює шрифт для контенту."
rotate: "Обертати"
plain: "Звичайний"
plainDescription: "Деактивує всі ефекти MFM, що містяться в цьому ефекті MFM."
_instanceTicker:
none: "Не відображати"
remote: "Відображати для віддалених користувачів"
@@ -1162,12 +1322,12 @@ _tutorial:
step1_1: "Ласкаво просимо!"
step1_2: "Ця сторінка має назву \"стрічка подій\". На ній з'являються записи користувачів на яких ви підписані."
step1_3: "Наразі ваша стрічка порожня, оскільки ви ще не написали жодної нотатки і не підписані на інших."
step2_1: "Перш ніж зробити запис або підписатись на когось, спочатку заповніть свій обліковий запис."
step2_2: "Надання деякої інформації про себе дозволить іншим користувачам підписатись на вас."
step2_1: "Перш ніж зробити запис або підписатись на когось, заповніть свій профіль."
step2_2: "Надання деякої інформації про себе допоможе іншим користувачам вирішити підписатись на вас."
step3_1: "Ви успішно налаштували свій обліковий запис?"
step3_2: "Наступним кроком є написання нотатки. Це можна зробити, натиснувши зображення олівця на екрані."
step3_3: "Після написання вмісту ви можете опублікувати його, натиснувши кнопку у верхньому правому куті форми."
step3_4: "Не знаєте що написати? Спробуйте \"налаштовую свій msky\"!"
step3_4: "Не знаєте що написати? Спробуйте \"Привіт, Misskey!\""
step4_1: "Ви розмістили свій перший запис?"
step4_2: "Ура! Ваш перший запис відображається на вашій стрічці подій."
step5_1: "Настав час оживити вашу стрічку подій підписавшись на інших користувачів."
@@ -1431,6 +1591,7 @@ _notification:
youReceivedFollowRequest: "Ви отримали запит на підписку"
yourFollowRequestAccepted: "Запит на підписку прийнято"
youWereInvitedToGroup: "Запрошення до групи"
achievementEarned: "Досягнення відкрито"
_types:
all: "Все"
follow: "Підписки"
@@ -1468,5 +1629,6 @@ _deck:
tl: "Стрічка"
antenna: "Антени"
list: "Списки"
channel: "Канали"
mentions: "Згадки"
direct: "Особисте"

View File

@@ -107,6 +107,7 @@ clickToShow: "Nhấn để xem"
sensitive: "Nhạy cảm"
add: "Thêm"
reaction: "Biểu cảm"
reactions: "Biểu cảm"
reactionSetting: "Chọn những biểu cảm hiển thị"
reactionSettingDescription2: "Kéo để sắp xếp, nhấn để xóa, nhấn \"+\" để thêm."
rememberNoteVisibility: "Lưu kiểu tút mặc định"
@@ -456,7 +457,6 @@ youHaveNoGroups: "Không có nhóm nào"
joinOrCreateGroup: "Tham gia hoặc tạo một nhóm mới."
noHistory: "Không có dữ liệu"
signinHistory: "Lịch sử đăng nhập"
disableAnimatedMfm: "Tắt MFM với chuyển động"
doing: "Đang xử lý..."
category: "Phân loại"
tags: "Thẻ"
@@ -991,72 +991,6 @@ _nsfw:
respect: "Ẩn nội dung NSFW"
ignore: "Hiện nội dung NSFW"
force: "Ẩn mọi media"
_mfm:
cheatSheet: "MFM Cheatsheet"
intro: "MFM là ngôn ngữ phát triển độc quyền của Misskey có thể được sử dụng ở nhiều nơi. Tại đây bạn có thể xem danh sách tất cả các cú pháp MFM có sẵn."
dummy: "Misskey mở rộng thế giới Fediverse"
mention: "Nhắc đến"
mentionDescription: "Bạn có thể nhắc đến ai đó bằng cách sử dụng @tên người dùng."
hashtag: "Hashtag"
hashtagDescription: "Bạn có thể tạo một hashtag bằng #chữ hoặc #số."
url: "URL"
urlDescription: "Những URL có thể hiển thị."
link: "Đường dẫn"
linkDescription: "Các phần cụ thể của văn bản có thể được hiển thị dưới dạng URL."
bold: "In đậm"
boldDescription: "Nổi bật các chữ cái bằng cách làm chúng dày hơn."
small: "Nhỏ"
smallDescription: "Hiển thị nội dung nhỏ và mỏng."
center: "Giữa"
centerDescription: "Hiển thị nội dung căn giữa."
inlineCode: "Mã (Trong dòng)"
inlineCodeDescription: "Hiển thị tô sáng cú pháp trong dòng cho mã (chương trình)."
blockCode: "Mã (Khối)"
blockCodeDescription: "Hiển thị tô sáng cú pháp cho mã nhiều dòng (chương trình) trong một khối."
inlineMath: "Toán học (Trong dòng)"
inlineMathDescription: "Hiển thị công thức toán (KaTeX) trong dòng"
blockMath: "Toán học (Khối)"
blockMathDescription: "Hiển thị công thức toán học nhiều dòng (KaTeX) trong một khối"
quote: "Trích dẫn"
quoteDescription: "Hiển thị nội dung dạng lời trích dạng."
emoji: "Tùy chỉnh emoji"
emojiDescription: "Hiển thị emoji với cú pháp :tên emoji:"
search: "Tìm kiếm"
searchDescription: "Hiển thị hộp tìm kiếm với văn bản được nhập trước."
flip: "Lật"
flipDescription: "Lật nội dung theo chiều ngang hoặc chiều dọc."
jelly: "Chuyển động (Thạch rau câu)"
jellyDescription: "Cho phép nội dung chuyển động giống như thạch rau câu."
tada: "Chuyển động (Tada)"
tadaDescription: "Cho phép nội dung chuyển động kiểu \"Tada!\"."
jump: "Chuyển động (Nhảy múa)"
jumpDescription: "Cho phép nội dung chuyển động nhảy nhót."
bounce: "Chuyển động (Cà tưng)"
bounceDescription: "Cho phép nội dung chuyển động cà tưng."
shake: "Chuyển động (Rung)"
shakeDescription: "Cho phép nội dung chuyển động rung lắc."
twitch: "Chuyển động (Co rút)"
twitchDescription: "Cho phép nội dung chuyển động co rút."
spin: "Chuyển động (Xoay tít)"
spinDescription: "Cho phép nội dung chuyển động xoay tít."
x2: "Lớn"
x2Description: "Hiển thị nội dung cỡ lớn hơn."
x3: "Rất lớn"
x3Description: "Hiển thị nội dung cỡ lớn hơn nữa."
x4: "Khổng lồ"
x4Description: "Hiển thị nội dung cỡ khổng lồ."
blur: "Làm mờ"
blurDescription: "Làm mờ nội dung. Nó sẽ được hiển thị rõ ràng khi di chuột qua."
font: "Phông chữ"
fontDescription: "Chọn phông chữ để hiển thị nội dung."
rainbow: "Cầu vồng"
rainbowDescription: "Làm cho nội dung hiển thị với màu sắc cầu vồng."
sparkle: "Lấp lánh"
sparkleDescription: "Làm cho nội dung hiệu ứng hạt lấp lánh."
rotate: "Xoay"
rotateDescription: "Xoay nội dung theo một góc cụ thể."
plain: "Đơn giản"
plainDescription: "Vô hiệu hóa mọi hiệu ứng MFM chứa trong hiệu ứng MFM này."
_instanceTicker:
none: "Không hiển thị"
remote: "Hiện cho người dùng từ máy chủ khác"
@@ -1519,5 +1453,6 @@ _deck:
tl: "Bảng tin"
antenna: "Trạm phát sóng"
list: "Danh sách"
channel: "Kênh"
mentions: "Lượt nhắc"
direct: "Nhắn riêng"

View File

@@ -110,6 +110,7 @@ clickToShow: "点击以显示"
sensitive: "敏感内容"
add: "添加"
reaction: "回应"
reactions: "回应"
reactionSetting: "在选择器中显示的回应"
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
rememberNoteVisibility: "保存上次设置的可见性"
@@ -128,6 +129,7 @@ unblockConfirm: "确定要解除拉黑吗?"
suspendConfirm: "要冻结吗?"
unsuspendConfirm: "要解除冻结吗?"
selectList: "选择列表"
selectChannel: "选择频道"
selectAntenna: "选择天线"
selectWidget: "选择小工具"
editWidgets: "编辑部件"
@@ -255,6 +257,8 @@ noMoreHistory: "没有更多的历史记录"
startMessaging: "添加聊天"
nUsersRead: "{n}人已读"
agreeTo: "勾选则表示已阅读并同意{0}"
agreeBelow: "同意以下观点"
basicNotesBeforeCreateAccount: "基本注意事项"
tos: "服务条款"
start: "开始"
home: "首页"
@@ -463,7 +467,6 @@ youHaveNoGroups: "没有群组"
joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。"
noHistory: "没有历史记录"
signinHistory: "登录历史"
disableAnimatedMfm: "禁用MFM动画"
doing: "正在进行"
category: "类别"
tags: "标签"
@@ -607,7 +610,7 @@ wordMute: "文字屏蔽"
regexpError: "正则表达式错误"
regexpErrorDescription: "{tab} 屏蔽文字的第 {line} 行的正则表达式有错误:"
instanceMute: "实例的屏蔽"
userSaysSomething: "{name}说了什么,但是被屏蔽了"
userSaysSomething: "{name}说了什么,但是被屏蔽词过滤了"
makeActive: "启用"
display: "显示"
copy: "复制"
@@ -826,7 +829,7 @@ makeReactionsPublicDescription: "将您发表过的回应设置成公开可见
classic: "经典"
muteThread: "屏蔽帖子列表"
unmuteThread: "取消屏蔽帖子列表"
ffVisibility: "连接的可见范围"
ffVisibility: "关注关系的可见范围"
ffVisibilityDescription: "您可以设置您的关注/关注者信息的公开范围"
continueThread: "查看更多帖子"
deleteAccountConfirm: "将要删除账户。是否确认?"
@@ -860,6 +863,8 @@ failedToFetchAccountInformation: "获取账户信息失败"
rateLimitExceeded: "已超過速率限制"
cropImage: "剪裁图像"
cropImageAsk: "是否要裁剪图像?"
cropYes: "已裁剪"
cropNo: "就这样吧!"
file: "文件"
recentNHours: "最近{n}小时"
recentNDays: "最近{n}天"
@@ -937,6 +942,245 @@ cannotPerformTemporary: "暂时不可用"
cannotPerformTemporaryDescription: "因操作过于频繁,暂时不可用,请稍后再试。"
preset: "預設值"
selectFromPresets: "從預設值中選擇"
achievements: "成就"
gotInvalidResponseError: "服务器无应答"
gotInvalidResponseErrorDescription: "您的网络连接可能出现了问题, 或是远程服务器暂时不可用. 请稍后重试。"
_achievements:
earnedAt: "达成时间"
_types:
_notes1:
title: "初来乍到"
description: "第一次发帖"
flavor: "祝您在Misskey玩的愉快"
_notes10:
title: "一些帖子"
description: "发布了10篇帖子"
_notes100:
title: "很多帖子"
description: "发布了100篇帖子"
_notes500:
title: "满是帖子"
description: "发布了500篇帖子"
_notes1000:
title: "积帖成山"
description: "发布了1,000篇帖子"
_notes5000:
title: "帖如泉涌"
description: "发布了5,000篇帖子"
_notes10000:
title: "超级帖"
description: "发布了10,000篇帖子"
_notes20000:
title: "还想要更多帖子"
description: "发布了20,000篇帖子"
_notes30000:
title: "帖子帖子帖子"
description: "发布了30,000篇帖子"
_notes40000:
title: "帖子工厂"
description: "发布了40,000篇帖子"
_notes50000:
title: "帖子星球"
description: "发布了50,000篇帖子"
_notes60000:
title: "帖子类星体"
description: "发布了60,000篇帖子"
_notes70000:
title: "帖子黑洞"
description: "发布了70,000篇帖子"
_notes80000:
title: "帖子星系"
description: "发布了80,000篇帖子"
_notes90000:
title: "帖子起源"
description: "发布了90,000篇帖子"
_notes100000:
title: "ALL YOUR NOTE ARE BELONG TO US"
description: "发布了100,000篇帖子"
flavor: "真的有那么多可以写的东西吗?"
_login3:
title: "初学者 I"
description: "连续登录3天"
flavor: "今天开始我就是Misskist"
_login7:
title: "初学者 II"
description: "连续登录7天"
flavor: "您开始习惯了吗?"
_login15:
title: "初学者 III"
description: "连续登录15天"
_login30:
title: "Misskist "
description: "连续登录30天"
_login60:
title: "Misskist Ⅱ"
description: "连续登录60天"
_login100:
title: "Misskist Ⅲ"
description: "总登入100天"
flavor: "那个用户是Misskist喔"
_login200:
title: "定期联系Ⅰ"
description: "总登录天数200天"
_login300:
title: "定期联系Ⅱ"
description: "总登录天数300天"
_login400:
title: "定期联系Ⅲ"
description: "总登录天数400天"
_login500:
title: "老熟人Ⅰ"
description: "总登录天数500天"
flavor: "诸君,我喜欢贴文"
_login600:
title: "老熟人Ⅱ"
description: "总登录天数600天"
_login700:
title: "老熟人Ⅲ"
description: "总登录天数700天"
_login800:
title: "帖子大师Ⅰ"
description: "总登录天数800天"
_login900:
title: "帖子大师Ⅱ"
description: "总登录天数900天"
_login1000:
title: "帖子大师Ⅲ"
description: "总登录天数1000天"
flavor: "感谢您使用Misskey"
_noteClipped1:
title: "忍不住要收藏到便签"
description: "第一次将贴文贴进便签"
_noteFavorited1:
title: "观星者"
description: "第一次将帖子加入收藏"
_myNoteFavorited1:
title: "想要星星"
description: "自己的帖子被其他人加入收藏了"
_profileFilled:
title: "整装待发"
description: "设置了个人资料"
_markedAsCat:
title: "我是猫"
description: "将账户设定为一只猫"
flavor: "还没有名字"
_following1:
title: "首次关注"
description: "第一次关注别人"
_following10:
title: "关注,跟随"
description: "关注超过10人"
_following50:
title: "我的朋友很多"
description: "关注超过50人"
_following100:
title: "我的朋友很多"
description: "关注超过100人"
_following300:
title: "朋友成群"
description: "关注数超过300"
_followers1:
title: "最初的关注者"
description: "第一次被关注"
_followers10:
title: "关注我吧!"
description: "拥有超过10名关注者"
_followers50:
title: "三五成群"
description: "拥有超过50名关注者"
_followers100:
title: "胜友如云"
description: "拥有超过100名关注者"
_followers300:
title: "排列成行"
description: "拥有超过300名关注者"
_followers500:
title: "信号塔"
description: "拥有超过500名关注者"
_followers1000:
title: "大影响家"
description: "拥有超过1000名关注者"
_collectAchievements30:
title: "成就收藏家"
description: "获得超过30个成就"
_viewAchievements3min:
title: "成就爱好者"
description: "盯着成就看三分钟"
_iLoveMisskey:
title: "I Love Misskey"
description: "发布\"I ❤ #Misskey\"帖子"
flavor: "感谢您使用 Misskey by 开发团队"
_foundTreasure:
title: "寻宝"
description: "发现了隐藏的宝藏"
_client30min:
title: "休息一下!"
description: "启动客户端超过30分钟"
_noteDeletedWithin1min:
title: "无话可说"
description: "发帖后一分钟内就将其删除"
_postedAtLateNight:
title: "夜猫子"
description: "深夜发布帖子"
flavor: "差不多该去睡了喔。"
_postedAt0min0sec:
title: "报时"
description: "在0点发布一篇帖子"
flavor: "嘣 嘣 嘣 Biu——"
_selfQuote:
title: "自我引用"
description: "引用了自己的帖子"
_htl20npm:
title: "流动的时间线"
description: "在首页时间线的流速超过20npm"
_viewInstanceChart:
title: "分析师"
description: "查看了实例信息中的图表"
_outputHelloWorldOnScratchpad:
title: "Hello, world!"
description: "在AiScript控制台中输出 hello world"
_open3windows:
title: "多窗口"
description: "打开了三个或更多的窗口"
_driveFolderCircularReference:
title: "循环引用"
description: "试图对网盘中的文件夹进行循环嵌套"
_reactWithoutRead:
title: "有好好读过吗?"
description: "在含有100字以上的帖子被发出三秒内做出回应"
_clickedClickHere:
title: "点这里"
description: "点了这里"
_justPlainLucky:
title: "超高校级的幸运"
description: "每10秒有0.01的概率自动获得"
_setNameToSyuilo:
title: "像神一样呐"
description: "将名称设定为syuilo"
_passedSinceAccountCreated1:
title: "一周年"
description: "账户创建时间超过1年"
_passedSinceAccountCreated2:
title: "二周年"
description: "账户创建时间超过2年"
_passedSinceAccountCreated3:
title: "三周年"
description: "账户创建时间超过3年"
_loggedInOnBirthday:
title: "生日快乐"
description: "在生日当天登录"
_loggedInOnNewYearsDay:
title: "恭贺新禧"
description: "在元旦登入"
flavor: "今年也请对本实例多多指教!"
_cookieClicked:
title: "点击饼干小游戏"
description: "点击了可疑的饼干"
flavor: "是不是软件有问题?"
_brainDiver:
title: "Brain Diver"
description: "发布了包含Brain Diver链接的帖子"
flavor: "Misskey-Misskey La-Tu-Ma"
_role:
new: "创建角色"
edit: "编辑角色"
@@ -957,6 +1201,9 @@ _role:
baseRole: "基本角色"
useBaseValue: "使用基本角色的值"
chooseRoleToAssign: "选择要分配的角色"
iconUrl: "图标URL"
asBadge: "作为徽章显示"
descriptionOfAsBadge: "开启后,用户名旁边将会出现角色图标。"
canEditMembersByModerator: "允许监察者编辑成员"
descriptionOfCanEditMembersByModerator: "如果选中,监察者和管理员都能够为用户分配/取消分配角色。如果未选中,则只有管理员可以执行此操作。"
priority: "优先级"
@@ -981,6 +1228,7 @@ _role:
userEachUserListsMax: "单个用户列表内用户数量限制"
rateLimitFactor: "速率限制"
descriptionOfRateLimitFactor: "值越小限制越少,值越大限制越多。"
canHideAds: "可以隐藏广告"
_condition:
isLocal: "是本地用户"
isRemote: "是远程用户"
@@ -1008,7 +1256,7 @@ _emailUnavailable:
mx: "邮件服务器不正确"
smtp: "邮件服务器没有响应"
_ffVisibility:
public: "发布"
public: "公开"
followers: "只有关注你的用户能看到"
private: "私密"
_signup:
@@ -1081,72 +1329,6 @@ _nsfw:
respect: "隐藏敏感内容"
ignore: "不隐藏敏感内容"
force: "总是隐藏内容"
_mfm:
cheatSheet: "MFM代码速查表"
intro: "MFM是一种在Misskey中的各个位置使用的专用标记语言。在这里您可以看到MFM中可用的语法列表。"
dummy: "通过Misskey扩展联邦宇宙的世界"
mention: "提及"
mentionDescription: "可以使用 @+用户名 来指示特定用户"
hashtag: "话题标签"
hashtagDescription: "可以使用井号+文字来表示话题标签。"
url: "URL"
urlDescription: "可以表示URL地址。"
link: "链接"
linkDescription: "可以将部分文字和URL关联起来。"
bold: "粗体"
boldDescription: "可以将文字显示为粗体来表示强调。"
small: "缩小"
smallDescription: "可以使内容文字变小、变淡。"
center: "居中"
centerDescription: "可以将内容居中显示。"
inlineCode: "代码(内嵌)"
inlineCodeDescription: "将文字中的程序代码语法高亮显示。"
blockCode: "代码(块)"
blockCodeDescription: "语法高亮显示整块程序代码。"
inlineMath: "数学公式(内嵌)"
inlineMathDescription: "显示内嵌的KaTex公式。"
blockMath: "数学公式(块)"
blockMathDescription: "显示整块的多行KaTex数学公式。"
quote: "引用"
quoteDescription: "可以用来表示引用的内容。"
emoji: "自定义表情符号"
emojiDescription: "可以将自定义表情符号使用冒号括起来,就可以显示自定义表情符号了。"
search: "搜索"
searchDescription: "显示含有搜索内容示例的搜索框。"
flip: "翻转"
flipDescription: "将内容上下或左右翻转。"
jelly: "动画(果冻)"
jellyDescription: "显示果冻一样的动画效果。"
tada: "动画(锵锵)"
tadaDescription: "显示\"锵锵!\"的动画效果。"
jump: "动画(跳动)"
jumpDescription: "显示跳动的动画效果。"
bounce: "动画(弹性)"
bounceDescription: "显示弹性一样的动画效果。"
shake: "动画(摇晃)"
shakeDescription: "显示摇晃的动画效果。"
twitch: "动画(颤抖)"
twitchDescription: "显示强烈颤抖的动画效果。"
spin: "动画(旋转)"
spinDescription: "显示旋转的动画效果。"
x2: "大"
x2Description: "以大尺寸显示内容。"
x3: "非常大"
x3Description: "以更大尺寸显示内容。"
x4: "最大"
x4Description: "以最大尺寸显示内容。"
blur: "模糊"
blurDescription: "产生模糊效果。将鼠标指针放在上面即可将内容显示出来。"
font: "字体"
fontDescription: "可以设置内容所使用的字体。"
rainbow: "彩虹"
rainbowDescription: "用彩虹色来显示内容。"
sparkle: "闪光"
sparkleDescription: "添加发光粒子效果。"
rotate: "旋转"
rotateDescription: "旋转指定的角度。"
plain: "简洁"
plainDescription: "禁用所有内部语法。"
_instanceTicker:
none: "不显示"
remote: "仅远程用户"
@@ -1351,12 +1533,15 @@ _permissions:
"read:gallery-likes": "读取喜欢的图片"
"write:gallery-likes": "操作喜欢的图片"
_auth:
shareAccessTitle: "应用程序授权许可"
shareAccess: "您要授权允许“{name}”访问您的帐户吗?"
shareAccessAsk: "您确定要授权此应用程序访问您的帐户吗?"
permission: "{name}需要以下权限"
permissionAsk: "这个应用程序需要以下权限"
pleaseGoBack: "请返回到应用程序"
callback: "回到应用程序"
denied: "拒绝访问"
pleaseLogin: "在对应用进行授权许可之前,请先登录"
_antennaSources:
all: "所有帖子"
homeTimeline: "已关注用户的帖子"
@@ -1454,7 +1639,7 @@ _profile:
name: "昵称"
username: "用户名"
description: "个人简介"
youCanIncludeHashtags: "可以包含一个哈希标签。"
youCanIncludeHashtags: "可以在个人简介中包含一个#标签。"
metadata: "附加信息"
metadataEdit: "附加信息编辑"
metadataDescription: "最多可以在个人资料中以表格形式显示四条其他信息。"
@@ -1585,6 +1770,7 @@ _notification:
pollEnded: "问卷调查结果已生成。"
unreadAntennaNote: "天线 {name}"
emptyPushNotificationMessage: "推送通知已更新"
achievementEarned: "获得成就"
_types:
all: "全部"
follow: "关注中"
@@ -1626,5 +1812,6 @@ _deck:
tl: "时间线"
antenna: "天线"
list: "列表"
channel: "频道"
mentions: "提及"
direct: "指定用户"

View File

@@ -110,6 +110,7 @@ clickToShow: "按一下以顯示"
sensitive: "敏感內容"
add: "新增"
reaction: "情感"
reactions: "情感"
reactionSetting: "在選擇器中顯示反應"
reactionSettingDescription2: "拖動以重新列序,點擊以刪除,按下 + 添加。"
rememberNoteVisibility: "記住貼文可見性"
@@ -128,6 +129,7 @@ unblockConfirm: "確定解除封鎖此用戶?"
suspendConfirm: "確定凍結此帳號?"
unsuspendConfirm: "確定解凍此帳號?"
selectList: "選擇清單"
selectChannel: "選擇頻道"
selectAntenna: "選擇天線"
selectWidget: "選擇小工具"
editWidgets: "編輯小工具"
@@ -239,7 +241,7 @@ removeAreYouSure: "確定要刪掉「{x}」嗎?"
deleteAreYouSure: "確定要刪掉「{x}」嗎?"
resetAreYouSure: "確定要重設嗎?"
saved: "已儲存"
messaging: "傳送訊息"
messaging: "聊天"
upload: "上傳"
keepOriginalUploading: "保留原圖"
keepOriginalUploadingDescription: "上傳圖片時保留原始圖片。關閉時瀏覽器會在上傳時生成一張用於web發布的圖片。"
@@ -255,6 +257,8 @@ noMoreHistory: "沒有更多歷史紀錄"
startMessaging: "開始聊天"
nUsersRead: "{n}人已讀"
agreeTo: "我同意{0}"
agreeBelow: "同意以下內容"
basicNotesBeforeCreateAccount: "基本注意事項"
tos: "使用條款"
start: "開始"
home: "首頁"
@@ -325,15 +329,15 @@ connectService: "己連結"
disconnectService: "己斷開 "
enableLocalTimeline: "開啟本地時間軸"
enableGlobalTimeline: "啟用全域時間軸"
disablingTimelinesInfo: "為了方便,即使您關閉了時間線功能,管理員和審員仍可以繼續使用。"
disablingTimelinesInfo: "為了方便,即使您關閉了時間線功能,管理員和審員仍可以繼續使用。"
registration: "註冊"
enableRegistration: "開啟新使用者註冊"
invite: "邀請"
driveCapacityPerLocalAccount: "每個本地用戶的雲端空間大小"
driveCapacityPerRemoteAccount: "每個非本地用戶的雲端容量"
driveCapacityPerRemoteAccount: "每個非本地用戶的雲端空間大小"
inMb: "以Mbps為單位"
iconUrl: "圖URL"
bannerUrl: "橫幅圖URL"
iconUrl: "圖URL"
bannerUrl: "橫幅圖URL"
backgroundImageUrl: "背景圖片的來源網址 "
basicInfo: "基本資訊"
pinnedUsers: "置頂用戶"
@@ -372,8 +376,8 @@ connectedTo: "您的帳戶已連接到以下社交帳戶"
notesAndReplies: "貼文與回覆"
withFiles: "附件"
silence: "禁言"
silenceConfirm: "確定要禁言此用戶嗎?"
unsilence: "解除禁言"
silenceConfirm: "確定要靜音此使用者嗎?"
unsilence: "解除靜音"
unsilenceConfirm: "確定要解除禁言嗎?"
popularUsers: "熱門使用者"
recentlyUpdatedUsers: "最近發文的使用者"
@@ -382,14 +386,14 @@ recentlyDiscoveredUsers: "最近發現的使用者"
exploreUsersCount: "有{count}個使用者"
exploreFediverse: "探索聯邦世界"
popularTags: "熱門標籤"
userList: "清單"
about: "資訊"
userList: "使用者清單"
about: "關於"
aboutMisskey: "關於 Misskey"
administrator: "管理員"
token: "權杖"
twoStepAuthentication: "兩階段驗證"
moderator: "監察員"
moderation: "言論調節"
moderator: "審查員"
moderation: "審查"
nUsersMentioned: "提到了{n}"
securityKey: "安全金鑰"
securityKeyName: "金鑰名稱"
@@ -420,7 +424,7 @@ invites: "邀請"
groupName: "群組名稱"
members: "成員"
transfer: "轉讓"
messagingWithUser: "傳送訊息給其他使用者"
messagingWithUser: "其他使用者聊天"
messagingWithGroup: "發送訊息至群組"
title: "標題"
text: "文字"
@@ -463,7 +467,6 @@ youHaveNoGroups: "找不到群組"
joinOrCreateGroup: "請加入現有群組,或創建新群組。"
noHistory: "沒有歷史紀錄"
signinHistory: "登入歷史"
disableAnimatedMfm: "禁用MFM動畫"
doing: "正在進行"
category: "類別"
tags: "標籤"
@@ -472,7 +475,7 @@ createAccount: "建立帳戶"
existingAccount: "現有帳戶"
regenerate: "再生"
fontSize: "字體大小"
noFollowRequests: "沒有要求跟隨您的請"
noFollowRequests: "沒有跟隨您的請"
openImageInNewTab: "於新分頁中開啟圖片"
dashboard: "儀表板"
local: "本地"
@@ -529,8 +532,8 @@ installedDate: "安裝時間"
lastUsedDate: "最後上線日期"
state: "狀態"
sort: "排序"
ascendingOrder: "昇冪"
descendingOrder: "降冪"
ascendingOrder: "遞增"
descendingOrder: "遞減"
scratchpad: "暫存記憶體"
scratchpadDescription: "AiScript控制台為AiScript提供了實驗環境。您可以在此編寫、執行和確認代碼與Misskey互動的结果。"
output: "輸出"
@@ -606,7 +609,7 @@ testEmail: "測試郵件發送"
wordMute: "被靜音的文字"
regexpError: "正規表達式錯誤"
regexpErrorDescription: "{tab} 靜音文字的第 {line} 行的正規表達式有錯誤:"
instanceMute: "實例的靜音"
instanceMute: "被靜音的實例"
userSaysSomething: "{name}說了什麼"
makeActive: "啟用"
display: "檢視"
@@ -860,6 +863,8 @@ failedToFetchAccountInformation: "取得帳戶資訊失敗"
rateLimitExceeded: "已超過速率限制"
cropImage: "圖片裁剪"
cropImageAsk: "要剪裁圖片嗎?"
cropYes: "裁剪"
cropNo: "使用原圖"
file: "檔案"
recentNHours: "過去{n}小時"
recentNDays: "過去{n}天"
@@ -932,15 +937,257 @@ assign: "指派"
unassign: "取消指派"
color: "顏色"
manageCustomEmojis: "管理自訂表情符號"
youCannotCreateAnymore: "您無法再建立更多了。"
cannotPerformTemporary: "暫時無法進行"
cannotPerformTemporaryDescription: "由於超過操作次數限制,暫時無法進行。請過一段時間之後再嘗試。"
preset: "預設值"
selectFromPresets: "從預設值中選擇"
achievements: "成就"
gotInvalidResponseError: "伺服器的回應無效"
gotInvalidResponseErrorDescription: "伺服器可能已關閉或者在維護中,請稍後再試。"
_achievements:
earnedAt: "獲得日期"
_types:
_notes1:
title: "just setting up my msky"
description: "發出了第一則貼文"
flavor: "祝您的Misskey生活愉快"
_notes10:
title: "若干貼文"
description: "發表了10則貼文"
_notes100:
title: "許多貼文"
description: "發表了100則貼文"
_notes500:
title: "滿滿的貼文"
description: "發表了500則貼文"
_notes1000:
title: "堆積如山的貼文"
description: "發表了1000則貼文"
_notes5000:
title: "滔滔不絕的貼文"
description: "發表了5000則貼文"
_notes10000:
title: "超級貼文"
description: "發表了10000則貼文"
_notes20000:
title: "需要更多的貼文"
description: "發表了20000則貼文"
_notes30000:
title: "貼文貼文貼文"
description: "發表了30000則貼文"
_notes40000:
title: "貼文工廠"
description: "發表了40000則貼文"
_notes50000:
title: "貼文星球"
description: "發表了50000則貼文"
_notes60000:
title: "貼文類星體"
description: "發表了60000則貼文"
_notes70000:
title: "貼文黑洞"
description: "發表了70000則貼文"
_notes80000:
title: "貼文銀河"
description: "發表了80000則貼文"
_notes90000:
title: "貼文宇宙"
description: "發表了90000則貼文"
_notes100000:
title: "ALL YOUR NOTE ARE BELONG TO US"
description: "發表了100,000則貼文"
flavor: "有這麼多東西要寫嗎?"
_login3:
title: "初學者Ⅰ"
description: "總登入天數為3天"
flavor: "從今天開始我就是Misskist"
_login7:
title: "初學者ⅠⅠ"
description: "總登入天數為7天"
flavor: "您開始習慣了嗎?"
_login15:
title: "初學者ⅠⅠⅠ"
description: "總登入天數為15天"
_login30:
title: "Misskist "
description: "總登入天數為30天"
_login60:
title: "Misskist "
description: "總登入天數為60天"
_login100:
title: "Misskist "
description: "總登入天數為100天"
flavor: "辣個 Misskist 用戶"
_login200:
title: "普通Ⅰ"
description: "總登入天數為200天"
_login300:
title: "普通I"
description: "總登入天數為300天"
_login400:
title: "普通II"
description: "總登入天數為400天"
_login500:
title: "老兵Ⅰ"
description: "總登入天數為500天"
flavor: "諸君,我喜歡貼文"
_login600:
title: "老兵ⅠⅠ"
description: "總登入天數為600天"
_login700:
title: "老兵ⅠⅠⅠ"
description: "總登入天數為700天"
_login800:
title: "貼文大師Ⅰ"
description: "總登入天數為800天"
_login900:
title: "貼文大師ⅠⅠ"
description: "總登入天數為900天"
_login1000:
title: "貼文大師ⅠⅠⅠ"
description: "總登入天數為1,000天"
flavor: "感謝您使用Misskey"
_noteClipped1:
title: "忍不住要收進摘錄裡"
description: "第一次將貼文收進摘錄"
_noteFavorited1:
title: "觀星者"
description: "第一次將貼文收藏至我的最愛"
_myNoteFavorited1:
title: "想要星星"
description: "自己的貼文被他人收藏至「我的最愛」了"
_profileFilled:
title: "有備而來"
description: "設定了個人檔案"
_markedAsCat:
title: "我是貓"
description: "已將帳戶設定為貓"
flavor: "還沒有名字。"
_following1:
title: "首次追隨"
description: "首次追隨了"
_following10:
title: "跟著跟著"
description: "跟隨超過10人了"
_following50:
title: "朋友很多"
description: "跟隨超過50人了"
_following100:
title: "100位朋友"
description: "跟隨超過100人了"
_following300:
title: "朋友過多"
description: "跟隨超過300人了"
_followers1:
title: "第一個追隨者"
description: "第一次被追隨"
_followers10:
title: "Follow me!"
description: "跟隨者超過10人了"
_followers50:
title: "成群結隊"
description: "跟隨者超過50人了"
_followers100:
title: "紅人"
description: "跟隨者超過100人了"
_followers300:
title: "請排成一排"
description: "跟隨者超過300人了"
_followers500:
title: "基地台"
description: "超過500名追隨者了"
_followers1000:
title: "影響者"
description: "超過1000名追隨者了"
_collectAchievements30:
title: "成就收藏家"
description: "獲得30個以上的成就"
_viewAchievements3min:
title: "喜愛成就"
description: "看成就列表要花3分鐘以上"
_iLoveMisskey:
title: "I Love Misskey"
description: "發布「I ❤ #Misskey」"
flavor: "感謝您使用Misskey by 開發團隊"
_foundTreasure:
title: "尋寶"
description: "發現了隱藏的寶藏"
_client30min:
title: "休息一下"
description: "用戶端啟動已超過30分鐘"
_noteDeletedWithin1min:
title: "現在沒有了"
description: "發文後1分鐘內刪文"
_postedAtLateNight:
title: "夜行性"
description: "在深夜發佈貼文"
flavor: "該去睡覺了。"
_postedAt0min0sec:
title: "報時"
description: "在0分0秒發佈貼文"
flavor: "啵.啵.啵.嗶ー"
_selfQuote:
title: "自我引用"
description: "引用了自己的貼文"
_htl20npm:
title: "流動的TL"
description: "在首頁時間軸的流速超過20npm"
_viewInstanceChart:
title: "分析師"
description: "顯示了實例的圖表"
_outputHelloWorldOnScratchpad:
title: "Hello world!"
description: "在暫存記憶體輸出了 hello world"
_open3windows:
title: "多重視窗"
description: "開啟了3個以上的視窗"
_driveFolderCircularReference:
title: "循環引用"
description: "試圖遞迴套入雲端硬碟資料夾"
_reactWithoutRead:
title: "有好好讀過嗎?"
description: "對包含100字以上內容的貼文做出情感反應"
_clickedClickHere:
title: "點擊這裡"
description: "已點擊這裡了"
_justPlainLucky:
title: "只是運氣好"
description: "每10秒有0.01%的機率獲得"
_setNameToSyuilo:
title: "神的情結"
description: "將名稱設定為 syuilo"
_passedSinceAccountCreated1:
title: "一周年"
description: "自建立帳戶開始過了1年"
_passedSinceAccountCreated2:
title: "二周年"
description: "自建立帳戶開始過了2年"
_passedSinceAccountCreated3:
title: "三周年"
description: "自建立帳戶開始過了3年"
_loggedInOnBirthday:
title: "生日快樂"
description: "在生日當天登入了"
_loggedInOnNewYearsDay:
title: "新年快樂"
description: "在元旦當天登入了"
flavor: "今年也請對敝實例多多指教"
_cookieClicked:
title: "點擊餅乾的遊戲"
description: "點擊了餅乾"
flavor: "是不是軟體有問題?"
_brainDiver:
title: "Brain Driver"
description: "發佈了Brain Driver的連結"
flavor: "Misskey-Misskey La-Tu-Ma"
_role:
new: "建立角色"
edit: "編輯角色"
name: "角色名稱"
description: "角色描述 "
permission: "角色的權限"
descriptionOfPermission: "<b>審員</b>執行與審相關的基本操作。\n<b>管理員</b>能變更實例的全部設定"
descriptionOfPermission: "<b>審員</b>執行與審相關的基本操作。\n<b>管理員</b>能變更實例的全部設定"
assignTarget: "指派目標"
descriptionOfAssignTarget: "<b>手動</b>是以手動管理這個角色包含的人員。\n<b>符合條件</b>是設定條件以自動包含符合條件的使用者。"
manual: "手動"
@@ -954,8 +1201,11 @@ _role:
baseRole: "基本角色"
useBaseValue: "使用基本角色的值"
chooseRoleToAssign: "選擇要指派的角色"
canEditMembersByModerator: "允許編輯監察員的成員"
descriptionOfCanEditMembersByModerator: "如果開啟,管理員與監察員都可以為使用者指派/解除指派該角色。如果關閉,則只有管理員可以執行。"
iconUrl: "圖示的URL"
asBadge: "顯示為徽章"
descriptionOfAsBadge: "開啟的話,角色圖示會顯示在用戶名旁邊。"
canEditMembersByModerator: "允許編輯審查員的成員"
descriptionOfCanEditMembersByModerator: "如果開啟,管理員與審查員都可以為使用者指派/解除指派該角色。如果關閉,則只有管理員可以執行。"
priority: "優先級"
_priority:
low: "低"
@@ -970,8 +1220,15 @@ _role:
driveCapacity: "雲端硬碟容量"
pinMax: "置頂貼文的最大數量"
antennaMax: "可建立的天線數量"
wordMuteMax: "靜音文字的最大字數"
webhookMax: "可建立的Webhook數量"
clipMax: "可建立的摘錄數量"
noteEachClipsMax: "摘錄內貼文的最大數量"
userListMax: "可建立的使用者清單數量"
userEachUserListsMax: "使用者清單內使用者的最大數量"
rateLimitFactor: "速率限制"
descriptionOfRateLimitFactor: "值越小限制越少,值越大限制越多。"
canHideAds: "不顯示廣告"
_condition:
isLocal: "本地使用者"
isRemote: "遠端使用者"
@@ -985,7 +1242,7 @@ _role:
or: "~或~"
not: "~否"
_sensitiveMediaDetection:
description: "您可以使用機器學習自動檢測敏感媒體並將其用於審。 伺服器的負荷會稍微增加。"
description: "您可以使用機器學習自動檢測敏感媒體並將其用於審。 伺服器的負荷會稍微增加。"
sensitivity: "檢測敏感度"
sensitivityDescription: "敏感度低時,誤檢測(偽陽性)會減少。敏感度高時,漏檢(偽陰性)會減少。"
setSensitiveFlagAutomatically: "設定 NSFW 旗標"
@@ -1072,72 +1329,6 @@ _nsfw:
respect: "隱藏敏感內容"
ignore: "不隱藏敏感內容"
force: "隱藏所有內容"
_mfm:
cheatSheet: "MFM代碼小抄"
intro: "MFM是Misskey專用的標記語言可以在Misskey中的各個位置使用。 您可以這裏看到MFM可用語法列表。"
dummy: "Misskey拓展了Fediverse的世界"
mention: "提及"
mentionDescription: "透過 @+用戶名 來標示特定使用者。"
hashtag: "#tag"
hashtagDescription: "可以使用\"#\"符號後加文字表示話題標籤。"
url: "URL"
urlDescription: "可以展示URL位址。"
link: "鏈接"
linkDescription: "您可以將特定範圍的文章與 URL 相關聯。 "
bold: "粗體"
boldDescription: "可以將文字顯示为粗體来強調。"
small: "縮小"
smallDescription: "可以使內容文字變小、變淡。"
center: "置中"
centerDescription: "可以將內容置中顯示。"
inlineCode: "程式碼(内嵌)"
inlineCodeDescription: "在行內用高亮度顯示,例如程式碼語法。"
blockCode: "程式碼(區塊)"
blockCodeDescription: "在區塊中用高亮度顯示,例如複數行的程式碼語法。"
inlineMath: "數學公式(內嵌)"
inlineMathDescription: "顯示內嵌的KaTex數學公式。"
blockMath: "數學公式(方塊)"
blockMathDescription: "以區塊顯示複數行的KaTex數學式。"
quote: "引用"
quoteDescription: "可以用來表示引用的内容。"
emoji: "自訂表情符號"
emojiDescription: "您可以通過將自定義表情符號名稱括在冒號中來顯示自定義表情符號。 "
search: "搜尋"
searchDescription: "您可以顯示所輸入的搜索框。"
flip: "翻轉"
flipDescription: "將內容上下或左右翻轉。"
jelly: "動畫(果凍)"
jellyDescription: "顯示果凍一樣的動畫效果。"
tada: "動畫(鏘~)"
tadaDescription: "顯示「鏘~!」這種感覺的動畫效果。"
jump: "動畫(跳動)"
jumpDescription: "顯示跳動的動畫效果。"
bounce: "動畫(反彈)"
bounceDescription: "顯示有彈性的動畫效果。"
shake: "動畫(搖晃)"
shakeDescription: "顯示顫抖的動畫效果。"
twitch: "動畫(顫抖)"
twitchDescription: "顯示強烈顫抖的動畫效果。"
spin: "動畫(旋轉)"
spinDescription: "顯示旋轉的動畫效果。"
x2: "大"
x2Description: "放大顯示內容。"
x3: "較大"
x3Description: "放大顯示內容。"
x4: "最大"
x4Description: "將顯示內容放至最大。"
blur: "模糊"
blurDescription: "產生模糊效果。将游標放在上面即可將内容顯示出來。"
font: "字型"
fontDescription: "您可以設定顯示內容的字型"
rainbow: "彩虹"
rainbowDescription: "用彩虹色來顯示內容。"
sparkle: "閃閃發光"
sparkleDescription: "添加閃閃發光的粒子效果。"
rotate: "旋轉"
rotateDescription: "以指定的角度旋轉。"
plain: "簡潔"
plainDescription: "停用全部的內部語法。"
_instanceTicker:
none: "隱藏"
remote: "向遠端使用者顯示"
@@ -1342,12 +1533,15 @@ _permissions:
"read:gallery-likes": "讀取喜歡的圖片"
"write:gallery-likes": "操作喜歡的圖片"
_auth:
shareAccessTitle: "應用程式的存取權限"
shareAccess: "要授權「“{name}”」存取您的帳戶嗎?"
shareAccessAsk: "您確定要授權這個應用程式使用您的帳戶嗎?"
permission: "{name}要求以下的權限"
permissionAsk: "此應用程式需要以下權限"
pleaseGoBack: "請返回至應用程式"
callback: "回到應用程式"
denied: "拒絕訪問"
pleaseLogin: "必須登入以提供應用程式的存取權限。"
_antennaSources:
all: "全部貼文"
homeTimeline: "來自已追隨使用者的貼文"
@@ -1576,6 +1770,7 @@ _notification:
pollEnded: "問卷調查已產生結果"
unreadAntennaNote: "天線 {name}"
emptyPushNotificationMessage: "推送通知已更新"
achievementEarned: "獲得成就"
_types:
all: "全部 "
follow: "追隨中"
@@ -1617,5 +1812,6 @@ _deck:
tl: "時間軸"
antenna: "天線"
list: "清單"
channel: "頻道"
mentions: "提及"
direct: "指定使用者"

View File

@@ -1,12 +1,12 @@
{
"name": "misskey",
"version": "13.0.0",
"version": "13.6.0",
"codename": "nasubi",
"repository": {
"type": "git",
"url": "https://github.com/misskey-dev/misskey.git"
},
"packageManager": "pnpm@7.24.3",
"packageManager": "pnpm@7.27.0",
"workspaces": [
"packages/frontend",
"packages/backend",
@@ -19,7 +19,7 @@
"start": "cd packages/backend && node ./built/boot/index.js",
"start:test": "cd packages/backend && cross-env NODE_ENV=test node ./built/boot/index.js",
"init": "pnpm migrate",
"migrate": "cd packages/backend && pnpm typeorm migration:run -d ormconfig.js",
"migrate": "cd packages/backend && pnpm migrate",
"migrateandstart": "pnpm migrate && pnpm start",
"gulp": "pnpm exec gulp build",
"watch": "pnpm dev",
@@ -28,8 +28,8 @@
"cy:open": "pnpm cypress open --browser --e2e --config-file=cypress.config.ts",
"cy:run": "pnpm cypress run",
"e2e": "pnpm start-server-and-test start:test http://localhost:61812 cy:run",
"jest": "cd packages/backend && pnpm cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --forceExit --runInBand",
"jest-and-coverage": "cd packages/backend && pnpm cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --coverage --forceExit --runInBand",
"jest": "cd packages/backend && pnpm jest",
"jest-and-coverage": "cd packages/backend && pnpm jest-and-coverage",
"test": "pnpm jest",
"test-and-coverage": "pnpm jest-and-coverage",
"format": "pnpm exec gulp format",
@@ -38,8 +38,8 @@
"cleanall": "pnpm clean-all"
},
"resolutions": {
"chokidar": "^3.3.1",
"lodash": "^4.17.21"
"chokidar": "3.5.3",
"lodash": "4.17.21"
},
"dependencies": {
"execa": "5.1.1",
@@ -49,19 +49,19 @@
"gulp-replace": "1.1.4",
"gulp-terser": "2.1.0",
"js-yaml": "4.1.0",
"typescript": "4.9.4"
"typescript": "4.9.5"
},
"devDependencies": {
"@types/gulp": "4.0.10",
"@types/gulp-rename": "2.0.1",
"@typescript-eslint/eslint-plugin": "5.48.1",
"@typescript-eslint/parser": "5.48.1",
"@typescript-eslint/eslint-plugin": "5.51.0",
"@typescript-eslint/parser": "5.51.0",
"cross-env": "7.0.3",
"cypress": "12.3.0",
"eslint": "^8.31.0",
"start-server-and-test": "1.15.2"
"cypress": "12.5.1",
"eslint": "8.33.0",
"start-server-and-test": "1.15.3"
},
"optionalDependencies": {
"@tensorflow/tfjs-core": "^4.2.0"
"@tensorflow/tfjs-core": "4.2.0"
}
}

View File

@@ -9,7 +9,17 @@
"transform": {
"legacyDecorator": true,
"decoratorMetadata": true
}
},
"experimental": {
"keepImportAssertions": true
},
"baseUrl": ".",
"paths": {
"@/*": [
"./src/*"
]
},
"target": "es2021"
},
"minify": false
}

View File

@@ -0,0 +1,11 @@
export class flashScriptLength1674086433654 {
name = 'flashScriptLength1674086433654'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "flash" ALTER COLUMN "script" TYPE character varying(32768)`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "flash" ALTER COLUMN "script" TYPE character varying(16384)`);
}
}

View File

@@ -0,0 +1,33 @@
export class achievement1674118260469 {
name = 'achievement1674118260469'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "notification" ADD "achievement" character varying(128)`);
await queryRunner.query(`ALTER TABLE "user_profile" ADD "achievements" jsonb NOT NULL DEFAULT '[]'`);
await queryRunner.query(`ALTER TYPE "public"."notification_type_enum" RENAME TO "notification_type_enum_old"`);
await queryRunner.query(`CREATE TYPE "public"."notification_type_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'achievementEarned', 'app')`);
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "public"."notification_type_enum" USING "type"::"text"::"public"."notification_type_enum"`);
await queryRunner.query(`DROP TYPE "public"."notification_type_enum_old"`);
await queryRunner.query(`ALTER TYPE "public"."user_profile_mutingnotificationtypes_enum" RENAME TO "user_profile_mutingnotificationtypes_enum_old"`);
await queryRunner.query(`CREATE TYPE "public"."user_profile_mutingnotificationtypes_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'achievementEarned', 'app')`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" DROP DEFAULT`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" TYPE "public"."user_profile_mutingnotificationtypes_enum"[] USING "mutingNotificationTypes"::"text"::"public"."user_profile_mutingnotificationtypes_enum"[]`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" SET DEFAULT '{}'`);
await queryRunner.query(`DROP TYPE "public"."user_profile_mutingnotificationtypes_enum_old"`);
}
async down(queryRunner) {
await queryRunner.query(`CREATE TYPE "public"."user_profile_mutingnotificationtypes_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app', 'pollEnded')`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" DROP DEFAULT`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" TYPE "public"."user_profile_mutingnotificationtypes_enum_old"[] USING "mutingNotificationTypes"::"text"::"public"."user_profile_mutingnotificationtypes_enum_old"[]`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" SET DEFAULT '{}'`);
await queryRunner.query(`DROP TYPE "public"."user_profile_mutingnotificationtypes_enum"`);
await queryRunner.query(`ALTER TYPE "public"."user_profile_mutingnotificationtypes_enum_old" RENAME TO "user_profile_mutingnotificationtypes_enum"`);
await queryRunner.query(`CREATE TYPE "public"."notification_type_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`);
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "public"."notification_type_enum_old" USING "type"::"text"::"public"."notification_type_enum_old"`);
await queryRunner.query(`DROP TYPE "public"."notification_type_enum"`);
await queryRunner.query(`ALTER TYPE "public"."notification_type_enum_old" RENAME TO "notification_type_enum"`);
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "achievements"`);
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "achievement"`);
}
}

View File

@@ -0,0 +1,11 @@
export class loggedInDates1674255666603 {
name = 'loggedInDates1674255666603'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "user_profile" ADD "loggedInDates" character varying(32) array NOT NULL DEFAULT '{}'`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "loggedInDates"`);
}
}

View File

@@ -0,0 +1,29 @@
export class cleanup1675404035646 {
name = 'cleanup1675404035646'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableTwitterIntegration"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableGithubIntegration"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableDiscordIntegration"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "twitterConsumerKey"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "twitterConsumerSecret"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "githubClientId"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "githubClientSecret"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "discordClientId"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "discordClientSecret"`);
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "integrations"`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "user_profile" ADD "integrations" jsonb NOT NULL DEFAULT '{}'`);
await queryRunner.query(`ALTER TABLE "meta" ADD "discordClientSecret" character varying(128)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "discordClientId" character varying(128)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "githubClientSecret" character varying(128)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "githubClientId" character varying(128)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "twitterConsumerSecret" character varying(128)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "twitterConsumerKey" character varying(128)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "enableDiscordIntegration" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`ALTER TABLE "meta" ADD "enableGithubIntegration" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`ALTER TABLE "meta" ADD "enableTwitterIntegration" boolean NOT NULL DEFAULT false`);
}
}

View File

@@ -0,0 +1,13 @@
export class roleIconBadge1675557528704 {
name = 'roleIconBadge1675557528704'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "role" ADD "iconUrl" character varying(512)`);
await queryRunner.query(`ALTER TABLE "role" ADD "asBadge" boolean NOT NULL DEFAULT false`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "role" DROP COLUMN "asBadge"`);
await queryRunner.query(`ALTER TABLE "role" DROP COLUMN "iconUrl"`);
}
}

View File

@@ -1,6 +1,6 @@
import { DataSource } from 'typeorm';
import { loadConfig } from './built/config.js';
import { entities } from './built/postgre.js';
import { entities } from './built/postgres.js';
const config = loadConfig();

View File

@@ -7,6 +7,8 @@
"start": "node ./built/index.js",
"start:test": "NODE_ENV=test node ./built/index.js",
"migrate": "pnpm typeorm migration:run -d ormconfig.js",
"build:swc": "swc src -d built -D",
"watch:swc": "swc src -d built -D -w",
"build": "tsc -p tsconfig.json || echo done. && tsc-alias -p tsconfig.json",
"watch": "node watch.mjs",
"lint": "tsc --noEmit && eslint --quiet \"src/**/*.ts\"",
@@ -17,34 +19,34 @@
"test-and-coverage": "pnpm jest-and-coverage"
},
"optionalDependencies": {
"@tensorflow/tfjs": "^4.1.0",
"@tensorflow/tfjs-node": "4.1.0"
"@tensorflow/tfjs": "4.2.0",
"@tensorflow/tfjs-node": "4.2.0"
},
"dependencies": {
"@bull-board/api": "^4.10.2",
"@bull-board/fastify": "^4.10.2",
"@bull-board/ui": "^4.10.2",
"@bull-board/api": "4.11.1",
"@bull-board/fastify": "4.11.1",
"@bull-board/ui": "4.11.1",
"@discordapp/twemoji": "14.0.2",
"@fastify/accepts": "4.1.0",
"@fastify/cookie": "^8.3.0",
"@fastify/cookie": "8.3.0",
"@fastify/cors": "8.2.0",
"@fastify/http-proxy": "^8.4.0",
"@fastify/http-proxy": "8.4.0",
"@fastify/multipart": "7.4.0",
"@fastify/static": "6.6.1",
"@fastify/view": "7.4.0",
"@nestjs/common": "9.2.1",
"@nestjs/core": "9.2.1",
"@nestjs/testing": "9.2.1",
"@fastify/static": "6.8.0",
"@fastify/view": "7.4.1",
"@nestjs/common": "9.3.7",
"@nestjs/core": "9.3.7",
"@nestjs/testing": "9.3.7",
"@peertube/http-signature": "1.7.0",
"@sinonjs/fake-timers": "10.0.2",
"accepts": "^1.3.8",
"accepts": "1.3.8",
"ajv": "8.12.0",
"archiver": "5.3.1",
"autwh": "0.1.0",
"aws-sdk": "2.1295.0",
"bcryptjs": "2.4.3",
"blurhash": "2.0.4",
"bull": "4.10.2",
"bull": "4.10.3",
"cacheable-lookup": "6.1.0",
"cbor": "8.1.0",
"chalk": "5.2.0",
@@ -56,39 +58,39 @@
"date-fns": "2.29.3",
"deep-email-validator": "0.1.21",
"escape-regexp": "0.0.1",
"fastify": "4.11.0",
"fastify": "4.12.0",
"feed": "4.2.2",
"file-type": "18.1.0",
"file-type": "18.2.0",
"fluent-ffmpeg": "2.1.2",
"form-data": "^4.0.0",
"form-data": "4.0.0",
"got": "12.5.3",
"hpagent": "1.2.0",
"ioredis": "4.28.5",
"ip-cidr": "3.0.11",
"ip-cidr": "3.1.0",
"is-svg": "4.3.2",
"js-yaml": "4.1.0",
"jsdom": "21.0.0",
"jsdom": "21.1.0",
"json5": "2.2.3",
"json5-loader": "4.0.1",
"jsonld": "8.1.0",
"jsrsasign": "10.6.1",
"mfm-js": "0.23.3",
"mime-types": "2.1.35",
"misskey-js": "0.0.14",
"misskey-js": "0.0.15",
"ms": "3.0.0-canary.1",
"nested-property": "4.0.0",
"nodemailer": "6.9.0",
"node-fetch": "3.3.0",
"nodemailer": "6.9.1",
"nsfwjs": "2.4.2",
"oauth": "^0.10.0",
"oauth": "0.10.0",
"os-utils": "0.0.14",
"parse5": "7.1.2",
"pg": "8.8.0",
"pg": "8.9.0",
"private-ip": "3.0.0",
"probe-image-size": "7.2.3",
"promise-limit": "2.7.0",
"pug": "3.0.2",
"punycode": "2.2.0",
"pureimage": "0.3.15",
"punycode": "2.3.0",
"pureimage": "0.3.17",
"qrcode": "1.5.1",
"random-seed": "0.3.0",
"ratelimiter": "3.4.1",
@@ -100,25 +102,23 @@
"rss-parser": "3.12.0",
"rxjs": "7.8.0",
"s-age": "1.1.2",
"sanitize-html": "2.8.1",
"seedrandom": "^3.0.5",
"sanitize-html": "2.9.0",
"seedrandom": "3.0.5",
"semver": "7.3.8",
"sharp": "0.31.3",
"speakeasy": "2.0.0",
"strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0",
"summaly": "2.7.0",
"syslog-pro": "git+https://github.com/misskey-dev/SyslogPro#0.2.9-misskey.2",
"systeminformation": "5.17.3",
"tinycolor2": "1.5.2",
"systeminformation": "5.17.8",
"tinycolor2": "1.6.0",
"tmp": "0.2.1",
"tsc-alias": "1.8.2",
"tsconfig-paths": "4.1.2",
"twemoji-parser": "14.0.0",
"typeorm": "0.3.11",
"typescript": "4.9.4",
"typescript": "4.9.5",
"ulid": "2.3.0",
"undici": "^5.15.0",
"unzipper": "0.10.11",
"uuid": "9.0.0",
"vary": "1.1.2",
@@ -128,26 +128,28 @@
"xev": "3.0.2"
},
"devDependencies": {
"@redocly/openapi-core": "1.0.0-beta.120",
"@swc/core": "1.3.26",
"@jest/globals": "29.4.2",
"@redocly/openapi-core": "1.0.0-beta.123",
"@swc/cli": "0.1.61",
"@swc/core": "1.3.34",
"@swc/jest": "0.2.24",
"@types/accepts": "1.3.5",
"@types/archiver": "5.3.1",
"@types/bcryptjs": "2.4.2",
"@types/bull": "4.10.0",
"@types/cbor": "6.0.0",
"@types/color-convert": "^2.0.0",
"@types/content-disposition": "^0.5.5",
"@types/color-convert": "2.0.0",
"@types/content-disposition": "0.5.5",
"@types/escape-regexp": "0.0.1",
"@types/fluent-ffmpeg": "2.1.20",
"@types/ioredis": "4.28.10",
"@types/jest": "29.2.5",
"@types/jest": "29.4.0",
"@types/js-yaml": "4.0.5",
"@types/jsdom": "20.0.1",
"@types/jsdom": "21.1.0",
"@types/jsonld": "1.5.8",
"@types/jsrsasign": "10.5.4",
"@types/jsrsasign": "10.5.5",
"@types/mime-types": "2.1.1",
"@types/node": "18.11.18",
"@types/node": "18.13.0",
"@types/node-fetch": "3.0.3",
"@types/nodemailer": "6.4.7",
"@types/oauth": "0.9.1",
@@ -164,7 +166,6 @@
"@types/sharp": "0.31.1",
"@types/sinonjs__fake-timers": "8.1.2",
"@types/speakeasy": "2.0.7",
"@types/syslog-pro": "^1.0.0",
"@types/tinycolor2": "1.4.3",
"@types/tmp": "0.2.3",
"@types/unzipper": "0.10.5",
@@ -173,14 +174,13 @@
"@types/web-push": "3.3.2",
"@types/websocket": "1.0.5",
"@types/ws": "8.5.4",
"@typescript-eslint/eslint-plugin": "5.48.1",
"@typescript-eslint/parser": "5.48.1",
"@typescript-eslint/eslint-plugin": "5.51.0",
"@typescript-eslint/parser": "5.51.0",
"cross-env": "7.0.3",
"eslint": "8.31.0",
"eslint-plugin-import": "2.27.4",
"eslint": "8.33.0",
"eslint-plugin-import": "2.27.5",
"execa": "6.1.0",
"jest": "29.3.1",
"jest-mock": "^29.3.1",
"node-fetch": "3.3.0"
"jest": "29.4.2",
"jest-mock": "29.4.2"
}
}

View File

@@ -4,7 +4,7 @@ import { DataSource } from 'typeorm';
import { createRedisConnection } from '@/redis.js';
import { DI } from './di-symbols.js';
import { loadConfig } from './config.js';
import { createPostgreDataSource } from './postgre.js';
import { createPostgresDataSource } from './postgres.js';
import { RepositoryModule } from './models/RepositoryModule.js';
import type { Provider, OnApplicationShutdown } from '@nestjs/common';
@@ -18,7 +18,7 @@ const $config: Provider = {
const $db: Provider = {
provide: DI.db,
useFactory: async (config) => {
const db = createPostgreDataSource(config);
const db = createPostgresDataSource(config);
return await db.initialize();
},
inject: [DI.config],

View File

@@ -1,13 +1,13 @@
import { Module } from '@nestjs/common';
import { ServerModule } from '@/server/ServerModule.js';
import { GlobalModule } from '@/GlobalModule.js';
import { QueueProcessorModule } from '@/queue/QueueProcessorModule.js';
import { DaemonModule } from '@/daemons/DaemonModule.js';
@Module({
imports: [
GlobalModule,
ServerModule,
QueueProcessorModule,
DaemonModule,
],
})
export class RootModule {}
export class MainModule {}

View File

@@ -0,0 +1,35 @@
import { NestFactory } from '@nestjs/core';
import { ChartManagementService } from '@/core/chart/ChartManagementService.js';
import { QueueProcessorService } from '@/queue/QueueProcessorService.js';
import { NestLogger } from '@/NestLogger.js';
import { QueueProcessorModule } from '@/queue/QueueProcessorModule.js';
import { JanitorService } from '@/daemons/JanitorService.js';
import { QueueStatsService } from '@/daemons/QueueStatsService.js';
import { ServerStatsService } from '@/daemons/ServerStatsService.js';
import { ServerService } from '@/server/ServerService.js';
import { MainModule } from '@/MainModule.js';
export async function server() {
const app = await NestFactory.createApplicationContext(MainModule, {
logger: new NestLogger(),
});
app.enableShutdownHooks();
const serverService = app.get(ServerService);
serverService.launch();
app.get(ChartManagementService).start();
app.get(JanitorService).start();
app.get(QueueStatsService).start();
app.get(ServerStatsService).start();
}
export async function jobQueue() {
const jobQueue = await NestFactory.createApplicationContext(QueueProcessorModule, {
logger: new NestLogger(),
});
jobQueue.enableShutdownHooks();
jobQueue.get(QueueProcessorService).start();
jobQueue.get(ChartManagementService).start();
}

View File

@@ -6,18 +6,12 @@ import cluster from 'node:cluster';
import chalk from 'chalk';
import chalkTemplate from 'chalk-template';
import semver from 'semver';
import { NestFactory } from '@nestjs/core';
import Logger from '@/logger.js';
import { loadConfig } from '@/config.js';
import type { Config } from '@/config.js';
import { lessThan } from '@/misc/prelude/array.js';
import { showMachineInfo } from '@/misc/show-machine-info.js';
import { DaemonModule } from '@/daemons/DaemonModule.js';
import { JanitorService } from '@/daemons/JanitorService.js';
import { QueueStatsService } from '@/daemons/QueueStatsService.js';
import { ServerStatsService } from '@/daemons/ServerStatsService.js';
import { NestLogger } from '@/NestLogger.js';
import { envOption } from '../env.js';
import { envOption } from '@/env.js';
import { jobQueue, server } from './common.js';
const _filename = fileURLToPath(import.meta.url);
const _dirname = dirname(_filename);
@@ -70,6 +64,14 @@ export async function masterMain() {
process.exit(1);
}
if (envOption.onlyServer) {
await server();
} else if (envOption.onlyQueue) {
await jobQueue();
} else {
await server();
}
bootLogger.succ('Misskey initialized');
if (!envOption.disableClustering) {
@@ -77,16 +79,6 @@ export async function masterMain() {
}
bootLogger.succ(`Now listening on port ${config.port} on ${config.url}`, null, true);
if (!envOption.noDaemons) {
const daemons = await NestFactory.createApplicationContext(DaemonModule, {
logger: new NestLogger(),
});
daemons.enableShutdownHooks();
daemons.get(JanitorService).start();
daemons.get(QueueStatsService).start();
daemons.get(ServerStatsService).start();
}
}
function showEnvironment(): void {

View File

@@ -1,33 +1,19 @@
import cluster from 'node:cluster';
import { NestFactory } from '@nestjs/core';
import { envOption } from '@/env.js';
import { ChartManagementService } from '@/core/chart/ChartManagementService.js';
import { ServerService } from '@/server/ServerService.js';
import { QueueProcessorService } from '@/queue/QueueProcessorService.js';
import { NestLogger } from '@/NestLogger.js';
import { RootModule } from '../RootModule.js';
import { jobQueue, server } from './common.js';
/**
* Init worker process
*/
export async function workerMain() {
const app = await NestFactory.createApplicationContext(RootModule, {
logger: new NestLogger(),
});
app.enableShutdownHooks();
// start server
const serverService = app.get(ServerService);
serverService.launch();
// start job queue
if (!envOption.onlyServer) {
const queueProcessorService = app.get(QueueProcessorService);
queueProcessorService.start();
if (envOption.onlyServer) {
await server();
} else if (envOption.onlyQueue) {
await jobQueue();
} else {
await jobQueue();
}
app.get(ChartManagementService).run();
if (cluster.isWorker) {
// Send a 'ready' message to parent process
process.send!('ready');

View File

@@ -65,11 +65,6 @@ export type Source = {
deliverJobMaxAttempts?: number;
inboxJobMaxAttempts?: number;
syslog: {
host: string;
port: number;
};
mediaProxy?: string;
proxyRemoteFiles?: boolean;
@@ -92,6 +87,8 @@ export type Mixin = {
userAgent: string;
clientEntry: string;
clientManifestExists: boolean;
mediaProxy: string;
externalMediaProxyEnabled: boolean;
};
export type Config = Source & Mixin;
@@ -113,7 +110,7 @@ const path = process.env.NODE_ENV === 'test'
export function loadConfig() {
const meta = JSON.parse(fs.readFileSync(`${_dirname}/../../../built/meta.json`, 'utf-8'));
const clientManifestExists = fs.existsSync(_dirname + '/../../../built/_vite_/manifest.json')
const clientManifestExists = fs.existsSync(_dirname + '/../../../built/_vite_/manifest.json');
const clientManifest = clientManifestExists ?
JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_vite_/manifest.json`, 'utf-8'))
: { 'src/init.ts': { file: 'src/init.ts' } };
@@ -140,6 +137,13 @@ export function loadConfig() {
mixin.clientEntry = clientManifest['src/init.ts'];
mixin.clientManifestExists = clientManifestExists;
const externalMediaProxy = config.mediaProxy ?
config.mediaProxy.endsWith('/') ? config.mediaProxy.substring(0, config.mediaProxy.length - 1) : config.mediaProxy
: null;
const internalMediaProxy = `${mixin.scheme}://${mixin.host}/proxy`;
mixin.mediaProxy = externalMediaProxy ?? internalMediaProxy;
mixin.externalMediaProxyEnabled = externalMediaProxy !== null && externalMediaProxy !== internalMediaProxy;
if (!config.redis.prefix) config.redis.prefix = mixin.host;
return Object.assign(config, mixin);

View File

@@ -0,0 +1,121 @@
import { Inject, Injectable } from '@nestjs/common';
import type { UserProfilesRepository, UsersRepository } from '@/models/index.js';
import type { User } from '@/models/entities/User.js';
import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js';
import { CreateNotificationService } from '@/core/CreateNotificationService.js';
export const ACHIEVEMENT_TYPES = [
'notes1',
'notes10',
'notes100',
'notes500',
'notes1000',
'notes5000',
'notes10000',
'notes20000',
'notes30000',
'notes40000',
'notes50000',
'notes60000',
'notes70000',
'notes80000',
'notes90000',
'notes100000',
'login3',
'login7',
'login15',
'login30',
'login60',
'login100',
'login200',
'login300',
'login400',
'login500',
'login600',
'login700',
'login800',
'login900',
'login1000',
'passedSinceAccountCreated1',
'passedSinceAccountCreated2',
'passedSinceAccountCreated3',
'loggedInOnBirthday',
'loggedInOnNewYearsDay',
'noteClipped1',
'noteFavorited1',
'myNoteFavorited1',
'profileFilled',
'markedAsCat',
'following1',
'following10',
'following50',
'following100',
'following300',
'followers1',
'followers10',
'followers50',
'followers100',
'followers300',
'followers500',
'followers1000',
'collectAchievements30',
'viewAchievements3min',
'iLoveMisskey',
'foundTreasure',
'client30min',
'noteDeletedWithin1min',
'postedAtLateNight',
'postedAt0min0sec',
'selfQuote',
'htl20npm',
'viewInstanceChart',
'outputHelloWorldOnScratchpad',
'open3windows',
'driveFolderCircularReference',
'reactWithoutRead',
'clickedClickHere',
'justPlainLucky',
'setNameToSyuilo',
'cookieClicked',
'brainDiver',
] as const;
@Injectable()
export class AchievementService {
constructor(
@Inject(DI.usersRepository)
private usersRepository: UsersRepository,
@Inject(DI.userProfilesRepository)
private userProfilesRepository: UserProfilesRepository,
private createNotificationService: CreateNotificationService,
) {
}
@bindThis
public async create(
userId: User['id'],
type: typeof ACHIEVEMENT_TYPES[number],
): Promise<void> {
if (!ACHIEVEMENT_TYPES.includes(type)) return;
const date = Date.now();
const profile = await this.userProfilesRepository.findOneByOrFail({ userId: userId });
if (profile.achievements.some(a => a.name === type)) return;
await this.userProfilesRepository.update(userId, {
achievements: [...profile.achievements, {
name: type,
unlockedAt: date,
}],
});
this.createNotificationService.createNotification(userId, 'achievementEarned', {
achievement: type,
});
}
}

View File

@@ -10,10 +10,9 @@ import { isUserRelated } from '@/misc/is-user-related.js';
import { GlobalEventService } from '@/core/GlobalEventService.js';
import { PushNotificationService } from '@/core/PushNotificationService.js';
import * as Acct from '@/misc/acct.js';
import { Cache } from '@/misc/cache.js';
import type { Packed } from '@/misc/schema.js';
import { DI } from '@/di-symbols.js';
import type { MutingsRepository, BlockingsRepository, NotesRepository, AntennaNotesRepository, AntennasRepository, UserGroupJoiningsRepository, UserListJoiningsRepository } from '@/models/index.js';
import type { MutingsRepository, NotesRepository, AntennaNotesRepository, AntennasRepository, UserGroupJoiningsRepository, UserListJoiningsRepository } from '@/models/index.js';
import { UtilityService } from '@/core/UtilityService.js';
import { bindThis } from '@/decorators.js';
import { StreamMessages } from '@/server/api/stream/types.js';
@@ -23,7 +22,6 @@ import type { OnApplicationShutdown } from '@nestjs/common';
export class AntennaService implements OnApplicationShutdown {
private antennasFetched: boolean;
private antennas: Antenna[];
private blockingCache: Cache<User['id'][]>;
constructor(
@Inject(DI.redisSubscriber)
@@ -32,9 +30,6 @@ export class AntennaService implements OnApplicationShutdown {
@Inject(DI.mutingsRepository)
private mutingsRepository: MutingsRepository,
@Inject(DI.blockingsRepository)
private blockingsRepository: BlockingsRepository,
@Inject(DI.notesRepository)
private notesRepository: NotesRepository,
@@ -52,14 +47,13 @@ export class AntennaService implements OnApplicationShutdown {
private utilityService: UtilityService,
private idService: IdService,
private globalEventServie: GlobalEventService,
private globalEventService: GlobalEventService,
private pushNotificationService: PushNotificationService,
private noteEntityService: NoteEntityService,
private antennaEntityService: AntennaEntityService,
) {
this.antennasFetched = false;
this.antennas = [];
this.blockingCache = new Cache<User['id'][]>(1000 * 60 * 5);
this.redisSubscriber.on('message', this.onRedisMessage);
}
@@ -77,10 +71,16 @@ export class AntennaService implements OnApplicationShutdown {
const { type, body } = obj.message as StreamMessages['internal']['payload'];
switch (type) {
case 'antennaCreated':
this.antennas.push(body);
this.antennas.push({
...body,
createdAt: new Date(body.createdAt),
});
break;
case 'antennaUpdated':
this.antennas[this.antennas.findIndex(a => a.id === body.id)] = body;
this.antennas[this.antennas.findIndex(a => a.id === body.id)] = {
...body,
createdAt: new Date(body.createdAt),
};
break;
case 'antennaDeleted':
this.antennas = this.antennas.filter(a => a.id !== body.id);
@@ -103,7 +103,7 @@ export class AntennaService implements OnApplicationShutdown {
read: read,
});
this.globalEventServie.publishAntennaStream(antenna.id, 'note', note);
this.globalEventService.publishAntennaStream(antenna.id, 'note', note);
if (!read) {
const mutings = await this.mutingsRepository.find({
@@ -133,7 +133,7 @@ export class AntennaService implements OnApplicationShutdown {
setTimeout(async () => {
const unread = await this.antennaNotesRepository.findOneBy({ antennaId: antenna.id, read: false });
if (unread) {
this.globalEventServie.publishMainStream(antenna.userId, 'unreadAntenna', antenna);
this.globalEventService.publishMainStream(antenna.userId, 'unreadAntenna', antenna);
this.pushNotificationService.pushNotification(antenna.userId, 'unreadAntennaNote', {
antenna: { id: antenna.id, name: antenna.name },
note: await this.noteEntityService.pack(note),
@@ -149,10 +149,6 @@ export class AntennaService implements OnApplicationShutdown {
public async checkHitAntenna(antenna: Antenna, note: (Note | Packed<'Note'>), noteUser: { id: User['id']; username: string; host: string | null; }): Promise<boolean> {
if (note.visibility === 'specified') return false;
if (note.visibility === 'followers') return false;
// アンテナ作成者がノート作成者にブロックされていたらスキップ
const blockings = await this.blockingCache.fetch(noteUser.id, () => this.blockingsRepository.findBy({ blockerId: noteUser.id }).then(res => res.map(x => x.blockeeId)));
if (blockings.some(blocking => blocking === antenna.userId)) return false;
if (!antenna.withReplies && note.replyId != null) return false;

View File

@@ -21,18 +21,13 @@ export class CaptchaService {
response,
});
const res = await this.httpRequestService.fetch(
url,
{
method: 'POST',
body: params,
const res = await this.httpRequestService.send(url, {
method: 'POST',
body: params.toString(),
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
{
noOkError: true,
}
).catch(err => {
throw `${err.message ?? err}`;
});
}, { throwErrorWhenResponseNotOk: false });
if (!res.ok) {
throw `${res.status}`;

View File

@@ -4,6 +4,7 @@ import { AccountUpdateService } from './AccountUpdateService.js';
import { AiService } from './AiService.js';
import { AntennaService } from './AntennaService.js';
import { AppLockService } from './AppLockService.js';
import { AchievementService } from './AchievementService.js';
import { CaptchaService } from './CaptchaService.js';
import { CreateNotificationService } from './CreateNotificationService.js';
import { CreateSystemUserService } from './CreateSystemUserService.js';
@@ -61,7 +62,6 @@ import PerUserNotesChart from './chart/charts/per-user-notes.js';
import PerUserPvChart from './chart/charts/per-user-pv.js';
import DriveChart from './chart/charts/drive.js';
import PerUserReactionsChart from './chart/charts/per-user-reactions.js';
import HashtagChart from './chart/charts/hashtag.js';
import PerUserFollowingChart from './chart/charts/per-user-following.js';
import PerUserDriveChart from './chart/charts/per-user-drive.js';
import ApRequestChart from './chart/charts/ap-request.js';
@@ -128,6 +128,7 @@ const $AccountUpdateService: Provider = { provide: 'AccountUpdateService', useEx
const $AiService: Provider = { provide: 'AiService', useExisting: AiService };
const $AntennaService: Provider = { provide: 'AntennaService', useExisting: AntennaService };
const $AppLockService: Provider = { provide: 'AppLockService', useExisting: AppLockService };
const $AchievementService: Provider = { provide: 'AchievementService', useExisting: AchievementService };
const $CaptchaService: Provider = { provide: 'CaptchaService', useExisting: CaptchaService };
const $CreateNotificationService: Provider = { provide: 'CreateNotificationService', useExisting: CreateNotificationService };
const $CreateSystemUserService: Provider = { provide: 'CreateSystemUserService', useExisting: CreateSystemUserService };
@@ -185,7 +186,6 @@ const $PerUserNotesChart: Provider = { provide: 'PerUserNotesChart', useExisting
const $PerUserPvChart: Provider = { provide: 'PerUserPvChart', useExisting: PerUserPvChart };
const $DriveChart: Provider = { provide: 'DriveChart', useExisting: DriveChart };
const $PerUserReactionsChart: Provider = { provide: 'PerUserReactionsChart', useExisting: PerUserReactionsChart };
const $HashtagChart: Provider = { provide: 'HashtagChart', useExisting: HashtagChart };
const $PerUserFollowingChart: Provider = { provide: 'PerUserFollowingChart', useExisting: PerUserFollowingChart };
const $PerUserDriveChart: Provider = { provide: 'PerUserDriveChart', useExisting: PerUserDriveChart };
const $ApRequestChart: Provider = { provide: 'ApRequestChart', useExisting: ApRequestChart };
@@ -255,6 +255,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
AiService,
AntennaService,
AppLockService,
AchievementService,
CaptchaService,
CreateNotificationService,
CreateSystemUserService,
@@ -312,7 +313,6 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
PerUserPvChart,
DriveChart,
PerUserReactionsChart,
HashtagChart,
PerUserFollowingChart,
PerUserDriveChart,
ApRequestChart,
@@ -376,6 +376,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$AiService,
$AntennaService,
$AppLockService,
$AchievementService,
$CaptchaService,
$CreateNotificationService,
$CreateSystemUserService,
@@ -433,7 +434,6 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$PerUserPvChart,
$DriveChart,
$PerUserReactionsChart,
$HashtagChart,
$PerUserFollowingChart,
$PerUserDriveChart,
$ApRequestChart,
@@ -498,6 +498,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
AiService,
AntennaService,
AppLockService,
AchievementService,
CaptchaService,
CreateNotificationService,
CreateSystemUserService,
@@ -554,7 +555,6 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
PerUserPvChart,
DriveChart,
PerUserReactionsChart,
HashtagChart,
PerUserFollowingChart,
PerUserDriveChart,
ApRequestChart,
@@ -618,6 +618,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$AiService,
$AntennaService,
$AppLockService,
$AchievementService,
$CaptchaService,
$CreateNotificationService,
$CreateSystemUserService,
@@ -674,7 +675,6 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$PerUserPvChart,
$DriveChart,
$PerUserReactionsChart,
$HashtagChart,
$PerUserFollowingChart,
$PerUserDriveChart,
$ApRequestChart,

View File

@@ -26,7 +26,7 @@ export class CreateNotificationService {
private notificationEntityService: NotificationEntityService,
private idService: IdService,
private globalEventServie: GlobalEventService,
private globalEventService: GlobalEventService,
private pushNotificationService: PushNotificationService,
) {
}
@@ -60,7 +60,7 @@ export class CreateNotificationService {
const packed = await this.notificationEntityService.pack(notification, {});
// Publish notification event
this.globalEventServie.publishMainStream(notifieeId, 'notification', packed);
this.globalEventService.publishMainStream(notifieeId, 'notification', packed);
// 2秒経っても(今回作成した)通知が既読にならなかったら「未読の通知がありますよ」イベントを発行する
setTimeout(async () => {
@@ -77,7 +77,7 @@ export class CreateNotificationService {
}
//#endregion
this.globalEventServie.publishMainStream(notifieeId, 'unreadNotification', packed);
this.globalEventService.publishMainStream(notifieeId, 'unreadNotification', packed);
this.pushNotificationService.pushNotification(notifieeId, 'notification', packed);
if (type === 'follow') this.emailNotificationFollow(notifieeId, await this.usersRepository.findOneByOrFail({ id: data.notifierId! }));

View File

@@ -2,22 +2,39 @@ import { Inject, Injectable } from '@nestjs/common';
import { DataSource, In, IsNull } from 'typeorm';
import { DI } from '@/di-symbols.js';
import { IdService } from '@/core/IdService.js';
import { EmojiEntityService } from '@/core/entities/EmojiEntityService.js';
import { GlobalEventService } from '@/core/GlobalEventService.js';
import type { DriveFile } from '@/models/entities/DriveFile.js';
import type { Emoji } from '@/models/entities/Emoji.js';
import type { EmojisRepository } from '@/models/index.js';
import type { EmojisRepository, Note } from '@/models/index.js';
import { bindThis } from '@/decorators.js';
import { Cache } from '@/misc/cache.js';
import { UtilityService } from '@/core/UtilityService.js';
import type { Config } from '@/config.js';
import { ReactionService } from '@/core/ReactionService.js';
import { query } from '@/misc/prelude/url.js';
@Injectable()
export class CustomEmojiService {
private cache: Cache<Emoji | null>;
constructor(
@Inject(DI.config)
private config: Config,
@Inject(DI.db)
private db: DataSource,
@Inject(DI.emojisRepository)
private emojisRepository: EmojisRepository,
private utilityService: UtilityService,
private idService: IdService,
private emojiEntityService: EmojiEntityService,
private globalEventService: GlobalEventService,
private reactionService: ReactionService,
) {
this.cache = new Cache<Emoji | null>(1000 * 60 * 60 * 12);
}
@bindThis
@@ -40,8 +57,135 @@ export class CustomEmojiService {
type: data.driveFile.webpublicType ?? data.driveFile.type,
}).then(x => this.emojisRepository.findOneByOrFail(x.identifiers[0]));
await this.db.queryResultCache!.remove(['meta_emojis']);
if (data.host == null) {
await this.db.queryResultCache!.remove(['meta_emojis']);
this.globalEventService.publishBroadcastStream('emojiAdded', {
emoji: await this.emojiEntityService.pack(emoji.id),
});
}
return emoji;
}
@bindThis
private normalizeHost(src: string | undefined, noteUserHost: string | null): string | null {
// クエリに使うホスト
let host = src === '.' ? null // .はローカルホスト (ここがマッチするのはリアクションのみ)
: src === undefined ? noteUserHost // ノートなどでホスト省略表記の場合はローカルホスト (ここがリアクションにマッチすることはない)
: this.utilityService.isSelfHost(src) ? null // 自ホスト指定
: (src || noteUserHost); // 指定されたホスト || ノートなどの所有者のホスト (こっちがリアクションにマッチすることはない)
host = this.utilityService.toPunyNullable(host);
return host;
}
@bindThis
private parseEmojiStr(emojiName: string, noteUserHost: string | null) {
const match = emojiName.match(/^(\w+)(?:@([\w.-]+))?$/);
if (!match) return { name: null, host: null };
const name = match[1];
// ホスト正規化
const host = this.utilityService.toPunyNullable(this.normalizeHost(match[2], noteUserHost));
return { name, host };
}
/**
* 添付用(リモート)カスタム絵文字URLを解決する
* @param emojiName ノートやユーザープロフィールに添付された、またはリアクションのカスタム絵文字名 (:は含めない, リアクションでローカルホストの場合は@.を付ける (これはdecodeReactionで可能))
* @param noteUserHost ノートやユーザープロフィールの所有者のホスト
* @returns URL, nullは未マッチを意味する
*/
@bindThis
public async populateEmoji(emojiName: string, noteUserHost: string | null): Promise<string | null> {
const { name, host } = this.parseEmojiStr(emojiName, noteUserHost);
if (name == null) return null;
if (host == null) return null;
const queryOrNull = async () => (await this.emojisRepository.findOneBy({
name,
host: host ?? IsNull(),
})) ?? null;
const emoji = await this.cache.fetch(`${name} ${host}`, queryOrNull);
if (emoji == null) return null;
const isLocal = emoji.host == null;
const emojiUrl = emoji.publicUrl || emoji.originalUrl; // || emoji.originalUrl してるのは後方互換性のためpublicUrlはstringなので??はだめ)
const url = isLocal
? emojiUrl
: this.config.proxyRemoteFiles
? `${this.config.mediaProxy}/emoji.webp?${query({ url: emojiUrl })}`
: emojiUrl;
return url;
}
/**
* 複数の添付用(リモート)カスタム絵文字URLを解決する (キャシュ付き, 存在しないものは結果から除外される)
*/
@bindThis
public async populateEmojis(emojiNames: string[], noteUserHost: string | null): Promise<Record<string, string>> {
const emojis = await Promise.all(emojiNames.map(x => this.populateEmoji(x, noteUserHost)));
const res = {} as any;
for (let i = 0; i < emojiNames.length; i++) {
if (emojis[i] != null) {
res[emojiNames[i]] = emojis[i];
}
}
return res;
}
@bindThis
public aggregateNoteEmojis(notes: Note[]) {
let emojis: { name: string | null; host: string | null; }[] = [];
for (const note of notes) {
emojis = emojis.concat(note.emojis
.map(e => this.parseEmojiStr(e, note.userHost)));
if (note.renote) {
emojis = emojis.concat(note.renote.emojis
.map(e => this.parseEmojiStr(e, note.renote!.userHost)));
if (note.renote.user) {
emojis = emojis.concat(note.renote.user.emojis
.map(e => this.parseEmojiStr(e, note.renote!.userHost)));
}
}
const customReactions = Object.keys(note.reactions).map(x => this.reactionService.decodeReaction(x)).filter(x => x.name != null) as typeof emojis;
emojis = emojis.concat(customReactions);
if (note.user) {
emojis = emojis.concat(note.user.emojis
.map(e => this.parseEmojiStr(e, note.userHost)));
}
}
return emojis.filter(x => x.name != null && x.host != null) as { name: string; host: string; }[];
}
/**
* 与えられた絵文字のリストをデータベースから取得し、キャッシュに追加します
*/
@bindThis
public async prefetchEmojis(emojis: { name: string; host: string | null; }[]): Promise<void> {
const notCachedEmojis = emojis.filter(emoji => this.cache.get(`${emoji.name} ${emoji.host}`) == null);
const emojisQuery: any[] = [];
const hosts = new Set(notCachedEmojis.map(e => e.host));
for (const host of hosts) {
if (host == null) continue;
emojisQuery.push({
name: In(notCachedEmojis.filter(e => e.host === host).map(e => e.name)),
host: host,
});
}
const _emojis = emojisQuery.length > 0 ? await this.emojisRepository.find({
where: emojisQuery,
select: ['name', 'host', 'originalUrl', 'publicUrl'],
}) : [];
for (const emoji of _emojis) {
this.cache.set(`${emoji.name} ${emoji.host}`, emoji);
}
}
}

View File

@@ -14,7 +14,7 @@ export class DeleteAccountService {
private userSuspendService: UserSuspendService,
private queueService: QueueService,
private globalEventServie: GlobalEventService,
private globalEventService: GlobalEventService,
) {
}
@@ -38,6 +38,6 @@ export class DeleteAccountService {
});
// Terminate streaming
this.globalEventServie.publishUserEvent(user.id, 'terminate', {});
this.globalEventService.publishUserEvent(user.id, 'terminate', {});
}
}

View File

@@ -4,16 +4,15 @@ import * as util from 'node:util';
import { Inject, Injectable } from '@nestjs/common';
import IPCIDR from 'ip-cidr';
import PrivateIp from 'private-ip';
import got, * as Got from 'got';
import chalk from 'chalk';
import got, * as Got from 'got';
import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js';
import { HttpRequestService, UndiciFetcher } from '@/core/HttpRequestService.js';
import { HttpRequestService } from '@/core/HttpRequestService.js';
import { createTemp } from '@/misc/create-temp.js';
import { StatusError } from '@/misc/status-error.js';
import { LoggerService } from '@/core/LoggerService.js';
import type Logger from '@/logger.js';
import { buildConnector } from 'undici';
const pipeline = util.promisify(stream.pipeline);
import { bindThis } from '@/decorators.js';
@@ -21,7 +20,6 @@ import { bindThis } from '@/decorators.js';
@Injectable()
export class DownloadService {
private logger: Logger;
private undiciFetcher: UndiciFetcher;
constructor(
@Inject(DI.config)
@@ -31,24 +29,6 @@ export class DownloadService {
private loggerService: LoggerService,
) {
this.logger = this.loggerService.getLogger('download');
this.undiciFetcher = new UndiciFetcher(this.httpRequestService.getStandardUndiciFetcherOption(
{
connect: process.env.NODE_ENV === 'development' ?
this.httpRequestService.clientDefaults.connect
:
this.httpRequestService.getConnectorWithIpCheck(
buildConnector({
...this.httpRequestService.clientDefaults.connect,
}),
(ip) => !this.isPrivateIp(ip)
),
bodyTimeout: 30 * 1000,
},
{
connect: this.httpRequestService.clientDefaults.connect,
}
), this.logger);
}
@bindThis
@@ -59,14 +39,61 @@ export class DownloadService {
const operationTimeout = 60 * 1000;
const maxSize = this.config.maxFileSize ?? 262144000;
const response = await this.undiciFetcher.fetch(url);
const req = got.stream(url, {
headers: {
'User-Agent': this.config.userAgent,
},
timeout: {
lookup: timeout,
connect: timeout,
secureConnect: timeout,
socket: timeout, // read timeout
response: timeout,
send: timeout,
request: operationTimeout, // whole operation timeout
},
agent: {
http: this.httpRequestService.httpAgent,
https: this.httpRequestService.httpsAgent,
},
http2: false, // default
retry: {
limit: 0,
},
enableUnixSockets: false,
}).on('response', (res: Got.Response) => {
if ((process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'test') && !this.config.proxy && res.ip) {
if (this.isPrivateIp(res.ip)) {
this.logger.warn(`Blocked address: ${res.ip}`);
req.destroy();
}
}
if (response.body === null) {
throw new StatusError('No body', 400, 'No body');
const contentLength = res.headers['content-length'];
if (contentLength != null) {
const size = Number(contentLength);
if (size > maxSize) {
this.logger.warn(`maxSize exceeded (${size} > ${maxSize}) on response`);
req.destroy();
}
}
}).on('downloadProgress', (progress: Got.Progress) => {
if (progress.transferred > maxSize) {
this.logger.warn(`maxSize exceeded (${progress.transferred} > ${maxSize}) on downloadProgress`);
req.destroy();
}
});
try {
await pipeline(req, fs.createWriteStream(path));
} catch (e) {
if (e instanceof Got.HTTPError) {
throw new StatusError(`${e.response.statusCode} ${e.response.statusMessage}`, e.response.statusCode, e.response.statusMessage);
} else {
throw e;
}
}
await pipeline(stream.Readable.fromWeb(response.body), fs.createWriteStream(path));
this.logger.succ(`Download finished: ${chalk.cyan(url)}`);
}

View File

@@ -2,6 +2,7 @@ import { URL } from 'node:url';
import { Inject, Injectable } from '@nestjs/common';
import { JSDOM } from 'jsdom';
import tinycolor from 'tinycolor2';
import fetch from 'node-fetch';
import type { Instance } from '@/models/entities/Instance.js';
import type { InstancesRepository } from '@/models/index.js';
import { AppLockService } from '@/core/AppLockService.js';
@@ -190,7 +191,9 @@ export class FetchInstanceMetadataService {
const faviconUrl = url + '/favicon.ico';
const favicon = await this.httpRequestService.fetch(faviconUrl, {}, { noOkError: true });
const favicon = await this.httpRequestService.send(faviconUrl, {
method: 'HEAD',
}, { throwErrorWhenResponseNotOk: false });
if (favicon.ok) {
return faviconUrl;

View File

@@ -4,7 +4,6 @@ import type { User } from '@/models/entities/User.js';
import { normalizeForSearch } from '@/misc/normalize-for-search.js';
import { IdService } from '@/core/IdService.js';
import type { Hashtag } from '@/models/entities/Hashtag.js';
import HashtagChart from '@/core/chart/charts/hashtag.js';
import type { HashtagsRepository, UsersRepository } from '@/models/index.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { bindThis } from '@/decorators.js';
@@ -20,7 +19,6 @@ export class HashtagService {
private userEntityService: UserEntityService,
private idService: IdService,
private hashtagChart: HashtagChart,
) {
}
@@ -143,9 +141,5 @@ export class HashtagService {
} as Hashtag);
}
}
if (!isUserAttached) {
this.hashtagChart.update(tag, user);
}
}
}

View File

@@ -1,257 +1,67 @@
import * as http from 'node:http';
import * as https from 'node:https';
import CacheableLookup from 'cacheable-lookup';
import fetch from 'node-fetch';
import { HttpProxyAgent, HttpsProxyAgent } from 'hpagent';
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js';
import { StatusError } from '@/misc/status-error.js';
import { bindThis } from '@/decorators.js';
import * as undici from 'undici';
import { LookupFunction } from 'node:net';
import { LoggerService } from '@/core/LoggerService.js';
import type Logger from '@/logger.js';
// true to allow, false to deny
export type IpChecker = (ip: string) => boolean;
/*
* Child class to create and save Agent for fetch.
* You should construct this when you want
* to change timeout, size limit, socket connect function, etc.
*/
export class UndiciFetcher {
/**
* Get http non-proxy agent (undici)
*/
public nonProxiedAgent: undici.Agent;
/**
* Get http proxy or non-proxy agent (undici)
*/
public agent: undici.ProxyAgent | undici.Agent;
private proxyBypassHosts: string[];
private userAgent: string | undefined;
private logger: Logger | undefined;
constructor(
args: {
agentOptions: undici.Agent.Options;
proxy?: {
uri: string;
options?: undici.Agent.Options; // Override of agentOptions
},
proxyBypassHosts?: string[];
userAgent?: string;
},
logger?: Logger,
) {
this.logger = logger;
this.logger?.debug('UndiciFetcher constructor', args);
this.proxyBypassHosts = args.proxyBypassHosts ?? [];
this.userAgent = args.userAgent;
this.nonProxiedAgent = new undici.Agent({
...args.agentOptions,
connect: (process.env.NODE_ENV !== 'production' && typeof args.agentOptions.connect !== 'function')
? (options, cb) => {
// Custom connector for debug
undici.buildConnector(args.agentOptions.connect as undici.buildConnector.BuildOptions)(options, (err, socket) => {
this.logger?.debug('Socket connector called', socket);
if (err) {
this.logger?.debug(`Socket error`, err);
cb(new Error(`Error while socket connecting\n${err}`), null);
return;
}
this.logger?.debug(`Socket connected: port ${socket.localPort} => remote ${socket.remoteAddress}`);
cb(null, socket);
});
} : args.agentOptions.connect,
});
this.agent = args.proxy
? new undici.ProxyAgent({
...args.agentOptions,
...args.proxy.options,
uri: args.proxy.uri,
connect: (process.env.NODE_ENV !== 'production' && typeof (args.proxy?.options?.connect ?? args.agentOptions.connect) !== 'function')
? (options, cb) => {
// Custom connector for debug
undici.buildConnector((args.proxy?.options?.connect ?? args.agentOptions.connect) as undici.buildConnector.BuildOptions)(options, (err, socket) => {
this.logger?.debug('Socket connector called (secure)', socket);
if (err) {
this.logger?.debug(`Socket error`, err);
cb(new Error(`Error while socket connecting\n${err}`), null);
return;
}
this.logger?.debug(`Socket connected (secure): port ${socket.localPort} => remote ${socket.remoteAddress}`);
cb(null, socket);
});
} : (args.proxy?.options?.connect ?? args.agentOptions.connect),
})
: this.nonProxiedAgent;
}
/**
* Get agent by URL
* @param url URL
* @param bypassProxy Allways bypass proxy
*/
@bindThis
public getAgentByUrl(url: URL, bypassProxy = false): undici.Agent | undici.ProxyAgent {
if (bypassProxy || this.proxyBypassHosts.includes(url.hostname)) {
return this.nonProxiedAgent;
} else {
return this.agent;
}
}
@bindThis
public async fetch(
url: string | URL,
options: undici.RequestInit = {},
privateOptions: { noOkError?: boolean; bypassProxy?: boolean; } = { noOkError: false, bypassProxy: false }
): Promise<undici.Response> {
const res = await undici.fetch(url, {
dispatcher: this.getAgentByUrl(new URL(url), privateOptions.bypassProxy),
...options,
headers: {
'User-Agent': this.userAgent ?? '',
...(options.headers ?? {}),
},
}).catch((err) => {
this.logger?.error('fetch error', err);
throw new StatusError('Resource Unreachable', 500, 'Resource Unreachable');
});
if (!res.ok && !privateOptions.noOkError) {
throw new StatusError(`${res.status} ${res.statusText}`, res.status, res.statusText);
}
return res;
}
@bindThis
public async getJson<T extends unknown>(url: string, accept = 'application/json, */*', headers?: Record<string, string>): Promise<T> {
const res = await this.fetch(
url,
{
headers: Object.assign({
Accept: accept,
}, headers ?? {}),
}
);
return await res.json() as T;
}
@bindThis
public async getHtml(url: string, accept = 'text/html, */*', headers?: Record<string, string>): Promise<string> {
const res = await this.fetch(
url,
{
headers: Object.assign({
Accept: accept,
}, headers ?? {}),
}
);
return await res.text();
}
}
import type { Response } from 'node-fetch';
import type { URL } from 'node:url';
@Injectable()
export class HttpRequestService {
public defaultFetcher: UndiciFetcher;
public fetch: UndiciFetcher['fetch'];
public getHtml: UndiciFetcher['getHtml'];
public defaultJsonFetcher: UndiciFetcher;
public getJson: UndiciFetcher['getJson'];
//#region for old http/https, only used in S3Service
// http non-proxy agent
/**
* Get http non-proxy agent
*/
private http: http.Agent;
// https non-proxy agent
/**
* Get https non-proxy agent
*/
private https: https.Agent;
// http proxy or non-proxy agent
/**
* Get http proxy or non-proxy agent
*/
public httpAgent: http.Agent;
// https proxy or non-proxy agent
/**
* Get https proxy or non-proxy agent
*/
public httpsAgent: https.Agent;
//#endregion
public readonly dnsCache: CacheableLookup;
public readonly clientDefaults: undici.Agent.Options;
private maxSockets: number;
private logger: Logger;
constructor(
@Inject(DI.config)
private config: Config,
private loggerService: LoggerService,
) {
this.logger = this.loggerService.getLogger('http-request');
this.dnsCache = new CacheableLookup({
const cache = new CacheableLookup({
maxTtl: 3600, // 1hours
errorTtl: 30, // 30secs
lookup: false, // nativeのdns.lookupにfallbackしない
});
this.clientDefaults = {
keepAliveTimeout: 30 * 1000,
keepAliveMaxTimeout: 10 * 60 * 1000,
keepAliveTimeoutThreshold: 1 * 1000,
strictContentLength: true,
headersTimeout: 10 * 1000,
bodyTimeout: 10 * 1000,
maxHeaderSize: 16364, // default
maxResponseSize: 10 * 1024 * 1024,
maxRedirections: 3,
connect: {
timeout: 10 * 1000, // コネクションが確立するまでのタイムアウト
maxCachedSessions: 300, // TLSセッションのキャッシュ数 https://github.com/nodejs/undici/blob/v5.14.0/lib/core/connect.js#L80
lookup: this.dnsCache.lookup as LookupFunction, // https://github.com/nodejs/undici/blob/v5.14.0/lib/core/connect.js#L98
},
}
this.maxSockets = Math.max(64, this.config.deliverJobConcurrency ?? 128);
this.defaultFetcher = new UndiciFetcher(this.getStandardUndiciFetcherOption(), this.logger);
this.fetch = this.defaultFetcher.fetch;
this.getHtml = this.defaultFetcher.getHtml;
this.defaultJsonFetcher = new UndiciFetcher(this.getStandardUndiciFetcherOption({
maxResponseSize: 1024 * 256,
}), this.logger);
this.getJson = this.defaultJsonFetcher.getJson;
//#region for old http/https, only used in S3Service
this.http = new http.Agent({
keepAlive: true,
keepAliveMsecs: 30 * 1000,
lookup: this.dnsCache.lookup,
lookup: cache.lookup,
} as http.AgentOptions);
this.https = new https.Agent({
keepAlive: true,
keepAliveMsecs: 30 * 1000,
lookup: this.dnsCache.lookup,
lookup: cache.lookup,
} as https.AgentOptions);
const maxSockets = Math.max(256, config.deliverJobConcurrency ?? 128);
this.httpAgent = config.proxy
? new HttpProxyAgent({
keepAlive: true,
keepAliveMsecs: 30 * 1000,
maxSockets: this.maxSockets,
maxSockets,
maxFreeSockets: 256,
scheduling: 'lifo',
proxy: config.proxy,
@@ -262,42 +72,21 @@ export class HttpRequestService {
? new HttpsProxyAgent({
keepAlive: true,
keepAliveMsecs: 30 * 1000,
maxSockets: this.maxSockets,
maxSockets,
maxFreeSockets: 256,
scheduling: 'lifo',
proxy: config.proxy,
})
: this.https;
//#endregion
}
@bindThis
public getStandardUndiciFetcherOption(opts: undici.Agent.Options = {}, proxyOpts: undici.Agent.Options = {}) {
return {
agentOptions: {
...this.clientDefaults,
...opts,
},
...(this.config.proxy ? {
proxy: {
uri: this.config.proxy,
options: {
connections: this.maxSockets,
...proxyOpts,
}
}
} : {}),
userAgent: this.config.userAgent,
}
}
/**
* Get http agent by URL
* Get agent by URL
* @param url URL
* @param bypassProxy Allways bypass proxy
*/
@bindThis
public getHttpAgentByUrl(url: URL, bypassProxy = false): http.Agent | https.Agent {
public getAgentByUrl(url: URL, bypassProxy = false): http.Agent | https.Agent {
if (bypassProxy || (this.config.proxyBypassHosts || []).includes(url.hostname)) {
return url.protocol === 'http:' ? this.http : this.https;
} else {
@@ -305,37 +94,67 @@ export class HttpRequestService {
}
}
/**
* check ip
*/
@bindThis
public getConnectorWithIpCheck(connector: undici.buildConnector.connector, checkIp: IpChecker): undici.buildConnector.connectorAsync {
return (options, cb) => {
connector(options, (err, socket) => {
this.logger.debug('Socket connector (with ip checker) called', socket);
if (err) {
this.logger.error(`Socket error`, err)
cb(new Error(`Error while socket connecting\n${err}`), null);
return;
}
public async getJson<T = unknown>(url: string, accept = 'application/json, */*', headers?: Record<string, string>): Promise<T> {
const res = await this.send(url, {
method: 'GET',
headers: Object.assign({
'User-Agent': this.config.userAgent,
Accept: accept,
}, headers ?? {}),
timeout: 5000,
size: 1024 * 256,
});
if (socket.remoteAddress == undefined) {
this.logger.error(`Socket error: remoteAddress is undefined`);
cb(new Error('remoteAddress is undefined (maybe socket destroyed)'), null);
return;
}
return await res.json() as T;
}
// allow
if (checkIp(socket.remoteAddress)) {
this.logger.debug(`Socket connected (ip ok): ${socket.localPort} => ${socket.remoteAddress}`);
cb(null, socket);
return;
}
@bindThis
public async getHtml(url: string, accept = 'text/html, */*', headers?: Record<string, string>): Promise<string> {
const res = await this.send(url, {
method: 'GET',
headers: Object.assign({
'User-Agent': this.config.userAgent,
Accept: accept,
}, headers ?? {}),
timeout: 5000,
});
this.logger.error('IP is not allowed', socket);
cb(new StatusError('IP is not allowed', 403, 'IP is not allowed'), null);
socket.destroy();
});
};
return await res.text();
}
@bindThis
public async send(url: string, args: {
method?: string,
body?: string,
headers?: Record<string, string>,
timeout?: number,
size?: number,
} = {}, extra: {
throwErrorWhenResponseNotOk: boolean;
} = {
throwErrorWhenResponseNotOk: true,
}): Promise<Response> {
const timeout = args.timeout ?? 5000;
const controller = new AbortController();
setTimeout(() => {
controller.abort();
}, timeout);
const res = await fetch(url, {
method: args.method ?? 'GET',
headers: args.headers,
body: args.body,
size: args.size ?? 10 * 1024 * 1024,
agent: (url) => this.getAgentByUrl(url),
signal: controller.signal,
});
if (!res.ok && extra.throwErrorWhenResponseNotOk) {
throw new StatusError(`${res.status} ${res.statusText}`, res.status, res.statusText);
}
return res;
}
}

View File

@@ -9,6 +9,14 @@ export type IImage = {
type: string;
};
export type IImageStream = {
data: Readable;
ext: string | null;
type: string;
};
export type IImageStreamable = IImage | IImageStream;
export const webpDefault: sharp.WebpOptions = {
quality: 85,
alphaQuality: 95,
@@ -19,6 +27,7 @@ export const webpDefault: sharp.WebpOptions = {
};
import { bindThis } from '@/decorators.js';
import { Readable } from 'node:stream';
@Injectable()
export class ImageProcessingService {
@@ -64,7 +73,7 @@ export class ImageProcessingService {
*/
@bindThis
public async convertToWebp(path: string, width: number, height: number, options: sharp.WebpOptions = webpDefault): Promise<IImage> {
return this.convertSharpToWebp(await sharp(path), width, height, options);
return this.convertSharpToWebp(sharp(path), width, height, options);
}
@bindThis
@@ -85,6 +94,27 @@ export class ImageProcessingService {
};
}
@bindThis
public convertToWebpStream(path: string, width: number, height: number, options: sharp.WebpOptions = webpDefault): IImageStream {
return this.convertSharpToWebpStream(sharp(path), width, height, options);
}
@bindThis
public convertSharpToWebpStream(sharp: sharp.Sharp, width: number, height: number, options: sharp.WebpOptions = webpDefault): IImageStream {
const data = sharp
.resize(width, height, {
fit: 'inside',
withoutEnlargement: true,
})
.rotate()
.webp(options)
return {
data,
ext: 'webp',
type: 'image/webp',
};
}
/**
* Convert to PNG
* with resize, remove metadata, resolve orientation, stop animation

View File

@@ -1,5 +1,4 @@
import { Inject, Injectable } from '@nestjs/common';
import * as SyslogPro from 'syslog-pro';
import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js';
import Logger from '@/logger.js';
@@ -8,29 +7,14 @@ import type { KEYWORD } from 'color-convert/conversions';
@Injectable()
export class LoggerService {
private syslogClient;
constructor(
@Inject(DI.config)
private config: Config,
) {
if (this.config.syslog) {
this.syslogClient = new SyslogPro.RFC5424({
applicationName: 'Misskey',
timestamp: true,
includeStructuredData: true,
color: true,
extendedColor: true,
server: {
target: config.syslog.host,
port: config.syslog.port,
},
});
}
}
@bindThis
public getLogger(domain: string, color?: KEYWORD | undefined, store?: boolean) {
return new Logger(domain, color, store, this.syslogClient);
return new Logger(domain, color, store);
}
}

View File

@@ -175,7 +175,7 @@ export class NoteCreateService {
private userEntityService: UserEntityService,
private noteEntityService: NoteEntityService,
private idService: IdService,
private globalEventServie: GlobalEventService,
private globalEventService: GlobalEventService,
private queueService: QueueService,
private noteReadService: NoteReadService,
private createNotificationService: CreateNotificationService,
@@ -535,7 +535,7 @@ export class NoteCreateService {
// Pack the note
const noteObj = await this.noteEntityService.pack(note);
this.globalEventServie.publishNotesStream(noteObj);
this.globalEventService.publishNotesStream(noteObj);
this.webhookService.getActiveWebhooks().then(webhooks => {
webhooks = webhooks.filter(x => x.userId === user.id && x.on.includes('note'));
@@ -561,7 +561,7 @@ export class NoteCreateService {
if (!threadMuted) {
nm.push(data.reply.userId, 'reply');
this.globalEventServie.publishMainStream(data.reply.userId, 'reply', noteObj);
this.globalEventService.publishMainStream(data.reply.userId, 'reply', noteObj);
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === data.reply!.userId && x.on.includes('reply'));
for (const webhook of webhooks) {
@@ -584,7 +584,7 @@ export class NoteCreateService {
// Publish event
if ((user.id !== data.renote.userId) && data.renote.userHost === null) {
this.globalEventServie.publishMainStream(data.renote.userId, 'renote', noteObj);
this.globalEventService.publishMainStream(data.renote.userId, 'renote', noteObj);
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === data.renote!.userId && x.on.includes('renote'));
for (const webhook of webhooks) {
@@ -684,7 +684,7 @@ export class NoteCreateService {
detail: true,
});
this.globalEventServie.publishMainStream(u.id, 'mention', detailPackedNote);
this.globalEventService.publishMainStream(u.id, 'mention', detailPackedNote);
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === u.id && x.on.includes('mention'));
for (const webhook of webhooks) {

View File

@@ -34,7 +34,7 @@ export class NoteDeleteService {
private userEntityService: UserEntityService,
private noteEntityService: NoteEntityService,
private globalEventServie: GlobalEventService,
private globalEventService: GlobalEventService,
private relayService: RelayService,
private federatedInstanceService: FederatedInstanceService,
private apRendererService: ApRendererService,
@@ -63,7 +63,7 @@ export class NoteDeleteService {
}
if (!quiet) {
this.globalEventServie.publishNoteStream(note.id, 'deleted', {
this.globalEventService.publishNoteStream(note.id, 'deleted', {
deletedAt: deletedAt,
});

View File

@@ -9,9 +9,9 @@ import { IdService } from '@/core/IdService.js';
import { GlobalEventService } from '@/core/GlobalEventService.js';
import type { UsersRepository, NoteUnreadsRepository, MutingsRepository, NoteThreadMutingsRepository, FollowingsRepository, ChannelFollowingsRepository, AntennaNotesRepository } from '@/models/index.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { bindThis } from '@/decorators.js';
import { NotificationService } from './NotificationService.js';
import { AntennaService } from './AntennaService.js';
import { bindThis } from '@/decorators.js';
import { PushNotificationService } from './PushNotificationService.js';
@Injectable()
@@ -40,7 +40,7 @@ export class NoteReadService {
private userEntityService: UserEntityService,
private idService: IdService,
private globalEventServie: GlobalEventService,
private globalEventService: GlobalEventService,
private notificationService: NotificationService,
private antennaService: AntennaService,
private pushNotificationService: PushNotificationService,
@@ -87,13 +87,13 @@ export class NoteReadService {
if (exist == null) return;
if (params.isMentioned) {
this.globalEventServie.publishMainStream(userId, 'unreadMention', note.id);
this.globalEventService.publishMainStream(userId, 'unreadMention', note.id);
}
if (params.isSpecified) {
this.globalEventServie.publishMainStream(userId, 'unreadSpecifiedNote', note.id);
this.globalEventService.publishMainStream(userId, 'unreadSpecifiedNote', note.id);
}
if (note.channelId) {
this.globalEventServie.publishMainStream(userId, 'unreadChannel', note.id);
this.globalEventService.publishMainStream(userId, 'unreadChannel', note.id);
}
}, 2000);
}
@@ -107,12 +107,6 @@ export class NoteReadService {
followingChannels: Set<Channel['id']>;
},
): Promise<void> {
const following = info?.following ? info.following : new Set<string>((await this.followingsRepository.find({
where: {
followerId: userId,
},
select: ['followeeId'],
})).map(x => x.followeeId));
const followingChannels = info?.followingChannels ? info.followingChannels : new Set<string>((await this.channelFollowingsRepository.find({
where: {
followerId: userId,
@@ -139,7 +133,7 @@ export class NoteReadService {
if (note.user != null) { // たぶんnullになることは無いはずだけど一応
for (const antenna of myAntennas) {
if (await this.antennaService.checkHitAntenna(antenna, note, note.user, undefined, Array.from(following))) {
if (await this.antennaService.checkHitAntenna(antenna, note, note.user)) {
readAntennaNotes.push(note);
}
}
@@ -161,7 +155,7 @@ export class NoteReadService {
}).then(mentionsCount => {
if (mentionsCount === 0) {
// 全て既読になったイベントを発行
this.globalEventServie.publishMainStream(userId, 'readAllUnreadMentions');
this.globalEventService.publishMainStream(userId, 'readAllUnreadMentions');
}
});
@@ -171,7 +165,7 @@ export class NoteReadService {
}).then(specifiedCount => {
if (specifiedCount === 0) {
// 全て既読になったイベントを発行
this.globalEventServie.publishMainStream(userId, 'readAllUnreadSpecifiedNotes');
this.globalEventService.publishMainStream(userId, 'readAllUnreadSpecifiedNotes');
}
});
@@ -181,7 +175,7 @@ export class NoteReadService {
}).then(channelNoteCount => {
if (channelNoteCount === 0) {
// 全て既読になったイベントを発行
this.globalEventServie.publishMainStream(userId, 'readAllChannels');
this.globalEventService.publishMainStream(userId, 'readAllChannels');
}
});
@@ -206,14 +200,14 @@ export class NoteReadService {
});
if (count === 0) {
this.globalEventServie.publishMainStream(userId, 'readAntenna', antenna);
this.globalEventService.publishMainStream(userId, 'readAntenna', antenna);
this.pushNotificationService.pushNotification(userId, 'readAntenna', { antennaId: antenna.id });
}
}
this.userEntityService.getHasUnreadAntenna(userId).then(unread => {
if (!unread) {
this.globalEventServie.publishMainStream(userId, 'readAllAntennas');
this.globalEventService.publishMainStream(userId, 'readAllAntennas');
this.pushNotificationService.pushNotification(userId, 'readAllAntennas', undefined);
}
});

View File

@@ -1,17 +1,17 @@
import { Inject, Injectable } from '@nestjs/common';
import { Not } from 'typeorm';
import { DI } from '@/di-symbols.js';
import type { NotesRepository, UsersRepository, BlockingsRepository, PollsRepository, PollVotesRepository } from '@/models/index.js';
import type { NotesRepository, UsersRepository, PollsRepository, PollVotesRepository } from '@/models/index.js';
import type { Note } from '@/models/entities/Note.js';
import { RelayService } from '@/core/RelayService.js';
import type { CacheableUser } from '@/models/entities/User.js';
import { IdService } from '@/core/IdService.js';
import { GlobalEventService } from '@/core/GlobalEventService.js';
import { CreateNotificationService } from '@/core/CreateNotificationService.js';
import { ApRendererService } from '@/core/activitypub/ApRendererService.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { ApDeliverManagerService } from '@/core/activitypub/ApDeliverManagerService.js';
import { bindThis } from '@/decorators.js';
import { UserBlockingService } from '@/core/UserBlockingService.js';
@Injectable()
export class PollService {
@@ -28,14 +28,11 @@ export class PollService {
@Inject(DI.pollVotesRepository)
private pollVotesRepository: PollVotesRepository,
@Inject(DI.blockingsRepository)
private blockingsRepository: BlockingsRepository,
private userEntityService: UserEntityService,
private idService: IdService,
private relayService: RelayService,
private globalEventServie: GlobalEventService,
private createNotificationService: CreateNotificationService,
private globalEventService: GlobalEventService,
private userBlockingService: UserBlockingService,
private apRendererService: ApRendererService,
private apDeliverManagerService: ApDeliverManagerService,
) {
@@ -52,11 +49,8 @@ export class PollService {
// Check blocking
if (note.userId !== user.id) {
const block = await this.blockingsRepository.findOneBy({
blockerId: note.userId,
blockeeId: user.id,
});
if (block) {
const blocked = await this.userBlockingService.checkBlocked(note.userId, user.id);
if (blocked) {
throw new Error('blocked');
}
}
@@ -88,7 +82,7 @@ export class PollService {
const index = choice + 1; // In SQL, array index is 1 based
await this.pollsRepository.query(`UPDATE poll SET votes[${index}] = votes[${index}] + 1 WHERE "noteId" = '${poll.noteId}'`);
this.globalEventServie.publishNoteStream(note.id, 'pollVoted', {
this.globalEventService.publishNoteStream(note.id, 'pollVoted', {
choice: choice,
userId: user.id,
});

View File

@@ -1,10 +1,10 @@
import { Inject, Injectable } from '@nestjs/common';
import { Brackets } from 'typeorm';
import { Brackets, ObjectLiteral } from 'typeorm';
import { DI } from '@/di-symbols.js';
import type { User } from '@/models/entities/User.js';
import type { UserProfilesRepository, FollowingsRepository, ChannelFollowingsRepository, MutedNotesRepository, BlockingsRepository, NoteThreadMutingsRepository, MutingsRepository } from '@/models/index.js';
import type { SelectQueryBuilder } from 'typeorm';
import { bindThis } from '@/decorators.js';
import type { SelectQueryBuilder } from 'typeorm';
@Injectable()
export class QueryService {
@@ -32,7 +32,7 @@ export class QueryService {
) {
}
public makePaginationQuery<T>(q: SelectQueryBuilder<T>, sinceId?: string, untilId?: string, sinceDate?: number, untilDate?: number): SelectQueryBuilder<T> {
public makePaginationQuery<T extends ObjectLiteral>(q: SelectQueryBuilder<T>, sinceId?: string, untilId?: string, sinceDate?: number, untilDate?: number): SelectQueryBuilder<T> {
if (sinceId && untilId) {
q.andWhere(`${q.alias}.id > :sinceId`, { sinceId: sinceId });
q.andWhere(`${q.alias}.id < :untilId`, { untilId: untilId });

View File

@@ -18,7 +18,8 @@ import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { ApRendererService } from '@/core/activitypub/ApRendererService.js';
import { MetaService } from '@/core/MetaService.js';
import { bindThis } from '@/decorators.js';
import { UtilityService } from './UtilityService.js';
import { UtilityService } from '@/core/UtilityService.js';
import { UserBlockingService } from '@/core/UserBlockingService.js';
const legacies: Record<string, string> = {
'like': '👍',
@@ -73,8 +74,9 @@ export class ReactionService {
private metaService: MetaService,
private userEntityService: UserEntityService,
private noteEntityService: NoteEntityService,
private userBlockingService: UserBlockingService,
private idService: IdService,
private globalEventServie: GlobalEventService,
private globalEventService: GlobalEventService,
private apRendererService: ApRendererService,
private apDeliverManagerService: ApDeliverManagerService,
private createNotificationService: CreateNotificationService,
@@ -86,11 +88,8 @@ export class ReactionService {
public async create(user: { id: User['id']; host: User['host']; isBot: User['isBot'] }, note: Note, reaction?: string) {
// Check blocking
if (note.userId !== user.id) {
const block = await this.blockingsRepository.findOneBy({
blockerId: note.userId,
blockeeId: user.id,
});
if (block) {
const blocked = await this.userBlockingService.checkBlocked(note.userId, user.id);
if (blocked) {
throw new IdentifiableError('e70412a4-7197-4726-8e74-f3e0deb92aa7');
}
}
@@ -157,7 +156,7 @@ export class ReactionService {
select: ['name', 'host', 'originalUrl', 'publicUrl'],
});
this.globalEventServie.publishNoteStream(note.id, 'reacted', {
this.globalEventService.publishNoteStream(note.id, 'reacted', {
reaction: decodedReaction.reaction,
emoji: emoji != null ? {
name: emoji.host ? `${emoji.name}@${emoji.host}` : `${emoji.name}@.`,
@@ -229,7 +228,7 @@ export class ReactionService {
if (!user.isBot) this.notesRepository.decrement({ id: note.id }, 'score', 1);
this.globalEventServie.publishNoteStream(note.id, 'unreacted', {
this.globalEventService.publishNoteStream(note.id, 'unreacted', {
reaction: this.decodeReaction(exist.reaction).reaction,
userId: user.id,
});

View File

@@ -91,10 +91,12 @@ export class RoleService implements OnApplicationShutdown {
case 'roleCreated': {
const cached = this.rolesCache.get(null);
if (cached) {
body.createdAt = new Date(body.createdAt);
body.updatedAt = new Date(body.updatedAt);
body.lastUsedAt = new Date(body.lastUsedAt);
cached.push(body);
cached.push({
...body,
createdAt: new Date(body.createdAt),
updatedAt: new Date(body.updatedAt),
lastUsedAt: new Date(body.lastUsedAt),
});
}
break;
}
@@ -103,10 +105,12 @@ export class RoleService implements OnApplicationShutdown {
if (cached) {
const i = cached.findIndex(x => x.id === body.id);
if (i > -1) {
body.createdAt = new Date(body.createdAt);
body.updatedAt = new Date(body.updatedAt);
body.lastUsedAt = new Date(body.lastUsedAt);
cached[i] = body;
cached[i] = {
...body,
createdAt: new Date(body.createdAt),
updatedAt: new Date(body.updatedAt),
lastUsedAt: new Date(body.lastUsedAt),
};
}
}
break;
@@ -121,8 +125,10 @@ export class RoleService implements OnApplicationShutdown {
case 'userRoleAssigned': {
const cached = this.roleAssignmentByUserIdCache.get(body.userId);
if (cached) {
body.createdAt = new Date(body.createdAt);
cached.push(body);
cached.push({
...body,
createdAt: new Date(body.createdAt),
});
}
break;
}
@@ -196,6 +202,25 @@ export class RoleService implements OnApplicationShutdown {
return [...assignedRoles, ...matchedCondRoles];
}
/**
* 指定ユーザーのバッジロール一覧取得
*/
@bindThis
public async getUserBadgeRoles(userId: User['id']) {
const assigns = await this.roleAssignmentByUserIdCache.fetch(userId, () => this.roleAssignmentsRepository.findBy({ userId }));
const assignedRoleIds = assigns.map(x => x.roleId);
const roles = await this.rolesCache.fetch(null, () => this.rolesRepository.findBy({}));
const assignedBadgeRoles = roles.filter(r => r.asBadge && assignedRoleIds.includes(r.id));
const badgeCondRoles = roles.filter(r => r.asBadge && (r.target === 'conditional'));
if (badgeCondRoles.length > 0) {
const user = roles.some(r => r.target === 'conditional') ? await this.userCacheService.findById(userId) : null;
const matchedBadgeCondRoles = badgeCondRoles.filter(r => this.evalCond(user!, r.condFormula));
return [...assignedBadgeRoles, ...matchedBadgeCondRoles];
} else {
return assignedBadgeRoles;
}
}
@bindThis
public async getUserPolicies(userId: User['id'] | null): Promise<RolePolicies> {
const meta = await this.metaService.fetch();

View File

@@ -33,7 +33,7 @@ export class S3Service {
? false
: meta.objectStorageS3ForcePathStyle,
httpOptions: {
agent: this.httpRequestService.getHttpAgentByUrl(new URL(u), !meta.objectStorageUseProxy),
agent: this.httpRequestService.getAgentByUrl(new URL(u), !meta.objectStorageUseProxy),
},
});
}

View File

@@ -1,5 +1,6 @@
import { Inject, Injectable } from '@nestjs/common';
import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';
import Redis from 'ioredis';
import { IdService } from '@/core/IdService.js';
import type { CacheableUser, User } from '@/models/entities/User.js';
import type { Blocking } from '@/models/entities/Blocking.js';
@@ -7,7 +8,6 @@ import { QueueService } from '@/core/QueueService.js';
import { GlobalEventService } from '@/core/GlobalEventService.js';
import PerUserFollowingChart from '@/core/chart/charts/per-user-following.js';
import { DI } from '@/di-symbols.js';
import logger from '@/logger.js';
import type { UsersRepository, FollowingsRepository, FollowRequestsRepository, BlockingsRepository, UserListsRepository, UserListJoiningsRepository } from '@/models/index.js';
import Logger from '@/logger.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
@@ -15,12 +15,20 @@ import { ApRendererService } from '@/core/activitypub/ApRendererService.js';
import { LoggerService } from '@/core/LoggerService.js';
import { WebhookService } from '@/core/WebhookService.js';
import { bindThis } from '@/decorators.js';
import { Cache } from '@/misc/cache.js';
import { StreamMessages } from '@/server/api/stream/types.js';
@Injectable()
export class UserBlockingService {
export class UserBlockingService implements OnApplicationShutdown {
private logger: Logger;
// キーがユーザーIDで、値がそのユーザーがブロックしているユーザーのIDのリストなキャッシュ
private blockingsByUserIdCache: Cache<User['id'][]>;
constructor(
@Inject(DI.redisSubscriber)
private redisSubscriber: Redis.Redis,
@Inject(DI.usersRepository)
private usersRepository: UsersRepository,
@@ -42,13 +50,44 @@ export class UserBlockingService {
private userEntityService: UserEntityService,
private idService: IdService,
private queueService: QueueService,
private globalEventServie: GlobalEventService,
private globalEventService: GlobalEventService,
private webhookService: WebhookService,
private apRendererService: ApRendererService,
private perUserFollowingChart: PerUserFollowingChart,
private loggerService: LoggerService,
) {
this.logger = this.loggerService.getLogger('user-block');
this.blockingsByUserIdCache = new Cache<User['id'][]>(Infinity);
this.redisSubscriber.on('message', this.onMessage);
}
@bindThis
private async onMessage(_: string, data: string): Promise<void> {
const obj = JSON.parse(data);
if (obj.channel === 'internal') {
const { type, body } = obj.message as StreamMessages['internal']['payload'];
switch (type) {
case 'blockingCreated': {
const cached = this.blockingsByUserIdCache.get(body.blockerId);
if (cached) {
this.blockingsByUserIdCache.set(body.blockerId, [...cached, ...[body.blockeeId]]);
}
break;
}
case 'blockingDeleted': {
const cached = this.blockingsByUserIdCache.get(body.blockerId);
if (cached) {
this.blockingsByUserIdCache.set(body.blockerId, cached.filter(x => x !== body.blockeeId));
}
break;
}
default:
break;
}
}
}
@bindThis
@@ -72,6 +111,11 @@ export class UserBlockingService {
await this.blockingsRepository.insert(blocking);
this.globalEventService.publishInternalEvent('blockingCreated', {
blockerId: blocker.id,
blockeeId: blockee.id,
});
if (this.userEntityService.isLocalUser(blocker) && this.userEntityService.isRemoteUser(blockee)) {
const content = this.apRendererService.renderActivity(this.apRendererService.renderBlock(blocking));
this.queueService.deliver(blocker, content, blockee.inbox);
@@ -97,15 +141,15 @@ export class UserBlockingService {
if (this.userEntityService.isLocalUser(followee)) {
this.userEntityService.pack(followee, followee, {
detail: true,
}).then(packed => this.globalEventServie.publishMainStream(followee.id, 'meUpdated', packed));
}).then(packed => this.globalEventService.publishMainStream(followee.id, 'meUpdated', packed));
}
if (this.userEntityService.isLocalUser(follower)) {
this.userEntityService.pack(followee, follower, {
detail: true,
}).then(async packed => {
this.globalEventServie.publishUserEvent(follower.id, 'unfollow', packed);
this.globalEventServie.publishMainStream(follower.id, 'unfollow', packed);
this.globalEventService.publishUserEvent(follower.id, 'unfollow', packed);
this.globalEventService.publishMainStream(follower.id, 'unfollow', packed);
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('unfollow'));
for (const webhook of webhooks) {
@@ -152,8 +196,8 @@ export class UserBlockingService {
this.userEntityService.pack(followee, follower, {
detail: true,
}).then(async packed => {
this.globalEventServie.publishUserEvent(follower.id, 'unfollow', packed);
this.globalEventServie.publishMainStream(follower.id, 'unfollow', packed);
this.globalEventService.publishUserEvent(follower.id, 'unfollow', packed);
this.globalEventService.publishMainStream(follower.id, 'unfollow', packed);
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('unfollow'));
for (const webhook of webhooks) {
@@ -210,10 +254,31 @@ export class UserBlockingService {
await this.blockingsRepository.delete(blocking.id);
this.globalEventService.publishInternalEvent('blockingDeleted', {
blockerId: blocker.id,
blockeeId: blockee.id,
});
// deliver if remote bloking
if (this.userEntityService.isLocalUser(blocker) && this.userEntityService.isRemoteUser(blockee)) {
const content = this.apRendererService.renderActivity(this.apRendererService.renderUndo(this.apRendererService.renderBlock(blocking), blocker));
this.queueService.deliver(blocker, content, blockee.inbox);
}
}
@bindThis
public async checkBlocked(blockerId: User['id'], blockeeId: User['id']): Promise<boolean> {
const blockedUserIds = await this.blockingsByUserIdCache.fetch(blockerId, () => this.blockingsRepository.find({
where: {
blockerId,
},
select: ['blockeeId'],
}).then(records => records.map(record => record.blockeeId)));
return blockedUserIds.includes(blockeeId);
}
@bindThis
public onApplicationShutdown(signal?: string | undefined) {
this.redisSubscriber.off('message', this.onMessage);
}
}

View File

@@ -12,10 +12,11 @@ import { FederatedInstanceService } from '@/core/FederatedInstanceService.js';
import { WebhookService } from '@/core/WebhookService.js';
import { CreateNotificationService } from '@/core/CreateNotificationService.js';
import { DI } from '@/di-symbols.js';
import type { BlockingsRepository, FollowingsRepository, FollowRequestsRepository, InstancesRepository, UserProfilesRepository, UsersRepository } from '@/models/index.js';
import type { FollowingsRepository, FollowRequestsRepository, InstancesRepository, UserProfilesRepository, UsersRepository } from '@/models/index.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { ApRendererService } from '@/core/activitypub/ApRendererService.js';
import { bindThis } from '@/decorators.js';
import { UserBlockingService } from '@/core/UserBlockingService.js';
import Logger from '../logger.js';
const logger = new Logger('following/create');
@@ -48,21 +49,18 @@ export class UserFollowingService {
@Inject(DI.followRequestsRepository)
private followRequestsRepository: FollowRequestsRepository,
@Inject(DI.blockingsRepository)
private blockingsRepository: BlockingsRepository,
@Inject(DI.instancesRepository)
private instancesRepository: InstancesRepository,
private userEntityService: UserEntityService,
private userBlockingService: UserBlockingService,
private idService: IdService,
private queueService: QueueService,
private globalEventServie: GlobalEventService,
private globalEventService: GlobalEventService,
private createNotificationService: CreateNotificationService,
private federatedInstanceService: FederatedInstanceService,
private webhookService: WebhookService,
private apRendererService: ApRendererService,
private globalEventService: GlobalEventService,
private perUserFollowingChart: PerUserFollowingChart,
private instanceChart: InstanceChart,
) {
@@ -77,28 +75,22 @@ export class UserFollowingService {
// check blocking
const [blocking, blocked] = await Promise.all([
this.blockingsRepository.findOneBy({
blockerId: follower.id,
blockeeId: followee.id,
}),
this.blockingsRepository.findOneBy({
blockerId: followee.id,
blockeeId: follower.id,
}),
this.userBlockingService.checkBlocked(follower.id, followee.id),
this.userBlockingService.checkBlocked(followee.id, follower.id),
]);
if (this.userEntityService.isRemoteUser(follower) && this.userEntityService.isLocalUser(followee) && blocked) {
// リモートフォローを受けてブロックしていた場合は、エラーにするのではなくRejectを送り返しておしまい。
// リモートフォローを受けてブロックしていた場合は、エラーにするのではなくRejectを送り返しておしまい。
const content = this.apRendererService.renderActivity(this.apRendererService.renderReject(this.apRendererService.renderFollow(follower, followee, requestId), followee));
this.queueService.deliver(followee, content, follower.inbox);
return;
} else if (this.userEntityService.isRemoteUser(follower) && this.userEntityService.isLocalUser(followee) && blocking) {
// リモートフォローを受けてブロックされているはずの場合だったら、ブロック解除しておく。
await this.blockingsRepository.delete(blocking.id);
// リモートフォローを受けてブロックされているはずの場合だったら、ブロック解除しておく。
await this.userBlockingService.unblock(follower, followee);
} else {
// それ以外は単純に例外
if (blocking != null) throw new IdentifiableError('710e8fb0-b8c3-4922-be49-d5d93d8e6a6e', 'blocking');
if (blocked != null) throw new IdentifiableError('3338392a-f764-498d-8855-db939dcf8c48', 'blocked');
// それ以外は単純に例外
if (blocking) throw new IdentifiableError('710e8fb0-b8c3-4922-be49-d5d93d8e6a6e', 'blocking');
if (blocked) throw new IdentifiableError('3338392a-f764-498d-8855-db939dcf8c48', 'blocked');
}
const followeeProfile = await this.userProfilesRepository.findOneByOrFail({ userId: followee.id });
@@ -227,8 +219,8 @@ export class UserFollowingService {
this.userEntityService.pack(followee.id, follower, {
detail: true,
}).then(async packed => {
this.globalEventServie.publishUserEvent(follower.id, 'follow', packed as Packed<'UserDetailedNotMe'>);
this.globalEventServie.publishMainStream(follower.id, 'follow', packed as Packed<'UserDetailedNotMe'>);
this.globalEventService.publishUserEvent(follower.id, 'follow', packed as Packed<'UserDetailedNotMe'>);
this.globalEventService.publishMainStream(follower.id, 'follow', packed as Packed<'UserDetailedNotMe'>);
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('follow'));
for (const webhook of webhooks) {
@@ -242,7 +234,7 @@ export class UserFollowingService {
// Publish followed event
if (this.userEntityService.isLocalUser(followee)) {
this.userEntityService.pack(follower.id, followee).then(async packed => {
this.globalEventServie.publishMainStream(followee.id, 'followed', packed);
this.globalEventService.publishMainStream(followee.id, 'followed', packed);
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === followee.id && x.on.includes('followed'));
for (const webhook of webhooks) {
@@ -288,8 +280,8 @@ export class UserFollowingService {
this.userEntityService.pack(followee.id, follower, {
detail: true,
}).then(async packed => {
this.globalEventServie.publishUserEvent(follower.id, 'unfollow', packed);
this.globalEventServie.publishMainStream(follower.id, 'unfollow', packed);
this.globalEventService.publishUserEvent(follower.id, 'unfollow', packed);
this.globalEventService.publishMainStream(follower.id, 'unfollow', packed);
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('unfollow'));
for (const webhook of webhooks) {
@@ -357,18 +349,12 @@ export class UserFollowingService {
// check blocking
const [blocking, blocked] = await Promise.all([
this.blockingsRepository.findOneBy({
blockerId: follower.id,
blockeeId: followee.id,
}),
this.blockingsRepository.findOneBy({
blockerId: followee.id,
blockeeId: follower.id,
}),
this.userBlockingService.checkBlocked(follower.id, followee.id),
this.userBlockingService.checkBlocked(followee.id, follower.id),
]);
if (blocking != null) throw new Error('blocking');
if (blocked != null) throw new Error('blocked');
if (blocking) throw new Error('blocking');
if (blocked) throw new Error('blocked');
const followRequest = await this.followRequestsRepository.insert({
id: this.idService.genId(),
@@ -388,11 +374,11 @@ export class UserFollowingService {
// Publish receiveRequest event
if (this.userEntityService.isLocalUser(followee)) {
this.userEntityService.pack(follower.id, followee).then(packed => this.globalEventServie.publishMainStream(followee.id, 'receiveFollowRequest', packed));
this.userEntityService.pack(follower.id, followee).then(packed => this.globalEventService.publishMainStream(followee.id, 'receiveFollowRequest', packed));
this.userEntityService.pack(followee.id, followee, {
detail: true,
}).then(packed => this.globalEventServie.publishMainStream(followee.id, 'meUpdated', packed));
}).then(packed => this.globalEventService.publishMainStream(followee.id, 'meUpdated', packed));
// 通知を作成
this.createNotificationService.createNotification(followee.id, 'receiveFollowRequest', {
@@ -440,7 +426,7 @@ export class UserFollowingService {
this.userEntityService.pack(followee.id, followee, {
detail: true,
}).then(packed => this.globalEventServie.publishMainStream(followee.id, 'meUpdated', packed));
}).then(packed => this.globalEventService.publishMainStream(followee.id, 'meUpdated', packed));
}
@bindThis
@@ -468,7 +454,7 @@ export class UserFollowingService {
this.userEntityService.pack(followee.id, followee, {
detail: true,
}).then(packed => this.globalEventServie.publishMainStream(followee.id, 'meUpdated', packed));
}).then(packed => this.globalEventService.publishMainStream(followee.id, 'meUpdated', packed));
}
@bindThis
@@ -583,8 +569,8 @@ export class UserFollowingService {
detail: true,
});
this.globalEventServie.publishUserEvent(follower.id, 'unfollow', packedFollowee);
this.globalEventServie.publishMainStream(follower.id, 'unfollow', packedFollowee);
this.globalEventService.publishUserEvent(follower.id, 'unfollow', packedFollowee);
this.globalEventService.publishMainStream(follower.id, 'unfollow', packedFollowee);
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('unfollow'));
for (const webhook of webhooks) {

View File

@@ -25,7 +25,7 @@ export class UserListService {
private idService: IdService,
private userFollowingService: UserFollowingService,
private roleService: RoleService,
private globalEventServie: GlobalEventService,
private globalEventService: GlobalEventService,
private proxyAccountService: ProxyAccountService,
) {
}
@@ -46,7 +46,7 @@ export class UserListService {
userListId: list.id,
} as UserListJoining);
this.globalEventServie.publishUserListStream(list.id, 'userAdded', await this.userEntityService.pack(target));
this.globalEventService.publishUserListStream(list.id, 'userAdded', await this.userEntityService.pack(target));
// このインスタンス内にこのリモートユーザーをフォローしているユーザーがいなくても投稿を受け取るためにダミーのユーザーがフォローしたということにする
if (this.userEntityService.isRemoteUser(target)) {

View File

@@ -18,7 +18,7 @@ export class UserMutingService {
private idService: IdService,
private queueService: QueueService,
private globalEventServie: GlobalEventService,
private globalEventService: GlobalEventService,
) {
}

View File

@@ -44,16 +44,25 @@ export class WebhookService implements OnApplicationShutdown {
switch (type) {
case 'webhookCreated':
if (body.active) {
this.webhooks.push(body);
this.webhooks.push({
...body,
createdAt: new Date(body.createdAt),
});
}
break;
case 'webhookUpdated':
if (body.active) {
const i = this.webhooks.findIndex(a => a.id === body.id);
if (i > -1) {
this.webhooks[i] = body;
this.webhooks[i] = {
...body,
createdAt: new Date(body.createdAt),
};
} else {
this.webhooks.push(body);
this.webhooks.push({
...body,
createdAt: new Date(body.createdAt),
});
}
} else {
this.webhooks = this.webhooks.filter(a => a.id !== body.id);

View File

@@ -21,11 +21,11 @@ import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { DriveFileEntityService } from '@/core/entities/DriveFileEntityService.js';
import type { UserKeypair } from '@/models/entities/UserKeypair.js';
import type { UsersRepository, UserProfilesRepository, NotesRepository, DriveFilesRepository, EmojisRepository, PollsRepository } from '@/models/index.js';
import { bindThis } from '@/decorators.js';
import { LdSignatureService } from './LdSignatureService.js';
import { ApMfmService } from './ApMfmService.js';
import type { IActivity, IObject } from './type.js';
import type { IIdentifier } from './models/identifier.js';
import { bindThis } from '@/decorators.js';
@Injectable()
export class ApRendererService {
@@ -274,7 +274,7 @@ export class ApRendererService {
} as any;
if (reaction.startsWith(':')) {
const name = reaction.replace(/:/g, '');
const name = reaction.replaceAll(':', '');
const emoji = await this.emojisRepository.findOneBy({
name,
host: IsNull(),

View File

@@ -5,7 +5,7 @@ import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js';
import type { User } from '@/models/entities/User.js';
import { UserKeypairStoreService } from '@/core/UserKeypairStoreService.js';
import { HttpRequestService, UndiciFetcher } from '@/core/HttpRequestService.js';
import { HttpRequestService } from '@/core/HttpRequestService.js';
import { LoggerService } from '@/core/LoggerService.js';
import { bindThis } from '@/decorators.js';
import type Logger from '@/logger.js';
@@ -30,7 +30,6 @@ type PrivateKey = {
@Injectable()
export class ApRequestService {
private undiciFetcher: UndiciFetcher;
private logger: Logger;
constructor(
@@ -41,10 +40,8 @@ export class ApRequestService {
private httpRequestService: HttpRequestService,
private loggerService: LoggerService,
) {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
this.logger = this.loggerService?.getLogger('ap-request'); // なぜか TypeError: Cannot read properties of undefined (reading 'getLogger') と言われる
this.undiciFetcher = new UndiciFetcher(this.httpRequestService.getStandardUndiciFetcherOption({
maxRedirections: 0,
}), this.logger );
}
@bindThis
@@ -57,7 +54,7 @@ export class ApRequestService {
method: 'POST',
headers: this.objectAssignWithLcKey({
'Date': new Date().toUTCString(),
'Host': u.hostname,
'Host': u.host,
'Content-Type': 'application/activity+json',
'Digest': digestHeader,
}, args.additionalHeaders),
@@ -83,7 +80,7 @@ export class ApRequestService {
headers: this.objectAssignWithLcKey({
'Accept': 'application/activity+json, application/ld+json',
'Date': new Date().toUTCString(),
'Host': new URL(args.url).hostname,
'Host': new URL(args.url).host,
}, args.additionalHeaders),
};
@@ -106,6 +103,8 @@ export class ApRequestService {
request.headers = this.objectAssignWithLcKey(request.headers, {
Signature: signatureHeader,
});
// node-fetch will generate this for us. if we keep 'Host', it won't change with redirects!
delete request.headers['host'];
return {
request,
@@ -161,14 +160,11 @@ export class ApRequestService {
},
});
await this.undiciFetcher.fetch(
url,
{
method: req.request.method,
headers: req.request.headers,
body,
}
);
await this.httpRequestService.send(url, {
method: req.request.method,
headers: req.request.headers,
body,
});
}
/**
@@ -190,13 +186,10 @@ export class ApRequestService {
},
});
const res = await this.httpRequestService.fetch(
url,
{
method: req.request.method,
headers: req.request.headers,
}
);
const res = await this.httpRequestService.send(url, {
method: req.request.method,
headers: req.request.headers,
});
return await res.json();
}

View File

@@ -4,22 +4,21 @@ import { InstanceActorService } from '@/core/InstanceActorService.js';
import type { NotesRepository, PollsRepository, NoteReactionsRepository, UsersRepository } from '@/models/index.js';
import type { Config } from '@/config.js';
import { MetaService } from '@/core/MetaService.js';
import { HttpRequestService, UndiciFetcher } from '@/core/HttpRequestService.js';
import { HttpRequestService } from '@/core/HttpRequestService.js';
import { DI } from '@/di-symbols.js';
import { UtilityService } from '@/core/UtilityService.js';
import { bindThis } from '@/decorators.js';
import { LoggerService } from '@/core/LoggerService.js';
import type Logger from '@/logger.js';
import { isCollectionOrOrderedCollection } from './type.js';
import { ApDbResolverService } from './ApDbResolverService.js';
import { ApRendererService } from './ApRendererService.js';
import { ApRequestService } from './ApRequestService.js';
import { LoggerService } from '@/core/LoggerService.js';
import type { IObject, ICollection, IOrderedCollection } from './type.js';
import type Logger from '@/logger.js';
export class Resolver {
private history: Set<string>;
private user?: ILocalUser;
private undiciFetcher: UndiciFetcher;
private logger: Logger;
constructor(
@@ -39,10 +38,8 @@ export class Resolver {
private recursionLimit = 100,
) {
this.history = new Set();
this.logger = this.loggerService?.getLogger('ap-resolve'); // なぜか TypeError: Cannot read properties of undefined (reading 'getLogger') と言われる
this.undiciFetcher = new UndiciFetcher(this.httpRequestService.getStandardUndiciFetcherOption({
maxRedirections: 0,
}), this.logger);
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
this.logger = this.loggerService?.getLogger('ap-resolve'); // なぜか TypeError: Cannot read properties of undefined (reading 'getLogger') と言われる
}
@bindThis
@@ -106,7 +103,7 @@ export class Resolver {
const object = (this.user
? await this.apRequestService.signedGet(value, this.user) as IObject
: await this.undiciFetcher.getJson<IObject>(value, 'application/activity+json, application/ld+json'));
: await this.httpRequestService.getJson(value, 'application/activity+json, application/ld+json')) as IObject;
if (object == null || (
Array.isArray(object['@context']) ?

View File

@@ -1,5 +1,6 @@
import * as crypto from 'node:crypto';
import { Inject, Injectable } from '@nestjs/common';
import jsonld from 'jsonld';
import { HttpRequestService } from '@/core/HttpRequestService.js';
import { bindThis } from '@/decorators.js';
import { CONTEXTS } from './misc/contexts.js';
@@ -9,7 +10,7 @@ import { CONTEXTS } from './misc/contexts.js';
class LdSignature {
public debug = false;
public preLoad = true;
public loderTimeout = 10 * 1000;
public loderTimeout = 5000;
constructor(
private httpRequestService: HttpRequestService,
@@ -84,7 +85,9 @@ class LdSignature {
@bindThis
public async normalize(data: any) {
const customLoader = this.getLoader();
return 42;
return await jsonld.normalize(data, {
documentLoader: customLoader,
});
}
@bindThis
@@ -115,19 +118,12 @@ class LdSignature {
@bindThis
private async fetchDocument(url: string) {
const json = await this.httpRequestService.fetch(
url,
{
headers: {
Accept: 'application/ld+json, application/json',
},
// TODO
//timeout: this.loderTimeout,
const json = await this.httpRequestService.send(url, {
headers: {
Accept: 'application/ld+json, application/json',
},
{
noOkError: true,
}
).then(res => {
timeout: this.loderTimeout,
}, { throwErrorWhenResponseNotOk: false }).then(res => {
if (!res.ok) {
throw `${res.status} ${res.statusText}`;
} else {

View File

@@ -48,6 +48,10 @@ export class ApImageService {
throw new Error('invalid image: url not privided');
}
if (!image.url.startsWith('https://')) {
throw new Error('invalid image: unexpected shcema of url: ' + image.url);
}
this.logger.info(`Creating the Image: ${image.url}`);
const instance = await this.metaService.fetch();

View File

@@ -1,8 +1,7 @@
import { forwardRef, Inject, Injectable } from '@nestjs/common';
import promiseLimit from 'promise-limit';
import { DI } from '@/di-symbols.js';
import type { MessagingMessagesRepository, PollsRepository, EmojisRepository } from '@/models/index.js';
import type { UsersRepository } from '@/models/index.js';
import type { MessagingMessagesRepository, PollsRepository, EmojisRepository, UsersRepository } from '@/models/index.js';
import type { Config } from '@/config.js';
import type { CacheableRemoteUser } from '@/models/entities/User.js';
import type { Note } from '@/models/entities/Note.js';
@@ -18,6 +17,7 @@ import { PollService } from '@/core/PollService.js';
import { StatusError } from '@/misc/status-error.js';
import { UtilityService } from '@/core/UtilityService.js';
import { MessagingService } from '@/core/MessagingService.js';
import { bindThis } from '@/decorators.js';
import { getOneApId, getApId, getOneApHrefNullable, validPost, isEmoji, getApType } from '../type.js';
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
import { ApLoggerService } from '../ApLoggerService.js';
@@ -32,7 +32,6 @@ import { ApQuestionService } from './ApQuestionService.js';
import { ApImageService } from './ApImageService.js';
import type { Resolver } from '../ApResolverService.js';
import type { IObject, IPost } from '../type.js';
import { bindThis } from '@/decorators.js';
@Injectable()
export class ApNoteService {
@@ -133,6 +132,16 @@ export class ApNoteService {
const note: IPost = object;
this.logger.debug(`Note fetched: ${JSON.stringify(note, null, 2)}`);
if (note.id && !note.id.startsWith('https://')) {
throw new Error('unexpected shcema of note.id: ' + note.id);
}
const url = getOneApHrefNullable(note.url);
if (url && !url.startsWith('https://')) {
throw new Error('unexpected shcema of note url: ' + url);
}
this.logger.info(`Creating the Note: ${note.id}`);
@@ -307,7 +316,7 @@ export class ApNoteService {
apEmojis,
poll,
uri: note.id,
url: getOneApHrefNullable(note.url),
url: url,
}, silent);
}

View File

@@ -29,6 +29,7 @@ import { UserNotePining } from '@/models/entities/UserNotePining.js';
import { StatusError } from '@/misc/status-error.js';
import type { UtilityService } from '@/core/UtilityService.js';
import type { UserEntityService } from '@/core/entities/UserEntityService.js';
import { bindThis } from '@/decorators.js';
import { getApId, getApType, getOneApHrefNullable, isActor, isCollection, isCollectionOrOrderedCollection, isPropertyValue } from '../type.js';
import { extractApHashtags } from './tag.js';
import type { OnModuleInit } from '@nestjs/common';
@@ -43,37 +44,6 @@ import type { IActor, IObject, IApPropertyValue } from '../type.js';
const nameLength = 128;
const summaryLength = 2048;
const services: {
[x: string]: (id: string, username: string) => any
} = {
'misskey:authentication:twitter': (userId, screenName) => ({ userId, screenName }),
'misskey:authentication:github': (id, login) => ({ id, login }),
'misskey:authentication:discord': (id, name) => $discord(id, name),
};
const $discord = (id: string, name: string) => {
if (typeof name !== 'string') {
name = 'unknown#0000';
}
const [username, discriminator] = name.split('#');
return { id, username, discriminator };
};
function addService(target: { [x: string]: any }, source: IApPropertyValue) {
const service = services[source.name];
if (typeof source.value !== 'string') {
source.value = 'unknown';
}
const [id, username] = source.value.split('@');
if (service) {
target[source.name.split(':')[2]] = service(id, username);
}
}
import { bindThis } from '@/decorators.js';
@Injectable()
export class ApPersonService implements OnModuleInit {
private utilityService: UtilityService;
@@ -282,6 +252,12 @@ export class ApPersonService implements OnModuleInit {
const bday = person['vcard:bday']?.match(/^\d{4}-\d{2}-\d{2}/);
const url = getOneApHrefNullable(person.url);
if (url && !url.startsWith('https://')) {
throw new Error('unexpected shcema of person url: ' + url);
}
// Create user
let user: IRemoteUser;
try {
@@ -313,7 +289,7 @@ export class ApPersonService implements OnModuleInit {
await transactionalEntityManager.save(new UserProfile({
userId: user.id,
description: person.summary ? this.apMfmService.htmlToMfm(truncate(person.summary, summaryLength), person.tag) : null,
url: getOneApHrefNullable(person.url),
url: url,
fields,
birthday: bday ? bday[0] : null,
location: person['vcard:Address'] ?? null,
@@ -455,6 +431,12 @@ export class ApPersonService implements OnModuleInit {
const bday = person['vcard:bday']?.match(/^\d{4}-\d{2}-\d{2}/);
const url = getOneApHrefNullable(person.url);
if (url && !url.startsWith('https://')) {
throw new Error('unexpected shcema of person url: ' + url);
}
const updates = {
lastFetchedAt: new Date(),
inbox: person.inbox,
@@ -489,7 +471,7 @@ export class ApPersonService implements OnModuleInit {
}
await this.userProfilesRepository.update({ userId: exist.id }, {
url: getOneApHrefNullable(person.url),
url: url,
fields,
description: person.summary ? this.apMfmService.htmlToMfm(truncate(person.summary, summaryLength), person.tag) : null,
birthday: bday ? bday[0] : null,
@@ -540,22 +522,16 @@ export class ApPersonService implements OnModuleInit {
name: string,
value: string
}[] = [];
const services: { [x: string]: any } = {};
if (Array.isArray(attachments)) {
for (const attachment of attachments.filter(isPropertyValue)) {
if (isPropertyValue(attachment.identifier)) {
addService(services, attachment.identifier);
} else {
fields.push({
name: attachment.name,
value: this.mfmService.fromHtml(attachment.value),
});
}
fields.push({
name: attachment.name,
value: this.mfmService.fromHtml(attachment.value),
});
}
}
return { fields, services };
return { fields };
}
@bindThis
@@ -566,22 +542,22 @@ export class ApPersonService implements OnModuleInit {
this.logger.info(`Updating the featured: ${user.uri}`);
if (resolver == null) resolver = this.apResolverService.createResolver();
const _resolver = resolver ?? this.apResolverService.createResolver();
// Resolve to (Ordered)Collection Object
const collection = await resolver.resolveCollection(user.featured);
const collection = await _resolver.resolveCollection(user.featured);
if (!isCollectionOrOrderedCollection(collection)) throw new Error('Object is not Collection or OrderedCollection');
// Resolve to Object(may be Note) arrays
const unresolvedItems = isCollection(collection) ? collection.items : collection.orderedItems;
const items = await Promise.all(toArray(unresolvedItems).map(x => resolver.resolve(x)));
const items = await Promise.all(toArray(unresolvedItems).map(x => _resolver.resolve(x)));
// Resolve and regist Notes
const limit = promiseLimit<Note | null>(2);
const featuredNotes = await Promise.all(items
.filter(item => getApType(item) === 'Note') // TODO: Noteでなくてもいいかも
.slice(0, 5)
.map(item => limit(() => this.apNoteService.resolveNote(item, resolver))));
.map(item => limit(() => this.apNoteService.resolveNote(item, _resolver))));
await this.db.transaction(async transactionalEntityManager => {
await transactionalEntityManager.delete(UserNotePining, { userId: user.id });

View File

@@ -10,7 +10,6 @@ import PerUserNotesChart from './charts/per-user-notes.js';
import PerUserPvChart from './charts/per-user-pv.js';
import DriveChart from './charts/drive.js';
import PerUserReactionsChart from './charts/per-user-reactions.js';
import HashtagChart from './charts/hashtag.js';
import PerUserFollowingChart from './charts/per-user-following.js';
import PerUserDriveChart from './charts/per-user-drive.js';
import ApRequestChart from './charts/ap-request.js';
@@ -31,7 +30,6 @@ export class ChartManagementService implements OnApplicationShutdown {
private perUserPvChart: PerUserPvChart,
private driveChart: DriveChart,
private perUserReactionsChart: PerUserReactionsChart,
private hashtagChart: HashtagChart,
private perUserFollowingChart: PerUserFollowingChart,
private perUserDriveChart: PerUserDriveChart,
private apRequestChart: ApRequestChart,
@@ -46,7 +44,6 @@ export class ChartManagementService implements OnApplicationShutdown {
this.perUserPvChart,
this.driveChart,
this.perUserReactionsChart,
this.hashtagChart,
this.perUserFollowingChart,
this.perUserDriveChart,
this.apRequestChart,
@@ -54,7 +51,7 @@ export class ChartManagementService implements OnApplicationShutdown {
}
@bindThis
public async run() {
public async start() {
// 20分おきにメモリ情報をDBに書き込み
this.saveIntervalId = setInterval(() => {
for (const chart of this.charts) {

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