Compare commits

..

229 Commits

Author SHA1 Message Date
github-actions[bot] 7a8c4817a8 Bump version to 2025.11.1-beta.3 2025-11-27 09:48:35 +00:00
かっこかり 825dcf7e3e Update CHANGELOG.md [ci skip] 2025-11-27 18:47:44 +09:00
syuilo 53e2be747d New Crowdin updates (#16846)
* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Catalan)

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

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Chinese Traditional)
2025-11-27 18:43:16 +09:00
かっこかり f10496645c fix(frontend/aiscript): 各種関数の引数で明示的にnullが指定されている場合のハンドリングを修正 (#16838)
* fix(frontend/aiscript): MkDialogのtitle, textでnull値を許容するように

* fix

* update aiscript and use new api

* fix

* fix
2025-11-27 18:43:00 +09:00
かっこかり 666e046399 Revert "fix(backend): clips/my-favorites APIをページネーションに対応させる (#16835)" (#16874)
* Revert "fix(backend): `clips/my-favorites` APIをページネーションに対応させる (#16835)"

This reverts commit 70fa621e22.

* fix
2025-11-27 18:40:54 +09:00
renovate[bot] f13a34bda4 fix(deps): update dependency js-yaml to v4.1.1 [security] [ci skip] (#16788)
* fix(deps): update dependency js-yaml to v4.1.1 [security]

* ✌️ [ci skip]

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
2025-11-27 16:24:01 +09:00
renovate[bot] 643fd0f22a fix(deps): update [backend] update dependencies [ci skip] (#16867)
* fix(deps): update [backend] update dependencies

* fix(deps): update [backend] update dependencies

* bump sentry node to fix type errors

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
2025-11-27 13:48:08 +09:00
github-actions[bot] d3aba01db2 Bump version to 2025.11.1-beta.2 2025-11-27 04:22:23 +00:00
syuilo 8fec44d0e9 refactor
Fix #16872
2025-11-27 13:00:11 +09:00
renovate[bot] 105cc4b50a fix(deps): update [frontend] update dependencies [ci skip] (#16868)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-26 21:40:24 +09:00
syuilo 1590a73d3d perf(backend): 必要になるまでnsfwjsを読み込まないように 2025-11-26 20:40:20 +09:00
renovate[bot] 18caa20969 fix(deps): update dependency glob to v11.1.0 [security] [ci skip] (#16861)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-26 20:35:29 +09:00
syuilo 1bb8447c73 enhance(frontend): Change default animatedMfm based on reduced motion preference
https://github.com/misskey-dev/misskey/commit/3f539916d9570e66ed92a9de95dfd2e41c38f391#commitcomment-171408344
2025-11-26 20:17:59 +09:00
github-actions[bot] df54bd92d0 Bump version to 2025.11.1-beta.1 2025-11-26 10:45:40 +00:00
syuilo 8cb37792c9 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2025-11-26 19:39:46 +09:00
syuilo 3f539916d9 enhance(frontend): GIF画像を再生するか・動くMFMを表示するかの設定でOSのアクセシビリティ設定を参照しないように
・OSのUIのアニメーション設定がMisskey内のGIFなどにまで連動して適用されるのは分かりにくい・期待しない動作との声が多いため
・動きのあるカスタム絵文字などのコンテンツはMisskeyの主要部分であり、それを止める設定は、本来の挙動に影響しない範囲でアニメーションを減らすアクセシビリティ設定とは趣旨が異なるため(OSでアニメーションを減らす設定を有効にしたからといってOSで動画の再生がされなくなるわけではないのと同じ)
2025-11-26 19:39:36 +09:00
renovate[bot] 415339b30b chore(deps): update [misskey-js] update dependencies [ci skip] (#16863)
* chore(deps): update [misskey-js] update dependencies

* update deps

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
2025-11-26 19:37:20 +09:00
syuilo de7cbb376e fix(frontend): 初回読み込み時にエラーになることがある問題を修正
Fix #16562
2025-11-26 19:26:27 +09:00
syuilo 6cb6f794e5 clean up 2025-11-26 19:14:40 +09:00
syuilo 236c235115 enhance(frontend): viewportの属性を起動後に変化させないことにより処理を簡略化+安定性向上 2025-11-26 19:12:03 +09:00
renovate[bot] 71808d3cc0 chore(deps): update [tools] update dependencies [ci skip] (#16865)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-26 19:00:05 +09:00
renovate[bot] 989c1b351a fix(deps): update [root] update dependencies [ci skip] (#16862)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-26 18:59:34 +09:00
かっこかり 0c5f61721a fix(frontend): フォロー申請のキャンセル時に確認ダイアログを出すように (#16834)
* fix(frontend): フォロー申請のキャンセル時に確認ダイアログを出すように

* Update Changelog

* fix: 注釈は書かない
2025-11-26 13:07:28 +09:00
github-actions[bot] e0e17a78f1 Bump version to 2025.11.1-beta.0 2025-11-26 01:01:54 +00:00
syuilo 2ad393ea45 fix(backend): ワードミュートの文字数計算を修正 2025-11-26 09:55:02 +09:00
syuilo cdf059cc11 chore(dev): use postgresql 18 (#16850) 2025-11-25 19:38:57 +09:00
renovate[bot] 0fdd88f38e fix(deps): update [frontend] update dependencies [ci skip] (#16802)
* fix(deps): update [frontend] update dependencies

* run pnpm dedupe

* [ci skip] run dedupe

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
2025-11-25 10:45:36 +09:00
github-actions[bot] 4679b2b34d Bump version to 2025.11.1-alpha.2 2025-11-25 01:33:05 +00:00
syuilo 052b1a6c76 Update CHANGELOG.md 2025-11-25 10:27:53 +09:00
syuilo fd15a7fc23 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2025-11-25 10:20:46 +09:00
syuilo b895088546 🎨 2025-11-25 10:20:36 +09:00
renovate[bot] 1e5592a5bd fix(deps): update [backend] update dependencies [ci skip] (#16801)
* fix(deps): update [backend] update dependencies

* fix types

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
2025-11-25 10:20:06 +09:00
syuilo c3ad46ad6f fix(frontend): ナビゲーションバーを下に表示しているときに、項目数が多いと表示が崩れる問題を修正 2025-11-25 09:46:07 +09:00
syuilo 8c7e1bd287 chore(backend): tweak message 2025-11-25 09:26:22 +09:00
かっこかり 043b9b3d26 fix(frontend): MkRadiosのslotでv-ifを使用すると空白のoptionが生成される問題を修正 (#16832)
* fix: MkRadiosのslotでv-ifを使用すると空白のoptionが生成される問題を修正 (MisskeyIO#1105)

* Update Changelog

* Update CHANGELOG.md

---------

Co-authored-by: あわわわとーにゅ <17376330+u1-liquid@users.noreply.github.com>
2025-11-25 08:56:30 +09:00
かっこかり 91dafc26a7 refactor(frontend/aiscript): AiScriptバージョン取得・判定ロジックを統一 (#16845)
* refactor(frontend): AiScriptバージョン取得・判定ロジックを統一

* fix
2025-11-25 07:23:21 +09:00
github-actions[bot] 4edd6a68e6 Bump version to 2025.11.1-alpha.1 2025-11-24 12:06:01 +00:00
かっこかり f801d1cf0b fix(backend): DBレプリケーションを利用する環境でクエリーが失敗する問題を修正 (#16842)
* fix: DBレプリケーションを利用する環境でクエリーが失敗する問題を修正 (MisskeyIO#1123)

* Update Changelog

---------

Co-authored-by: あわわわとーにゅ <17376330+u1-liquid@users.noreply.github.com>
2025-11-24 20:59:25 +09:00
かっこかり 42706970f2 fix(frontend): PlayのAiScriptバージョン判定が正しく動作しない問題を修正 (#16843)
* fix: aiscript 1.0.0 以外が全部レガシー扱いになる問題を修正 (MisskeyIO#1129)

* Update Changelog

---------

Co-authored-by: あわわわとーにゅ <17376330+u1-liquid@users.noreply.github.com>
2025-11-24 20:53:39 +09:00
syuilo 14730e429a New Crowdin updates (#16797)
* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Spanish)

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

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

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

* New translations ja-jp.yml (Italian)

* 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 (Spanish)
2025-11-24 17:40:29 +09:00
かっこかり 2ee04860fb enhance(frontend): preferenceのタブ間同期にBroadcast Channelを使用するように (#16819)
* enhance(frontend): preferenceのタブ間同期にBroadcast Channelを使用するように

* fix

* refactor: EventEmitterをextendする形に変更
2025-11-24 16:52:46 +09:00
github-actions[bot] 25afb5d279 Bump version to 2025.11.1-alpha.0 2025-11-24 03:05:55 +00:00
かっこかり c4f53aba3f fix(frontend): 一部のシチュエーションで投稿フォームのツアーが表示されない問題を修正 (#16837)
* fix(frontend): 一部のシチュエーションで投稿フォームのツアーが表示されない問題を修正

* Update Changelog

---------

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-11-24 11:18:01 +09:00
かっこかり 86e4f15e95 fix(frontend): リセットボタンでCWがリセットされない問題を修正 (#16820)
* fix(frontend): リセットボタンでCWがリセットされない問題を修正

* update changelog
2025-11-24 11:13:36 +09:00
かっこかり 6c190e7a5d fix(backend): チャンネルのリアルタイム更新で非ログイン時非表示設定が考慮されていない問題を修正 (#16833)
* fix(backend): チャンネルのリアルタイム更新でロックダウン設定が考慮されていない問題を修正

* Update Changelog

---------

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-11-24 11:11:59 +09:00
zyoshoka 1b46813e7a chore(dev): correct entrypoint path for embed on dev build (#16836) 2025-11-24 11:08:44 +09:00
syuilo 0ea0e05e61 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2025-11-24 11:01:19 +09:00
syuilo 015e680133 chore(backend/dev): remove cli-highlight dependency to reduce memory usage 2025-11-24 11:01:00 +09:00
かっこかり ea40a0756f fix(backend): DeepL翻訳のAPIキー指定方式変更に対応 (#16839)
* spec: DeepL Deprecation of query parameter and request body authentication (MisskeyIO#1096)

https://developers.deepl.com/docs/resources/breaking-changes-change-notices/november-2025-deprecation-of-legacy-auth-methods

* Update Changelog

* Update Changelog

* ✌️ [ci skip]

---------

Co-authored-by: あわわわとーにゅ <17376330+u1-liquid@users.noreply.github.com>
2025-11-24 10:59:50 +09:00
かっこかり 70fa621e22 fix(backend): clips/my-favorites APIをページネーションに対応させる (#16835)
* fix(backend): `clips/my-favorites` APIをページネーションに対応させる

* fix

* fix test

* fix
2025-11-23 22:41:14 +09:00
syuilo c741aa5d7d chore(dev): add start:inspect command for debugging 2025-11-21 10:04:16 +09:00
かっこかり 7afe0d44d1 fix(frontend): pageheaderの型を修正 (#16803) 2025-11-20 15:40:52 +09:00
果物リン e588615ea9 fix: ヘッダーメニューのチャンネルからチャンネルを新規作成の遷移先修正 (#16816)
* fix: ヘッダーメニューのチャンネルからチャンネルを新規作成の遷移先修正

* add changelog

---------

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-11-20 15:39:50 +09:00
かっこかり 7e56fed164 fix(frontend): ページのコンテンツがはみ出る問題を修正 (#16817)
* fix(frontend): ページのコンテンツがはみ出る問題を修正

* Update Changelog
2025-11-20 15:38:25 +09:00
kami8 9f810d701d enhance(frontend): リアクションの受け入れ設定にキャプションを追加 (#16807)
* enhance(frontend): リアクションの受け入れ設定にキャプションを追加

* Update Changelog

* CHANGELOG.mdを修正

* CHANGELOG.mdのコンフリクトを解消し、再度変更内容を記載

* 条件分岐をswitch文に変更

* chore: trigger CI re-run
2025-11-19 19:17:43 +09:00
おさむのひと 2f3421645a fix(devcontainer): devcontainerのバージョンアップ+Renovateでbump出来るように設定を追加 (#16793)
* fix(devcontainer): devcontainerのバージョンアップ+Renovateでbump出来るように設定を追加

* Update renovate.json5

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update renovate.json5

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix matchFileNames

* using trixie

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-11-19 12:34:27 +09:00
syuilo 4c0f215fc5 refactor 2025-11-18 16:23:57 +09:00
github-actions[bot] 449b00c934 [skip ci] Update CHANGELOG.md (prepend template) 2025-11-16 08:23:49 +00:00
github-actions[bot] cdcff3ede8 Release: 2025.11.0 2025-11-16 08:23:43 +00:00
syuilo 9d1c3f053c New Crowdin updates (#16781)
* New translations ja-jp.yml (Spanish)

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

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Korean)

* 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 (Catalan)

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

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

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

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Indonesian)

* New translations ja-jp.yml (Indonesian)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Italian)
2025-11-16 09:12:02 +09:00
github-actions[bot] 8c5d571975 Bump version to 2025.11.0-rc.0 2025-11-15 12:20:55 +00:00
おさむのひと c5e9f7add4 fix(ci): DockleのCIが落ちるのを修正 (#16794)
* fix(ci): DockleのCIが落ちるのを修正

* fix

* fix

* fix

* fix

* fix

* downgrade dockle

* fix
2025-11-15 21:04:45 +09:00
おさむのひと e15fdd05b7 fix(frontend): カスタム絵文字(β)画面で変更行が正しくハイライトされない問題を修正 (#16785)
* fix(frontend): カスタム絵文字(β)画面で変更行が正しくハイライトされない問題を修正

* rollback

* 詳細度->!important
2025-11-15 12:13:50 +09:00
おさむのひと 41e945b0ef fix(frontend): 投稿フォームのアバター画像が縮むのを修正 (#16790)
* fix(frontend): 投稿フォームのアバター画像が縮むのを修正

* fix CHANGELOG.md

* fix
2025-11-15 11:33:37 +09:00
syuilo f89faae0ab chore(frontend): add tip for preference restore 2025-11-13 14:11:38 +09:00
github-actions[bot] 67ca3d7e71 Bump version to 2025.11.0-beta.0 2025-11-12 10:51:11 +00:00
claustra01 2ac2e9e849 チャンネルの説明欄の最小文字数制約を除去する (#16782)
* chore: channelのdescriptionを空欄にできるようにする

* update: CHANGELOG.md

* update: CHANGELOG.md

* fix: CHANGELOG.md

* fix: CHANGELOG.md
2025-11-12 18:16:05 +09:00
claustra01 746269c4b1 RoleService.testがPostgreSQLのdeadlockでrandom failする問題を修正 (#16784)
* fix: 並列deleteによるpostgresqlのdeadlock

* chore: update comment
2025-11-12 18:15:08 +09:00
syuilo c059256bd6 Update ROADMAP with completed tasks 2025-11-11 09:30:13 +09:00
github-actions[bot] 2e17979abc Bump version to 2025.11.0-alpha.4 2025-11-10 10:08:33 +00:00
syuilo c2d95ebdcb New Crowdin updates (#16711)
* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Catalan)

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

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Italian)

* 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 (Romanian)

* New translations ja-jp.yml (French)

* 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 (Dutch)

* New translations ja-jp.yml (Norwegian)

* New translations ja-jp.yml (Polish)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Slovak)

* New translations ja-jp.yml (Swedish)

* New translations ja-jp.yml (Turkish)

* New translations ja-jp.yml (Ukrainian)

* 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 (Uzbek)

* New translations ja-jp.yml (Lao)

* New translations ja-jp.yml (Kabyle)

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

* New translations ja-jp.yml (Korean (Gyeongsang))

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

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Italian)

* 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 (Romanian)

* New translations ja-jp.yml (French)

* 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 (Dutch)

* New translations ja-jp.yml (Norwegian)

* New translations ja-jp.yml (Polish)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Slovak)

* New translations ja-jp.yml (Swedish)

* New translations ja-jp.yml (Turkish)

* New translations ja-jp.yml (Ukrainian)

* 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 (Uzbek)

* New translations ja-jp.yml (Lao)

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

* 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 (Chinese Traditional)

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

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Italian)

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

* New translations ja-jp.yml (English)

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

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

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (English)
2025-11-10 19:06:39 +09:00
かっこかり cb5de83bad Update lint.yml 2025-11-10 18:46:13 +09:00
syuilo 30d87d5532 Update lint.yml
https://github.com/misskey-dev/misskey/issues/16255
2025-11-10 18:43:03 +09:00
かっこかり 5c212c996a enhance(frontend): アンテナ・リストの設定画面・タイムラインの動線を改善 (#16739)
* enhance(frontend): アンテナ・リストの設定画面からタイムラインへの動線を追加

* Update Changelog

* fix
2025-11-10 17:22:13 +09:00
かっこかり 39e01b1dfe refactor(frontend): フロントエンドの型エラー解消 (#16779) 2025-11-10 16:52:42 +09:00
かっこかり fd2fe34270 refactor8frontend9: anyを除去 (#16778) 2025-11-10 15:33:54 +09:00
syuilo 73bcd330f7 fix(backend): improve isFederationAllowedHost 2025-11-10 14:09:15 +09:00
syuilo 23d2d191a0 chore(frontend): アニメーション画像設定をパフォーマンスセクションにも追加 2025-11-10 13:23:23 +09:00
おさむのひと ca1bf21dcf chore: RoleServiceのunit-test追加 (#16777) 2025-11-10 10:31:49 +09:00
syuilo 1ffc53f596 use esnext to avoid type error 2025-11-09 19:49:27 +09:00
syuilo 4e38f218ec fix type 2025-11-09 19:44:07 +09:00
syuilo a0d34940ff fix type 2025-11-09 19:43:19 +09:00
syuilo bdddd623b6 🎨 2025-11-09 19:31:41 +09:00
かっこかり 29bfc9a91a fix(frontend): postform tourをスキップできるように (#16767)
* fix(frontend): postform tourをスキップできるように

* use closable option
2025-11-09 16:23:58 +09:00
かっこかり 2e596607f8 Update CHANGELOG.md [ci skip] 2025-11-08 19:20:45 +09:00
renovate[bot] cf89280fc5 fix(deps): update dependency vite to v7.1.11 [security] (#16678)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-08 19:19:58 +09:00
かっこかり c0f4c47c53 fix(misskey-js): misskey-js autogen が動作しない問題を修正 (#16773)
* fix(misskey-js): misskey-js autogen が動作しない問題を修正

* rollback eslint-plugin to eliminate unwanted side-effects
2025-11-08 18:45:54 +09:00
renovate[bot] 58995e6b97 fix(deps): update [backend] update dependencies (#16771)
* fix(deps): update [backend] update dependencies

* run pnpm dedupe [ci skip]

* run pnpm dedupe [ci skip]

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
2025-11-08 17:53:12 +09:00
renovate[bot] d00ca499a3 chore(deps): update [misskey-js] update dependencies [ci skip] (#16768)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-08 17:49:05 +09:00
かっこかり ec1120bdaa fix(deps): update @typescript-eslint/* dependencies [ci skip] (#16772)
* fix(deps): update `@typescript-eslint/*` dependencies

* fix lint
2025-11-08 17:30:58 +09:00
renovate[bot] 3a65728fb4 fix(deps): update [frontend] update dependencies [ci skip] (#16769)
* fix(deps): update [frontend] update dependencies

* run ci

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
2025-11-08 16:22:38 +09:00
renovate[bot] e4c03b9f4e fix(deps): update dependency tar to v7.5.2 [security] [ci skip] (#16728)
* fix(deps): update dependency tar to v7.5.2 [security]

* regenerate lockfile

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
2025-11-08 16:17:53 +09:00
renovate[bot] b82533c4b8 fix(deps): update [root] update dependencies [ci skip] (#16770)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-08 16:14:17 +09:00
syuilo ef1cdca6f9 refactor(frontend): specify global object 2025-11-07 20:20:13 +09:00
Copilot 46d30f454b Fix postMessage type error in Web Worker files by adding triple-slash directives (#16761)
* Initial plan

* Add triple-slash directives to worker files to fix postMessage type error

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-11-07 20:18:33 +09:00
syuilo b300b5b94a fix type 2025-11-07 13:56:41 +09:00
github-actions[bot] 39d6aecc57 Bump version to 2025.11.0-alpha.3 2025-11-07 04:27:23 +00:00
syuilo edbe30a3df fix tuype 2025-11-07 13:02:46 +09:00
syuilo ad4751918b fix type 2025-11-07 12:56:28 +09:00
syuilo bd9041bd8f fix type 2025-11-07 12:55:01 +09:00
syuilo 4dcff123df fix type 2025-11-07 12:53:28 +09:00
syuilo 990be44d98 fix type 2025-11-07 12:45:47 +09:00
syuilo 78d65ef3dd fix type 2025-11-07 12:39:25 +09:00
果物リン 0a67d6f1a0 fix(frontend): 一部のページでもっと見るが自動で行われないバグの修正 (#16754)
* 一部のページでもっと見るが自動で行われないバグの修正

* fix(frontend): MkPagination で UI アニメーションオフ時に自動ロードが動作しない問題を修正

Transition コンポーネントの mode="out-in" が、アニメーション無効時でも
適用されており、IntersectionObserver の検出に干渉していた問題を修正。
アニメーション有効時のみ mode="out-in" を適用するように変更。

Co-authored-by: 果物リン <fruitriin@users.noreply.github.com>

* enhance: ユーザーの設定値にかかわらず無限スクロールをオフにできるオプションを追加

* Update Changelog

* MkNotesTimeline.vueにforceDisableInfiniteScrollを追加、 note.vueの前方向の読み込みでこれを有効

* fix lint

* refactor

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: 果物リン <fruitriin@users.noreply.github.com>
Co-authored-by: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
2025-11-07 11:27:08 +09:00
syuilo e312283ea0 enhance(frontend): 投稿フォームのヒントを追加 (#16712)
* wip

* wip

* Update MkSpot.vue

* Update MkPostForm.vue

* wip

* wip

* Update CHANGELOG.md
2025-11-07 11:03:33 +09:00
syuilo e8c78e12d5 Update package.json 2025-11-07 11:03:23 +09:00
github-actions[bot] 37fe7a9634 Bump version to 2025.11.0-alpha.2 2025-11-06 23:43:26 +00:00
おさむのひと 729abbef62 feat: チャンネルミュートの実装 (#14105)
* add channel_muting table and entities

* add channel_muting services

* タイムライン取得処理への組み込み

* misskey-jsの型とインターフェース生成

* Channelスキーマにミュート情報を追加

* フロントエンドの実装

* 条件が逆だったのを修正

* 期限切れミュートを掃除する機能を実装

* TLの抽出条件調節

* 名前の変更と変更不要の差分をロールバック

* 修正漏れ

* isChannelRelatedの条件に誤りがあった

* [wip] テスト追加

* テストの追加と検出した不備の修正

* fix test

* fix CHANGELOG.md

* 通常はFTTにしておく

* 実装忘れ対応

* fix merge

* fix merge

* add channel tl test

* fix CHANGELOG.md

* remove unused import

* fix lint

* fix test

* fix favorite -> favorited

* exclude -> include

* fix CHANGELOG.md

* fix CHANGELOG.md

* maintenance

* fix CHANGELOG.md

* fix

* fix ci

* regenerate

* fix

* Revert "fix"

This reverts commit 699d50c6ec.

* fixed

---------

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-11-07 08:39:21 +09:00
github-actions[bot] e74ab35de3 Bump version to 2025.11.0-alpha.1 2025-11-06 11:33:32 +00:00
syuilo 4ba18690d7 feat(frontend): EXIFフレーム機能 (#16725)
* wip

* wip

* Update ImageEffector.ts

* Update image-label-renderer.ts

* Update image-label-renderer.ts

* wip

* Update image-label-renderer.ts

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Update use-uploader.ts

* Update watermark.ts

* wip

* wu

* wip

* Update image-frame-renderer.ts

* wip

* wip

* Update image-frame-renderer.ts

* Create ImageCompositor.ts

* Update ImageCompositor.ts

* wip

* wip

* Update ImageEffector.ts

* wip

* Update use-uploader.ts

* wip

* wip

* wip

* wip

* Update fxs.ts

* wip

* wip

* wip

* Update CHANGELOG.md

* wip

* wip

* Update MkImageEffectorDialog.vue

* Update MkImageEffectorDialog.vue

* Update MkImageFrameEditorDialog.vue

* Update use-uploader.ts

* improve error handling

* Update use-uploader.ts

* 🎨

* wip

* wip

* lazy load

* lazy load

* wip

* wip

* wip
2025-11-06 20:25:17 +09:00
syuilo 26c8914a26 fix(frontend): improve startViewTransition handling 2025-11-06 18:07:03 +09:00
Souma 119423e3ae enhance(frontend): Extend links to profile pages (#16417)
* feat(frontend): Add a link to profile to banner and avatar

Increase the area of links to click easily.

* chore(frontend): Change the link of notes count

Move to the notes tab for better userbility.

* feat(frontend): Add links to notes, followers and following

For easy transition to the shown information.

* docs(changelog): Add a description about this change

Users can notice what's changed by this PR.

* style(frontend): Fix the linter error

Remove the duplicated space.

* refactor(frontend): Don't surround the banners with links

It may conflict with the follow buttons.

* docs(changelog): Move the changes to the latest version

This feature is not merged and will be released in the latest version.

Signed-off-by: Souma <101255979+5ouma@users.noreply.github.com>

---------

Signed-off-by: Souma <101255979+5ouma@users.noreply.github.com>
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-11-06 13:42:52 +09:00
github-actions[bot] 3de1ce63cd Bump version to 2025.11.0-alpha.0 2025-11-06 03:43:51 +00:00
かっこかり 18fbc9bb05 fix(frontend): 存在しない翻訳キーを追加 (#16757) 2025-11-06 12:39:48 +09:00
饺子w (Yumechi) 37a21cf54e enhance: Remote Notes Cleaning timeout bailout logic (#16752)
* enhance: Remote Notes Cleaning timeout bailout logic

Signed-off-by: eternal-flame-AD <yume@yumechi.jp>

* fix: dynamic limit did not propagate

Signed-off-by: eternal-flame-AD <yume@yumechi.jp>

* enhance: reload parameters each batch

Signed-off-by: eternal-flame-AD <yume@yumechi.jp>

---------

Signed-off-by: eternal-flame-AD <yume@yumechi.jp>
2025-11-06 12:38:56 +09:00
かっこかり 290fd8c7cc enhance(frontend): ブラウザの通知権限をより確実に取得できるように (#16758)
* enhance(frontend): ブラウザの通知権限をより確実に取得できるように

* Update Changelog
2025-11-06 12:36:36 +09:00
かっこかり 0edb0133fc enhance(frontend): チャンネル周りのUIの整理 (#16743)
* enhance(frontend): チャンネル周りのUIの整理

* fix: 共通要素間の一貫性を保つ

* Update Changelog

* fix: チャンネル新規作成を管理タブに移動・上部ボタン削除
2025-11-06 10:15:59 +09:00
かっこかり 0abe021640 fix(frontend): PageHeaderのタイトルがはみ出る問題を修正 (#16744)
* fix(frontend): PageHeaderのタイトルがはみ出る問題を修正

* Update Changelog

* fix: remove duplicated scoped class to avoid confusion
2025-11-06 09:31:55 +09:00
かっこかり 344f50d538 enhance(frontend): 絵文字パレット設定に説明文を追加 (#16750)
* enhance(frontend): 絵文字パレット設定に説明文を追加

* tweak message
2025-11-05 11:35:48 +09:00
かっこかり 1cebad0ddb fix(frontend): navbarのリアルタイムモードのオンオフ状態の表示をわかりやすく (#16748)
* fix(frontend): navbarのリアルタイムモードのオンオフをわかりやすく

* Update Changelog

* remove unused imports
2025-11-05 09:45:42 +09:00
かっこかり 3e34e87a59 fix(i18n): 表記ゆれを修正 (#16749) 2025-11-05 09:45:06 +09:00
かっこかり b9713259a7 fix(frontend): 表示するものがないときにはMkResultを使用するように (#16740) 2025-11-04 15:16:58 +09:00
かっこかり e15b8b7fa3 fix(frontend): formlinkのスタイル修正 (#16741) 2025-11-04 15:13:24 +09:00
かっこかり ca89c86426 fix(frontend): 自分に割り当てられたロール一覧の余白を調整 (#16747) 2025-11-04 15:12:20 +09:00
かっこかり 6bce19655b fix(frontend): ドライブのtipのスタイル修正 (#16742) 2025-11-04 11:58:29 +09:00
かっこかり 78ed024b0b refactor(frontend): EmojiPickerの冗長なCSSを一部簡略化 (#16717) 2025-11-02 12:12:33 +09:00
かっこかり 6f76b598a1 fix: follow-up of #16719 [ci skip] (#16732) 2025-11-01 13:58:35 +09:00
syuilo a888f2863b Node.js 24 support (#16723)
* Revert "テストが動かないためnodejs 24サポートを取り消し"

This reverts commit a892bbcce5.

* fix jest.js

* ファイルの添付方法を変更

---------

Co-authored-by: samunohito <46447427+samunohito@users.noreply.github.com>
2025-10-30 21:47:04 +09:00
syuilo a892bbcce5 テストが動かないためnodejs 24サポートを取り消し 2025-10-29 09:58:44 +09:00
かっこかり 6571c87e14 fix: attempt to fix test (#16719)
* fix(backend): attempt to fix test

* fix

* Revert "fix(backend): attempt to fix test"

This reverts commit 67dff577c9.

* attempt to fix test

* Revert "fix"

This reverts commit cec3d2f5c6.

* fix
2025-10-28 11:35:23 +09:00
かっこかり 9e0f18a705 deps: update @types/node to v24 [ci skip] (#16718)
* update `@types/node` to v24

* fix
2025-10-28 11:34:42 +09:00
syuilo 3dfca2d61f lint 2025-10-28 11:05:14 +09:00
syuilo f1578c282e update deps 2025-10-28 10:43:59 +09:00
syuilo 231a6877be enhance: Node.js v24がActive LTSに移行されたことに伴いv24を標準に 2025-10-28 10:27:11 +09:00
かっこかり d0a5ccc1ec fix(frontend): コンポーネントのインポート忘れ (#16715) 2025-10-27 18:41:17 +09:00
かっこかり 4e16e23acd fix(frontend): confettiの実行がアニメーション設定を考慮していない問題を修正 (#16714)
* fix(frontend): confettiの実行がアニメーション設定を考慮していない問題を修正

* Update Changelog

---------

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-10-27 18:41:03 +09:00
github-actions[bot] 17da44078b [skip ci] Update CHANGELOG.md (prepend template) 2025-10-27 04:19:47 +00:00
github-actions[bot] 1f29fb4e40 Release: 2025.10.2 2025-10-27 04:19:42 +00:00
syuilo 0343b4e689 Update CHANGELOG.md 2025-10-27 09:50:27 +09:00
syuilo a76a1a6305 Add permissions for pull-requests in workflow 2025-10-26 21:16:43 +09:00
github-actions[bot] 1f934ada5d Bump version to 2025.10.2-beta.0 2025-10-26 10:34:10 +00:00
syuilo cd77404006 fix tooltip text 2025-10-26 19:29:37 +09:00
github-actions[bot] 351386c8ff Bump version to 2025.10.2-alpha.0 2025-10-26 01:35:02 +00:00
syuilo 298f8802d4 fix(frontend): 期限が無期限のアンケートに投票できない問題を修正
Fix #16708
2025-10-26 10:32:12 +09:00
syuilo 6e614ff061 Revert "Fix touch position offset in image masking on iOS devices (#16702)"
This reverts commit 456504cf82.
2025-10-25 19:32:00 +09:00
syuilo ca76ba1871 Update CHANGELOG.md 2025-10-25 08:47:51 +09:00
syuilo 9f768b8022 fix(frontend): キャッシュをクリアするとテーマ再適用するまでレンダリングが正しく行われない問題を修正 2025-10-25 08:22:47 +09:00
github-actions[bot] 4ff826eb3d [skip ci] Update CHANGELOG.md (prepend template) 2025-10-24 06:31:38 +00:00
github-actions[bot] 60bcb9c6a9 Release: 2025.10.1 2025-10-24 06:31:32 +00:00
github-actions[bot] 0c85bfd56f Bump version to 2025.10.1-beta.4 2025-10-24 02:28:37 +00:00
syuilo 9d37f696b4 New Crowdin updates (#16692)
* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Chinese Traditional)
2025-10-24 11:15:30 +09:00
syuilo 2734ff6af7 Update CHANGELOG.md 2025-10-24 11:15:11 +09:00
Copilot 456504cf82 Fix touch position offset in image masking on iOS devices (#16702)
* Initial plan

* Fix iOS touch position offset in image masking feature

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-10-24 11:14:12 +09:00
syuilo 81cea6aed5 Update MkImageEffectorDialog.vue
related? #16703
2025-10-24 11:01:20 +09:00
syuilo 2d1b7c957a Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2025-10-24 10:41:55 +09:00
syuilo 5b6aa1496a Update about-misskey.vue 2025-10-24 10:40:11 +09:00
github-actions[bot] 259dd34b26 Bump version to 2025.10.1-beta.3 2025-10-23 10:25:35 +00:00
syuilo cf81406fae Fix audio track loss during video compression on iOS
修正: iOSで動画の圧縮を行うと音声トラックが失われる問題を修正
2025-10-23 19:00:28 +09:00
Copilot 42f230f223 Fix video audio loss during compression by preserving audio stream (#16696)
* Initial plan

* Fix video audio loss during compression by specifying AAC codec

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>

* Fix audio by avoiding transcoding - copy audio stream directly

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-10-23 18:59:12 +09:00
かっこかり 2e07e50bb4 refactor(frontend): 既存のGLSLを単独のファイルに移行 (#16677)
* refactor(frontend): 既存のGLSLを単独のファイルに移行

* fix: glslファイルを参照元ファイルと同じ場所に移動
2025-10-23 11:05:21 +09:00
かっこかり d203e1a446 refactor(frontend): フロントエンドの型エラー解消 (#16694) 2025-10-23 11:04:27 +09:00
github-actions[bot] 4988719a2e Bump version to 2025.10.1-beta.2 2025-10-22 02:13:11 +00:00
syuilo f0380f2d1c enhance(frontend): improve theme apply handling 2025-10-22 11:11:30 +09:00
github-actions[bot] 130d065d0c Bump version to 2025.10.1-beta.1 2025-10-22 00:18:40 +00:00
syuilo 7b41fddf54 New Crowdin updates (#16686)
* New translations ja-jp.yml (Indonesian)

* New translations ja-jp.yml (English)
2025-10-22 09:12:22 +09:00
syuilo aafd8b6bf7 fix(frontend): ダークモードの同期が機能しない場合がある問題を修正
Fix #16688
2025-10-22 09:11:15 +09:00
github-actions[bot] 7a82c1a912 Bump version to 2025.10.1-beta.0 2025-10-21 11:08:40 +00:00
syuilo 3c97c12e7f enhance(frontend): 下書き/予約投稿一覧は投稿フォームのアカウントメニュー内に移動し、下書き保存は「...」メニュー内に移動 2025-10-21 20:03:57 +09:00
syuilo 5b5a1f08e1 enhance(backend): 管理者/モデレーターはファイルのアップロード制限をバイパスするように
Resolve #16687
2025-10-21 19:24:43 +09:00
syuilo c4ee95a40a Add workflow to request release review via comment
This workflow triggers a comment reply when an issue comment with '/request-release-review' is created, providing guidance for the release review process.
2025-10-21 14:25:55 +09:00
syuilo 8ea7fe0ba1 Update CHANGELOG for version 2025.10.0 2025-10-21 12:55:31 +09:00
かっこかり 187b6477da fix(deps): fix broken lockfile (#16685) 2025-10-21 11:37:52 +09:00
renovate[bot] 09896fdc12 chore(deps): update [misskey-js] update dependencies to v8.46.1 [ci skip] (#16681)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 11:36:03 +09:00
renovate[bot] d4cda989a2 chore(deps): update [root] update dependencies to v8.46.1 [ci skip] (#16682)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 11:35:47 +09:00
renovate[bot] f93043e170 fix(deps): update [backend] update dependencies [ci skip] (#16683)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 11:28:34 +09:00
renovate[bot] 1c2e57d60c fix(deps): update [frontend] update dependencies [ci skip] (#16684)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 11:06:25 +09:00
github-actions[bot] 67c853104c Bump version to 2025.10.1-alpha.6 2025-10-21 00:58:02 +00:00
syuilo 986d783940 New Crowdin updates (#16673)
* New translations ja-jp.yml (Spanish)

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

* New translations ja-jp.yml (Italian)

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

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Spanish)
2025-10-21 09:22:27 +09:00
かっこかり 61cfccff37 fix(deps): fix broken lockfile (#16679) 2025-10-21 09:06:25 +09:00
renovate[bot] b161fe7adc fix(deps): update dependency nodemailer to v7 [security] [ci skip] (#16611)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 08:56:01 +09:00
renovate[bot] c3b1c8a8ff chore(deps): update dependency @types/node to v22.18.10 [ci skip] (#16674)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-20 20:41:08 +09:00
renovate[bot] bc2b512be6 chore(deps): update [misskey-js] update dependencies [ci skip] (#16612)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-20 20:40:38 +09:00
renovate[bot] 7fe9574897 chore(deps): update pnpm/action-setup action to v4.2.0 [ci skip] (#16675)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-20 19:37:10 +09:00
renovate[bot] 8549f71656 fix(deps): update [backend] update dependencies [ci skip] (#16676)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-20 19:36:43 +09:00
github-actions[bot] ae4487fa69 Bump version to 2025.10.1-alpha.5 2025-10-20 09:37:00 +00:00
renovate[bot] 0a75d6fcf1 fix(deps): update [frontend] update dependencies [ci skip] (#16613)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-20 16:44:58 +09:00
renovate[bot] d3bb24d851 chore(deps): update [root] update dependencies [ci skip] (#16614)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-20 16:27:38 +09:00
果物リン 9aea7363ce fix(frontend): MkPollの集計完了後の挙動がおかしいのを修正 (#16646)
* MkPollの集計完了後の挙動がおかしいのを修正

* fix lint

* watchを削除できるように修正

* fix

* Update Changelog

* fix lint

---------

Co-authored-by: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
2025-10-20 16:11:01 +09:00
github-actions[bot] f0889f4b3c Bump version to 2025.10.1-alpha.4 2025-10-20 06:36:00 +00:00
かっこかり b8433b2413 enhance(frontend): glslを単独のファイルに分離 (#16665) 2025-10-20 15:23:19 +09:00
syuilo 4e9070a4c5 update happy-dom 2025-10-20 15:19:19 +09:00
syuilo bff194f648 Update pnpm-workspace.yaml 2025-10-20 15:18:18 +09:00
かっこかり 8714945ec9 fix(frontend): ウォーターマーク配置のエフェクトが壊れている問題を修正 (#16662)
* fix(frontend): ウォーターマーク配置のエフェクトが壊れている問題を修正

* enhance: add settings for noBoundingBoxExpansion

* Update Changelog

* fix

* perf: ウォーターマークのrepeatをWRAP属性で制御するように

* fix: ウォーターマークをrepeatした際に回転や拡大縮小の中心が「位置」設定を考慮しないのを修正

* fix: ウォーターマークをrepeatした際にマージンが各ウォーターマークごとのマージンとなっていない問題を修正

* fix: リピートモード時の拡大縮小の原点が、アライメントの設定にかかわらず左上になる問題を修正

* enhance: preserveBoundingRect の翻訳文字を変更

* fix: remove description

* fix

* fix: 回転の向きが逆になっているのを修正

* fix: マージンは元画像の大きさに対する割合で算出するように

* Update watermarkPlacement.ts

---------

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-10-20 15:05:23 +09:00
syuilo aadc7bf61a Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2025-10-20 14:48:16 +09:00
syuilo acd35ef96c add note 2025-10-20 14:48:14 +09:00
かっこかり 43919a3fe3 Update CHANGELOG.md (follow-up of #16672) 2025-10-20 00:22:25 +09:00
かっこかり 8a21202281 fix(frontend): リモートユーザーのロールバッジ表示の文言をわかりやすく (#16672) 2025-10-19 23:04:57 +09:00
github-actions[bot] 579499a7df Bump version to 2025.10.1-alpha.3 2025-10-19 04:22:23 +00:00
syuilo b48233eb4c New Crowdin updates (#16657)
* New translations ja-jp.yml (Catalan)

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

* 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 (Spanish)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Korean)
2025-10-19 13:19:56 +09:00
かっこかり d98bf012b5 refactor(frontend): カスタムディレクティブの型付け (#16659)
* refactor(frontend): カスタムディレクティブの型付け

* fix
2025-10-19 11:36:00 +09:00
anatawa12 44930342a8 Revert typeorm patches (#16664)
* chore: remove patches

* chore: remove unnecessary 'DEFAULT NULL's

* chore: add patches with .gitkeep
2025-10-19 11:34:34 +09:00
かっこかり 29892d2a01 enhance: リモートユーザーのロールバッジを表示するかどうかをサーバー管理者が設定できるように (#16661)
* enhance: リモートユーザーのロールバッジを表示するかどうかをサーバー管理者が設定できるように

* Update Changelog

* build misskey-js with types
2025-10-16 22:45:37 +09:00
かっこかり b6bf3cfcb7 fix(frontend): バナー画像の画面上でのクロップが以前の挙動と同一になるように (#16658)
* fix(frontend): バナー画像の画面上でのクロップが以前の挙動と同一になるように

* fix
2025-10-16 18:04:08 +09:00
かっこかり a132a1d3e1 fix(frontend): 外部アプリ設定のアプリアイコンに変な余白が入っているのを修正 (#16660) 2025-10-16 18:01:25 +09:00
かっこかり 8cfd147555 fix(frontend): ロールポリシーによりダイレクトメッセージが無効化されている際のデッキのダイレクトメッセージカラムの挙動を改善 (#16656)
* fix(frontend): ロールポリシーによりダイレクトメッセージが無効化されている際のデッキのダイレクトメッセージカラムの挙動を改善

* Update Changelog
2025-10-16 11:17:47 +09:00
syuilo a405575cd6 chore(frontend): add tips 2025-10-16 09:44:58 +09:00
github-actions[bot] 56885cceed Bump version to 2025.10.1-alpha.2 2025-10-15 04:11:32 +00:00
syuilo 3c64281696 Revert "fix(deps): update dependency happy-dom to v20 [security] (#16644)"
This reverts commit 45b3afa70d.
2025-10-15 13:05:37 +09:00
renovate[bot] 45b3afa70d fix(deps): update dependency happy-dom to v20 [security] (#16644)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-15 13:00:29 +09:00
syuilo beabe84354 New Crowdin updates (#16645)
* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Spanish)
2025-10-15 12:59:49 +09:00
かっこかり 42008d1377 fix(frontend): デッキのメインカラムのヘッダをクリックしてもページ上部/下部にスクロールしない問題を修正 (#16653)
* fix(frontend): デッキのメインカラムのヘッダをクリックしても上部にスクロールしない問題を修正

* fix

* Update Changelog

* fix lint

---------

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-10-15 12:59:26 +09:00
かっこかり 3df81931ec fix(frontend): ナビゲーションバーの設定で削除した項目をその場で再追加できない問題を修正 (#16652)
* fix(frontend): ナビゲーションバーの設定で削除した項目をその場で再追加できない問題を修正

* Update Changelog
2025-10-15 12:14:03 +09:00
github-actions[bot] 4c536630d4 Bump version to 2025.10.1-alpha.1 2025-10-10 10:01:31 +00:00
syuilo 92cc55f0f1 New translations ja-jp.yml (English) (#16633) 2025-10-10 18:59:42 +09:00
かっこかり f8c6273acc fix(frontend): scroll-driven animation非対応環境でバナー画像が上下中央に表示されない問題を修正 (#16632)
* fix(frontend): scroll-driven animation非対応環境でバナー画像が上下中央に表示されない問題を修正

* Update Changelog
2025-10-10 09:33:35 +09:00
かっこかり edf7beff23 fix(frontend/aiscript): Mk:toastを同期関数に変更 (#16480) 2025-10-09 11:30:34 +09:00
かっこかり 3804028b6e chore(deps): update dependency @types/node to v22.18.8 (#16630)
* chore(deps): update dependency @types/node to v22.18.8

* run pnpm dedupe

* Update Changelog
2025-10-09 10:35:39 +09:00
renovate[bot] 70473c66e9 fix(deps): update [backend] update dependencies [ci skip] (#16615)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-09 10:19:43 +09:00
renovate[bot] a87a3c6693 chore(deps): update [tools] update dependencies [ci skip] (#16546)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-09 10:06:14 +09:00
かっこかり 72a5daeb9a update deps [ci skip] (#16628) 2025-10-09 09:57:49 +09:00
github-actions[bot] 54efe1b4c5 Bump version to 2025.10.1-alpha.0 2025-10-09 00:32:10 +00:00
syuilo 24129efe97 New translations ja-jp.yml (Italian) (#16625) 2025-10-09 09:30:01 +09:00
果物リン 41aa0c8efe [カスタム絵文字beta]MacのCmdキー対応とCtrl/Cmd+Arrowキー対応 (#16621)
* [カスタム絵文字beta]MacのCmdキー対応とCtrl/Cmd+Arrowキー対応

* Update packages/frontend/src/components/grid/MkGrid.vue

Co-authored-by: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>

---------

Co-authored-by: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
2025-10-09 09:29:47 +09:00
おさむのひと 37526de323 fix: aliasesの区切り文字が一致していないのを修正 (#16622)
* fix: aliasesの区切り文字が一致していないのを修正

* fix CHANGELOG.md

---------

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-10-09 09:29:09 +09:00
かっこかり 21ed2e3002 fix(frontend): バナー画像のサイズがおかしい問題を修正 (#16627)
* fix(frontend): バナー画像のサイズがおかしい問題を修正

* Update Changelog
2025-10-09 09:28:27 +09:00
github-actions[bot] 917def4e13 [skip ci] Update CHANGELOG.md (prepend template) 2025-10-08 13:18:11 +00:00
github-actions[bot] d1eb1cad42 Release: 2025.10.0 2025-10-08 13:18:04 +00:00
syuilo 994690eebf Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2025-10-08 17:50:14 +09:00
syuilo b25810e091 fix(backend): improve NoteDraftService validation 2025-10-08 17:50:04 +09:00
343 changed files with 17723 additions and 11008 deletions
+1 -1
View File
@@ -1 +1 @@
FROM mcr.microsoft.com/devcontainers/javascript-node:0-18
FROM mcr.microsoft.com/devcontainers/javascript-node:4.0.3-24-trixie
+1 -1
View File
@@ -28,7 +28,7 @@ services:
db:
restart: unless-stopped
image: postgres:15-alpine
image: postgres:18-alpine
networks:
- internal_network
environment:
+1 -1
View File
@@ -5,7 +5,7 @@
"workspaceFolder": "/workspace",
"features": {
"ghcr.io/devcontainers/features/node:1": {
"version": "22.15.0"
"version": "24.10.0"
},
"ghcr.io/devcontainers-extra/features/pnpm:2": {
"version": "10.10.0"
+1 -1
View File
@@ -76,7 +76,7 @@ body:
* Installation Method or Hosting Service: docker compose, k8s/docker, systemd, "Misskey install shell script", development environment
* Misskey: 2025.x.x
* Node: 20.x.x
* PostgreSQL: 15.x.x
* PostgreSQL: 18.x.x
* Redis: 7.x.x
* OS and Architecture: Ubuntu 24.04.2 LTS aarch64
value: |
+1 -1
View File
@@ -19,7 +19,7 @@ jobs:
uses: actions/checkout@v4.3.0
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- name: Setup Node.js
uses: actions/setup-node@v4.4.0
+22 -6
View File
@@ -13,20 +13,36 @@ jobs:
runs-on: ubuntu-latest
env:
DOCKER_CONTENT_TRUST: 1
DOCKLE_VERSION: 0.4.14
DOCKLE_VERSION: 0.4.15
steps:
- uses: actions/checkout@v4.3.0
- name: Download and install dockle v${{ env.DOCKLE_VERSION }}
run: |
curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v${DOCKLE_VERSION}/dockle_${DOCKLE_VERSION}_Linux-64bit.deb"
sudo dpkg -i dockle.deb
- run: |
cp .config/docker_example.env .config/docker.env
cp ./compose_example.yml ./compose.yml
- run: |
docker compose up -d web
docker tag "$(docker compose images --format json web | jq -r '.[] | .ID')" misskey-web:latest
- run: |
cmd="dockle --exit-code 1 misskey-web:latest ${image_name}"
echo "> ${cmd}"
eval "${cmd}"
IMAGE_ID=$(docker compose images --format json web | jq -r '.[0].ID')
docker tag "${IMAGE_ID}" misskey-web:latest
- name: Prune docker junk (optional but recommended)
run: |
docker system prune -af
docker volume prune -f
- name: Save image for Dockle
run: |
docker save misskey-web:latest -o ./misskey-web.tar
ls -lh ./misskey-web.tar
- name: Run Dockle with tar input
run: |
dockle --exit-code 1 --input ./misskey-web.tar
+1 -1
View File
@@ -30,7 +30,7 @@ jobs:
ref: ${{ matrix.ref }}
submodules: true
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- name: Use Node.js
uses: actions/setup-node@v4.4.0
with:
+8 -5
View File
@@ -41,7 +41,7 @@ jobs:
fetch-depth: 0
submodules: true
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- uses: actions/setup-node@v4.4.0
with:
node-version-file: '.node-version'
@@ -74,7 +74,7 @@ jobs:
fetch-depth: 0
submodules: true
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- uses: actions/setup-node@v4.4.0
with:
node-version-file: '.node-version'
@@ -96,6 +96,7 @@ jobs:
matrix:
workspace:
- backend
- frontend
- sw
- misskey-js
steps:
@@ -104,14 +105,16 @@ jobs:
fetch-depth: 0
submodules: true
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- uses: actions/setup-node@v4.4.0
with:
node-version-file: '.node-version'
cache: 'pnpm'
- run: pnpm i --frozen-lockfile
- run: pnpm --filter misskey-js run build
if: ${{ matrix.workspace == 'backend' || matrix.workspace == 'sw' }}
if: ${{ matrix.workspace == 'backend' || matrix.workspace == 'frontend' || matrix.workspace == 'sw' }}
- run: pnpm --filter misskey-reversi run build
if: ${{ matrix.workspace == 'backend' }}
if: ${{ matrix.workspace == 'backend' || matrix.workspace == 'frontend' }}
- run: pnpm --filter misskey-bubble-game run build
if: ${{ matrix.workspace == 'frontend' }}
- run: pnpm --filter ${{ matrix.workspace }} run typecheck
+1 -1
View File
@@ -19,7 +19,7 @@ jobs:
fetch-depth: 0
submodules: true
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- uses: actions/setup-node@v4.4.0
with:
node-version-file: '.node-version'
+1 -1
View File
@@ -20,7 +20,7 @@ jobs:
with:
submodules: true
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- name: Use Node.js
uses: actions/setup-node@v4.4.0
with:
@@ -0,0 +1,51 @@
name: Request release review
on:
issue_comment:
types: [created]
jobs:
reply:
if: github.event.comment.body == '/request-release-review'
runs-on: ubuntu-latest
permissions:
contents: read
issues: write
pull-requests: write
steps:
- name: Reply
uses: actions/github-script@v6
with:
script: |
const body = `To dev team (@misskey-dev/dev):
リリースが提案されています :rocket:
GOの場合はapprove、NO GOの場合はその旨コメントをお願いいたします。
判断にあたって考慮すべき観点は、
- やり残したことはないか?
- CHANGELOGは過不足ないか?
- バージョンに問題はないか?(月跨いでいるのに更新忘れているなど)
- 再考すべき仕様・実装はないか?
- ベータ版を検証したサーバーから不具合の報告等は上がってないか?
- (セキュリティの修正や重要なバグ修正などのため)リリースを急いだ方が良いか?そうではないか?
- Actionsが落ちていないか?
などが挙げられます。
ご協力ありがとうございます :sparkles:
`
const issue_number = context.payload.issue ? context.payload.issue.number : (context.payload.pull_request && context.payload.pull_request.number)
if (!issue_number) {
console.log('No issue or PR number found in payload; skipping')
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number,
body,
})
}
+1 -1
View File
@@ -37,7 +37,7 @@ jobs:
if: github.event_name == 'pull_request_target'
run: git checkout "$(git rev-list --parents -n1 HEAD | cut -d" " -f3)"
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- name: Use Node.js
uses: actions/setup-node@v4.4.0
with:
+6 -6
View File
@@ -38,7 +38,7 @@ jobs:
services:
postgres:
image: postgres:15
image: postgres:18
ports:
- 54312:5432
env:
@@ -54,7 +54,7 @@ jobs:
with:
submodules: true
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- name: Get current date
id: current-date
run: echo "today=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
@@ -117,7 +117,7 @@ jobs:
services:
postgres:
image: postgres:15
image: postgres:18
ports:
- 54312:5432
env:
@@ -133,7 +133,7 @@ jobs:
with:
submodules: true
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- name: Use Node.js
uses: actions/setup-node@v4.4.0
with:
@@ -165,7 +165,7 @@ jobs:
services:
postgres:
image: postgres:15
image: postgres:18
ports:
- 54312:5432
env:
@@ -177,7 +177,7 @@ jobs:
with:
submodules: true
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- name: Get current date
id: current-date
run: echo "today=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
+1 -1
View File
@@ -36,7 +36,7 @@ jobs:
with:
submodules: true
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- name: Get current date
id: current-date
run: echo "today=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
+3 -3
View File
@@ -32,7 +32,7 @@ jobs:
with:
submodules: true
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- name: Use Node.js
uses: actions/setup-node@v4.4.0
with:
@@ -64,7 +64,7 @@ jobs:
services:
postgres:
image: postgres:15
image: postgres:18
ports:
- 54312:5432
env:
@@ -86,7 +86,7 @@ jobs:
#- uses: browser-actions/setup-firefox@latest
# if: ${{ matrix.browser == 'firefox' }}
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- name: Use Node.js
uses: actions/setup-node@v4.4.0
with:
+1 -1
View File
@@ -25,7 +25,7 @@ jobs:
uses: actions/checkout@v4.3.0
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- name: Setup Node.js
uses: actions/setup-node@v4.4.0
+1 -1
View File
@@ -20,7 +20,7 @@ jobs:
with:
submodules: true
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- name: Use Node.js
uses: actions/setup-node@v4.4.0
with:
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
with:
submodules: true
- name: Setup pnpm
uses: pnpm/action-setup@v4.1.0
uses: pnpm/action-setup@v4.2.0
- name: Use Node.js
uses: actions/setup-node@v4.4.0
with:
+1 -1
View File
@@ -1 +1 @@
22.15.0
24.10.0
+98
View File
@@ -1,3 +1,101 @@
## 2025.11.1
### General
-
### Client
- Enhance: リアクションの受け入れ設定にキャプションを追加 #15921
- Fix: ページの内容がはみ出ることがある問題を修正
- Fix: ナビゲーションバーを下に表示しているときに、項目数が多いと表示が崩れる問題を修正
- Fix: ヘッダーメニューのチャンネルの新規作成の項目でチャンネル作成ページに飛べない問題を修正 #16816
- Fix: ラジオボタンに空白の選択肢が表示される問題を修正
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/1105)
- Fix: 一部のシチュエーションで投稿フォームのツアーが正しく表示されない問題を修正
- Fix: 投稿フォームのリセットボタンで注釈がリセットされない問題を修正
- Fix: PlayのAiScriptバージョン判定(v0.x系・v1.x系の判定)が正しく動作しない問題を修正
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/1129)
- Fix: フォロー申請をキャンセルする際の確認ダイアログの文言が不正確な問題を修正
- Fix: 初回読み込み時にエラーになることがある問題を修正
- Fix: お気に入りクリップの一覧表示が正しく動作しない問題を修正
- Fix: AiScript Misskey 拡張APIにおいて、各種関数の引数で明示的に `null` が指定されている場合のハンドリングを修正
### Server
- Enhance: メモリ使用量を削減しました
- Enhance: 依存関係の更新
- Fix: ワードミュートの文字数計算を修正
- Fix: チャンネルのリアルタイム更新時に、ロックダウン設定にて非ログイン時にノートを表示しない設定にしている場合でもノートが表示されてしまう問題を修正
- Fix: DeepL APIのAPIキー指定方式変更に対応
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/1096)
- 内部実装の変更にて対応可能な更新です。Misskey側の設定方法に変更はありません。
- Fix: DBレプリケーションを利用する環境でクエリーが失敗する問題を修正
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/1123)
## 2025.11.0
### General
- Feat: チャンネルミュート機能の実装 #10649
- チャンネルの概要画面の右上からミュートできます(リンクコピー、共有、設定と同列)
- Enhance: Node.js 24.10.0をサポートするようになりました
- Enhance: DockerのNode.jsが24.10.0に更新されました
- 依存関係の更新
### Client
- Feat: 画像にメタデータを含むフレームをつけられる機能
- Enhance: プリセットを作成しなくても画像にウォーターマークを付与できるように
- Enhance: 管理しているチャンネルの見分けがつきやすくなるように
- Enhance: プロフィールへのリンクをユーザーポップアップのアバターに追加
- Enhance: ユーザーのノート、フォロー、フォロワーページへのリンクをユーザーポップアップに追加
- Enhance: プッシュ通知を行うための権限確認をより確実に行うように
- Enhance: 投稿フォームのチュートリアルを追加
- Enhance: 「自動でもっと見る」をほとんどの箇所で利用可能に
- Enhance: アンテナ・リスト設定画面とタイムラインの動線を改善
- アンテナ・リスト一覧画面の項目を選択すると、設定画面ではなくタイムラインに移動するようになりました
- アンテナ・リストの設定画面の右上にタイムラインに移動するボタンを追加しました
- Fix: 紙吹雪エフェクトがアニメーション設定を考慮せず常に表示される問題を修正
- Fix: ナビゲーションバーのリアルタイムモード切替ボタンの状態をよりわかりやすく表示するように
- Fix: ページのタイトルが長いとき、はみ出る問題を修正
- Fix: 投稿フォームのアバターが正しく表示されない問題を修正 #16789
- FIx: カスタム絵文字(β)画面で変更行が正しくハイライトされない問題を修正 #16626
### Server
- Enhance: Remote Notes Cleaningが複雑度が高いノートの処理を中断せずに次のノートから再開するように
- Fix: チャンネルの説明欄の最小文字数制約を除去
## 2025.10.2
### Client
- Fix: アプリ内からキャッシュをクリアするとテーマ再適用するまでレンダリングが正しく行われない問題を修正
- Fix: 期限が無期限のアンケートに投票できない問題を修正
## 2025.10.1
### General
- Enhance: リモートユーザーに付与したロールバッジを表示できるように(オプトイン)
パフォーマンス上の問題からデフォルトで無効化されています。「コントロールパネル > パフォーマンス」から有効化できます。
- 依存関係の更新
### Client
- Enhance: デッキのメインカラムのヘッダをクリックしてページ上部/下部にスクロールできるように
- Enhance: 下書き/予約投稿一覧は投稿フォームのアカウントメニュー内に移動し、下書き保存は「...」メニュー内に移動されました
- Fix: カスタム絵文字画面(beta)のaliasesで使用される区切り文字が一致していないのを修正 #15614
- Fix: バナー画像の幅が表示領域と一致していない問題を修正
- Fix: 一部のブラウザでバナー画像が上下中央に表示されない問題を修正
- Fix: ナビゲーションバーの設定で削除した項目をその場で再追加できない問題を修正
- Fix: ロールポリシーによりダイレクトメッセージが無効化されている際のデッキのダイレクトメッセージカラムの挙動を改善
- Fix: 画像のマスクでタッチ操作が不安定な問題を修正
- Fix: ウォーターマークの各種挙動修正
- ウォーターマークを回転させると歪む問題を修正
- ウォーターマークを敷き詰めると上下左右反転した画像/文字が表示される問題を修正
- ウォーターマークを回転させた際に画面からはみ出た部分を考慮できるように
- Fix: 投票が終了した後に投票結果が正しく表示されない問題を修正
- Fix: ダークモードの同期が機能しない場合がある問題を修正
- Fix: iOSで動画の圧縮を行うと音声トラックが失われる問題を修正
### Server
- Enhance: 管理者/モデレーターはファイルのアップロード制限をバイパスするように
- Enhance: セキュリティの向上
## 2025.10.0
### NOTE
+1 -1
View File
@@ -1,6 +1,6 @@
# syntax = docker/dockerfile:1.4
ARG NODE_VERSION=22.15.0-bookworm
ARG NODE_VERSION=24.10.0-bookworm
# build assets & compile TypeScript
+1 -1
View File
@@ -6,7 +6,7 @@ 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)~~ → Done ✔️
- Make the number of type errors zero (frontend)
- ~~Make the number of type errors zero (frontend)~~ → Done ✔️
- Improve CI
- ~~Fix tests~~ → Done ✔️
- Fix random test failures - https://github.com/misskey-dev/misskey/issues/7985 and https://github.com/misskey-dev/misskey/issues/7986
+1 -1
View File
@@ -27,7 +27,7 @@ spec:
ports:
- containerPort: 3000
- name: postgres
image: postgres:15-alpine
image: postgres:18-alpine
env:
- name: POSTGRES_USER
value: "example-misskey-user"
+1 -1
View File
@@ -15,7 +15,7 @@ services:
db:
restart: always
image: postgres:15-alpine
image: postgres:18-alpine
ports:
- "5432:5432"
env_file:
+1 -1
View File
@@ -37,7 +37,7 @@ services:
db:
restart: always
image: postgres:15-alpine
image: postgres:18-alpine
networks:
- internal_network
env_file:
+11
View File
@@ -1011,6 +1011,14 @@ information: "عن"
inMinutes: "د"
inDays: "ي"
widgets: "التطبيقات المُصغّرة"
presets: "إعدادات مسبقة"
_imageEditing:
_vars:
filename: "اسم الملف"
_imageFrameEditor:
font: "الخط"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
_chat:
invitations: "دعوة"
noHistory: "السجل فارغ"
@@ -1397,6 +1405,9 @@ _postForm:
replyPlaceholder: "رد على هذه الملاحظة…"
quotePlaceholder: "اقتبس هذه الملاحظة…"
channelPlaceholder: "انشر في قناة..."
_howToUse:
visibility_title: "الظهور"
menu_title: "القائمة"
_placeholders:
a: "ما الذي تنوي فعله؟"
b: "ماذا يحدث حولك ؟"
+11
View File
@@ -851,6 +851,14 @@ information: "আপনার সম্পর্কে"
inMinutes: "মিনিট"
inDays: "দিন"
widgets: "উইজেটগুলি"
_imageEditing:
_vars:
filename: "ফাইলের নাম"
_imageFrameEditor:
header: "হেডার"
font: "ফন্ট"
fontSerif: "সেরিফ"
fontSansSerif: "স্যান্স সেরিফ"
_chat:
invitations: "আমন্ত্রণ"
noHistory: "কোনো ইতিহাস নেই"
@@ -1169,6 +1177,9 @@ _postForm:
replyPlaceholder: "নোটটির জবাব দিন..."
quotePlaceholder: "নোটটিকে উদ্ধৃত করুন..."
channelPlaceholder: "চ্যানেলে পোস্ট করুন..."
_howToUse:
visibility_title: "দৃশ্যমানতা"
menu_title: "মেনু"
_placeholders:
a: "আপনি এখন কি করছেন?"
b: "আপনার আশে পাশে কি হচ্ছে?"
+78 -2
View File
@@ -83,6 +83,8 @@ files: "Fitxers"
download: "Descarregar"
driveFileDeleteConfirm: "Estàs segur que vols suprimir el fitxer \"{name}\"? Les notes associades a aquest fitxer també seran esborrades."
unfollowConfirm: "Segur que vols deixar de seguir a {name}?"
cancelFollowRequestConfirm: "Vols cancel·lar la teva sol·licitud de seguiment a {name}?"
rejectFollowRequestConfirm: "Vols rebutjar la sol·licitud de seguiment de {name}?"
exportRequested: "Has sol·licitat una exportació de dades. Això pot trigar una estona. S'afegirà a la teva unitat de disc un cop estigui completada."
importRequested: "Has sol·licitat una importació de dades. Això pot trigar una estona."
lists: "Llistes"
@@ -302,6 +304,7 @@ uploadFromUrlMayTakeTime: "La càrrega des de l'enllaç pot trigar un temps"
uploadNFiles: "Pujar {n} arxius"
explore: "Explora"
messageRead: "Vist"
readAllChatMessages: "Marcar tots els missatges com a llegits"
noMoreHistory: "No hi ha res més per veure"
startChat: "Comença a xatejar "
nUsersRead: "Vist per {n}"
@@ -651,7 +654,7 @@ disablePlayer: "Tanca el reproductor de vídeo"
expandTweet: "Expandir post"
themeEditor: "Editor de temes"
description: "Descripció"
describeFile: "Afegeix una descripció "
describeFile: "Afegir text alternatiu"
enterFileDescription: "Escriu un peu de foto"
author: "Autor"
leaveConfirm: "Hi ha canvis sense guardar. Els vols descartar?"
@@ -775,6 +778,7 @@ lockedAccountInfo: "Tret que establiu la visibilitat de la nota a \"Només segui
alwaysMarkSensitive: "Marcar com a sensible per defecte"
loadRawImages: "Carregar les imatges originals en comptes de miniatures "
disableShowingAnimatedImages: "No reproduir imatges animades"
disableShowingAnimatedImages_caption: "Si les imatges animades no es reprodueixen, independentment d'aquesta configuració, és possible que la configuració d'accessibilitat del navegador i el sistema operatiu, els modes d'estalvi d'energia i similars estiguin interferint."
highlightSensitiveMedia: "Ressalta els medis marcats com a sensibles"
verificationEmailSent: "S'ha enviat un correu electrònic de verificació. Fes clic a l'enllaç per completar la verificació."
notSet: "Sense definir"
@@ -1021,6 +1025,9 @@ pushNotificationAlreadySubscribed: "L'enviament de notificacions ja és activat"
pushNotificationNotSupported: "El teu navegador o la teva instància no suporta l'enviament de notificacions "
sendPushNotificationReadMessage: "Esborrar les notificacions enviades quan s'hagin llegit"
sendPushNotificationReadMessageCaption: "Això pot fer que el teu dispositiu consumeixi més bateria"
pleaseAllowPushNotification: "Si us plau, permet les notificacions del navegador"
browserPushNotificationDisabled: "No s'ha pogut obtenir permisos per les notificacions"
browserPushNotificationDisabledDescription: "No tens permisos per enviar notificacions des de {serverName}. Activa les notificacions a la configuració del teu navegador i tornar-ho a intentar."
windowMaximize: "Maximitzar "
windowMinimize: "Minimitzar"
windowRestore: "Restaurar"
@@ -1171,6 +1178,7 @@ installed: "Instal·lats "
branding: "Marca"
enableServerMachineStats: "Publicar estadístiques del maquinari del servidor"
enableIdenticonGeneration: "Activar la generació d'icones d'identificació "
showRoleBadgesOfRemoteUsers: "Mostrar insígnies de rols d'instàncies remotes "
turnOffToImprovePerformance: "Desactivant aquesta opció es pot millorar el rendiment."
createInviteCode: "Crear codi d'invitació "
createWithOptions: "Crear invitació amb opcions"
@@ -1394,6 +1402,50 @@ scheduled: "Programat"
widgets: "Ginys"
deviceInfo: "Informació del dispositiu"
deviceInfoDescription: "En fer consultes tècniques influir la següent informació pot ajudar a resoldre'l més ràpidament."
youAreAdmin: "Ets l'administrador "
frame: "Marc"
presets: "Predefinit"
zeroPadding: "Sense omplir"
_imageEditing:
_vars:
caption: "Títol de l'arxiu"
filename: "Nom del Fitxer"
filename_without_ext: "Nom de l'arxiu sense extensió "
year: "Any"
month: "Mes"
day: "Dia"
hour: "Hora"
minute: "Minut"
second: "Segon"
camera_model: "Nom de la càmera "
camera_lens_model: "Nom de la lent"
camera_mm: "Distància focal"
camera_mm_35: "Distància focal (equivalent a 35mm)"
camera_f: "Obertura"
camera_s: "Velocitat d'obturació"
camera_iso: "Sensibilitat ISO"
gps_lat: "Latitud "
gps_long: "Longitud "
_imageFrameEditor:
title: "Edició de fotogrames "
tip: "Pots decorar les imatges afegint etiquetes que continguin marcs i metadades."
header: "Capçalera"
footer: "Peu de pàgina "
borderThickness: "Amplada de la vora"
labelThickness: "Amplada de l'etiqueta "
labelScale: "Mida de l'etiqueta "
centered: "Alinea al centre"
captionMain: "Peu de foto (gran)"
captionSub: "Peu de foto (petit)"
availableVariables: "Variables disponibles"
withQrCode: "Codi QR"
backgroundColor: "Color del fons"
textColor: "Color del text"
font: "Lletra tipogràfica"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
quitWithoutSaveConfirm: "Sortir sense desar?"
failedToLoadImage: "Error en carregar la imatge"
_compression:
_quality:
high: "Qualitat alta"
@@ -1496,6 +1548,8 @@ _settings:
showUrlPreview: "Mostrar vista prèvia d'URL"
showAvailableReactionsFirstInNote: "Mostra les reacciones que pots fer servir al damunt"
showPageTabBarBottom: "Mostrar les pestanyes de les línies de temps a la part inferior"
emojiPaletteBanner: "Pots registrar ajustos preestablerts com paletes perquè es mostrin permanentment al selector d'emojis, o personalitzar la configuració de visió del selector."
enableAnimatedImages: "Activar imatges animades"
_chat:
showSenderName: "Mostrar el nom del remitent"
sendOnEnter: "Introdueix per enviar"
@@ -1504,6 +1558,8 @@ _preferencesProfile:
profileNameDescription: "Estableix un nom que identifiqui aquest dispositiu."
profileNameDescription2: "Per exemple: \"PC Principal\", \"Smartphone\", etc"
manageProfiles: "Gestionar perfils"
shareSameProfileBetweenDevicesIsNotRecommended: "No recomanem compartir el mateix perfil en diferents dispositius."
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "Si hi ha ajustos que vols sincronitzar entre diferents dispositius activa l'opció \"Sincronitza entre diferents dispositius\" individualment per cada una de les diferents opcions."
_preferencesBackup:
autoBackup: "Còpia de seguretat automàtica "
restoreFromBackup: "Restaurar des d'una còpia de seguretat"
@@ -1513,6 +1569,7 @@ _preferencesBackup:
youNeedToNameYourProfileToEnableAutoBackup: "Has de posar-li un nom al teu perfil per poder activar les còpies de seguretat automàtiques."
autoPreferencesBackupIsNotEnabledForThisDevice: "La còpia de seguretat automàtica no es troba activada en aquest dispositiu."
backupFound: "Còpia de seguretat de la configuració trobada"
forceBackup: "Còpia de seguretat forçada de la configuració "
_accountSettings:
requireSigninToViewContents: "És obligatori l'inici de sessió per poder veure el contingut"
requireSigninToViewContentsDescription1: "Es requereix l'inici de sessió per poder veure totes les notes i el contingut que has creat. Amb això esperem evitar que els rastrejadors recopilin informació."
@@ -2528,6 +2585,20 @@ _postForm:
replyPlaceholder: "Contestar..."
quotePlaceholder: "Citar..."
channelPlaceholder: "Publicar a un canal..."
showHowToUse: "Mostrar les instruccions"
_howToUse:
content_title: "Cos principal"
content_description: "Introdueix el contingut que vols publicar."
toolbar_title: "Barra d'eines "
toolbar_description: "Pots adjuntar arxius o enquestes, afegir anotacions o etiquetes i inserir emojis o mencions."
account_title: "Menú del compte"
account_description: "Pots anar canviant de comptes per publicar o veure una llista d'esborranys i les publicacions programades del teu compte."
visibility_title: "Visibilitat"
visibility_description: "Pots configurar la visibilitat de les teves notes."
menu_title: "Menú"
menu_description: "Pots fer altres accions com desar esborranys, programar publicacions i configurar reaccions."
submit_title: "Botó per publicar"
submit_description: "Publica les teves notes. També pots fer servir Ctrl + Enter / Cmd + Enter"
_placeholders:
a: "Que vols dir?..."
b: "Alguna cosa interessant al teu voltant?..."
@@ -2805,6 +2876,8 @@ _abuseReport:
notifiedWebhook: "Webhook que s'ha de fer servir"
deleteConfirm: "Segur que vols esborrar el destinatari de l'informe de moderació?"
_moderationLogTypes:
clearQueue: "Esborra la cua de feina"
promoteQueue: "Tornar a intentar la feina de la cua"
createRole: "Rol creat"
deleteRole: "Rol esborrat"
updateRole: "Rol actualitzat"
@@ -3199,6 +3272,7 @@ _watermarkEditor:
title: "Editar la marca d'aigua "
cover: "Cobrir-ho tot"
repeat: "Repetir"
preserveBoundingRect: "Ajusta'l per evitar que sobresortir en fer la rotació "
opacity: "Opacitat"
scale: "Mida"
text: "Text"
@@ -3220,11 +3294,13 @@ _watermarkEditor:
polkadotSubDotRadius: "Mida del lunar secundari"
polkadotSubDotDivisions: "Nombre de punts secundaris"
leaveBlankToAccountUrl: "Si deixes aquest camp buit, es farà servir l'URL del teu compte"
failedToLoadImage: "Error en carregar la imatge"
_imageEffector:
title: "Efecte"
addEffect: "Afegeix un efecte"
discardChangesConfirm: "Vols descartar els canvis i sortir?"
nothingToConfigure: "No hi ha opcions de configuració disponibles"
failedToLoadImage: "Error en carregar la imatge"
_fxs:
chromaticAberration: "Aberració cromàtica"
glitch: "Glitch"
@@ -3268,7 +3344,7 @@ _imageEffector:
frequency: "Freqüència "
strength: "Intensitat"
glitchChannelShift: "Canvi de canal "
seed: "Llindar"
seed: "Llavors"
redComponent: "Component vermell"
greenComponent: "Component verd"
blueComponent: "Component blau"
+12
View File
@@ -1110,6 +1110,15 @@ information: "Informace"
inMinutes: "Minut"
inDays: "Dnů"
widgets: "Widgety"
presets: "Předvolba"
_imageEditing:
_vars:
filename: "Název souboru"
_imageFrameEditor:
header: "Nadpis"
font: "Písmo"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
_chat:
invitations: "Pozvat"
noHistory: "Žádná historie"
@@ -1822,6 +1831,9 @@ _postForm:
replyPlaceholder: "Odpovědět na tuto poznámku..."
quotePlaceholder: "Citovat tuto poznámku..."
channelPlaceholder: "Zveřejnit příspěvek do kanálu..."
_howToUse:
visibility_title: "Viditelnost"
menu_title: "Menu"
_placeholders:
a: "Co máte v plánu?"
b: "Co se děje kolem vás?"
+13
View File
@@ -1371,6 +1371,16 @@ defaultImageCompressionLevel_description: "Ein niedrigerer Wert erhält die Bild
inMinutes: "Minute(n)"
inDays: "Tag(en)"
widgets: "Widgets"
presets: "Vorlage"
_imageEditing:
_vars:
filename: "Dateiname"
_imageFrameEditor:
header: "Kopfzeile"
font: "Schriftart"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
quitWithoutSaveConfirm: "Nicht gespeicherte Änderungen verwerfen?"
_order:
newest: "Neueste zuerst"
oldest: "Älteste zuerst"
@@ -2480,6 +2490,9 @@ _postForm:
replyPlaceholder: "Dieser Notiz antworten …"
quotePlaceholder: "Diese Notiz zitieren …"
channelPlaceholder: "In einen Kanal senden"
_howToUse:
visibility_title: "Sichtbarkeit"
menu_title: "Menü"
_placeholders:
a: "Was machst du momentan?"
b: "Was ist um dich herum los?"
+3
View File
@@ -289,6 +289,9 @@ renotes: "Κοινοποίηση σημειώματος"
postForm: "Φόρμα δημοσίευσης"
information: "Πληροφορίες"
widgets: "Μαραφέτια"
_imageEditing:
_vars:
filename: "Όνομα αρχείου"
_chat:
members: "Μέλη"
home: "Κεντρικό"
+82
View File
@@ -302,6 +302,7 @@ uploadFromUrlMayTakeTime: "It may take some time until the upload is complete."
uploadNFiles: "Upload {n} files"
explore: "Explore"
messageRead: "Read"
readAllChatMessages: "Mark all messages as read"
noMoreHistory: "There is no further history"
startChat: "Start chat"
nUsersRead: "read by {n}"
@@ -334,6 +335,7 @@ fileName: "Filename"
selectFile: "Select a file"
selectFiles: "Select files"
selectFolder: "Select a folder"
unselectFolder: "Deselect folder"
selectFolders: "Select folders"
fileNotSelected: "No file selected"
renameFile: "Rename file"
@@ -346,6 +348,7 @@ addFile: "Add a file"
showFile: "Show files"
emptyDrive: "Your Drive is empty"
emptyFolder: "This folder is empty"
dropHereToUpload: "Drop files here to upload"
unableToDelete: "Unable to delete"
inputNewFileName: "Enter a new filename"
inputNewDescription: "Enter new alt text"
@@ -773,6 +776,7 @@ lockedAccountInfo: "Unless you set your note visiblity to \"Followers only\", yo
alwaysMarkSensitive: "Mark as sensitive by default"
loadRawImages: "Load original images instead of showing thumbnails"
disableShowingAnimatedImages: "Don't play animated images"
disableShowingAnimatedImages_caption: "If animated images do not play even if this setting is disabled, it may be due to browser or OS accessibility settings, power-saving settings, or similar factors."
highlightSensitiveMedia: "Highlight sensitive media"
verificationEmailSent: "A verification email has been sent. Please follow the included link to complete verification."
notSet: "Not set"
@@ -1019,6 +1023,9 @@ pushNotificationAlreadySubscribed: "Push notifications are already enabled"
pushNotificationNotSupported: "Your browser or instance does not support push notifications"
sendPushNotificationReadMessage: "Delete push notifications once they have been read"
sendPushNotificationReadMessageCaption: "This may increase the power consumption of your device."
pleaseAllowPushNotification: "Please enable push notifications in your browser"
browserPushNotificationDisabled: "Failed to acquire permission to send notifications"
browserPushNotificationDisabledDescription: "You do not have permission to send notifications from {serverName}. Please allow notifications in your browser settings and try again."
windowMaximize: "Maximize"
windowMinimize: "Minimize"
windowRestore: "Restore"
@@ -1169,6 +1176,7 @@ installed: "Installed"
branding: "Branding"
enableServerMachineStats: "Publish server hardware stats"
enableIdenticonGeneration: "Enable user identicon generation"
showRoleBadgesOfRemoteUsers: "Display the role badges assigned to remote users"
turnOffToImprovePerformance: "Turning this off can increase performance."
createInviteCode: "Generate invite"
createWithOptions: "Generate with options"
@@ -1390,6 +1398,52 @@ scheduledToPostOnX: "Note is scheduled for {x}"
schedule: "Schedule"
scheduled: "Scheduled"
widgets: "Widgets"
deviceInfo: "Device information"
deviceInfoDescription: "When making technical inquiries, including the following information may help resolve the issue."
youAreAdmin: "You are admin"
frame: "Frame"
presets: "Preset"
zeroPadding: "Zero padding"
_imageEditing:
_vars:
caption: "File caption"
filename: "Filename"
filename_without_ext: "Filename without extension"
year: "Year of photography"
month: "Month of photogrphy"
day: "Date of photography"
hour: "Time the photo was taken (hour)"
minute: "Time the photo was taken (minute)"
second: "Time the photo was taken (second)"
camera_model: "Camera Name"
camera_lens_model: "Lens model"
camera_mm: "Focal length"
camera_mm_35: "Focal length (in 35 mm format)"
camera_f: "Aperture (f-number)"
camera_s: "Shutter speed"
camera_iso: "ISO"
gps_lat: "Latitude"
gps_long: "Longitude"
_imageFrameEditor:
title: "Edit frame"
tip: "You can decorate images by adding labels that include frames and metadata."
header: "Header"
footer: "Footer"
borderThickness: "Frame width"
labelThickness: "Label width"
labelScale: "Label scale"
centered: "Centered"
captionMain: "Caption (Big)"
captionSub: "Caption (Small)"
availableVariables: "Supported variables"
withQrCode: "QR Code"
backgroundColor: "Background color"
textColor: "Text color"
font: "Font"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
quitWithoutSaveConfirm: "Discard unsaved changes?"
failedToLoadImage: "Failed to load image"
_compression:
_quality:
high: "High quality"
@@ -1492,6 +1546,8 @@ _settings:
showUrlPreview: "Show URL preview"
showAvailableReactionsFirstInNote: "Show available reactions at the top."
showPageTabBarBottom: "Show page tab bar at the bottom"
emojiPaletteBanner: "You can register presets as palettes to display prominently in the emoji picker or customize the appearance of the picker."
enableAnimatedImages: "Enable animated images"
_chat:
showSenderName: "Show sender's name"
sendOnEnter: "Press Enter to send"
@@ -1500,6 +1556,8 @@ _preferencesProfile:
profileNameDescription: "Set a name that identifies this device."
profileNameDescription2: "Example: \"Main PC\", \"Smartphone\""
manageProfiles: "Manage Profiles"
shareSameProfileBetweenDevicesIsNotRecommended: "We do not recommend sharing the same profile across multiple devices."
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "If there are settings you wish to synchronize across multiple devices, enable the “Synchronize across multiple devices” option individually for each device."
_preferencesBackup:
autoBackup: "Auto backup"
restoreFromBackup: "Restore from backup"
@@ -1509,6 +1567,7 @@ _preferencesBackup:
youNeedToNameYourProfileToEnableAutoBackup: "A profile name must be set to enable auto backup."
autoPreferencesBackupIsNotEnabledForThisDevice: "Settings auto backup is not enabled on this device."
backupFound: "Settings backup is found"
forceBackup: "Force a backup of settings"
_accountSettings:
requireSigninToViewContents: "Require sign-in to view contents"
requireSigninToViewContentsDescription1: "Require login to view all notes and other content you have created. This will have the effect of preventing crawlers from collecting your information."
@@ -2014,6 +2073,7 @@ _role:
canManageAvatarDecorations: "Manage avatar decorations"
driveCapacity: "Drive capacity"
maxFileSize: "Upload-able max file size"
maxFileSize_caption: "Reverse proxies, CDNs, and other front-end components may have their own configuration settings."
alwaysMarkNsfw: "Always mark files as NSFW"
canUpdateBioMedia: "Can edit an icon or a banner image"
pinMax: "Maximum number of pinned notes"
@@ -2432,6 +2492,7 @@ _auth:
scopeUser: "Operate as the following user"
pleaseLogin: "Please log in to authorize applications."
byClickingYouWillBeRedirectedToThisUrl: "When access is granted, you will automatically be redirected to the following URL"
alreadyAuthorized: "This application already has access permission."
_antennaSources:
all: "All notes"
homeTimeline: "Notes from followed users"
@@ -2522,6 +2583,20 @@ _postForm:
replyPlaceholder: "Reply to this note..."
quotePlaceholder: "Quote this note..."
channelPlaceholder: "Post to a channel..."
showHowToUse: "Show how to use this form"
_howToUse:
content_title: "Body"
content_description: "Enter the content you wish to post here."
toolbar_title: "Toolbars"
toolbar_description: "You can attach files or poll, add annotations or hashtags, and insert emojis or mentions."
account_title: "Account menu"
account_description: "You can switch between accounts for posting, or view a list of drafts and scheduled posts saved to your account."
visibility_title: "Visibility"
visibility_description: "You can configure the visibility of your notes."
menu_title: "Menu"
menu_description: "You can save current content to drafts, schedule posts, set reactions, and perform other actions."
submit_title: "Post button"
submit_description: "Post your notes by pressing this button. You can also post using Ctrl + Enter / Cmd + Enter."
_placeholders:
a: "What are you up to?"
b: "What's happening around you?"
@@ -2698,6 +2773,8 @@ _notification:
quote: "Quotes"
reaction: "Reactions"
pollEnded: "Polls ending"
scheduledNotePosted: "Scheduled note was successful"
scheduledNotePostFailed: "Scheduled note failed"
receiveFollowRequest: "Received follow requests"
followRequestAccepted: "Accepted follow requests"
roleAssigned: "Role given"
@@ -2797,6 +2874,8 @@ _abuseReport:
notifiedWebhook: "Webhook to use"
deleteConfirm: "Are you sure that you want to delete the notification recipient?"
_moderationLogTypes:
clearQueue: "Clear queue"
promoteQueue: "Promote queue"
createRole: "Role created"
deleteRole: "Role deleted"
updateRole: "Role updated"
@@ -3191,6 +3270,7 @@ _watermarkEditor:
title: "Edit Watermark"
cover: "Cover everything"
repeat: "spread all over"
preserveBoundingRect: "Adjust to prevent overflow when rotating"
opacity: "Opacity"
scale: "Size"
text: "Text"
@@ -3212,11 +3292,13 @@ _watermarkEditor:
polkadotSubDotRadius: "Size of the secondary dot"
polkadotSubDotDivisions: "Number of sub-dots."
leaveBlankToAccountUrl: "Leave blank to use account URL"
failedToLoadImage: "Failed to load image"
_imageEffector:
title: "Effects"
addEffect: "Add Effects"
discardChangesConfirm: "Are you sure you want to leave? You have unsaved changes."
nothingToConfigure: "No configurable options available"
failedToLoadImage: "Failed to load image"
_fxs:
chromaticAberration: "Chromatic Aberration"
glitch: "Glitch"
+118 -42
View File
@@ -5,11 +5,11 @@ introMisskey: "¡Bienvenido/a! Misskey es un servicio de microblogging descentra
poweredByMisskeyDescription: "{name} es uno de los servicios (también llamado instancia) que usa la plataforma de código abierto <b>Misskey</b>"
monthAndDay: "{day}/{month}"
search: "Buscar"
reset: "Reiniciar"
reset: "Restablecer"
notifications: "Notificaciones"
username: "Nombre de usuario"
password: "Contraseña"
initialPasswordForSetup: "Contraseña para iniciar la inicialización"
initialPasswordForSetup: "Contraseña de configuración inicial"
initialPasswordIsIncorrect: "La contraseña para iniciar la configuración inicial es incorrecta."
initialPasswordForSetupDescription: "Si ha instalado Misskey usted mismo, utilice la contraseña introducida en el archivo de configuración.\nSi utiliza un servicio de alojamiento de Misskey o similar, utilice la contraseña proporcionada.\nSi no ha establecido una contraseña, déjela en blanco para continuar."
forgotPassword: "Olvidé mi contraseña"
@@ -43,7 +43,7 @@ favorite: "Añadir a favoritos"
favorites: "Favoritos"
unfavorite: "Quitar de favoritos"
favorited: "Añadido a favoritos."
alreadyFavorited: "Ya había sido añadido a favoritos"
alreadyFavorited: "Ya añadido a favoritos."
cantFavorite: "No se puede añadir a favoritos."
pin: "Fijar al perfil"
unpin: "Desfijar"
@@ -83,11 +83,13 @@ files: "Archivos"
download: "Descargar"
driveFileDeleteConfirm: "¿Desea borrar el archivo \"{name}\"? Las notas que tengan este archivo como adjunto serán eliminadas"
unfollowConfirm: "¿Desea dejar de seguir a {name}?"
cancelFollowRequestConfirm: "¿Desea cancelar su solicitud de seguimiento a {name}?"
rejectFollowRequestConfirm: "¿Desea rechazar la solicitud de seguimiento de {name}?"
exportRequested: "Has solicitado la exportación. Puede llevar un tiempo. Cuando termine la exportación, se añadirá al drive"
importRequested: "Has solicitado la importación. Puede llevar un tiempo."
lists: "Listas"
noLists: "No tienes ninguna lista"
note: "Notas"
note: "Nota"
notes: "Notas"
following: "Siguiendo"
followers: "Seguidores"
@@ -129,7 +131,7 @@ clickToShow: "Haz clic para verlo"
sensitive: "Marcado como sensible"
add: "Agregar"
reaction: "Reacción"
reactions: "Reacción"
reactions: "Reacciones"
emojiPicker: "Selector de emojis"
pinnedEmojisForReactionSettingDescription: "Puedes seleccionar reacciones para fijarlos en el selector"
pinnedEmojisSettingDescription: "Puedes seleccionar emojis para fijarlos en el selector"
@@ -251,7 +253,7 @@ noUsers: "No hay usuarios"
editProfile: "Editar perfil"
noteDeleteConfirm: "¿Quieres borrar esta nota?"
pinLimitExceeded: "Ya no se pueden fijar más notas"
done: "Terminado"
done: "Hecho"
processing: "Procesando..."
preprocessing: "Preparando"
preview: "Vista previa"
@@ -302,6 +304,7 @@ uploadFromUrlMayTakeTime: "Subir el fichero puede tardar un tiempo."
uploadNFiles: "Subir {n} archivos"
explore: "Explorar"
messageRead: "Ya leído"
readAllChatMessages: "Marcar todos los mensajes como leídos"
noMoreHistory: "El historial se ha acabado"
startChat: "Nuevo Chat"
nUsersRead: "Leído por {n} personas"
@@ -651,7 +654,7 @@ disablePlayer: "Cerrar reproductor"
expandTweet: "Expandir tweet"
themeEditor: "Editor de temas"
description: "Descripción"
describeFile: "Añade una descripción"
describeFile: "Añadir texto alternativo"
enterFileDescription: "Introducir un título"
author: "Autor"
leaveConfirm: "Hay modificaciones sin guardar. ¿Desea descartarlas?"
@@ -775,6 +778,7 @@ lockedAccountInfo: "A menos que configures la visibilidad de tus notas como \"S
alwaysMarkSensitive: "Marcar los medios de comunicación como contenido sensible por defecto"
loadRawImages: "Cargar las imágenes originales en lugar de mostrar las miniaturas"
disableShowingAnimatedImages: "No reproducir imágenes animadas"
disableShowingAnimatedImages_caption: "Si las imágenes animadas no se reproducen independientemente de esta configuración, es posible que la configuración de accesibilidad del navegador o del sistema operativo, los modos de ahorro de energía o funciones similares estén interfiriendo."
highlightSensitiveMedia: "Resaltar medios marcados como sensibles"
verificationEmailSent: "Se le ha enviado un correo electrónico de confirmación. Por favor, acceda al enlace proporcionado en el correo electrónico para completar la configuración."
notSet: "Sin especificar"
@@ -914,7 +918,7 @@ lastCommunication: "Última comunicación"
resolved: "Resuelto"
unresolved: "Sin resolver"
breakFollow: "Eliminar seguidor"
breakFollowConfirm: "¿Quieres dejar de seguir?"
breakFollowConfirm: "¿De verdad quieres eliminar a este seguidor?"
itsOn: "¡Está encendido!"
itsOff: "¡Está apagado!"
on: "Activado"
@@ -965,7 +969,7 @@ threeDays: "Tres días"
reflectMayTakeTime: "Puede pasar un tiempo hasta que se reflejen los cambios"
failedToFetchAccountInformation: "No se pudo obtener información de la cuenta"
rateLimitExceeded: "Se excedió el límite de peticiones"
cropImage: "Recortar imágen"
cropImage: "Recortar Imagen"
cropImageAsk: "¿Desea recortar la imagen?"
cropYes: "Recortar"
cropNo: "Usar como está"
@@ -984,7 +988,7 @@ typeToConfirm: "Ingrese {x} para confirmar"
deleteAccount: "Borrar cuenta"
document: "Documento"
numberOfPageCache: "Cantidad de páginas cacheadas"
numberOfPageCacheDescription: "Al aumentar el número mejora la conveniencia pero tambien puede aumentar la carga y la memoria a usarse"
numberOfPageCacheDescription: "Al aumentar el número mejora la conveniencia pero también puede aumentar la carga y la memoria a usarse"
logoutConfirm: "¿Cerrar sesión?"
logoutWillClearClientData: "Al cerrar la sesión, la información de configuración del cliente se borra del navegador. Para garantizar que la información de configuración se pueda restaurar al volver a iniciar sesión, active la copia de seguridad automática de la configuración."
lastActiveDate: "Utilizado por última vez el"
@@ -1021,10 +1025,13 @@ pushNotificationAlreadySubscribed: "Notificaciones emergentes ya activadas"
pushNotificationNotSupported: "El navegador o la instancia no admiten notificaciones push"
sendPushNotificationReadMessage: "Eliminar las notificaciones push después de leer las notificaciones y los mensajes"
sendPushNotificationReadMessageCaption: "La notificación \"{emptyPushNotificationMessage}\" aparecerá momentáneamente. Esto puede aumentar el consumo de batería del dispositivo."
pleaseAllowPushNotification: "Por favor, permita las notificaciones y la configuración del navegador."
browserPushNotificationDisabled: "No se ha podido obtener permiso para enviar notificaciones."
browserPushNotificationDisabledDescription: "No tienes permiso para enviar notificaciones desde {serverName}. Permite las notificaciones en la configuración de tu navegador y vuelve a intentarlo."
windowMaximize: "Maximizar"
windowMinimize: "Minimizar"
windowRestore: "Regresar"
caption: "Pie de foto"
caption: "Texto alternativo"
loggedInAsBot: "Inicio sesión como cuenta bot."
tools: "Utilidades"
cannotLoad: "No se puede cargar."
@@ -1152,7 +1159,7 @@ initialAccountSetting: "Configración inicial de su cuenta"
youFollowing: "Siguiendo"
preventAiLearning: "Rechazar el uso en el Aprendizaje de Máquinas. (IA Generativa)"
preventAiLearningDescription: "Pedirle a las arañas (crawlers) no usar los textos publicados o imágenes en el aprendizaje automático (IA Predictiva / Generativa). Ésto se logra añadiendo una marca respuesta HTML con la cadena \"noai\" al cantenido. Una prevención total no podría lograrse sólo usando ésta marca, ya que puede ser simplemente ignorada."
options: "Opción"
options: "Opciones"
specifyUser: "Especificar usuario"
lookupConfirm: "¿Quiere informarse?"
openTagPageConfirm: "¿Quieres abrir la página de etiquetas?"
@@ -1171,6 +1178,7 @@ installed: "Instalado"
branding: "Marca"
enableServerMachineStats: "Publicar estadísticas de hardware del servidor"
enableIdenticonGeneration: "Activar generación de identicon por usuario"
showRoleBadgesOfRemoteUsers: "Mostrar la insignia de rol asignada a los usuarios remotos."
turnOffToImprovePerformance: "Desactivar esto puede aumentar el rendimiento."
createInviteCode: "Generar invitación"
createWithOptions: "Generar con opciones"
@@ -1261,7 +1269,7 @@ addMfmFunction: "Añadir función MFM"
enableQuickAddMfmFunction: "Activar acceso rápido para añadir funciones MFM"
bubbleGame: "Bubble Game"
sfx: "Efectos de sonido"
soundWillBePlayed: "Se reproducirán efectos sonoros"
soundWillBePlayed: "Con música y efectos sonoros"
showReplay: "Ver reproducción"
replay: "Reproducir"
replaying: "Reproduciendo"
@@ -1348,10 +1356,10 @@ textCount: "caracteres"
information: "Información"
chat: "Chat"
directMessage: "Chatear"
directMessage_short: "Mensaje"
directMessage_short: "Mensajes"
migrateOldSettings: "Migrar la configuración anterior"
migrateOldSettings_description: "Esto debería hacerse automáticamente, pero si por alguna razón la migración no ha tenido éxito, puede activar usted mismo el proceso de migración manualmente. Se sobrescribirá la información de configuración actual."
compress: "Comprimir"
compress: "Compresión de la imagen"
right: "Derecha"
bottom: "Abajo"
top: "Arriba"
@@ -1385,15 +1393,59 @@ pluginsAreDisabledBecauseSafeMode: "El modo seguro está activado, por lo que to
customCssIsDisabledBecauseSafeMode: "El modo seguro está activado, por lo que no se aplica el CSS personalizado."
themeIsDefaultBecauseSafeMode: "Mientras el modo seguro esté activado, se utilizará el tema predeterminado. Cuando se desactive el modo seguro, se volverá al tema original."
thankYouForTestingBeta: "¡Gracias por tu colaboración en la prueba de la versión beta!"
createUserSpecifiedNote: "Crear notas especificadas por el usuario"
createUserSpecifiedNote: "Mencionar al usuario (Nota Directa)"
schedulePost: "Programar una nota"
scheduleToPostOnX: "Programar una nota para {x}"
scheduledToPostOnX: "La nota está programada para {x}."
schedule: "Programado"
scheduledToPostOnX: "La nota está programada para el {x}."
schedule: "Programar"
scheduled: "Programado"
widgets: "Widgets"
deviceInfo: "Información del dispositivo"
deviceInfoDescription: "Al realizar consultas técnicas, incluir la siguiente información puede ayudar a resolver el problema."
youAreAdmin: "Eres administrador."
frame: "Marco"
presets: "Predefinido"
zeroPadding: "Relleno cero"
_imageEditing:
_vars:
caption: "Título del archivo"
filename: "Nombre de archivo"
filename_without_ext: "Nombre del archivo sin la extensión"
year: "Año de rodaje"
month: "Mes de rodaje"
day: "Día de rodaje"
hour: "Hora"
minute: "Minuto"
second: "Segundo"
camera_model: "Nombre de la cámara"
camera_lens_model: "Modelo de lente"
camera_mm: "Distancia focal"
camera_mm_35: "Distancia Focal (Equivalente a formato de 35mm)"
camera_f: "Apertura de diafragma"
camera_s: "Velocidad de Obturación"
camera_iso: "Sensibilidad ISO"
gps_lat: "Latitud"
gps_long: "Longitud"
_imageFrameEditor:
title: "Edición de Fotograma"
tip: "Decora tus imágenes con marcos y etiquetas que contengan metadatos."
header: "Cabezal"
footer: "Pie de página"
borderThickness: "Ancho del borde"
labelThickness: "Ancho de la etiqueta"
labelScale: "Escala de la Etiqueta"
centered: "Alinear al centro"
captionMain: "Pie de foto (Grande)"
captionSub: "Pie de foto (Pequeño)"
availableVariables: "Variables disponibles"
withQrCode: "Código QR"
backgroundColor: "Color de fondo"
textColor: "Color del texto"
font: "Fuente"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
quitWithoutSaveConfirm: "¿Descartar cambios no guardados?"
failedToLoadImage: "Error al cargar la imagen"
_compression:
_quality:
high: "Calidad alta"
@@ -1407,7 +1459,7 @@ _order:
newest: "Los más recientes primero"
oldest: "Los más antiguos primero"
_chat:
messages: "Mensaje"
messages: "Mensajes"
noMessagesYet: "Aún no hay mensajes"
newMessage: "Mensajes nuevos"
individualChat: "Chat individual"
@@ -1496,6 +1548,8 @@ _settings:
showUrlPreview: "Mostrar la vista previa de la URL"
showAvailableReactionsFirstInNote: "Mostrar las reacciones disponibles en la parte superior."
showPageTabBarBottom: "Mostrar la barra de pestañas de la página en la parte inferior."
emojiPaletteBanner: "Puedes registrar ajustes preestablecidos como paletas para que se muestren permanentemente en el selector de emojis, o personalizar el método de visualización del selector."
enableAnimatedImages: "Habilitar imágenes animadas"
_chat:
showSenderName: "Mostrar el nombre del remitente"
sendOnEnter: "Intro para enviar"
@@ -1504,6 +1558,8 @@ _preferencesProfile:
profileNameDescription: "Establece un nombre que identifique al dispositivo"
profileNameDescription2: "Por ejemplo: \"PC Principal\",\"Teléfono\""
manageProfiles: "Administrar perfiles"
shareSameProfileBetweenDevicesIsNotRecommended: "No recomendamos compartir el mismo perfil en varios dispositivos."
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "Si hay ajustes que deseas sincronizar en varios dispositivos, activa la opción «Sincronizar en varios dispositivos» individualmente para cada uno de ellos."
_preferencesBackup:
autoBackup: "Respaldo automático"
restoreFromBackup: "Restaurar desde copia de seguridad"
@@ -1513,6 +1569,7 @@ _preferencesBackup:
youNeedToNameYourProfileToEnableAutoBackup: "Se debe establecer un nombre de perfil para activar la copia de seguridad automática."
autoPreferencesBackupIsNotEnabledForThisDevice: "La copia de seguridad automática de los ajustes no está activada en este dispositivo."
backupFound: "Copia de seguridad de los ajustes encontrada "
forceBackup: "Forzar una copia de seguridad de la configuración"
_accountSettings:
requireSigninToViewContents: "Se requiere iniciar sesión para ver el contenido"
requireSigninToViewContentsDescription1: "Requiere iniciar sesión para ver todas las notas y otros contenidos que hayas creado. Se espera que esto evite que los rastreadores recopilen información."
@@ -1550,7 +1607,7 @@ _bubbleGame:
score: "Puntos"
scoreYen: "Cantidad de dinero ganada"
highScore: "Puntuación más alta"
maxChain: "Número máximo de cadenas"
maxChain: "Número máximo de combos"
yen: "{yen} Yenes"
estimatedQty: "{qty} Piezas"
scoreSweets: "{onigiriQtyWithUnit} Onigiris"
@@ -1984,7 +2041,7 @@ _role:
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"
options: "Opciones"
policies: "Política"
baseRole: "Rol base"
useBaseValue: "Usar los valores del rol base"
@@ -2095,7 +2152,7 @@ _accountDelete:
accountDelete: "Eliminar Cuenta"
mayTakeTime: "La eliminación de la cuenta es un proceso que precisa de carga. Puede pasar un tiempo hasta que se complete si es mucho el contenido creado y los archivos subidos."
sendEmail: "Cuando se termine de borrar la cuenta, se enviará un correo a la dirección usada para el registro."
requestAccountDelete: "Pedir la eliminación de la cuenta."
requestAccountDelete: "Solicitar la eliminación de la cuenta."
started: "El proceso de eliminación ha comenzado."
inProgress: "La eliminación está en proceso."
_ad:
@@ -2468,7 +2525,7 @@ _widgets:
digitalClock: "Reloj digital"
unixClock: "Reloj UNIX"
federation: "Federación"
instanceCloud: "Nube de palabras de la instancia"
instanceCloud: "Nube de Instancias Federadas"
postForm: "Formulario"
slideshow: "Diapositivas"
button: "Botón"
@@ -2493,7 +2550,7 @@ _poll:
noOnlyOneChoice: "Se necesitan al menos 2 opciones"
choiceN: "Opción {n}"
noMore: "No se pueden agregar más"
canMultipleVote: "Permitir más de una respuesta"
canMultipleVote: "Permitir seleccionar varias opciones"
expiration: "Termina el"
infinite: "Sin límite de tiempo"
at: "Elegir fecha y hora"
@@ -2524,10 +2581,24 @@ _visibility:
disableFederationDescription: "No enviar a otras instancias"
_postForm:
quitInspiteOfThereAreUnuploadedFilesConfirm: "Hay archivos que no se han cargado, ¿deseas descartarlos y cerrar el formulario?"
uploaderTip: "El archivo aún no se ha cargado. Desde el menú Archivo, puedes cambiar el nombre, recortar imágenes, poner marcas de agua y comprimir o no el archivo. Los archivos se cargan automáticamente al publicar una nota."
uploaderTip: "El archivo aún no se ha cargado. Desde el menú de archivos, puedes cambiar el nombre, recortar la imagen, añadir una marca de agua y configurar la compresión, entre otras opciones. Los archivos se suben automáticamente al publicar una nota."
replyPlaceholder: "Responder a esta nota"
quotePlaceholder: "Citar esta nota"
channelPlaceholder: "Publicar en el canal"
showHowToUse: "Mostrar el tutorial de este formulario"
_howToUse:
content_title: "Cuerpo"
content_description: "Introduce aquí el contenido que deseas publicar."
toolbar_title: "Barras de herramientas"
toolbar_description: "Puedes adjuntar archivos o realizar encuestas, añadir anotaciones o hashtags e insertar emojis o menciones."
account_title: "Menú de la cuenta"
account_description: "Puedes cambiar entre cuentas para publicar o ver una lista de borradores y publicaciones programadas guardadas en tu cuenta."
visibility_title: "Visibilidad"
visibility_description: "Puedes configurar la visibilidad de tus notas."
menu_title: "Menú"
menu_description: "Puedes realizar otras acciones, como guardar borradores, programar publicaciones y configurar reacciones."
submit_title: "Botón de publicar"
submit_description: "Publica tus notas pulsando este botón. También puedes publicar utilizando Ctrl + Intro / Cmd + Intro."
_placeholders:
a: "¿Qué haces?"
b: "¿Te pasó algo?"
@@ -2562,7 +2633,7 @@ _exportOrImport:
userLists: "Listas"
excludeMutingUsers: "Excluir usuarios silenciados"
excludeInactiveUsers: "Excluir usuarios inactivos"
withReplies: "Incluir respuestas de los usuarios importados en la línea de tiempo"
withReplies: "Si el archivo no incluye información sobre si las respuestas deben incluirse en la línea de tiempo, las respuestas realizadas por el importador deben incluirse en la línea de tiempo."
_charts:
federation: "Federación"
apRequest: "Pedidos"
@@ -2805,6 +2876,8 @@ _abuseReport:
notifiedWebhook: "Webhook a utilizar"
deleteConfirm: "¿Estás seguro de que deseas borrar el destinatario del informe de moderación?"
_moderationLogTypes:
clearQueue: "Borrar la cola de trabajos"
promoteQueue: "Reintentar el trabajo en la cola"
createRole: "Rol creado"
deleteRole: "Rol eliminado"
updateRole: "Rol actualizado"
@@ -2957,7 +3030,7 @@ _reversi:
loopedMap: "Mapa en bucle"
canPutEverywhere: "Las fichas se pueden poner a cualquier lugar\n"
timeLimitForEachTurn: "Tiempo límite por jugada."
freeMatch: "Partida libre."
freeMatch: "Partida libre"
lookingForPlayer: "Buscando oponente"
gameCanceled: "La partida ha sido cancelada."
shareToTlTheGameWhenStart: "Compartir la partida en la línea de tiempo cuando comience "
@@ -3199,6 +3272,7 @@ _watermarkEditor:
title: "Editar la marca de agua"
cover: "Cubrir todo"
repeat: "Repetir"
preserveBoundingRect: "Ajuste para evitar que se desborde al rotar."
opacity: "Opacidad"
scale: "Tamaño"
text: "Texto"
@@ -3212,19 +3286,21 @@ _watermarkEditor:
stripe: "Rayas"
stripeWidth: "Anchura de línea"
stripeFrequency: "Número de líneas."
polkadot: "Lunares"
checker: "verificador"
polkadot: "Patrón de Lunares"
checker: "Patrón de Damas / Tablero de Ajedrez"
polkadotMainDotOpacity: "Opacidad del círculo principal"
polkadotMainDotRadius: "Tamaño del círculo principal."
polkadotSubDotOpacity: "Opacidad del círculo secundario"
polkadotSubDotRadius: "Tamaño del círculo secundario."
polkadotSubDotDivisions: "Número de subpuntos."
leaveBlankToAccountUrl: "Si dejas este campo en blanco, se utilizará la URL de tu cuenta."
failedToLoadImage: "Error al cargar la imagen"
_imageEffector:
title: "Efecto"
addEffect: "Añadir Efecto"
discardChangesConfirm: "¿Ignorar cambios y salir?"
nothingToConfigure: "No hay opciones configurables disponibles."
failedToLoadImage: "Error al cargar la imagen"
_fxs:
chromaticAberration: "Aberración Cromática"
glitch: "Glitch"
@@ -3234,15 +3310,15 @@ _imageEffector:
blur: "Difuminar"
pixelate: "Pixelar"
colorAdjust: "Corrección de Color"
colorClamp: "Compresión cromática"
colorClampAdvanced: "Compresión cromática avanzada"
colorClamp: "Ajuste de Tono"
colorClampAdvanced: "Ajuste de Tono avanzado"
distort: "Distorsión"
threshold: "umbral"
zoomLines: "Saturación de Líneas"
threshold: "Binarización"
zoomLines: "Líneas de Impacto"
stripe: "Rayas"
polkadot: "Lunares"
checker: "Corrector"
blockNoise: "Bloquear Ruido"
polkadot: "Patrón de Lunares"
checker: "Patrón de Damas / Tablero de Ajedrez"
blockNoise: "Ruido de Bloque"
tearing: "Rasgado de Imagen (Tearing)"
fill: "Relleno de color"
_fxProps:
@@ -3259,7 +3335,7 @@ _imageEffector:
lightness: "Brillo"
contrast: "Contraste"
hue: "Tonalidad"
brightness: "Brillo"
brightness: "Luminancia"
saturation: "Saturación"
max: "Valor máximo"
min: "Valor mínimo"
@@ -3267,11 +3343,11 @@ _imageEffector:
phase: "Fase"
frequency: "Frecuencia"
strength: "Intensidad"
glitchChannelShift: "cambio de canal de imagen"
glitchChannelShift: "Desfase"
seed: "Valor de la semilla"
redComponent: "Componente rojo"
greenComponent: "Componente Verde"
blueComponent: "Componente Azul"
redComponent: "Canal Rojo"
greenComponent: "Canal Verde"
blueComponent: "Canal Azul"
threshold: "Umbral"
centerX: "Centrar X"
centerY: "Centrar Y"
@@ -3279,7 +3355,7 @@ _imageEffector:
zoomLinesSmoothingDescription: "El suavizado y el ancho de línea de zoom no se pueden utilizar juntos."
zoomLinesThreshold: "Ancho de línea del zoom"
zoomLinesMaskSize: "Diámetro del centro"
zoomLinesBlack: "Hacer oscuro"
zoomLinesBlack: "Cambiar color de las líneas de impacto a negro."
circle: "Círculo"
drafts: "Borrador"
_drafts:
+12
View File
@@ -1274,6 +1274,15 @@ information: "Informations"
inMinutes: "min"
inDays: "j"
widgets: "Widgets"
presets: "Préréglage"
_imageEditing:
_vars:
filename: "Nom du fichier"
_imageFrameEditor:
header: "Entête"
font: "Police de caractères"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
_chat:
invitations: "Inviter"
noHistory: "Pas d'historique"
@@ -2037,6 +2046,9 @@ _postForm:
replyPlaceholder: "Répondre à cette note ..."
quotePlaceholder: "Citez cette note ..."
channelPlaceholder: "Publier au canal…"
_howToUse:
visibility_title: "Visibilité"
menu_title: "Menu"
_placeholders:
a: "Quoi de neuf ?"
b: "Il s'est passé quelque chose ?"
+46 -1
View File
@@ -240,6 +240,8 @@ blockedInstances: "Instansi terblokir"
blockedInstancesDescription: "Daftar nama host dari instansi yang diperlukan untuk diblokir. Instansi yang didaftarkan tidak akan dapat berkomunikasi dengan instansi ini."
silencedInstances: "Instansi yang disenyapkan"
silencedInstancesDescription: "Daftar nama host dari instansi yang ingin kamu senyapkan. Semua akun dari instansi yang terdaftar akan diperlakukan sebagai disenyapkan. Hal ini membuat akun hanya dapat membuat permintaan mengikuti, dan tidak dapat menyebutkan akun lokal apabila tidak mengikuti. Hal ini tidak akan mempengaruhi instansi yang diblokir."
mediaSilencedInstances: "Server dengan media dibisukan"
mediaSilencedInstancesDescription: "Masukkan host server yang medianya ingin Anda bisukan, pisahkan dengan baris baru. Semua berkas dari akun di server ini akan dianggap sebagai sensitif dan emoji kustom tidak akan tersedia. Ini tidak akan membengaruhi server yang diblokir."
federationAllowedHosts: "Server yang membolehkan federasi"
muteAndBlock: "Bisukan / Blokir"
mutedUsers: "Pengguna yang dibisukan"
@@ -298,6 +300,7 @@ uploadFromUrlMayTakeTime: "Membutuhkan beberapa waktu hingga pengunggahan selesa
explore: "Jelajahi"
messageRead: "Telah dibaca"
noMoreHistory: "Tidak ada sejarah lagi"
startChat: "Kirim pesan"
nUsersRead: "Dibaca oleh {n}"
agreeTo: "Saya setuju kepada {0}"
agree: "Setuju"
@@ -397,7 +400,7 @@ enableHcaptcha: "Nyalakan hCaptcha"
hcaptchaSiteKey: "Site Key"
hcaptchaSecretKey: "Secret Key"
mcaptcha: "mCaptcha"
enableMcaptcha: "Nyalakan mCaptcha"
enableMcaptcha: ""
mcaptchaSiteKey: "Site key"
mcaptchaSecretKey: "Secret Key"
mcaptchaInstanceUrl: "URL instansi mCaptcha"
@@ -510,6 +513,7 @@ emojiStyle: "Gaya emoji"
native: "Native"
menuStyle: "Gaya menu"
style: "Gaya"
popup: "Pemunculan"
showNoteActionsOnlyHover: "Hanya tampilkan aksi catatan saat ditunjuk"
showReactionsCount: "Lihat jumlah reaksi dalam catatan"
noHistory: "Tidak ada riwayat"
@@ -566,6 +570,7 @@ showFixedPostForm: "Tampilkan form posting di atas lini masa"
showFixedPostFormInChannel: "Tampilkan form posting di atas lini masa (Kanal)"
withRepliesByDefaultForNewlyFollowed: "Termasuk balasan dari pengguna baru yang diikuti pada lini masa secara bawaan"
newNoteRecived: "Kamu mendapat catatan baru"
newNote: "Catatan baru"
sounds: "Bunyi"
sound: "Bunyi"
listen: "Dengarkan"
@@ -1028,6 +1033,7 @@ permissionDeniedError: "Operasi ditolak"
permissionDeniedErrorDescription: "Akun ini tidak memiliki izin untuk melakukan aksi ini."
preset: "Prasetel"
selectFromPresets: "Pilih dari prasetel"
custom: "Penyesuaian"
achievements: "Pencapaian"
gotInvalidResponseError: "Respon peladen tidak valid"
gotInvalidResponseErrorDescription: "Peladen tidak dapat dijangkau atau sedang dalam perawatan. Mohon coba lagi nanti."
@@ -1110,6 +1116,7 @@ preservedUsernamesDescription: "Daftar nama pengguna yang dicadangkan dipisah de
createNoteFromTheFile: "Buat catatan dari berkas ini"
archive: "Arsipkan"
archived: "Diarsipkan"
unarchive: "Batalkan pengarsipan"
channelArchiveConfirmTitle: "Yakin untuk mengarsipkan {name}?"
channelArchiveConfirmDescription: "Kanal yang diarsipkan tidak akan muncul pada daftar kanal atau hasil pencarian. Postingan baru juga tidak dapat ditambahkan lagi."
thisChannelArchived: "Kanal ini telah diarsipkan."
@@ -1251,6 +1258,7 @@ noDescription: "Tidak ada deskripsi"
alwaysConfirmFollow: "Selalu konfirmasi ketika mengikuti"
inquiry: "Hubungi kami"
tryAgain: "Silahkan coba lagi."
sensitiveMediaRevealConfirm: "Media sensitif. Apakah ingin melihat?"
createdLists: "Senarai yang dibuat"
createdAntennas: "Antena yang dibuat"
fromX: "Dari {x}"
@@ -1258,21 +1266,52 @@ noteOfThisUser: "Catatan oleh pengguna ini"
clipNoteLimitExceeded: "Klip ini tak bisa ditambahi lagi catatan."
performance: "Kinerja"
modified: "Diubah"
discard: "Buang"
thereAreNChanges: "Ada {n} perubahan"
signinWithPasskey: "Masuk dengan kunci sandi"
unknownWebAuthnKey: "Kunci sandi tidak terdaftar."
passkeyVerificationFailed: "Verifikasi kunci sandi gagal."
passkeyVerificationSucceededButPasswordlessLoginDisabled: "Verifikasi kunci sandi berhasil, namun pemasukan tanpa sandi dinonaktifkan."
messageToFollower: "Pesan kepada pengikut"
prohibitedWordsForNameOfUser: "Kata yang dilarang untuk nama pengguna"
lockdown: "Kuncitara"
noName: "Tidak ada nama"
skip: "Lewati"
paste: "Tempel"
emojiPalette: "Palet emoji"
postForm: "Buat catatan"
information: "Informasi"
chat: "Obrolan"
directMessage: "Obrolan pengguna"
right: "Kanan"
bottom: "Bawah"
top: "Atas"
advice: "Saran"
inMinutes: "menit"
inDays: "hari"
widgets: "Widget"
presets: "Prasetel"
_imageEditing:
_vars:
filename: "Nama berkas"
_imageFrameEditor:
header: "Header"
font: "Font"
fontSerif: "Serif"
fontSansSerif: "Sans-serif"
_chat:
invitations: "Undang"
history: "Riwayat obrolan"
noHistory: "Tidak ada riwayat"
members: "Anggota"
home: "Beranda"
send: "Kirim"
chatWithThisUser: "Obrolan pengguna"
_settings:
webhook: "Webhook"
contentsUpdateFrequency: "Frekuensi pembaruan konten"
_preferencesProfile:
profileName: "Nama profil"
_abuseUserReport:
accept: "Setuju"
reject: "Tolak"
@@ -1966,6 +2005,7 @@ _sfx:
noteMy: "Catatan (Saya)"
notification: "Notifikasi"
reaction: "Ketika memilih reaksi"
chatMessage: "Obrolan pengguna"
_soundSettings:
driveFile: "Menggunakan berkas audio dalam Drive"
driveFileWarn: "Pilih berkas audio dari Drive"
@@ -2168,6 +2208,7 @@ _widgets:
chooseList: "Pilih daftar"
clicker: "Pengeklik"
birthdayFollowings: "Pengguna yang merayakan hari ulang tahunnya hari ini"
chat: "Obrolan pengguna"
_cw:
hide: "Sembunyikan"
show: "Lihat konten"
@@ -2210,6 +2251,9 @@ _postForm:
replyPlaceholder: "Balas ke catatan ini..."
quotePlaceholder: "Kutip catatan ini..."
channelPlaceholder: "Posting ke kanal"
_howToUse:
visibility_title: "Visibilitas"
menu_title: "Menu"
_placeholders:
a: "Sedang apa kamu saat ini?"
b: "Apa yang terjadi di sekitarmu?"
@@ -2416,6 +2460,7 @@ _deck:
mentions: "Sebutan"
direct: "Langsung"
roleTimeline: "Lini masa peran"
chat: "Obrolan pengguna"
_dialog:
charactersExceeded: "Kamu telah melebihi batas karakter maksimum! Saat ini pada {current} dari {max}."
charactersBelow: "Kamu berada di bawah batas minimum karakter! Saat ini pada {current} dari {min}."
+298 -2
View File
@@ -350,6 +350,14 @@ export interface Locale extends ILocale {
* {name}
*/
"unfollowConfirm": ParameterizedString<"name">;
/**
* {name}
*/
"cancelFollowRequestConfirm": ParameterizedString<"name">;
/**
* {name}
*/
"rejectFollowRequestConfirm": ParameterizedString<"name">;
/**
*
*/
@@ -747,7 +755,7 @@ export interface Locale extends ILocale {
*/
"flagShowTimelineRepliesDescription": string;
/**
*
*
*/
"autoAcceptFollowed": string;
/**
@@ -1226,6 +1234,10 @@ export interface Locale extends ILocale {
*
*/
"messageRead": string;
/**
*
*/
"readAllChatMessages": string;
/**
*
*/
@@ -3118,6 +3130,10 @@ export interface Locale extends ILocale {
*
*/
"disableShowingAnimatedImages": string;
/**
* OSのアクセシビリティ設定や省電力設定等が干渉している場合があります
*/
"disableShowingAnimatedImages_caption": string;
/**
*
*/
@@ -4102,6 +4118,18 @@ export interface Locale extends ILocale {
*
*/
"sendPushNotificationReadMessageCaption": string;
/**
*
*/
"pleaseAllowPushNotification": string;
/**
*
*/
"browserPushNotificationDisabled": string;
/**
* {serverName}
*/
"browserPushNotificationDisabledDescription": ParameterizedString<"serverName">;
/**
*
*/
@@ -4702,6 +4730,10 @@ export interface Locale extends ILocale {
* Identicon生成を有効にする
*/
"enableIdenticonGeneration": string;
/**
*
*/
"showRoleBadgesOfRemoteUsers": string;
/**
*
*/
@@ -5597,6 +5629,176 @@ export interface Locale extends ILocale {
*
*/
"deviceInfoDescription": string;
/**
*
*/
"youAreAdmin": string;
/**
*
*/
"frame": string;
/**
*
*/
"presets": string;
/**
*
*/
"zeroPadding": string;
"_imageEditing": {
"_vars": {
/**
*
*/
"caption": string;
/**
*
*/
"filename": string;
/**
*
*/
"filename_without_ext": string;
/**
*
*/
"year": string;
/**
*
*/
"month": string;
/**
*
*/
"day": string;
/**
* ()
*/
"hour": string;
/**
* ()
*/
"minute": string;
/**
* ()
*/
"second": string;
/**
*
*/
"camera_model": string;
/**
*
*/
"camera_lens_model": string;
/**
*
*/
"camera_mm": string;
/**
* (35mm判換算)
*/
"camera_mm_35": string;
/**
*
*/
"camera_f": string;
/**
*
*/
"camera_s": string;
/**
* ISO感度
*/
"camera_iso": string;
/**
*
*/
"gps_lat": string;
/**
*
*/
"gps_long": string;
};
};
"_imageFrameEditor": {
/**
*
*/
"title": string;
/**
*
*/
"tip": string;
/**
*
*/
"header": string;
/**
*
*/
"footer": string;
/**
*
*/
"borderThickness": string;
/**
*
*/
"labelThickness": string;
/**
*
*/
"labelScale": string;
/**
*
*/
"centered": string;
/**
* ()
*/
"captionMain": string;
/**
* ()
*/
"captionSub": string;
/**
*
*/
"availableVariables": string;
/**
*
*/
"withQrCode": string;
/**
*
*/
"backgroundColor": string;
/**
*
*/
"textColor": string;
/**
*
*/
"font": string;
/**
*
*/
"fontSerif": string;
/**
*
*/
"fontSansSerif": string;
/**
*
*/
"quitWithoutSaveConfirm": string;
/**
*
*/
"failedToLoadImage": string;
};
"_compression": {
"_quality": {
/**
@@ -5989,6 +6191,14 @@ export interface Locale extends ILocale {
*
*/
"showPageTabBarBottom": string;
/**
*
*/
"emojiPaletteBanner": string;
/**
*
*/
"enableAnimatedImages": string;
"_chat": {
/**
*
@@ -6017,6 +6227,14 @@ export interface Locale extends ILocale {
*
*/
"manageProfiles": string;
/**
*
*/
"shareSameProfileBetweenDevicesIsNotRecommended": string;
/**
*
*/
"useSyncBetweenDevicesOptionIfYouWantToSyncSetting": string;
};
"_preferencesBackup": {
/**
@@ -6051,6 +6269,10 @@ export interface Locale extends ILocale {
*
*/
"backupFound": string;
/**
*
*/
"forceBackup": string;
};
"_accountSettings": {
/**
@@ -9828,6 +10050,60 @@ export interface Locale extends ILocale {
* 稿...
*/
"channelPlaceholder": string;
/**
*
*/
"showHowToUse": string;
"_howToUse": {
/**
*
*/
"content_title": string;
/**
* 稿
*/
"content_description": string;
/**
*
*/
"toolbar_title": string;
/**
*
*/
"toolbar_description": string;
/**
*
*/
"account_title": string;
/**
* 稿稿
*/
"account_description": string;
/**
*
*/
"visibility_title": string;
/**
*
*/
"visibility_description": string;
/**
*
*/
"menu_title": string;
/**
* 稿
*/
"menu_description": string;
/**
* 稿
*/
"submit_title": string;
/**
* 稿Ctrl + Enter / Cmd + Enter 稿
*/
"submit_description": string;
};
"_placeholders": {
/**
*
@@ -10882,6 +11158,14 @@ export interface Locale extends ILocale {
};
};
"_moderationLogTypes": {
/**
*
*/
"clearQueue": string;
/**
*
*/
"promoteQueue": string;
/**
*
*/
@@ -12310,7 +12594,7 @@ export interface Locale extends ILocale {
"defaultPreset": string;
"_watermarkEditor": {
/**
*
*
*/
"tip": string;
/**
@@ -12337,6 +12621,10 @@ export interface Locale extends ILocale {
*
*/
"repeat": string;
/**
* 調
*/
"preserveBoundingRect": string;
/**
*
*/
@@ -12421,6 +12709,10 @@ export interface Locale extends ILocale {
* URLになります
*/
"leaveBlankToAccountUrl": string;
/**
*
*/
"failedToLoadImage": string;
};
"_imageEffector": {
/**
@@ -12439,6 +12731,10 @@ export interface Locale extends ILocale {
*
*/
"nothingToConfigure": string;
/**
*
*/
"failedToLoadImage": string;
"_fxs": {
/**
*
+124 -42
View File
@@ -144,7 +144,7 @@ markAsSensitive: "Segna come esplicito"
unmarkAsSensitive: "Non segnare come esplicito "
enterFileName: "Nome del file"
mute: "Silenziare"
unmute: "Riattiva l'audio"
unmute: "Dai voce"
renoteMute: "Silenziare le Rinota"
renoteUnmute: "Non silenziare le Rinota"
block: "Bloccare"
@@ -302,6 +302,7 @@ uploadFromUrlMayTakeTime: "Il caricamento del file può richiedere tempo."
uploadNFiles: "Caricare {n} file singolarmente"
explore: "Esplora"
messageRead: "Visualizzato"
readAllChatMessages: "Segna tutti i messaggi come già letti"
noMoreHistory: "Non c'è più cronologia da visualizzare"
startChat: "Inizia a chattare"
nUsersRead: "Letto da {n} persone"
@@ -334,6 +335,7 @@ fileName: "Nome dell'allegato"
selectFile: "Scelta allegato"
selectFiles: "Scelta allegato"
selectFolder: "Seleziona cartella"
unselectFolder: "Deseleziona la cartella"
selectFolders: "Seleziona cartella"
fileNotSelected: "Nessun file selezionato"
renameFile: "Rinomina file"
@@ -346,6 +348,7 @@ addFile: "Allega"
showFile: "Visualizza file"
emptyDrive: "Il Drive è vuoto"
emptyFolder: "La cartella è vuota"
dropHereToUpload: "Trascina qui il tuo file per caricarlo"
unableToDelete: "Eliminazione impossibile"
inputNewFileName: "Inserisci nome del nuovo file"
inputNewDescription: "Inserisci una nuova descrizione"
@@ -456,7 +459,7 @@ setupOf2fa: "Impostare l'autenticazione a due fattori"
totp: "App di autenticazione a due fattori (2FA/MFA)"
totpDescription: "Puoi autenticarti inserendo un codice OTP tramite la tua App di autenticazione a due fattori (2FA/MFA)"
moderator: "Moderatore"
moderation: "moderazione"
moderation: "Moderazione"
moderationNote: "Promemoria di moderazione"
moderationNoteDescription: "Puoi scrivere promemoria condivisi solo tra moderatori."
addModerationNote: "Aggiungi promemoria di moderazione"
@@ -497,7 +500,7 @@ attachAsFileQuestion: "Il testo copiato eccede le dimensioni, vuoi allegarlo?"
onlyOneFileCanBeAttached: "È possibile allegare al messaggio soltanto uno file"
signinRequired: "Occorre avere un profilo registrato su questa istanza"
signinOrContinueOnRemote: "Per continuare, devi accedere alla tua istanza o registrarti su questa e poi accedere"
invitations: "Invita"
invitations: "Inviti"
invitationCode: "Codice di invito"
checking: "Confermando"
available: "Disponibile"
@@ -523,7 +526,7 @@ style: "Stile"
drawer: "Drawer"
popup: "Popup"
showNoteActionsOnlyHover: "Mostra le azioni delle Note solo al passaggio del mouse"
showReactionsCount: "Visualizza il numero di reazioni su una nota"
showReactionsCount: "Visualizza la quantità di reazioni su una nota"
noHistory: "Nessuna cronologia"
signinHistory: "Storico degli accessi al profilo"
enableAdvancedMfm: "Attivare i Misskey Flavoured Markdown (MFM) avanzati"
@@ -688,16 +691,16 @@ emptyToDisableSmtpAuth: "Lasciare i campi vuoti se non c'è autenticazione SMTP"
smtpSecure: "Usare SSL/TLS implicito per le connessioni SMTP"
smtpSecureInfo: "Disabilitare quando è attivo STARTTLS."
testEmail: "Verifica il funzionamento"
wordMute: "Filtri parole"
wordMuteDescription: "Contrae le Note con la parola o la frase specificata. Permette di espandere le Note, cliccandole."
hardWordMute: "Filtro parole forte"
wordMute: "Parole silenziate"
wordMuteDescription: "Comprimi le Note che hanno la parola o la regola specificata. Cliccale per espanderle e leggerne comunque il contenuto."
hardWordMute: "Filtro per parole"
showMutedWord: "Elenca le parole silenziate"
hardWordMuteDescription: "Nasconde le Note con la parola o la frase specificata. A differenza delle parole silenziate, la Nota non verrà federata."
hardWordMuteDescription: "Ignora le Note con la parola o la regola specificata. A differenza delle \"Parole Silenziate\", queste Note non ti verranno proprio recapitate."
regexpError: "errore regex"
regexpErrorDescription: "Si è verificato un errore nell'espressione regolare alla riga {line} della parola muta {tab}:"
instanceMute: "Silenziare l'istanza"
userSaysSomething: "{name} ha detto qualcosa"
userSaysSomethingAbout: "{name} ha Notato a riguardo di \"{word}\""
userSaysSomethingAbout: "{name} ha anNotato qualcosa su \"{word}\""
makeActive: "Attiva"
display: "Visualizza"
copy: "Copia"
@@ -753,19 +756,19 @@ i18nInfo: "Misskey è tradotto in diverse lingue da volontari. Anche tu puoi con
manageAccessTokens: "Gestisci token di accesso"
accountInfo: "Informazioni profilo"
notesCount: "Conteggio note"
repliesCount: "Numero di risposte inviate"
renotesCount: "Numero di note che hai ricondiviso"
repliedCount: "Numero di risposte ricevute"
renotedCount: "Numero delle tue note ricondivise"
followingCount: "Numero di Following"
followersCount: "Numero di profili che ti seguono"
sentReactionsCount: "Numero di reazioni inviate"
receivedReactionsCount: "Numero di reazioni ricevute"
pollVotesCount: "Numero di voti inviati"
pollVotedCount: "Numero di voti ricevuti"
repliesCount: "Quantità di risposte"
renotesCount: "Quantità di Note ricondivise"
repliedCount: "Quantità di risposte"
renotedCount: "Quantità di tue Note ricondivise"
followingCount: "Quantità di Following"
followersCount: "Quantità di Follower"
sentReactionsCount: "Quantità di reazioni"
receivedReactionsCount: "Quantità di reazioni ricevute"
pollVotesCount: "Quantità di voti"
pollVotedCount: "Quantità di voti ricevuti"
yes: "Sì"
no: "No"
driveFilesCount: "Numero di file nel Drive"
driveFilesCount: "Quantità di file nel Drive"
driveUsage: "Utilizzazione del Drive"
noCrawle: "Rifiuta l'indicizzazione dai robot."
noCrawleDescription: "Richiedi che i motori di ricerca non indicizzino la tua pagina di profilo, le tue note, pagine, ecc."
@@ -773,12 +776,13 @@ lockedAccountInfo: "A meno che non imposti la visibilità delle tue note su \"So
alwaysMarkSensitive: "Segnare automaticamente come espliciti gli allegati"
loadRawImages: "Visualizza le intere immagini allegate invece delle miniature."
disableShowingAnimatedImages: "Disabilitare le immagini animate"
disableShowingAnimatedImages_caption: "L'attivazione delle animazioni immagini potrebbe interferire sull'accessibilità e sul risparmio energetico nel dispositivo."
highlightSensitiveMedia: "Evidenzia i media espliciti"
verificationEmailSent: "Una mail di verifica è stata inviata. Si prega di accedere al collegamento per compiere la verifica."
notSet: "Non impostato"
emailVerified: "Il tuo indirizzo email è stato verificato"
noteFavoritesCount: "Conteggio note tra i preferiti"
pageLikesCount: "Numero di pagine che ti piacciono"
pageLikesCount: "Quantità di pagine che ti piacciono"
pageLikedCount: "Numero delle tue pagine che hanno ricevuto \"Mi piace\""
contact: "Contatti"
useSystemFont: "Usa il carattere predefinito del sistema"
@@ -823,9 +827,9 @@ currentVersion: "Versione attuale"
latestVersion: "Ultima versione"
youAreRunningUpToDateClient: "Stai usando la versione più recente del client."
newVersionOfClientAvailable: "Una nuova versione del tuo client è disponibile."
usageAmount: "In uso"
usageAmount: "Quantità utilizzata"
capacity: "Capacità"
inUse: "In uso"
inUse: "Usata da"
editCode: "Modifica codice"
apply: "Applica"
receiveAnnouncementFromInstance: "Ricevi i messaggi informativi dall'istanza"
@@ -900,7 +904,7 @@ useBlurEffect: "Utilizza effetto sfocatura"
learnMore: "Per saperne di più"
misskeyUpdated: "Misskey è stato aggiornato!"
whatIsNew: "Informazioni sull'aggiornamento"
translate: "Traduci"
translate: "Traduzione"
translatedFrom: "Traduzione da {x}"
accountDeletionInProgress: "È in corso l'eliminazione del profilo"
usernameInfo: "Un nome per identificare univocamente il tuo profilo sull'istanza. Puoi utilizzare caratteri alfanumerici maiuscoli, minuscoli e il trattino basso (_). Non potrai cambiare nome utente in seguito."
@@ -911,7 +915,7 @@ pubSub: "Publish/Subscribe del profilo"
lastCommunication: "La comunicazione più recente"
resolved: "Risolto"
unresolved: "Non risolto"
breakFollow: "Rimuovi Follower"
breakFollow: "Rimuovere Follower"
breakFollowConfirm: "Vuoi davvero togliere questo Follower?"
itsOn: "Abilitato"
itsOff: "Disabilitato"
@@ -944,7 +948,7 @@ tablet: "Tablet"
auto: "Automatico"
themeColor: "Colore del tema"
size: "Dimensioni"
numberOfColumn: "Numero di colonne"
numberOfColumn: "Quantità di colonne"
searchByGoogle: "Cerca"
instanceDefaultLightTheme: "Istanza, tema luminoso predefinito."
instanceDefaultDarkTheme: "Istanza, tema scuro predefinito."
@@ -981,7 +985,7 @@ isSystemAccount: "Si tratta di un profilo creato e gestito automaticamente dal s
typeToConfirm: "Digita {x} per continuare"
deleteAccount: "Eliminazione profilo"
document: "Documentazione"
numberOfPageCache: "Numero di pagine cache"
numberOfPageCache: "Quantità di pagine in cache"
numberOfPageCacheDescription: "Aumenta l'usabilità, ma aumenta anche il carico e l'utilizzo della memoria."
logoutConfirm: "Vuoi davvero uscire da Misskey? "
logoutWillClearClientData: "All'uscita, la configurazione del client viene rimossa dal browser. Per ripristinarla quando si effettua nuovamente l'accesso, abilitare il backup automatico."
@@ -1019,6 +1023,9 @@ pushNotificationAlreadySubscribed: "Le notifiche push sono già attivate"
pushNotificationNotSupported: "Il client o il server non supporta le notifiche push"
sendPushNotificationReadMessage: "Eliminare le notifiche push dopo la relativa lettura"
sendPushNotificationReadMessageCaption: "Se possibile, verrà mostrata brevemente una notifica con il testo \"{emptyPushNotificationMessage}\". Potrebbe influire negativamente sulla durata della batteria."
pleaseAllowPushNotification: "Per favore, acconsenti alla ricezione di notifiche nel browser"
browserPushNotificationDisabled: "Non è stato possibile ottenere il consenso alla ricezione di notifche"
browserPushNotificationDisabledDescription: "Non hai concesso a {serverName} di spedire notifiche. Per favore, acconsenti alla ricezione nelle impostazioni del browser e riprova."
windowMaximize: "Ingrandisci"
windowMinimize: "Contrai finestra"
windowRestore: "Ripristina"
@@ -1029,7 +1036,7 @@ cannotLoad: "Caricamento impossibile"
numberOfProfileView: "Visualizzazioni profilo"
like: "Mi piace!"
unlike: "Non mi piace"
numberOfLikes: "Numero di Like"
numberOfLikes: "Quantità di Like"
show: "Visualizza"
neverShow: "Non mostrare più"
remindMeLater: "Rimanda"
@@ -1169,12 +1176,13 @@ installed: "Installazione avvenuta"
branding: "Branding"
enableServerMachineStats: "Pubblicare le informazioni sul server"
enableIdenticonGeneration: "Generazione automatica delle Identicon"
showRoleBadgesOfRemoteUsers: "Visualizza i badge per i ruoli concessi ai profili remoti"
turnOffToImprovePerformance: "Disattiva, per migliorare le prestazioni"
createInviteCode: "Genera codice di invito"
createWithOptions: "Genera con opzioni"
createCount: "Conteggio inviti"
inviteCodeCreated: "Inviti generati"
inviteLimitExceeded: "Hai raggiunto il numero massimo di codici invito generabili."
inviteLimitExceeded: "Hai raggiunto la quantità massima di codici invito generabili."
createLimitRemaining: "Inviti generabili: {limit} rimanenti"
inviteLimitResetCycle: "Alle {time}, il limite verrà ripristinato a {limit}"
expirationDate: "Scadenza"
@@ -1291,7 +1299,7 @@ sensitiveMediaRevealConfirm: "Questo allegato è esplicito, vuoi vederlo?"
createdLists: "Liste create"
createdAntennas: "Antenne create"
fromX: "Da {x}"
genEmbedCode: "Ottieni il codice di incorporamento"
genEmbedCode: "Ottieni il codice per incorporare"
noteOfThisUser: "Elenco di Note di questo profilo"
clipNoteLimitExceeded: "Non è possibile aggiungere ulteriori Note a questa Clip."
performance: "Prestazioni"
@@ -1342,10 +1350,10 @@ preferenceSyncConflictChoiceCancel: "Annulla la sincronizzazione"
paste: "Incolla"
emojiPalette: "Tavolozza emoji"
postForm: "Finestra di pubblicazione"
textCount: "Il numero di caratteri"
textCount: "Quantità di caratteri"
information: "Informazioni"
chat: "Chat"
directMessage: "Chatta con questa persona"
directMessage: "Chattare insieme"
directMessage_short: "Messaggio"
migrateOldSettings: "Migrare le vecchie impostazioni"
migrateOldSettings_description: "Di solito, viene fatto automaticamente. Se per qualche motivo non fossero migrate con successo, è possibile avviare il processo di migrazione manualmente, sovrascrivendo le configurazioni attuali."
@@ -1383,13 +1391,59 @@ pluginsAreDisabledBecauseSafeMode: "Tutti i plugin sono disattivati, poiché la
customCssIsDisabledBecauseSafeMode: "Il CSS personalizzato non è stato applicato, poiché la modalità sicura è attiva."
themeIsDefaultBecauseSafeMode: "Quando la modalità sicura è attiva, viene utilizzato il tema predefinito. Quando la modalità sicura viene disattivata, il tema torna a essere quello precedente."
thankYouForTestingBeta: "Grazie per la tua collaborazione nella verifica delle versioni beta!"
createUserSpecifiedNote: "Creare Nota personalizzata"
createUserSpecifiedNote: "Crea Nota privata"
schedulePost: "Pianificare la pubblicazione"
scheduleToPostOnX: "Pianificare la pubblicazione {x}"
scheduledToPostOnX: "Pubblicazione pianificata {x}"
schedule: "Pianificare"
scheduled: "Pianificata"
widgets: "Riquadri"
deviceInfo: "Informazioni sul dispositivo"
deviceInfoDescription: "Se ci contatti per ricevere supporto tecnico, ti preghiamo di includere le seguenti informazioni per aiutarci a risolvere il tuo problema."
youAreAdmin: "Sei un amministratore"
frame: "Cornice"
presets: "Preimpostato"
zeroPadding: "Al vivo"
_imageEditing:
_vars:
caption: "Didascalia dell'immagine"
filename: "Nome dell'allegato"
filename_without_ext: "Nome file senza estensione"
year: "Anno di scatto"
month: "Mese dello scatto"
day: "Giorno dello scatto"
hour: "Ora dello scatto"
minute: "Minuto dello scatto"
second: "Secondi dello scatto"
camera_model: "Modello di fotocamera"
camera_lens_model: "Modello della lente"
camera_mm: "Lunghezza focale"
camera_mm_35: "Lunghezza focale (equivalente a 35 mm)"
camera_f: "Diaframma"
camera_s: "Velocità otturatore"
camera_iso: "Sensibilità ISO"
gps_lat: "Latitudine"
gps_long: "Longitudine"
_imageFrameEditor:
title: "Modifica fotogramma"
tip: "Puoi decorare le immagini aggiungendo etichette con cornici e metadati."
header: "Intestazione"
footer: "Piè di pagina"
borderThickness: "Larghezza del bordo"
labelThickness: "Spessore etichetta"
labelScale: "Dimensione etichetta"
centered: "Allinea al centro"
captionMain: "Didascalia (grande)"
captionSub: "Didascalia (piccola)"
availableVariables: "Variabili disponibili"
withQrCode: "QR Code"
backgroundColor: "Colore dello sfondo"
textColor: "Colore del testo"
font: "Tipo di carattere"
fontSerif: "Serif"
fontSansSerif: "Sans serif"
quitWithoutSaveConfirm: "Uscire senza salvare?"
failedToLoadImage: "Impossibile caricare l'immagine"
_compression:
_quality:
high: "Alta qualità"
@@ -1400,8 +1454,8 @@ _compression:
medium: "Taglia media"
small: "Taglia piccola"
_order:
newest: "Prima i più recenti"
oldest: "Meno recenti prima"
newest: "Più recenti"
oldest: "Meno recenti"
_chat:
messages: "Messaggi"
noMessagesYet: "Ancora nessun messaggio"
@@ -1414,12 +1468,12 @@ _chat:
inviteUserToChat: "Invita a chattare altre persone"
yourRooms: "Le tue stanze"
joiningRooms: "Stanze a cui partecipi"
invitations: "Invita"
invitations: "Inviti"
noInvitations: "Nessun invito"
history: "Cronologia"
noHistory: "Nessuna cronologia"
noRooms: "Nessuna stanza"
inviteUser: "Invita"
inviteUser: "Invita persona"
sentInvitations: "Inviti spediti"
join: "Entra"
ignore: "Ignora"
@@ -1492,6 +1546,8 @@ _settings:
showUrlPreview: "Mostra anteprima dell'URL"
showAvailableReactionsFirstInNote: "Mostra le reazioni disponibili in alto"
showPageTabBarBottom: "Visualizza le schede della pagina nella parte inferiore"
emojiPaletteBanner: "Puoi salvare i le emoji predefinite da appuntare in alto nel raccoglitore emoji come tavolozza e personalizzare in che modo visualizzare il raccoglitore."
enableAnimatedImages: "Attivare le immagini animate"
_chat:
showSenderName: "Mostra il nome del mittente"
sendOnEnter: "Invio spedisce"
@@ -1500,6 +1556,8 @@ _preferencesProfile:
profileNameDescription: "Impostare il nome che indentifica questo dispositivo."
profileNameDescription2: "Es: \"PC principale\" o \"Cellulare\""
manageProfiles: "Gestione profili"
shareSameProfileBetweenDevicesIsNotRecommended: "Si sconsiglia di condividere lo stesso profilo su più dispositivi."
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "Se intendi sincronizzare solo alcuni parametri di configurazione su più dispositivi, devi attivare l'opzione \"Sincronizzazione tra dispositivi\" per ogni parametro interessato."
_preferencesBackup:
autoBackup: "Backup automatico"
restoreFromBackup: "Ripristinare da backup"
@@ -1509,6 +1567,7 @@ _preferencesBackup:
youNeedToNameYourProfileToEnableAutoBackup: "Per abilitare i backup automatici, è necessario indicare il nome del profilo."
autoPreferencesBackupIsNotEnabledForThisDevice: "Su questo dispositivo non è stato attivato il backup automatico delle preferenze."
backupFound: "Esiste il Backup delle preferenze"
forceBackup: "Backup forzato delle impostazioni"
_accountSettings:
requireSigninToViewContents: "Per vedere il contenuto, è necessaria l'iscrizione"
requireSigninToViewContentsDescription1: "Richiedere l'iscrizione per visualizzare tutte le Note e gli altri contenuti che hai creato. Probabilmente l'effetto è impedire la raccolta di informazioni da parte dei bot crawler."
@@ -2014,6 +2073,7 @@ _role:
canManageAvatarDecorations: "Gestisce le decorazioni di immagini del profilo"
driveCapacity: "Capienza del Drive"
maxFileSize: "Dimensione massima del file caricabile"
maxFileSize_caption: "Potrebbero esserci altre impostazioni nella fase precedente, come reverse proxy o CDN."
alwaysMarkNsfw: "Impostare sempre come esplicito (NSFW)"
canUpdateBioMedia: "Può aggiornare foto profilo e di testata"
pinMax: "Quantità massima di Note in primo piano"
@@ -2432,6 +2492,7 @@ _auth:
scopeUser: "Sto funzionando per il seguente profilo"
pleaseLogin: "Per favore accedi al tuo account per cambiare i permessi dell'applicazione"
byClickingYouWillBeRedirectedToThisUrl: "Consentendo l'accesso, si verrà reindirizzati presso questo indirizzo URL"
alreadyAuthorized: "Questa applicazione è già autorizzata ad accedere."
_antennaSources:
all: "Tutte le note"
homeTimeline: "Note dai tuoi Following"
@@ -2514,7 +2575,7 @@ _visibility:
followersDescription: "Visibile solo ai tuoi follower"
specified: "Nota diretta"
specifiedDescription: "Visibile solo ai profili menzionati"
disableFederation: "Senza federazione"
disableFederation: "Gestisci la federazione"
disableFederationDescription: "Non spedire attività alle altre istanze remote"
_postForm:
quitInspiteOfThereAreUnuploadedFilesConfirm: "Alcuni file non sono stati caricati. Vuoi annullare l'operazione?"
@@ -2522,6 +2583,20 @@ _postForm:
replyPlaceholder: "Rispondi a questa nota..."
quotePlaceholder: "Cita questa nota..."
channelPlaceholder: "Pubblica sul canale..."
showHowToUse: "Mostra il tutorial"
_howToUse:
content_title: "Testo"
content_description: "Inserisci il contenuto che desideri pubblicare."
toolbar_title: "Barra degli Strumenti"
toolbar_description: "Puoi allegare file e sondaggi, aggiungere Note, hashtag, inserire emoji e menzioni."
account_title: "Menu profilo"
account_description: "Puoi cambiare il profilo col quale vuoi pubblicare, elencare bozze e pianificare le Note."
visibility_title: "Visibilità"
visibility_description: "Puoi impostare il grado di visibilità delle Note."
menu_title: "Menù"
menu_description: "Puoi svolgere varie azioni, come salvare in bozza, pianificare le annotazioni, regolare le reazioni ricevute e altro."
submit_title: "Bottone invia"
submit_description: "Pubblica la Nota. Funziona anche con \"Ctrl + Invio\", oppure \"Cmd + Invio\"."
_placeholders:
a: "Come va?"
b: "Hai qualcosa da raccontare? Inizia pure..."
@@ -2698,6 +2773,8 @@ _notification:
quote: "Cita"
reaction: "Reazioni"
pollEnded: "Sondaggio terminato"
scheduledNotePosted: "Nota pianificata correttamente"
scheduledNotePostFailed: "La pianificazione della Nota è fallita"
receiveFollowRequest: "Richieste di follow in arrivo"
followRequestAccepted: "Richieste di follow accettate"
roleAssigned: "Ruolo concesso"
@@ -2797,6 +2874,8 @@ _abuseReport:
notifiedWebhook: "Webhook da usare"
deleteConfirm: "Vuoi davvero rimuovere il destinatario della notifica?"
_moderationLogTypes:
clearQueue: "Ha cancellato la coda di Attività"
promoteQueue: "Ripeti le attività in coda"
createRole: "Crea un Ruolo"
deleteRole: "Elimina un Ruolo"
updateRole: "Modifica un ruolo"
@@ -3044,7 +3123,7 @@ _customEmojisManager:
confirmClearEmojisDescription: "Annullare le modifiche e cancella le emoji nell'elenco. Confermi?"
confirmUploadEmojisDescription: "Caricamento sul Drive di {count} file locali. Vuoi davvero procedere?"
_embedCodeGen:
title: "Personalizza il codice di incorporamento"
title: "Personalizza il codice per incorporare"
header: "Mostra la testata"
autoload: "Carica automaticamente di più (sconsigliato)"
maxHeight: "Altezza massima"
@@ -3053,8 +3132,8 @@ _embedCodeGen:
previewIsNotActual: "Poiché supera l'intervallo che può essere visualizzato in anteprima, la visualizzazione vera e propria sarà diversa quando effettivamente incorporata."
rounded: "Bordo arrotondato"
border: "Aggiungi un bordo al contenitore"
applyToPreview: "Applica all'anteprima"
generateCode: "Crea il codice di incorporamento"
applyToPreview: "Aggiorna l'anteprima"
generateCode: "Crea il codice per incorporare"
codeGenerated: "Codice generato"
codeGeneratedDescription: "Incolla il codice appena generato sul tuo sito web."
_selfXssPrevention:
@@ -3111,7 +3190,7 @@ _bootErrors:
_search:
searchScopeAll: "Tutte"
searchScopeLocal: "Locale"
searchScopeServer: "Specifiche del server"
searchScopeServer: "Server specifico"
searchScopeUser: "Profilo specifico"
pleaseEnterServerHost: "Inserire il nome host"
pleaseSelectUser: "Per favore, seleziona un profilo"
@@ -3191,6 +3270,7 @@ _watermarkEditor:
title: "Modifica la filigrana"
cover: "Coprire tutto"
repeat: "Disposizione"
preserveBoundingRect: "Fai in modo da non eccedere durante la rotazione"
opacity: "Opacità"
scale: "Dimensioni"
text: "Testo"
@@ -3212,11 +3292,13 @@ _watermarkEditor:
polkadotSubDotRadius: "Dimensione del punto secondario"
polkadotSubDotDivisions: "Quantità di punti secondari"
leaveBlankToAccountUrl: "Il valore vuoto indica la URL dell'account"
failedToLoadImage: "Impossibile caricare l'immagine"
_imageEffector:
title: "Effetto"
addEffect: "Aggiungi effetto"
discardChangesConfirm: "Scarta le modifiche ed esci?"
nothingToConfigure: "Nessuna impostazione configurabile."
failedToLoadImage: "Impossibile caricare l'immagine"
_fxs:
chromaticAberration: "Aberrazione cromatica"
glitch: "Glitch"
+80 -2
View File
@@ -83,6 +83,8 @@ files: "ファイル"
download: "ダウンロード"
driveFileDeleteConfirm: "ファイル「{name}」を削除しますか?このファイルを使用した一部のコンテンツも削除されます。"
unfollowConfirm: "{name}のフォローを解除しますか?"
cancelFollowRequestConfirm: "{name}へのフォロー申請をキャンセルしますか?"
rejectFollowRequestConfirm: "{name}からのフォロー申請を拒否しますか?"
exportRequested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、「ドライブ」に追加されます。"
importRequested: "インポートをリクエストしました。これには時間がかかる場合があります。"
lists: "リスト"
@@ -182,7 +184,7 @@ flagAsCat: "にゃああああああああああああああ!!!!!!
flagAsCatDescription: "にゃにゃにゃ??"
flagShowTimelineReplies: "タイムラインにノートへの返信を表示する"
flagShowTimelineRepliesDescription: "オンにすると、タイムラインにユーザーのノート以外にもそのユーザーの他のノートへの返信を表示します。"
autoAcceptFollowed: "フォロー中ユーザーからのフォロリクを自動承認"
autoAcceptFollowed: "フォロー中ユーザーからのフォロー申請を自動承認"
addAccount: "アカウントを追加"
reloadAccountsList: "アカウントリストの情報を更新"
loginFailed: "ログインに失敗しました"
@@ -302,6 +304,7 @@ uploadFromUrlMayTakeTime: "アップロードが完了するまで時間がか
uploadNFiles: "{n}個のファイルをアップロード"
explore: "みつける"
messageRead: "既読"
readAllChatMessages: "すべてのメッセージを既読にする"
noMoreHistory: "これより過去の履歴はありません"
startChat: "メッセージを送る"
nUsersRead: "{n}人が読みました"
@@ -775,6 +778,7 @@ lockedAccountInfo: "フォローを承認制にしても、ノートの公開範
alwaysMarkSensitive: "デフォルトでメディアをセンシティブ設定にする"
loadRawImages: "添付画像のサムネイルをオリジナル画質にする"
disableShowingAnimatedImages: "アニメーション画像を再生しない"
disableShowingAnimatedImages_caption: "この設定に関わらずアニメーション画像が再生されないときは、ブラウザ・OSのアクセシビリティ設定や省電力設定等が干渉している場合があります。"
highlightSensitiveMedia: "メディアがセンシティブであることを分かりやすく表示"
verificationEmailSent: "確認のメールを送信しました。メールに記載されたリンクにアクセスして、設定を完了してください。"
notSet: "未設定"
@@ -1021,6 +1025,9 @@ pushNotificationAlreadySubscribed: "プッシュ通知は有効です"
pushNotificationNotSupported: "ブラウザかサーバーがプッシュ通知に非対応"
sendPushNotificationReadMessage: "通知が既読になったらプッシュ通知を削除する"
sendPushNotificationReadMessageCaption: "端末の電池消費量が増加する可能性があります。"
pleaseAllowPushNotification: "ブラウザの通知設定を許可してください"
browserPushNotificationDisabled: "通知の送信権限の取得に失敗しました"
browserPushNotificationDisabledDescription: "{serverName}から通知を送信する権限がありません。ブラウザの設定から通知を許可して再度お試しください。"
windowMaximize: "最大化"
windowMinimize: "最小化"
windowRestore: "元に戻す"
@@ -1171,6 +1178,7 @@ installed: "インストール済み"
branding: "ブランディング"
enableServerMachineStats: "サーバーのマシン情報を公開する"
enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする"
showRoleBadgesOfRemoteUsers: "リモートユーザーに付与したロールバッジを表示する"
turnOffToImprovePerformance: "オフにするとパフォーマンスが向上します。"
createInviteCode: "招待コードを作成"
createWithOptions: "オプションを指定して作成"
@@ -1394,6 +1402,52 @@ scheduled: "予約"
widgets: "ウィジェット"
deviceInfo: "デバイス情報"
deviceInfoDescription: "技術的なお問い合わせの際に、以下の情報を併記すると問題の解決に役立つことがあります。"
youAreAdmin: "あなたは管理者です"
frame: "フレーム"
presets: "プリセット"
zeroPadding: "ゼロ埋め"
_imageEditing:
_vars:
caption: "ファイルのキャプション"
filename: "ファイル名"
filename_without_ext: "拡張子無しファイル名"
year: "撮影年"
month: "撮影月"
day: "撮影日"
hour: "撮影した時刻(時)"
minute: "撮影した時刻(分)"
second: "撮影した時刻(秒)"
camera_model: "カメラ名"
camera_lens_model: "レンズ名"
camera_mm: "焦点距離"
camera_mm_35: "焦点距離(35mm判換算)"
camera_f: "絞り"
camera_s: "シャッタースピード"
camera_iso: "ISO感度"
gps_lat: "緯度"
gps_long: "経度"
_imageFrameEditor:
title: "フレームの編集"
tip: "画像にフレームやメタデータを含んだラベルを追加して装飾できます。"
header: "ヘッダー"
footer: "フッター"
borderThickness: "フチの幅"
labelThickness: "ラベルの幅"
labelScale: "ラベルのスケール"
centered: "中央揃え"
captionMain: "キャプション(大)"
captionSub: "キャプション(小)"
availableVariables: "利用可能な変数"
withQrCode: "二次元コード"
backgroundColor: "背景色"
textColor: "文字色"
font: "フォント"
fontSerif: "セリフ"
fontSansSerif: "サンセリフ"
quitWithoutSaveConfirm: "保存せずに終了しますか?"
failedToLoadImage: "画像の読み込みに失敗しました"
_compression:
_quality:
@@ -1501,6 +1555,8 @@ _settings:
showUrlPreview: "URLプレビューを表示する"
showAvailableReactionsFirstInNote: "利用できるリアクションを先頭に表示"
showPageTabBarBottom: "ページのタブバーを下部に表示"
emojiPaletteBanner: "絵文字ピッカーに固定表示するプリセットをパレットとして登録したり、ピッカーの表示方法をカスタマイズしたりできます。"
enableAnimatedImages: "アニメーション画像を有効にする"
_chat:
showSenderName: "送信者の名前を表示"
@@ -1511,6 +1567,8 @@ _preferencesProfile:
profileNameDescription: "このデバイスを識別する名前を設定してください。"
profileNameDescription2: "例: 「メインPC」、「スマホ」など"
manageProfiles: "プロファイルの管理"
shareSameProfileBetweenDevicesIsNotRecommended: "複数のデバイスで同一のプロファイルを共有することは推奨しません。"
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "複数のデバイスで同期したい設定項目が存在する場合は、個別に「複数のデバイスで同期」オプションを有効にしてください。"
_preferencesBackup:
autoBackup: "自動バックアップ"
@@ -1521,6 +1579,7 @@ _preferencesBackup:
youNeedToNameYourProfileToEnableAutoBackup: "自動バックアップを有効にするにはプロファイル名の設定が必要です。"
autoPreferencesBackupIsNotEnabledForThisDevice: "このデバイスで設定の自動バックアップは有効になっていません。"
backupFound: "設定のバックアップが見つかりました"
forceBackup: "設定の強制バックアップ"
_accountSettings:
requireSigninToViewContents: "コンテンツの表示にログインを必須にする"
@@ -2587,6 +2646,20 @@ _postForm:
replyPlaceholder: "このノートに返信..."
quotePlaceholder: "このノートを引用..."
channelPlaceholder: "チャンネルに投稿..."
showHowToUse: "フォームの説明を表示"
_howToUse:
content_title: "本文"
content_description: "投稿する内容を入力します。"
toolbar_title: "ツールバー"
toolbar_description: "ファイルやアンケートの添付、注釈やハッシュタグの設定、絵文字やメンションの挿入などが行えます。"
account_title: "アカウントメニュー"
account_description: "投稿するアカウントを切り替えたり、アカウントに保存した下書き・予約投稿を一覧できます。"
visibility_title: "公開範囲"
visibility_description: "ノートを公開する範囲の設定が行えます。"
menu_title: "メニュー"
menu_description: "下書きへの保存、投稿の予約、リアクションの設定など、その他のアクションが行えます。"
submit_title: "投稿ボタン"
submit_description: "ノートを投稿します。Ctrl + Enter / Cmd + Enter でも投稿できます。"
_placeholders:
a: "いまどうしてる?"
b: "何かありましたか?"
@@ -2884,6 +2957,8 @@ _abuseReport:
deleteConfirm: "通知先を削除しますか?"
_moderationLogTypes:
clearQueue: "ジョブキューをクリア"
promoteQueue: "キューのジョブを再試行"
createRole: "ロールを作成"
deleteRole: "ロールを削除"
updateRole: "ロールを更新"
@@ -3296,13 +3371,14 @@ _userLists:
watermark: "ウォーターマーク"
defaultPreset: "デフォルトのプリセット"
_watermarkEditor:
tip: "画像にクレジット情報などのウォーターマークを追加することができます。"
tip: "画像にクレジット情報などのウォーターマークを追加できます。"
quitWithoutSaveConfirm: "保存せずに終了しますか?"
driveFileTypeWarn: "このファイルは対応していません"
driveFileTypeWarnDescription: "画像ファイルを選択してください"
title: "ウォーターマークの編集"
cover: "全体に被せる"
repeat: "敷き詰める"
preserveBoundingRect: "回転時はみ出ないように調整する"
opacity: "不透明度"
scale: "サイズ"
text: "テキスト"
@@ -3324,12 +3400,14 @@ _watermarkEditor:
polkadotSubDotRadius: "サブドットの大きさ"
polkadotSubDotDivisions: "サブドットの数"
leaveBlankToAccountUrl: "空欄にするとアカウントのURLになります"
failedToLoadImage: "画像の読み込みに失敗しました"
_imageEffector:
title: "エフェクト"
addEffect: "エフェクトを追加"
discardChangesConfirm: "変更を破棄して終了しますか?"
nothingToConfigure: "設定項目はありません"
failedToLoadImage: "画像の読み込みに失敗しました"
_fxs:
chromaticAberration: "色収差"
+73 -25
View File
@@ -220,6 +220,7 @@ silenceThisInstance: "サーバーサイレンスすんで?"
mediaSilenceThisInstance: "サーバーをメディアサイレンス"
operations: "操作"
software: "ソフトウェア"
softwareName: "ソフトウェア名"
version: "バージョン"
metadata: "メタデータ"
withNFiles: "{n}個のファイル"
@@ -252,6 +253,7 @@ noteDeleteConfirm: "このノートをほかしてええか?"
pinLimitExceeded: "これ以上ピン留めできひん"
done: "でけた"
processing: "処理しとる"
preprocessing: "準備中"
preview: "プレビュー"
default: "デフォルト"
defaultValueIs: "デフォルト: {value}"
@@ -299,13 +301,14 @@ uploadFromUrlRequested: "アップロードしたい言うといたで"
uploadFromUrlMayTakeTime: "アップロード終わるんにちょい時間かかるかもしれへんわ。"
explore: "みつける"
messageRead: "もう読んだ"
readAllChatMessages: "メッセージを全部読んだことにしとく"
noMoreHistory: "これより昔のんはあらへんで"
startChat: "チャットを始めよか"
nUsersRead: "{n}人が読んでもうた"
agreeTo: "{0}に同意したで"
agree: "せやな"
agreeBelow: "下記に同意したる"
basicNotesBeforeCreateAccount: "よう読んでやってや"
agreeBelow: "下記に同意するわ"
basicNotesBeforeCreateAccount: "よう読んどいてや"
termsOfService: "使うための決め事"
start: "始める"
home: "ホーム"
@@ -325,12 +328,13 @@ dark: "ダーク"
lightThemes: "デイゲーム"
darkThemes: "ナイトゲーム"
syncDeviceDarkMode: "デバイスのダークモードと一緒にする"
switchDarkModeManuallyWhenSyncEnabledConfirm: "「{x}」がオンになってるで。同期をオフにして手動でモード切り替えることにします"
switchDarkModeManuallyWhenSyncEnabledConfirm: "「{x}」がオンになってるで。同期切って手動でモード切り替える?"
drive: "ドライブ"
fileName: "ファイル名"
selectFile: "ファイル選んでや"
selectFiles: "ファイル選んでや"
selectFolder: "フォルダ選んでや"
unselectFolder: "フォルダーの選択を解除"
selectFolders: "フォルダ選んでや"
fileNotSelected: "ファイルが選択されてへんで"
renameFile: "ファイル名をいらう"
@@ -421,14 +425,13 @@ antennaSource: "受信ソース(このソースは食われへん)"
antennaKeywords: "受信キーワード"
antennaExcludeKeywords: "除外キーワード"
antennaExcludeBots: "Botアカウントを除外"
antennaKeywordsDescription: "スペースで区切ったるとAND指定で、改行で区切ったるとOR指定や"
antennaKeywordsDescription: "スペースで区切ったAND指定で、改行で区切ったOR指定や"
notifyAntenna: "新しいノートを通知すんで"
withFileAntenna: "なんか添付されたノートだけ"
excludeNotesInSensitiveChannel: "センシティブなチャンネルのノートは入れんとくわ"
enableServiceworker: "ブラウザにプッシュ通知が行くようにする"
antennaUsersDescription: "ユーザー名を改行で区切ったってな"
caseSensitive: "大文字と小文字は別もんや"
withReplies: "返信も入れたって"
connectedTo: "次のアカウントに繋がっとるで"
notesAndReplies: "投稿と返信"
withFiles: "ファイル付いとる"
@@ -471,9 +474,9 @@ newPasswordIs: "今度のパスワードは「{password}」や"
reduceUiAnimation: "UIの動きやアニメーションを少なする"
share: "わけわけ"
notFound: "見つからへんね"
notFoundDescription: "言われたURLにはまるページはなかったで。"
notFoundDescription: "言われたURLページはなかったで。"
uploadFolder: "とりあえずアップロードしたやつ置いとく所"
markAsReadAllNotifications: "通知はもう全読んだわ"
markAsReadAllNotifications: "通知はもう全読んだわ"
markAsReadAllUnreadNotes: "投稿は全て読んだわっ"
markAsReadAllTalkMessages: "チャットはもうぜんぶ読んだわっ"
help: "ヘルプ"
@@ -554,7 +557,7 @@ showFeaturedNotesInTimeline: "タイムラインにおすすめのノートを
objectStorage: "オブジェクトストレージ"
useObjectStorage: "オブジェクトストレージを使う"
objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "参照に使うURLやで。CDNやProxyを使用してるんならそのURL、S3: 'https://<bucket>.s3.amazonaws.com'、GCSとかなら: 'https://storage.googleapis.com/<bucket>'。"
objectStorageBaseUrlDesc: "参照に使うURLやで。CDNやProxyを使用してるんならそのURL、S3: 'https://<bucket>.s3.amazonaws.com'、GCSとかなら: 'https://storage.googleapis.com/<bucket>'。"
objectStorageBucket: "Bucket"
objectStorageBucketDesc: "使ってるサービスのbucket名を選んでな"
objectStoragePrefix: "Prefix"
@@ -571,17 +574,19 @@ objectStorageSetPublicRead: "アップロードした時に'public-read'を設
s3ForcePathStyleDesc: "s3ForcePathStyleを使たらバケット名をURLのホスト名やなくてパスの一部として必ず指定させるようになるで。セルフホストされたMinioとかを使うてるんやったら有効にせなあかん場合があるで。"
serverLogs: "サーバーログ"
deleteAll: "全部ほかす"
showFixedPostForm: "タイムラインの上の方で投稿できるようにやってくれへん?"
showFixedPostForm: "タイムラインの上の方で投稿できるようにするわ"
showFixedPostFormInChannel: "タイムラインの上の方で投稿できるようにするわ(チャンネル)"
withRepliesByDefaultForNewlyFollowed: "フォローする時、デフォルトで返信をタイムラインに含むようにしよか"
newNoteRecived: "新しいノートがあるで"
newNote: "新しいノートがあるで"
sounds: "音"
sound: "音"
notificationSoundSettings: "通知音の設定"
listen: "聴く"
none: "なし"
showInPage: "ページで表示"
popout: "ポップアウト"
volume: "やかましさ"
volume: "音のでかさ"
masterVolume: "全体のやかましさ"
notUseSound: "音出さへん"
useSoundOnlyWhenActive: "Misskeyがアクティブなときだけ音出す"
@@ -597,7 +602,7 @@ nothing: "あらへん"
installedDate: "インストールした日時"
lastUsedDate: "最後に使った日時"
state: "状態"
sort: "仕分ける"
sort: "並び替え"
ascendingOrder: "小さい順"
descendingOrder: "大きい順"
scratchpad: "スクラッチパッド"
@@ -657,9 +662,9 @@ useBlurEffectForModal: "モーダルにぼかし効果を使用"
useFullReactionPicker: "フルフルのツッコミピッカーを使う"
width: "幅"
height: "高さ"
large: ""
medium: ""
small: ""
large: "でかい"
medium: "ふつう"
small: "ちいさい"
generateAccessToken: "アクセストークンの発行"
permission: "権限"
adminPermission: "管理者権限"
@@ -684,7 +689,7 @@ smtpSecure: "SMTP 接続に暗黙的なSSL/TLSを使用する"
smtpSecureInfo: "STARTTLS使っとる時はオフにしてや。"
testEmail: "配信テスト"
wordMute: "ワードミュート"
wordMuteDescription: "指定した語句が入ってるノートを最小化するで。最小化されたノートをクリックしたら、表示できるようになるで。"
wordMuteDescription: "指定した語句が入ってるノートをちっさくするで。ちっさくなったノートをクリックしたら中身を見れるで。"
hardWordMute: "ハードワードミュート"
showMutedWord: "ミュートされたワードを表示するで"
hardWordMuteDescription: "指定した語句が入ってるノートを隠すで。ワードミュートとちゃうて、ノートは完全に表示されんようになるで。"
@@ -718,7 +723,7 @@ behavior: "動作"
sample: "サンプル"
abuseReports: "通報"
reportAbuse: "通報"
reportAbuseRenote: "リノート苦情だすで?"
reportAbuseRenote: "リノート苦情出す"
reportAbuseOf: "{name}を通報する"
fillAbuseReportDescription: "細かい通報理由を書いてなー。対象ノートがある時はそのURLも書いといてなー。"
abuseReported: "無事内容が送信されたみたいやで。おおきに〜。"
@@ -768,6 +773,7 @@ lockedAccountInfo: "フォローを承認制にしとっても、ノートの公
alwaysMarkSensitive: "デフォルトでメディアを閲覧注意にするで"
loadRawImages: "添付画像のサムネイルをオリジナル画質にするで"
disableShowingAnimatedImages: "アニメーション画像を再生せんとくで"
disableShowingAnimatedImages_caption: "この設定を変えてもアニメーション画像が再生されへん時は、ブラウザとかOSのアクセシビリティ設定とか省電力設定の方が悪さしてるかもしれへんで。"
highlightSensitiveMedia: "きわどいことをめっっちゃわかりやすくする"
verificationEmailSent: "無事確認のメールを送れたで。メールに書いてあるリンクにアクセスして、設定を完了してなー。"
notSet: "未設定"
@@ -877,7 +883,7 @@ startingperiod: "始めた期間"
memo: "メモ"
priority: "優先度"
high: "高い"
middle: ""
middle: "ふつう"
low: "低い"
emailNotConfiguredWarning: "メアドの設定がされてへんで。"
ratio: "比率"
@@ -1014,6 +1020,9 @@ pushNotificationAlreadySubscribed: "プッシュ通知はオンになってる
pushNotificationNotSupported: "ブラウザかサーバーがプッシュ通知に対応してないみたいやで。"
sendPushNotificationReadMessage: "通知やメッセージが既読になったらプッシュ通知を消すで"
sendPushNotificationReadMessageCaption: "あんたの端末の電池使う量が増えるかもしれん。"
pleaseAllowPushNotification: "ブラウザの通知設定を許可してな"
browserPushNotificationDisabled: "通知の送信権限が取れんかったわ"
browserPushNotificationDisabledDescription: "今 {serverName} から通知を送るための権限が無いから、ブラウザの設定で通知を許可してもっかい試してな。"
windowMaximize: "最大化"
windowMinimize: "最小化"
windowRestore: "元に戻す"
@@ -1050,6 +1059,7 @@ permissionDeniedError: "操作が拒否されてもうた。"
permissionDeniedErrorDescription: "このアカウントはこれやったらアカンって。"
preset: "プリセット"
selectFromPresets: "プリセットから選ぶ"
custom: "カスタム"
achievements: "実績"
gotInvalidResponseError: "サーバー黙っとるわ、知らんけど"
gotInvalidResponseErrorDescription: "サーバーいま日曜日。またきて月曜日。"
@@ -1088,6 +1098,7 @@ prohibitedWordsDescription2: "スペースで区切るとAND指定、キーワ
hiddenTags: "見えてへんハッシュタグ"
hiddenTagsDescription: "設定したタグを最近流行りのとこに見えんようにすんで。複数設定するときは改行で区切ってな。"
notesSearchNotAvailable: "なんかノート探せへん。"
usersSearchNotAvailable: "ユーザーを探すことはできへんみたいや。"
license: "ライセンス"
unfavoriteConfirm: "ほんまに気に入らんの?"
myClips: "自分のクリップ"
@@ -1239,6 +1250,7 @@ releaseToRefresh: "離したらリロード"
refreshing: "リロードしとる"
pullDownToRefresh: "引っ張ってリロードするで"
useGroupedNotifications: "通知をグループ分けして出すで"
emailVerificationFailedError: "メアド確認してたらなんか変なことなったわ。リンクの期限切れてるかもしれん。"
cwNotationRequired: "「内容を隠す」んやったら注釈書かなアカンで。"
doReaction: "ツッコむで"
code: "コード"
@@ -1331,22 +1343,41 @@ unmuteX: "{x}のミュートやめたる"
redisplayAllTips: "全部の「ヒントとコツ」をもっかい見して"
hideAllTips: "「ヒントとコツ」は全部表示せんでええ"
defaultImageCompressionLevel_description: "低くすると画質は保てるんやけど、ファイルサイズが増えるで。<br>高くするとファイルサイズは減らせるんやけど、画質が落ちるで。"
defaultCompressionLevel_description: "低くすると品質は保てるんやけど、ファイルサイズが増えるで。<br>高くするとファイルサイズは減らせるんやけど、品質が落ちるで。"
inMinutes: "分"
inDays: "日"
safeModeEnabled: "セーフモードがオンになってるで"
pluginsAreDisabledBecauseSafeMode: "セーフモードがオンやから、プラグインは全部無効化されてるで。"
customCssIsDisabledBecauseSafeMode: "セーフモードがオンやから、カスタムCSSは適用されてへんで。"
themeIsDefaultBecauseSafeMode: "セーフモードがオンの間はデフォルトのテーマを使うで。セーフモードをオフにれば元に戻るで。"
thankYouForTestingBeta: "ベータ版使うてくれておおきに!"
widgets: "ウィジェット"
deviceInfoDescription: "なんか技術的なことで分からんこと聞くときは、下の情報も一緒に書いてもらえると、こっちも分かりやすいし、はよ直ると思います。"
youAreAdmin: "あんた、管理者やで"
presets: "プリセット"
_imageEditing:
_vars:
filename: "ファイル名"
_imageFrameEditor:
tip: "画像にフレームとかメタデータを入れたラベルとかを付け足していい感じにできるで。"
header: "ヘッダー"
font: "フォント"
fontSerif: "セリフ"
fontSansSerif: "サンセリフ"
quitWithoutSaveConfirm: "保存せずに終わってもええんか?"
failedToLoadImage: "あかん、画像読み込まれへんわ"
_chat:
noMessagesYet: "まだメッセージはあらへんで"
individualChat_description: "特定のユーザーと一対一でチャットできるで。"
individualChat_description: "特定のユーザーとサシでチャットできるで。"
roomChat_description: "複数人でチャットできるで。\nあと、個人チャットを許可してへんユーザーとでも、相手がええって言うならチャットできるで。"
inviteUserToChat: "ユーザーを招待してチャットを始めてみ"
invitations: "来てや"
noInvitations: "招待はあらへんで"
noHistory: "履歴はないわ。"
noRooms: "ルームはあらへんで"
join: "入る"
ignore: "ほっとく"
leave: "グループから抜ける"
members: "メンバーはん"
home: "ホーム"
send: "送信"
@@ -1389,11 +1420,13 @@ _settings:
appearanceBanner: "好みに応じた、クライアントの見た目・表示方法に関わる設定ができるで。"
soundsBanner: "クライアントで流すサウンドの設定ができるで。"
makeEveryTextElementsSelectable: "全部のテキスト要素を選択できるようにする"
makeEveryTextElementsSelectable_description: "これをつけると、一部のシチュエーションでユーザビリティが低下するかもしれん。"
makeEveryTextElementsSelectable_description: "これをつけると、場面によったら使いにくくなるかもしれん。"
useStickyIcons: "アイコンがスクロールにひっつくようにする"
enablePullToRefresh_description: "マウスやったら、ホイールを押し込みながらドラッグしてな。"
realtimeMode_description: "サーバーと接続を確立して、リアルタイムでコンテンツを更新するで。通信量とバッテリーの消費が多くなるかもしれへん。"
contentsUpdateFrequency_description: "高いほどリアルタイムにコンテンツが更新されるんやけど、そのぶんパフォーマンスが低くなるし、通信量とバッテリーの消費も増えるねん。"
contentsUpdateFrequency_description: "高いほどリアルタイムにコンテンツが更新されるんやけど、そのぶんパフォーマンスが落ちるし、通信量とバッテリーの消費も増えるねん。"
contentsUpdateFrequency_description2: "リアルタイムモードをつけてるんやったら、この設定がどうであれリアルタイムでコンテンツが更新されるで。"
emojiPaletteBanner: "絵文字ピッカーに置いとくプリセットをパレットっていうので登録したり、ピッカーの見た目を変えたりできるで。"
_preferencesProfile:
profileNameDescription: "このデバイスはなんて呼んだらええんや?"
_preferencesBackup:
@@ -1487,7 +1520,7 @@ _initialTutorial:
description: "ここでは、Misskeyのカンタンな使い方とか機能を確かめれんで。"
_note:
title: "ノートってなんや?"
description: "Misskeyでの投稿は「ノート」って呼ばれてんで。ノートは順々にタイムラインに載ってて、リアルタイムで新しくなってってんで。"
description: "Misskeyでの投稿は「ノート」って呼ばれてんで。ノートは順々にタイムラインに載ってて、リアルタイムで新しくなってで。"
reply: "返信もできるで。返信の返信もできるから、スレッドっぽく会話をそのまま続けれもするで。"
renote: "そのノートを自分のタイムラインに流して共有できるで。テキスト入れて引用してもええな。"
reaction: "ツッコミをつけることもできるで。細かいことは次のページや。"
@@ -1507,7 +1540,7 @@ _initialTutorial:
social: "ホームタイムラインの投稿もローカルタイムラインのも一緒に見れるで。"
global: "繋がってる他の全サーバーからの投稿が見れるで。"
description2: "それぞれのタイムラインは、いつでも画面上で切り替えられんねん。覚えとき。"
description3: "その他にも、リストタイムラインとかチャンネルタイムラインとかがあんねん。詳しいのは{link}を見とき。"
description3: "その他にも、リストタイムラインとかチャンネルタイムラインとかがあんねん。詳しいのは{link}を見とき。"
_postNote:
title: "ノートの投稿設定"
description1: "Misskeyにノートを投稿するとき、いろんなオプションが付けれるで。投稿画面はこんな感じや。"
@@ -1543,7 +1576,7 @@ _timelineDescription:
home: "ホームタイムラインは、あんたがフォローしとるアカウントの投稿だけ見れるで。"
local: "ローカルタイムラインは、このサーバーにおる全員の投稿を見れるで。"
social: "ソーシャルタイムラインは、ホームタイムラインの投稿もローカルタイムラインのも一緒に見れるで。"
global: "グローバルタイムラインは、繋がっとる他のサーバーの投稿、全部ひっくるめて見れで。"
global: "グローバルタイムラインは、繋がっとる他のサーバーの投稿、全部ひっくるめて見れで。"
_serverRules:
description: "新規登録前に見せる、サーバーのカンタンなルールを決めるで。内容は使うための決め事の要約がええと思うわ。"
_serverSettings:
@@ -1563,7 +1596,7 @@ _serverSettings:
inquiryUrl: "問い合わせ先URL"
inquiryUrlDescription: "サーバー運営者へのお問い合わせフォームのURLや、運営者の連絡先等が記載されたWebページのURLを指定するで。"
openRegistration: "アカウントの作成をオープンにする"
openRegistrationWarning: "登録を解放するのはリスクが伴うで。サーバーをいっつも監視して、なんか起きたらすぐに対応できるんやったら、オンにしてもええと思う。"
openRegistrationWarning: "登録を解放するのはリスクあるで。サーバーをいっつも監視して、なんか起きたらすぐに対応できるんやったら、オンにしてもええと思うけどな。"
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "一定期間モデレーターがおらんかったら、スパムを防ぐためにこの設定は勝手に切られるで。"
deliverSuspendedSoftwareDescription: "脆弱性とかの理由で、サーバーのソフトウェアの名前とバージョンの範囲を決めて配信を止められるで。このバージョン情報はサーバーが提供したものやから、信頼性は保証されへん。バージョン指定には semver の範囲指定が使えるねんけど、>= 2024.3.1と指定すると 2024.3.1-custom.0 みたいなカスタムバージョンが含まれへんから、>= 2024.3.1-0 みたいに prerelease を指定するとええかもしれへんな。"
singleUserMode_description: "このサーバーを使うとるんが自分だけなんやったら、このモードを有効にすると動作がええ感じになるで。"
@@ -1958,7 +1991,7 @@ _signup:
emailSent: "さっき入れたメアド({email})宛に確認メールを送ったで。メールに書かれたリンク押してアカウント作るの終わらしてな。\nメールの認証リンクの期限は30分や。"
_accountDelete:
accountDelete: "アカウントの削除"
mayTakeTime: "アカウント消すんはサーバーが重いんやって。やから作ったコンテンツとか上げたファイルの数が多いと消し終わるまでに時間がかかるかもしれん。"
mayTakeTime: "アカウント消すんはサーバーに負荷かかるんやって。やから作ったコンテンツとか上げたファイルの数が多いと消し終わるまでに時間がかかるかもしれん。"
sendEmail: "アカウントの消し終わるときは、登録してたメアドに通知するで。"
requestAccountDelete: "アカウント削除頼む"
started: "削除処理が始まったで。"
@@ -2298,6 +2331,7 @@ _auth:
scopeUser: "以下のユーザーとしていじってるで"
pleaseLogin: "アプリにアクセスさせるんやったら、ログインしてや。"
byClickingYouWillBeRedirectedToThisUrl: "アクセスを許したら、自動で下のURLに遷移するで"
alreadyAuthorized: "このアプリはもうアクセスを許可してるみたいやで。"
_antennaSources:
all: "みんなのノート"
homeTimeline: "フォローしとるユーザーのノート"
@@ -2388,6 +2422,14 @@ _postForm:
replyPlaceholder: "このノートに返信..."
quotePlaceholder: "このノートを引用..."
channelPlaceholder: "チャンネルに投稿..."
_howToUse:
toolbar_description: "ファイルとかアンケートを付けたり、注釈とかハッシュタグを書いたり、絵文字とかメンションとかを付け足したりできるで。"
account_description: "投稿するアカウントを変えたり、アカウントに保存した下書きとか予約投稿とかを見れるで。"
visibility_title: "公開範囲"
visibility_description: "ノートを誰に見せたいかはここで切り替えてな。"
menu_title: "メニュー"
menu_description: "下書きに保存したり、投稿の予約したり、リアクションの受け入れ設定とか…なんか色々できるで。"
submit_description: "ノートを投稿するときはここ押してな。Ctrl + Enter / Cmd + Enter でも投稿できるで。"
_placeholders:
a: "いまどないしとるん?"
b: "何かあったん?"
@@ -2533,6 +2575,8 @@ _notification:
youReceivedFollowRequest: "フォロー許可してほしいみたいやな"
yourFollowRequestAccepted: "フォローさせてもろたで"
pollEnded: "アンケートの結果が出たみたいや"
scheduledNotePosted: "予約ノートが投稿されたで"
scheduledNotePostFailed: "予約ノート投稿できんかったで"
newNote: "さらの投稿"
unreadAntennaNote: "アンテナ {name}"
roleAssigned: "ロールが付与されたで"
@@ -2999,6 +3043,7 @@ _uploader:
maxFileSizeIsX: "アップロードできるファイルサイズは{x}までやで。"
tip: "ファイルはまだアップロードされてへんで。このダイアログで、アップロードする前に確認・リネーム・圧縮・クロッピングとかをできるで。準備が出来たら、「アップロード」ボタンを押してアップロードしてな。"
_clientPerformanceIssueTip:
title: "バッテリーようさん食うなぁと思ったら"
makeSureDisabledAdBlocker: "アドブロッカーを切ってみてや"
makeSureDisabledAdBlocker_description: "アドブロッカーはパフォーマンスに影響があるかもしれへん。OSの機能とかブラウザの機能・アドオンとかでアドブロッカーが有効になってないか確認してや。"
makeSureDisabledCustomCss: "カスタムCSSを無効にしてみてや"
@@ -3022,8 +3067,10 @@ _watermarkEditor:
image: "画像"
advanced: "高度"
angle: "角度"
failedToLoadImage: "あかん、画像読み込まれへんわ"
_imageEffector:
discardChangesConfirm: "変更をせんで終わるか?"
failedToLoadImage: "あかん、画像読み込まれへんわ"
_fxProps:
angle: "角度"
scale: "大きさ"
@@ -3040,4 +3087,5 @@ _drafts:
noDrafts: "下書きはあらへん"
_qr:
showTabTitle: "表示"
shareText: "Fediverseでフォローしてな!"
raw: "テキスト"
+4
View File
@@ -57,6 +57,10 @@ searchByGoogle: "Nadi"
file: "Ifuyla"
account: "Imiḍan"
replies: "Err"
_imageFrameEditor:
font: "Tasefsit"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
_email:
_follow:
title: "Yeṭṭafaṛ-ik·em-id"
+3
View File
@@ -651,6 +651,9 @@ renotes: "리노트"
attach: "옇기"
surrender: "아이예"
information: "정보"
_imageEditing:
_vars:
filename: "파일 이럼"
_chat:
invitations: "초대하기"
noHistory: "기록이 없십니다"
+76
View File
@@ -83,6 +83,8 @@ files: "파일"
download: "다운로드"
driveFileDeleteConfirm: "‘{name}’ 파일을 삭제하시겠습니까? 이 파일을 사용하는 일부 콘텐츠도 삭제됩니다."
unfollowConfirm: "{name}님을 언팔로우하시겠습니까?"
cancelFollowRequestConfirm: "{name}(으)로의 팔로우 신청을 취소하시겠습니까?"
rejectFollowRequestConfirm: "{name}(으)로부터의 팔로우 신청을 거부하시겠습니까?"
exportRequested: "내보내기를 요청하였습니다. 이 작업은 시간이 걸릴 수 있습니다. 내보내기가 완료되면 \"드라이브\"에 추가됩니다."
importRequested: "가져오기를 요청하였습니다. 이 작업에는 시간이 걸릴 수 있습니다."
lists: "리스트"
@@ -302,6 +304,7 @@ uploadFromUrlMayTakeTime: "업로드가 완료될 때까지 시간이 소요될
uploadNFiles: "{n}개의 파일을 업로"
explore: "둘러보기"
messageRead: "읽음"
readAllChatMessages: "모든 메시지를 읽은 상태로 표시"
noMoreHistory: "이것보다 과거의 기록이 없습니다"
startChat: "채팅을 시작하기"
nUsersRead: "{n}명이 읽음"
@@ -775,6 +778,7 @@ lockedAccountInfo: "팔로우를 승인으로 승인받더라도 노트의 공
alwaysMarkSensitive: "미디어를 항상 열람 주의로 설정"
loadRawImages: "첨부한 이미지의 썸네일을 원본화질로 표시"
disableShowingAnimatedImages: "움직이는 이미지를 자동으로 재생하지 않음"
disableShowingAnimatedImages_caption: "이 설정에 상관없이 애니메이션 이미지가 재생되지 않을 때는 브라우저·OS의 액티비티 설정이나 절전 모드 설정 등이 간섭하고 있는 경우가 있습니다."
highlightSensitiveMedia: "미디어가 민감한 내용이라는 것을 알기 쉽게 표시"
verificationEmailSent: "확인 메일을 발송하였습니다. 설정을 완료하려면 메일에 첨부된 링크를 확인해 주세요."
notSet: "설정되지 않음"
@@ -1021,6 +1025,9 @@ pushNotificationAlreadySubscribed: "푸시 알림이 이미 켜져 있습니다"
pushNotificationNotSupported: "브라우저나 서버에서 푸시 알림이 지원되지 않습니다"
sendPushNotificationReadMessage: "푸시 알림이나 메시지를 읽은 뒤 푸시 알림을 삭제"
sendPushNotificationReadMessageCaption: "「{emptyPushNotificationMessage}」이라는 알림이 잠깐 표시됩니다. 기기의 전력 소비량이 증가할 수 있습니다."
pleaseAllowPushNotification: "브라우저의 알림 설정을 허가해 주십시오."
browserPushNotificationDisabled: "알림 송신 권한 얻기에 실패했습니다."
browserPushNotificationDisabledDescription: "{serverName}에서의 알림 송신 권한이 없습니다. 브라우저의 설정에서 알림을 허가해 다시 시도해 주십시오."
windowMaximize: "최대화"
windowMinimize: "최소화"
windowRestore: "복구"
@@ -1171,6 +1178,7 @@ installed: "설치됨"
branding: "브랜딩"
enableServerMachineStats: "서버의 머신 사양을 공개하기"
enableIdenticonGeneration: "유저마다의 Identicon 생성 유효화"
showRoleBadgesOfRemoteUsers: "리모트 유저의 역할 배지 표시"
turnOffToImprovePerformance: "이 기능을 끄면 성능이 향상될 수 있습니다."
createInviteCode: "초대 코드 생성"
createWithOptions: "옵션을 지정하여 생성"
@@ -1394,6 +1402,50 @@ scheduled: "예약"
widgets: "위젯"
deviceInfo: "장치 정보"
deviceInfoDescription: "기술적 문의의 경우 아래의 정보를 병기하면 문제의 해결에 도움이 됩니다."
youAreAdmin: "당신은 관리자입니다."
frame: "프레임"
presets: "프리셋"
zeroPadding: "0으로 채우기"
_imageEditing:
_vars:
caption: "파일 설명"
filename: "파일명"
filename_without_ext: "확장자가 없는 파일명"
year: "촬영한 해"
month: "촬영한 달"
day: "촬영한 날"
hour: "촬영한 시각(시)"
minute: "촬영한 시각(분)"
second: "촬영한 시각(초)"
camera_model: "카메라 이름"
camera_lens_model: "렌즈 이름"
camera_mm: "초점 거리"
camera_mm_35: "초점 거리(35m판 환산)"
camera_f: "조리개 조절"
camera_s: "셔터 속도"
camera_iso: "ISO 감도"
gps_lat: "위도"
gps_long: "경도"
_imageFrameEditor:
title: "프레임 편집"
tip: "이미지에 프레임이나 메타 데이터를 포함한 라벨을 추가해 장식할 수 있습니다."
header: "헤더"
footer: "꼬리말"
borderThickness: "테두리의 폭"
labelThickness: "라벨의 폭"
labelScale: "라벨의 스케일"
centered: "중앙 정렬"
captionMain: "캡션(대)"
captionSub: "캡션(소)"
availableVariables: "이용 가능한 변수"
withQrCode: "QR 코드"
backgroundColor: "배경색"
textColor: "글꼴 색상"
font: "폰트"
fontSerif: "명조체"
fontSansSerif: "고딕체"
quitWithoutSaveConfirm: "보존하지 않고 종료하시겠습니까?"
failedToLoadImage: "이미지 로드에 실패했습니다."
_compression:
_quality:
high: "고품질"
@@ -1496,6 +1548,8 @@ _settings:
showUrlPreview: "URL 미리보기 표시"
showAvailableReactionsFirstInNote: "이용 가능한 리액션을 선두로 표시"
showPageTabBarBottom: "페이지의 탭 바를 아래쪽에 표시"
emojiPaletteBanner: "이모티콘 선택기에 고정 표시되는 프리셋을 팔레트로 등록하거나 선택기의 표시 방법을 커스터마이징할 수 있습니다."
enableAnimatedImages: "애니메이션 이미지 활성화"
_chat:
showSenderName: "발신자 이름 표시"
sendOnEnter: "엔터로 보내기"
@@ -1504,6 +1558,8 @@ _preferencesProfile:
profileNameDescription: "이 디바이스를 식별할 이름을 설정해 주세요."
profileNameDescription2: "예: '메인PC', '스마트폰' 등"
manageProfiles: "프로파일 관리"
shareSameProfileBetweenDevicesIsNotRecommended: "여러 장치에서 동일한 프로필을 공유하는 것은 권장하지 않습니다."
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "여러 장치에서 동기화하고 싶은 설정 항목이 있는 경우에는 개별로 '여러 장치에서 동기화' 옵션을 활성화해 주십시오."
_preferencesBackup:
autoBackup: "자동 백업"
restoreFromBackup: "백업으로 복구"
@@ -1513,6 +1569,7 @@ _preferencesBackup:
youNeedToNameYourProfileToEnableAutoBackup: "자동 백업을 활성화하려면 프로필 이름을 설정해야 합니다."
autoPreferencesBackupIsNotEnabledForThisDevice: "이 장치에서 설정 자동 백업이 활성화되어 있지 않습니다."
backupFound: "설정 백업이 발견되었습니다"
forceBackup: "설정 강제 백업"
_accountSettings:
requireSigninToViewContents: "콘텐츠 열람을 위해 로그인을 필수로 설정하기"
requireSigninToViewContentsDescription1: "자신이 작성한 모든 노트 등의 콘텐츠를 보기 위해 로그인을 필수로 설정합니다. 크롤러가 정보 수집하는 것을 방지하는 효과를 기대할 수 있습니다."
@@ -2528,6 +2585,20 @@ _postForm:
replyPlaceholder: "이 노트에 답글..."
quotePlaceholder: "이 노트를 인용..."
channelPlaceholder: "채널에 게시하기..."
showHowToUse: "입력란의 설명 표시"
_howToUse:
content_title: "본문"
content_description: "게시할 내용을 입력합니다."
toolbar_title: "도구 모음"
toolbar_description: "파일이나 설문의 첨부, 주석이나 해시태그 설정, 이모티콘이나 멘션의 삽입 등을 할 수 있습니다."
account_title: "계정 메뉴"
account_description: "게시할 계정을 교체하거나, 계정에 보존한 초안 및 예약 게시물을 목록으로 볼 수 있습니다."
visibility_title: "공개 범위"
visibility_description: "노트 공개 범위의 설정을 할 수 있습니다."
menu_title: "메뉴"
menu_description: "초안의 보존, 게시 예약, 리액션의 설정 등 그 외의 액션을 할 수 있습니다."
submit_title: "게시 버튼"
submit_description: "노트를 게시합니다. Ctrl + Enter / Cmd + Enter로도 게시할 수 있습니다."
_placeholders:
a: "지금 무엇을 하고 있나요?"
b: "무슨 일이 일어나고 있나요?"
@@ -2805,6 +2876,8 @@ _abuseReport:
notifiedWebhook: "사용할 Webhook"
deleteConfirm: "수신자를 삭제하시겠습니까?"
_moderationLogTypes:
clearQueue: "작업 대기열 비우기"
promoteQueue: "큐의 작업을 재시도"
createRole: "역할 생성"
deleteRole: "역할 삭제"
updateRole: "역할 수정"
@@ -3199,6 +3272,7 @@ _watermarkEditor:
title: "워터마크 편집"
cover: "전체에 붙이기"
repeat: "전면에 깔기"
preserveBoundingRect: "회전 시 빠져나오지 않도록 조정"
opacity: "불투명도"
scale: "크기"
text: "텍스트"
@@ -3220,11 +3294,13 @@ _watermarkEditor:
polkadotSubDotRadius: "서브 물방울의 크기"
polkadotSubDotDivisions: "서브 물방울의 수"
leaveBlankToAccountUrl: "빈칸일 경우 계정의 URL로 됩니다."
failedToLoadImage: "이미지 로딩에 실패했습니다."
_imageEffector:
title: "이펙트"
addEffect: "이펙트를 추가"
discardChangesConfirm: "변경을 취소하고 종료하시겠습니까?"
nothingToConfigure: "설정 항목이 없습니다."
failedToLoadImage: "이미지 로딩에 실패했습니다."
_fxs:
chromaticAberration: "색수차"
glitch: "글리치"
+6
View File
@@ -393,6 +393,9 @@ file: "ໄຟລ໌"
replies: "ຕອບ​ກັບ"
renotes: "Renote"
information: "ກ່ຽວກັບ"
_imageEditing:
_vars:
filename: "ຊື່ໄຟລ໌"
_chat:
invitations: "ເຊີນ"
noHistory: "​ບໍ່​ມີປະຫວັດ"
@@ -434,6 +437,9 @@ _visibility:
home: "ໜ້າຫຼັກ"
followers: "ຜູ້ຕິດຕາມ"
specified: "ໂພສ Direct note"
_postForm:
_howToUse:
menu_title: "ເມນູ"
_profile:
name: "ຊື່"
username: "ຊື່ຜູ້ໃຊ້"
+7
View File
@@ -970,6 +970,9 @@ renotes: "Herdelen"
followingOrFollower: "Gevolgd of volger"
confirmShowRepliesAll: "Dit is een onomkeerbare operatie. Weet je zeker dat reacties op anderen van iedereen die je volgt, wil weergeven in je tijdlijn?"
information: "Over"
_imageEditing:
_vars:
filename: "Bestandsnaam"
_chat:
invitations: "Uitnodigen"
noHistory: "Geen geschiedenis gevonden"
@@ -1020,6 +1023,10 @@ _visibility:
home: "Startpagina"
followers: "Volgers"
specified: "Directe notities"
_postForm:
_howToUse:
visibility_title: "Zichtbaarheid"
menu_title: "Menu"
_profile:
name: "Naam"
username: "Gebruikersnaam"
+8
View File
@@ -463,6 +463,12 @@ surrender: "Avbryt"
information: "Informasjon"
inMinutes: "Minutter"
inDays: "Dager"
_imageEditing:
_vars:
filename: "Filnavn"
_imageFrameEditor:
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
_chat:
invitations: "Inviter"
members: "Medlemmer"
@@ -650,6 +656,8 @@ _visibility:
home: "Hjem"
followers: "Følgere"
_postForm:
_howToUse:
menu_title: "Meny"
_placeholders:
a: "Hva skjer?"
_profile:
+12
View File
@@ -1043,6 +1043,15 @@ information: "Informacje"
inMinutes: "minuta"
inDays: "dzień"
widgets: "Widżety"
presets: "Konfiguracja"
_imageEditing:
_vars:
filename: "Nazwa pliku"
_imageFrameEditor:
header: "Nagłówek"
font: "Czcionka"
fontSerif: "Szeryfowa"
fontSansSerif: "Bezszeryfowa"
_chat:
invitations: "Zaproś"
noHistory: "Brak historii"
@@ -1393,6 +1402,9 @@ _postForm:
replyPlaceholder: "Odpowiedz na ten wpis..."
quotePlaceholder: "Zacytuj ten wpis…"
channelPlaceholder: "Publikuj na kanale..."
_howToUse:
visibility_title: "Widoczność"
menu_title: "Menu"
_placeholders:
a: "Co się dzieje?"
b: "Co się wydarzyło?"
+14
View File
@@ -1390,6 +1390,17 @@ scheduledToPostOnX: "A nota está agendada para {x}"
schedule: "Agendar"
scheduled: "Agendado"
widgets: "Widgets"
presets: "Predefinições"
_imageEditing:
_vars:
filename: "Nome do Ficheiro"
_imageFrameEditor:
header: "Cabeçalho"
withQrCode: "Código QR"
font: "Fonte"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
quitWithoutSaveConfirm: "Descartar mudanças?"
_compression:
_quality:
high: "Qualidade alta"
@@ -2522,6 +2533,9 @@ _postForm:
replyPlaceholder: "Responder a essa nota..."
quotePlaceholder: "Citar essa nota..."
channelPlaceholder: "Postar em canal..."
_howToUse:
visibility_title: "Visibilidade"
menu_title: "Menu\n"
_placeholders:
a: "Como vão as coisas?"
b: "O que está rolando por aí?"
+7
View File
@@ -1215,6 +1215,10 @@ lastNDays: "Ultimele {n} zile"
surrender: "Anulează"
copyPreferenceId: "Copiază ID-ul preferințelor"
information: "Despre"
presets: "Presetate"
_imageEditing:
_vars:
filename: "Nume fișier"
_chat:
invitations: "Invită"
noHistory: "Nu există istoric"
@@ -1307,6 +1311,9 @@ _postForm:
replyPlaceholder: "Răspunde la această notă..."
quotePlaceholder: "Citează aceasta nota..."
channelPlaceholder: "Postează pe un canal..."
_howToUse:
visibility_title: "Vizibilitate"
menu_title: "Meniu"
_placeholders:
a: "Ce mai faci?"
b: "Ce se mai petrece in jurul tău?"
+17 -3
View File
@@ -87,7 +87,7 @@ exportRequested: "Вы запросили экспорт. Это может за
importRequested: "Вы запросили импорт. Это может занять некоторое время."
lists: "Списки"
noLists: "Нет ни одного списка"
note: "Заметка"
note: "Пост"
notes: "Заметки"
following: "Подписки"
followers: "Подписчики"
@@ -122,7 +122,7 @@ inChannelRenote: "В канале"
inChannelQuote: "Заметки в канале"
renoteToChannel: "Репостнуть в канал"
renoteToOtherChannel: "Репостнуть в другой канал"
pinnedNote: "Закреплённая заметка"
pinnedNote: "Закреплённый пост"
pinned: "Закрепить в профиле"
you: "Вы"
clickToShow: "Нажмите для просмотра"
@@ -253,6 +253,7 @@ noteDeleteConfirm: "Вы хотите удалить эту заметку?"
pinLimitExceeded: "Нельзя закрепить ещё больше заметок"
done: "Готово"
processing: "Обработка"
preprocessing: "Подготовка..."
preview: "Предпросмотр"
default: "По умолчанию"
defaultValueIs: "По умолчанию: {value}"
@@ -396,7 +397,7 @@ pinnedUsersDescription: "Перечислите по одному имени п
pinnedPages: "Закрепленные страницы"
pinnedPagesDescription: "Если хотите закрепить страницы на главной сайта, сюда можно добавить пути к ним, каждый в отдельной строке."
pinnedClipId: "Идентификатор закреплённой подборки"
pinnedNotes: "Закреплённая заметка"
pinnedNotes: "Закреплённый пост"
hcaptcha: "hCaptcha"
enableHcaptcha: "Включить hCaptcha"
hcaptchaSiteKey: "Ключ сайта"
@@ -1164,6 +1165,7 @@ installed: "Установлено"
branding: "Бренд"
enableServerMachineStats: "Опубликовать характеристики сервера"
enableIdenticonGeneration: "Включить генерацию иконки пользователя"
showRoleBadgesOfRemoteUsers: "Display the role badges assigned to remote users"
turnOffToImprovePerformance: "Отключение этого параметра может повысить производительность."
createInviteCode: "Создать код приглашения"
createWithOptions: "Используйте параметры для создания"
@@ -1278,6 +1280,15 @@ information: "Описание"
inMinutes: "мин"
inDays: "сут"
widgets: "Виджеты"
presets: "Шаблоны"
_imageEditing:
_vars:
filename: "Имя файла"
_imageFrameEditor:
header: "Заголовок"
font: "Шрифт"
fontSerif: "Антиква (с засечками)"
fontSansSerif: "Гротеск (без засечек)"
_chat:
invitations: "Пригласить"
noHistory: "История пока пуста"
@@ -2007,6 +2018,9 @@ _postForm:
replyPlaceholder: "Ответ на заметку..."
quotePlaceholder: "Пояснение к цитате..."
channelPlaceholder: "Отправить в канал"
_howToUse:
visibility_title: "Видимость"
menu_title: "Меню"
_placeholders:
a: "Как дела?"
b: "Что интересного вокруг?"
+11
View File
@@ -916,6 +916,14 @@ information: "Informácie"
inMinutes: "min"
inDays: "dní"
widgets: "Widgety"
_imageEditing:
_vars:
filename: "Názov súboru"
_imageFrameEditor:
header: "Hlavička"
font: "Písmo"
fontSerif: "Pätkové"
fontSansSerif: "Bezpätkové"
_chat:
invitations: "Pozvať"
noHistory: "Žiadna história"
@@ -1264,6 +1272,9 @@ _postForm:
replyPlaceholder: "Odpoveď na túto poznámku..."
quotePlaceholder: "Citovanie tejto poznámky..."
channelPlaceholder: "Poslať do kanála..."
_howToUse:
visibility_title: "Viditeľnosť"
menu_title: "Menu"
_placeholders:
a: "Čo máte v pláne?"
b: "Čo sa deje?"
+6
View File
@@ -559,6 +559,9 @@ tryAgain: "Försök igen senare"
signinWithPasskey: "Logga in med nyckel"
unknownWebAuthnKey: "Okänd nyckel"
information: "Om"
_imageEditing:
_vars:
filename: "Filnamn"
_chat:
invitations: "Inbjudan"
members: "Medlemmar"
@@ -647,6 +650,9 @@ _visibility:
home: "Hem"
followers: "Följare"
specified: "Direktnoter"
_postForm:
_howToUse:
menu_title: "Meny"
_profile:
name: "Namn"
username: "Användarnamn"
+14
View File
@@ -1390,6 +1390,17 @@ scheduledToPostOnX: "มีการกำหนดเวลาให้โพ
schedule: "กำหนดเวลา"
scheduled: "กำหนดเวลา"
widgets: "วิดเจ็ต"
presets: "พรีเซ็ต"
_imageEditing:
_vars:
filename: "ชื่อไฟล์"
_imageFrameEditor:
header: "ส่วนหัว"
withQrCode: "QR โค้ด"
font: "แบบอักษร"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
quitWithoutSaveConfirm: "ต้องการออกโดยไม่บันทึกหรือไม่?"
_compression:
_quality:
high: "คุณภาพสูง"
@@ -2522,6 +2533,9 @@ _postForm:
replyPlaceholder: "ตอบกลับโน้ตนี้..."
quotePlaceholder: "อ้างโน้ตนี้..."
channelPlaceholder: "โพสต์ลงช่อง..."
_howToUse:
visibility_title: "การมองเห็น"
menu_title: "เมนู"
_placeholders:
a: "ตอนนี้เป็นยังไงบ้าง?"
b: "มีอะไรเกิดขึ้นหรือเปล่า?"
+13
View File
@@ -1379,6 +1379,16 @@ customCssIsDisabledBecauseSafeMode: "Güvenli mod etkin olduğu için özel CSS
themeIsDefaultBecauseSafeMode: "Güvenli mod etkinken, varsayılan tema kullanılır. Güvenli modu devre dışı bırakmak bu değişiklikleri geri alır."
thankYouForTestingBeta: "Beta sürümünü test ettiğin için teşekkür ederiz!"
widgets: "Widget'lar"
presets: "Ön ayar"
_imageEditing:
_vars:
filename: "Dosya adı"
_imageFrameEditor:
header: "Başlık"
font: "Yazı tipi"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
quitWithoutSaveConfirm: "Kaydedilmemiş değişiklikleri silmek ister misin?"
_order:
newest: "Önce yeni"
oldest: "Önce eski"
@@ -2500,6 +2510,9 @@ _postForm:
replyPlaceholder: "Bu notu yanıtla..."
quotePlaceholder: "Bu notu alıntı yap..."
channelPlaceholder: "Bir kanala gönder..."
_howToUse:
visibility_title: "Görünürlük"
menu_title: "Menü"
_placeholders:
a: "Ne yapıyorsun?"
b: "Çevrende neler oluyor?"
+11
View File
@@ -922,6 +922,14 @@ information: "Інформація"
inMinutes: "х"
inDays: "д"
widgets: "Віджети"
_imageEditing:
_vars:
filename: "Ім'я файлу"
_imageFrameEditor:
header: "Заголовок"
font: "Шрифт"
fontSerif: "Serif"
fontSansSerif: "Sans serif"
_chat:
invitations: "Запросити"
noHistory: "Історія порожня"
@@ -1462,6 +1470,9 @@ _postForm:
replyPlaceholder: "Відповідь на цю нотатку..."
quotePlaceholder: "Прокоментуйте цю нотатку..."
channelPlaceholder: "Опублікувати в каналі"
_howToUse:
visibility_title: "Видимість"
menu_title: "Меню"
_placeholders:
a: "Чим займаєтесь?"
b: "Що відбувається навколо вас?"
+12
View File
@@ -837,6 +837,14 @@ replies: "Javob berish"
renotes: "Qayta qayd etish"
flip: "Teskari"
information: "Haqida"
_imageEditing:
_vars:
filename: "Fayl nomi"
_imageFrameEditor:
header: "Sarlavha"
font: "Shrift"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
_chat:
invitations: "Taklif qilish"
noHistory: "Tarix yo'q"
@@ -964,6 +972,10 @@ _visibility:
home: "Bosh sahifa"
followers: "Obunachilar"
specified: "Bevosita"
_postForm:
_howToUse:
visibility_title: "Ko'rinishi"
menu_title: "Menyu"
_profile:
name: "Ism"
username: "Foydalanuvchi nomi"
+12
View File
@@ -1223,6 +1223,15 @@ migrateOldSettings_description: "Thông thường, quá trình này diễn ra t
inMinutes: "phút"
inDays: "ngày"
widgets: "Tiện ích"
presets: "Mẫu thiết lập"
_imageEditing:
_vars:
filename: "Tên tập tin"
_imageFrameEditor:
header: "Ảnh bìa"
font: "Phông chữ"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
_chat:
invitations: "Mời"
noHistory: "Không có dữ liệu"
@@ -1859,6 +1868,9 @@ _postForm:
replyPlaceholder: "Trả lời tút này"
quotePlaceholder: "Trích dẫn tút này"
channelPlaceholder: "Đăng lên một kênh"
_howToUse:
visibility_title: "Hiển thị"
menu_title: "Menu"
_placeholders:
a: "Bạn đang định làm gì?"
b: "Hôm nay bạn có gì vui?"
+130 -54
View File
@@ -83,6 +83,8 @@ files: "文件"
download: "下载"
driveFileDeleteConfirm: "要删除「{name}」文件吗?附加此文件的帖子也会被删除。"
unfollowConfirm: "要取消对 {name} 的关注吗?"
cancelFollowRequestConfirm: "要取消申请关注{name}吗?"
rejectFollowRequestConfirm: "要拒绝{name}的关注申请吗?"
exportRequested: "导出请求已提交,这可能需要花一些时间,导出的文件将保存到网盘中。"
importRequested: "导入请求已提交,这可能需要花一点时间。"
lists: "列表"
@@ -106,8 +108,8 @@ privacy: "隐私"
makeFollowManuallyApprove: "关注请求需要批准"
defaultNoteVisibility: "默认可见性"
follow: "关注"
followRequest: "关注申请"
followRequests: "关注请"
followRequest: "申请关注"
followRequests: "关注请"
unfollow: "取消关注"
followRequestPending: "关注请求待批准"
enterEmoji: "输入表情符号"
@@ -302,6 +304,7 @@ uploadFromUrlMayTakeTime: "上传可能需要一些时间完成。"
uploadNFiles: "上传 {n} 个文件"
explore: "发现"
messageRead: "已读"
readAllChatMessages: "将所有消息标记为已读"
noMoreHistory: "没有更多的历史记录"
startChat: "开始聊天"
nUsersRead: "{n}人已读"
@@ -473,7 +476,7 @@ passwordLessLogin: "无密码登录"
passwordLessLoginDescription: "不使用密码,仅使用安全密钥或 Passkey 登录"
resetPassword: "重置密码"
newPasswordIs: "新的密码是「{password}」"
reduceUiAnimation: "减少UI动画"
reduceUiAnimation: "减少 UI 动画"
share: "分享"
notFound: "未找到"
notFoundDescription: "没有与指定 URL 对应的页面。"
@@ -540,7 +543,7 @@ regenerate: "重新生成"
fontSize: "字体大小"
mediaListWithOneImageAppearance: "仅一张图片的媒体列表高度"
limitTo: "上限为 {x}"
noFollowRequests: "没有关注请"
noFollowRequests: "没有关注请"
openImageInNewTab: "在新标签页中打开图片"
dashboard: "管理面板"
local: "本地"
@@ -775,6 +778,7 @@ lockedAccountInfo: "即使启用该功能,只要帖子可见范围不是「仅
alwaysMarkSensitive: "默认将媒体文件标记为敏感内容"
loadRawImages: "添加附件图像的缩略图时使用原始图像质量"
disableShowingAnimatedImages: "不播放动画"
disableShowingAnimatedImages_caption: "如果即使关闭了此设置但动画仍无法播放,则可能是浏览器或操作系统的辅助功能设置,又或者是省电设置等产生了干扰。"
highlightSensitiveMedia: "高亮显示敏感媒体"
verificationEmailSent: "已发送确认电子邮件。请访问电子邮件中的链接以完成设置。"
notSet: "未设置"
@@ -793,7 +797,7 @@ makeExplorable: "使账号可见。"
makeExplorableDescription: "关闭时,账号不会显示在\"发现\"中。"
duplicate: "复制"
left: "左"
center: "中"
center: "中"
wide: "宽"
narrow: "窄"
reloadToApplySetting: "页面刷新后设置才会生效。是否现在刷新页面?"
@@ -815,7 +819,7 @@ advanced: "高级"
advancedSettings: "高级设置"
value: "值"
createdAt: "创建日期"
updatedAt: "更新时间"
updatedAt: "更新日期"
saveConfirm: "确定保存?"
deleteConfirm: "确定删除?"
invalidValue: "无效值。"
@@ -872,12 +876,12 @@ noMaintainerInformationWarning: "尚未设置管理员信息。"
noInquiryUrlWarning: "尚未设置联络地址。"
noBotProtectionWarning: "尚未设置 Bot 防御。"
configure: "设置"
postToGallery: "创建新相册"
postToGallery: "创建新图集"
postToHashtag: "投稿到这个标签"
gallery: "相册"
gallery: "图集"
recentPosts: "最新发布"
popularPosts: "热门投稿"
shareWithNote: "分享到文"
shareWithNote: "分享到文"
ads: "广告"
expiration: "截止时间"
startingperiod: "开始时间"
@@ -1021,6 +1025,9 @@ pushNotificationAlreadySubscribed: "推送通知消息已启用"
pushNotificationNotSupported: "浏览器或服务器不支持推送通知消息"
sendPushNotificationReadMessage: "删除已读推送通知消息"
sendPushNotificationReadMessageCaption: "您终端设备的电池消耗可能会增加。"
pleaseAllowPushNotification: "请在浏览器中启用推送通知"
browserPushNotificationDisabled: "未能获取发送通知的权限"
browserPushNotificationDisabledDescription: "{serverName}无权限发送通知。请在浏览器设置中允许通知后重新尝试。"
windowMaximize: "最大化"
windowMinimize: "最小化"
windowRestore: "还原"
@@ -1030,7 +1037,7 @@ tools: "工具"
cannotLoad: "无法加载"
numberOfProfileView: "个人资料展示次数"
like: "点赞!"
unlike: "取消"
unlike: "取消喜欢"
numberOfLikes: "点赞数"
show: "显示"
neverShow: "不再显示"
@@ -1066,7 +1073,7 @@ thisPostMayBeAnnoyingHome: "发到首页"
thisPostMayBeAnnoyingCancel: "取消"
thisPostMayBeAnnoyingIgnore: "就这样发布"
collapseRenotes: "省略显示已经看过的转发内容"
collapseRenotesDescription: "回应或转过的贴子折叠表示。"
collapseRenotesDescription: "折叠显示回应或转过的帖文。"
internalServerError: "内部服务器错误"
internalServerErrorDescription: "内部服务器发生了预期外的错误"
copyErrorInfo: "复制错误信息"
@@ -1107,7 +1114,7 @@ retryAllQueuesConfirmText: "可能会使服务器负荷在一定时间内增加"
enableChartsForRemoteUser: "生成远程用户的图表"
enableChartsForFederatedInstances: "生成远程服务器的图表"
enableStatsForFederatedInstances: "获取远程服务器的信息"
showClipButtonInNoteFooter: "在文下方显示便签按钮"
showClipButtonInNoteFooter: "在文下方显示便签按钮"
reactionsDisplaySize: "回应显示大小"
limitWidthOfReaction: "限制回应的最大宽度,并将其缩小显示"
noteIdOrUrl: "帖子 ID 或 URL"
@@ -1145,7 +1152,7 @@ archive: "归档"
archived: "已归档"
unarchive: "取消归档"
channelArchiveConfirmTitle: "要将 {name} 归档吗?"
channelArchiveConfirmDescription: "归档后,在频道列表与搜索结果中不会显示,也无法发布新的文。"
channelArchiveConfirmDescription: "归档后,不会在频道列表与搜索结果中显示,也无法发布新的文。"
thisChannelArchived: "该频道已被归档。"
displayOfNote: "显示帖子"
initialAccountSetting: "初始设定"
@@ -1171,6 +1178,7 @@ installed: "已安装"
branding: "品牌"
enableServerMachineStats: "公开服务器硬件统计信息"
enableIdenticonGeneration: "启用生成用户 Identicon"
showRoleBadgesOfRemoteUsers: "显示远程用户的角色徽章"
turnOffToImprovePerformance: "关闭该选项可以提高性能。"
createInviteCode: "生成邀请码"
createWithOptions: "使用选项来创建"
@@ -1204,7 +1212,7 @@ renotes: "转发"
loadReplies: "查看回复"
loadConversation: "查看对话"
pinnedList: "已置顶的列表"
keepScreenOn: "保持设备屏幕开启"
keepScreenOn: "保持屏幕常亮"
verifiedLink: "已验证的链接"
notifyNotes: "打开发帖通知"
unnotifyNotes: "关闭发帖通知"
@@ -1329,7 +1337,7 @@ accessibility: "辅助功能"
preferencesProfile: "设置的配置"
copyPreferenceId: "复制设置 ID"
resetToDefaultValue: "重置为默认值"
overrideByAccount: "用账户覆盖"
overrideByAccount: "覆盖账号"
untitled: "未命名"
noName: "没有名字"
skip: "跳过"
@@ -1394,6 +1402,50 @@ scheduled: "定时"
widgets: "小工具"
deviceInfo: "设备信息"
deviceInfoDescription: "咨询技术问题时,将以下信息一并发送有助于解决问题。"
youAreAdmin: "你是管理员"
frame: "边框"
presets: "预设值"
zeroPadding: "填充 0"
_imageEditing:
_vars:
caption: "文件标题"
filename: "文件名称"
filename_without_ext: "不带扩展名的文件名"
year: "拍摄年"
month: "拍摄月"
day: "拍摄日"
hour: "拍摄时间(时)"
minute: "拍摄时间(分)"
second: "拍摄时间(秒)"
camera_model: "相机名称"
camera_lens_model: "镜头型号"
camera_mm: "焦距"
camera_mm_35: "焦距(35mm等效)"
camera_f: "光圈"
camera_s: "快门速度"
camera_iso: "ISO"
gps_lat: "纬度"
gps_long: "经度"
_imageFrameEditor:
title: "编辑边框"
tip: "您可以通过添加包含边框和元数据的标签来装饰图片。"
header: "顶栏"
footer: "页脚"
borderThickness: "边框宽度"
labelThickness: "标签宽度"
labelScale: "标签比例"
centered: "居中"
captionMain: "标题(大)"
captionSub: "标题(小)"
availableVariables: "可修改的变量"
withQrCode: "二维码"
backgroundColor: "背景颜色"
textColor: "文本颜色"
font: "字体"
fontSerif: "衬线字体"
fontSansSerif: "无衬线字体"
quitWithoutSaveConfirm: "放弃未保存的更改?"
failedToLoadImage: "图片加载失败"
_compression:
_quality:
high: "高质量"
@@ -1411,36 +1463,36 @@ _chat:
noMessagesYet: "还没有消息"
newMessage: "新消息"
individualChat: "私聊"
individualChat_description: "可以与特定用户进行一对一聊天。"
individualChat_description: "与特定用户单独聊天。"
roomChat: "群聊"
roomChat_description: "支持多人同时进行消息交流。\n即使部分用户未开放私信权限,只要接受邀请,仍可进行聊天。"
createRoom: "创建群"
inviteUserToChat: "邀请用户来开始聊天"
yourRooms: "创建的群"
joiningRooms: "已加入的群"
roomChat_description: "支持多人同时聊天。\n即使对方不允许私聊,只要接受邀请也能加入。"
createRoom: "创建群"
inviteUserToChat: "邀请用户来聊天"
yourRooms: "创建的群"
joiningRooms: "已加入的群"
invitations: "邀请"
noInvitations: "没有邀请"
history: "历史"
noHistory: "没有历史记录"
noRooms: "没有群"
noRooms: "没有群"
inviteUser: "邀请用户"
sentInvitations: "已发送的邀请"
join: "加入"
ignore: "忽略"
leave: "退出房间"
leave: "退出群聊"
members: "成员"
searchMessages: "搜索消息"
home: "首页"
send: "发送"
newline: "换行"
muteThisRoom: "屏蔽该群"
deleteRoom: "删除群"
muteThisRoom: "屏蔽该群"
deleteRoom: "删除群"
chatNotAvailableForThisAccountOrServer: "此服务器或者账户还未开启聊天功能。"
chatIsReadOnlyForThisAccountOrServer: "此服务器或者账户内的聊天为只读。无法发布新信息或创建及加入群聊。"
chatNotAvailableInOtherAccount: "对方的账户当前无法使用私信。"
cannotChatWithTheUser: "无法私信该用户"
cannotChatWithTheUser_description: "可能现在无法使用聊天,或者对方未开启聊天。"
youAreNotAMemberOfThisRoomButInvited: "您未加入此房间,但已收到邀请。如要加入,请接受邀请。"
youAreNotAMemberOfThisRoomButInvited: "您未加入此群组,但已收到加入邀请。请接受邀请加入。"
doYouAcceptInvitation: "要接受邀请吗?"
chatWithThisUser: "私信"
thisUserAllowsChatOnlyFromFollowers: "此用户仅接受关注者发起的聊天。"
@@ -1496,6 +1548,8 @@ _settings:
showUrlPreview: "显示 URL 预览"
showAvailableReactionsFirstInNote: "在顶部显示可用的回应"
showPageTabBarBottom: "在下方显示页面标签栏"
emojiPaletteBanner: "可以将固定显示表情符号选择器的预设注册至调色板,也可以自定义表情符号选择器的显示方式。"
enableAnimatedImages: "启用动画图像"
_chat:
showSenderName: "显示发送者的名字"
sendOnEnter: "回车键发送"
@@ -1504,6 +1558,8 @@ _preferencesProfile:
profileNameDescription: "请指定用于识别此设备的名称"
profileNameDescription2: "如「PC」、「手机」等"
manageProfiles: "管理配置文件"
shareSameProfileBetweenDevicesIsNotRecommended: "不建议在多个设备间共用同一个配置文件。"
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "若想在多个设备间同步某些设置,请为每个设置打开「多设备间同步」选项。"
_preferencesBackup:
autoBackup: "自动备份"
restoreFromBackup: "从备份恢复"
@@ -1513,6 +1569,7 @@ _preferencesBackup:
youNeedToNameYourProfileToEnableAutoBackup: "需指定配置名以开启自动备份。"
autoPreferencesBackupIsNotEnabledForThisDevice: "此设备未开启自动备份"
backupFound: "已找到备份"
forceBackup: "强制备份设置"
_accountSettings:
requireSigninToViewContents: "需要登录才能显示内容"
requireSigninToViewContentsDescription1: "您发布的所有帖子将变成需要登入后才会显示。有望防止爬虫收集各种信息。"
@@ -1801,7 +1858,7 @@ _achievements:
_login500:
title: "老熟人Ⅰ"
description: "累计登录 500 天"
flavor: "诸君,我喜欢文"
flavor: "诸君,我喜欢文"
_login600:
title: "老熟人Ⅱ"
description: "累计登录 600 天"
@@ -1820,7 +1877,7 @@ _achievements:
flavor: "感谢您使用 Misskey"
_noteClipped1:
title: "忍不住要收藏到便签"
description: "第一次将贴文贴进便签"
description: "第一次将帖子加入便签"
_noteFavorited1:
title: "观星者"
description: "第一次将帖子加入收藏"
@@ -2026,7 +2083,7 @@ _role:
wordMuteMax: "屏蔽词的字数限制"
webhookMax: "Webhook 创建数量限制"
clipMax: "便签创建数量限制"
noteEachClipsMax: "单个便签内贴文数量限制"
noteEachClipsMax: "便签内贴文的最大数量"
userListMax: "用户列表创建数量限制"
userEachUserListsMax: "单个用户列表内用户数量限制"
rateLimitFactor: "速率限制"
@@ -2112,8 +2169,8 @@ _forgotPassword:
ifNoEmail: "如果您没有设置电子邮件地址,请联系管理员。"
contactAdmin: "该服务器不支持发送电子邮件。如果您想重设密码,请联系管理员。"
_gallery:
my: "我的相册"
liked: "喜欢的相册"
my: "我的图集"
liked: "喜欢的图集"
like: "喜欢!"
unlike: "取消喜欢"
_email:
@@ -2174,7 +2231,7 @@ _instanceTicker:
_serverDisconnectedBehavior:
reload: "自动重载"
dialog: "对话框警告"
quiet: "静警告"
quiet: "静警告"
_channel:
create: "创建频道"
edit: "编辑频道"
@@ -2366,10 +2423,10 @@ _permissions:
"write:user-groups": "编辑用户组"
"read:channels": "查看频道"
"write:channels": "管理频道"
"read:gallery": "浏览相册"
"write:gallery": "编辑相册"
"read:gallery-likes": "浏览喜欢的相册"
"write:gallery-likes": "管理喜欢的相册"
"read:gallery": "浏览图集"
"write:gallery": "编辑图集"
"read:gallery-likes": "浏览喜欢的图集"
"write:gallery-likes": "管理喜欢的图集"
"read:flash": "查看 Play"
"write:flash": "编辑 Play"
"read:flash-likes": "查看 Play 的点赞"
@@ -2493,7 +2550,7 @@ _poll:
noOnlyOneChoice: "需要至少两个选项"
choiceN: "选项{n}"
noMore: "无法再添加更多了"
canMultipleVote: "允许选择多个选项"
canMultipleVote: "允许选"
expiration: "截止时间"
infinite: "永久"
at: "指定日期"
@@ -2502,13 +2559,13 @@ _poll:
deadlineTime: "时间"
duration: "期限"
votesCount: "{n}票"
totalVotes: "总票数 {n}"
totalVotes: "总{n}"
vote: "投票"
showResult: "显示结果"
showResult: "查看结果"
voted: "已投票"
closed: "已截止"
remainingDays: "{d}天{h}小时后截止"
remainingHours: "{h} 小时 {m} 分后截止"
remainingHours: "{h}小时{m}分后截止"
remainingMinutes: "{m}分{s}秒后截止"
remainingSeconds: "{s}秒后截止"
_visibility:
@@ -2528,6 +2585,20 @@ _postForm:
replyPlaceholder: "回复这个帖子..."
quotePlaceholder: "引用这个帖子..."
channelPlaceholder: "发布到频道…"
showHowToUse: "显示窗口说明"
_howToUse:
content_title: "正文"
content_description: "在此输入要发布的内容。"
toolbar_title: "工具栏"
toolbar_description: "可在此添加文件和投票、设置注释和话题标签、插入表情符号和提及等。"
account_title: "账号菜单"
account_description: "可在此切换发帖用的账号、查看账户下保存的草稿及定时发送帖。"
visibility_title: "可见性"
visibility_description: "可在此设置帖子的公开范围。"
menu_title: "菜单"
menu_description: "可在此进行保存草稿、设置定时发帖、设置回应等其它操作。"
submit_title: "发帖按钮"
submit_description: "发布帖子。也可用 Ctrl + Enter / Cmd + Enter 来发帖。"
_placeholders:
a: "现在怎么样?"
b: "想好发些什么了吗?"
@@ -2678,7 +2749,7 @@ _notification:
newNote: "新的帖子"
unreadAntennaNote: "天线 {name}"
roleAssigned: "授予的角色"
chatRoomInvitationReceived: "受邀加入聊天室"
chatRoomInvitationReceived: "您已被邀请加入群聊"
emptyPushNotificationMessage: "推送通知已更新"
achievementEarned: "获得成就"
testNotification: "测试通知"
@@ -2709,7 +2780,7 @@ _notification:
receiveFollowRequest: "收到关注请求"
followRequestAccepted: "关注请求已通过"
roleAssigned: "授予的角色"
chatRoomInvitationReceived: "受邀加入聊天室"
chatRoomInvitationReceived: "您已被邀请加入群聊"
achievementEarned: "取得的成就"
exportCompleted: "已完成导出"
login: "登录"
@@ -2776,7 +2847,7 @@ _webhookSettings:
_events:
follow: "关注时"
followed: "被关注时"
note: "发布文时"
note: "发布文时"
reply: "收到回复时"
renote: "被转发时"
reaction: "被回应时"
@@ -2805,6 +2876,8 @@ _abuseReport:
notifiedWebhook: "使用的 webhook"
deleteConfirm: "要删除通知吗?"
_moderationLogTypes:
clearQueue: "清除队列"
promoteQueue: "重新执行队列中的任务"
createRole: "创建角色"
deleteRole: "删除角色"
updateRole: "更新角色"
@@ -2849,11 +2922,11 @@ _moderationLogTypes:
createAbuseReportNotificationRecipient: "新建了举报通知"
updateAbuseReportNotificationRecipient: "更新了举报通知"
deleteAbuseReportNotificationRecipient: "删除了举报通知"
deleteAccount: "删除了账户"
deletePage: "删除页面"
deleteFlash: "删除 Play"
deleteGalleryPost: "删除相册内容"
deleteChatRoom: "删除聊天室"
deleteAccount: "删除户"
deletePage: "删除页面"
deleteFlash: "删除 Play"
deleteGalleryPost: "删除图集内容"
deleteChatRoom: "删除聊"
updateProxyAccountDescription: "更新代理账户的简介"
_fileViewer:
title: "文件信息"
@@ -3072,8 +3145,8 @@ _selfXssPrevention:
description2: "如果不能完全理解将要粘贴的内容,%c 请立即停止操作并关闭这个窗口。"
description3: "详情请看这里。{link}"
_followRequest:
recieved: "收到申请"
sent: "已发送申请"
recieved: "收到的请求"
sent: "已发送的请求"
_remoteLookupErrors:
_federationNotAllowed:
title: "无法与此服务器通信"
@@ -3126,7 +3199,7 @@ _search:
serverHostPlaceholder: "如:misskey.example.com"
_serverSetupWizard:
installCompleted: "Misskey 安装完成!"
firstCreateAccount: "首先创建管理员账号吧。"
firstCreateAccount: "首先创建一个管理员帐户。"
accountCreated: "管理员账号已创建!"
serverSetting: "服务器设置"
youCanEasilyConfigureOptimalServerSettingsWithThisWizard: "用此向导来轻松地以最佳方式配置服务器。"
@@ -3136,7 +3209,7 @@ _serverSetupWizard:
single: "单用户服务器"
single_description: "仅供自己使用的单人服务器"
single_youCanCreateMultipleAccounts: "使用单用户服务器模式使用时,也可以根据需要创建多个账号。"
group: "小圈子服务器"
group: "群组服务器"
group_description: "邀请其他可信用户一起使用的多人服务器"
open: "开放服务器"
open_description: "以容纳不限定数量的用户的模式运行"
@@ -3173,7 +3246,7 @@ _uploader:
compressedToX: "压缩 {x}"
savedXPercent: "节省了 {x}% 的空间"
abortConfirm: "还有未上传的文件,要中止吗?"
doneConfirm: "还有未上传的文件,要完成吗"
doneConfirm: "部分文件尚未上传,是否继续"
maxFileSizeIsX: "可上传最大 {x} 的文件。"
allowedTypes: "可上传的文件类型"
tip: "文件还没有被上传。可在此对话框中进行上传前确认、重命名、压缩、裁剪等操作。准备完成后,点击「上传」即可开始上传。"
@@ -3193,12 +3266,13 @@ watermark: "水印"
defaultPreset: "默认预设"
_watermarkEditor:
tip: "可在图像内增加包含作者等信息的水印。"
quitWithoutSaveConfirm: "不保存就退出吗"
quitWithoutSaveConfirm: "放弃未保存的更改"
driveFileTypeWarn: "不支持此文件"
driveFileTypeWarnDescription: "请选择图像文件"
title: "编辑水印"
cover: "覆盖全体"
repeat: "平铺"
preserveBoundingRect: "调整为旋转时不超出范围"
opacity: "不透明度"
scale: "大小"
text: "文本"
@@ -3220,11 +3294,13 @@ _watermarkEditor:
polkadotSubDotRadius: "副波点的大小"
polkadotSubDotDivisions: "副波点的数量"
leaveBlankToAccountUrl: "留空则为账户 URL"
failedToLoadImage: "图片加载失败"
_imageEffector:
title: "效果"
addEffect: "添加效果"
discardChangesConfirm: "丢弃当前设置并退出?"
nothingToConfigure: "还没有设置"
failedToLoadImage: "图片加载失败"
_fxs:
chromaticAberration: "色差"
glitch: "故障"
+79 -3
View File
@@ -83,6 +83,8 @@ files: "檔案"
download: "下載"
driveFileDeleteConfirm: "確定要刪除檔案「{name}」嗎?使用此檔案的貼文也會跟著被刪除。"
unfollowConfirm: "確定要取消追隨{name}嗎?"
cancelFollowRequestConfirm: "要取消向 {name} 送出的追隨申請嗎?"
rejectFollowRequestConfirm: "要拒絕來自 {name} 的追隨申請嗎?"
exportRequested: "已請求匯出。這可能會花一點時間。匯出的檔案將會被放到雲端硬碟裡。"
importRequested: "已請求匯入。這可能會花一點時間。"
lists: "清單"
@@ -172,7 +174,7 @@ emojiUrl: "表情符號 URL"
addEmoji: "新增表情符號"
settingGuide: "推薦設定"
cacheRemoteFiles: "快取遠端檔案"
cacheRemoteFilesDescription: "啟用設定後,遠端檔案會被快取在本伺服器的儲存空間中。雖然顯示圖片會變快,但會消耗較多伺服器的儲存空間。至於要快取遠端使用者到什麼程度,是依照角色的雲端硬碟容量而定。當超過這個限制時,從較舊的檔案開始自快取中刪除並改連結。關閉這個設定,遠端檔案一開始就維持連結的方式,但建議將 default.yml 的 proxyRemoteFiles 設為 true,以便產生圖片的縮圖並保護使用者的隱私。"
cacheRemoteFilesDescription: "啟用這個設定後,遠端檔案會被快取到這台伺服器的儲存空間中。這樣能加快圖片的顯示速度,但會多占用伺服器的儲存容量。遠端使用者能保留多少快取,取決於其角色所設定的硬碟容量上限。若超過這個上限,系統會從最舊的檔案開始刪除快取並改連結。若停用這個設定,遠端檔案一開始就只會以連結的形式保留。"
youCanCleanRemoteFilesCache: "按檔案管理的🗑️按鈕,可將快取全部刪除。"
cacheRemoteSensitiveFiles: "快取遠端的敏感檔案"
cacheRemoteSensitiveFilesDescription: "若停用這個設定,則不會快取遠端的敏感檔案,而是直接連結。"
@@ -302,6 +304,7 @@ uploadFromUrlMayTakeTime: "還需要一些時間才能完成上傳。"
uploadNFiles: "上傳了 {n} 個檔案"
explore: "探索"
messageRead: "已讀"
readAllChatMessages: "將所有訊息標記為已讀"
noMoreHistory: "沒有更多歷史紀錄"
startChat: "開始聊天"
nUsersRead: "{n} 人已讀"
@@ -775,6 +778,7 @@ lockedAccountInfo: "即使追隨需要核准,除非你將貼文的可見性設
alwaysMarkSensitive: "預設標記檔案為敏感內容"
loadRawImages: "以原始圖檔顯示附件圖檔的縮圖"
disableShowingAnimatedImages: "不播放動態圖檔"
disableShowingAnimatedImages_caption: "無論這個設定如何,如果動畫圖片無法播放,可能是因為瀏覽器或作業系統的無障礙設定、省電設定等產生了干擾。"
highlightSensitiveMedia: "強調敏感標記"
verificationEmailSent: "已發送驗證電子郵件。請點擊進入電子郵件中的連結以完成驗證。"
notSet: "未設定"
@@ -1021,6 +1025,9 @@ pushNotificationAlreadySubscribed: "推播通知啟用中"
pushNotificationNotSupported: "瀏覽器或伺服器不支援推播通知"
sendPushNotificationReadMessage: "如果已閱讀通知與訊息,就刪除推播通知"
sendPushNotificationReadMessageCaption: "可能會導致裝置的電池消耗量增加。"
pleaseAllowPushNotification: "請允許瀏覽器的通知設定"
browserPushNotificationDisabled: "取得通知發送權限失敗"
browserPushNotificationDisabledDescription: "您沒有權限從 {serverName} 發送通知。請在瀏覽器設定中允許通知,然後再試一次。"
windowMaximize: "最大化"
windowMinimize: "最小化"
windowRestore: "復原"
@@ -1171,6 +1178,7 @@ installed: "已安裝"
branding: "品牌宣傳"
enableServerMachineStats: "公佈伺服器的機器資訊"
enableIdenticonGeneration: "啟用生成使用者的 Identicon "
showRoleBadgesOfRemoteUsers: "顯示授予遠端使用者的角色徽章"
turnOffToImprovePerformance: "關閉時會提高性能。"
createInviteCode: "建立邀請碼"
createWithOptions: "使用選項建立"
@@ -1394,6 +1402,50 @@ scheduled: "排定"
widgets: "小工具"
deviceInfo: "硬體資訊"
deviceInfoDescription: "在提出技術性諮詢時,若能同時提供以下資訊,將有助於解決問題。"
youAreAdmin: "您是管理員"
frame: "邊框"
presets: "預設值"
zeroPadding: "補零"
_imageEditing:
_vars:
caption: "檔案標題"
filename: "檔案名稱"
filename_without_ext: "無副檔名的檔案名稱"
year: "拍攝年份"
month: "拍攝月份"
day: "拍攝日期"
hour: "拍攝時間(小時)"
minute: "拍攝時間(分鐘)"
second: "拍攝時間(秒)"
camera_model: "相機名稱"
camera_lens_model: "鏡頭型號"
camera_mm: "焦距"
camera_mm_35: "焦距(換算為 35mm 底片等效焦距)"
camera_f: "光圈"
camera_s: "快門速度"
camera_iso: "ISO 感光度"
gps_lat: "緯度"
gps_long: "經度"
_imageFrameEditor:
title: "編輯邊框"
tip: "可以在圖片上添加包含邊框或 EXIF 的標籤來裝飾圖片。"
header: "標題"
footer: "頁尾"
borderThickness: "邊框寬度"
labelThickness: "標籤寬度"
labelScale: "標籤縮放比例"
centered: "置中對齊"
captionMain: "標題文字(大)"
captionSub: "標題文字(小)"
availableVariables: "可使用的變數"
withQrCode: "二維條碼"
backgroundColor: "背景顏色"
textColor: "文字顏色"
font: "字型"
fontSerif: "襯線體"
fontSansSerif: "無襯線體"
quitWithoutSaveConfirm: "不儲存就退出嗎?"
failedToLoadImage: "圖片載入失敗"
_compression:
_quality:
high: "高品質"
@@ -1496,6 +1548,8 @@ _settings:
showUrlPreview: "顯示網址預覽"
showAvailableReactionsFirstInNote: "將可用的反應顯示在頂部"
showPageTabBarBottom: "在底部顯示頁面的標籤列"
emojiPaletteBanner: "可以將固定顯示在表情符號選擇器的預設項目註冊為調色盤,或者自訂選擇器的顯示方式。"
enableAnimatedImages: "啟用動畫圖片"
_chat:
showSenderName: "顯示發送者的名稱"
sendOnEnter: "按下 Enter 發送訊息"
@@ -1504,6 +1558,8 @@ _preferencesProfile:
profileNameDescription: "設定一個名稱來識別此裝置。"
profileNameDescription2: "例如:「主要個人電腦」、「智慧型手機」等"
manageProfiles: "管理個人檔案"
shareSameProfileBetweenDevicesIsNotRecommended: "不建議在多個裝置上共用同一個設定檔。"
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "如果您希望在多個裝置之間同步某些設定項目,請分別啟用「跨裝置同步」選項。"
_preferencesBackup:
autoBackup: "自動備份"
restoreFromBackup: "從備份還原"
@@ -1513,6 +1569,7 @@ _preferencesBackup:
youNeedToNameYourProfileToEnableAutoBackup: "要啟用自動備份,必須設定檔案名稱。"
autoPreferencesBackupIsNotEnabledForThisDevice: "此裝置未啟用自動備份設定。"
backupFound: "找到設定的備份"
forceBackup: "強制備份設定"
_accountSettings:
requireSigninToViewContents: "須登入以顯示內容"
requireSigninToViewContentsDescription1: "必須登入才會顯示您建立的貼文等內容。可望有效防止資訊被爬蟲蒐集。"
@@ -2528,6 +2585,20 @@ _postForm:
replyPlaceholder: "回覆此貼文..."
quotePlaceholder: "引用此貼文..."
channelPlaceholder: "發佈到頻道"
showHowToUse: "顯示表單說明"
_howToUse:
content_title: "內文"
content_description: "請輸入要發布的內容。"
toolbar_title: "工具列"
toolbar_description: "可以附加檔案或票選活動、設定註解與標籤、插入表情符號或提及等。"
account_title: "帳號選單"
account_description: "可以切換要發布的帳號,並查看該帳號所儲存的草稿與預約發布列表。"
visibility_title: "可見性"
visibility_description: "可以設定貼文的公開範圍。"
menu_title: "選單"
menu_description: "可以進行其他操作,例如儲存為草稿、預約發佈貼文、或設定反應等。\n"
submit_title: "貼文按鈕"
submit_description: "發布貼文。也可以使用 Ctrl + Enter 或 Cmd + Enter 來發布。"
_placeholders:
a: "今天過得如何?"
b: "有什麼新鮮事嗎?"
@@ -2637,7 +2708,7 @@ _pages:
hideTitleWhenPinned: "被置頂於個人資料時隱藏頁面標題"
font: "字型"
fontSerif: "襯線體"
fontSansSerif: "體"
fontSansSerif: "無襯線體"
eyeCatchingImageSet: "設定封面影像"
eyeCatchingImageRemove: "刪除封面影像"
chooseBlock: "新增方塊"
@@ -2805,6 +2876,8 @@ _abuseReport:
notifiedWebhook: "使用的 Webhook"
deleteConfirm: "確定要刪除通知對象嗎?"
_moderationLogTypes:
clearQueue: "清除佇列"
promoteQueue: "重新嘗試排程中的工作"
createRole: "新增角色"
deleteRole: "刪除角色 "
updateRole: "更新角色設定"
@@ -3175,7 +3248,7 @@ _uploader:
abortConfirm: "有些檔案尚未上傳,您要中止嗎?"
doneConfirm: "有些檔案尚未上傳,是否要完成上傳?"
maxFileSizeIsX: "可上傳的最大檔案大小為 {x}。"
allowedTypes: "可上傳的檔案類型"
allowedTypes: "可上傳的檔案類型"
tip: "檔案尚未上傳。您可以在此對話框中進行上傳前的確認、重新命名、壓縮、裁切等操作。準備完成後,請點選「上傳」按鈕開始上傳。\n"
_clientPerformanceIssueTip:
title: "如果覺得電池消耗過快的話"
@@ -3199,6 +3272,7 @@ _watermarkEditor:
title: "編輯浮水印"
cover: "覆蓋整體"
repeat: "佈局"
preserveBoundingRect: "調整使其在旋轉時不會突出"
opacity: "透明度"
scale: "大小"
text: "文字"
@@ -3220,11 +3294,13 @@ _watermarkEditor:
polkadotSubDotRadius: "子圓點的尺寸"
polkadotSubDotDivisions: "子圓點的數量"
leaveBlankToAccountUrl: "若留空則使用帳戶的 URL"
failedToLoadImage: "圖片載入失敗"
_imageEffector:
title: "特效"
addEffect: "新增特效"
discardChangesConfirm: "捨棄更改並退出嗎?"
nothingToConfigure: "無可設定的項目"
failedToLoadImage: "圖片載入失敗"
_fxs:
chromaticAberration: "色差"
glitch: "異常雜訊效果"
+25 -22
View File
@@ -1,12 +1,12 @@
{
"name": "misskey",
"version": "2025.10.0-rc.0",
"version": "2025.11.1-beta.3",
"codename": "nasubi",
"repository": {
"type": "git",
"url": "https://github.com/misskey-dev/misskey.git"
},
"packageManager": "pnpm@10.17.1",
"packageManager": "pnpm@10.22.0",
"workspaces": [
"packages/frontend-shared",
"packages/frontend",
@@ -26,6 +26,7 @@
"build-storybook": "pnpm --filter frontend build-storybook",
"build-misskey-js-with-types": "pnpm build-pre && pnpm --filter backend... --filter=!misskey-js build && pnpm --filter backend generate-api-json --no-build && ncp packages/backend/built/api.json packages/misskey-js/generator/api.json && pnpm --filter misskey-js update-autogen-code && pnpm --filter misskey-js build && pnpm --filter misskey-js api",
"start": "pnpm check:connect && cd packages/backend && node ./built/boot/entry.js",
"start:inspect": "cd packages/backend && node --inspect ./built/boot/entry.js",
"start:test": "ncp ./.github/misskey/test.yml ./.config/test.yml && cd packages/backend && cross-env NODE_ENV=test node ./built/boot/entry.js",
"cli": "cd packages/backend && pnpm cli",
"init": "pnpm migrate",
@@ -53,30 +54,31 @@
"lodash": "4.17.21"
},
"dependencies": {
"cssnano": "7.1.1",
"esbuild": "0.25.10",
"cssnano": "7.1.2",
"esbuild": "0.27.0",
"execa": "9.6.0",
"fast-glob": "3.3.3",
"glob": "11.0.3",
"ignore-walk": "7.0.0",
"js-yaml": "4.1.0",
"glob": "11.1.0",
"ignore-walk": "8.0.0",
"js-yaml": "4.1.1",
"postcss": "8.5.6",
"tar": "7.5.1",
"terser": "5.44.0",
"typescript": "5.9.2"
"tar": "7.5.2",
"terser": "5.44.1",
"typescript": "5.9.3"
},
"devDependencies": {
"@misskey-dev/eslint-plugin": "2.1.0",
"@eslint/js": "9.39.1",
"@misskey-dev/eslint-plugin": "2.2.0",
"@types/js-yaml": "4.0.9",
"@types/node": "22.18.6",
"@typescript-eslint/eslint-plugin": "8.44.1",
"@typescript-eslint/parser": "8.44.1",
"cross-env": "7.0.3",
"cypress": "14.5.4",
"eslint": "9.36.0",
"globals": "16.4.0",
"@types/node": "24.10.1",
"@typescript-eslint/eslint-plugin": "8.47.0",
"@typescript-eslint/parser": "8.47.0",
"cross-env": "10.1.0",
"cypress": "15.6.0",
"eslint": "9.39.1",
"globals": "16.5.0",
"ncp": "2.0.0",
"pnpm": "10.17.1",
"pnpm": "10.22.0",
"start-server-and-test": "2.1.2"
},
"optionalDependencies": {
@@ -86,8 +88,9 @@
"overrides": {
"@aiscript-dev/aiscript-languageserver": "-"
},
"patchedDependencies": {
"typeorm": "patches/typeorm.patch"
}
"ignoredBuiltDependencies": [
"@sentry-internal/node-cpu-profiler",
"exifreader"
]
}
}
+1
View File
@@ -7,6 +7,7 @@ const base = require('./jest.config.cjs')
module.exports = {
...base,
globalSetup: "<rootDir>/test/jest.setup.unit.cjs",
testMatch: [
"<rootDir>/test/unit/**/*.ts",
"<rootDir>/src/**/*.test.ts",
+1 -1
View File
@@ -10,7 +10,7 @@ const __dirname = path.dirname(__filename);
const args = [];
args.push(...[
...semver.satisfies(process.version, '^20.17.0 || ^22.0.0') ? ['--no-experimental-require-module'] : [],
...semver.satisfies(process.version, '^20.17.0 || ^22.0.0 || ^24.10.0') ? ['--no-experimental-require-module'] : [],
'--experimental-vm-modules',
'--experimental-import-meta-resolve',
path.join(__dirname, 'node_modules/jest/bin/jest.js'),
@@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class RoleBadgesRemoteUsers1760607435831 {
name = 'RoleBadgesRemoteUsers1760607435831'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "showRoleBadgesOfRemoteUsers" boolean NOT NULL DEFAULT false`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "showRoleBadgesOfRemoteUsers"`);
}
}
@@ -0,0 +1,26 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class UnnecessaryNullDefault1760790899857 {
name = 'UnnecessaryNullDefault1760790899857'
/**
* @param {QueryRunner} queryRunner
*/
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "abuse_report_notification_recipient" ALTER COLUMN "userId" DROP DEFAULT`);
await queryRunner.query(`ALTER TABLE "abuse_report_notification_recipient" ALTER COLUMN "systemWebhookId" DROP DEFAULT`);
await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "urlPreviewUserAgent" DROP DEFAULT`);
}
/**
* @param {QueryRunner} queryRunner
*/
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "urlPreviewUserAgent" SET DEFAULT NULL`);
await queryRunner.query(`ALTER TABLE "abuse_report_notification_recipient" ALTER COLUMN "systemWebhookId" SET DEFAULT NULL`);
await queryRunner.query(`ALTER TABLE "abuse_report_notification_recipient" ALTER COLUMN "userId" SET DEFAULT NULL`);
}
}
@@ -0,0 +1,38 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class AddChannelMuting1761569941833 {
name = 'AddChannelMuting1761569941833'
/**
* @param {QueryRunner} queryRunner
*/
async up(queryRunner) {
await queryRunner.query(`CREATE TABLE "channel_muting" ("id" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, "channelId" character varying(32) NOT NULL, "expiresAt" TIMESTAMP WITH TIME ZONE, CONSTRAINT "PK_aec842e98f332ebd8e12f85bad6" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_34415e3062ae7a94617496e81c" ON "channel_muting" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_4d534d7177fc59879d942e96d0" ON "channel_muting" ("channelId") `);
await queryRunner.query(`CREATE INDEX "IDX_6dd314e96806b7df65ddadff72" ON "channel_muting" ("expiresAt") `);
await queryRunner.query(`CREATE INDEX "IDX_b96870ed326ccc7fa243970965" ON "channel_muting" ("userId", "channelId") `);
await queryRunner.query(`ALTER TABLE "note" ADD "renoteChannelId" character varying(32)`);
await queryRunner.query(`COMMENT ON COLUMN "note"."renoteChannelId" IS '[Denormalized]'`);
await queryRunner.query(`ALTER TABLE "channel_muting" ADD CONSTRAINT "FK_34415e3062ae7a94617496e81c5" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "channel_muting" ADD CONSTRAINT "FK_4d534d7177fc59879d942e96d03" FOREIGN KEY ("channelId") REFERENCES "channel"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
}
/**
* @param {QueryRunner} queryRunner
*/
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "channel_muting" DROP CONSTRAINT "FK_4d534d7177fc59879d942e96d03"`);
await queryRunner.query(`ALTER TABLE "channel_muting" DROP CONSTRAINT "FK_34415e3062ae7a94617496e81c5"`);
await queryRunner.query(`COMMENT ON COLUMN "note"."renoteChannelId" IS '[Denormalized]'`);
await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "renoteChannelId"`);
await queryRunner.query(`DROP INDEX "public"."IDX_b96870ed326ccc7fa243970965"`);
await queryRunner.query(`DROP INDEX "public"."IDX_6dd314e96806b7df65ddadff72"`);
await queryRunner.query(`DROP INDEX "public"."IDX_4d534d7177fc59879d942e96d0"`);
await queryRunner.query(`DROP INDEX "public"."IDX_34415e3062ae7a94617496e81c"`);
await queryRunner.query(`DROP TABLE "channel_muting"`);
}
}
+51 -51
View File
@@ -4,10 +4,11 @@
"private": true,
"type": "module",
"engines": {
"node": "^22.15.0"
"node": "^22.15.0 || ^24.10.0"
},
"scripts": {
"start": "node ./built/boot/entry.js",
"start:inspect": "node --inspect ./built/boot/entry.js",
"start:test": "cross-env NODE_ENV=test node ./built/boot/entry.js",
"migrate": "pnpm typeorm migration:run -d ormconfig.js",
"revert": "pnpm typeorm migration:revert -d ormconfig.js",
@@ -39,17 +40,17 @@
},
"optionalDependencies": {
"@swc/core-android-arm64": "1.3.11",
"@swc/core-darwin-arm64": "1.13.19",
"@swc/core-darwin-x64": "1.13.19",
"@swc/core-darwin-arm64": "1.15.2",
"@swc/core-darwin-x64": "1.15.2",
"@swc/core-freebsd-x64": "1.3.11",
"@swc/core-linux-arm-gnueabihf": "1.13.19",
"@swc/core-linux-arm64-gnu": "1.13.19",
"@swc/core-linux-arm64-musl": "1.13.19",
"@swc/core-linux-x64-gnu": "1.13.19",
"@swc/core-linux-x64-musl": "1.13.19",
"@swc/core-win32-arm64-msvc": "1.13.19",
"@swc/core-win32-ia32-msvc": "1.13.19",
"@swc/core-win32-x64-msvc": "1.13.19",
"@swc/core-linux-arm-gnueabihf": "1.15.2",
"@swc/core-linux-arm64-gnu": "1.15.2",
"@swc/core-linux-arm64-musl": "1.15.2",
"@swc/core-linux-x64-gnu": "1.15.2",
"@swc/core-linux-x64-musl": "1.15.2",
"@swc/core-win32-arm64-msvc": "1.15.2",
"@swc/core-win32-ia32-msvc": "1.15.2",
"@swc/core-win32-x64-msvc": "1.15.2",
"@tensorflow/tfjs": "4.22.0",
"@tensorflow/tfjs-node": "4.22.0",
"bufferutil": "4.0.9",
@@ -69,31 +70,31 @@
"utf-8-validate": "6.0.5"
},
"dependencies": {
"@aws-sdk/client-s3": "3.896.0",
"@aws-sdk/lib-storage": "3.895.0",
"@aws-sdk/client-s3": "3.936.0",
"@aws-sdk/lib-storage": "3.936.0",
"@discordapp/twemoji": "16.0.1",
"@fastify/accepts": "5.0.2",
"@fastify/accepts": "5.0.3",
"@fastify/cookie": "11.0.2",
"@fastify/cors": "10.1.0",
"@fastify/express": "4.0.2",
"@fastify/http-proxy": "10.0.2",
"@fastify/multipart": "9.2.1",
"@fastify/static": "8.2.0",
"@fastify/multipart": "9.3.0",
"@fastify/static": "8.3.0",
"@fastify/view": "10.0.2",
"@misskey-dev/sharp-read-bmp": "1.2.0",
"@misskey-dev/summaly": "5.2.3",
"@napi-rs/canvas": "0.1.80",
"@nestjs/common": "11.1.6",
"@nestjs/core": "11.1.6",
"@nestjs/testing": "11.1.6",
"@misskey-dev/summaly": "5.2.5",
"@napi-rs/canvas": "0.1.82",
"@nestjs/common": "11.1.9",
"@nestjs/core": "11.1.9",
"@nestjs/testing": "11.1.9",
"@peertube/http-signature": "1.7.0",
"@sentry/node": "8.55.0",
"@sentry/profiling-node": "8.55.0",
"@sentry/node": "10.26.0",
"@sentry/profiling-node": "10.26.0",
"@simplewebauthn/server": "12.0.0",
"@sinonjs/fake-timers": "11.3.1",
"@smithy/node-http-handler": "2.5.0",
"@swc/cli": "0.7.8",
"@swc/core": "1.13.5",
"@swc/cli": "0.7.9",
"@swc/core": "1.15.2",
"@twemoji/parser": "16.0.0",
"@types/redis-info": "3.0.3",
"accepts": "1.3.8",
@@ -103,39 +104,38 @@
"bcryptjs": "2.4.3",
"blurhash": "2.0.5",
"body-parser": "1.20.3",
"bullmq": "5.58.8",
"bullmq": "5.63.2",
"cacheable-lookup": "7.0.0",
"cbor": "9.0.2",
"chalk": "5.6.2",
"chalk-template": "1.1.2",
"chokidar": "4.0.3",
"cli-highlight": "2.1.11",
"color-convert": "2.0.1",
"content-disposition": "0.5.4",
"date-fns": "2.30.0",
"deep-email-validator": "0.1.21",
"fastify": "5.6.1",
"fastify": "5.6.2",
"fastify-raw-body": "5.0.0",
"feed": "4.2.2",
"file-type": "19.6.0",
"file-type": "21.1.1",
"fluent-ffmpeg": "2.1.3",
"form-data": "4.0.4",
"got": "14.4.9",
"happy-dom": "16.8.1",
"form-data": "4.0.5",
"got": "14.6.4",
"happy-dom": "20.0.10",
"hpagent": "1.2.0",
"htmlescape": "1.1.1",
"http-link-header": "1.1.3",
"ioredis": "5.8.0",
"ioredis": "5.8.2",
"ip-cidr": "4.0.2",
"ipaddr.js": "2.2.0",
"is-svg": "5.1.0",
"js-yaml": "4.1.0",
"js-yaml": "4.1.1",
"jsdom": "26.1.0",
"json5": "2.2.3",
"jsonld": "8.3.3",
"jsrsasign": "11.1.0",
"juice": "11.0.1",
"meilisearch": "0.53.0",
"juice": "11.0.3",
"meilisearch": "0.54.0",
"mfm-js": "0.25.0",
"microformats-parser": "2.0.4",
"mime-types": "2.1.35",
@@ -145,7 +145,7 @@
"nanoid": "5.1.6",
"nested-property": "4.0.0",
"node-fetch": "3.3.2",
"nodemailer": "6.10.1",
"nodemailer": "7.0.10",
"nsfwjs": "4.2.0",
"oauth": "0.10.2",
"oauth2orize": "1.12.0",
@@ -161,7 +161,7 @@
"qrcode": "1.5.4",
"random-seed": "0.3.0",
"ratelimiter": "3.4.1",
"re2": "1.22.1",
"re2": "1.22.3",
"redis-info": "3.1.0",
"redis-lock": "0.1.4",
"reflect-metadata": "0.2.2",
@@ -170,18 +170,18 @@
"rxjs": "7.8.2",
"sanitize-html": "2.17.0",
"secure-json-parse": "3.0.2",
"semver": "7.7.3",
"sharp": "0.33.5",
"semver": "7.7.2",
"slacc": "0.0.10",
"strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0",
"systeminformation": "5.27.10",
"systeminformation": "5.27.11",
"tinycolor2": "1.6.0",
"tmp": "0.2.5",
"tsc-alias": "1.8.16",
"tsconfig-paths": "4.2.0",
"typeorm": "0.3.27",
"typescript": "5.9.2",
"typescript": "5.9.3",
"ulid": "2.4.0",
"vary": "1.1.2",
"web-push": "3.6.7",
@@ -191,16 +191,16 @@
"devDependencies": {
"@jest/globals": "29.7.0",
"@nestjs/platform-express": "10.4.20",
"@sentry/vue": "9.46.0",
"@sentry/vue": "10.26.0",
"@simplewebauthn/types": "12.0.0",
"@swc/jest": "0.2.39",
"@types/accepts": "1.3.7",
"@types/archiver": "6.0.3",
"@types/archiver": "6.0.4",
"@types/bcryptjs": "2.4.6",
"@types/body-parser": "1.19.6",
"@types/color-convert": "2.0.4",
"@types/content-disposition": "0.5.9",
"@types/fluent-ffmpeg": "2.1.27",
"@types/fluent-ffmpeg": "2.1.28",
"@types/htmlescape": "1.1.3",
"@types/http-link-header": "1.0.7",
"@types/jest": "29.5.14",
@@ -210,14 +210,14 @@
"@types/jsrsasign": "10.5.15",
"@types/mime-types": "2.1.4",
"@types/ms": "0.7.34",
"@types/node": "22.18.6",
"@types/nodemailer": "6.4.19",
"@types/node": "24.10.1",
"@types/nodemailer": "6.4.21",
"@types/oauth": "0.9.6",
"@types/oauth2orize": "1.11.5",
"@types/oauth2orize-pkce": "0.1.2",
"@types/pg": "8.15.5",
"@types/pg": "8.15.6",
"@types/pug": "2.0.10",
"@types/qrcode": "1.5.5",
"@types/qrcode": "1.5.6",
"@types/random-seed": "0.3.5",
"@types/ratelimiter": "3.4.6",
"@types/rename": "1.0.7",
@@ -231,8 +231,8 @@
"@types/vary": "1.1.3",
"@types/web-push": "3.6.4",
"@types/ws": "8.18.1",
"@typescript-eslint/eslint-plugin": "8.44.1",
"@typescript-eslint/parser": "8.44.1",
"@typescript-eslint/eslint-plugin": "8.47.0",
"@typescript-eslint/parser": "8.47.0",
"aws-sdk-client-mock": "4.1.0",
"cross-env": "7.0.3",
"eslint-plugin-import": "2.32.0",
@@ -240,7 +240,7 @@
"fkill": "9.0.0",
"jest": "29.7.0",
"jest-mock": "29.7.0",
"nodemon": "3.1.10",
"nodemon": "3.1.11",
"pid-port": "1.0.2",
"simple-oauth2": "5.1.0",
"supertest": "7.1.4"
+1 -1
View File
@@ -41,7 +41,7 @@ function greet() {
//#endregion
console.log(' Misskey is an open-source decentralized microblogging platform.');
console.log(chalk.rgb(255, 136, 0)(' If you like Misskey, please donate to support development. https://www.patreon.com/syuilo'));
console.log(chalk.rgb(255, 136, 0)(' If you like Misskey, please consider donating to support dev. https://misskey-hub.net/docs/donate/'));
console.log('');
console.log(chalkTemplate`--- ${os.hostname()} {gray (PID: ${process.pid.toString()})} ---`);
+4 -3
View File
@@ -7,11 +7,11 @@ import * as fs from 'node:fs';
import { fileURLToPath } from 'node:url';
import { dirname } from 'node:path';
import { Injectable } from '@nestjs/common';
import * as nsfw from 'nsfwjs';
import si from 'systeminformation';
import { Mutex } from 'async-mutex';
import fetch from 'node-fetch';
import { bindThis } from '@/decorators.js';
import type { NSFWJS, PredictionType } from 'nsfwjs';
const _filename = fileURLToPath(import.meta.url);
const _dirname = dirname(_filename);
@@ -21,7 +21,7 @@ let isSupportedCpu: undefined | boolean = undefined;
@Injectable()
export class AiService {
private model: nsfw.NSFWJS;
private model: NSFWJS;
private modelLoadMutex: Mutex = new Mutex();
constructor(
@@ -29,7 +29,7 @@ export class AiService {
}
@bindThis
public async detectSensitive(source: string | Buffer): Promise<nsfw.PredictionType[] | null> {
public async detectSensitive(source: string | Buffer): Promise<PredictionType[] | null> {
try {
if (isSupportedCpu === undefined) {
isSupportedCpu = await this.computeIsSupportedCpu();
@@ -44,6 +44,7 @@ export class AiService {
tf.env().global.fetch = fetch;
if (this.model == null) {
const nsfw = await import('nsfwjs');
await this.modelLoadMutex.runExclusive(async () => {
if (this.model == null) {
this.model = await nsfw.load(`file://${_dirname}/../../nsfw-model/`, { size: 299 });
@@ -6,7 +6,7 @@
import { Inject, Injectable, OnModuleInit } from '@nestjs/common';
import Redis from 'ioredis';
import { DI } from '@/di-symbols.js';
import type { ChannelFollowingsRepository } from '@/models/_.js';
import type { ChannelFollowingsRepository, ChannelsRepository, MiUser } from '@/models/_.js';
import { MiChannel } from '@/models/_.js';
import { IdService } from '@/core/IdService.js';
import { GlobalEvents, GlobalEventService } from '@/core/GlobalEventService.js';
@@ -23,6 +23,8 @@ export class ChannelFollowingService implements OnModuleInit {
private redisClient: Redis.Redis,
@Inject(DI.redisForSub)
private redisForSub: Redis.Redis,
@Inject(DI.channelsRepository)
private channelsRepository: ChannelsRepository,
@Inject(DI.channelFollowingsRepository)
private channelFollowingsRepository: ChannelFollowingsRepository,
private idService: IdService,
@@ -45,6 +47,50 @@ export class ChannelFollowingService implements OnModuleInit {
onModuleInit() {
}
/**
* .
* @param params
* @param [opts]
* @param {(boolean|undefined)} [opts.idOnly=false] IDのみを取得するかどうか. ID以外のフィールドに値がセットされなくなりJOINも一切されなくなるので注意.
* @param {(boolean|undefined)} [opts.joinUser=undefined] JOINするかどうか(falseまたは省略時はJOINしない).
* @param {(boolean|undefined)} [opts.joinBannerFile=undefined] JOINするかどうか(falseまたは省略時はJOINしない).
*/
@bindThis
public async list(
params: {
requestUserId: MiUser['id'],
},
opts?: {
idOnly?: boolean;
joinUser?: boolean;
joinBannerFile?: boolean;
},
): Promise<MiChannel[]> {
if (opts?.idOnly) {
const q = this.channelFollowingsRepository.createQueryBuilder('channel_following')
.select('channel_following.followeeId')
.where('channel_following.followerId = :userId', { userId: params.requestUserId });
return q
.getRawMany<{ channel_following_followeeId: string }>()
.then(xs => xs.map(x => ({ id: x.channel_following_followeeId } as MiChannel)));
} else {
const q = this.channelsRepository.createQueryBuilder('channel')
.innerJoin('channel_following', 'channel_following', 'channel_following.followeeId = channel.id')
.where('channel_following.followerId = :userId', { userId: params.requestUserId });
if (opts?.joinUser) {
q.innerJoinAndSelect('channel.user', 'user');
}
if (opts?.joinBannerFile) {
q.leftJoinAndSelect('channel.banner', 'drive_file');
}
return q.getMany();
}
}
@bindThis
public async follow(
requestUser: MiLocalUser,
@@ -0,0 +1,224 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { Inject, Injectable } from '@nestjs/common';
import Redis from 'ioredis';
import { Brackets, In } from 'typeorm';
import { DI } from '@/di-symbols.js';
import type { ChannelMutingRepository, ChannelsRepository, MiChannel, MiChannelMuting, MiUser } from '@/models/_.js';
import { IdService } from '@/core/IdService.js';
import { GlobalEvents, GlobalEventService } from '@/core/GlobalEventService.js';
import { bindThis } from '@/decorators.js';
import { RedisKVCache } from '@/misc/cache.js';
@Injectable()
export class ChannelMutingService {
public mutingChannelsCache: RedisKVCache<Set<string>>;
constructor(
@Inject(DI.redis)
private redisClient: Redis.Redis,
@Inject(DI.redisForSub)
private redisForSub: Redis.Redis,
@Inject(DI.channelsRepository)
private channelsRepository: ChannelsRepository,
@Inject(DI.channelMutingRepository)
private channelMutingRepository: ChannelMutingRepository,
private idService: IdService,
private globalEventService: GlobalEventService,
) {
this.mutingChannelsCache = new RedisKVCache<Set<string>>(this.redisClient, 'channelMutingChannels', {
lifetime: 1000 * 60 * 30, // 30m
memoryCacheLifetime: 1000 * 60, // 1m
fetcher: (userId) => this.channelMutingRepository.find({
where: { userId: userId },
select: ['channelId'],
}).then(xs => new Set(xs.map(x => x.channelId))),
toRedisConverter: (value) => JSON.stringify(Array.from(value)),
fromRedisConverter: (value) => new Set(JSON.parse(value)),
});
this.redisForSub.on('message', this.onMessage);
}
/**
* .
* @param params
* @param [opts]
* @param {(boolean|undefined)} [opts.idOnly=false] IDのみを取得するかどうか. ID以外のフィールドに値がセットされなくなりJOINも一切されなくなるので注意.
* @param {(boolean|undefined)} [opts.joinUser=undefined] JOINするかどうか(falseまたは省略時はJOINしない).
* @param {(boolean|undefined)} [opts.joinBannerFile=undefined] JOINするかどうか(falseまたは省略時はJOINしない).
*/
@bindThis
public async list(
params: {
requestUserId: MiUser['id'],
},
opts?: {
idOnly?: boolean;
joinUser?: boolean;
joinBannerFile?: boolean;
},
): Promise<MiChannel[]> {
if (opts?.idOnly) {
const q = this.channelMutingRepository.createQueryBuilder('channel_muting')
.select('channel_muting.channelId')
.where('channel_muting.userId = :userId', { userId: params.requestUserId })
.andWhere(new Brackets(qb => {
qb.where('channel_muting.expiresAt IS NULL')
.orWhere('channel_muting.expiresAt > :now', { now: new Date() });
}));
return q
.getRawMany<{ channel_muting_channelId: string }>()
.then(xs => xs.map(x => ({ id: x.channel_muting_channelId } as MiChannel)));
} else {
const q = this.channelsRepository.createQueryBuilder('channel')
.innerJoin('channel_muting', 'channel_muting', 'channel_muting.channelId = channel.id')
.where('channel_muting.userId = :userId', { userId: params.requestUserId })
.andWhere(new Brackets(qb => {
qb.where('channel_muting.expiresAt IS NULL')
.orWhere('channel_muting.expiresAt > :now', { now: new Date() });
}));
if (opts?.joinUser) {
q.innerJoinAndSelect('channel.user', 'user');
}
if (opts?.joinBannerFile) {
q.leftJoinAndSelect('channel.banner', 'drive_file');
}
return q.getMany();
}
}
/**
* .
*
* @param [opts]
* @param {(boolean|undefined)} [opts.joinUser=undefined] JOINするかどうか(falseまたは省略時はJOINしない).
* @param {(boolean|undefined)} [opts.joinChannel=undefined] JOINするかどうか(falseまたは省略時はJOINしない).
*/
public async findExpiredMutings(opts?: {
joinUser?: boolean;
joinChannel?: boolean;
}): Promise<MiChannelMuting[]> {
const now = new Date();
const q = this.channelMutingRepository.createQueryBuilder('channel_muting')
.where('channel_muting.expiresAt < :now', { now });
if (opts?.joinUser) {
q.innerJoinAndSelect('channel_muting.user', 'user');
}
if (opts?.joinChannel) {
q.leftJoinAndSelect('channel_muting.channel', 'channel');
}
return q.getMany();
}
/**
* .
* @param params
* @param params.requestUserId
*/
@bindThis
public async isMuted(params: {
requestUserId: MiUser['id'],
targetChannelId: MiChannel['id'],
}): Promise<boolean> {
const mutedChannels = await this.mutingChannelsCache.get(params.requestUserId);
return (mutedChannels?.has(params.targetChannelId) ?? false);
}
/**
* .
* @param params
* @param {(Date|null|undefined)} [params.expiresAt] . nullまたは省略時は無期限.
*/
@bindThis
public async mute(params: {
requestUserId: MiUser['id'],
targetChannelId: MiChannel['id'],
expiresAt?: Date | null,
}): Promise<void> {
await this.channelMutingRepository.insert({
id: this.idService.gen(),
userId: params.requestUserId,
channelId: params.targetChannelId,
expiresAt: params.expiresAt,
});
this.globalEventService.publishInternalEvent('muteChannel', {
userId: params.requestUserId,
channelId: params.targetChannelId,
});
}
/**
* .
* @param params
*/
@bindThis
public async unmute(params: {
requestUserId: MiUser['id'],
targetChannelId: MiChannel['id'],
}): Promise<void> {
await this.channelMutingRepository.delete({
userId: params.requestUserId,
channelId: params.targetChannelId,
});
this.globalEventService.publishInternalEvent('unmuteChannel', {
userId: params.requestUserId,
channelId: params.targetChannelId,
});
}
/**
* .
*/
@bindThis
public async eraseExpiredMutings(): Promise<void> {
const expiredMutings = await this.findExpiredMutings();
await this.channelMutingRepository.delete({ id: In(expiredMutings.map(x => x.id)) });
const userIds = [...new Set(expiredMutings.map(x => x.userId))];
for (const userId of userIds) {
this.mutingChannelsCache.refresh(userId).then();
}
}
@bindThis
private async onMessage(_: string, data: string): Promise<void> {
const obj = JSON.parse(data);
if (obj.channel === 'internal') {
const { type, body } = obj.message as GlobalEvents['internal']['payload'];
switch (type) {
case 'muteChannel': {
this.mutingChannelsCache.refresh(body.userId).then();
break;
}
case 'unmuteChannel': {
this.mutingChannelsCache.delete(body.userId).then();
break;
}
}
}
}
@bindThis
public dispose(): void {
this.mutingChannelsCache.dispose();
}
@bindThis
public onApplicationShutdown(signal?: string | undefined): void {
this.dispose();
}
}
+6
View File
@@ -15,6 +15,7 @@ import { SystemWebhookService } from '@/core/SystemWebhookService.js';
import { UserSearchService } from '@/core/UserSearchService.js';
import { WebhookTestService } from '@/core/WebhookTestService.js';
import { FlashService } from '@/core/FlashService.js';
import { ChannelMutingService } from '@/core/ChannelMutingService.js';
import { AccountMoveService } from './AccountMoveService.js';
import { AccountUpdateService } from './AccountUpdateService.js';
import { AiService } from './AiService.js';
@@ -225,6 +226,7 @@ const $FeaturedService: Provider = { provide: 'FeaturedService', useExisting: Fe
const $FanoutTimelineService: Provider = { provide: 'FanoutTimelineService', useExisting: FanoutTimelineService };
const $FanoutTimelineEndpointService: Provider = { provide: 'FanoutTimelineEndpointService', useExisting: FanoutTimelineEndpointService };
const $ChannelFollowingService: Provider = { provide: 'ChannelFollowingService', useExisting: ChannelFollowingService };
const $ChannelMutingService: Provider = { provide: 'ChannelMutingService', useExisting: ChannelMutingService };
const $ChatService: Provider = { provide: 'ChatService', useExisting: ChatService };
const $RegistryApiService: Provider = { provide: 'RegistryApiService', useExisting: RegistryApiService };
const $ReversiService: Provider = { provide: 'ReversiService', useExisting: ReversiService };
@@ -378,6 +380,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
FanoutTimelineService,
FanoutTimelineEndpointService,
ChannelFollowingService,
ChannelMutingService,
ChatService,
RegistryApiService,
ReversiService,
@@ -527,6 +530,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$FanoutTimelineService,
$FanoutTimelineEndpointService,
$ChannelFollowingService,
$ChannelMutingService,
$ChatService,
$RegistryApiService,
$ReversiService,
@@ -677,6 +681,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
FanoutTimelineService,
FanoutTimelineEndpointService,
ChannelFollowingService,
ChannelMutingService,
ChatService,
RegistryApiService,
ReversiService,
@@ -824,6 +829,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$FanoutTimelineService,
$FanoutTimelineEndpointService,
$ChannelFollowingService,
$ChannelMutingService,
$ChatService,
$RegistryApiService,
$ReversiService,
+31 -28
View File
@@ -517,40 +517,43 @@ export class DriveService {
this.registerLogger.debug(`ADD DRIVE FILE: user ${user?.id ?? 'not set'}, name ${detectedName}, tmp ${path}`);
//#region Check drive usage and mime type
if (user && !isLink) {
if (user != null && !isLink) {
const isLocalUser = this.userEntityService.isLocalUser(user);
const policies = await this.roleService.getUserPolicies(user.id);
const isModerator = isLocalUser ? await this.roleService.isModerator(user) : false;
if (!isModerator) {
const policies = await this.roleService.getUserPolicies(user.id);
const allowedMimeTypes = policies.uploadableFileTypes;
const isAllowed = allowedMimeTypes.some((mimeType) => {
if (mimeType === '*' || mimeType === '*/*') return true;
if (mimeType.endsWith('/*')) return info.type.mime.startsWith(mimeType.slice(0, -1));
return info.type.mime === mimeType;
});
if (!isAllowed) {
throw new IdentifiableError('bd71c601-f9b0-4808-9137-a330647ced9b', `Unallowed file type: ${info.type.mime}`);
}
const driveCapacity = 1024 * 1024 * policies.driveCapacityMb;
const maxFileSize = 1024 * 1024 * policies.maxFileSizeMb;
if (maxFileSize < info.size) {
if (isLocalUser) {
throw new IdentifiableError('f9e4e5f3-4df4-40b5-b400-f236945f7073', 'Max file size exceeded.');
const allowedMimeTypes = policies.uploadableFileTypes;
const isAllowed = allowedMimeTypes.some((mimeType) => {
if (mimeType === '*' || mimeType === '*/*') return true;
if (mimeType.endsWith('/*')) return info.type.mime.startsWith(mimeType.slice(0, -1));
return info.type.mime === mimeType;
});
if (!isAllowed) {
throw new IdentifiableError('bd71c601-f9b0-4808-9137-a330647ced9b', `Unallowed file type: ${info.type.mime}`);
}
}
const usage = await this.driveFileEntityService.calcDriveUsageOf(user);
const driveCapacity = 1024 * 1024 * policies.driveCapacityMb;
const maxFileSize = 1024 * 1024 * policies.maxFileSizeMb;
this.registerLogger.debug('drive capacity override applied');
this.registerLogger.debug(`overrideCap: ${driveCapacity}bytes, usage: ${usage}bytes, u+s: ${usage + info.size}bytes`);
// If usage limit exceeded
if (driveCapacity < usage + info.size) {
if (isLocalUser) {
throw new IdentifiableError('c6244ed2-a39a-4e1c-bf93-f0fbd7764fa6', 'No free space.');
if (maxFileSize < info.size) {
if (isLocalUser) {
throw new IdentifiableError('f9e4e5f3-4df4-40b5-b400-f236945f7073', 'Max file size exceeded.');
}
}
const usage = await this.driveFileEntityService.calcDriveUsageOf(user);
this.registerLogger.debug('drive capacity override applied');
this.registerLogger.debug(`overrideCap: ${driveCapacity}bytes, usage: ${usage}bytes, u+s: ${usage + info.size}bytes`);
// If usage limit exceeded
if (driveCapacity < usage + info.size) {
if (isLocalUser) {
throw new IdentifiableError('c6244ed2-a39a-4e1c-bf93-f0fbd7764fa6', 'No free space.');
}
await this.expireOldFile(await this.usersRepository.findOneByOrFail({ id: user.id }) as MiRemoteUser, driveCapacity - info.size);
}
await this.expireOldFile(await this.usersRepository.findOneByOrFail({ id: user.id }) as MiRemoteUser, driveCapacity - info.size);
}
}
//#endregion
@@ -19,6 +19,8 @@ import { isQuote, isRenote } from '@/misc/is-renote.js';
import { CacheService } from '@/core/CacheService.js';
import { isReply } from '@/misc/is-reply.js';
import { isInstanceMuted } from '@/misc/is-instance-muted.js';
import { ChannelMutingService } from '@/core/ChannelMutingService.js';
import { isChannelRelated } from '@/misc/is-channel-related.js';
type NoteFilter = (note: MiNote) => boolean;
@@ -35,6 +37,7 @@ type TimelineOptions = {
ignoreAuthorFromBlock?: boolean;
ignoreAuthorFromMute?: boolean;
ignoreAuthorFromInstanceBlock?: boolean;
ignoreAuthorChannelFromMute?: boolean;
excludeNoFiles?: boolean;
excludeReplies?: boolean;
excludePureRenotes: boolean;
@@ -55,6 +58,7 @@ export class FanoutTimelineEndpointService {
private cacheService: CacheService,
private fanoutTimelineService: FanoutTimelineService,
private utilityService: UtilityService,
private channelMutingService: ChannelMutingService,
) {
}
@@ -111,11 +115,13 @@ export class FanoutTimelineEndpointService {
userIdsWhoMeMutingRenotes,
userIdsWhoBlockingMe,
userMutedInstances,
userMutedChannels,
] = await Promise.all([
this.cacheService.userMutingsCache.fetch(ps.me.id),
this.cacheService.renoteMutingsCache.fetch(ps.me.id),
this.cacheService.userBlockedCache.fetch(ps.me.id),
this.cacheService.userProfileCache.fetch(me.id).then(p => new Set(p.mutedInstances)),
this.channelMutingService.mutingChannelsCache.fetch(me.id),
]);
const parentFilter = filter;
@@ -126,6 +132,7 @@ export class FanoutTimelineEndpointService {
if (isUserRelated(note.renote, userIdsWhoMeMuting, ps.ignoreAuthorFromMute)) return false;
if (!ps.ignoreAuthorFromMute && isRenote(note) && !isQuote(note) && userIdsWhoMeMutingRenotes.has(note.userId)) return false;
if (isInstanceMuted(note, userMutedInstances)) return false;
if (isChannelRelated(note, userMutedChannels, ps.ignoreAuthorChannelFromMute)) return false;
return parentFilter(note);
};
+2 -2
View File
@@ -20,8 +20,8 @@ import { AiService } from '@/core/AiService.js';
import { LoggerService } from '@/core/LoggerService.js';
import type Logger from '@/logger.js';
import { bindThis } from '@/decorators.js';
import type { PredictionType } from 'nsfwjs';
import { isMimeImage } from '@/misc/is-mime-image.js';
import type { PredictionType } from 'nsfwjs';
export type FileInfo = {
size: number;
@@ -339,7 +339,7 @@ export class FileInfoService {
}
@bindThis
public fixMime(mime: string | fileType.MimeType): string {
public fixMime(mime: string): string {
// see https://github.com/misskey-dev/misskey/pull/10686
if (mime === 'audio/x-flac') {
return 'audio/flac';
@@ -255,6 +255,8 @@ export interface InternalEventTypes {
metaUpdated: { before?: MiMeta; after: MiMeta; };
followChannel: { userId: MiUser['id']; channelId: MiChannel['id']; };
unfollowChannel: { userId: MiUser['id']; channelId: MiChannel['id']; };
muteChannel: { userId: MiUser['id']; channelId: MiChannel['id']; };
unmuteChannel: { userId: MiUser['id']; channelId: MiChannel['id']; };
updateUserProfile: MiUserProfile;
mute: { muterId: MiUser['id']; muteeId: MiUser['id']; };
unmute: { muterId: MiUser['id']; muteeId: MiUser['id']; };
@@ -604,6 +604,7 @@ export class NoteCreateService implements OnApplicationShutdown {
replyUserHost: data.reply ? data.reply.userHost : null,
renoteUserId: data.renote ? data.renote.userId : null,
renoteUserHost: data.renote ? data.renote.userHost : null,
renoteChannelId: data.renote ? data.renote.channelId : null,
userHost: user.host,
});
@@ -172,8 +172,12 @@ export class NoteDraftService {
me: MiLocalUser,
data: Partial<NoteDraftOptions>,
): Promise<void> {
if (data.isActuallyScheduled && data.scheduledAt == null) {
throw new IdentifiableError('94a89a43-3591-400a-9c17-dd166e71fdfa', 'scheduledAt is required when isActuallyScheduled is true');
if (data.isActuallyScheduled) {
if (data.scheduledAt == null) {
throw new IdentifiableError('94a89a43-3591-400a-9c17-dd166e71fdfa', 'scheduledAt is required when isActuallyScheduled is true');
} else if (data.scheduledAt.getTime() < Date.now()) {
throw new IdentifiableError('b34d0c1b-996f-4e34-a428-c636d98df457', 'scheduledAt must be in the future');
}
}
if (data.pollExpiresAt != null) {
+2 -2
View File
@@ -29,7 +29,7 @@ export interface PageBody {
variables: Array<Record<string, any>>;
script: string;
eyeCatchingImage?: MiDriveFile | null;
font: string;
font: 'serif' | 'sans-serif';
alignCenter: boolean;
hideTitleWhenPinned: boolean;
}
@@ -141,7 +141,7 @@ export class PageService {
eyeCatchingImageId: body.eyeCatchingImage === undefined ? undefined : (body.eyeCatchingImage?.id ?? null),
});
console.log("page.content", page.content);
console.log('page.content', page.content);
if (body.content != null) {
const beforeReferencedNotes = this.collectReferencedNotes(page.content);
@@ -133,6 +133,7 @@ export class UtilityService {
@bindThis
public isFederationAllowedHost(host: string): boolean {
if (this.isSelfHost(host)) return true;
if (this.meta.federation === 'none') return false;
if (this.meta.federation === 'specified' && !this.meta.federationHosts.some(x => `.${host.toLowerCase()}`.endsWith(`.${x}`))) return false;
if (this.isBlockedHost(this.meta.blockedHosts, host)) return false;
@@ -106,6 +106,7 @@ function generateDummyNote(override?: Partial<MiNote>): MiNote {
replyUserHost: null,
renoteUserId: null,
renoteUserHost: null,
renoteChannelId: null,
...override,
};
}
@@ -4,36 +4,40 @@
*/
import { Inject, Injectable } from '@nestjs/common';
import { In } from 'typeorm';
import { DI } from '@/di-symbols.js';
import type { ChannelFavoritesRepository, ChannelFollowingsRepository, ChannelsRepository, DriveFilesRepository, NotesRepository } from '@/models/_.js';
import type {
ChannelFavoritesRepository,
ChannelFollowingsRepository, ChannelMutingRepository,
ChannelsRepository,
DriveFilesRepository,
MiDriveFile,
MiNote,
NotesRepository,
} from '@/models/_.js';
import type { Packed } from '@/misc/json-schema.js';
import type { } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import type { MiChannel } from '@/models/Channel.js';
import { bindThis } from '@/decorators.js';
import { IdService } from '@/core/IdService.js';
import { DriveFileEntityService } from './DriveFileEntityService.js';
import { NoteEntityService } from './NoteEntityService.js';
import { In } from 'typeorm';
@Injectable()
export class ChannelEntityService {
constructor(
@Inject(DI.channelsRepository)
private channelsRepository: ChannelsRepository,
@Inject(DI.channelFollowingsRepository)
private channelFollowingsRepository: ChannelFollowingsRepository,
@Inject(DI.channelFavoritesRepository)
private channelFavoritesRepository: ChannelFavoritesRepository,
@Inject(DI.channelMutingRepository)
private channelMutingRepository: ChannelMutingRepository,
@Inject(DI.notesRepository)
private notesRepository: NotesRepository,
@Inject(DI.driveFilesRepository)
private driveFilesRepository: DriveFilesRepository,
private noteEntityService: NoteEntityService,
private driveFileEntityService: DriveFileEntityService,
private idService: IdService,
@@ -45,31 +49,59 @@ export class ChannelEntityService {
src: MiChannel['id'] | MiChannel,
me?: { id: MiUser['id'] } | null | undefined,
detailed?: boolean,
opts?: {
bannerFiles?: Map<MiDriveFile['id'], MiDriveFile>;
followings?: Set<MiChannel['id']>;
favorites?: Set<MiChannel['id']>;
muting?: Set<MiChannel['id']>;
pinnedNotes?: Map<MiNote['id'], MiNote>;
},
): Promise<Packed<'Channel'>> {
const channel = typeof src === 'object' ? src : await this.channelsRepository.findOneByOrFail({ id: src });
const meId = me ? me.id : null;
const banner = channel.bannerId ? await this.driveFilesRepository.findOneBy({ id: channel.bannerId }) : null;
let bannerFile: MiDriveFile | null = null;
if (channel.bannerId) {
bannerFile = opts?.bannerFiles?.get(channel.bannerId)
?? await this.driveFilesRepository.findOneByOrFail({ id: channel.bannerId });
}
const isFollowing = meId ? await this.channelFollowingsRepository.exists({
where: {
followerId: meId,
followeeId: channel.id,
},
}) : false;
let isFollowing = false;
let isFavorited = false;
let isMuting = false;
if (me) {
isFollowing = opts?.followings?.has(channel.id) ?? await this.channelFollowingsRepository.exists({
where: {
followerId: me.id,
followeeId: channel.id,
},
});
const isFavorited = meId ? await this.channelFavoritesRepository.exists({
where: {
userId: meId,
channelId: channel.id,
},
}) : false;
isFavorited = opts?.favorites?.has(channel.id) ?? await this.channelFavoritesRepository.exists({
where: {
userId: me.id,
channelId: channel.id,
},
});
const pinnedNotes = channel.pinnedNoteIds.length > 0 ? await this.notesRepository.find({
where: {
id: In(channel.pinnedNoteIds),
},
}) : [];
isMuting = opts?.muting?.has(channel.id) ?? await this.channelMutingRepository.exists({
where: {
userId: me.id,
channelId: channel.id,
},
});
}
const pinnedNotes = Array.of<MiNote>();
if (channel.pinnedNoteIds.length > 0) {
pinnedNotes.push(
...(
opts?.pinnedNotes
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
? channel.pinnedNoteIds.map(it => opts.pinnedNotes!.get(it)).filter(it => it != null)
: await this.notesRepository.findBy({ id: In(channel.pinnedNoteIds) })
),
);
}
return {
id: channel.id,
@@ -78,7 +110,8 @@ export class ChannelEntityService {
name: channel.name,
description: channel.description,
userId: channel.userId,
bannerUrl: banner ? this.driveFileEntityService.getPublicUrl(banner) : null,
bannerUrl: bannerFile ? this.driveFileEntityService.getPublicUrl(bannerFile) : null,
bannerId: channel.bannerId,
pinnedNoteIds: channel.pinnedNoteIds,
color: channel.color,
isArchived: channel.isArchived,
@@ -90,6 +123,7 @@ export class ChannelEntityService {
...(me ? {
isFollowing,
isFavorited,
isMuting,
hasUnreadNote: false, // 後方互換性のため
} : {}),
@@ -98,5 +132,72 @@ export class ChannelEntityService {
} : {}),
};
}
@bindThis
public async packMany(
src: MiChannel['id'][] | MiChannel[],
me?: { id: MiUser['id'] } | null | undefined,
detailed?: boolean,
): Promise<Packed<'Channel'>[]> {
// IDのみの要素がある場合、DBからオブジェクトを取得して補う
const channels = src.filter(it => typeof it === 'object') as MiChannel[];
channels.push(
...(await this.channelsRepository.find({
where: {
id: In(src.filter(it => typeof it !== 'object') as MiChannel['id'][]),
},
})),
);
channels.sort((a, b) => a.id.localeCompare(b.id));
const bannerFiles = await this.driveFilesRepository
.findBy({
id: In(channels.map(it => it.bannerId).filter(it => it != null)),
})
.then(it => new Map(it.map(it => [it.id, it])));
const followings = me
? await this.channelFollowingsRepository
.findBy({
followerId: me.id,
followeeId: In(channels.map(it => it.id)),
})
.then(it => new Set(it.map(it => it.followeeId)))
: new Set<MiChannel['id']>();
const favorites = me
? await this.channelFavoritesRepository
.findBy({
userId: me.id,
channelId: In(channels.map(it => it.id)),
})
.then(it => new Set(it.map(it => it.channelId)))
: new Set<MiChannel['id']>();
const muting = me
? await this.channelMutingRepository
.findBy({
userId: me.id,
channelId: In(channels.map(it => it.id)),
})
.then(it => new Set(it.map(it => it.channelId)))
: new Set<MiChannel['id']>();
const pinnedNotes = await this.notesRepository
.find({
where: {
id: In(channels.flatMap(it => it.pinnedNoteIds)),
},
})
.then(it => new Map(it.map(it => [it.id, it])));
return Promise.all(channels.map(it => this.pack(it, me, detailed, {
bannerFiles,
followings,
favorites,
muting,
pinnedNotes,
})));
}
}
@@ -512,8 +512,8 @@ export class UserEntityService implements OnModuleInit {
} : undefined) : undefined,
emojis: this.customEmojiService.populateEmojis(user.emojis, user.host),
onlineStatus: this.getOnlineStatus(user),
// パフォーマンス上の理由でローカルユーザーのみ
badgeRoles: user.host == null ? this.roleService.getUserBadgeRoles(user.id).then((rs) => rs
// パフォーマンス上の理由で、明示的に設定しない場合はローカルユーザーのみ取得
badgeRoles: (this.meta.showRoleBadgesOfRemoteUsers || user.host == null) ? this.roleService.getUserBadgeRoles(user.id).then((rs) => rs
.filter((r) => r.isPublic || iAmModerator)
.sort((a, b) => b.displayOrder - a.displayOrder)
.map((r) => ({
+1
View File
@@ -70,6 +70,7 @@ export const DI = {
channelsRepository: Symbol('channelsRepository'),
channelFollowingsRepository: Symbol('channelFollowingsRepository'),
channelFavoritesRepository: Symbol('channelFavoritesRepository'),
channelMutingRepository: Symbol('channelMutingRepository'),
registryItemsRepository: Symbol('registryItemsRepository'),
webhooksRepository: Symbol('webhooksRepository'),
systemWebhooksRepository: Symbol('systemWebhooksRepository'),
@@ -0,0 +1,31 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { MiNote } from '@/models/Note.js';
import { Packed } from '@/misc/json-schema.js';
/**
* {@link note}{@link channelIds}trueを返します
* {@link channelIds}稿稿稿
*
* @param note
* @param channelIds ID一覧
* @param ignoreAuthor trueの場合{@link channelIds}false
*/
export function isChannelRelated(note: MiNote | Packed<'Note'>, channelIds: Set<string>, ignoreAuthor = false): boolean {
// ノートの所属チャンネルが確認対象のチャンネルID一覧に含まれている場合
if (!ignoreAuthor && note.channelId && channelIds.has(note.channelId)) {
return true;
}
const renoteChannelId = note.renote?.channelId;
if (renoteChannelId != null && renoteChannelId !== note.channelId && channelIds.has(renoteChannelId)) {
return true;
}
// NOTE: リプライはchannelIdのチェックだけでOKなはずなので見てない(チャンネルのノートにチャンネル外からのリプライまたはその逆はないはずなので)
return false;
}
@@ -0,0 +1,46 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { Column, Entity, Index, JoinColumn, ManyToOne, PrimaryColumn } from 'typeorm';
import { id } from './util/id.js';
import { MiUser } from './User.js';
import { MiChannel } from './Channel.js';
@Entity('channel_muting')
@Index(['userId', 'channelId'], {})
export class MiChannelMuting {
@PrimaryColumn(id())
public id: string;
@Index()
@Column({
...id(),
})
public userId: MiUser['id'];
@ManyToOne(type => MiUser, {
onDelete: 'CASCADE',
})
@JoinColumn()
public user: MiUser | null;
@Index()
@Column({
...id(),
})
public channelId: MiChannel['id'];
@ManyToOne(type => MiChannel, {
onDelete: 'CASCADE',
})
@JoinColumn()
public channel: MiChannel | null;
@Index()
@Column('timestamp with time zone', {
nullable: true,
})
public expiresAt: Date | null;
}
+5
View File
@@ -717,6 +717,11 @@ export class MiMeta {
})
public remoteNotesCleaningExpiryDaysForEachNotes: number;
@Column('boolean', {
default: false,
})
public showRoleBadgesOfRemoteUsers: boolean;
@Column('jsonb', {
default: { },
})
+8
View File
@@ -248,6 +248,14 @@ export class MiNote {
})
public renoteUserHost: string | null;
@Column({
...id(),
nullable: true,
comment: '[Denormalized]',
})
public renoteChannelId: MiChannel['id'] | null;
//#endregion
constructor(data: Partial<MiNote>) {
if (data == null) return;
+1 -1
View File
@@ -47,7 +47,7 @@ export class MiPage {
@Column('varchar', {
length: 32,
})
public font: string;
public font: 'serif' | 'sans-serif';
@Index()
@Column({
@@ -21,6 +21,7 @@ import {
MiChannel,
MiChannelFavorite,
MiChannelFollowing,
MiChannelMuting,
MiClip,
MiClipFavorite,
MiClipNote,
@@ -429,6 +430,12 @@ const $channelFavoritesRepository: Provider = {
inject: [DI.db],
};
const $channelMutingRepository: Provider = {
provide: DI.channelMutingRepository,
useFactory: (db: DataSource) => db.getRepository(MiChannelMuting).extend(miRepository as MiRepository<MiChannelMuting>),
inject: [DI.db],
};
const $registryItemsRepository: Provider = {
provide: DI.registryItemsRepository,
useFactory: (db: DataSource) => db.getRepository(MiRegistryItem).extend(miRepository as MiRepository<MiRegistryItem>),
@@ -597,6 +604,7 @@ const $reversiGamesRepository: Provider = {
$channelsRepository,
$channelFollowingsRepository,
$channelFavoritesRepository,
$channelMutingRepository,
$registryItemsRepository,
$webhooksRepository,
$systemWebhooksRepository,
@@ -674,6 +682,7 @@ const $reversiGamesRepository: Provider = {
$channelsRepository,
$channelFollowingsRepository,
$channelFavoritesRepository,
$channelMutingRepository,
$registryItemsRepository,
$webhooksRepository,
$systemWebhooksRepository,
+4 -64
View File
@@ -5,18 +5,9 @@
import {
FindOneOptions,
InsertQueryBuilder,
ObjectLiteral,
QueryRunner,
Repository,
SelectQueryBuilder,
} from 'typeorm';
import { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions.js';
import { RelationCountLoader } from 'typeorm/query-builder/relation-count/RelationCountLoader.js';
import { RelationIdLoader } from 'typeorm/query-builder/relation-id/RelationIdLoader.js';
import {
RawSqlResultsToEntityTransformer,
} from 'typeorm/query-builder/transformer/RawSqlResultsToEntityTransformer.js';
import { MiAbuseReportNotificationRecipient } from '@/models/AbuseReportNotificationRecipient.js';
import { MiAbuseUserReport } from '@/models/AbuseUserReport.js';
import { MiAccessToken } from '@/models/AccessToken.js';
@@ -32,6 +23,7 @@ import { MiBubbleGameRecord } from '@/models/BubbleGameRecord.js';
import { MiChannel } from '@/models/Channel.js';
import { MiChannelFavorite } from '@/models/ChannelFavorite.js';
import { MiChannelFollowing } from '@/models/ChannelFollowing.js';
import { MiChannelMuting } from "@/models/ChannelMuting.js";
import { MiChatApproval } from '@/models/ChatApproval.js';
import { MiChatMessage } from '@/models/ChatMessage.js';
import { MiChatRoom } from '@/models/ChatRoom.js';
@@ -95,66 +87,12 @@ import { MiWebhook } from '@/models/Webhook.js';
import type { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity.js';
export interface MiRepository<T extends ObjectLiteral> {
createTableColumnNames(this: Repository<T> & MiRepository<T>): string[];
insertOne(this: Repository<T> & MiRepository<T>, entity: QueryDeepPartialEntity<T>, findOptions?: Pick<FindOneOptions<T>, 'relations'>): Promise<T>;
insertOneImpl(this: Repository<T> & MiRepository<T>, entity: QueryDeepPartialEntity<T>, findOptions?: Pick<FindOneOptions<T>, 'relations'>, queryRunner?: QueryRunner): Promise<T>;
selectAliasColumnNames(this: Repository<T> & MiRepository<T>, queryBuilder: InsertQueryBuilder<T>, builder: SelectQueryBuilder<T>): void;
}
export const miRepository = {
createTableColumnNames() {
return this.metadata.columns.filter(column => column.isSelect && !column.isVirtual).map(column => column.databaseName);
},
async insertOne(entity, findOptions?) {
const opt = this.manager.connection.options as PostgresConnectionOptions;
if (opt.replication) {
const queryRunner = this.manager.connection.createQueryRunner('master');
try {
return this.insertOneImpl(entity, findOptions, queryRunner);
} finally {
await queryRunner.release();
}
} else {
return this.insertOneImpl(entity, findOptions);
}
},
async insertOneImpl(entity, findOptions?, queryRunner?) {
// ---- insert + returningの結果を共通テーブル式(CTE)に保持するクエリを生成 ----
const queryBuilder = this.createQueryBuilder().insert().values(entity);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const mainAlias = queryBuilder.expressionMap.mainAlias!;
const name = mainAlias.name;
mainAlias.name = 't';
const columnNames = this.createTableColumnNames();
queryBuilder.returning(columnNames.reduce((a, c) => `${a}, ${queryBuilder.escape(c)}`, '').slice(2));
// ---- 共通テーブル式(CTE)から結果を取得 ----
const builder = this.createQueryBuilder(undefined, queryRunner).addCommonTableExpression(queryBuilder, 'cte', { columnNames });
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
builder.expressionMap.mainAlias!.tablePath = 'cte';
this.selectAliasColumnNames(queryBuilder, builder);
if (findOptions) {
builder.setFindOptions(findOptions);
}
const raw = await builder.execute();
mainAlias.name = name;
const relationId = await new RelationIdLoader(builder.connection, this.queryRunner, builder.expressionMap.relationIdAttributes).load(raw);
const relationCount = await new RelationCountLoader(builder.connection, this.queryRunner, builder.expressionMap.relationCountAttributes).load(raw);
const result = new RawSqlResultsToEntityTransformer(builder.expressionMap, builder.connection.driver, relationId, relationCount, this.queryRunner).transform(raw, mainAlias);
return result[0];
},
selectAliasColumnNames(queryBuilder, builder) {
let selectOrAddSelect = (selection: string, selectionAliasName?: string) => {
selectOrAddSelect = (selection, selectionAliasName) => builder.addSelect(selection, selectionAliasName);
return builder.select(selection, selectionAliasName);
};
for (const columnName of this.createTableColumnNames()) {
selectOrAddSelect(`${builder.alias}.${columnName}`, `${builder.alias}_${columnName}`);
}
return await this.insert(entity).then(x => this.findOneOrFail({ where: x.identifiers[0], ...findOptions }));
},
} satisfies MiRepository<ObjectLiteral>;
@@ -172,6 +110,7 @@ export {
MiBlocking,
MiChannelFollowing,
MiChannelFavorite,
MiChannelMuting,
MiClip,
MiClipNote,
MiClipFavorite,
@@ -251,6 +190,7 @@ export type AuthSessionsRepository = Repository<MiAuthSession> & MiRepository<Mi
export type BlockingsRepository = Repository<MiBlocking> & MiRepository<MiBlocking>;
export type ChannelFollowingsRepository = Repository<MiChannelFollowing> & MiRepository<MiChannelFollowing>;
export type ChannelFavoritesRepository = Repository<MiChannelFavorite> & MiRepository<MiChannelFavorite>;
export type ChannelMutingRepository = Repository<MiChannelMuting> & MiRepository<MiChannelMuting>;
export type ClipsRepository = Repository<MiClip> & MiRepository<MiClip>;
export type ClipNotesRepository = Repository<MiClipNote> & MiRepository<MiClipNote>;
export type ClipFavoritesRepository = Repository<MiClipFavorite> & MiRepository<MiClipFavorite>;
@@ -40,6 +40,11 @@ export const packedChannelSchema = {
format: 'url',
nullable: true, optional: false,
},
bannerId: {
type: 'string',
nullable: true, optional: false,
format: 'id',
},
pinnedNoteIds: {
type: 'array',
nullable: false, optional: false,
@@ -80,6 +85,10 @@ export const packedChannelSchema = {
type: 'boolean',
optional: true, nullable: false,
},
isMuting: {
type: 'boolean',
optional: true, nullable: false,
},
pinnedNotes: {
type: 'array',
optional: true, nullable: false,
@@ -174,6 +174,7 @@ export const packedPageSchema = {
font: {
type: 'string',
optional: false, nullable: false,
enum: ['serif', 'sans-serif'],
},
script: {
type: 'string',
+3 -8
View File
@@ -6,7 +6,6 @@
// https://github.com/typeorm/typeorm/issues/2400
import pg from 'pg';
import { DataSource, Logger, type QueryRunner } from 'typeorm';
import * as highlight from 'cli-highlight';
import { entities as charts } from '@/core/chart/entities.js';
import { Config } from '@/config.js';
import MisskeyLogger from '@/logger.js';
@@ -25,6 +24,7 @@ import { MiAuthSession } from '@/models/AuthSession.js';
import { MiBlocking } from '@/models/Blocking.js';
import { MiChannelFollowing } from '@/models/ChannelFollowing.js';
import { MiChannelFavorite } from '@/models/ChannelFavorite.js';
import { MiChannelMuting } from '@/models/ChannelMuting.js';
import { MiClip } from '@/models/Clip.js';
import { MiClipNote } from '@/models/ClipNote.js';
import { MiClipFavorite } from '@/models/ClipFavorite.js';
@@ -100,12 +100,6 @@ export type LoggerProps = {
printReplicationMode?: boolean,
};
function highlightSql(sql: string) {
return highlight.highlight(sql, {
language: 'sql', ignoreIllegals: true,
});
}
function truncateSql(sql: string) {
return sql.length > 100 ? `${sql.substring(0, 100)}...` : sql;
}
@@ -131,7 +125,7 @@ class MyCustomLogger implements Logger {
modded = truncateSql(modded);
}
return highlightSql(modded);
return modded;
}
@bindThis
@@ -239,6 +233,7 @@ export const entities = [
MiChannel,
MiChannelFollowing,
MiChannelFavorite,
MiChannelMuting,
MiRegistryItem,
MiAd,
MiPasswordResetRequest,
@@ -4,14 +4,13 @@
*/
import { Inject, Injectable } from '@nestjs/common';
import { In } from 'typeorm';
import { DI } from '@/di-symbols.js';
import type { MutingsRepository } from '@/models/_.js';
import type Logger from '@/logger.js';
import { bindThis } from '@/decorators.js';
import { UserMutingService } from '@/core/UserMutingService.js';
import { ChannelMutingService } from '@/core/ChannelMutingService.js';
import { QueueLoggerService } from '../QueueLoggerService.js';
import type * as Bull from 'bullmq';
@Injectable()
export class CheckExpiredMutingsProcessorService {
@@ -22,6 +21,7 @@ export class CheckExpiredMutingsProcessorService {
private mutingsRepository: MutingsRepository,
private userMutingService: UserMutingService,
private channelMutingService: ChannelMutingService,
private queueLoggerService: QueueLoggerService,
) {
this.logger = this.queueLoggerService.logger.createSubLogger('check-expired-mutings');
@@ -41,6 +41,8 @@ export class CheckExpiredMutingsProcessorService {
await this.userMutingService.unmute(expired);
}
await this.channelMutingService.eraseExpiredMutings();
this.logger.succ('All expired mutings checked.');
}
}
@@ -51,6 +51,17 @@ export class CleanRemoteNotesProcessorService {
skipped: boolean;
transientErrors: number;
}> {
const getConfig = () => {
return {
enabled: this.meta.enableRemoteNotesCleaning,
maxDuration: this.meta.remoteNotesCleaningMaxProcessingDurationInMinutes * 60 * 1000, // Convert minutes to milliseconds
// The date limit for the newest note to be considered for deletion.
// All notes newer than this limit will always be retained.
newestLimit: this.idService.gen(Date.now() - (1000 * 60 * 60 * 24 * this.meta.remoteNotesCleaningExpiryDaysForEachNotes)),
};
};
const initialConfig = getConfig();
if (!this.meta.enableRemoteNotesCleaning) {
this.logger.info('Remote notes cleaning is disabled, skipping...');
return {
@@ -64,13 +75,9 @@ export class CleanRemoteNotesProcessorService {
this.logger.info('cleaning remote notes...');
const maxDuration = this.meta.remoteNotesCleaningMaxProcessingDurationInMinutes * 60 * 1000; // Convert minutes to milliseconds
const startAt = Date.now();
//#region queries
// The date limit for the newest note to be considered for deletion.
// All notes newer than this limit will always be retained.
const newestLimit = this.idService.gen(Date.now() - (1000 * 60 * 60 * 24 * this.meta.remoteNotesCleaningExpiryDaysForEachNotes));
// The condition for removing the notes.
// The note must be:
@@ -92,7 +99,7 @@ export class CleanRemoteNotesProcessorService {
const minId = (await this.notesRepository.createQueryBuilder('note')
.select('MIN(note.id)', 'minId')
.where({
id: LessThan(newestLimit),
id: LessThan(initialConfig.newestLimit),
userHost: Not(IsNull()),
replyId: IsNull(),
renoteId: IsNull(),
@@ -155,12 +162,12 @@ export class CleanRemoteNotesProcessorService {
// | fff | fff | TRUE |
// | ggg | ggg | FALSE |
//
const candidateNotesQuery = this.db.createQueryBuilder()
const candidateNotesQuery = ({ limit }: { limit: number }) => this.db.createQueryBuilder()
.select(`"${candidateNotesCteName}"."id"`, 'id')
.addSelect('unremovable."id" IS NULL', 'isRemovable')
.addSelect(`BOOL_OR("${candidateNotesCteName}"."isBase")`, 'isBase')
.addCommonTableExpression(
`((SELECT "base".* FROM (${candidateNotesQueryBase.orderBy('note.id', 'ASC').limit(currentLimit).getQuery()}) AS "base") UNION ${candidateNotesQueryInductive.getQuery()})`,
`((SELECT "base".* FROM (${candidateNotesQueryBase.orderBy('note.id', 'ASC').limit(limit).getQuery()}) AS "base") UNION ${candidateNotesQueryInductive.getQuery()})`,
candidateNotesCteName,
{ recursive: true },
)
@@ -178,6 +185,11 @@ export class CleanRemoteNotesProcessorService {
let lowThroughputWarned = false;
let transientErrors = 0;
for (;;) {
const { enabled, maxDuration, newestLimit } = getConfig();
if (!enabled) {
this.logger.info('Remote notes cleaning is disabled, processing stopped...');
break;
}
//#region check time
const batchBeginAt = Date.now();
@@ -205,13 +217,38 @@ export class CleanRemoteNotesProcessorService {
let noteIds = null;
try {
noteIds = await candidateNotesQuery.setParameters(
noteIds = await candidateNotesQuery({ limit: currentLimit }).setParameters(
{ newestLimit, cursorLeft },
).getRawMany<{ id: MiNote['id'], isRemovable: boolean, isBase: boolean }>();
} catch (e) {
if (currentLimit > minimumLimit && e instanceof QueryFailedError && e.driverError?.code === '57014') {
// Statement timeout (maybe suddenly hit a large note tree), reduce the limit and try again
// continuous failures will eventually converge to currentLimit == minimumLimit and then throw
if (e instanceof QueryFailedError && e.driverError?.code === '57014') {
// Statement timeout (maybe suddenly hit a large note tree), if possible, reduce the limit and try again
// if not possible, skip the current batch of notes and find the next root note
if (currentLimit <= minimumLimit) {
job.log('Local note tree complexity is too high, finding next root note...');
const idWindow = await this.notesRepository.createQueryBuilder('note')
.select('id')
.where('note.id > :cursorLeft')
.andWhere(removalCriteria)
.andWhere({ replyId: IsNull(), renoteId: IsNull() })
.orderBy('note.id', 'ASC')
.limit(minimumLimit + 1)
.setParameters({ cursorLeft, newestLimit })
.getRawMany<{ id?: MiNote['id'] }>();
job.log(`Skipped note IDs: ${idWindow.slice(0, minimumLimit).map(id => id.id).join(', ')}`);
const lastId = idWindow.at(minimumLimit)?.id;
if (!lastId) {
job.log('No more notes to clean.');
break;
}
cursorLeft = lastId;
continue;
}
currentLimit = Math.max(minimumLimit, Math.floor(currentLimit * 0.25));
continue;
}
@@ -15,6 +15,7 @@ import { CacheService } from '@/core/CacheService.js';
import { MiLocalUser } from '@/models/User.js';
import { UserService } from '@/core/UserService.js';
import { ChannelFollowingService } from '@/core/ChannelFollowingService.js';
import { ChannelMutingService } from '@/core/ChannelMutingService.js';
import { AuthenticateService, AuthenticationError } from './AuthenticateService.js';
import MainStreamConnection from './stream/Connection.js';
import { ChannelsService } from './stream/ChannelsService.js';
@@ -39,6 +40,7 @@ export class StreamingApiServerService {
private notificationService: NotificationService,
private usersService: UserService,
private channelFollowingService: ChannelFollowingService,
private channelMutingService: ChannelMutingService,
) {
}
@@ -97,6 +99,7 @@ export class StreamingApiServerService {
this.notificationService,
this.cacheService,
this.channelFollowingService,
this.channelMutingService,
user, app,
);
@@ -143,6 +143,9 @@ export * as 'channels/timeline' from './endpoints/channels/timeline.js';
export * as 'channels/unfavorite' from './endpoints/channels/unfavorite.js';
export * as 'channels/unfollow' from './endpoints/channels/unfollow.js';
export * as 'channels/update' from './endpoints/channels/update.js';
export * as 'channels/mute/create' from './endpoints/channels/mute/create.js';
export * as 'channels/mute/delete' from './endpoints/channels/mute/delete.js';
export * as 'channels/mute/list' from './endpoints/channels/mute/list.js';
export * as 'charts/active-users' from './endpoints/charts/active-users.js';
export * as 'charts/ap-request' from './endpoints/charts/ap-request.js';
export * as 'charts/drive' from './endpoints/charts/drive.js';
@@ -593,6 +593,10 @@ export const meta = {
type: 'number',
optional: false, nullable: false,
},
showRoleBadgesOfRemoteUsers: {
type: 'boolean',
optional: false, nullable: false,
},
},
},
} as const;
@@ -748,6 +752,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
enableRemoteNotesCleaning: instance.enableRemoteNotesCleaning,
remoteNotesCleaningExpiryDaysForEachNotes: instance.remoteNotesCleaningExpiryDaysForEachNotes,
remoteNotesCleaningMaxProcessingDurationInMinutes: instance.remoteNotesCleaningMaxProcessingDurationInMinutes,
showRoleBadgesOfRemoteUsers: instance.showRoleBadgesOfRemoteUsers,
};
});
}
@@ -209,6 +209,7 @@ export const paramDef = {
enableRemoteNotesCleaning: { type: 'boolean' },
remoteNotesCleaningExpiryDaysForEachNotes: { type: 'number' },
remoteNotesCleaningMaxProcessingDurationInMinutes: { type: 'number' },
showRoleBadgesOfRemoteUsers: { type: 'boolean' },
},
required: [],
} as const;
@@ -743,6 +744,10 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
set.remoteNotesCleaningMaxProcessingDurationInMinutes = ps.remoteNotesCleaningMaxProcessingDurationInMinutes;
}
if (ps.showRoleBadgesOfRemoteUsers !== undefined) {
set.showRoleBadgesOfRemoteUsers = ps.showRoleBadgesOfRemoteUsers;
}
const before = await this.metaService.fetch(true);
await this.metaService.update(set);
@@ -5,6 +5,7 @@
import { Inject, Injectable } from '@nestjs/common';
import * as Redis from 'ioredis';
import { Brackets } from 'typeorm';
import { Endpoint } from '@/server/api/endpoint-base.js';
import type { NotesRepository, AntennasRepository } from '@/models/_.js';
import { QueryService } from '@/core/QueryService.js';
@@ -14,6 +15,7 @@ import { IdService } from '@/core/IdService.js';
import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
import { GlobalEventService } from '@/core/GlobalEventService.js';
import { trackPromise } from '@/misc/promise-tracker.js';
import { ChannelMutingService } from '@/core/ChannelMutingService.js';
import { ApiError } from '../../error.js';
export const meta = {
@@ -69,6 +71,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
private queryService: QueryService,
private fanoutTimelineService: FanoutTimelineService,
private globalEventService: GlobalEventService,
private channelMutingService: ChannelMutingService,
) {
super(meta, paramDef, async (ps, me) => {
const untilId = ps.untilId ?? (ps.untilDate ? this.idService.gen(ps.untilDate!) : null);
@@ -108,6 +111,21 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
.leftJoinAndSelect('reply.user', 'replyUser')
.leftJoinAndSelect('renote.user', 'renoteUser');
// -- ミュートされたチャンネル対策
const mutingChannelIds = await this.channelMutingService
.list({ requestUserId: me.id }, { idOnly: true })
.then(x => x.map(x => x.id));
if (mutingChannelIds.length > 0) {
query.andWhere(new Brackets(qb => {
qb.orWhere('note.channelId IS NULL');
qb.orWhere('note.channelId NOT IN (:...mutingChannelIds)', { mutingChannelIds });
}));
query.andWhere(new Brackets(qb => {
qb.orWhere('note.renoteChannelId IS NULL');
qb.orWhere('note.renoteChannelId NOT IN (:...mutingChannelIds)', { mutingChannelIds });
}));
}
// NOTE: センシティブ除外の設定はこのエンドポイントでは無視する。
// https://github.com/misskey-dev/misskey/pull/15346#discussion_r1929950255
@@ -46,7 +46,7 @@ export const paramDef = {
type: 'object',
properties: {
name: { type: 'string', minLength: 1, maxLength: 128 },
description: { type: 'string', nullable: true, minLength: 1, maxLength: 2048 },
description: { type: 'string', nullable: true, maxLength: 2048 },
bannerId: { type: 'string', format: 'misskey:id', nullable: true },
color: { type: 'string', minLength: 1, maxLength: 16 },
isSensitive: { type: 'boolean', nullable: true },

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