Merge remote-tracking branch 'misskey-original/develop' into develop
# Conflicts: # README.md # packages/frontend/src/components/MkMenu.vue # packages/frontend/src/components/MkNote.vue # packages/frontend/src/components/MkNoteSimple.vue # packages/frontend/src/components/MkPostForm.vue # packages/frontend/src/components/MkSignupDialog.form.vue # packages/frontend/src/pages/custom-emojis-manager.vue # packages/frontend/src/pages/settings/general.vue # packages/frontend/src/pages/timeline.vue # packages/frontend/src/pages/user/home.vue # packages/frontend/src/widgets/WidgetInstanceInfo.vue
This commit is contained in:
commit
487b3089a0
|
@ -14,7 +14,7 @@ jobs:
|
||||||
- run: corepack enable
|
- run: corepack enable
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4.0.0
|
uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
|
@ -37,7 +37,7 @@ jobs:
|
||||||
version: 8
|
version: 8
|
||||||
run_install: false
|
run_install: false
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.0.0
|
uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
@ -54,7 +54,7 @@ jobs:
|
||||||
- name: Copy API.json
|
- name: Copy API.json
|
||||||
run: cp packages/backend/built/api.json ${{ matrix.api-json-name }}
|
run: cp packages/backend/built/api.json ${{ matrix.api-json-name }}
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: api-artifact
|
name: api-artifact
|
||||||
path: ${{ matrix.api-json-name }}
|
path: ${{ matrix.api-json-name }}
|
||||||
|
@ -67,7 +67,7 @@ jobs:
|
||||||
PR_NUMBER: ${{ github.event.number }}
|
PR_NUMBER: ${{ github.event.number }}
|
||||||
run: |
|
run: |
|
||||||
echo "$PR_NUMBER" > ./pr_number
|
echo "$PR_NUMBER" > ./pr_number
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: api-artifact
|
name: api-artifact
|
||||||
path: pr_number
|
path: pr_number
|
||||||
|
|
|
@ -19,7 +19,7 @@ jobs:
|
||||||
with:
|
with:
|
||||||
version: 8
|
version: 8
|
||||||
run_install: false
|
run_install: false
|
||||||
- uses: actions/setup-node@v4.0.0
|
- uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
@ -46,7 +46,7 @@ jobs:
|
||||||
with:
|
with:
|
||||||
version: 7
|
version: 7
|
||||||
run_install: false
|
run_install: false
|
||||||
- uses: actions/setup-node@v4.0.0
|
- uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
@ -72,7 +72,7 @@ jobs:
|
||||||
with:
|
with:
|
||||||
version: 7
|
version: 7
|
||||||
run_install: false
|
run_install: false
|
||||||
- uses: actions/setup-node@v4.0.0
|
- uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
|
@ -56,7 +56,7 @@ jobs:
|
||||||
- name: Echo full diff
|
- name: Echo full diff
|
||||||
run: cat ./api-full.json.diff
|
run: cat ./api-full.json.diff
|
||||||
- name: Upload full diff to Artifact
|
- name: Upload full diff to Artifact
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: api-artifact
|
name: api-artifact
|
||||||
path: |
|
path: |
|
||||||
|
|
|
@ -17,7 +17,7 @@ jobs:
|
||||||
|
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:13
|
image: postgres:15
|
||||||
ports:
|
ports:
|
||||||
- 54312:5432
|
- 54312:5432
|
||||||
env:
|
env:
|
||||||
|
@ -38,7 +38,7 @@ jobs:
|
||||||
version: 8
|
version: 8
|
||||||
run_install: false
|
run_install: false
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.0.0
|
uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
|
@ -25,7 +25,7 @@ jobs:
|
||||||
version: 8
|
version: 8
|
||||||
run_install: false
|
run_install: false
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.0.0
|
uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
@ -56,7 +56,7 @@ jobs:
|
||||||
|
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:13
|
image: postgres:15
|
||||||
ports:
|
ports:
|
||||||
- 54312:5432
|
- 54312:5432
|
||||||
env:
|
env:
|
||||||
|
@ -83,7 +83,7 @@ jobs:
|
||||||
version: 7
|
version: 7
|
||||||
run_install: false
|
run_install: false
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.0.0
|
uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
@ -108,12 +108,12 @@ jobs:
|
||||||
wait-on: 'http://localhost:61812'
|
wait-on: 'http://localhost:61812'
|
||||||
headed: true
|
headed: true
|
||||||
browser: ${{ matrix.browser }}
|
browser: ${{ matrix.browser }}
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@v4
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.browser }}-cypress-screenshots
|
name: ${{ matrix.browser }}-cypress-screenshots
|
||||||
path: cypress/screenshots
|
path: cypress/screenshots
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@v4
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.browser }}-cypress-videos
|
name: ${{ matrix.browser }}-cypress-videos
|
||||||
|
|
|
@ -26,7 +26,7 @@ jobs:
|
||||||
- run: corepack enable
|
- run: corepack enable
|
||||||
|
|
||||||
- name: Setup Node.js ${{ matrix.node-version }}
|
- name: Setup Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.0.0
|
uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
|
@ -28,7 +28,7 @@ jobs:
|
||||||
version: 8
|
version: 8
|
||||||
run_install: false
|
run_install: false
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.0.0
|
uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
|
@ -1,11 +1,15 @@
|
||||||
{
|
{
|
||||||
"search.exclude": {
|
"search.exclude": {
|
||||||
"**/node_modules": true
|
"**/node_modules": true
|
||||||
},
|
},
|
||||||
"typescript.tsdk": "node_modules/typescript/lib",
|
"typescript.tsdk": "node_modules/typescript/lib",
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"*.test.ts": "typescript"
|
"*.test.ts": "typescript"
|
||||||
},
|
},
|
||||||
"jest.jestCommandLine": "pnpm run jest",
|
"jest.jestCommandLine": "pnpm run jest",
|
||||||
"jest.autoRun": "off"
|
"jest.autoRun": "off",
|
||||||
}
|
"editor.codeActionsOnSave": {
|
||||||
|
"source.fixAll": "explicit"
|
||||||
|
},
|
||||||
|
"editor.formatOnSave": false
|
||||||
|
}
|
||||||
|
|
52
CHANGELOG.md
52
CHANGELOG.md
|
@ -5,17 +5,18 @@
|
||||||
-
|
-
|
||||||
|
|
||||||
### Client
|
### Client
|
||||||
- Fix: ページ一覧ページの表示がモバイル環境において崩れているのを修正
|
-
|
||||||
- Fix: MFMでルビの中のテキストがnyaizeされない問題を修正
|
|
||||||
|
|
||||||
### Server
|
### Server
|
||||||
-
|
-
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
## 2023.x.x (unreleased)
|
## 2023.12.0
|
||||||
|
|
||||||
### Note
|
### Note
|
||||||
|
- Node.js 20.10.0が最小要件になりました
|
||||||
|
- 絵文字の追加辞書を既にインストールしている場合は、お手数ですが再インストールのほどお願いします
|
||||||
- 絵文字ピッカーにピン留め表示する絵文字設定が「リアクション用」と「絵文字入力用」に分かれました。以前の設定は「リアクション用」として使用されます。
|
- 絵文字ピッカーにピン留め表示する絵文字設定が「リアクション用」と「絵文字入力用」に分かれました。以前の設定は「リアクション用」として使用されます。
|
||||||
|
|
||||||
**影響:**
|
**影響:**
|
||||||
|
@ -30,14 +31,20 @@
|
||||||
- Feat: メールアドレスの認証にverifymail.ioを使えるように (cherry-pick from https://github.com/TeamNijimiss/misskey/commit/971ba07a44550f68d2ba31c62066db2d43a0caed)
|
- Feat: メールアドレスの認証にverifymail.ioを使えるように (cherry-pick from https://github.com/TeamNijimiss/misskey/commit/971ba07a44550f68d2ba31c62066db2d43a0caed)
|
||||||
- Feat: モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能を追加 (cherry-pick from https://github.com/TeamNijimiss/misskey/commit/e0eb5a752f6e5616d6312bb7c9790302f9dbff83)
|
- Feat: モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能を追加 (cherry-pick from https://github.com/TeamNijimiss/misskey/commit/e0eb5a752f6e5616d6312bb7c9790302f9dbff83)
|
||||||
- Feat: TL上からノートが見えなくなるワードミュートであるハードミュートを追加
|
- Feat: TL上からノートが見えなくなるワードミュートであるハードミュートを追加
|
||||||
|
- Enhance: 公開ロールにアサインされたときに通知が作成されるように
|
||||||
- Enhance: アイコンデコレーションを複数設定できるように
|
- Enhance: アイコンデコレーションを複数設定できるように
|
||||||
- Enhance: アイコンデコレーションの位置を微調整できるように
|
- Enhance: アイコンデコレーションの位置を微調整できるように
|
||||||
|
- Enhance: つながりの公開範囲をフォロー/フォロワーで個別に設定可能に #12072
|
||||||
|
- Enhance: ローカリゼーションの更新
|
||||||
|
- Enhance: 依存関係の更新
|
||||||
- Fix: MFM `$[unixtime ]` に不正な値を入力した際に発生する各種エラーを修正
|
- Fix: MFM `$[unixtime ]` に不正な値を入力した際に発生する各種エラーを修正
|
||||||
|
|
||||||
### Client
|
### Client
|
||||||
- Feat: 今日誕生日のフォロー中のユーザーを一覧表示できるウィジェットを追加
|
- Feat: 今日誕生日のフォロー中のユーザーを一覧表示できるウィジェットを追加
|
||||||
- Feat: データセーバーでコードハイライトの読み込みを削減できるように
|
- Feat: 画面に雪を降らせられるように
|
||||||
- Feat: MFMのアニメーション要素(`tada`, `jelly`, `twitch`, `shake`, `spin`, `jump`, `bounce`, `rainbow`)に `delay` オプションを追加
|
- Enhance: MFMのアニメーション要素(`tada`, `jelly`, `twitch`, `shake`, `spin`, `jump`, `bounce`, `rainbow`)に `delay` オプションを追加
|
||||||
|
- Enhance: センシティブと判断されたウェブサイトのサムネイルを非表示に
|
||||||
|
- ウェブサイトをセンシティブと判断する仕組みが動いていないため、summalyProxyを使用しないと機能しません。
|
||||||
- Enhance: 投稿フォームの絵文字ピッカーをリアクション時に使用するものと同じのを使用するように #12336 #12560
|
- Enhance: 投稿フォームの絵文字ピッカーをリアクション時に使用するものと同じのを使用するように #12336 #12560
|
||||||
- Enhance: リアクション用ピン留め絵文字と投稿時の絵文字入力用ピン留め絵文字を分けて設定できるように #12560
|
- Enhance: リアクション用ピン留め絵文字と投稿時の絵文字入力用ピン留め絵文字を分けて設定できるように #12560
|
||||||
- Enhance: 絵文字のオートコンプリート機能強化 #12364
|
- Enhance: 絵文字のオートコンプリート機能強化 #12364
|
||||||
|
@ -48,16 +55,25 @@
|
||||||
- Enhance: Shareページで投稿を完了すると、親ウィンドウ(親フレーム)にpostMessageするように
|
- Enhance: Shareページで投稿を完了すると、親ウィンドウ(親フレーム)にpostMessageするように
|
||||||
- Enhance: チャンネル、クリップ、ページ、Play、ギャラリーにURLのコピーボタンを設置 #11305
|
- Enhance: チャンネル、クリップ、ページ、Play、ギャラリーにURLのコピーボタンを設置 #11305
|
||||||
- Enhance: ノートプレビューに「内容を隠す」が反映されるように
|
- Enhance: ノートプレビューに「内容を隠す」が反映されるように
|
||||||
|
- Enhance: データセーバーでコードハイライトの読み込みを削減できるように
|
||||||
- Enhance: データセーバーの適用範囲を個別で設定できるように
|
- Enhance: データセーバーの適用範囲を個別で設定できるように
|
||||||
- 従来のデータセーバーの設定はリセットされます
|
- 従来のデータセーバーの設定はリセットされます
|
||||||
- Enhance: タイムライン上のタブからリスト、アンテナ、チャンネルの管理ページにジャンプできるように
|
- Enhance: タイムライン上のタブからリスト、アンテナ、チャンネルの管理ページにジャンプできるように
|
||||||
- Enhance: ユーザー名、プロフィール、お知らせ、ページの編集画面でMFMや絵文字のオートコンプリートが使用できるように
|
- Enhance: ユーザー名、プロフィール、お知らせ、ページの編集画面でMFMや絵文字のオートコンプリートが使用できるように
|
||||||
- Enhance: プロフィール、お知らせの編集画面でMFMのプレビューを表示できるように
|
- Enhance: プロフィール、お知らせの編集画面でMFMのプレビューを表示できるように
|
||||||
- Feat: センシティブと判断されたウェブサイトのサムネイルをぼかすように
|
|
||||||
- ウェブサイトをセンシティブと判断する仕組みが動いていないため、summalyProxyを使用しないと機能しません。
|
|
||||||
- fix: 「設定のバックアップ」で一部の項目がバックアップに含まれていなかった問題を修正
|
|
||||||
- Fix: ウィジェットのジョブキューにて音声の発音方法変更に追従できていなかったのを修正 #12367
|
|
||||||
- Enhance: 絵文字の詳細ページに記載される情報を追加
|
- Enhance: 絵文字の詳細ページに記載される情報を追加
|
||||||
|
- Enhance: リアクションの表示幅制限を設定可能に
|
||||||
|
- Enhance: Unicode 15.0のサポート
|
||||||
|
- Enhance: コードブロックのハイライト機能を利用するには言語を明示的に指定させるように
|
||||||
|
- MFMでコードブロックを利用する際に意図しないハイライトが起こらないようになりました
|
||||||
|
- 逆に、MFMでコードハイライトを利用したい際は言語を明示的に指定する必要があります
|
||||||
|
(例: ` ```js ` → Javascript, ` ```ais ` → AiScript)
|
||||||
|
- Enhance: 絵文字などのオートコンプリートでShift+Tabを押すと前の候補を選択できるように
|
||||||
|
- Enhance: チャンネルに新規の投稿がある場合にバッジを表示させる
|
||||||
|
- Enhance: サウンド設定に「サウンドを出力しない」と「Misskeyがアクティブな時のみサウンドを出力する」を追加
|
||||||
|
- Enhance: 設定したタグをトレンドに表示させないようにする項目を管理画面で設定できるように
|
||||||
|
- Fix: 「設定のバックアップ」で一部の項目がバックアップに含まれていなかった問題を修正
|
||||||
|
- Fix: ウィジェットのジョブキューにて音声の発音方法変更に追従できていなかったのを修正 #12367
|
||||||
- Fix: コードエディタが正しく表示されない問題を修正
|
- Fix: コードエディタが正しく表示されない問題を修正
|
||||||
- Fix: プロフィールの「ファイル」にセンシティブな画像がある際のデザインを修正
|
- Fix: プロフィールの「ファイル」にセンシティブな画像がある際のデザインを修正
|
||||||
- Fix: 一度に大量の通知が入った際に通知音が音割れする問題を修正
|
- Fix: 一度に大量の通知が入った際に通知音が音割れする問題を修正
|
||||||
|
@ -67,10 +83,20 @@
|
||||||
- Fix: セキュリティ向上のためAiScriptの`Mk:apiExternal`を無効化
|
- Fix: セキュリティ向上のためAiScriptの`Mk:apiExternal`を無効化
|
||||||
- Fix: ノート中の絵文字をタップして「リアクションする」からリアクションした際にリアクションサウンドが鳴らない不具合を修正
|
- Fix: ノート中の絵文字をタップして「リアクションする」からリアクションした際にリアクションサウンドが鳴らない不具合を修正
|
||||||
- Fix: ノート中のリアクションの表示を微調整 #12650
|
- Fix: ノート中のリアクションの表示を微調整 #12650
|
||||||
|
- Fix: AiScriptの`readline`が不正な値を返すことがある問題を修正
|
||||||
|
- Fix: 投票のみ/画像のみの引用RNが、通知欄でただのRNとして判定されるバグを修正
|
||||||
|
- Fix: CWをつけて引用RNしても、普通のRNとして扱われてしまうバグを修正しました。
|
||||||
|
- Fix: 「画像が1枚のみのメディアリストの高さ」を「デフォルト」以外に設定していると、CWの中などに添付された画像が見られないバグを修正
|
||||||
|
- Fix: DeepL TranslationのPro accountトグルスイッチが表示されていなかったのを修正
|
||||||
|
- Fix: twitterの埋め込みカード内リンクからリンク先を開けない問題を修正
|
||||||
|
- Fix: WebKitブラウザー上でも「デバイスの画面を常にオンにする」機能が効くように
|
||||||
|
- Fix: ページ一覧ページの表示がモバイル環境において崩れているのを修正
|
||||||
|
- Fix: MFMでルビの中のテキストがnyaizeされない問題を修正
|
||||||
|
|
||||||
### Server
|
### Server
|
||||||
- Enhance: MFM `$[ruby ]` が他ソフトウェアと連合されるように
|
- Enhance: MFM `$[ruby ]` が他ソフトウェアと連合されるように
|
||||||
- Enhance: Meilisearchを有効にした検索で、ユーザーのミュートやブロックを考慮するように
|
- Enhance: Meilisearchを有効にした検索で、ユーザーのミュートやブロックを考慮するように
|
||||||
|
- Enhance: カスタム絵文字のインポート時の動作を改善
|
||||||
- Fix: 時間経過により無効化されたアンテナを再有効化したとき、サーバ再起動までその状況が反映されないのを修正 #12303
|
- Fix: 時間経過により無効化されたアンテナを再有効化したとき、サーバ再起動までその状況が反映されないのを修正 #12303
|
||||||
- Fix: ロールタイムラインが保存されない問題を修正
|
- Fix: ロールタイムラインが保存されない問題を修正
|
||||||
- Fix: api.jsonの生成ロジックを改善 #12402
|
- Fix: api.jsonの生成ロジックを改善 #12402
|
||||||
|
@ -85,6 +111,9 @@
|
||||||
- Fix: 「みつける」が年越し時に壊れる問題を修正
|
- Fix: 「みつける」が年越し時に壊れる問題を修正
|
||||||
- Fix: アカウントをブロックした際に、自身のユーザーのページでノートが相手に表示される問題を修正
|
- Fix: アカウントをブロックした際に、自身のユーザーのページでノートが相手に表示される問題を修正
|
||||||
- Fix: モデレーションログがモデレーターは閲覧できないように修正
|
- Fix: モデレーションログがモデレーターは閲覧できないように修正
|
||||||
|
- Fix: ハッシュタグのトレンド除外設定が即時に効果を持つように修正
|
||||||
|
- Fix: HTTP Digestヘッダのアルゴリズム部分に大文字の"SHA-256"しか使えない
|
||||||
|
- Fix: 管理者用APIのアクセス権限が適切に設定されていない問題を修正
|
||||||
|
|
||||||
## 2023.11.1
|
## 2023.11.1
|
||||||
|
|
||||||
|
@ -104,7 +133,6 @@
|
||||||
- 例: `$[unixtime 1701356400]`
|
- 例: `$[unixtime 1701356400]`
|
||||||
- Enhance: プラグインでエラーが発生した場合のハンドリングを強化
|
- Enhance: プラグインでエラーが発生した場合のハンドリングを強化
|
||||||
- Enhance: 細かなUIのブラッシュアップ
|
- Enhance: 細かなUIのブラッシュアップ
|
||||||
- Enhance: サウンド設定に「サウンドを出力しない」と「Misskeyがアクティブな時のみサウンドを出力する」を追加
|
|
||||||
- Fix: 効果音が再生されるとデバイスで再生している動画や音声が停止する問題を修正 #12339
|
- Fix: 効果音が再生されるとデバイスで再生している動画や音声が停止する問題を修正 #12339
|
||||||
- Fix: デッキに表示されたチャンネルの表示先チャンネルを切り替えた際、即座に反映されない問題を修正 #12236
|
- Fix: デッキに表示されたチャンネルの表示先チャンネルを切り替えた際、即座に反映されない問題を修正 #12236
|
||||||
- Fix: プラグインでノートの表示を書き換えられない問題を修正
|
- Fix: プラグインでノートの表示を書き換えられない問題を修正
|
||||||
|
@ -132,7 +160,7 @@
|
||||||
### General
|
### General
|
||||||
- Feat: アイコンデコレーション機能
|
- Feat: アイコンデコレーション機能
|
||||||
- サーバーで用意された画像をアイコンに重ねることができます
|
- サーバーで用意された画像をアイコンに重ねることができます
|
||||||
- 画像のテンプレートはこちらです: https://misskey-hub.net/avatar-decoration-template.png
|
- 画像のテンプレートはこちらです: https://misskey-hub.net/brand-assets/
|
||||||
- 最大でも黄色いエリア内にデコレーションを収めることを推奨します。
|
- 最大でも黄色いエリア内にデコレーションを収めることを推奨します。
|
||||||
- 画像は512x512pxを推奨します。
|
- 画像は512x512pxを推奨します。
|
||||||
- Feat: チャンネル設定にリノート/引用リノートの可否を設定できる項目を追加
|
- Feat: チャンネル設定にリノート/引用リノートの可否を設定できる項目を追加
|
||||||
|
@ -149,7 +177,7 @@
|
||||||
### Client
|
### Client
|
||||||
- Feat: プラグイン・テーマを外部サイトから直接インストールできるようになりました
|
- Feat: プラグイン・テーマを外部サイトから直接インストールできるようになりました
|
||||||
- 外部サイトでの実装が必要です。詳細は Misskey Hub をご覧ください
|
- 外部サイトでの実装が必要です。詳細は Misskey Hub をご覧ください
|
||||||
https://misskey-hub.net/docs/advanced/publish-on-your-website.html
|
https://misskey-hub.net/docs/for-developers/publish-on-your-website/
|
||||||
- Feat: 通知をグルーピングして表示するオプション(オプトアウト)
|
- Feat: 通知をグルーピングして表示するオプション(オプトアウト)
|
||||||
- Feat: Misskeyの基本的なチュートリアルを実装
|
- Feat: Misskeyの基本的なチュートリアルを実装
|
||||||
- Feat: スワイプしてタイムラインを再読込できるように
|
- Feat: スワイプしてタイムラインを再読込できるように
|
||||||
|
|
30
README.md
30
README.md
|
@ -1,15 +1,15 @@
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<a href="https://misskey-hub.net">
|
<a href="https://misskey-hub.net">
|
||||||
<img src="./assets/title_float.svg" alt="Misskey logo" style="border-radius:50%" width="400"/>
|
<img src="./assets/title_float.svg" alt="Misskey logo" style="border-radius:50%" width="400"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
**🌎 **[Misskey](https://misskey-hub.net/)** is an open source, decentralized social media platform that's free forever! 🚀**
|
**🌎 **[Misskey](https://misskey-hub.net/)** is an open source, decentralized social media platform that's free forever! 🚀**
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
# 当フォークについて
|
# 当フォークについて
|
||||||
|
|
||||||
当フォークは PrisMisskey.space で使用しているフォークになります。
|
当フォークは PrisMisskey.space で使用しているフォークになります。
|
||||||
このコードを一部でも使用する場合はクレジット表示をお願いします。
|
このコードを一部でも使用する場合はクレジット表示をお願いします。
|
||||||
|
|
|
@ -27,7 +27,7 @@ spec:
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 3000
|
- containerPort: 3000
|
||||||
- name: postgres
|
- name: postgres
|
||||||
image: postgres:14-alpine
|
image: postgres:15-alpine
|
||||||
env:
|
env:
|
||||||
- name: POSTGRES_USER
|
- name: POSTGRES_USER
|
||||||
value: "example-misskey-user"
|
value: "example-misskey-user"
|
||||||
|
@ -38,7 +38,7 @@ spec:
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 5432
|
- containerPort: 5432
|
||||||
- name: redis
|
- name: redis
|
||||||
image: redis:alpine
|
image: redis:7-alpine
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 6379
|
- containerPort: 6379
|
||||||
volumes:
|
volumes:
|
||||||
|
|
|
@ -120,7 +120,6 @@ sensitive: "محتوى حساس"
|
||||||
add: "إضافة"
|
add: "إضافة"
|
||||||
reaction: "التفاعلات"
|
reaction: "التفاعلات"
|
||||||
reactions: "التفاعلات"
|
reactions: "التفاعلات"
|
||||||
reactionSetting: "التفاعلات المراد عرضها في منتقي التفاعلات."
|
|
||||||
reactionSettingDescription2: "اسحب لترتيب ، انقر للحذف ، استخدم \"+\" للإضافة."
|
reactionSettingDescription2: "اسحب لترتيب ، انقر للحذف ، استخدم \"+\" للإضافة."
|
||||||
rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات"
|
rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات"
|
||||||
attachCancel: "أزل المرفق"
|
attachCancel: "أزل المرفق"
|
||||||
|
@ -817,8 +816,6 @@ makeReactionsPublicDescription: "هذا سيجعل قائمة تفاعلاتك
|
||||||
classic: "تقليدي"
|
classic: "تقليدي"
|
||||||
muteThread: "اكتم النقاش"
|
muteThread: "اكتم النقاش"
|
||||||
unmuteThread: "ارفع الكتم عن النقاش"
|
unmuteThread: "ارفع الكتم عن النقاش"
|
||||||
ffVisibility: "مرئية المتابِعين/المتابَعين"
|
|
||||||
ffVisibilityDescription: "يسمح لك بتحديد من يمكنهم رؤية متابِعيك ومتابَعيك."
|
|
||||||
continueThread: "اعرض بقية النقاش"
|
continueThread: "اعرض بقية النقاش"
|
||||||
deleteAccountConfirm: "سيحذف حسابك نهائيًا، أتريد المتابعة؟"
|
deleteAccountConfirm: "سيحذف حسابك نهائيًا، أتريد المتابعة؟"
|
||||||
incorrectPassword: "كلمة السر خاطئة."
|
incorrectPassword: "كلمة السر خاطئة."
|
||||||
|
@ -947,9 +944,12 @@ rolesAssignedToMe: "الأدوار المسندة إلي"
|
||||||
resetPasswordConfirm: "هل تريد إعادة تعيين كلمة السر؟"
|
resetPasswordConfirm: "هل تريد إعادة تعيين كلمة السر؟"
|
||||||
license: "الرخصة"
|
license: "الرخصة"
|
||||||
unfavoriteConfirm: "أتريد إزالتها من المفضلة؟"
|
unfavoriteConfirm: "أتريد إزالتها من المفضلة؟"
|
||||||
|
reactionsDisplaySize: "حجم التفاعلات"
|
||||||
|
limitWidthOfReaction: "تصغير حجم التفاعلات"
|
||||||
noteIdOrUrl: "معرف الملاحظة أو رابطها"
|
noteIdOrUrl: "معرف الملاحظة أو رابطها"
|
||||||
video: "فيديو"
|
video: "فيديو"
|
||||||
videos: "فيديوهات"
|
videos: "فيديوهات"
|
||||||
|
dataSaver: "موفر البيانات"
|
||||||
accountMigration: "ترحيل الحساب"
|
accountMigration: "ترحيل الحساب"
|
||||||
accountMoved: "نقل هذا المستخدم حسابه:"
|
accountMoved: "نقل هذا المستخدم حسابه:"
|
||||||
accountMovedShort: "رُحل هذا الحساب."
|
accountMovedShort: "رُحل هذا الحساب."
|
||||||
|
@ -957,6 +957,7 @@ operationForbidden: "عملية ممنوعة"
|
||||||
forceShowAds: "أظهر الإعلانات التجارية دائما"
|
forceShowAds: "أظهر الإعلانات التجارية دائما"
|
||||||
reactionsList: "التفاعلات"
|
reactionsList: "التفاعلات"
|
||||||
renotesList: "إعادات النشر"
|
renotesList: "إعادات النشر"
|
||||||
|
notificationDisplay: "إشعارات"
|
||||||
leftTop: "أعلى اليسار"
|
leftTop: "أعلى اليسار"
|
||||||
rightTop: "أعلى اليمين"
|
rightTop: "أعلى اليمين"
|
||||||
leftBottom: "أسفل اليسار"
|
leftBottom: "أسفل اليسار"
|
||||||
|
@ -979,6 +980,7 @@ thisChannelArchived: "أُرشفت هذه القناة."
|
||||||
displayOfNote: "عرض الملاحظة"
|
displayOfNote: "عرض الملاحظة"
|
||||||
initialAccountSetting: "إعداد الملف الشخصي"
|
initialAccountSetting: "إعداد الملف الشخصي"
|
||||||
youFollowing: "متابَع"
|
youFollowing: "متابَع"
|
||||||
|
preventAiLearning: "منع استخدام البيانات في تعليم الآلة"
|
||||||
options: "خيارات"
|
options: "خيارات"
|
||||||
specifyUser: "مستخدم محدد"
|
specifyUser: "مستخدم محدد"
|
||||||
failedToPreviewUrl: "تتعذر المعاينة"
|
failedToPreviewUrl: "تتعذر المعاينة"
|
||||||
|
@ -992,7 +994,16 @@ later: "لاحقاً"
|
||||||
goToMisskey: "لميسكي"
|
goToMisskey: "لميسكي"
|
||||||
additionalEmojiDictionary: "قواميس إيموجي إضافية"
|
additionalEmojiDictionary: "قواميس إيموجي إضافية"
|
||||||
installed: "مُثبت"
|
installed: "مُثبت"
|
||||||
|
enableServerMachineStats: "نشر إحصائيات عتاد الخادم"
|
||||||
|
turnOffToImprovePerformance: "تفعيله قد يزيد الأداء."
|
||||||
|
createInviteCode: "ولِّد دعوة"
|
||||||
|
inviteCodeCreated: "ولِّدت دعوة"
|
||||||
|
inviteLimitExceeded: "وصلتَ لحد عدد الدعوات المسموح لك توليدها."
|
||||||
|
createLimitRemaining: "حد عدد الدعوات: {limit} دعوة"
|
||||||
expirationDate: "تاريخ انتهاء الصلاحية"
|
expirationDate: "تاريخ انتهاء الصلاحية"
|
||||||
|
noExpirationDate: "لا نهاية لصلاحيتها"
|
||||||
|
inviteCodeUsedAt: "اُستخدم رمز الدعوة في"
|
||||||
|
registeredUserUsingInviteCode: "اِستخدم رمز الدعوة"
|
||||||
unused: "غير مستعمَل"
|
unused: "غير مستعمَل"
|
||||||
expired: "منتهية صلاحيته"
|
expired: "منتهية صلاحيته"
|
||||||
icon: "الصورة الرمزية"
|
icon: "الصورة الرمزية"
|
||||||
|
@ -1549,3 +1560,4 @@ _webhookSettings:
|
||||||
_moderationLogTypes:
|
_moderationLogTypes:
|
||||||
suspend: "علِق"
|
suspend: "علِق"
|
||||||
resetPassword: "أعد تعيين كلمتك السرية"
|
resetPassword: "أعد تعيين كلمتك السرية"
|
||||||
|
createInvitation: "ولِّد دعوة"
|
||||||
|
|
|
@ -108,7 +108,6 @@ sensitive: "সংবেদনশীল বিষয়বস্তু"
|
||||||
add: "যুক্ত করুন"
|
add: "যুক্ত করুন"
|
||||||
reaction: "প্রতিক্রিয়া"
|
reaction: "প্রতিক্রিয়া"
|
||||||
reactions: "প্রতিক্রিয়া"
|
reactions: "প্রতিক্রিয়া"
|
||||||
reactionSetting: "রিঅ্যাকশন পিকারে যেসকল প্রতিক্রিয়া দেখানো হবে"
|
|
||||||
reactionSettingDescription2: "পুনরায় সাজাতে টেনে আনুন, মুছতে ক্লিক করুন, যোগ করতে + টিপুন।"
|
reactionSettingDescription2: "পুনরায় সাজাতে টেনে আনুন, মুছতে ক্লিক করুন, যোগ করতে + টিপুন।"
|
||||||
rememberNoteVisibility: "নোটের দৃশ্যমান্যতার সেটিংস মনে রাখুন"
|
rememberNoteVisibility: "নোটের দৃশ্যমান্যতার সেটিংস মনে রাখুন"
|
||||||
attachCancel: "অ্যাটাচমেন্ট সরান "
|
attachCancel: "অ্যাটাচমেন্ট সরান "
|
||||||
|
@ -794,8 +793,6 @@ makeReactionsPublicDescription: "আপনার পূর্ববর্তী
|
||||||
classic: "ক্লাসিক"
|
classic: "ক্লাসিক"
|
||||||
muteThread: "থ্রেড মিউট করুন"
|
muteThread: "থ্রেড মিউট করুন"
|
||||||
unmuteThread: "থ্রেড আনমিউট করুন"
|
unmuteThread: "থ্রেড আনমিউট করুন"
|
||||||
ffVisibility: "অনুসরণ/অনুসরণকারীদের দৃশ্যমান্যতা"
|
|
||||||
ffVisibilityDescription: "আপনি কাকে অনুসরণ করেন এবং কে আপনাকে অনুসরণ করে, সেটা কারা দেখতে পাবে তা নির্ধারণ করে।"
|
|
||||||
continueThread: "আরো থ্রেড দেখুন"
|
continueThread: "আরো থ্রেড দেখুন"
|
||||||
deleteAccountConfirm: "আপনার অ্যাকাউন্ট মুছে ফেলা হবে। ঠিক আছে?"
|
deleteAccountConfirm: "আপনার অ্যাকাউন্ট মুছে ফেলা হবে। ঠিক আছে?"
|
||||||
incorrectPassword: "আপনার দেওয়া পাসওয়ার্ডটি ভুল।"
|
incorrectPassword: "আপনার দেওয়া পাসওয়ার্ডটি ভুল।"
|
||||||
|
|
|
@ -121,7 +121,12 @@ sensitive: "NSFW"
|
||||||
add: "Afegir"
|
add: "Afegir"
|
||||||
reaction: "Reaccions"
|
reaction: "Reaccions"
|
||||||
reactions: "Reaccions"
|
reactions: "Reaccions"
|
||||||
reactionSetting: "Reaccions a mostrar al selector de reaccions"
|
emojiPicker: "Selecció d'emojis"
|
||||||
|
pinnedEmojisForReactionSettingDescription: "Selecciona l'emoji amb el qual reaccionar"
|
||||||
|
pinnedEmojisSettingDescription: "Selecciona l'emoji amb el qual reaccionar"
|
||||||
|
emojiPickerDisplay: "Visualitza el selector d'emojis"
|
||||||
|
overwriteFromPinnedEmojisForReaction: "Reemplaça els emojis de la reacció"
|
||||||
|
overwriteFromPinnedEmojis: "Sobreescriu des dels emojis fixats"
|
||||||
reactionSettingDescription2: "Arrossega per reordenar, fes clic per suprimir, prem \"+\" per afegir."
|
reactionSettingDescription2: "Arrossega per reordenar, fes clic per suprimir, prem \"+\" per afegir."
|
||||||
rememberNoteVisibility: "Recorda la configuració de visibilitat de les notes"
|
rememberNoteVisibility: "Recorda la configuració de visibilitat de les notes"
|
||||||
attachCancel: "Eliminar el fitxer adjunt"
|
attachCancel: "Eliminar el fitxer adjunt"
|
||||||
|
@ -214,6 +219,9 @@ clearQueueConfirmText: "Les notes no lliurades que quedin a la cua no es federar
|
||||||
clearCachedFiles: "Esborra la memòria cau"
|
clearCachedFiles: "Esborra la memòria cau"
|
||||||
clearCachedFilesConfirm: "Segur que voleu eliminar tots els fitxers de la memòria cau?"
|
clearCachedFilesConfirm: "Segur que voleu eliminar tots els fitxers de la memòria cau?"
|
||||||
blockedInstances: "Instàncies bloquejades"
|
blockedInstances: "Instàncies bloquejades"
|
||||||
|
blockedInstancesDescription: "Llista els enllaços d'amfitrió de les instàncies que vols bloquejar separades per un salt de pàgina. Les instàncies llistades no podran comunicar-se amb aquesta instància."
|
||||||
|
silencedInstances: "Instàncies silenciades"
|
||||||
|
silencedInstancesDescription: "Llista els enllaços d'amfitrió de les instàncies que vols silenciar. Tots els comptes de les instàncies llistades s'establiran com silenciades i només podran fer sol·licitacions de seguiment, i no podran mencionar als comptes locals si no els segueixen. Això no afectarà les instàncies bloquejades."
|
||||||
muteAndBlock: "Silencia i bloca"
|
muteAndBlock: "Silencia i bloca"
|
||||||
mutedUsers: "Usuaris silenciats"
|
mutedUsers: "Usuaris silenciats"
|
||||||
blockedUsers: "Usuaris bloquejats"
|
blockedUsers: "Usuaris bloquejats"
|
||||||
|
@ -228,9 +236,12 @@ preview: "Vista prèvia"
|
||||||
default: "Per defecte"
|
default: "Per defecte"
|
||||||
defaultValueIs: "Per defecte: {value}"
|
defaultValueIs: "Per defecte: {value}"
|
||||||
noCustomEmojis: "Cap emoji personalitzat"
|
noCustomEmojis: "Cap emoji personalitzat"
|
||||||
|
noJobs: "No hi ha feines"
|
||||||
federating: "Federant"
|
federating: "Federant"
|
||||||
blocked: "Bloquejat"
|
blocked: "Bloquejat"
|
||||||
suspended: "Suspés"
|
suspended: "Suspés"
|
||||||
|
all: "tot"
|
||||||
|
subscribing: "Subscrit a"
|
||||||
publishing: "S'està publicant"
|
publishing: "S'està publicant"
|
||||||
notResponding: "Sense resposta"
|
notResponding: "Sense resposta"
|
||||||
instanceFollowing: "Seguits del servidor"
|
instanceFollowing: "Seguits del servidor"
|
||||||
|
@ -255,11 +266,31 @@ removed: "Eliminat"
|
||||||
removeAreYouSure: "Segur que voleu retirar «{x}»?"
|
removeAreYouSure: "Segur que voleu retirar «{x}»?"
|
||||||
deleteAreYouSure: "Segur que voleu retirar «{x}»?"
|
deleteAreYouSure: "Segur que voleu retirar «{x}»?"
|
||||||
resetAreYouSure: "Segur que voleu restablir-ho?"
|
resetAreYouSure: "Segur que voleu restablir-ho?"
|
||||||
|
areYouSure: "Està segur?"
|
||||||
saved: "S'ha desat"
|
saved: "S'ha desat"
|
||||||
messaging: "Xat"
|
messaging: "Xat"
|
||||||
upload: "Puja"
|
upload: "Puja"
|
||||||
|
keepOriginalUploading: "Guarda la imatge original"
|
||||||
|
keepOriginalUploadingDescription: "Guarda la imatge pujada com hi és. Si està apagat, una versió per a la visualització a la xarxa serà generada quan sigui pujada."
|
||||||
|
fromDrive: "Des de la unitat"
|
||||||
|
fromUrl: "Des d'un enllaç"
|
||||||
|
uploadFromUrl: "Carrega des d'un enllaç"
|
||||||
|
uploadFromUrlDescription: "Enllaç del fitxer que vols carregar"
|
||||||
|
uploadFromUrlRequested: "Càrrega sol·licitada"
|
||||||
|
uploadFromUrlMayTakeTime: "La càrrega des de l'enllaç pot prendre un temps"
|
||||||
|
explore: "Explora"
|
||||||
|
messageRead: "Vist"
|
||||||
|
noMoreHistory: "No hi resta més per veure"
|
||||||
|
startMessaging: "Començar a xatejar"
|
||||||
|
nUsersRead: "Vist per {n}"
|
||||||
|
agreeTo: "Accepto que {0}"
|
||||||
|
agree: "Hi estic d'acord"
|
||||||
|
agreeBelow: "Hi estic d'acord amb el següent"
|
||||||
|
basicNotesBeforeCreateAccount: "Notes importants"
|
||||||
|
termsOfService: "Condicions d'ús"
|
||||||
start: "Comença"
|
start: "Comença"
|
||||||
home: "Inici"
|
home: "Inici"
|
||||||
|
remoteUserCaution: "Ja que aquest usuari resideix a una instància remota, la informació mostrada es podria trobar incompleta."
|
||||||
activity: "Activitat"
|
activity: "Activitat"
|
||||||
images: "Imatges"
|
images: "Imatges"
|
||||||
image: "Imatges"
|
image: "Imatges"
|
||||||
|
@ -275,16 +306,34 @@ dark: "Fosc"
|
||||||
lightThemes: "Temes clars"
|
lightThemes: "Temes clars"
|
||||||
darkThemes: "Temes foscos"
|
darkThemes: "Temes foscos"
|
||||||
syncDeviceDarkMode: "Sincronitza el mode fosc amb la configuració del dispositiu"
|
syncDeviceDarkMode: "Sincronitza el mode fosc amb la configuració del dispositiu"
|
||||||
|
drive: "Unitat"
|
||||||
|
fileName: "Nom del Fitxer"
|
||||||
|
selectFile: "Selecciona fitxers"
|
||||||
|
selectFiles: "Selecciona fitxers"
|
||||||
|
selectFolder: "Selecció de carpeta"
|
||||||
|
selectFolders: "Selecció de carpeta"
|
||||||
renameFile: "Canvia el nom del fitxer"
|
renameFile: "Canvia el nom del fitxer"
|
||||||
folderName: "Nom de la carpeta"
|
folderName: "Nom de la carpeta"
|
||||||
createFolder: "Crea una carpeta"
|
createFolder: "Crea una carpeta"
|
||||||
renameFolder: "Canvia el nom de la carpeta"
|
renameFolder: "Canvia el nom de la carpeta"
|
||||||
deleteFolder: "Elimina la carpeta"
|
deleteFolder: "Elimina la carpeta"
|
||||||
|
folder: "Carpeta "
|
||||||
addFile: "Afegeix un fitxer"
|
addFile: "Afegeix un fitxer"
|
||||||
|
emptyDrive: "La teva unitat és buida"
|
||||||
emptyFolder: "La carpeta està buida"
|
emptyFolder: "La carpeta està buida"
|
||||||
unableToDelete: "No es pot eliminar"
|
unableToDelete: "No es pot eliminar"
|
||||||
|
inputNewFileName: "Introduïu el nom de fitxer nou"
|
||||||
|
inputNewDescription: "Inserta una nova llegenda"
|
||||||
|
inputNewFolderName: "Introduïu el nom de la carpeta nova"
|
||||||
|
circularReferenceFolder: "La carpeta destinatària és una subcarpeta de la carpeta a la qual la desitges moure"
|
||||||
|
hasChildFilesOrFolders: "No és possible esborrar aquesta carpeta ja que no és buida"
|
||||||
copyUrl: "Copia l'URL"
|
copyUrl: "Copia l'URL"
|
||||||
rename: "Canvia el nom"
|
rename: "Canvia el nom"
|
||||||
|
avatar: "Icona"
|
||||||
|
banner: "Bàner"
|
||||||
|
displayOfSensitiveMedia: "Visualització de contingut sensible"
|
||||||
|
whenServerDisconnected: "Quan es perdi la connexió al servidor"
|
||||||
|
disconnectedFromServer: "Desconnectat pel servidor"
|
||||||
reload: "Actualitza"
|
reload: "Actualitza"
|
||||||
doNothing: "Ignora"
|
doNothing: "Ignora"
|
||||||
accept: "Accepta"
|
accept: "Accepta"
|
||||||
|
@ -354,33 +403,132 @@ notFound: "No s'ha trobat"
|
||||||
markAsReadAllUnreadNotes: "Marca-ho tot com a llegit"
|
markAsReadAllUnreadNotes: "Marca-ho tot com a llegit"
|
||||||
help: "Ajuda"
|
help: "Ajuda"
|
||||||
invites: "Convida"
|
invites: "Convida"
|
||||||
|
title: "Títol"
|
||||||
|
text: "Text"
|
||||||
|
enable: "Habilita"
|
||||||
next: "Següent"
|
next: "Següent"
|
||||||
|
retype: "Torneu a introduir-la"
|
||||||
noteOf: "Publicació de: {user}"
|
noteOf: "Publicació de: {user}"
|
||||||
|
quoteAttached: "Frase adjunta"
|
||||||
|
quoteQuestion: "Vols annexar-la com a cita?"
|
||||||
|
noMessagesYet: "Encara no hi ha missatges"
|
||||||
|
newMessageExists: "Has rebut un nou missatge"
|
||||||
|
onlyOneFileCanBeAttached: "Només pots adjuntar un fitxer a un missatge"
|
||||||
|
signinRequired: "Si us plau, Registra't o inicia la sessió abans de continuar"
|
||||||
invitations: "Convida"
|
invitations: "Convida"
|
||||||
|
invitationCode: "Codi d'invitació"
|
||||||
|
checking: "Comprovació en curs..."
|
||||||
|
available: "Disponible"
|
||||||
|
unavailable: "No és disponible"
|
||||||
|
usernameInvalidFormat: "Pots fer servir lletres (majúscules i minúscules), números i barres baixes (\"_\")"
|
||||||
|
tooShort: "Massa curt"
|
||||||
|
tooLong: "Massa llarg"
|
||||||
|
weakPassword: "Contrasenya insegura"
|
||||||
|
normalPassword: "Bona contrasenya"
|
||||||
|
strongPassword: "Contrasenya segura"
|
||||||
|
passwordMatched: "Correcte!"
|
||||||
|
passwordNotMatched: "No coincideix"
|
||||||
|
signinWith: "Inicia sessió amb amb {x}"
|
||||||
|
signinFailed: "Autenticació sense èxit. Intenta-ho un altre cop utilitzant la contrasenya i el nom correctes."
|
||||||
|
or: "O"
|
||||||
|
language: "Idioma"
|
||||||
|
uiLanguage: "Idioma de l'interfície"
|
||||||
|
aboutX: "Respecte a {x}"
|
||||||
|
emojiStyle: "Estil d'emoji"
|
||||||
|
native: "Nadiu"
|
||||||
|
disableDrawer: "No mostrar els menús en calaixos"
|
||||||
|
showNoteActionsOnlyHover: "Només mostra accions de la nota en passar amb el cursor"
|
||||||
|
noHistory: "No hi ha un registre previ"
|
||||||
|
signinHistory: "Historial d'autenticacions"
|
||||||
|
enableAdvancedMfm: "Habilitar l'MFM avançat"
|
||||||
|
enableAnimatedMfm: "Habilitar l'MFM amb moviment"
|
||||||
|
doing: "Processant..."
|
||||||
|
category: "Categoria"
|
||||||
tags: "Etiquetes"
|
tags: "Etiquetes"
|
||||||
docSource: "Font del document"
|
docSource: "Font del document"
|
||||||
createAccount: "Crea un compte"
|
createAccount: "Crea un compte"
|
||||||
existingAccount: "Compte existent"
|
existingAccount: "Compte existent"
|
||||||
regenerate: "Regenera"
|
regenerate: "Regenera"
|
||||||
fontSize: "Mida del text"
|
fontSize: "Mida del text"
|
||||||
|
mediaListWithOneImageAppearance: "Altura de la llista de fitxers amb una única imatge"
|
||||||
|
limitTo: "Limita a {x}"
|
||||||
noFollowRequests: "No tens sol·licituds de seguiment"
|
noFollowRequests: "No tens sol·licituds de seguiment"
|
||||||
|
openImageInNewTab: "Obre imatges a una nova pestanya"
|
||||||
dashboard: "Panell de control"
|
dashboard: "Panell de control"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
remote: "Remot"
|
remote: "Remot"
|
||||||
total: "Total"
|
total: "Total"
|
||||||
|
weekOverWeekChanges: "Canvis l'última setmana"
|
||||||
|
dayOverDayChanges: "Canvis ahir"
|
||||||
appearance: "Aparença"
|
appearance: "Aparença"
|
||||||
clientSettings: "Configuració del client"
|
clientSettings: "Configuració del client"
|
||||||
accountSettings: "Configuració del compte"
|
accountSettings: "Configuració del compte"
|
||||||
|
promotion: "Promocionat"
|
||||||
|
promote: "Promoure"
|
||||||
|
numberOfDays: "Nombre de dies"
|
||||||
hideThisNote: "Amaga la publicació"
|
hideThisNote: "Amaga la publicació"
|
||||||
showFeaturedNotesInTimeline: "Mostra publicacions destacades en la línia de temps"
|
showFeaturedNotesInTimeline: "Mostra publicacions destacades en la línia de temps"
|
||||||
|
objectStorage: "Emmagatzematge d'objectes\n"
|
||||||
|
useObjectStorage: "Utilitzar l'emmagatzematge d'objectes"
|
||||||
|
objectStorageBaseUrl: "Base d'enllaç"
|
||||||
|
objectStorageBaseUrlDesc: "Prefix d'enllaç utilitzat per a fer referencia als fitxers. Especifica l'enllaç del teu CDN o Proxy si n'estàs utilitzant qualsevol, en cas contrari, especifica l'enllaç al que es pot accedir públicament segons la guia de servei que vosté utilitza.\nPer l'ús d'S3 utilitza 'https://<bucket>.s3.amazonaws.com' I per a GCS o serveis equivalents utilitza 'https://storage.googleapis.com/<bucket>'."
|
||||||
newNoteRecived: "Hi ha publicacions noves"
|
newNoteRecived: "Hi ha publicacions noves"
|
||||||
installedDate: "Data d'instal·lació"
|
installedDate: "Data d'instal·lació"
|
||||||
state: "Estat"
|
state: "Estat"
|
||||||
sort: "Ordena"
|
sort: "Ordena"
|
||||||
ascendingOrder: "Ascendent"
|
ascendingOrder: "Ascendent"
|
||||||
descendingOrder: "Descendent"
|
descendingOrder: "Descendent"
|
||||||
|
removeAllFollowing: "Deixar de seguir tots els usuaris seguits"
|
||||||
|
removeAllFollowingDescription: "El fet d'executar això, et farà deixar de seguir a tots els usuaris de {host}. Si us plau, executa això si l'amfitrió, per exemple, ja no existeix."
|
||||||
|
userSuspended: "Aquest usuari ha sigut suspès"
|
||||||
|
userSilenced: "Aquest usuari està sent silenciat"
|
||||||
|
yourAccountSuspendedTitle: "Aquest compte és suspès"
|
||||||
|
yourAccountSuspendedDescription: "Aquest compte ha sigut suspès a causa de la violació de les condicions d'ús o similars. Contacta l'administrador si en vol saber més. Si us plau, no en faci un altre compte."
|
||||||
|
tokenRevoked: "Codi de seguretat no vàlid"
|
||||||
|
tokenRevokedDescription: "La petició més recent ha estat denegada perquè contenia un codi de seguretat no vàlid. Actualitza la pàgina i torna-ho a provar."
|
||||||
|
accountDeleted: "Compte eliminat amb èxit"
|
||||||
|
accountDeletedDescription: "Aquest compte ha sigut eliminat"
|
||||||
|
menu: "Menú"
|
||||||
|
divider: "Divisor"
|
||||||
|
addItem: "Afegir element"
|
||||||
|
rearrange: "Torna a ordenar"
|
||||||
|
relays: "Relés"
|
||||||
|
addRelay: "Afegeix relés"
|
||||||
|
inboxUrl: "Enllaç de la safata d'entrada"
|
||||||
|
addedRelays: "Relés afegits"
|
||||||
|
serviceworkerInfo: "És obligatòria l'activació per a obtenir notificacions push"
|
||||||
deletedNote: "Publicacions eliminades"
|
deletedNote: "Publicacions eliminades"
|
||||||
invisibleNote: "Publicacions amagades"
|
invisibleNote: "Publicacions amagades"
|
||||||
|
enableInfiniteScroll: "Carrega més automàticament\n"
|
||||||
|
visibility: "Visibilitat"
|
||||||
|
poll: "Enquesta"
|
||||||
|
useCw: "Amaga el contingut"
|
||||||
|
enablePlayer: "Obre el reproductor de vídeo"
|
||||||
|
disablePlayer: "Tanca el reproductor de vídeo"
|
||||||
|
expandTweet: "Expandir post"
|
||||||
|
themeEditor: "Editor de temes"
|
||||||
|
description: "Descripció"
|
||||||
|
describeFile: "Afegir subtitulació"
|
||||||
|
enterFileDescription: "Afegeix un títol"
|
||||||
|
author: "Autor"
|
||||||
|
leaveConfirm: "Hi ha canvis sense guardar. Els vols descartar?"
|
||||||
|
manage: "Administració"
|
||||||
|
plugins: "Extensions"
|
||||||
|
preferencesBackups: "Configuracions de les Còpies de seguretat"
|
||||||
|
deck: "Escriptori"
|
||||||
|
undeck: "Tanca l'escriptori"
|
||||||
|
useBlurEffectForModal: "Utilitzar l'efecte de difuminació a modals"
|
||||||
|
useFullReactionPicker: "Utilitza el cercador de reaccions d'escala sencera"
|
||||||
|
width: "Amplada"
|
||||||
|
height: "Alçària"
|
||||||
|
large: "Gran"
|
||||||
|
medium: "Mitjà"
|
||||||
|
small: "Petit"
|
||||||
|
generateAccessToken: "Genera codi d'accés"
|
||||||
|
permission: "Permisos"
|
||||||
|
enableAll: "Habilita tot"
|
||||||
|
disableAll: "Deshabilita tot"
|
||||||
|
tokenRequested: "Donar accés al compte"
|
||||||
smtpHost: "Amfitrió"
|
smtpHost: "Amfitrió"
|
||||||
smtpUser: "Nom d'usuari"
|
smtpUser: "Nom d'usuari"
|
||||||
smtpPass: "Contrasenya"
|
smtpPass: "Contrasenya"
|
||||||
|
@ -390,12 +538,17 @@ clearCache: "Esborra la memòria cau"
|
||||||
showingPastTimeline: "Estàs veient una línia de temps antiga"
|
showingPastTimeline: "Estàs veient una línia de temps antiga"
|
||||||
info: "Informació"
|
info: "Informació"
|
||||||
user: "Usuaris"
|
user: "Usuaris"
|
||||||
|
administration: "Administració"
|
||||||
|
middle: "Mitjà"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
searchByGoogle: "Cercar"
|
searchByGoogle: "Cercar"
|
||||||
file: "Fitxers"
|
file: "Fitxers"
|
||||||
|
icon: "Icona"
|
||||||
replies: "Respondre"
|
replies: "Respondre"
|
||||||
renotes: "Impulsa"
|
renotes: "Impulsa"
|
||||||
_role:
|
_role:
|
||||||
|
_priority:
|
||||||
|
middle: "Mitjà"
|
||||||
_options:
|
_options:
|
||||||
antennaMax: "Nombre màxim d'antenes"
|
antennaMax: "Nombre màxim d'antenes"
|
||||||
_email:
|
_email:
|
||||||
|
@ -404,9 +557,11 @@ _email:
|
||||||
_instanceMute:
|
_instanceMute:
|
||||||
instanceMuteDescription: "Silencia tots els impulsos dels servidors seleccionats, també els usuaris que responen a altres d'un servidor silenciat."
|
instanceMuteDescription: "Silencia tots els impulsos dels servidors seleccionats, també els usuaris que responen a altres d'un servidor silenciat."
|
||||||
_theme:
|
_theme:
|
||||||
|
description: "Descripció"
|
||||||
keys:
|
keys:
|
||||||
mention: "Menció"
|
mention: "Menció"
|
||||||
renote: "Renotar"
|
renote: "Renotar"
|
||||||
|
divider: "Divisor"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Notes"
|
note: "Notes"
|
||||||
notification: "Notificacions"
|
notification: "Notificacions"
|
||||||
|
@ -448,6 +603,8 @@ _timelines:
|
||||||
local: "Local"
|
local: "Local"
|
||||||
social: "Social"
|
social: "Social"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
|
_play:
|
||||||
|
summary: "Descripció"
|
||||||
_pages:
|
_pages:
|
||||||
contents: "Contingut"
|
contents: "Contingut"
|
||||||
blocks:
|
blocks:
|
||||||
|
|
|
@ -120,7 +120,6 @@ sensitive: "NSFW"
|
||||||
add: "Přidat"
|
add: "Přidat"
|
||||||
reaction: "Reakce"
|
reaction: "Reakce"
|
||||||
reactions: "Reakce"
|
reactions: "Reakce"
|
||||||
reactionSetting: "Reakce zobrazené ve výběru reakcí"
|
|
||||||
reactionSettingDescription2: "Přetažením změníte pořadí, kliknutím smažete, zmáčkněte \"+\" k přidání"
|
reactionSettingDescription2: "Přetažením změníte pořadí, kliknutím smažete, zmáčkněte \"+\" k přidání"
|
||||||
rememberNoteVisibility: "Zapamatovat nastavení zobrazení poznámky"
|
rememberNoteVisibility: "Zapamatovat nastavení zobrazení poznámky"
|
||||||
attachCancel: "Odstranit přílohu"
|
attachCancel: "Odstranit přílohu"
|
||||||
|
@ -855,8 +854,6 @@ makeReactionsPublicDescription: "Tohle zviditelný seznam vašich předchozích
|
||||||
classic: "Klasický"
|
classic: "Klasický"
|
||||||
muteThread: "Ztlumit vlákno"
|
muteThread: "Ztlumit vlákno"
|
||||||
unmuteThread: "Zrušit ztlumení vlákna"
|
unmuteThread: "Zrušit ztlumení vlákna"
|
||||||
ffVisibility: "Viditelnost Sledovaných/Sledujících"
|
|
||||||
ffVisibilityDescription: "Umožní vám nastavit kdo uvidí koho sledujete a kdo vás sleduje."
|
|
||||||
continueThread: "Zobrazit pokračování vlákna"
|
continueThread: "Zobrazit pokračování vlákna"
|
||||||
deleteAccountConfirm: "Tohle nenávratně smaže váš účet, chcete pokračovat?"
|
deleteAccountConfirm: "Tohle nenávratně smaže váš účet, chcete pokračovat?"
|
||||||
incorrectPassword: "Nesprávné heslo."
|
incorrectPassword: "Nesprávné heslo."
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "Sensibel"
|
||||||
add: "Hinzufügen"
|
add: "Hinzufügen"
|
||||||
reaction: "Reaktionen"
|
reaction: "Reaktionen"
|
||||||
reactions: "Reaktionen"
|
reactions: "Reaktionen"
|
||||||
reactionSetting: "In der Reaktionsauswahl anzuzeigende Reaktionen"
|
|
||||||
reactionSettingDescription2: "Ziehe um Anzuordnen, klicke um zu löschen, drücke „+“ um hinzuzufügen"
|
reactionSettingDescription2: "Ziehe um Anzuordnen, klicke um zu löschen, drücke „+“ um hinzuzufügen"
|
||||||
rememberNoteVisibility: "Notizsichtbarkeit merken"
|
rememberNoteVisibility: "Notizsichtbarkeit merken"
|
||||||
attachCancel: "Anhang entfernen"
|
attachCancel: "Anhang entfernen"
|
||||||
|
@ -874,8 +873,6 @@ makeReactionsPublicDescription: "Jeder wird die Liste deiner gesendeten Reaktion
|
||||||
classic: "Classic"
|
classic: "Classic"
|
||||||
muteThread: "Thread stummschalten"
|
muteThread: "Thread stummschalten"
|
||||||
unmuteThread: "Threadstummschaltung aufheben"
|
unmuteThread: "Threadstummschaltung aufheben"
|
||||||
ffVisibility: "Sichtbarkeit von Gefolgten/Followern"
|
|
||||||
ffVisibilityDescription: "Konfiguriere wer sehen kann, wem du folgst sowie wer dir folgt."
|
|
||||||
continueThread: "Weiteren Threadverlauf anzeigen"
|
continueThread: "Weiteren Threadverlauf anzeigen"
|
||||||
deleteAccountConfirm: "Dein Benutzerkonto wird unwiderruflich gelöscht. Trotzdem fortfahren?"
|
deleteAccountConfirm: "Dein Benutzerkonto wird unwiderruflich gelöscht. Trotzdem fortfahren?"
|
||||||
incorrectPassword: "Falsches Passwort."
|
incorrectPassword: "Falsches Passwort."
|
||||||
|
|
|
@ -104,7 +104,6 @@ clickToShow: "Κάντε κλικ για εμφάνιση"
|
||||||
add: "Προσθέστε"
|
add: "Προσθέστε"
|
||||||
reaction: "Αντιδράσεις"
|
reaction: "Αντιδράσεις"
|
||||||
reactions: "Αντιδράσεις"
|
reactions: "Αντιδράσεις"
|
||||||
reactionSetting: "Αντιδράσεις για εμφάνιση στην επιλογή αντίδρασης"
|
|
||||||
reactionSettingDescription2: "Σύρετε για να αλλάξετε τη σειρά, κάντε κλικ για να διαγράψετε, πατήστε \"+\" για να προσθέσετε."
|
reactionSettingDescription2: "Σύρετε για να αλλάξετε τη σειρά, κάντε κλικ για να διαγράψετε, πατήστε \"+\" για να προσθέσετε."
|
||||||
rememberNoteVisibility: "Θυμήσου τις ρυθμίσεις ορατότητας σημειώματος"
|
rememberNoteVisibility: "Θυμήσου τις ρυθμίσεις ορατότητας σημειώματος"
|
||||||
attachCancel: "Διαγραφή αρχείου"
|
attachCancel: "Διαγραφή αρχείου"
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "Sensitive"
|
||||||
add: "Add"
|
add: "Add"
|
||||||
reaction: "Reactions"
|
reaction: "Reactions"
|
||||||
reactions: "Reactions"
|
reactions: "Reactions"
|
||||||
reactionSetting: "Reactions to show in the reaction picker"
|
|
||||||
reactionSettingDescription2: "Drag to reorder, click to delete, press \"+\" to add."
|
reactionSettingDescription2: "Drag to reorder, click to delete, press \"+\" to add."
|
||||||
rememberNoteVisibility: "Remember note visibility settings"
|
rememberNoteVisibility: "Remember note visibility settings"
|
||||||
attachCancel: "Remove attachment"
|
attachCancel: "Remove attachment"
|
||||||
|
@ -548,7 +547,7 @@ showInPage: "Show in page"
|
||||||
popout: "Pop-out"
|
popout: "Pop-out"
|
||||||
volume: "Volume"
|
volume: "Volume"
|
||||||
masterVolume: "Master volume"
|
masterVolume: "Master volume"
|
||||||
notUseSound: "No sounds output."
|
notUseSound: "Disable sound"
|
||||||
useSoundOnlyWhenActive: "Output sounds only if Misskey is active."
|
useSoundOnlyWhenActive: "Output sounds only if Misskey is active."
|
||||||
details: "Details"
|
details: "Details"
|
||||||
chooseEmoji: "Select an emoji"
|
chooseEmoji: "Select an emoji"
|
||||||
|
@ -879,8 +878,6 @@ makeReactionsPublicDescription: "This will make the list of all your past reacti
|
||||||
classic: "Classic"
|
classic: "Classic"
|
||||||
muteThread: "Mute thread"
|
muteThread: "Mute thread"
|
||||||
unmuteThread: "Unmute thread"
|
unmuteThread: "Unmute thread"
|
||||||
ffVisibility: "Follows/Followers Visibility"
|
|
||||||
ffVisibilityDescription: "Allows you to configure who can see who you follow and who follows you."
|
|
||||||
continueThread: "View thread continuation"
|
continueThread: "View thread continuation"
|
||||||
deleteAccountConfirm: "This will irreversibly delete your account. Proceed?"
|
deleteAccountConfirm: "This will irreversibly delete your account. Proceed?"
|
||||||
incorrectPassword: "Incorrect password."
|
incorrectPassword: "Incorrect password."
|
||||||
|
@ -1177,6 +1174,7 @@ cwNotationRequired: "If \"Hide content\" is enabled, a description must be provi
|
||||||
doReaction: "Add reaction"
|
doReaction: "Add reaction"
|
||||||
code: "Code"
|
code: "Code"
|
||||||
reloadRequiredToApplySettings: "Reloading is required to apply the settings."
|
reloadRequiredToApplySettings: "Reloading is required to apply the settings."
|
||||||
|
decorate: "Decorate"
|
||||||
_announcement:
|
_announcement:
|
||||||
forExistingUsers: "Existing users only"
|
forExistingUsers: "Existing users only"
|
||||||
forExistingUsersDescription: "This announcement will only be shown to users existing at the point of publishment if enabled. If disabled, those newly signing up after it has been posted will also see it."
|
forExistingUsersDescription: "This announcement will only be shown to users existing at the point of publishment if enabled. If disabled, those newly signing up after it has been posted will also see it."
|
||||||
|
@ -1266,7 +1264,7 @@ _initialTutorial:
|
||||||
sensitiveSucceeded: "When attaching files, please set sensitivities in accordance with the server guidelines."
|
sensitiveSucceeded: "When attaching files, please set sensitivities in accordance with the server guidelines."
|
||||||
doItToContinue: "Mark the attachment file as sensitive to proceed."
|
doItToContinue: "Mark the attachment file as sensitive to proceed."
|
||||||
_done:
|
_done:
|
||||||
title: "The tutorial is complete! 🎉"
|
title: "You've completed the tutorial! 🎉"
|
||||||
description: "The functions introduced here are just a small part. For a more detailed understanding of using Misskey, please refer to {link}."
|
description: "The functions introduced here are just a small part. For a more detailed understanding of using Misskey, please refer to {link}."
|
||||||
_timelineDescription:
|
_timelineDescription:
|
||||||
home: "In the Home timeline, you can see notes from accounts you follow."
|
home: "In the Home timeline, you can see notes from accounts you follow."
|
||||||
|
@ -2178,6 +2176,7 @@ _notification:
|
||||||
pollEnded: "Poll results have become available"
|
pollEnded: "Poll results have become available"
|
||||||
newNote: "New note"
|
newNote: "New note"
|
||||||
unreadAntennaNote: "Antenna {name}"
|
unreadAntennaNote: "Antenna {name}"
|
||||||
|
roleAssigned: "Role given"
|
||||||
emptyPushNotificationMessage: "Push notifications have been updated"
|
emptyPushNotificationMessage: "Push notifications have been updated"
|
||||||
achievementEarned: "Achievement unlocked"
|
achievementEarned: "Achievement unlocked"
|
||||||
testNotification: "Test notification"
|
testNotification: "Test notification"
|
||||||
|
@ -2199,6 +2198,7 @@ _notification:
|
||||||
pollEnded: "Polls ending"
|
pollEnded: "Polls ending"
|
||||||
receiveFollowRequest: "Received follow requests"
|
receiveFollowRequest: "Received follow requests"
|
||||||
followRequestAccepted: "Accepted follow requests"
|
followRequestAccepted: "Accepted follow requests"
|
||||||
|
roleAssigned: "Role given"
|
||||||
achievementEarned: "Achievement unlocked"
|
achievementEarned: "Achievement unlocked"
|
||||||
app: "Notifications from linked apps"
|
app: "Notifications from linked apps"
|
||||||
_actions:
|
_actions:
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "Marcado como sensible"
|
||||||
add: "Agregar"
|
add: "Agregar"
|
||||||
reaction: "Reacción"
|
reaction: "Reacción"
|
||||||
reactions: "Reacción"
|
reactions: "Reacción"
|
||||||
reactionSetting: "Reacciones para mostrar en el menú de reacciones"
|
|
||||||
reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete la tecla + para añadir."
|
reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete la tecla + para añadir."
|
||||||
rememberNoteVisibility: "Recordar visibilidad"
|
rememberNoteVisibility: "Recordar visibilidad"
|
||||||
attachCancel: "Quitar adjunto"
|
attachCancel: "Quitar adjunto"
|
||||||
|
@ -874,8 +873,6 @@ makeReactionsPublicDescription: "Todas las reacciones que hayas hecho serán pú
|
||||||
classic: "Clásico"
|
classic: "Clásico"
|
||||||
muteThread: "Silenciar hilo"
|
muteThread: "Silenciar hilo"
|
||||||
unmuteThread: "Mostrar hilo"
|
unmuteThread: "Mostrar hilo"
|
||||||
ffVisibility: "Visibilidad de seguidores y seguidos"
|
|
||||||
ffVisibilityDescription: "Puedes configurar quien puede ver a quienes sigues y quienes te siguen"
|
|
||||||
continueThread: "Ver la continuación del hilo"
|
continueThread: "Ver la continuación del hilo"
|
||||||
deleteAccountConfirm: "La cuenta será borrada. ¿Está seguro?"
|
deleteAccountConfirm: "La cuenta será borrada. ¿Está seguro?"
|
||||||
incorrectPassword: "La contraseña es incorrecta"
|
incorrectPassword: "La contraseña es incorrecta"
|
||||||
|
|
|
@ -121,7 +121,12 @@ sensitive: "Contenu sensible"
|
||||||
add: "Ajouter"
|
add: "Ajouter"
|
||||||
reaction: "Réactions"
|
reaction: "Réactions"
|
||||||
reactions: "Réactions"
|
reactions: "Réactions"
|
||||||
reactionSetting: "Réactions à afficher dans le sélecteur de réactions"
|
emojiPicker: "Sélecteur d’émojis"
|
||||||
|
pinnedEmojisForReactionSettingDescription: "Vous pouvez définir les émojis épinglés lors de la réaction"
|
||||||
|
pinnedEmojisSettingDescription: "Vous pouvez définir les émojis épinglés lors de la saisie de l'émoji"
|
||||||
|
emojiPickerDisplay: "Affichage du sélecteur d'émojis"
|
||||||
|
overwriteFromPinnedEmojisForReaction: "Remplacer par les émojis épinglés pour la réaction"
|
||||||
|
overwriteFromPinnedEmojis: "Remplacer par les émojis épinglés globalement"
|
||||||
reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser « + » pour ajouter."
|
reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser « + » pour ajouter."
|
||||||
rememberNoteVisibility: "Se souvenir de la visibilité des notes"
|
rememberNoteVisibility: "Se souvenir de la visibilité des notes"
|
||||||
attachCancel: "Supprimer le fichier attaché"
|
attachCancel: "Supprimer le fichier attaché"
|
||||||
|
@ -873,8 +878,8 @@ makeReactionsPublicDescription: "Ceci rendra la liste de toutes vos réactions d
|
||||||
classic: "Classique"
|
classic: "Classique"
|
||||||
muteThread: "Masquer cette discussion"
|
muteThread: "Masquer cette discussion"
|
||||||
unmuteThread: "Ne plus masquer le fil"
|
unmuteThread: "Ne plus masquer le fil"
|
||||||
ffVisibility: "Visibilité des abonnés/abonnements"
|
followingVisibility: "Visibilité des abonnements"
|
||||||
ffVisibilityDescription: "Permet de configurer qui peut voir les personnes que tu suis et les personnes qui te suivent."
|
followersVisibility: "Visibilité des abonnés"
|
||||||
continueThread: "Afficher la suite du fil"
|
continueThread: "Afficher la suite du fil"
|
||||||
deleteAccountConfirm: "Votre compte sera supprimé. Êtes vous certain ?"
|
deleteAccountConfirm: "Votre compte sera supprimé. Êtes vous certain ?"
|
||||||
incorrectPassword: "Le mot de passe est incorrect."
|
incorrectPassword: "Le mot de passe est incorrect."
|
||||||
|
@ -1024,6 +1029,8 @@ license: "Licence"
|
||||||
myClips: "Mes clips"
|
myClips: "Mes clips"
|
||||||
drivecleaner: "Nettoyeur du Disque"
|
drivecleaner: "Nettoyeur du Disque"
|
||||||
retryAllQueuesConfirmText: "Cela peut augmenter temporairement la charge du serveur."
|
retryAllQueuesConfirmText: "Cela peut augmenter temporairement la charge du serveur."
|
||||||
|
enableChartsForRemoteUser: "Générer les graphiques pour les utilisateurs distants"
|
||||||
|
enableChartsForFederatedInstances: "Générer les graphiques pour les instances distantes"
|
||||||
showClipButtonInNoteFooter: "Ajouter « Clip » au menu d'action de la note"
|
showClipButtonInNoteFooter: "Ajouter « Clip » au menu d'action de la note"
|
||||||
reactionsDisplaySize: "Taille de l'affichage des réactions"
|
reactionsDisplaySize: "Taille de l'affichage des réactions"
|
||||||
limitWidthOfReaction: "Limiter la largeur maximale des réactions et les afficher en taille réduite"
|
limitWidthOfReaction: "Limiter la largeur maximale des réactions et les afficher en taille réduite"
|
||||||
|
@ -1067,6 +1074,7 @@ options: "Options"
|
||||||
specifyUser: "Spécifier l'utilisateur·rice"
|
specifyUser: "Spécifier l'utilisateur·rice"
|
||||||
failedToPreviewUrl: "Aperçu d'URL échoué"
|
failedToPreviewUrl: "Aperçu d'URL échoué"
|
||||||
update: "Mettre à jour"
|
update: "Mettre à jour"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReaction: "Rôles qui peuvent utiliser cet émoji comme réaction"
|
||||||
later: "Plus tard"
|
later: "Plus tard"
|
||||||
goToMisskey: "Retour vers Misskey"
|
goToMisskey: "Retour vers Misskey"
|
||||||
additionalEmojiDictionary: "Dictionnaires d'émojis additionnels"
|
additionalEmojiDictionary: "Dictionnaires d'émojis additionnels"
|
||||||
|
@ -1129,6 +1137,9 @@ doReaction: "Réagir"
|
||||||
code: "Code"
|
code: "Code"
|
||||||
reloadRequiredToApplySettings: "Le rafraîchissement est nécessaire pour que les paramètres prennent effet."
|
reloadRequiredToApplySettings: "Le rafraîchissement est nécessaire pour que les paramètres prennent effet."
|
||||||
remainingN: "Restants : {n}"
|
remainingN: "Restants : {n}"
|
||||||
|
overwriteContentConfirm: "Voulez-vous remplacer le contenu actuel ?"
|
||||||
|
seasonalScreenEffect: "Effet d'écran saisonnier"
|
||||||
|
decorate: "Décorer"
|
||||||
_announcement:
|
_announcement:
|
||||||
readConfirmTitle: "Marquer comme lu ?"
|
readConfirmTitle: "Marquer comme lu ?"
|
||||||
shouldNotBeUsedToPresentPermanentInfo: "Puisque cela pourrait nuire considérablement à l'expérience utilisateur pour les nouveaux utilisateurs, il est recommandé d'utiliser les annonces pour afficher des informations temporaires plutôt que des informations persistantes."
|
shouldNotBeUsedToPresentPermanentInfo: "Puisque cela pourrait nuire considérablement à l'expérience utilisateur pour les nouveaux utilisateurs, il est recommandé d'utiliser les annonces pour afficher des informations temporaires plutôt que des informations persistantes."
|
||||||
|
@ -1888,6 +1899,7 @@ _notification:
|
||||||
yourFollowRequestAccepted: "Votre demande d’abonnement a été accepté"
|
yourFollowRequestAccepted: "Votre demande d’abonnement a été accepté"
|
||||||
pollEnded: "Les résultats du sondage sont disponibles"
|
pollEnded: "Les résultats du sondage sont disponibles"
|
||||||
unreadAntennaNote: "Antenne {name}"
|
unreadAntennaNote: "Antenne {name}"
|
||||||
|
roleAssigned: "Rôle attribué"
|
||||||
emptyPushNotificationMessage: "Les notifications push ont été mises à jour"
|
emptyPushNotificationMessage: "Les notifications push ont été mises à jour"
|
||||||
achievementEarned: "Accomplissement"
|
achievementEarned: "Accomplissement"
|
||||||
testNotification: "Tester la notification"
|
testNotification: "Tester la notification"
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "Konten sensitif"
|
||||||
add: "Tambahkan"
|
add: "Tambahkan"
|
||||||
reaction: "Reaksi"
|
reaction: "Reaksi"
|
||||||
reactions: "Reaksi"
|
reactions: "Reaksi"
|
||||||
reactionSetting: "Reaksi untuk dimunculkan di bilah reaksi"
|
|
||||||
reactionSettingDescription2: "Geser untuk memindah urutan emoji, klik untuk menghapus, tekan \"+\" untuk menambahkan"
|
reactionSettingDescription2: "Geser untuk memindah urutan emoji, klik untuk menghapus, tekan \"+\" untuk menambahkan"
|
||||||
rememberNoteVisibility: "Ingat pengaturan visibilitas catatan"
|
rememberNoteVisibility: "Ingat pengaturan visibilitas catatan"
|
||||||
attachCancel: "Hapus lampiran"
|
attachCancel: "Hapus lampiran"
|
||||||
|
@ -261,6 +260,7 @@ removed: "Telah dihapus"
|
||||||
removeAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
|
removeAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
|
||||||
deleteAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
|
deleteAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
|
||||||
resetAreYouSure: "Yakin mau atur ulang?"
|
resetAreYouSure: "Yakin mau atur ulang?"
|
||||||
|
areYouSure: "Apakah kamu yakin?"
|
||||||
saved: "Telah disimpan"
|
saved: "Telah disimpan"
|
||||||
messaging: "Pesan"
|
messaging: "Pesan"
|
||||||
upload: "Unggah"
|
upload: "Unggah"
|
||||||
|
@ -311,6 +311,7 @@ folderName: "Nama folder"
|
||||||
createFolder: "Buat folder"
|
createFolder: "Buat folder"
|
||||||
renameFolder: "Ubah nama folder"
|
renameFolder: "Ubah nama folder"
|
||||||
deleteFolder: "Hapus folder"
|
deleteFolder: "Hapus folder"
|
||||||
|
folder: "Folder"
|
||||||
addFile: "Tambahkan berkas"
|
addFile: "Tambahkan berkas"
|
||||||
emptyDrive: "Drive kosong"
|
emptyDrive: "Drive kosong"
|
||||||
emptyFolder: "Folder kosong"
|
emptyFolder: "Folder kosong"
|
||||||
|
@ -543,6 +544,8 @@ showInPage: "Tampilkan di halaman"
|
||||||
popout: "Pop-out"
|
popout: "Pop-out"
|
||||||
volume: "Volume"
|
volume: "Volume"
|
||||||
masterVolume: "Master volume"
|
masterVolume: "Master volume"
|
||||||
|
notUseSound: "Tidak ada keluaran suara"
|
||||||
|
useSoundOnlyWhenActive: "Hanya keluarkan suara jika Misskey sedang aktif"
|
||||||
details: "Selengkapnya"
|
details: "Selengkapnya"
|
||||||
chooseEmoji: "Pilih emoji"
|
chooseEmoji: "Pilih emoji"
|
||||||
unableToProcess: "Operasi tersebut tidak dapat diselesaikan."
|
unableToProcess: "Operasi tersebut tidak dapat diselesaikan."
|
||||||
|
@ -871,8 +874,6 @@ makeReactionsPublicDescription: "Pengaturan ini akan membuat daftar dari semua r
|
||||||
classic: "Klasik"
|
classic: "Klasik"
|
||||||
muteThread: "Bisukan thread"
|
muteThread: "Bisukan thread"
|
||||||
unmuteThread: "Suarakan thread"
|
unmuteThread: "Suarakan thread"
|
||||||
ffVisibility: "Visibilitas Mengikuti/Pengikut"
|
|
||||||
ffVisibilityDescription: "Mengatur siapa yang dapat melihat pengikutmu dan yang kamu ikuti."
|
|
||||||
continueThread: "Lihat lanjutan thread"
|
continueThread: "Lihat lanjutan thread"
|
||||||
deleteAccountConfirm: "Akun akan dihapus. Apakah kamu yakin?"
|
deleteAccountConfirm: "Akun akan dihapus. Apakah kamu yakin?"
|
||||||
incorrectPassword: "Kata sandi salah."
|
incorrectPassword: "Kata sandi salah."
|
||||||
|
@ -1023,6 +1024,8 @@ resetPasswordConfirm: "Yakin untuk mereset kata sandimu?"
|
||||||
sensitiveWords: "Kata sensitif"
|
sensitiveWords: "Kata sensitif"
|
||||||
sensitiveWordsDescription: "Visibilitas dari semua catatan mengandung kata yang telah diatur akan dijadikan \"Beranda\" secara otomatis. Kamu dapat mendaftarkan kata tersebut lebih dari satu dengan menuliskannya di baris baru."
|
sensitiveWordsDescription: "Visibilitas dari semua catatan mengandung kata yang telah diatur akan dijadikan \"Beranda\" secara otomatis. Kamu dapat mendaftarkan kata tersebut lebih dari satu dengan menuliskannya di baris baru."
|
||||||
sensitiveWordsDescription2: "Menggunakan spasi akan membuat ekspresi AND dan kata kunci disekitarnya dengan garis miring akan mengubahnya menjadi ekspresi reguler."
|
sensitiveWordsDescription2: "Menggunakan spasi akan membuat ekspresi AND dan kata kunci disekitarnya dengan garis miring akan mengubahnya menjadi ekspresi reguler."
|
||||||
|
hiddenTags: "Tagar tersembunyi"
|
||||||
|
hiddenTagsDescription: "Pilih tanda yang mana akan tidak diperlihatkan dalam daftar tren.\nTanda lebih dari satu dapat didaftarkan dengan tiap baris."
|
||||||
notesSearchNotAvailable: "Pencarian catatan tidak tersedia."
|
notesSearchNotAvailable: "Pencarian catatan tidak tersedia."
|
||||||
license: "Lisensi"
|
license: "Lisensi"
|
||||||
unfavoriteConfirm: "Yakin ingin menghapusnya dari favorit?"
|
unfavoriteConfirm: "Yakin ingin menghapusnya dari favorit?"
|
||||||
|
@ -1035,6 +1038,7 @@ enableChartsForRemoteUser: "Buat bagan data pengguna instansi luar"
|
||||||
enableChartsForFederatedInstances: "Buat bagan data peladen instansi luar"
|
enableChartsForFederatedInstances: "Buat bagan data peladen instansi luar"
|
||||||
showClipButtonInNoteFooter: "Tambahkan \"Klip\" ke menu aksi catatan"
|
showClipButtonInNoteFooter: "Tambahkan \"Klip\" ke menu aksi catatan"
|
||||||
reactionsDisplaySize: "Ukuran tampilan reaksi"
|
reactionsDisplaySize: "Ukuran tampilan reaksi"
|
||||||
|
limitWidthOfReaction: "Batasi lebar maksimum reaksi dan tampilkan dalam ukuran terbatasi."
|
||||||
noteIdOrUrl: "ID catatan atau URL"
|
noteIdOrUrl: "ID catatan atau URL"
|
||||||
video: "Video"
|
video: "Video"
|
||||||
videos: "Video"
|
videos: "Video"
|
||||||
|
@ -1161,6 +1165,9 @@ useGroupedNotifications: "Tampilkan notifikasi secara dikelompokkan"
|
||||||
signupPendingError: "Terdapat masalah ketika memverifikasi alamat surel. Tautan kemungkinan telah kedaluwarsa."
|
signupPendingError: "Terdapat masalah ketika memverifikasi alamat surel. Tautan kemungkinan telah kedaluwarsa."
|
||||||
cwNotationRequired: "Jika \"Sembunyikan konten\" diaktifkan, deskripsi harus disediakan."
|
cwNotationRequired: "Jika \"Sembunyikan konten\" diaktifkan, deskripsi harus disediakan."
|
||||||
doReaction: "Tambahkan reaksi"
|
doReaction: "Tambahkan reaksi"
|
||||||
|
code: "Kode"
|
||||||
|
reloadRequiredToApplySettings: "Muat ulang diperlukan untuk menerapkan pengaturan."
|
||||||
|
remainingN: "Sisa : {n}"
|
||||||
_announcement:
|
_announcement:
|
||||||
forExistingUsers: "Hanya pengguna yang telah ada"
|
forExistingUsers: "Hanya pengguna yang telah ada"
|
||||||
forExistingUsersDescription: "Pengumuman ini akan dimunculkan ke pengguna yang sudah ada dari titik waktu publikasi jika dinyalakan. Apabila dimatikan, mereka yang baru mendaftar setelah publikasi ini akan juga melihatnya."
|
forExistingUsersDescription: "Pengumuman ini akan dimunculkan ke pengguna yang sudah ada dari titik waktu publikasi jika dinyalakan. Apabila dimatikan, mereka yang baru mendaftar setelah publikasi ini akan juga melihatnya."
|
||||||
|
@ -1189,12 +1196,17 @@ _initialAccountSetting:
|
||||||
_initialTutorial:
|
_initialTutorial:
|
||||||
launchTutorial: "Lihat Tutorial"
|
launchTutorial: "Lihat Tutorial"
|
||||||
title: "Tutorial"
|
title: "Tutorial"
|
||||||
|
wellDone: "Kerja bagus!"
|
||||||
skipAreYouSure: "Berhenti dari Tutorial?"
|
skipAreYouSure: "Berhenti dari Tutorial?"
|
||||||
_landing:
|
_landing:
|
||||||
title: "Selamat datang di Tutorial"
|
title: "Selamat datang di Tutorial"
|
||||||
description: "Di sini kamu dapat mempelajari dasar-dasar dari penggunaan Misskey dan fitur-fiturnya."
|
description: "Di sini kamu dapat mempelajari dasar-dasar dari penggunaan Misskey dan fitur-fiturnya."
|
||||||
_note:
|
_note:
|
||||||
title: "Apa itu Catatan?"
|
title: "Apa itu Catatan?"
|
||||||
|
_reaction:
|
||||||
|
title: "Apa itu Reaksi?"
|
||||||
|
_timeline:
|
||||||
|
title: "Konsep Lini Masa"
|
||||||
_postNote:
|
_postNote:
|
||||||
title: "Pengaturan posting Catatan"
|
title: "Pengaturan posting Catatan"
|
||||||
_visibility:
|
_visibility:
|
||||||
|
@ -1202,6 +1214,12 @@ _initialTutorial:
|
||||||
home: "Hanya publik ke lini masa Beranda. Pengguna yang mengunjungi profilmu melalui pengikut dan renote dapat melihatnya."
|
home: "Hanya publik ke lini masa Beranda. Pengguna yang mengunjungi profilmu melalui pengikut dan renote dapat melihatnya."
|
||||||
followers: "Perlihatkan ke pengikut saja. Hanya pengikut yang dapat melihat postinganmu dan tidak dapat direnote oleh siapapun."
|
followers: "Perlihatkan ke pengikut saja. Hanya pengikut yang dapat melihat postinganmu dan tidak dapat direnote oleh siapapun."
|
||||||
direct: "Hanya perlihatkan ke pengguna spesifik dan penerima akan diberi tahu. Dapat juga digunakan sebagai alternatif dari pesan langsung."
|
direct: "Hanya perlihatkan ke pengguna spesifik dan penerima akan diberi tahu. Dapat juga digunakan sebagai alternatif dari pesan langsung."
|
||||||
|
_cw:
|
||||||
|
_exampleNote:
|
||||||
|
cw: "Peringatan: Bikin Lapar!"
|
||||||
|
note: "Baru aja makan donat berlapis coklat 🍩😋"
|
||||||
|
_howToMakeAttachmentsSensitive:
|
||||||
|
title: "Bagaimana menandai lampiran sebagai sensitif?"
|
||||||
_serverRules:
|
_serverRules:
|
||||||
description: "Daftar peraturan akan ditampilkan sebelum pendaftaran. Mengatur ringkasan dari Syarat dan Ketentuan sangat direkomendasikan."
|
description: "Daftar peraturan akan ditampilkan sebelum pendaftaran. Mengatur ringkasan dari Syarat dan Ketentuan sangat direkomendasikan."
|
||||||
_serverSettings:
|
_serverSettings:
|
||||||
|
|
|
@ -137,8 +137,8 @@ export interface Locale {
|
||||||
"pinnedEmojisForReactionSettingDescription": string;
|
"pinnedEmojisForReactionSettingDescription": string;
|
||||||
"pinnedEmojisSettingDescription": string;
|
"pinnedEmojisSettingDescription": string;
|
||||||
"emojiPickerDisplay": string;
|
"emojiPickerDisplay": string;
|
||||||
"copyFromPinnedEmojisForReaction": string;
|
"overwriteFromPinnedEmojisForReaction": string;
|
||||||
"copyFromPinnedEmojis": string;
|
"overwriteFromPinnedEmojis": string;
|
||||||
"reactionSettingDescription2": string;
|
"reactionSettingDescription2": string;
|
||||||
"rememberNoteVisibility": string;
|
"rememberNoteVisibility": string;
|
||||||
"attachCancel": string;
|
"attachCancel": string;
|
||||||
|
@ -918,8 +918,8 @@ export interface Locale {
|
||||||
"classic": string;
|
"classic": string;
|
||||||
"muteThread": string;
|
"muteThread": string;
|
||||||
"unmuteThread": string;
|
"unmuteThread": string;
|
||||||
"ffVisibility": string;
|
"followingVisibility": string;
|
||||||
"ffVisibilityDescription": string;
|
"followersVisibility": string;
|
||||||
"continueThread": string;
|
"continueThread": string;
|
||||||
"deleteAccountConfirm": string;
|
"deleteAccountConfirm": string;
|
||||||
"incorrectPassword": string;
|
"incorrectPassword": string;
|
||||||
|
@ -1221,6 +1221,8 @@ export interface Locale {
|
||||||
"reloadRequiredToApplySettings": string;
|
"reloadRequiredToApplySettings": string;
|
||||||
"remainingN": string;
|
"remainingN": string;
|
||||||
"overwriteContentConfirm": string;
|
"overwriteContentConfirm": string;
|
||||||
|
"seasonalScreenEffect": string;
|
||||||
|
"decorate": string;
|
||||||
"_announcement": {
|
"_announcement": {
|
||||||
"forExistingUsers": string;
|
"forExistingUsers": string;
|
||||||
"forExistingUsersDescription": string;
|
"forExistingUsersDescription": string;
|
||||||
|
@ -2382,6 +2384,7 @@ export interface Locale {
|
||||||
"pollEnded": string;
|
"pollEnded": string;
|
||||||
"newNote": string;
|
"newNote": string;
|
||||||
"unreadAntennaNote": string;
|
"unreadAntennaNote": string;
|
||||||
|
"roleAssigned": string;
|
||||||
"emptyPushNotificationMessage": string;
|
"emptyPushNotificationMessage": string;
|
||||||
"achievementEarned": string;
|
"achievementEarned": string;
|
||||||
"testNotification": string;
|
"testNotification": string;
|
||||||
|
@ -2403,6 +2406,7 @@ export interface Locale {
|
||||||
"pollEnded": string;
|
"pollEnded": string;
|
||||||
"receiveFollowRequest": string;
|
"receiveFollowRequest": string;
|
||||||
"followRequestAccepted": string;
|
"followRequestAccepted": string;
|
||||||
|
"roleAssigned": string;
|
||||||
"achievementEarned": string;
|
"achievementEarned": string;
|
||||||
"app": string;
|
"app": string;
|
||||||
};
|
};
|
||||||
|
|
|
@ -121,7 +121,12 @@ sensitive: "Allegato esplicito"
|
||||||
add: "Aggiungi"
|
add: "Aggiungi"
|
||||||
reaction: "Reazioni"
|
reaction: "Reazioni"
|
||||||
reactions: "Reazioni"
|
reactions: "Reazioni"
|
||||||
reactionSetting: "Reazioni visualizzate sul pannello"
|
emojiPicker: "Selettore emoji"
|
||||||
|
pinnedEmojisForReactionSettingDescription: "Scegli quale sia l'emoji in cima, quando reagisci"
|
||||||
|
pinnedEmojisSettingDescription: "Scegli quale sia l'emoji in cima, quando reagisci"
|
||||||
|
emojiPickerDisplay: "Visualizza selettore"
|
||||||
|
overwriteFromPinnedEmojisForReaction: "Sovrascrivi con le impostazioni reazioni"
|
||||||
|
overwriteFromPinnedEmojis: "Sovrascrivi con le impostazioni globali"
|
||||||
reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa il pulsante \"+\" per aggiungere."
|
reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa il pulsante \"+\" per aggiungere."
|
||||||
rememberNoteVisibility: "Ricordare le impostazioni di visibilità delle note"
|
rememberNoteVisibility: "Ricordare le impostazioni di visibilità delle note"
|
||||||
attachCancel: "Rimuovi allegato"
|
attachCancel: "Rimuovi allegato"
|
||||||
|
@ -261,6 +266,7 @@ removed: "Eliminato con successo"
|
||||||
removeAreYouSure: "Vuoi davvero eliminare \"{x}\"?"
|
removeAreYouSure: "Vuoi davvero eliminare \"{x}\"?"
|
||||||
deleteAreYouSure: "Vuoi davvero eliminare \"{x}\"?"
|
deleteAreYouSure: "Vuoi davvero eliminare \"{x}\"?"
|
||||||
resetAreYouSure: "Ripristinare?"
|
resetAreYouSure: "Ripristinare?"
|
||||||
|
areYouSure: "Confermi?"
|
||||||
saved: "Salvato"
|
saved: "Salvato"
|
||||||
messaging: "Messaggi"
|
messaging: "Messaggi"
|
||||||
upload: "Carica"
|
upload: "Carica"
|
||||||
|
@ -875,8 +881,6 @@ makeReactionsPublicDescription: "La lista delle reazioni che avete fatto è a di
|
||||||
classic: "Classico"
|
classic: "Classico"
|
||||||
muteThread: "Silenzia conversazione"
|
muteThread: "Silenzia conversazione"
|
||||||
unmuteThread: "Riattiva la conversazione"
|
unmuteThread: "Riattiva la conversazione"
|
||||||
ffVisibility: "Visibilità delle connessioni"
|
|
||||||
ffVisibilityDescription: "Puoi scegliere a chi mostrare le tue relazioni con altri profili nel fediverso."
|
|
||||||
continueThread: "Altre conversazioni"
|
continueThread: "Altre conversazioni"
|
||||||
deleteAccountConfirm: "Così verrà eliminato il profilo. Vuoi procedere?"
|
deleteAccountConfirm: "Così verrà eliminato il profilo. Vuoi procedere?"
|
||||||
incorrectPassword: "La password è errata."
|
incorrectPassword: "La password è errata."
|
||||||
|
@ -1157,6 +1161,7 @@ tosAndPrivacyPolicy: "Condizioni d'uso e informativa privacy"
|
||||||
avatarDecorations: "Decorazioni foto profilo"
|
avatarDecorations: "Decorazioni foto profilo"
|
||||||
attach: "Applica"
|
attach: "Applica"
|
||||||
detach: "Rimuovi"
|
detach: "Rimuovi"
|
||||||
|
detachAll: "Togli tutto"
|
||||||
angle: "Angolo"
|
angle: "Angolo"
|
||||||
flip: "Inverti"
|
flip: "Inverti"
|
||||||
showAvatarDecorations: "Mostra decorazione della foto profilo"
|
showAvatarDecorations: "Mostra decorazione della foto profilo"
|
||||||
|
@ -1170,6 +1175,10 @@ cwNotationRequired: "Devi indicare perché il contenuto è indicato come esplici
|
||||||
doReaction: "Reagisci"
|
doReaction: "Reagisci"
|
||||||
code: "Codice"
|
code: "Codice"
|
||||||
reloadRequiredToApplySettings: "Per applicare le impostazioni, occorre ricaricare."
|
reloadRequiredToApplySettings: "Per applicare le impostazioni, occorre ricaricare."
|
||||||
|
remainingN: "Rimangono: {n}"
|
||||||
|
overwriteContentConfirm: "Vuoi davvero sostituire l'attuale contenuto?"
|
||||||
|
seasonalScreenEffect: "Schermate in base alla stagione"
|
||||||
|
decorate: "Decora"
|
||||||
_announcement:
|
_announcement:
|
||||||
forExistingUsers: "Solo ai profili attuali"
|
forExistingUsers: "Solo ai profili attuali"
|
||||||
forExistingUsersDescription: "L'annuncio sarà visibile solo ai profili esistenti in questo momento. Se disabilitato, sarà visibile anche ai profili che verranno creati dopo la pubblicazione di questo annuncio."
|
forExistingUsersDescription: "L'annuncio sarà visibile solo ai profili esistenti in questo momento. Se disabilitato, sarà visibile anche ai profili che verranno creati dopo la pubblicazione di questo annuncio."
|
||||||
|
@ -1601,6 +1610,7 @@ _role:
|
||||||
canHideAds: "Nascondere i banner"
|
canHideAds: "Nascondere i banner"
|
||||||
canSearchNotes: "Ricercare nelle Note"
|
canSearchNotes: "Ricercare nelle Note"
|
||||||
canUseTranslator: "Tradurre le Note"
|
canUseTranslator: "Tradurre le Note"
|
||||||
|
avatarDecorationLimit: "Numero massimo di decorazioni foto profilo installabili"
|
||||||
_condition:
|
_condition:
|
||||||
isLocal: "Profilo locale"
|
isLocal: "Profilo locale"
|
||||||
isRemote: "Profilo remoto"
|
isRemote: "Profilo remoto"
|
||||||
|
@ -2037,6 +2047,7 @@ _profile:
|
||||||
changeAvatar: "Modifica immagine profilo"
|
changeAvatar: "Modifica immagine profilo"
|
||||||
changeBanner: "Cambia intestazione"
|
changeBanner: "Cambia intestazione"
|
||||||
verifiedLinkDescription: "Puoi verificare il tuo profilo mostrando una icona. Devi inserire la URL alla pagina che contiene un link al tuo profilo."
|
verifiedLinkDescription: "Puoi verificare il tuo profilo mostrando una icona. Devi inserire la URL alla pagina che contiene un link al tuo profilo."
|
||||||
|
avatarDecorationMax: "Puoi aggiungere fino a {max} decorazioni."
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "Tutte le note"
|
allNotes: "Tutte le note"
|
||||||
favoritedNotes: "Note preferite"
|
favoritedNotes: "Note preferite"
|
||||||
|
|
|
@ -134,8 +134,8 @@ emojiPicker: "絵文字ピッカー"
|
||||||
pinnedEmojisForReactionSettingDescription: "リアクション時にピン留め表示する絵文字を設定できます"
|
pinnedEmojisForReactionSettingDescription: "リアクション時にピン留め表示する絵文字を設定できます"
|
||||||
pinnedEmojisSettingDescription: "絵文字入力時にピン留め表示する絵文字を設定できます"
|
pinnedEmojisSettingDescription: "絵文字入力時にピン留め表示する絵文字を設定できます"
|
||||||
emojiPickerDisplay: "ピッカーの表示"
|
emojiPickerDisplay: "ピッカーの表示"
|
||||||
copyFromPinnedEmojisForReaction: "リアクション設定からコピーする"
|
overwriteFromPinnedEmojisForReaction: "リアクション設定から上書きする"
|
||||||
copyFromPinnedEmojis: "絵文字設定からコピーする"
|
overwriteFromPinnedEmojis: "全般設定から上書きする"
|
||||||
reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押して追加します。"
|
reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押して追加します。"
|
||||||
rememberNoteVisibility: "公開範囲を記憶する"
|
rememberNoteVisibility: "公開範囲を記憶する"
|
||||||
attachCancel: "添付取り消し"
|
attachCancel: "添付取り消し"
|
||||||
|
@ -915,8 +915,8 @@ makeReactionsPublicDescription: "あなたがしたリアクション一覧を
|
||||||
classic: "クラシック"
|
classic: "クラシック"
|
||||||
muteThread: "スレッドをミュート"
|
muteThread: "スレッドをミュート"
|
||||||
unmuteThread: "スレッドのミュートを解除"
|
unmuteThread: "スレッドのミュートを解除"
|
||||||
ffVisibility: "つながりの公開範囲"
|
followingVisibility: "フォローの公開範囲"
|
||||||
ffVisibilityDescription: "自分のフォロー/フォロワー情報の公開範囲を設定できます。"
|
followersVisibility: "フォロワーの公開範囲"
|
||||||
continueThread: "さらにスレッドを見る"
|
continueThread: "さらにスレッドを見る"
|
||||||
deleteAccountConfirm: "アカウントが削除されます。よろしいですか?"
|
deleteAccountConfirm: "アカウントが削除されます。よろしいですか?"
|
||||||
incorrectPassword: "パスワードが間違っています。"
|
incorrectPassword: "パスワードが間違っています。"
|
||||||
|
@ -1218,6 +1218,8 @@ code: "コード"
|
||||||
reloadRequiredToApplySettings: "設定の反映にはリロードが必要です。"
|
reloadRequiredToApplySettings: "設定の反映にはリロードが必要です。"
|
||||||
remainingN: "残り: {n}"
|
remainingN: "残り: {n}"
|
||||||
overwriteContentConfirm: "現在の内容に上書きされますがよろしいですか?"
|
overwriteContentConfirm: "現在の内容に上書きされますがよろしいですか?"
|
||||||
|
seasonalScreenEffect: "季節に応じた画面の演出"
|
||||||
|
decorate: "デコる"
|
||||||
|
|
||||||
_announcement:
|
_announcement:
|
||||||
forExistingUsers: "既存ユーザーのみ"
|
forExistingUsers: "既存ユーザーのみ"
|
||||||
|
@ -2284,6 +2286,7 @@ _notification:
|
||||||
pollEnded: "アンケートの結果が出ました"
|
pollEnded: "アンケートの結果が出ました"
|
||||||
newNote: "新しい投稿"
|
newNote: "新しい投稿"
|
||||||
unreadAntennaNote: "アンテナ {name}"
|
unreadAntennaNote: "アンテナ {name}"
|
||||||
|
roleAssigned: "ロールが付与されました"
|
||||||
emptyPushNotificationMessage: "プッシュ通知の更新をしました"
|
emptyPushNotificationMessage: "プッシュ通知の更新をしました"
|
||||||
achievementEarned: "実績を獲得"
|
achievementEarned: "実績を獲得"
|
||||||
testNotification: "通知テスト"
|
testNotification: "通知テスト"
|
||||||
|
@ -2306,6 +2309,7 @@ _notification:
|
||||||
pollEnded: "アンケートが終了"
|
pollEnded: "アンケートが終了"
|
||||||
receiveFollowRequest: "フォロー申請を受け取った"
|
receiveFollowRequest: "フォロー申請を受け取った"
|
||||||
followRequestAccepted: "フォローが受理された"
|
followRequestAccepted: "フォローが受理された"
|
||||||
|
roleAssigned: "ロールが付与された"
|
||||||
achievementEarned: "実績の獲得"
|
achievementEarned: "実績の獲得"
|
||||||
app: "連携アプリからの通知"
|
app: "連携アプリからの通知"
|
||||||
|
|
||||||
|
|
|
@ -121,7 +121,12 @@ sensitive: "気いつけて見いや"
|
||||||
add: "増やす"
|
add: "増やす"
|
||||||
reaction: "ツッコミ"
|
reaction: "ツッコミ"
|
||||||
reactions: "ツッコミ"
|
reactions: "ツッコミ"
|
||||||
reactionSetting: "ピッカーに出しとくツッコミ"
|
emojiPicker: "絵文字ピッカー"
|
||||||
|
pinnedEmojisForReactionSettingDescription: "リアクションしたときにピンで留めてる表示をする絵文字を設定するで"
|
||||||
|
pinnedEmojisSettingDescription: "絵文字打ったときにピン留め表示する絵文字設定できるで"
|
||||||
|
emojiPickerDisplay: "ピッカーの表示"
|
||||||
|
overwriteFromPinnedEmojisForReaction: "リアクション設定から上書きする"
|
||||||
|
overwriteFromPinnedEmojis: "全般設定から上書きする"
|
||||||
reactionSettingDescription2: "ドラッグで並び替え、クリックで削除、+を押して追加やで。"
|
reactionSettingDescription2: "ドラッグで並び替え、クリックで削除、+を押して追加やで。"
|
||||||
rememberNoteVisibility: "公開範囲覚えといて"
|
rememberNoteVisibility: "公開範囲覚えといて"
|
||||||
attachCancel: "のっけるのやめる"
|
attachCancel: "のっけるのやめる"
|
||||||
|
@ -261,6 +266,7 @@ removed: "ほかしたで!"
|
||||||
removeAreYouSure: "「{x}」はほかしてええか?"
|
removeAreYouSure: "「{x}」はほかしてええか?"
|
||||||
deleteAreYouSure: "「{x}」はほかしてええか?"
|
deleteAreYouSure: "「{x}」はほかしてええか?"
|
||||||
resetAreYouSure: "リセットしてええん?"
|
resetAreYouSure: "リセットしてええん?"
|
||||||
|
areYouSure: "いいん?"
|
||||||
saved: "保存したで!"
|
saved: "保存したで!"
|
||||||
messaging: "チャット"
|
messaging: "チャット"
|
||||||
upload: "アップロード"
|
upload: "アップロード"
|
||||||
|
@ -875,8 +881,6 @@ makeReactionsPublicDescription: "あんたがしたツッコミ一覧を誰で
|
||||||
classic: "クラシック"
|
classic: "クラシック"
|
||||||
muteThread: "スレッドをミュート"
|
muteThread: "スレッドをミュート"
|
||||||
unmuteThread: "スレッドのミュートを解除"
|
unmuteThread: "スレッドのミュートを解除"
|
||||||
ffVisibility: "つながりの公開範囲"
|
|
||||||
ffVisibilityDescription: "あんたのフォロー/フォロワー情報の公開範囲を設定できるで。"
|
|
||||||
continueThread: "さらにスレッドを見るで"
|
continueThread: "さらにスレッドを見るで"
|
||||||
deleteAccountConfirm: "アカウントを消すで?ええんか?"
|
deleteAccountConfirm: "アカウントを消すで?ええんか?"
|
||||||
incorrectPassword: "パスワードがちゃうわ。"
|
incorrectPassword: "パスワードがちゃうわ。"
|
||||||
|
@ -1157,6 +1161,7 @@ tosAndPrivacyPolicy: "利用規約・プライバシーポリシー"
|
||||||
avatarDecorations: "アイコンデコレーション"
|
avatarDecorations: "アイコンデコレーション"
|
||||||
attach: "のっける"
|
attach: "のっける"
|
||||||
detach: "取る"
|
detach: "取る"
|
||||||
|
detachAll: "全部とる"
|
||||||
angle: "角度"
|
angle: "角度"
|
||||||
flip: "反転"
|
flip: "反転"
|
||||||
showAvatarDecorations: "アイコンのデコレーション映す"
|
showAvatarDecorations: "アイコンのデコレーション映す"
|
||||||
|
@ -1170,6 +1175,10 @@ cwNotationRequired: "「内容を隠す」んやったら注釈書かなアカ
|
||||||
doReaction: "ツッコむで"
|
doReaction: "ツッコむで"
|
||||||
code: "コード"
|
code: "コード"
|
||||||
reloadRequiredToApplySettings: "設定を見るんにはリロードが必要やで。"
|
reloadRequiredToApplySettings: "設定を見るんにはリロードが必要やで。"
|
||||||
|
remainingN: "残り:{n}"
|
||||||
|
overwriteContentConfirm: "今の内容に上書きされるけどいい?"
|
||||||
|
seasonalScreenEffect: "季節にあった画面の動き"
|
||||||
|
decorate: "デコる"
|
||||||
_announcement:
|
_announcement:
|
||||||
forExistingUsers: "もうおるユーザーのみ"
|
forExistingUsers: "もうおるユーザーのみ"
|
||||||
forExistingUsersDescription: "オンにしたらこのお知らせができた時点でおる人らにだけお知らせが行くで。切ったらこの知らせが行ったあとにアカウント作った人にもちゃんとお知らせが行くで。"
|
forExistingUsersDescription: "オンにしたらこのお知らせができた時点でおる人らにだけお知らせが行くで。切ったらこの知らせが行ったあとにアカウント作った人にもちゃんとお知らせが行くで。"
|
||||||
|
@ -1601,6 +1610,7 @@ _role:
|
||||||
canHideAds: "広告映さへん"
|
canHideAds: "広告映さへん"
|
||||||
canSearchNotes: "ノート探せるかどうか"
|
canSearchNotes: "ノート探せるかどうか"
|
||||||
canUseTranslator: "翻訳使えるかどうか"
|
canUseTranslator: "翻訳使えるかどうか"
|
||||||
|
avatarDecorationLimit: "アイコンデコのいっちばんつけれる数"
|
||||||
_condition:
|
_condition:
|
||||||
isLocal: "ローカルユーザー"
|
isLocal: "ローカルユーザー"
|
||||||
isRemote: "リモートユーザー"
|
isRemote: "リモートユーザー"
|
||||||
|
@ -2037,6 +2047,7 @@ _profile:
|
||||||
changeAvatar: "アバター画像を変更するで"
|
changeAvatar: "アバター画像を変更するで"
|
||||||
changeBanner: "バナー画像を変更するで"
|
changeBanner: "バナー画像を変更するで"
|
||||||
verifiedLinkDescription: "内容をURLに設定すると、リンク先のwebサイトに自分のプロフのリンクが含まれてる場合に所有者確認済みアイコンを表示させることができるで。"
|
verifiedLinkDescription: "内容をURLに設定すると、リンク先のwebサイトに自分のプロフのリンクが含まれてる場合に所有者確認済みアイコンを表示させることができるで。"
|
||||||
|
avatarDecorationMax: "最大{max}つまでデコつけれんで"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "全てのノート"
|
allNotes: "全てのノート"
|
||||||
favoritedNotes: "お気に入りにしたノート"
|
favoritedNotes: "お気に入りにしたノート"
|
||||||
|
|
|
@ -15,7 +15,7 @@ gotIt: "알것어예"
|
||||||
cancel: "아이예"
|
cancel: "아이예"
|
||||||
noThankYou: "뎃어예"
|
noThankYou: "뎃어예"
|
||||||
enterUsername: "사용자 이럼 서기"
|
enterUsername: "사용자 이럼 서기"
|
||||||
renotedBy: "{user}님이 리노트햇십니다"
|
renotedBy: "{user}님이 리노트햇어예"
|
||||||
noNotes: "노트가 없십니다"
|
noNotes: "노트가 없십니다"
|
||||||
noNotifications: "알림이 없십니다"
|
noNotifications: "알림이 없십니다"
|
||||||
instance: "서버"
|
instance: "서버"
|
||||||
|
@ -76,7 +76,7 @@ export: "내가기"
|
||||||
files: "파일"
|
files: "파일"
|
||||||
download: "내리받기"
|
download: "내리받기"
|
||||||
driveFileDeleteConfirm: "‘{name}’ 파일얼 뭉캡니꺼? 요 파일얼 서넌 콘텐츠도 뭉캐집니다."
|
driveFileDeleteConfirm: "‘{name}’ 파일얼 뭉캡니꺼? 요 파일얼 서넌 콘텐츠도 뭉캐집니다."
|
||||||
unfollowConfirm: "{name}님얼 고만 팔로잉합니꺼?"
|
unfollowConfirm: "{name}님얼 고마 팔로잉합니꺼?"
|
||||||
exportRequested: "내가기 요청얼 햇십니다. 시간이 쪼매 걸릴 깁니다. 요청이 껕나모 ‘드라이브’에 옇십니다."
|
exportRequested: "내가기 요청얼 햇십니다. 시간이 쪼매 걸릴 깁니다. 요청이 껕나모 ‘드라이브’에 옇십니다."
|
||||||
importRequested: "가오기 요청얼 햇십니다. 시간이 쪼매 걸릴 깁니다."
|
importRequested: "가오기 요청얼 햇십니다. 시간이 쪼매 걸릴 깁니다."
|
||||||
lists: "리스트"
|
lists: "리스트"
|
||||||
|
@ -113,7 +113,7 @@ cantReRenote: "리노트넌 지럴 리노트 몬 합니다."
|
||||||
quote: "따오기"
|
quote: "따오기"
|
||||||
inChannelRenote: "채널 안 리노트"
|
inChannelRenote: "채널 안 리노트"
|
||||||
inChannelQuote: "채널 안 따오기"
|
inChannelQuote: "채널 안 따오기"
|
||||||
pinnedNote: "프로필에 붙인 노트"
|
pinnedNote: "붙인 노트"
|
||||||
pinned: "프로필에 붙이기"
|
pinned: "프로필에 붙이기"
|
||||||
you: "나"
|
you: "나"
|
||||||
clickToShow: "누질라서 보기"
|
clickToShow: "누질라서 보기"
|
||||||
|
@ -121,7 +121,6 @@ sensitive: "수ᇚ힛섭니다"
|
||||||
add: "옇기"
|
add: "옇기"
|
||||||
reaction: "반엉"
|
reaction: "반엉"
|
||||||
reactions: "반엉"
|
reactions: "반엉"
|
||||||
reactionSetting: "모엄함서 포시할 반엉"
|
|
||||||
reactionSettingDescription2: "꺼시서 두고, 누질라서 뭉캐고, ‘+’럴 누질라서 옇십니다."
|
reactionSettingDescription2: "꺼시서 두고, 누질라서 뭉캐고, ‘+’럴 누질라서 옇십니다."
|
||||||
rememberNoteVisibility: "공개 범위럴 기억하기"
|
rememberNoteVisibility: "공개 범위럴 기억하기"
|
||||||
attachCancel: "붙임 빼기"
|
attachCancel: "붙임 빼기"
|
||||||
|
@ -330,7 +329,7 @@ whenServerDisconnected: "서버하고 옌겔이 껂기모"
|
||||||
disconnectedFromServer: "서버하고 옌겔이 껂깃십니다"
|
disconnectedFromServer: "서버하고 옌겔이 껂깃십니다"
|
||||||
reload: "새로곤침"
|
reload: "새로곤침"
|
||||||
doNothing: "무시하기"
|
doNothing: "무시하기"
|
||||||
reloadConfirm: "새로곤침합니까?"
|
reloadConfirm: "새로곤침합니꺼?"
|
||||||
watch: "간심 갖기"
|
watch: "간심 갖기"
|
||||||
unwatch: "간심 고마 갖기"
|
unwatch: "간심 고마 갖기"
|
||||||
accept: "받기"
|
accept: "받기"
|
||||||
|
@ -368,7 +367,7 @@ pinnedUsersDescription: "‘살펴보기’서 붙일라넌 사용자럴 줄 바
|
||||||
pinnedPages: "붙인 바닥"
|
pinnedPages: "붙인 바닥"
|
||||||
pinnedPagesDescription: "서버으 대문서 붙일라넌 바닥으 겡로럴 줄 바꿈해서로 적십니다."
|
pinnedPagesDescription: "서버으 대문서 붙일라넌 바닥으 겡로럴 줄 바꿈해서로 적십니다."
|
||||||
pinnedClipId: "붙일 클립으 아이디"
|
pinnedClipId: "붙일 클립으 아이디"
|
||||||
pinnedNotes: "프로필에 붙인 노트"
|
pinnedNotes: "붙인 노트"
|
||||||
hcaptcha: "에이치캡차"
|
hcaptcha: "에이치캡차"
|
||||||
enableHcaptcha: "에이치캡차 키기"
|
enableHcaptcha: "에이치캡차 키기"
|
||||||
hcaptchaSiteKey: "사이트키"
|
hcaptchaSiteKey: "사이트키"
|
||||||
|
@ -381,7 +380,7 @@ turnstile: "턴스타일"
|
||||||
enableTurnstile: "턴스타일 키기"
|
enableTurnstile: "턴스타일 키기"
|
||||||
turnstileSiteKey: "사이트키"
|
turnstileSiteKey: "사이트키"
|
||||||
turnstileSecretKey: "시크릿키"
|
turnstileSecretKey: "시크릿키"
|
||||||
avoidMultiCaptchaConfirm: "오만 캡차럴 서모 간섭이 잇얼 깁니다. 다린 캡차를 껍니까? ‘아이예’럴 누질리모 오만 캡차럴 키 둘 수도 잇십니다."
|
avoidMultiCaptchaConfirm: "오만 캡차럴 서모 간섭이 잇얼 깁니다. 다린 캡차를 껍니꺼? ‘아이예’럴 누질리모 오만 캡차럴 키 둘 수도 잇십니다."
|
||||||
antennas: "안테나"
|
antennas: "안테나"
|
||||||
manageAntennas: "안테나 간리"
|
manageAntennas: "안테나 간리"
|
||||||
name: "이럼"
|
name: "이럼"
|
||||||
|
@ -413,7 +412,7 @@ userList: "리스트"
|
||||||
about: "정보"
|
about: "정보"
|
||||||
aboutMisskey: "Misskey넌예"
|
aboutMisskey: "Misskey넌예"
|
||||||
administrator: "간리자"
|
administrator: "간리자"
|
||||||
token: "학인 코드"
|
token: "학인 기호"
|
||||||
2fa: "두 단게 정멩"
|
2fa: "두 단게 정멩"
|
||||||
setupOf2fa: "두 단게 정멩 설정"
|
setupOf2fa: "두 단게 정멩 설정"
|
||||||
totp: "정멩 앱"
|
totp: "정멩 앱"
|
||||||
|
@ -426,13 +425,45 @@ moderationLogs: "중재 일지"
|
||||||
nUsersMentioned: "{n}멩이 이바구하고 잇어예"
|
nUsersMentioned: "{n}멩이 이바구하고 잇어예"
|
||||||
securityKeyAndPasskey: "보안키·패스키"
|
securityKeyAndPasskey: "보안키·패스키"
|
||||||
securityKey: "보안키"
|
securityKey: "보안키"
|
||||||
|
unregister: "맨걸기 무루기"
|
||||||
|
share: "노누기"
|
||||||
|
notFound: "몬 찾앗십니다"
|
||||||
|
help: "도움말"
|
||||||
invites: "초대하기"
|
invites: "초대하기"
|
||||||
|
retype: "다시 서기"
|
||||||
|
noteOf: "{user}님으 노트"
|
||||||
invitations: "초대하기"
|
invitations: "초대하기"
|
||||||
|
checking: "학인하고 잇십니다"
|
||||||
|
passwordMatched: "맞십니다"
|
||||||
|
passwordNotMatched: "안 맞십니다"
|
||||||
language: "언어"
|
language: "언어"
|
||||||
|
remote: "웬겍"
|
||||||
|
script: "스크립트"
|
||||||
manage: "간리"
|
manage: "간리"
|
||||||
|
emailServer: "전자우펜 서버"
|
||||||
|
email: "전자우펜"
|
||||||
|
emailAddress: "전자우펜 주소"
|
||||||
smtpHost: "호스트 이럼"
|
smtpHost: "호스트 이럼"
|
||||||
|
smtpPort: "포트"
|
||||||
smtpUser: "사용자 이럼"
|
smtpUser: "사용자 이럼"
|
||||||
smtpPass: "비밀번호"
|
smtpPass: "비밀번호"
|
||||||
|
abuseReports: "신고하기"
|
||||||
|
reportAbuse: "신고하기"
|
||||||
|
reportAbuseRenote: "리노트 신고하기"
|
||||||
|
reportAbuseOf: "{name}님얼 신고하기"
|
||||||
|
reporter: "신고한 사람"
|
||||||
|
reporteeOrigin: "신고덴 사람"
|
||||||
|
reporterOrigin: "신고한 곳"
|
||||||
|
forwardReport: "웬겍 서버에 신고 보내기"
|
||||||
|
random: "무작이"
|
||||||
|
system: "시스템"
|
||||||
|
clip: "클립 맨걸기"
|
||||||
|
notesCount: "노트 수"
|
||||||
|
renotesCount: "리노트한 수"
|
||||||
|
renotedCount: "리노트덴 수"
|
||||||
|
followingCount: "팔로우 수"
|
||||||
|
followersCount: "팔로워 수"
|
||||||
|
clips: "클립 맨걸기"
|
||||||
clearCache: "캐시 비우기"
|
clearCache: "캐시 비우기"
|
||||||
unlikeConfirm: "좋네예럴 무룹니꺼?"
|
unlikeConfirm: "좋네예럴 무룹니꺼?"
|
||||||
info: "정보"
|
info: "정보"
|
||||||
|
@ -440,6 +471,7 @@ user: "사용자"
|
||||||
administration: "간리"
|
administration: "간리"
|
||||||
on: "킴"
|
on: "킴"
|
||||||
off: "껌"
|
off: "껌"
|
||||||
|
clickToFinishEmailVerification: "[{ok}]럴 누질라서 전자우펜 정멩얼 껕내이소."
|
||||||
searchByGoogle: "찾기"
|
searchByGoogle: "찾기"
|
||||||
tenMinutes: "십 분"
|
tenMinutes: "십 분"
|
||||||
oneHour: "한 시간"
|
oneHour: "한 시간"
|
||||||
|
@ -459,6 +491,20 @@ likeOnly: "좋네예마"
|
||||||
icon: "아바타"
|
icon: "아바타"
|
||||||
replies: "답하기"
|
replies: "답하기"
|
||||||
renotes: "리노트"
|
renotes: "리노트"
|
||||||
|
_initialAccountSetting:
|
||||||
|
startTutorial: "길라잡이 하기"
|
||||||
|
_initialTutorial:
|
||||||
|
launchTutorial: "길라잡이 보기"
|
||||||
|
title: "길라잡이"
|
||||||
|
skipAreYouSure: "길라잡이럴 껕냅니까?"
|
||||||
|
_landing:
|
||||||
|
title: "길라잡이에 어서 오이소"
|
||||||
|
_done:
|
||||||
|
title: "길라잡이가 껕낫십니다!🎉"
|
||||||
|
_achievements:
|
||||||
|
_types:
|
||||||
|
_tutorialCompleted:
|
||||||
|
description: "길라잡이럴 껕냇십니다"
|
||||||
_gallery:
|
_gallery:
|
||||||
liked: "좋네예한 걸"
|
liked: "좋네예한 걸"
|
||||||
like: "좋네예!"
|
like: "좋네예!"
|
||||||
|
@ -466,13 +512,16 @@ _gallery:
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
title: "새 팔로워가 잇십니다"
|
title: "새 팔로워가 잇십니다"
|
||||||
|
_channel:
|
||||||
|
removeBanner: "배너 뭉캐기"
|
||||||
_theme:
|
_theme:
|
||||||
keys:
|
keys:
|
||||||
mention: "멘션"
|
mention: "멘션"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "노트"
|
note: "새 노트"
|
||||||
notification: "알림"
|
notification: "알림"
|
||||||
_2fa:
|
_2fa:
|
||||||
|
step3Title: "학인 기호럴 서기"
|
||||||
renewTOTPCancel: "뎃어예"
|
renewTOTPCancel: "뎃어예"
|
||||||
_widgets:
|
_widgets:
|
||||||
profile: "프로필"
|
profile: "프로필"
|
||||||
|
@ -501,11 +550,15 @@ _charts:
|
||||||
federation: "옌합"
|
federation: "옌합"
|
||||||
_timelines:
|
_timelines:
|
||||||
home: "덜머리"
|
home: "덜머리"
|
||||||
|
_play:
|
||||||
|
script: "스크립트"
|
||||||
_pages:
|
_pages:
|
||||||
like: "좋네예"
|
like: "좋네예"
|
||||||
unlike: "좋네예 무루기"
|
unlike: "좋네예 무루기"
|
||||||
blocks:
|
blocks:
|
||||||
image: "이미지"
|
image: "이미지"
|
||||||
|
_note:
|
||||||
|
id: "노트 아이디"
|
||||||
_notification:
|
_notification:
|
||||||
youWereFollowed: "새 팔로워가 잇십니다"
|
youWereFollowed: "새 팔로워가 잇십니다"
|
||||||
_types:
|
_types:
|
||||||
|
@ -526,3 +579,6 @@ _webhookSettings:
|
||||||
name: "이럼"
|
name: "이럼"
|
||||||
_moderationLogTypes:
|
_moderationLogTypes:
|
||||||
suspend: "얼우기"
|
suspend: "얼우기"
|
||||||
|
deleteNote: "노트 뭉캐기"
|
||||||
|
deleteUserAnnouncement: "사용자 공지 걸 뭉캐기"
|
||||||
|
resolveAbuseReport: "신고 해겔하기"
|
||||||
|
|
|
@ -121,7 +121,12 @@ sensitive: "열람 주의"
|
||||||
add: "추가"
|
add: "추가"
|
||||||
reaction: "리액션"
|
reaction: "리액션"
|
||||||
reactions: "리액션"
|
reactions: "리액션"
|
||||||
reactionSetting: "선택기에 표시할 리액션"
|
emojiPicker: "이모지 선택기"
|
||||||
|
pinnedEmojisForReactionSettingDescription: "리액션을 할 때 프로필에 고정하여 표시할 이모지를 설정할 수 있습니다"
|
||||||
|
pinnedEmojisSettingDescription: "이모지를 입력할 때 프로필에 고정하여 표시할 이모지를 설정할 수 있습니다"
|
||||||
|
emojiPickerDisplay: "선택기 표시"
|
||||||
|
overwriteFromPinnedEmojisForReaction: "리액션 설정을 덮어쓰기"
|
||||||
|
overwriteFromPinnedEmojis: "일반 설정을 덮어쓰기"
|
||||||
reactionSettingDescription2: "끌어서 순서 변경, 클릭해서 삭제, +를 눌러서 추가할 수 있습니다."
|
reactionSettingDescription2: "끌어서 순서 변경, 클릭해서 삭제, +를 눌러서 추가할 수 있습니다."
|
||||||
rememberNoteVisibility: "공개 범위를 기억하기"
|
rememberNoteVisibility: "공개 범위를 기억하기"
|
||||||
attachCancel: "첨부 취소"
|
attachCancel: "첨부 취소"
|
||||||
|
@ -261,6 +266,7 @@ removed: "삭제하였습니다"
|
||||||
removeAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
|
removeAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
|
||||||
deleteAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
|
deleteAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
|
||||||
resetAreYouSure: "초기화 하시겠습니까?"
|
resetAreYouSure: "초기화 하시겠습니까?"
|
||||||
|
areYouSure: "계속 진행하시겠습니까?"
|
||||||
saved: "저장하였습니다"
|
saved: "저장하였습니다"
|
||||||
messaging: "대화"
|
messaging: "대화"
|
||||||
upload: "업로드"
|
upload: "업로드"
|
||||||
|
@ -686,7 +692,7 @@ defaultNavigationBehaviour: "기본 탐색 동작"
|
||||||
editTheseSettingsMayBreakAccount: "이 설정을 변경하면 계정이 손상될 수 있습니다."
|
editTheseSettingsMayBreakAccount: "이 설정을 변경하면 계정이 손상될 수 있습니다."
|
||||||
instanceTicker: "노트의 서버 정보"
|
instanceTicker: "노트의 서버 정보"
|
||||||
waitingFor: "{x}을(를) 기다리고 있습니다"
|
waitingFor: "{x}을(를) 기다리고 있습니다"
|
||||||
random: "랜덤"
|
random: "무작위"
|
||||||
system: "시스템"
|
system: "시스템"
|
||||||
switchUi: "UI 전환"
|
switchUi: "UI 전환"
|
||||||
desktop: "데스크탑"
|
desktop: "데스크탑"
|
||||||
|
@ -875,8 +881,8 @@ makeReactionsPublicDescription: "나의 리액션을 누구나 볼 수 있게
|
||||||
classic: "클래식"
|
classic: "클래식"
|
||||||
muteThread: "글타래 뮤트"
|
muteThread: "글타래 뮤트"
|
||||||
unmuteThread: "글타래 뮤트 해제"
|
unmuteThread: "글타래 뮤트 해제"
|
||||||
ffVisibility: "내 인맥의 공개 범위"
|
followingVisibility: "팔로우의 공개 범위"
|
||||||
ffVisibilityDescription: "나의 팔로우와 팔로워 정보에 대한 공개 범위를 설정할 수 있습니다."
|
followersVisibility: "팔로워의 공개 범위"
|
||||||
continueThread: "글타래 더 보기"
|
continueThread: "글타래 더 보기"
|
||||||
deleteAccountConfirm: "계정이 삭제되고 되돌릴 수 없게 됩니다. 계속하시겠습니까? "
|
deleteAccountConfirm: "계정이 삭제되고 되돌릴 수 없게 됩니다. 계속하시겠습니까? "
|
||||||
incorrectPassword: "비밀번호가 올바르지 않습니다."
|
incorrectPassword: "비밀번호가 올바르지 않습니다."
|
||||||
|
@ -1156,7 +1162,8 @@ privacyPolicyUrl: "개인정보 보호 정책 URL"
|
||||||
tosAndPrivacyPolicy: "약관 및 개인정보 보호 정책"
|
tosAndPrivacyPolicy: "약관 및 개인정보 보호 정책"
|
||||||
avatarDecorations: "아바타 장식"
|
avatarDecorations: "아바타 장식"
|
||||||
attach: "붙이기"
|
attach: "붙이기"
|
||||||
detach: "떼기"
|
detach: "빼기"
|
||||||
|
detachAll: "모두 빼기"
|
||||||
angle: "각도"
|
angle: "각도"
|
||||||
flip: "플립"
|
flip: "플립"
|
||||||
showAvatarDecorations: "아바타 장식 표시"
|
showAvatarDecorations: "아바타 장식 표시"
|
||||||
|
@ -1170,6 +1177,10 @@ cwNotationRequired: "'내용을 숨기기'를 체크한 경우 주석을 써야
|
||||||
doReaction: "리액션 추가"
|
doReaction: "리액션 추가"
|
||||||
code: "문자열"
|
code: "문자열"
|
||||||
reloadRequiredToApplySettings: "설정을 적용하려면 새로고침을 해야 합니다."
|
reloadRequiredToApplySettings: "설정을 적용하려면 새로고침을 해야 합니다."
|
||||||
|
remainingN: "나머지: {n}"
|
||||||
|
overwriteContentConfirm: "현재 내용을 덮어쓰기 합니다. 계속 진행하시겠습니까?"
|
||||||
|
seasonalScreenEffect: "철에 맞는 화면으로 꾸미기"
|
||||||
|
decorate: "장식하기"
|
||||||
_announcement:
|
_announcement:
|
||||||
forExistingUsers: "기존 유저에게만 알림"
|
forExistingUsers: "기존 유저에게만 알림"
|
||||||
forExistingUsersDescription: "활성화하면 이 공지사항을 게시한 시점에서 이미 가입한 유저에게만 표시합니다. 비활성화하면 게시 후에 가입한 유저에게도 표시합니다."
|
forExistingUsersDescription: "활성화하면 이 공지사항을 게시한 시점에서 이미 가입한 유저에게만 표시합니다. 비활성화하면 게시 후에 가입한 유저에게도 표시합니다."
|
||||||
|
@ -1601,6 +1612,7 @@ _role:
|
||||||
canHideAds: "광고 숨기기"
|
canHideAds: "광고 숨기기"
|
||||||
canSearchNotes: "노트 검색 이용 가능 여부"
|
canSearchNotes: "노트 검색 이용 가능 여부"
|
||||||
canUseTranslator: "번역 기능의 사용"
|
canUseTranslator: "번역 기능의 사용"
|
||||||
|
avatarDecorationLimit: "아바타 장식의 최대 붙임 개수"
|
||||||
_condition:
|
_condition:
|
||||||
isLocal: "로컬 사용자"
|
isLocal: "로컬 사용자"
|
||||||
isRemote: "리모트 사용자"
|
isRemote: "리모트 사용자"
|
||||||
|
@ -1828,8 +1840,8 @@ _soundSettings:
|
||||||
driveFileWarn: "드라이브에 있는 파일을 선택하세요."
|
driveFileWarn: "드라이브에 있는 파일을 선택하세요."
|
||||||
driveFileTypeWarn: "이 파일은 지원되지 않습니다."
|
driveFileTypeWarn: "이 파일은 지원되지 않습니다."
|
||||||
driveFileTypeWarnDescription: "오디오 파일을 선택하세요."
|
driveFileTypeWarnDescription: "오디오 파일을 선택하세요."
|
||||||
driveFileDurationWarn: "오디오가 너무 길어요."
|
driveFileDurationWarn: "오디오가 너무 깁니다"
|
||||||
driveFileDurationWarnDescription: "길은 오디오를 사용하시는 경우 미스키 사용에 지장이 갈 수도 있습니다. 그래도 괜찮습니까?"
|
driveFileDurationWarnDescription: "긴 오디오로 설정할 경우 미스키 사용에 지장이 갈 수도 있습니다. 그래도 괜찮습니까?"
|
||||||
_ago:
|
_ago:
|
||||||
future: "미래"
|
future: "미래"
|
||||||
justNow: "방금 전"
|
justNow: "방금 전"
|
||||||
|
@ -2037,6 +2049,7 @@ _profile:
|
||||||
changeAvatar: "아바타 이미지 변경"
|
changeAvatar: "아바타 이미지 변경"
|
||||||
changeBanner: "배너 이미지 변경"
|
changeBanner: "배너 이미지 변경"
|
||||||
verifiedLinkDescription: "내용에 자신의 프로필로 향하는 링크가 포함된 페이지의 URL을 삽입하면 소유자 인증 마크가 표시됩니다."
|
verifiedLinkDescription: "내용에 자신의 프로필로 향하는 링크가 포함된 페이지의 URL을 삽입하면 소유자 인증 마크가 표시됩니다."
|
||||||
|
avatarDecorationMax: "최대 {max}개까지 장식을 할 수 있습니다."
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "모든 노트"
|
allNotes: "모든 노트"
|
||||||
favoritedNotes: "즐겨찾기한 노트"
|
favoritedNotes: "즐겨찾기한 노트"
|
||||||
|
@ -2158,6 +2171,7 @@ _notification:
|
||||||
pollEnded: "투표 결과가 발표되었습니다"
|
pollEnded: "투표 결과가 발표되었습니다"
|
||||||
newNote: "새 게시물"
|
newNote: "새 게시물"
|
||||||
unreadAntennaNote: "안테나 {name}"
|
unreadAntennaNote: "안테나 {name}"
|
||||||
|
roleAssigned: "역할이 부여 되었습니다."
|
||||||
emptyPushNotificationMessage: "푸시 알림이 갱신되었습니다"
|
emptyPushNotificationMessage: "푸시 알림이 갱신되었습니다"
|
||||||
achievementEarned: "도전 과제를 달성했습니다"
|
achievementEarned: "도전 과제를 달성했습니다"
|
||||||
testNotification: "알림 테스트"
|
testNotification: "알림 테스트"
|
||||||
|
@ -2270,9 +2284,9 @@ _moderationLogTypes:
|
||||||
createAd: "광고 생성"
|
createAd: "광고 생성"
|
||||||
deleteAd: "광고 삭제"
|
deleteAd: "광고 삭제"
|
||||||
updateAd: "광고 수정"
|
updateAd: "광고 수정"
|
||||||
createAvatarDecoration: "아이콘 장식 추가"
|
createAvatarDecoration: "아바타 장식 만들기"
|
||||||
updateAvatarDecoration: "아이콘 장식 수정"
|
updateAvatarDecoration: "아바타 장식 수정"
|
||||||
deleteAvatarDecoration: "아이콘 장식 삭제"
|
deleteAvatarDecoration: "아바타 장식 삭제"
|
||||||
unsetUserAvatar: "유저 아바타 제거"
|
unsetUserAvatar: "유저 아바타 제거"
|
||||||
unsetUserBanner: "유저 배너 제거"
|
unsetUserBanner: "유저 배너 제거"
|
||||||
_fileViewer:
|
_fileViewer:
|
||||||
|
|
|
@ -119,7 +119,6 @@ sensitive: "NSFW"
|
||||||
add: "Toevoegen"
|
add: "Toevoegen"
|
||||||
reaction: "Reacties"
|
reaction: "Reacties"
|
||||||
reactions: "Reacties"
|
reactions: "Reacties"
|
||||||
reactionSetting: "Reacties die in de reactie-selector worden getoond"
|
|
||||||
reactionSettingDescription2: "Sleep om opnieuw te ordenen, Klik om te verwijderen, Druk op \"+\" om toe te voegen"
|
reactionSettingDescription2: "Sleep om opnieuw te ordenen, Klik om te verwijderen, Druk op \"+\" om toe te voegen"
|
||||||
rememberNoteVisibility: "Vergeet niet de notitie zichtbaarheidsinstellingen"
|
rememberNoteVisibility: "Vergeet niet de notitie zichtbaarheidsinstellingen"
|
||||||
attachCancel: "Verwijder bijlage"
|
attachCancel: "Verwijder bijlage"
|
||||||
|
|
|
@ -102,7 +102,6 @@ clickToShow: "Klikk for å vise"
|
||||||
add: "Legg til"
|
add: "Legg til"
|
||||||
reaction: "Reaksjon"
|
reaction: "Reaksjon"
|
||||||
reactions: "Reaksjoner"
|
reactions: "Reaksjoner"
|
||||||
reactionSetting: "Reaksjoner som vises i reaksjonsvelgeren"
|
|
||||||
reactionSettingDescription2: "Dra for å endre rekkefølgen, klikk for å slette, trykk \"+\" for å legge til."
|
reactionSettingDescription2: "Dra for å endre rekkefølgen, klikk for å slette, trykk \"+\" for å legge til."
|
||||||
rememberNoteVisibility: "Husk innstillingene for synlighet av Notes"
|
rememberNoteVisibility: "Husk innstillingene for synlighet av Notes"
|
||||||
attachCancel: "Fjern vedlegg"
|
attachCancel: "Fjern vedlegg"
|
||||||
|
|
|
@ -111,7 +111,6 @@ sensitive: "NSFW"
|
||||||
add: "Dodaj"
|
add: "Dodaj"
|
||||||
reaction: "Reakcja"
|
reaction: "Reakcja"
|
||||||
reactions: "Reakcja"
|
reactions: "Reakcja"
|
||||||
reactionSetting: "Reakcje do pokazania w wyborniku reakcji"
|
|
||||||
reactionSettingDescription2: "Przeciągnij aby zmienić kolejność, naciśnij aby usunąć, naciśnij „+” aby dodać"
|
reactionSettingDescription2: "Przeciągnij aby zmienić kolejność, naciśnij aby usunąć, naciśnij „+” aby dodać"
|
||||||
rememberNoteVisibility: "Zapamiętuj ustawienia widoczności wpisu"
|
rememberNoteVisibility: "Zapamiętuj ustawienia widoczności wpisu"
|
||||||
attachCancel: "Usuń załącznik"
|
attachCancel: "Usuń załącznik"
|
||||||
|
@ -807,8 +806,6 @@ makeReactionsPublicDescription: "To spowoduje, że lista wszystkich Twoich dotyc
|
||||||
classic: "Klasyczny"
|
classic: "Klasyczny"
|
||||||
muteThread: "Wycisz wątek"
|
muteThread: "Wycisz wątek"
|
||||||
unmuteThread: "Wyłącz wyciszenie wątku"
|
unmuteThread: "Wyłącz wyciszenie wątku"
|
||||||
ffVisibility: "Widoczność obserwowanych/obserwujących"
|
|
||||||
ffVisibilityDescription: "Pozwala skonfigurować, kto może zobaczyć, kogo obserwujesz i kto Cię obserwuje."
|
|
||||||
continueThread: "Pokaż kontynuację wątku"
|
continueThread: "Pokaż kontynuację wątku"
|
||||||
deleteAccountConfirm: "Spowoduje to nieodwracalne usunięcie Twojego konta. Kontynuować?"
|
deleteAccountConfirm: "Spowoduje to nieodwracalne usunięcie Twojego konta. Kontynuować?"
|
||||||
incorrectPassword: "Nieprawidłowe hasło."
|
incorrectPassword: "Nieprawidłowe hasło."
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "Conteúdo sensível"
|
||||||
add: "Adicionar"
|
add: "Adicionar"
|
||||||
reaction: "Reações"
|
reaction: "Reações"
|
||||||
reactions: "Reações"
|
reactions: "Reações"
|
||||||
reactionSetting: "Quais reações exibir no seletor de reações"
|
|
||||||
reactionSettingDescription2: "Arraste para reordenar, clique para excluir, pressione + para adicionar."
|
reactionSettingDescription2: "Arraste para reordenar, clique para excluir, pressione + para adicionar."
|
||||||
rememberNoteVisibility: "Lembrar das configurações de visibilidade de notas"
|
rememberNoteVisibility: "Lembrar das configurações de visibilidade de notas"
|
||||||
attachCancel: "Remover anexo"
|
attachCancel: "Remover anexo"
|
||||||
|
@ -859,8 +858,6 @@ makeReactionsPublicDescription: "Isto vai deixar o histórico de todas as suas r
|
||||||
classic: "Clássico"
|
classic: "Clássico"
|
||||||
muteThread: "Silenciar esta conversa"
|
muteThread: "Silenciar esta conversa"
|
||||||
unmuteThread: "Desativar silêncio desta conversa"
|
unmuteThread: "Desativar silêncio desta conversa"
|
||||||
ffVisibility: "Visibilidade de Seguidos/Seguidores"
|
|
||||||
ffVisibilityDescription: "Permite configurar quem pode ver quem lhe segue e quem você está seguindo."
|
|
||||||
continueThread: "Ver mais desta conversa"
|
continueThread: "Ver mais desta conversa"
|
||||||
deleteAccountConfirm: "Deseja realmente excluir a conta?"
|
deleteAccountConfirm: "Deseja realmente excluir a conta?"
|
||||||
incorrectPassword: "Senha inválida."
|
incorrectPassword: "Senha inválida."
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "NSFW"
|
||||||
add: "Adaugă"
|
add: "Adaugă"
|
||||||
reaction: "Reacție"
|
reaction: "Reacție"
|
||||||
reactions: "Reacție"
|
reactions: "Reacție"
|
||||||
reactionSetting: "Reacții care să apară in selectorul de reacții"
|
|
||||||
reactionSettingDescription2: "Trage pentru a rearanja, apasă pe \"+\" pentru a adăuga."
|
reactionSettingDescription2: "Trage pentru a rearanja, apasă pe \"+\" pentru a adăuga."
|
||||||
rememberNoteVisibility: "Amintește setarea de vizibilitate a notelor"
|
rememberNoteVisibility: "Amintește setarea de vizibilitate a notelor"
|
||||||
attachCancel: "Înlătură atașament"
|
attachCancel: "Înlătură atașament"
|
||||||
|
|
|
@ -120,7 +120,6 @@ sensitive: "Содержимое не для всех"
|
||||||
add: "Добавить"
|
add: "Добавить"
|
||||||
reaction: "Реакции"
|
reaction: "Реакции"
|
||||||
reactions: "Реакции"
|
reactions: "Реакции"
|
||||||
reactionSetting: "Реакции, отображаемые в палитре"
|
|
||||||
reactionSettingDescription2: "Расставляйте перетаскиванием, удаляйте нажатием, добавляйте кнопкой «+»."
|
reactionSettingDescription2: "Расставляйте перетаскиванием, удаляйте нажатием, добавляйте кнопкой «+»."
|
||||||
rememberNoteVisibility: "Запоминать видимость заметок"
|
rememberNoteVisibility: "Запоминать видимость заметок"
|
||||||
attachCancel: "Удалить вложение"
|
attachCancel: "Удалить вложение"
|
||||||
|
@ -857,8 +856,6 @@ makeReactionsPublicDescription: "Список сделанных вами реа
|
||||||
classic: "Классика"
|
classic: "Классика"
|
||||||
muteThread: "Скрыть цепочку"
|
muteThread: "Скрыть цепочку"
|
||||||
unmuteThread: "Отменить сокрытие цепочки"
|
unmuteThread: "Отменить сокрытие цепочки"
|
||||||
ffVisibility: "Видимость подписок и подписчиков"
|
|
||||||
ffVisibilityDescription: "Здесь можно настроить, кто будет видеть ваши подписки и подписчиков."
|
|
||||||
continueThread: "Показать следующие ответы"
|
continueThread: "Показать следующие ответы"
|
||||||
deleteAccountConfirm: "Учётная запись будет безвозвратно удалена. Подтверждаете?"
|
deleteAccountConfirm: "Учётная запись будет безвозвратно удалена. Подтверждаете?"
|
||||||
incorrectPassword: "Пароль неверен."
|
incorrectPassword: "Пароль неверен."
|
||||||
|
|
|
@ -113,7 +113,6 @@ sensitive: "NSFW"
|
||||||
add: "Pridať"
|
add: "Pridať"
|
||||||
reaction: "Reakcie"
|
reaction: "Reakcie"
|
||||||
reactions: "Reakcie"
|
reactions: "Reakcie"
|
||||||
reactionSetting: "Reakcie zobrazené vo výbere reakcií"
|
|
||||||
reactionSettingDescription2: "Ťahaním preusporiadate, kliknutím odstránite, Stlačením \"+\" pridáte"
|
reactionSettingDescription2: "Ťahaním preusporiadate, kliknutím odstránite, Stlačením \"+\" pridáte"
|
||||||
rememberNoteVisibility: "Zapamätať nastavenia viditeľnosti poznámky"
|
rememberNoteVisibility: "Zapamätať nastavenia viditeľnosti poznámky"
|
||||||
attachCancel: "Odstrániť prílohu"
|
attachCancel: "Odstrániť prílohu"
|
||||||
|
@ -822,8 +821,6 @@ makeReactionsPublicDescription: "Toto spraví všetky vaše minulé reakcie vidi
|
||||||
classic: "Klasika"
|
classic: "Klasika"
|
||||||
muteThread: "Ztíšiť vlákno"
|
muteThread: "Ztíšiť vlákno"
|
||||||
unmuteThread: "Zrušiť stíšenie vlákna"
|
unmuteThread: "Zrušiť stíšenie vlákna"
|
||||||
ffVisibility: "Viditeľnosť sledujúcich/sledovaných"
|
|
||||||
ffVisibilityDescription: "Umožňuje nastaviť kto vidí koho sledujete a kto vás sleduje."
|
|
||||||
continueThread: "Zobraziť pokračovanie vlákna"
|
continueThread: "Zobraziť pokračovanie vlákna"
|
||||||
deleteAccountConfirm: "Toto nezvrátiteľne vymaže váš účet. Pokračovať?"
|
deleteAccountConfirm: "Toto nezvrátiteľne vymaže váš účet. Pokračovať?"
|
||||||
incorrectPassword: "Nesprávne heslo."
|
incorrectPassword: "Nesprávne heslo."
|
||||||
|
|
|
@ -118,7 +118,6 @@ sensitive: "Känsligt innehåll"
|
||||||
add: "Lägg till"
|
add: "Lägg till"
|
||||||
reaction: "Reaktioner"
|
reaction: "Reaktioner"
|
||||||
reactions: "Reaktioner"
|
reactions: "Reaktioner"
|
||||||
reactionSetting: "Reaktioner som ska visas i reaktionsväljaren"
|
|
||||||
reactionSettingDescription2: "Dra för att omordna, klicka för att radera, tryck \"+\" för att lägga till."
|
reactionSettingDescription2: "Dra för att omordna, klicka för att radera, tryck \"+\" för att lägga till."
|
||||||
rememberNoteVisibility: "Komihåg notvisningsinställningar"
|
rememberNoteVisibility: "Komihåg notvisningsinställningar"
|
||||||
attachCancel: "Ta bort bilaga"
|
attachCancel: "Ta bort bilaga"
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "เนื้อหาที่ละเอียดอ่อน NSFW
|
||||||
add: "เพิ่ม"
|
add: "เพิ่ม"
|
||||||
reaction: "รีแอคชั่น"
|
reaction: "รีแอคชั่น"
|
||||||
reactions: "รีแอคชั่น"
|
reactions: "รีแอคชั่น"
|
||||||
reactionSetting: "รีแอคชั่นไปยังแสดงผลในตัวเลือกการรีแอคชั่น"
|
|
||||||
reactionSettingDescription2: "กดลากเพื่อจัดลำดับใหม่ กดคลิกเพื่อลบ กด \"+\" เพื่อเพิ่ม"
|
reactionSettingDescription2: "กดลากเพื่อจัดลำดับใหม่ กดคลิกเพื่อลบ กด \"+\" เพื่อเพิ่ม"
|
||||||
rememberNoteVisibility: "จดจำการตั้งค่าการมองเห็นตัวโน้ต"
|
rememberNoteVisibility: "จดจำการตั้งค่าการมองเห็นตัวโน้ต"
|
||||||
attachCancel: "ลบไฟล์ออกที่แนบมา"
|
attachCancel: "ลบไฟล์ออกที่แนบมา"
|
||||||
|
@ -870,8 +869,6 @@ makeReactionsPublicDescription: "การทำเช่นนี้จะท
|
||||||
classic: "คลาสสิค"
|
classic: "คลาสสิค"
|
||||||
muteThread: "ปิดเสียงเธรด"
|
muteThread: "ปิดเสียงเธรด"
|
||||||
unmuteThread: "เปิดเสียงเธรด"
|
unmuteThread: "เปิดเสียงเธรด"
|
||||||
ffVisibility: "การมองเห็นผู้ติดตาม/ผู้ติดตาม"
|
|
||||||
ffVisibilityDescription: "ช่วยให้คุณสามารถกำหนดค่าได้ว่าใครสามารถดูได้ว่าคุณติดตามใครและใครติดตามคุณบ้าง"
|
|
||||||
continueThread: "ดูความต่อเนื่องเธรด"
|
continueThread: "ดูความต่อเนื่องเธรด"
|
||||||
deleteAccountConfirm: "การดำเนินการนี้จะลบบัญชีของคุณอย่างถาวรเลยนะ แน่ใจหรอดำเนินการ?"
|
deleteAccountConfirm: "การดำเนินการนี้จะลบบัญชีของคุณอย่างถาวรเลยนะ แน่ใจหรอดำเนินการ?"
|
||||||
incorrectPassword: "รหัสผ่านไม่ถูกต้อง"
|
incorrectPassword: "รหัสผ่านไม่ถูกต้อง"
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "Hassas içerik"
|
||||||
add: "Ekle"
|
add: "Ekle"
|
||||||
reaction: "Tepkiler"
|
reaction: "Tepkiler"
|
||||||
reactions: "Tepkiler"
|
reactions: "Tepkiler"
|
||||||
reactionSetting: "Palette görünecek tepkiler"
|
|
||||||
reactionSettingDescription2: "Sıralamak için sürükleyin, silmek için tıklayın, eklemek için \"+\" tuşuna tıklayın."
|
reactionSettingDescription2: "Sıralamak için sürükleyin, silmek için tıklayın, eklemek için \"+\" tuşuna tıklayın."
|
||||||
rememberNoteVisibility: "Görünürlük ayarlarını hatırla"
|
rememberNoteVisibility: "Görünürlük ayarlarını hatırla"
|
||||||
attachCancel: "Eki sil"
|
attachCancel: "Eki sil"
|
||||||
|
|
|
@ -55,6 +55,7 @@ copyRSS: "Скопіювати RSS"
|
||||||
copyUsername: "Скопіювати ім’я користувача"
|
copyUsername: "Скопіювати ім’я користувача"
|
||||||
copyUserId: "Копіювати ID користувача"
|
copyUserId: "Копіювати ID користувача"
|
||||||
copyNoteId: "блокнот ID користувача"
|
copyNoteId: "блокнот ID користувача"
|
||||||
|
copyFileId: "Скопіювати ідентифікатор файлу."
|
||||||
searchUser: "Пошук користувачів"
|
searchUser: "Пошук користувачів"
|
||||||
reply: "Відповісти"
|
reply: "Відповісти"
|
||||||
loadMore: "Показати більше"
|
loadMore: "Показати більше"
|
||||||
|
@ -115,7 +116,6 @@ sensitive: "NSFW"
|
||||||
add: "Додати"
|
add: "Додати"
|
||||||
reaction: "Реакції"
|
reaction: "Реакції"
|
||||||
reactions: "Реакції"
|
reactions: "Реакції"
|
||||||
reactionSetting: "Налаштування реакцій"
|
|
||||||
reactionSettingDescription2: "Перемістити щоб змінити порядок, Клацнути мишою щоб видалити, Натиснути \"+\" щоб додати."
|
reactionSettingDescription2: "Перемістити щоб змінити порядок, Клацнути мишою щоб видалити, Натиснути \"+\" щоб додати."
|
||||||
rememberNoteVisibility: "Пам’ятати параметри видимісті"
|
rememberNoteVisibility: "Пам’ятати параметри видимісті"
|
||||||
attachCancel: "Видалити вкладення"
|
attachCancel: "Видалити вкладення"
|
||||||
|
@ -133,6 +133,7 @@ unblockConfirm: "Ви впевнені, що хочете розблокуват
|
||||||
suspendConfirm: "Ви впевнені, що хочете призупинити цей акаунт?"
|
suspendConfirm: "Ви впевнені, що хочете призупинити цей акаунт?"
|
||||||
unsuspendConfirm: "Ви впевнені, що хочете відновити цей акаунт?"
|
unsuspendConfirm: "Ви впевнені, що хочете відновити цей акаунт?"
|
||||||
selectList: "Виберіть список"
|
selectList: "Виберіть список"
|
||||||
|
editList: "Редагувати список."
|
||||||
selectChannel: "Виберіть канал"
|
selectChannel: "Виберіть канал"
|
||||||
selectAntenna: "Виберіть антену"
|
selectAntenna: "Виберіть антену"
|
||||||
selectWidget: "Виберіть віджет"
|
selectWidget: "Виберіть віджет"
|
||||||
|
@ -448,6 +449,7 @@ or: "або"
|
||||||
language: "Мова"
|
language: "Мова"
|
||||||
uiLanguage: "Мова інтерфейсу"
|
uiLanguage: "Мова інтерфейсу"
|
||||||
aboutX: "Про {x}"
|
aboutX: "Про {x}"
|
||||||
|
native: "місцевий"
|
||||||
disableDrawer: "Не використовувати висувні меню"
|
disableDrawer: "Не використовувати висувні меню"
|
||||||
noHistory: "Історія порожня"
|
noHistory: "Історія порожня"
|
||||||
signinHistory: "Історія входів"
|
signinHistory: "Історія входів"
|
||||||
|
@ -526,6 +528,8 @@ output: "Вихід"
|
||||||
script: "Скрипт"
|
script: "Скрипт"
|
||||||
disablePagesScript: "Вимкнути AiScript на Сторінках"
|
disablePagesScript: "Вимкнути AiScript на Сторінках"
|
||||||
updateRemoteUser: "Оновити інформацію про віддаленого користувача"
|
updateRemoteUser: "Оновити інформацію про віддаленого користувача"
|
||||||
|
unsetUserAvatar: "Деактивувати піктограму."
|
||||||
|
unsetUserBanner: "Випустити прапор."
|
||||||
deleteAllFiles: "Видалити всі файли"
|
deleteAllFiles: "Видалити всі файли"
|
||||||
deleteAllFilesConfirm: "Ви дійсно хочете видалити всі файли?"
|
deleteAllFilesConfirm: "Ви дійсно хочете видалити всі файли?"
|
||||||
removeAllFollowing: "Скасувати всі підписки"
|
removeAllFollowing: "Скасувати всі підписки"
|
||||||
|
@ -813,7 +817,6 @@ makeReactionsPublicDescription: "Це зробить список усіх ва
|
||||||
classic: "Класичний"
|
classic: "Класичний"
|
||||||
muteThread: "Приглушити тред"
|
muteThread: "Приглушити тред"
|
||||||
unmuteThread: "Скасувати глушіння"
|
unmuteThread: "Скасувати глушіння"
|
||||||
ffVisibility: "Видимість підписок/підписників"
|
|
||||||
continueThread: "Показати продовження треду"
|
continueThread: "Показати продовження треду"
|
||||||
deleteAccountConfirm: "Це незворотно видалить ваш акаунт. Продовжити?"
|
deleteAccountConfirm: "Це незворотно видалить ваш акаунт. Продовжити?"
|
||||||
incorrectPassword: "Неправильний пароль."
|
incorrectPassword: "Неправильний пароль."
|
||||||
|
|
|
@ -120,7 +120,6 @@ sensitive: "Sezuvchan"
|
||||||
add: "Qo'shish"
|
add: "Qo'shish"
|
||||||
reaction: "Reaktsiyalar"
|
reaction: "Reaktsiyalar"
|
||||||
reactions: "Reaktsiyalar"
|
reactions: "Reaktsiyalar"
|
||||||
reactionSetting: "Reaksiyalar ro'yxati"
|
|
||||||
reactionSettingDescription2: "Qayta tartiblash uchun ushlab turib siljiting, oʻchirish uchun bosing, qoʻshish uchun “+” tugmasini bosing."
|
reactionSettingDescription2: "Qayta tartiblash uchun ushlab turib siljiting, oʻchirish uchun bosing, qoʻshish uchun “+” tugmasini bosing."
|
||||||
rememberNoteVisibility: "Qaydning ko'rinish sozlamarini eslab qolish"
|
rememberNoteVisibility: "Qaydning ko'rinish sozlamarini eslab qolish"
|
||||||
attachCancel: "Qo'shimchani olib tashlash"
|
attachCancel: "Qo'shimchani olib tashlash"
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "Nhạy cảm"
|
||||||
add: "Thêm"
|
add: "Thêm"
|
||||||
reaction: "Biểu cảm"
|
reaction: "Biểu cảm"
|
||||||
reactions: "Biểu cảm"
|
reactions: "Biểu cảm"
|
||||||
reactionSetting: "Chọn những biểu cảm hiển thị"
|
|
||||||
reactionSettingDescription2: "Kéo để sắp xếp, nhấn để xóa, nhấn \"+\" để thêm."
|
reactionSettingDescription2: "Kéo để sắp xếp, nhấn để xóa, nhấn \"+\" để thêm."
|
||||||
rememberNoteVisibility: "Lưu kiểu tút mặc định"
|
rememberNoteVisibility: "Lưu kiểu tút mặc định"
|
||||||
attachCancel: "Gỡ tập tin đính kèm"
|
attachCancel: "Gỡ tập tin đính kèm"
|
||||||
|
@ -858,8 +857,6 @@ makeReactionsPublicDescription: "Điều này sẽ hiển thị công khai danh
|
||||||
classic: "Cổ điển"
|
classic: "Cổ điển"
|
||||||
muteThread: "Không quan tâm nữa"
|
muteThread: "Không quan tâm nữa"
|
||||||
unmuteThread: "Quan tâm tút này"
|
unmuteThread: "Quan tâm tút này"
|
||||||
ffVisibility: "Hiển thị Theo dõi/Người theo dõi"
|
|
||||||
ffVisibilityDescription: "Quyết định ai có thể xem những người bạn theo dõi và những người theo dõi bạn."
|
|
||||||
continueThread: "Tiếp tục xem chuỗi tút"
|
continueThread: "Tiếp tục xem chuỗi tút"
|
||||||
deleteAccountConfirm: "Điều này sẽ khiến tài khoản bị xóa vĩnh viễn. Vẫn tiếp tục?"
|
deleteAccountConfirm: "Điều này sẽ khiến tài khoản bị xóa vĩnh viễn. Vẫn tiếp tục?"
|
||||||
incorrectPassword: "Sai mật khẩu."
|
incorrectPassword: "Sai mật khẩu."
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "敏感内容"
|
||||||
add: "添加"
|
add: "添加"
|
||||||
reaction: "回应"
|
reaction: "回应"
|
||||||
reactions: "回应"
|
reactions: "回应"
|
||||||
reactionSetting: "在选择器中显示回应"
|
|
||||||
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
|
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
|
||||||
rememberNoteVisibility: "保存上次设置的可见性"
|
rememberNoteVisibility: "保存上次设置的可见性"
|
||||||
attachCancel: "删除附件"
|
attachCancel: "删除附件"
|
||||||
|
@ -867,8 +866,6 @@ makeReactionsPublicDescription: "将您发表过的回应设置成公开可见
|
||||||
classic: "经典"
|
classic: "经典"
|
||||||
muteThread: "屏蔽帖子列表"
|
muteThread: "屏蔽帖子列表"
|
||||||
unmuteThread: "取消屏蔽帖子列表"
|
unmuteThread: "取消屏蔽帖子列表"
|
||||||
ffVisibility: "关注关系的可见范围"
|
|
||||||
ffVisibilityDescription: "您可以设置您的关注/关注者信息的公开范围"
|
|
||||||
continueThread: "查看更多帖子"
|
continueThread: "查看更多帖子"
|
||||||
deleteAccountConfirm: "将要删除账户。是否确认?"
|
deleteAccountConfirm: "将要删除账户。是否确认?"
|
||||||
incorrectPassword: "密码错误"
|
incorrectPassword: "密码错误"
|
||||||
|
@ -1164,7 +1161,7 @@ _serverSettings:
|
||||||
appIconUsageExample: "例如:作为书签添加到 PWA 或手机主屏幕的时候"
|
appIconUsageExample: "例如:作为书签添加到 PWA 或手机主屏幕的时候"
|
||||||
appIconStyleRecommendation: "因为有可能会被裁切为圆形或者圆角矩形,建议使用边缘带有留白背景的图标。"
|
appIconStyleRecommendation: "因为有可能会被裁切为圆形或者圆角矩形,建议使用边缘带有留白背景的图标。"
|
||||||
appIconResolutionMustBe: "分辨率必须为 {resolution}。"
|
appIconResolutionMustBe: "分辨率必须为 {resolution}。"
|
||||||
manifestJsonOverride: "覆盖 mainfest.json"
|
manifestJsonOverride: "覆盖 manifest.json"
|
||||||
shortName: "简称"
|
shortName: "简称"
|
||||||
shortNameDescription: "如果服务器的正式名称很长,可以用简称或者別名来替代。"
|
shortNameDescription: "如果服务器的正式名称很长,可以用简称或者別名来替代。"
|
||||||
_accountMigration:
|
_accountMigration:
|
||||||
|
|
|
@ -121,7 +121,12 @@ sensitive: "敏感內容"
|
||||||
add: "新增"
|
add: "新增"
|
||||||
reaction: "反應"
|
reaction: "反應"
|
||||||
reactions: "反應"
|
reactions: "反應"
|
||||||
reactionSetting: "在選擇器中顯示反應"
|
emojiPicker: "表情符號選擇器"
|
||||||
|
pinnedEmojisForReactionSettingDescription: "選擇反應時可以設定要固定顯示在頂端的表情符號"
|
||||||
|
pinnedEmojisSettingDescription: "輸入表情符號時可以設定要固定顯示在頂端的表情符號"
|
||||||
|
emojiPickerDisplay: "顯示表情符號選擇器"
|
||||||
|
overwriteFromPinnedEmojisForReaction: "從反應複寫設定"
|
||||||
|
overwriteFromPinnedEmojis: "從一般複寫設定"
|
||||||
reactionSettingDescription2: "拖動以交換,點擊以刪除,按下「+」以新增。"
|
reactionSettingDescription2: "拖動以交換,點擊以刪除,按下「+」以新增。"
|
||||||
rememberNoteVisibility: "記住貼文可見性"
|
rememberNoteVisibility: "記住貼文可見性"
|
||||||
attachCancel: "移除附件"
|
attachCancel: "移除附件"
|
||||||
|
@ -261,7 +266,7 @@ removed: "已刪除"
|
||||||
removeAreYouSure: "確定要刪掉「{x}」嗎?"
|
removeAreYouSure: "確定要刪掉「{x}」嗎?"
|
||||||
deleteAreYouSure: "確定要刪掉「{x}」嗎?"
|
deleteAreYouSure: "確定要刪掉「{x}」嗎?"
|
||||||
resetAreYouSure: "確定要重設嗎?"
|
resetAreYouSure: "確定要重設嗎?"
|
||||||
areYouSure: "您確定要移除所有裝飾嗎?"
|
areYouSure: "是否確定?"
|
||||||
saved: "已儲存"
|
saved: "已儲存"
|
||||||
messaging: "聊天"
|
messaging: "聊天"
|
||||||
upload: "上傳"
|
upload: "上傳"
|
||||||
|
@ -782,7 +787,7 @@ receiveAnnouncementFromInstance: "接收由本實例發出的電郵通知"
|
||||||
emailNotification: "郵件通知"
|
emailNotification: "郵件通知"
|
||||||
publish: "發布"
|
publish: "發布"
|
||||||
inChannelSearch: "頻道内搜尋"
|
inChannelSearch: "頻道内搜尋"
|
||||||
useReactionPickerForContextMenu: "點擊右鍵開啟反應工具欄"
|
useReactionPickerForContextMenu: "點擊右鍵開啟反應選擇器"
|
||||||
typingUsers: "{users}輸入中"
|
typingUsers: "{users}輸入中"
|
||||||
jumpToSpecifiedDate: "跳轉到特定日期"
|
jumpToSpecifiedDate: "跳轉到特定日期"
|
||||||
showingPastTimeline: "顯示過往的時間軸"
|
showingPastTimeline: "顯示過往的時間軸"
|
||||||
|
@ -876,8 +881,8 @@ makeReactionsPublicDescription: "將您做過的反應設為公開可見。"
|
||||||
classic: "經典"
|
classic: "經典"
|
||||||
muteThread: "將貼文串設為靜音"
|
muteThread: "將貼文串設為靜音"
|
||||||
unmuteThread: "將貼文串的靜音解除"
|
unmuteThread: "將貼文串的靜音解除"
|
||||||
ffVisibility: "連繫的可見性"
|
followingVisibility: "追隨中的可見性"
|
||||||
ffVisibilityDescription: "您可以設定追隨或追隨者資訊的公開範圍"
|
followersVisibility: "追隨者的可見性"
|
||||||
continueThread: "查看更多貼文"
|
continueThread: "查看更多貼文"
|
||||||
deleteAccountConfirm: "將要刪除帳戶。是否確定?"
|
deleteAccountConfirm: "將要刪除帳戶。是否確定?"
|
||||||
incorrectPassword: "密碼錯誤。"
|
incorrectPassword: "密碼錯誤。"
|
||||||
|
@ -1173,6 +1178,9 @@ doReaction: "做出反應"
|
||||||
code: "程式碼"
|
code: "程式碼"
|
||||||
reloadRequiredToApplySettings: "需要重新載入頁面設定才能生效。"
|
reloadRequiredToApplySettings: "需要重新載入頁面設定才能生效。"
|
||||||
remainingN: "剩餘:{n}"
|
remainingN: "剩餘:{n}"
|
||||||
|
overwriteContentConfirm: "確定要覆蓋目前的內容嗎?"
|
||||||
|
seasonalScreenEffect: "隨季節變換畫面的呈現"
|
||||||
|
decorate: "設置頭像裝飾"
|
||||||
_announcement:
|
_announcement:
|
||||||
forExistingUsers: "僅限既有的使用者"
|
forExistingUsers: "僅限既有的使用者"
|
||||||
forExistingUsersDescription: "啟用代表僅向現存使用者顯示;停用代表張貼後註冊的新使用者也會看到。"
|
forExistingUsersDescription: "啟用代表僅向現存使用者顯示;停用代表張貼後註冊的新使用者也會看到。"
|
||||||
|
@ -1209,7 +1217,7 @@ _initialTutorial:
|
||||||
skipAreYouSure: "結束教學模式?"
|
skipAreYouSure: "結束教學模式?"
|
||||||
_landing:
|
_landing:
|
||||||
title: "歡迎使用本教學課程"
|
title: "歡迎使用本教學課程"
|
||||||
description: "在這裡您可以查看Misskey的基本使用方法和功能。"
|
description: "在這裡您可以查看 Misskey 的基本使用方法和功能。"
|
||||||
_note:
|
_note:
|
||||||
title: "什麼是貼文?"
|
title: "什麼是貼文?"
|
||||||
description: "在Misskey上發布的內容稱為「貼文」。貼文在時間軸上按時間順序排列,並即時更新。"
|
description: "在Misskey上發布的內容稱為「貼文」。貼文在時間軸上按時間順序排列,並即時更新。"
|
||||||
|
@ -2041,7 +2049,7 @@ _profile:
|
||||||
changeAvatar: "更換大頭貼"
|
changeAvatar: "更換大頭貼"
|
||||||
changeBanner: "變更橫幅圖像"
|
changeBanner: "變更橫幅圖像"
|
||||||
verifiedLinkDescription: "如果輸入包含您個人資料的網站 URL,欄位旁邊將出現驗證圖示。"
|
verifiedLinkDescription: "如果輸入包含您個人資料的網站 URL,欄位旁邊將出現驗證圖示。"
|
||||||
avatarDecorationMax: "最多可以設置{max}個裝飾。"
|
avatarDecorationMax: "最多可以設置 {max} 個裝飾。"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "所有貼文"
|
allNotes: "所有貼文"
|
||||||
favoritedNotes: "「我的最愛」貼文"
|
favoritedNotes: "「我的最愛」貼文"
|
||||||
|
@ -2163,6 +2171,7 @@ _notification:
|
||||||
pollEnded: "問卷調查已產生結果"
|
pollEnded: "問卷調查已產生結果"
|
||||||
newNote: "新的貼文"
|
newNote: "新的貼文"
|
||||||
unreadAntennaNote: "天線 {name}"
|
unreadAntennaNote: "天線 {name}"
|
||||||
|
roleAssigned: "已授予角色"
|
||||||
emptyPushNotificationMessage: "推送通知已更新"
|
emptyPushNotificationMessage: "推送通知已更新"
|
||||||
achievementEarned: "獲得成就"
|
achievementEarned: "獲得成就"
|
||||||
testNotification: "通知測試"
|
testNotification: "通知測試"
|
||||||
|
|
10
package.json
10
package.json
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"version": "2023.12.0-beta.4",
|
"version": "2023.12.0",
|
||||||
"codename": "nasubi",
|
"codename": "nasubi",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/misskey-dev/misskey.git"
|
"url": "https://github.com/misskey-dev/misskey.git"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@8.10.5",
|
"packageManager": "pnpm@8.12.1",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"packages/frontend",
|
"packages/frontend",
|
||||||
"packages/backend",
|
"packages/backend",
|
||||||
|
@ -46,10 +46,10 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"execa": "8.0.1",
|
"execa": "8.0.1",
|
||||||
"cssnano": "6.0.1",
|
"cssnano": "6.0.2",
|
||||||
"js-yaml": "4.1.0",
|
"js-yaml": "4.1.0",
|
||||||
"postcss": "8.4.32",
|
"postcss": "8.4.32",
|
||||||
"terser": "5.24.0",
|
"terser": "5.26.0",
|
||||||
"typescript": "5.3.3"
|
"typescript": "5.3.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
@ -57,7 +57,7 @@
|
||||||
"@typescript-eslint/parser": "6.14.0",
|
"@typescript-eslint/parser": "6.14.0",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"cypress": "13.6.1",
|
"cypress": "13.6.1",
|
||||||
"eslint": "8.55.0",
|
"eslint": "8.56.0",
|
||||||
"start-server-and-test": "2.0.3",
|
"start-server-and-test": "2.0.3",
|
||||||
"ncp": "2.0.0"
|
"ncp": "2.0.0"
|
||||||
},
|
},
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and other misskey contributors
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
export class ffVisibility1702718871541 {
|
||||||
|
constructor() {
|
||||||
|
this.name = 'ffVisibility1702718871541';
|
||||||
|
}
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`CREATE TYPE "public"."user_profile_followingvisibility_enum" AS ENUM('public', 'followers', 'private')`);
|
||||||
|
await queryRunner.query(`CREATE CAST ("public"."user_profile_ffvisibility_enum" AS "public"."user_profile_followingvisibility_enum") WITH INOUT AS ASSIGNMENT`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "public"."user_profile_followersVisibility_enum" AS ENUM('public', 'followers', 'private')`);
|
||||||
|
await queryRunner.query(`CREATE CAST ("public"."user_profile_ffvisibility_enum" AS "public"."user_profile_followersVisibility_enum") WITH INOUT AS ASSIGNMENT`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD "followingVisibility" "public"."user_profile_followingvisibility_enum" NOT NULL DEFAULT 'public'`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD "followersVisibility" "public"."user_profile_followersVisibility_enum" NOT NULL DEFAULT 'public'`);
|
||||||
|
await queryRunner.query(`UPDATE "user_profile" SET "followingVisibility" = "ffVisibility"`);
|
||||||
|
await queryRunner.query(`UPDATE "user_profile" SET "followersVisibility" = "ffVisibility"`);
|
||||||
|
await queryRunner.query(`DROP CAST ("public"."user_profile_ffvisibility_enum" AS "public"."user_profile_followersVisibility_enum")`);
|
||||||
|
await queryRunner.query(`DROP CAST ("public"."user_profile_ffvisibility_enum" AS "public"."user_profile_followingvisibility_enum")`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "ffVisibility"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "public"."user_profile_ffvisibility_enum"`);
|
||||||
|
}
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`CREATE TYPE "public"."user_profile_ffvisibility_enum" AS ENUM('public', 'followers', 'private')`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD "ffVisibility" "public"."user_profile_ffvisibility_enum" NOT NULL DEFAULT 'public'`);
|
||||||
|
await queryRunner.query(`CREATE CAST ("public"."user_profile_followingvisibility_enum" AS "public"."user_profile_ffvisibility_enum") WITH INOUT AS ASSIGNMENT`);
|
||||||
|
await queryRunner.query(`UPDATE "user_profile" SET ffVisibility = "user_profile"."followingVisibility"`);
|
||||||
|
await queryRunner.query(`DROP CAST ("public"."user_profile_followingvisibility_enum" AS "public"."user_profile_ffvisibility_enum")`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "followersVisibility"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "followingVisibility"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "public"."user_profile_followersVisibility_enum"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "public"."user_profile_followingvisibility_enum"`);
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,7 +4,7 @@
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.16.0"
|
"node": ">=20.10.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node ./built/boot/entry.js",
|
"start": "node ./built/boot/entry.js",
|
||||||
|
@ -65,7 +65,7 @@
|
||||||
"@bull-board/api": "5.10.2",
|
"@bull-board/api": "5.10.2",
|
||||||
"@bull-board/fastify": "5.10.2",
|
"@bull-board/fastify": "5.10.2",
|
||||||
"@bull-board/ui": "5.10.2",
|
"@bull-board/ui": "5.10.2",
|
||||||
"@discordapp/twemoji": "14.1.2",
|
"@discordapp/twemoji": "15.0.2",
|
||||||
"@fastify/accepts": "4.3.0",
|
"@fastify/accepts": "4.3.0",
|
||||||
"@fastify/cookie": "9.2.0",
|
"@fastify/cookie": "9.2.0",
|
||||||
"@fastify/cors": "8.4.2",
|
"@fastify/cors": "8.4.2",
|
||||||
|
@ -83,6 +83,7 @@
|
||||||
"@smithy/node-http-handler": "2.1.10",
|
"@smithy/node-http-handler": "2.1.10",
|
||||||
"@swc/cli": "0.1.63",
|
"@swc/cli": "0.1.63",
|
||||||
"@swc/core": "1.3.100",
|
"@swc/core": "1.3.100",
|
||||||
|
"@twemoji/parser": "15.0.0",
|
||||||
"accepts": "1.3.8",
|
"accepts": "1.3.8",
|
||||||
"ajv": "8.12.0",
|
"ajv": "8.12.0",
|
||||||
"archiver": "6.0.1",
|
"archiver": "6.0.1",
|
||||||
|
@ -90,7 +91,7 @@
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"blurhash": "2.0.5",
|
"blurhash": "2.0.5",
|
||||||
"body-parser": "1.20.2",
|
"body-parser": "1.20.2",
|
||||||
"bullmq": "4.15.3",
|
"bullmq": "4.15.4",
|
||||||
"cacheable-lookup": "7.0.0",
|
"cacheable-lookup": "7.0.0",
|
||||||
"cbor": "9.0.1",
|
"cbor": "9.0.1",
|
||||||
"chalk": "5.3.0",
|
"chalk": "5.3.0",
|
||||||
|
@ -107,7 +108,7 @@
|
||||||
"file-type": "18.7.0",
|
"file-type": "18.7.0",
|
||||||
"fluent-ffmpeg": "2.1.2",
|
"fluent-ffmpeg": "2.1.2",
|
||||||
"form-data": "4.0.0",
|
"form-data": "4.0.0",
|
||||||
"got": "13.0.0",
|
"got": "14.0.0",
|
||||||
"happy-dom": "10.0.3",
|
"happy-dom": "10.0.3",
|
||||||
"hpagent": "1.2.0",
|
"hpagent": "1.2.0",
|
||||||
"http-link-header": "1.1.1",
|
"http-link-header": "1.1.1",
|
||||||
|
@ -121,8 +122,8 @@
|
||||||
"jsonld": "8.3.2",
|
"jsonld": "8.3.2",
|
||||||
"jsrsasign": "10.9.0",
|
"jsrsasign": "10.9.0",
|
||||||
"meilisearch": "0.36.0",
|
"meilisearch": "0.36.0",
|
||||||
"mfm-js": "0.23.3",
|
"mfm-js": "0.24.0",
|
||||||
"microformats-parser": "1.5.2",
|
"microformats-parser": "2.0.2",
|
||||||
"mime-types": "2.1.35",
|
"mime-types": "2.1.35",
|
||||||
"misskey-js": "workspace:*",
|
"misskey-js": "workspace:*",
|
||||||
"ms": "3.0.0-canary.1",
|
"ms": "3.0.0-canary.1",
|
||||||
|
@ -166,7 +167,6 @@
|
||||||
"tmp": "0.2.1",
|
"tmp": "0.2.1",
|
||||||
"tsc-alias": "1.8.8",
|
"tsc-alias": "1.8.8",
|
||||||
"tsconfig-paths": "4.2.0",
|
"tsconfig-paths": "4.2.0",
|
||||||
"twemoji-parser": "14.0.0",
|
|
||||||
"typeorm": "0.3.17",
|
"typeorm": "0.3.17",
|
||||||
"typescript": "5.3.3",
|
"typescript": "5.3.3",
|
||||||
"ulid": "2.3.0",
|
"ulid": "2.3.0",
|
||||||
|
@ -195,7 +195,7 @@
|
||||||
"@types/jsrsasign": "10.5.12",
|
"@types/jsrsasign": "10.5.12",
|
||||||
"@types/mime-types": "2.1.4",
|
"@types/mime-types": "2.1.4",
|
||||||
"@types/ms": "0.7.34",
|
"@types/ms": "0.7.34",
|
||||||
"@types/node": "20.10.4",
|
"@types/node": "20.10.5",
|
||||||
"@types/node-fetch": "3.0.3",
|
"@types/node-fetch": "3.0.3",
|
||||||
"@types/nodemailer": "6.4.14",
|
"@types/nodemailer": "6.4.14",
|
||||||
"@types/oauth": "0.9.4",
|
"@types/oauth": "0.9.4",
|
||||||
|
@ -222,8 +222,8 @@
|
||||||
"@typescript-eslint/parser": "6.14.0",
|
"@typescript-eslint/parser": "6.14.0",
|
||||||
"aws-sdk-client-mock": "3.0.0",
|
"aws-sdk-client-mock": "3.0.0",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"eslint": "8.55.0",
|
"eslint": "8.56.0",
|
||||||
"eslint-plugin-import": "2.29.0",
|
"eslint-plugin-import": "2.29.1",
|
||||||
"execa": "8.0.1",
|
"execa": "8.0.1",
|
||||||
"jest": "29.7.0",
|
"jest": "29.7.0",
|
||||||
"jest-mock": "29.7.0",
|
"jest-mock": "29.7.0",
|
||||||
|
|
|
@ -77,6 +77,17 @@ export class FeaturedService {
|
||||||
return Array.from(ranking.keys());
|
return Array.from(ranking.keys());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
private async removeFromRanking(name: string, windowRange: number, element: string): Promise<void> {
|
||||||
|
const currentWindow = this.getCurrentWindow(windowRange);
|
||||||
|
const previousWindow = currentWindow - 1;
|
||||||
|
|
||||||
|
const redisPipeline = this.redisClient.pipeline();
|
||||||
|
redisPipeline.zrem(`${name}:${currentWindow}`, element);
|
||||||
|
redisPipeline.zrem(`${name}:${previousWindow}`, element);
|
||||||
|
await redisPipeline.exec();
|
||||||
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public updateGlobalNotesRanking(noteId: MiNote['id'], score = 1): Promise<void> {
|
public updateGlobalNotesRanking(noteId: MiNote['id'], score = 1): Promise<void> {
|
||||||
return this.updateRankingOf('featuredGlobalNotesRanking', GLOBAL_NOTES_RANKING_WINDOW, noteId, score);
|
return this.updateRankingOf('featuredGlobalNotesRanking', GLOBAL_NOTES_RANKING_WINDOW, noteId, score);
|
||||||
|
@ -126,4 +137,9 @@ export class FeaturedService {
|
||||||
public getHashtagsRanking(threshold: number): Promise<string[]> {
|
public getHashtagsRanking(threshold: number): Promise<string[]> {
|
||||||
return this.getRankingOf('featuredHashtagsRanking', HASHTAG_RANKING_WINDOW, threshold);
|
return this.getRankingOf('featuredHashtagsRanking', HASHTAG_RANKING_WINDOW, threshold);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public removeHashtagsFromRanking(hashtag: string): Promise<void> {
|
||||||
|
return this.removeFromRanking('featuredHashtagsRanking', HASHTAG_RANKING_WINDOW, hashtag);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import { MiMeta } from '@/models/Meta.js';
|
||||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import type { GlobalEvents } from '@/core/GlobalEventService.js';
|
import type { GlobalEvents } from '@/core/GlobalEventService.js';
|
||||||
|
import { FeaturedService } from '@/core/FeaturedService.js';
|
||||||
import type { OnApplicationShutdown } from '@nestjs/common';
|
import type { OnApplicationShutdown } from '@nestjs/common';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@ -25,6 +26,7 @@ export class MetaService implements OnApplicationShutdown {
|
||||||
@Inject(DI.db)
|
@Inject(DI.db)
|
||||||
private db: DataSource,
|
private db: DataSource,
|
||||||
|
|
||||||
|
private featuredService: FeaturedService,
|
||||||
private globalEventService: GlobalEventService,
|
private globalEventService: GlobalEventService,
|
||||||
) {
|
) {
|
||||||
//this.onMessage = this.onMessage.bind(this);
|
//this.onMessage = this.onMessage.bind(this);
|
||||||
|
@ -95,6 +97,8 @@ export class MetaService implements OnApplicationShutdown {
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async update(data: Partial<MiMeta>): Promise<MiMeta> {
|
public async update(data: Partial<MiMeta>): Promise<MiMeta> {
|
||||||
|
let before: MiMeta | undefined;
|
||||||
|
|
||||||
const updated = await this.db.transaction(async transactionalEntityManager => {
|
const updated = await this.db.transaction(async transactionalEntityManager => {
|
||||||
const metas = await transactionalEntityManager.find(MiMeta, {
|
const metas = await transactionalEntityManager.find(MiMeta, {
|
||||||
order: {
|
order: {
|
||||||
|
@ -102,10 +106,10 @@ export class MetaService implements OnApplicationShutdown {
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const meta = metas[0];
|
before = metas[0];
|
||||||
|
|
||||||
if (meta) {
|
if (before) {
|
||||||
await transactionalEntityManager.update(MiMeta, meta.id, data);
|
await transactionalEntityManager.update(MiMeta, before.id, data);
|
||||||
|
|
||||||
const metas = await transactionalEntityManager.find(MiMeta, {
|
const metas = await transactionalEntityManager.find(MiMeta, {
|
||||||
order: {
|
order: {
|
||||||
|
@ -119,6 +123,21 @@ export class MetaService implements OnApplicationShutdown {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (data.hiddenTags) {
|
||||||
|
process.nextTick(() => {
|
||||||
|
const hiddenTags = new Set<string>(data.hiddenTags);
|
||||||
|
if (before) {
|
||||||
|
for (const previousHiddenTag of before.hiddenTags) {
|
||||||
|
hiddenTags.delete(previousHiddenTag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const hiddenTag of hiddenTags) {
|
||||||
|
this.featuredService.removeHashtagsFromRanking(hiddenTag);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
this.globalEventService.publishInternalEvent('metaUpdated', updated);
|
this.globalEventService.publishInternalEvent('metaUpdated', updated);
|
||||||
|
|
||||||
return updated;
|
return updated;
|
||||||
|
|
|
@ -262,7 +262,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check blocking
|
// Check blocking
|
||||||
if (data.renote && data.text == null && data.poll == null && (data.files == null || data.files.length === 0)) {
|
if (this.isQuote(data)) {
|
||||||
if (data.renote.userHost === null) {
|
if (data.renote.userHost === null) {
|
||||||
if (data.renote.userId !== user.id) {
|
if (data.renote.userId !== user.id) {
|
||||||
const blocked = await this.userBlockingService.checkBlocked(data.renote.userId, user.id);
|
const blocked = await this.userBlockingService.checkBlocked(data.renote.userId, user.id);
|
||||||
|
@ -590,7 +590,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||||
|
|
||||||
// If it is renote
|
// If it is renote
|
||||||
if (data.renote) {
|
if (data.renote) {
|
||||||
const type = data.text ? 'quote' : 'renote';
|
const type = this.isQuote(data) ? 'quote' : 'renote';
|
||||||
|
|
||||||
// Notify
|
// Notify
|
||||||
if (data.renote.userHost === null) {
|
if (data.renote.userHost === null) {
|
||||||
|
@ -697,6 +697,12 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
private isQuote(note: Option): note is Option & { renote: MiNote } {
|
||||||
|
// sync with misc/is-quote.ts
|
||||||
|
return !!note.renote && (!!note.text || !!note.cw || (!!note.files && !!note.files.length) || !!note.poll);
|
||||||
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private incRenoteCount(renote: MiNote) {
|
private incRenoteCount(renote: MiNote) {
|
||||||
this.notesRepository.createQueryBuilder().update()
|
this.notesRepository.createQueryBuilder().update()
|
||||||
|
@ -762,7 +768,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||||
private async renderNoteOrRenoteActivity(data: Option, note: MiNote) {
|
private async renderNoteOrRenoteActivity(data: Option, note: MiNote) {
|
||||||
if (data.localOnly) return null;
|
if (data.localOnly) return null;
|
||||||
|
|
||||||
const content = data.renote && data.text == null && data.poll == null && (data.files == null || data.files.length === 0)
|
const content = data.renote && !this.isQuote(data)
|
||||||
? this.apRendererService.renderAnnounce(data.renote.uri ? data.renote.uri : `${this.config.url}/notes/${data.renote.id}`, note)
|
? this.apRendererService.renderAnnounce(data.renote.uri ? data.renote.uri : `${this.config.url}/notes/${data.renote.id}`, note)
|
||||||
: this.apRendererService.renderCreate(await this.apRendererService.renderNote(note, false), note);
|
: this.apRendererService.renderCreate(await this.apRendererService.renderNote(note, false), note);
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,14 @@
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import * as Redis from 'ioredis';
|
import * as Redis from 'ioredis';
|
||||||
import { In } from 'typeorm';
|
import { In } from 'typeorm';
|
||||||
import type { MiRole, MiRoleAssignment, RoleAssignmentsRepository, RolesRepository, UsersRepository } from '@/models/_.js';
|
import { ModuleRef } from '@nestjs/core';
|
||||||
|
import type {
|
||||||
|
MiRole,
|
||||||
|
MiRoleAssignment,
|
||||||
|
RoleAssignmentsRepository,
|
||||||
|
RolesRepository,
|
||||||
|
UsersRepository,
|
||||||
|
} from '@/models/_.js';
|
||||||
import { MemoryKVCache, MemorySingleCache } from '@/misc/cache.js';
|
import { MemoryKVCache, MemorySingleCache } from '@/misc/cache.js';
|
||||||
import type { MiUser } from '@/models/User.js';
|
import type { MiUser } from '@/models/User.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
|
@ -16,12 +23,13 @@ import { CacheService } from '@/core/CacheService.js';
|
||||||
import type { RoleCondFormulaValue } from '@/models/Role.js';
|
import type { RoleCondFormulaValue } from '@/models/Role.js';
|
||||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||||
import type { GlobalEvents } from '@/core/GlobalEventService.js';
|
import type { GlobalEvents } from '@/core/GlobalEventService.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
|
||||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||||
|
import { IdService } from '@/core/IdService.js';
|
||||||
import { ModerationLogService } from '@/core/ModerationLogService.js';
|
import { ModerationLogService } from '@/core/ModerationLogService.js';
|
||||||
import type { Packed } from '@/misc/json-schema.js';
|
import type { Packed } from '@/misc/json-schema.js';
|
||||||
import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
|
import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
|
||||||
import type { OnApplicationShutdown } from '@nestjs/common';
|
import { NotificationService } from '@/core/NotificationService.js';
|
||||||
|
import type { OnApplicationShutdown, OnModuleInit } from '@nestjs/common';
|
||||||
|
|
||||||
export type RolePolicies = {
|
export type RolePolicies = {
|
||||||
gtlAvailable: boolean;
|
gtlAvailable: boolean;
|
||||||
|
@ -84,14 +92,17 @@ export const DEFAULT_POLICIES: RolePolicies = {
|
||||||
};
|
};
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class RoleService implements OnApplicationShutdown {
|
export class RoleService implements OnApplicationShutdown, OnModuleInit {
|
||||||
private rolesCache: MemorySingleCache<MiRole[]>;
|
private rolesCache: MemorySingleCache<MiRole[]>;
|
||||||
private roleAssignmentByUserIdCache: MemoryKVCache<MiRoleAssignment[]>;
|
private roleAssignmentByUserIdCache: MemoryKVCache<MiRoleAssignment[]>;
|
||||||
|
private notificationService: NotificationService;
|
||||||
|
|
||||||
public static AlreadyAssignedError = class extends Error {};
|
public static AlreadyAssignedError = class extends Error {};
|
||||||
public static NotAssignedError = class extends Error {};
|
public static NotAssignedError = class extends Error {};
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
private moduleRef: ModuleRef,
|
||||||
|
|
||||||
@Inject(DI.redis)
|
@Inject(DI.redis)
|
||||||
private redisClient: Redis.Redis,
|
private redisClient: Redis.Redis,
|
||||||
|
|
||||||
|
@ -126,6 +137,10 @@ export class RoleService implements OnApplicationShutdown {
|
||||||
this.redisForSub.on('message', this.onMessage);
|
this.redisForSub.on('message', this.onMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async onModuleInit() {
|
||||||
|
this.notificationService = this.moduleRef.get(NotificationService.name);
|
||||||
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private async onMessage(_: string, data: string): Promise<void> {
|
private async onMessage(_: string, data: string): Promise<void> {
|
||||||
const obj = JSON.parse(data);
|
const obj = JSON.parse(data);
|
||||||
|
@ -436,6 +451,12 @@ export class RoleService implements OnApplicationShutdown {
|
||||||
|
|
||||||
this.globalEventService.publishInternalEvent('userRoleAssigned', created);
|
this.globalEventService.publishInternalEvent('userRoleAssigned', created);
|
||||||
|
|
||||||
|
if (role.isPublic) {
|
||||||
|
this.notificationService.createNotification(userId, 'roleAssigned', {
|
||||||
|
roleId: roleId,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (moderator) {
|
if (moderator) {
|
||||||
const user = await this.usersRepository.findOneByOrFail({ id: userId });
|
const user = await this.usersRepository.findOneByOrFail({ id: userId });
|
||||||
this.moderationLogService.log(moderator, 'assignRole', {
|
this.moderationLogService.log(moderator, 'assignRole', {
|
||||||
|
|
|
@ -3,30 +3,34 @@
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';
|
import { Inject, Injectable, OnApplicationShutdown, OnModuleInit } from '@nestjs/common';
|
||||||
import * as Redis from 'ioredis';
|
import * as Redis from 'ioredis';
|
||||||
|
import { ModuleRef } from '@nestjs/core';
|
||||||
import type { UserListMembershipsRepository } from '@/models/_.js';
|
import type { UserListMembershipsRepository } from '@/models/_.js';
|
||||||
import type { MiUser } from '@/models/User.js';
|
import type { MiUser } from '@/models/User.js';
|
||||||
import type { MiUserList } from '@/models/UserList.js';
|
import type { MiUserList } from '@/models/UserList.js';
|
||||||
import type { MiUserListMembership } from '@/models/UserListMembership.js';
|
import type { MiUserListMembership } from '@/models/UserListMembership.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
|
import type { GlobalEvents } from '@/core/GlobalEventService.js';
|
||||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||||
import { ProxyAccountService } from '@/core/ProxyAccountService.js';
|
import { ProxyAccountService } from '@/core/ProxyAccountService.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { RoleService } from '@/core/RoleService.js';
|
|
||||||
import { QueueService } from '@/core/QueueService.js';
|
import { QueueService } from '@/core/QueueService.js';
|
||||||
import { RedisKVCache } from '@/misc/cache.js';
|
import { RedisKVCache } from '@/misc/cache.js';
|
||||||
import type { GlobalEvents } from '@/core/GlobalEventService.js';
|
import { RoleService } from '@/core/RoleService.js';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class UserListService implements OnApplicationShutdown {
|
export class UserListService implements OnApplicationShutdown, OnModuleInit {
|
||||||
public static TooManyUsersError = class extends Error {};
|
public static TooManyUsersError = class extends Error {};
|
||||||
|
|
||||||
public membersCache: RedisKVCache<Set<string>>;
|
public membersCache: RedisKVCache<Set<string>>;
|
||||||
|
private roleService: RoleService;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
private moduleRef: ModuleRef,
|
||||||
|
|
||||||
@Inject(DI.redis)
|
@Inject(DI.redis)
|
||||||
private redisClient: Redis.Redis,
|
private redisClient: Redis.Redis,
|
||||||
|
|
||||||
|
@ -38,7 +42,6 @@ export class UserListService implements OnApplicationShutdown {
|
||||||
|
|
||||||
private userEntityService: UserEntityService,
|
private userEntityService: UserEntityService,
|
||||||
private idService: IdService,
|
private idService: IdService,
|
||||||
private roleService: RoleService,
|
|
||||||
private globalEventService: GlobalEventService,
|
private globalEventService: GlobalEventService,
|
||||||
private proxyAccountService: ProxyAccountService,
|
private proxyAccountService: ProxyAccountService,
|
||||||
private queueService: QueueService,
|
private queueService: QueueService,
|
||||||
|
@ -54,6 +57,10 @@ export class UserListService implements OnApplicationShutdown {
|
||||||
this.redisForSub.on('message', this.onMessage);
|
this.redisForSub.on('message', this.onMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async onModuleInit() {
|
||||||
|
this.roleService = this.moduleRef.get(RoleService.name);
|
||||||
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private async onMessage(_: string, data: string): Promise<void> {
|
private async onMessage(_: string, data: string): Promise<void> {
|
||||||
const obj = JSON.parse(data);
|
const obj = JSON.parse(data);
|
||||||
|
|
|
@ -15,8 +15,8 @@ import type { Packed } from '@/misc/json-schema.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
import { isNotNull } from '@/misc/is-not-null.js';
|
||||||
import { FilterUnionByProperty, notificationTypes } from '@/types.js';
|
import { FilterUnionByProperty, notificationTypes } from '@/types.js';
|
||||||
|
import { RoleEntityService } from './RoleEntityService.js';
|
||||||
import type { OnModuleInit } from '@nestjs/common';
|
import type { OnModuleInit } from '@nestjs/common';
|
||||||
import type { CustomEmojiService } from '../CustomEmojiService.js';
|
|
||||||
import type { UserEntityService } from './UserEntityService.js';
|
import type { UserEntityService } from './UserEntityService.js';
|
||||||
import type { NoteEntityService } from './NoteEntityService.js';
|
import type { NoteEntityService } from './NoteEntityService.js';
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ const NOTE_REQUIRED_GROUPED_NOTIFICATION_TYPES = new Set(['note', 'mention', 're
|
||||||
export class NotificationEntityService implements OnModuleInit {
|
export class NotificationEntityService implements OnModuleInit {
|
||||||
private userEntityService: UserEntityService;
|
private userEntityService: UserEntityService;
|
||||||
private noteEntityService: NoteEntityService;
|
private noteEntityService: NoteEntityService;
|
||||||
private customEmojiService: CustomEmojiService;
|
private roleEntityService: RoleEntityService;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private moduleRef: ModuleRef,
|
private moduleRef: ModuleRef,
|
||||||
|
@ -43,14 +43,13 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
|
|
||||||
//private userEntityService: UserEntityService,
|
//private userEntityService: UserEntityService,
|
||||||
//private noteEntityService: NoteEntityService,
|
//private noteEntityService: NoteEntityService,
|
||||||
//private customEmojiService: CustomEmojiService,
|
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
onModuleInit() {
|
onModuleInit() {
|
||||||
this.userEntityService = this.moduleRef.get('UserEntityService');
|
this.userEntityService = this.moduleRef.get('UserEntityService');
|
||||||
this.noteEntityService = this.moduleRef.get('NoteEntityService');
|
this.noteEntityService = this.moduleRef.get('NoteEntityService');
|
||||||
this.customEmojiService = this.moduleRef.get('CustomEmojiService');
|
this.roleEntityService = this.moduleRef.get('RoleEntityService');
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
|
@ -81,6 +80,7 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
detail: false,
|
detail: false,
|
||||||
})
|
})
|
||||||
) : undefined;
|
) : undefined;
|
||||||
|
const role = notification.type === 'roleAssigned' ? await this.roleEntityService.pack(notification.roleId) : undefined;
|
||||||
|
|
||||||
return await awaitAll({
|
return await awaitAll({
|
||||||
id: notification.id,
|
id: notification.id,
|
||||||
|
@ -92,6 +92,9 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
...(notification.type === 'reaction' ? {
|
...(notification.type === 'reaction' ? {
|
||||||
reaction: notification.reaction,
|
reaction: notification.reaction,
|
||||||
} : {}),
|
} : {}),
|
||||||
|
...(notification.type === 'roleAssigned' ? {
|
||||||
|
role: role,
|
||||||
|
} : {}),
|
||||||
...(notification.type === 'achievementEarned' ? {
|
...(notification.type === 'achievementEarned' ? {
|
||||||
achievement: notification.achievement,
|
achievement: notification.achievement,
|
||||||
} : {}),
|
} : {}),
|
||||||
|
@ -216,6 +219,8 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const role = notification.type === 'roleAssigned' ? await this.roleEntityService.pack(notification.roleId) : undefined;
|
||||||
|
|
||||||
return await awaitAll({
|
return await awaitAll({
|
||||||
id: notification.id,
|
id: notification.id,
|
||||||
createdAt: new Date(notification.createdAt).toISOString(),
|
createdAt: new Date(notification.createdAt).toISOString(),
|
||||||
|
@ -226,6 +231,9 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
...(notification.type === 'reaction' ? {
|
...(notification.type === 'reaction' ? {
|
||||||
reaction: notification.reaction,
|
reaction: notification.reaction,
|
||||||
} : {}),
|
} : {}),
|
||||||
|
...(notification.type === 'roleAssigned' ? {
|
||||||
|
role: role,
|
||||||
|
} : {}),
|
||||||
...(notification.type === 'achievementEarned' ? {
|
...(notification.type === 'achievementEarned' ? {
|
||||||
achievement: notification.achievement,
|
achievement: notification.achievement,
|
||||||
} : {}),
|
} : {}),
|
||||||
|
|
|
@ -332,13 +332,13 @@ export class UserEntityService implements OnModuleInit {
|
||||||
const profile = opts.detail ? (opts.userProfile ?? await this.userProfilesRepository.findOneByOrFail({ userId: user.id })) : null;
|
const profile = opts.detail ? (opts.userProfile ?? await this.userProfilesRepository.findOneByOrFail({ userId: user.id })) : null;
|
||||||
|
|
||||||
const followingCount = profile == null ? null :
|
const followingCount = profile == null ? null :
|
||||||
(profile.ffVisibility === 'public') || isMe ? user.followingCount :
|
(profile.followingVisibility === 'public') || isMe ? user.followingCount :
|
||||||
(profile.ffVisibility === 'followers') && (relation && relation.isFollowing) ? user.followingCount :
|
(profile.followingVisibility === 'followers') && (relation && relation.isFollowing) ? user.followingCount :
|
||||||
null;
|
null;
|
||||||
|
|
||||||
const followersCount = profile == null ? null :
|
const followersCount = profile == null ? null :
|
||||||
(profile.ffVisibility === 'public') || isMe ? user.followersCount :
|
(profile.followersVisibility === 'public') || isMe ? user.followersCount :
|
||||||
(profile.ffVisibility === 'followers') && (relation && relation.isFollowing) ? user.followersCount :
|
(profile.followersVisibility === 'followers') && (relation && relation.isFollowing) ? user.followersCount :
|
||||||
null;
|
null;
|
||||||
|
|
||||||
const isModerator = isMe && opts.detail ? this.roleService.isModerator(user) : null;
|
const isModerator = isMe && opts.detail ? this.roleService.isModerator(user) : null;
|
||||||
|
@ -418,7 +418,8 @@ export class UserEntityService implements OnModuleInit {
|
||||||
pinnedPageId: profile!.pinnedPageId,
|
pinnedPageId: profile!.pinnedPageId,
|
||||||
pinnedPage: profile!.pinnedPageId ? this.pageEntityService.pack(profile!.pinnedPageId, me) : null,
|
pinnedPage: profile!.pinnedPageId ? this.pageEntityService.pack(profile!.pinnedPageId, me) : null,
|
||||||
publicReactions: profile!.publicReactions,
|
publicReactions: profile!.publicReactions,
|
||||||
ffVisibility: profile!.ffVisibility,
|
followersVisibility: profile!.followersVisibility,
|
||||||
|
followingVisibility: profile!.followingVisibility,
|
||||||
twoFactorEnabled: profile!.twoFactorEnabled,
|
twoFactorEnabled: profile!.twoFactorEnabled,
|
||||||
usePasswordLessLogin: profile!.usePasswordLessLogin,
|
usePasswordLessLogin: profile!.usePasswordLessLogin,
|
||||||
securityKeys: profile!.twoFactorEnabled
|
securityKeys: profile!.twoFactorEnabled
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -7,5 +7,6 @@ import type { MiNote } from '@/models/Note.js';
|
||||||
|
|
||||||
// eslint-disable-next-line import/no-default-export
|
// eslint-disable-next-line import/no-default-export
|
||||||
export default function(note: MiNote): boolean {
|
export default function(note: MiNote): boolean {
|
||||||
|
// sync with NoteCreateService.isQuote
|
||||||
return note.renoteId != null && (note.text != null || note.hasPoll || (note.fileIds != null && note.fileIds.length > 0));
|
return note.renoteId != null && (note.text != null || note.hasPoll || (note.fileIds != null && note.fileIds.length > 0));
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@ import { packedFlashSchema } from '@/models/json-schema/flash.js';
|
||||||
import { packedAnnouncementSchema } from '@/models/json-schema/announcement.js';
|
import { packedAnnouncementSchema } from '@/models/json-schema/announcement.js';
|
||||||
import { packedSigninSchema } from '@/models/json-schema/signin.js';
|
import { packedSigninSchema } from '@/models/json-schema/signin.js';
|
||||||
import { packedRoleLiteSchema, packedRoleSchema } from '@/models/json-schema/role.js';
|
import { packedRoleLiteSchema, packedRoleSchema } from '@/models/json-schema/role.js';
|
||||||
|
import { packedAdSchema } from '@/models/json-schema/ad.js';
|
||||||
|
|
||||||
export const refs = {
|
export const refs = {
|
||||||
UserLite: packedUserLiteSchema,
|
UserLite: packedUserLiteSchema,
|
||||||
|
@ -49,6 +50,7 @@ export const refs = {
|
||||||
User: packedUserSchema,
|
User: packedUserSchema,
|
||||||
|
|
||||||
UserList: packedUserListSchema,
|
UserList: packedUserListSchema,
|
||||||
|
Ad: packedAdSchema,
|
||||||
Announcement: packedAnnouncementSchema,
|
Announcement: packedAnnouncementSchema,
|
||||||
App: packedAppSchema,
|
App: packedAppSchema,
|
||||||
Note: packedNoteSchema,
|
Note: packedNoteSchema,
|
||||||
|
|
|
@ -3,11 +3,10 @@
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { notificationTypes } from '@/types.js';
|
|
||||||
import { MiUser } from './User.js';
|
import { MiUser } from './User.js';
|
||||||
import { MiNote } from './Note.js';
|
import { MiNote } from './Note.js';
|
||||||
import { MiFollowRequest } from './FollowRequest.js';
|
|
||||||
import { MiAccessToken } from './AccessToken.js';
|
import { MiAccessToken } from './AccessToken.js';
|
||||||
|
import { MiRole } from './Role.js';
|
||||||
|
|
||||||
export type MiNotification = {
|
export type MiNotification = {
|
||||||
type: 'note';
|
type: 'note';
|
||||||
|
@ -68,6 +67,11 @@ export type MiNotification = {
|
||||||
id: string;
|
id: string;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
notifierId: MiUser['id'];
|
notifierId: MiUser['id'];
|
||||||
|
} | {
|
||||||
|
type: 'roleAssigned';
|
||||||
|
id: string;
|
||||||
|
createdAt: string;
|
||||||
|
roleId: MiRole['id'];
|
||||||
} | {
|
} | {
|
||||||
type: 'achievementEarned';
|
type: 'achievementEarned';
|
||||||
id: string;
|
id: string;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { Entity, Column, Index, OneToOne, JoinColumn, PrimaryColumn } from 'typeorm';
|
import { Entity, Column, Index, OneToOne, JoinColumn, PrimaryColumn } from 'typeorm';
|
||||||
import { obsoleteNotificationTypes, ffVisibility, notificationTypes } from '@/types.js';
|
import { obsoleteNotificationTypes, followingVisibilities, followersVisibilities, notificationTypes } from '@/types.js';
|
||||||
import { id } from './util/id.js';
|
import { id } from './util/id.js';
|
||||||
import { MiUser } from './User.js';
|
import { MiUser } from './User.js';
|
||||||
import { MiPage } from './Page.js';
|
import { MiPage } from './Page.js';
|
||||||
|
@ -94,10 +94,16 @@ export class MiUserProfile {
|
||||||
public publicReactions: boolean;
|
public publicReactions: boolean;
|
||||||
|
|
||||||
@Column('enum', {
|
@Column('enum', {
|
||||||
enum: ffVisibility,
|
enum: followingVisibilities,
|
||||||
default: 'public',
|
default: 'public',
|
||||||
})
|
})
|
||||||
public ffVisibility: typeof ffVisibility[number];
|
public followingVisibility: typeof followingVisibilities[number];
|
||||||
|
|
||||||
|
@Column('enum', {
|
||||||
|
enum: followersVisibilities,
|
||||||
|
default: 'public',
|
||||||
|
})
|
||||||
|
public followersVisibility: typeof followersVisibilities[number];
|
||||||
|
|
||||||
@Column('varchar', {
|
@Column('varchar', {
|
||||||
length: 128, nullable: true,
|
length: 128, nullable: true,
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and other misskey contributors
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const packedAdSchema = {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
format: 'id',
|
||||||
|
example: 'xxxxxxxxxx',
|
||||||
|
},
|
||||||
|
expiresAt: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
format: 'date-time',
|
||||||
|
},
|
||||||
|
startsAt: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
format: 'date-time',
|
||||||
|
},
|
||||||
|
place: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
priority: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
ratio: {
|
||||||
|
type: 'number',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
url: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
imageUrl: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
memo: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
dayOfWeek: {
|
||||||
|
type: 'integer',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} as const;
|
|
@ -74,6 +74,14 @@ export const packedUserLiteSchema = {
|
||||||
format: 'url',
|
format: 'url',
|
||||||
nullable: false, optional: false,
|
nullable: false, optional: false,
|
||||||
},
|
},
|
||||||
|
offsetX: {
|
||||||
|
type: 'number',
|
||||||
|
nullable: false, optional: true,
|
||||||
|
},
|
||||||
|
offsetY: {
|
||||||
|
type: 'number',
|
||||||
|
nullable: false, optional: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -312,7 +320,12 @@ export const packedUserDetailedNotMeOnlySchema = {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
nullable: false, optional: false,
|
nullable: false, optional: false,
|
||||||
},
|
},
|
||||||
ffVisibility: {
|
followingVisibility: {
|
||||||
|
type: 'string',
|
||||||
|
nullable: false, optional: false,
|
||||||
|
enum: ['public', 'followers', 'private'],
|
||||||
|
},
|
||||||
|
followersVisibility: {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
nullable: false, optional: false,
|
nullable: false, optional: false,
|
||||||
enum: ['public', 'followers', 'private'],
|
enum: ['public', 'followers', 'private'],
|
||||||
|
@ -550,9 +563,7 @@ export const packedMeDetailedOnlySchema = {
|
||||||
mention: notificationRecieveConfig,
|
mention: notificationRecieveConfig,
|
||||||
reaction: notificationRecieveConfig,
|
reaction: notificationRecieveConfig,
|
||||||
pollEnded: notificationRecieveConfig,
|
pollEnded: notificationRecieveConfig,
|
||||||
achievementEarned: notificationRecieveConfig,
|
|
||||||
receiveFollowRequest: notificationRecieveConfig,
|
receiveFollowRequest: notificationRecieveConfig,
|
||||||
followRequestAccepted: notificationRecieveConfig,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
emailNotificationTypes: {
|
emailNotificationTypes: {
|
||||||
|
|
|
@ -156,8 +156,8 @@ export class QueueProcessorService implements OnApplicationShutdown {
|
||||||
this.systemQueueWorker
|
this.systemQueueWorker
|
||||||
.on('active', (job) => systemLogger.debug(`active id=${job.id}`))
|
.on('active', (job) => systemLogger.debug(`active id=${job.id}`))
|
||||||
.on('completed', (job, result) => systemLogger.debug(`completed(${result}) id=${job.id}`))
|
.on('completed', (job, result) => systemLogger.debug(`completed(${result}) id=${job.id}`))
|
||||||
.on('failed', (job, err) => systemLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
.on('failed', (job, err) => systemLogger.warn(`failed(${err.stack}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
||||||
.on('error', (err: Error) => systemLogger.error(`error ${err}`, { e: renderError(err) }))
|
.on('error', (err: Error) => systemLogger.error(`error ${err.stack}`, { e: renderError(err) }))
|
||||||
.on('stalled', (jobId) => systemLogger.warn(`stalled id=${jobId}`));
|
.on('stalled', (jobId) => systemLogger.warn(`stalled id=${jobId}`));
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
@ -194,8 +194,8 @@ export class QueueProcessorService implements OnApplicationShutdown {
|
||||||
this.dbQueueWorker
|
this.dbQueueWorker
|
||||||
.on('active', (job) => dbLogger.debug(`active id=${job.id}`))
|
.on('active', (job) => dbLogger.debug(`active id=${job.id}`))
|
||||||
.on('completed', (job, result) => dbLogger.debug(`completed(${result}) id=${job.id}`))
|
.on('completed', (job, result) => dbLogger.debug(`completed(${result}) id=${job.id}`))
|
||||||
.on('failed', (job, err) => dbLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
.on('failed', (job, err) => dbLogger.warn(`failed(${err.stack}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
||||||
.on('error', (err: Error) => dbLogger.error(`error ${err}`, { e: renderError(err) }))
|
.on('error', (err: Error) => dbLogger.error(`error ${err.stack}`, { e: renderError(err) }))
|
||||||
.on('stalled', (jobId) => dbLogger.warn(`stalled id=${jobId}`));
|
.on('stalled', (jobId) => dbLogger.warn(`stalled id=${jobId}`));
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
@ -218,8 +218,8 @@ export class QueueProcessorService implements OnApplicationShutdown {
|
||||||
this.deliverQueueWorker
|
this.deliverQueueWorker
|
||||||
.on('active', (job) => deliverLogger.debug(`active ${getJobInfo(job, true)} to=${job.data.to}`))
|
.on('active', (job) => deliverLogger.debug(`active ${getJobInfo(job, true)} to=${job.data.to}`))
|
||||||
.on('completed', (job, result) => deliverLogger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`))
|
.on('completed', (job, result) => deliverLogger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`))
|
||||||
.on('failed', (job, err) => deliverLogger.warn(`failed(${err}) ${getJobInfo(job)} to=${job ? job.data.to : '-'}`))
|
.on('failed', (job, err) => deliverLogger.warn(`failed(${err.stack}) ${getJobInfo(job)} to=${job ? job.data.to : '-'}`))
|
||||||
.on('error', (err: Error) => deliverLogger.error(`error ${err}`, { e: renderError(err) }))
|
.on('error', (err: Error) => deliverLogger.error(`error ${err.stack}`, { e: renderError(err) }))
|
||||||
.on('stalled', (jobId) => deliverLogger.warn(`stalled id=${jobId}`));
|
.on('stalled', (jobId) => deliverLogger.warn(`stalled id=${jobId}`));
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
@ -242,8 +242,8 @@ export class QueueProcessorService implements OnApplicationShutdown {
|
||||||
this.inboxQueueWorker
|
this.inboxQueueWorker
|
||||||
.on('active', (job) => inboxLogger.debug(`active ${getJobInfo(job, true)}`))
|
.on('active', (job) => inboxLogger.debug(`active ${getJobInfo(job, true)}`))
|
||||||
.on('completed', (job, result) => inboxLogger.debug(`completed(${result}) ${getJobInfo(job, true)}`))
|
.on('completed', (job, result) => inboxLogger.debug(`completed(${result}) ${getJobInfo(job, true)}`))
|
||||||
.on('failed', (job, err) => inboxLogger.warn(`failed(${err}) ${getJobInfo(job)} activity=${job ? (job.data.activity ? job.data.activity.id : 'none') : '-'}`, { job, e: renderError(err) }))
|
.on('failed', (job, err) => inboxLogger.warn(`failed(${err.stack}) ${getJobInfo(job)} activity=${job ? (job.data.activity ? job.data.activity.id : 'none') : '-'}`, { job, e: renderError(err) }))
|
||||||
.on('error', (err: Error) => inboxLogger.error(`error ${err}`, { e: renderError(err) }))
|
.on('error', (err: Error) => inboxLogger.error(`error ${err.stack}`, { e: renderError(err) }))
|
||||||
.on('stalled', (jobId) => inboxLogger.warn(`stalled id=${jobId}`));
|
.on('stalled', (jobId) => inboxLogger.warn(`stalled id=${jobId}`));
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
@ -266,8 +266,8 @@ export class QueueProcessorService implements OnApplicationShutdown {
|
||||||
this.webhookDeliverQueueWorker
|
this.webhookDeliverQueueWorker
|
||||||
.on('active', (job) => webhookLogger.debug(`active ${getJobInfo(job, true)} to=${job.data.to}`))
|
.on('active', (job) => webhookLogger.debug(`active ${getJobInfo(job, true)} to=${job.data.to}`))
|
||||||
.on('completed', (job, result) => webhookLogger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`))
|
.on('completed', (job, result) => webhookLogger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`))
|
||||||
.on('failed', (job, err) => webhookLogger.warn(`failed(${err}) ${getJobInfo(job)} to=${job ? job.data.to : '-'}`))
|
.on('failed', (job, err) => webhookLogger.warn(`failed(${err.stack}) ${getJobInfo(job)} to=${job ? job.data.to : '-'}`))
|
||||||
.on('error', (err: Error) => webhookLogger.error(`error ${err}`, { e: renderError(err) }))
|
.on('error', (err: Error) => webhookLogger.error(`error ${err.stack}`, { e: renderError(err) }))
|
||||||
.on('stalled', (jobId) => webhookLogger.warn(`stalled id=${jobId}`));
|
.on('stalled', (jobId) => webhookLogger.warn(`stalled id=${jobId}`));
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
@ -295,8 +295,8 @@ export class QueueProcessorService implements OnApplicationShutdown {
|
||||||
this.relationshipQueueWorker
|
this.relationshipQueueWorker
|
||||||
.on('active', (job) => relationshipLogger.debug(`active id=${job.id}`))
|
.on('active', (job) => relationshipLogger.debug(`active id=${job.id}`))
|
||||||
.on('completed', (job, result) => relationshipLogger.debug(`completed(${result}) id=${job.id}`))
|
.on('completed', (job, result) => relationshipLogger.debug(`completed(${result}) id=${job.id}`))
|
||||||
.on('failed', (job, err) => relationshipLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
.on('failed', (job, err) => relationshipLogger.warn(`failed(${err.stack}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
||||||
.on('error', (err: Error) => relationshipLogger.error(`error ${err}`, { e: renderError(err) }))
|
.on('error', (err: Error) => relationshipLogger.error(`error ${err.stack}`, { e: renderError(err) }))
|
||||||
.on('stalled', (jobId) => relationshipLogger.warn(`stalled id=${jobId}`));
|
.on('stalled', (jobId) => relationshipLogger.warn(`stalled id=${jobId}`));
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
@ -318,8 +318,8 @@ export class QueueProcessorService implements OnApplicationShutdown {
|
||||||
this.objectStorageQueueWorker
|
this.objectStorageQueueWorker
|
||||||
.on('active', (job) => objectStorageLogger.debug(`active id=${job.id}`))
|
.on('active', (job) => objectStorageLogger.debug(`active id=${job.id}`))
|
||||||
.on('completed', (job, result) => objectStorageLogger.debug(`completed(${result}) id=${job.id}`))
|
.on('completed', (job, result) => objectStorageLogger.debug(`completed(${result}) id=${job.id}`))
|
||||||
.on('failed', (job, err) => objectStorageLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
.on('failed', (job, err) => objectStorageLogger.warn(`failed(${err.stack}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
||||||
.on('error', (err: Error) => objectStorageLogger.error(`error ${err}`, { e: renderError(err) }))
|
.on('error', (err: Error) => objectStorageLogger.error(`error ${err.stack}`, { e: renderError(err) }))
|
||||||
.on('stalled', (jobId) => objectStorageLogger.warn(`stalled id=${jobId}`));
|
.on('stalled', (jobId) => objectStorageLogger.warn(`stalled id=${jobId}`));
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
|
|
@ -138,7 +138,7 @@ export class ActivityPubServerService {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const algo = match[1];
|
const algo = match[1].toUpperCase();
|
||||||
const digestValue = match[2];
|
const digestValue = match[2];
|
||||||
|
|
||||||
if (algo !== 'SHA-256') {
|
if (algo !== 'SHA-256') {
|
||||||
|
@ -195,11 +195,11 @@ export class ActivityPubServerService {
|
||||||
//#region Check ff visibility
|
//#region Check ff visibility
|
||||||
const profile = await this.userProfilesRepository.findOneByOrFail({ userId: user.id });
|
const profile = await this.userProfilesRepository.findOneByOrFail({ userId: user.id });
|
||||||
|
|
||||||
if (profile.ffVisibility === 'private') {
|
if (profile.followersVisibility === 'private') {
|
||||||
reply.code(403);
|
reply.code(403);
|
||||||
reply.header('Cache-Control', 'public, max-age=30');
|
reply.header('Cache-Control', 'public, max-age=30');
|
||||||
return;
|
return;
|
||||||
} else if (profile.ffVisibility === 'followers') {
|
} else if (profile.followersVisibility === 'followers') {
|
||||||
reply.code(403);
|
reply.code(403);
|
||||||
reply.header('Cache-Control', 'public, max-age=30');
|
reply.header('Cache-Control', 'public, max-age=30');
|
||||||
return;
|
return;
|
||||||
|
@ -287,11 +287,11 @@ export class ActivityPubServerService {
|
||||||
//#region Check ff visibility
|
//#region Check ff visibility
|
||||||
const profile = await this.userProfilesRepository.findOneByOrFail({ userId: user.id });
|
const profile = await this.userProfilesRepository.findOneByOrFail({ userId: user.id });
|
||||||
|
|
||||||
if (profile.ffVisibility === 'private') {
|
if (profile.followingVisibility === 'private') {
|
||||||
reply.code(403);
|
reply.code(403);
|
||||||
reply.header('Cache-Control', 'public, max-age=30');
|
reply.header('Cache-Control', 'public, max-age=30');
|
||||||
return;
|
return;
|
||||||
} else if (profile.ffVisibility === 'followers') {
|
} else if (profile.followingVisibility === 'followers') {
|
||||||
reply.code(403);
|
reply.code(403);
|
||||||
reply.header('Cache-Control', 'public, max-age=30');
|
reply.header('Cache-Control', 'public, max-age=30');
|
||||||
return;
|
return;
|
||||||
|
@ -493,8 +493,7 @@ export class ActivityPubServerService {
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public createServer(fastify: FastifyInstance, options: FastifyPluginOptions, done: (err?: Error) => void) {
|
public createServer(fastify: FastifyInstance, options: FastifyPluginOptions, done: (err?: Error) => void) {
|
||||||
// addConstraintStrategy の型定義がおかしいため
|
fastify.addConstraintStrategy({
|
||||||
(fastify.addConstraintStrategy as any)({
|
|
||||||
name: 'apOrHtml',
|
name: 'apOrHtml',
|
||||||
storage() {
|
storage() {
|
||||||
const store = {} as any;
|
const store = {} as any;
|
||||||
|
|
|
@ -61,6 +61,9 @@ export class FileServerService {
|
||||||
public createServer(fastify: FastifyInstance, options: FastifyPluginOptions, done: (err?: Error) => void) {
|
public createServer(fastify: FastifyInstance, options: FastifyPluginOptions, done: (err?: Error) => void) {
|
||||||
fastify.addHook('onRequest', (request, reply, done) => {
|
fastify.addHook('onRequest', (request, reply, done) => {
|
||||||
reply.header('Content-Security-Policy', 'default-src \'none\'; img-src \'self\'; media-src \'self\'; style-src \'unsafe-inline\'');
|
reply.header('Content-Security-Policy', 'default-src \'none\'; img-src \'self\'; media-src \'self\'; style-src \'unsafe-inline\'');
|
||||||
|
if (process.env.NODE_ENV === 'development') {
|
||||||
|
reply.header('Access-Control-Allow-Origin', '*');
|
||||||
|
}
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,8 @@ import { AbuseUserReportEntityService } from '@/core/entities/AbuseUserReportEnt
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'read:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,8 @@ import { DI } from '@/di-symbols.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
res: {
|
res: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
|
|
@ -14,6 +14,8 @@ import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireAdmin: true,
|
requireAdmin: true,
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -13,6 +13,8 @@ import { ApiError } from '@/server/api/error.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'read:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireAdmin: true,
|
requireAdmin: true,
|
||||||
|
|
||||||
|
@ -23,6 +25,11 @@ export const meta = {
|
||||||
id: 'cb865949-8af5-4062-a88c-ef55e8786d1d',
|
id: 'cb865949-8af5-4062-a88c-ef55e8786d1d',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
ref: 'User',
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -13,8 +13,16 @@ import { ModerationLogService } from '@/core/ModerationLogService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
ref: 'Ad',
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
@ -61,7 +69,18 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
ad: ad,
|
ad: ad,
|
||||||
});
|
});
|
||||||
|
|
||||||
return ad;
|
return {
|
||||||
|
id: ad.id,
|
||||||
|
expiresAt: ad.expiresAt.toISOString(),
|
||||||
|
startsAt: ad.startsAt.toISOString(),
|
||||||
|
dayOfWeek: ad.dayOfWeek,
|
||||||
|
url: ad.url,
|
||||||
|
imageUrl: ad.imageUrl,
|
||||||
|
priority: ad.priority,
|
||||||
|
ratio: ad.ratio,
|
||||||
|
place: ad.place,
|
||||||
|
memo: ad.memo,
|
||||||
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,8 @@ import { ApiError } from '../../../error.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,21 @@ import { DI } from '@/di-symbols.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'read:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
|
res: {
|
||||||
|
type: 'array',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
ref: 'Ad',
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
@ -44,7 +57,18 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
}
|
}
|
||||||
const ads = await query.limit(ps.limit).getMany();
|
const ads = await query.limit(ps.limit).getMany();
|
||||||
|
|
||||||
return ads;
|
return ads.map(ad => ({
|
||||||
|
id: ad.id,
|
||||||
|
expiresAt: ad.expiresAt.toISOString(),
|
||||||
|
startsAt: ad.startsAt.toISOString(),
|
||||||
|
dayOfWeek: ad.dayOfWeek,
|
||||||
|
url: ad.url,
|
||||||
|
imageUrl: ad.imageUrl,
|
||||||
|
memo: ad.memo,
|
||||||
|
place: ad.place,
|
||||||
|
priority: ad.priority,
|
||||||
|
ratio: ad.ratio,
|
||||||
|
}));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,8 @@ import { ApiError } from '../../../error.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@ import { AnnouncementService } from '@/core/AnnouncementService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,8 @@ import { ApiError } from '../../../error.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,8 @@ import { IdService } from '@/core/IdService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'read:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,8 @@ import { ApiError } from '../../../error.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@ import { AvatarDecorationService } from '@/core/AvatarDecorationService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageAvatarDecorations',
|
requireRolePolicy: 'canManageAvatarDecorations',
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -12,6 +12,8 @@ import { ApiError } from '../../../error.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageAvatarDecorations',
|
requireRolePolicy: 'canManageAvatarDecorations',
|
||||||
errors: {
|
errors: {
|
||||||
|
|
|
@ -15,6 +15,8 @@ import { AvatarDecorationService } from '@/core/AvatarDecorationService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'read:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageAvatarDecorations',
|
requireRolePolicy: 'canManageAvatarDecorations',
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,8 @@ import { ApiError } from '../../../error.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageAvatarDecorations',
|
requireRolePolicy: 'canManageAvatarDecorations',
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,8 @@ import { DI } from '@/di-symbols.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireAdmin: true,
|
requireAdmin: true,
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,8 @@ import { DI } from '@/di-symbols.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireAdmin: true,
|
requireAdmin: true,
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -10,6 +10,8 @@ import { QueueService } from '@/core/QueueService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -13,6 +13,8 @@ import { DI } from '@/di-symbols.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -13,6 +13,8 @@ import { DriveFileEntityService } from '@/core/entities/DriveFileEntityService.j
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'read:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,8 @@ import { ApiError } from '../../../error.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'read:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@ import { CustomEmojiService } from '@/core/CustomEmojiService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageCustomEmojis',
|
requireRolePolicy: 'canManageCustomEmojis',
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -14,6 +14,8 @@ import { ApiError } from '../../../error.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageCustomEmojis',
|
requireRolePolicy: 'canManageCustomEmojis',
|
||||||
|
|
||||||
|
@ -29,6 +31,8 @@ export const meta = {
|
||||||
id: 'f7a3462c-4e6e-4069-8421-b9bd4f4c3975',
|
id: 'f7a3462c-4e6e-4069-8421-b9bd4f4c3975',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
ref: 'EmojiDetailed',
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -16,6 +16,8 @@ import { ApiError } from '../../../error.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageCustomEmojis',
|
requireRolePolicy: 'canManageCustomEmojis',
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@ import { CustomEmojiService } from '@/core/CustomEmojiService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageCustomEmojis',
|
requireRolePolicy: 'canManageCustomEmojis',
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -10,6 +10,8 @@ import { CustomEmojiService } from '@/core/CustomEmojiService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageCustomEmojis',
|
requireRolePolicy: 'canManageCustomEmojis',
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||||
import { QueueService } from '@/core/QueueService.js';
|
import { QueueService } from '@/core/QueueService.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
secure: true,
|
kind: 'write:admin',
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageCustomEmojis',
|
requireRolePolicy: 'canManageCustomEmojis',
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -15,6 +15,8 @@ import { sqlLikeEscape } from '@/misc/sql-like-escape.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'read:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageCustomEmojis',
|
requireRolePolicy: 'canManageCustomEmojis',
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,8 @@ import { EmojiEntityService } from '@/core/entities/EmojiEntityService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'read:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageCustomEmojis',
|
requireRolePolicy: 'canManageCustomEmojis',
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@ import { CustomEmojiService } from '@/core/CustomEmojiService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageCustomEmojis',
|
requireRolePolicy: 'canManageCustomEmojis',
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -10,6 +10,8 @@ import { CustomEmojiService } from '@/core/CustomEmojiService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageCustomEmojis',
|
requireRolePolicy: 'canManageCustomEmojis',
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -10,6 +10,8 @@ import { CustomEmojiService } from '@/core/CustomEmojiService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageCustomEmojis',
|
requireRolePolicy: 'canManageCustomEmojis',
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -10,6 +10,8 @@ import { CustomEmojiService } from '@/core/CustomEmojiService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageCustomEmojis',
|
requireRolePolicy: 'canManageCustomEmojis',
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -13,6 +13,8 @@ import { ApiError } from '../../../error.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'read:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireRolePolicy: 'canManageCustomEmojis',
|
requireRolePolicy: 'canManageCustomEmojis',
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,8 @@ import { DI } from '@/di-symbols.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -13,6 +13,8 @@ import { DI } from '@/di-symbols.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
kind: 'write:admin',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
} as const;
|
} as const;
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue