mirror of
https://github.com/kokonect-link/cherrypick
synced 2024-11-30 15:58:19 +09:00
commit
837bc77f89
@ -136,6 +136,21 @@ redis:
|
||||
|
||||
id: 'aidx'
|
||||
|
||||
# ┌────────────────┐
|
||||
#───┘ Error tracking └──────────────────────────────────────────
|
||||
|
||||
# Sentry is available for error tracking.
|
||||
# See the Sentry documentation for more details on options.
|
||||
|
||||
#sentryForBackend:
|
||||
# enableNodeProfiling: true
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
#sentryForFrontend:
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Other configuration └─────────────────────────────────────
|
||||
|
||||
|
@ -205,6 +205,21 @@ redis:
|
||||
|
||||
id: 'aidx'
|
||||
|
||||
# ┌────────────────┐
|
||||
#───┘ Error tracking └──────────────────────────────────────────
|
||||
|
||||
# Sentry is available for error tracking.
|
||||
# See the Sentry documentation for more details on options.
|
||||
|
||||
#sentryForBackend:
|
||||
# enableNodeProfiling: true
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
#sentryForFrontend:
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Other configuration └─────────────────────────────────────
|
||||
|
||||
|
@ -4,12 +4,10 @@
|
||||
"service": "app",
|
||||
"workspaceFolder": "/workspace",
|
||||
"features": {
|
||||
"ghcr.io/devcontainers-contrib/features/pnpm:2": {
|
||||
"version": "8.9.2"
|
||||
},
|
||||
"ghcr.io/devcontainers/features/node:1": {
|
||||
"version": "20.10.0"
|
||||
}
|
||||
"version": "20.12.2"
|
||||
},
|
||||
"ghcr.io/devcontainers-contrib/features/corepack:1": {}
|
||||
},
|
||||
"forwardPorts": [3000],
|
||||
"postCreateCommand": "sudo chmod 755 .devcontainer/init.sh && .devcontainer/init.sh",
|
||||
|
@ -132,6 +132,21 @@ redis:
|
||||
|
||||
id: 'aidx'
|
||||
|
||||
# ┌────────────────┐
|
||||
#───┘ Error tracking └──────────────────────────────────────────
|
||||
|
||||
# Sentry is available for error tracking.
|
||||
# See the Sentry documentation for more details on options.
|
||||
|
||||
#sentryForBackend:
|
||||
# enableNodeProfiling: true
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
#sentryForFrontend:
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Other configuration └─────────────────────────────────────
|
||||
|
||||
|
@ -4,6 +4,8 @@ set -xe
|
||||
|
||||
sudo chown -R node /workspace
|
||||
git submodule update --init
|
||||
corepack install
|
||||
corepack enable
|
||||
pnpm config set store-dir /home/node/.local/share/pnpm/store
|
||||
pnpm install --frozen-lockfile
|
||||
cp .devcontainer/devcontainer.yml .config/default.yml
|
||||
|
3
.github/FUNDING.yml
vendored
3
.github/FUNDING.yml
vendored
@ -1,3 +0,0 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
patreon: noridev
|
@ -24,9 +24,7 @@ jobs:
|
||||
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
||||
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v3
|
||||
with:
|
||||
version: 8
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- name: setup node
|
||||
id: setup-node
|
||||
|
7
.github/workflows/get-api-diff.yml
vendored
7
.github/workflows/get-api-diff.yml
vendored
@ -18,7 +18,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.10.0]
|
||||
node-version: [20.12.2]
|
||||
api-json-name: [api-base.json, api-head.json]
|
||||
include:
|
||||
- api-json-name: api-base.json
|
||||
@ -32,10 +32,7 @@ jobs:
|
||||
ref: ${{ matrix.ref }}
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v3
|
||||
with:
|
||||
version: 8
|
||||
run_install: false
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4.0.2
|
||||
with:
|
||||
|
15
.github/workflows/lint.yml
vendored
15
.github/workflows/lint.yml
vendored
@ -27,10 +27,7 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- uses: pnpm/action-setup@v3
|
||||
with:
|
||||
version: 8
|
||||
run_install: false
|
||||
- uses: pnpm/action-setup@v4
|
||||
- uses: actions/setup-node@v4.0.2
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
@ -54,10 +51,7 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- uses: pnpm/action-setup@v3
|
||||
with:
|
||||
version: 7
|
||||
run_install: false
|
||||
- uses: pnpm/action-setup@v4
|
||||
- uses: actions/setup-node@v4.0.2
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
@ -80,10 +74,7 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- uses: pnpm/action-setup@v3
|
||||
with:
|
||||
version: 7
|
||||
run_install: false
|
||||
- uses: pnpm/action-setup@v4
|
||||
- uses: actions/setup-node@v4.0.2
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
|
27
.github/workflows/locale.yml
vendored
Normal file
27
.github/workflows/locale.yml
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
name: Lint
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- locales/**
|
||||
pull_request:
|
||||
paths:
|
||||
- locales/**
|
||||
|
||||
jobs:
|
||||
locale_verify:
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- uses: pnpm/action-setup@v4
|
||||
- uses: actions/setup-node@v4.0.2
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- run: corepack enable
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- run: cd locales && node verify.js
|
7
.github/workflows/on-release-created.yml
vendored
7
.github/workflows/on-release-created.yml
vendored
@ -17,17 +17,14 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.10.0]
|
||||
node-version: [20.12.2]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v3
|
||||
with:
|
||||
version: 8
|
||||
run_install: false
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4.0.2
|
||||
with:
|
||||
|
7
.github/workflows/release-edit-with-push.yml
vendored
7
.github/workflows/release-edit-with-push.yml
vendored
@ -23,7 +23,7 @@ jobs:
|
||||
# headがrelease/かつopenのPRを1つ取得
|
||||
- name: Get PR
|
||||
run: |
|
||||
echo "pr_number=$(gh pr list --limit 1 --head "${{ github.ref_name }}" --json number --jq '.[] | .number')" >> $GITHUB_OUTPUT
|
||||
echo "pr_number=$(gh pr list --limit 1 --head "$GITHUB_REF_NAME" --json number --jq '.[] | .number')" >> $GITHUB_OUTPUT
|
||||
id: get_pr
|
||||
- name: Get target version
|
||||
uses: misskey-dev/release-manager-actions/.github/actions/get-target-version@v1
|
||||
@ -37,4 +37,7 @@ jobs:
|
||||
# PRのnotesを更新
|
||||
- name: Update PR
|
||||
run: |
|
||||
gh pr edit ${{ steps.get_pr.outputs.pr_number }} --body "${{ steps.changelog.outputs.changelog }}"
|
||||
gh pr edit "$PR_NUMBER" --body "$CHANGELOG"
|
||||
env:
|
||||
CHANGELOG: ${{ steps.changelog.outputs.changelog }}
|
||||
PR_NUMBER: ${{ steps.get_pr.outputs.pr_number }}
|
||||
|
3
.github/workflows/release-with-dispatch.yml
vendored
3
.github/workflows/release-with-dispatch.yml
vendored
@ -61,6 +61,7 @@ jobs:
|
||||
-
|
||||
|
||||
use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
|
||||
indent: ${{ vars.INDENT }}
|
||||
secrets:
|
||||
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
|
||||
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
|
||||
@ -75,6 +76,7 @@ jobs:
|
||||
pr_number: ${{ needs.get-pr.outputs.pr_number }}
|
||||
package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
|
||||
use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
|
||||
indent: ${{ vars.INDENT }}
|
||||
secrets:
|
||||
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
|
||||
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
|
||||
@ -115,6 +117,7 @@ jobs:
|
||||
# }
|
||||
package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
|
||||
use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
|
||||
indent: ${{ vars.INDENT }}
|
||||
secrets:
|
||||
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
|
||||
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
|
||||
|
5
.github/workflows/release-with-ready.yml
vendored
5
.github/workflows/release-with-ready.yml
vendored
@ -22,9 +22,11 @@ jobs:
|
||||
# PR情報を取得
|
||||
- name: Get PR
|
||||
run: |
|
||||
pr_json=$(gh pr view ${{ github.event.pull_request.number }} --json isDraft,headRefName)
|
||||
pr_json=$(gh pr view "$PR_NUMBER" --json isDraft,headRefName)
|
||||
echo "ref=$(echo $pr_json | jq -r '.headRefName')" >> $GITHUB_OUTPUT
|
||||
id: get_pr
|
||||
env:
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
release:
|
||||
uses: misskey-dev/release-manager-actions/.github/workflows/create-prerelease.yml@v1
|
||||
needs: check
|
||||
@ -33,6 +35,7 @@ jobs:
|
||||
pr_number: ${{ github.event.pull_request.number }}
|
||||
package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
|
||||
use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
|
||||
indent: ${{ vars.INDENT }}
|
||||
secrets:
|
||||
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
|
||||
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
|
||||
|
5
.github/workflows/storybook.yml
vendored
5
.github/workflows/storybook.yml
vendored
@ -34,10 +34,7 @@ jobs:
|
||||
echo "base=$(git rev-list --parents -n1 HEAD | cut -d" " -f2)" >> $GITHUB_OUTPUT
|
||||
git checkout $(git rev-list --parents -n1 HEAD | cut -d" " -f3)
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v3
|
||||
with:
|
||||
version: 8
|
||||
run_install: false
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js 20.x
|
||||
uses: actions/setup-node@v4.0.2
|
||||
with:
|
||||
|
14
.github/workflows/test-backend.yml
vendored
14
.github/workflows/test-backend.yml
vendored
@ -21,7 +21,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.10.0]
|
||||
node-version: [20.12.2]
|
||||
|
||||
services:
|
||||
postgres:
|
||||
@ -41,10 +41,7 @@ jobs:
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v3
|
||||
with:
|
||||
version: 8
|
||||
run_install: false
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Install FFmpeg
|
||||
uses: FedericoCarboni/setup-ffmpeg@v3
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
@ -73,7 +70,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.10.0]
|
||||
node-version: [20.12.2]
|
||||
|
||||
services:
|
||||
postgres:
|
||||
@ -93,10 +90,7 @@ jobs:
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v3
|
||||
with:
|
||||
version: 8
|
||||
run_install: false
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4.0.2
|
||||
with:
|
||||
|
2
.github/workflows/test-cherrypick-js.yml
vendored
2
.github/workflows/test-cherrypick-js.yml
vendored
@ -20,7 +20,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.10.0]
|
||||
node-version: [20.12.2]
|
||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||
|
||||
steps:
|
||||
|
14
.github/workflows/test-frontend.yml
vendored
14
.github/workflows/test-frontend.yml
vendored
@ -26,17 +26,14 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.10.0]
|
||||
node-version: [20.12.2]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v3
|
||||
with:
|
||||
version: 8
|
||||
run_install: false
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4.0.2
|
||||
with:
|
||||
@ -64,7 +61,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
node-version: [20.10.0]
|
||||
node-version: [20.12.2]
|
||||
browser: [chrome]
|
||||
|
||||
services:
|
||||
@ -91,10 +88,7 @@ jobs:
|
||||
#- uses: browser-actions/setup-firefox@latest
|
||||
# if: ${{ matrix.browser == 'firefox' }}
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v3
|
||||
with:
|
||||
version: 7
|
||||
run_install: false
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4.0.2
|
||||
with:
|
||||
|
7
.github/workflows/test-production.yml
vendored
7
.github/workflows/test-production.yml
vendored
@ -16,17 +16,14 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.10.0]
|
||||
node-version: [20.12.2]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v3
|
||||
with:
|
||||
version: 8
|
||||
run_install: false
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4.0.2
|
||||
with:
|
||||
|
7
.github/workflows/validate-api-json.yml
vendored
7
.github/workflows/validate-api-json.yml
vendored
@ -17,17 +17,14 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.10.0]
|
||||
node-version: [20.12.2]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v3
|
||||
with:
|
||||
version: 8
|
||||
run_install: false
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4.0.2
|
||||
with:
|
||||
|
@ -1 +1 @@
|
||||
20.10.0
|
||||
20.12.2
|
||||
|
50
CHANGELOG.md
50
CHANGELOG.md
@ -1,17 +1,34 @@
|
||||
## Unreleased
|
||||
## 2024.5.0
|
||||
|
||||
### Note
|
||||
- コントロールパネル内にあるサマリープロキシの設定個所がセキュリティから全般へ変更となります。
|
||||
- 悪意のある第三者がリモートユーザーになりすましたアクティビティを受け取れてしまう問題を修正しました。詳しくは[GitHub security advisory](https://github.com/misskey-dev/misskey/security/advisories/GHSA-2vxv-pv3m-3wvj)をご覧ください。
|
||||
- 管理者向け権限 `read:admin:show-users` は `read:admin:show-user` に統合されました。必要に応じてAPIトークンを再発行してください。
|
||||
|
||||
### General
|
||||
- Feat: エラートラッキングにSentryを使用できるようになりました
|
||||
- Enhance: URLプレビューの有効化・無効化を設定できるように #13569
|
||||
- Enhance: アンテナでBotによるノートを除外できるように
|
||||
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/545)
|
||||
- Enhance: クリップのノート数を表示するように
|
||||
- Enhance: コンディショナルロールの条件として以下を新たに追加 (#13667)
|
||||
- 猫ユーザーか
|
||||
- botユーザーか
|
||||
- サスペンド済みユーザーか
|
||||
- 鍵アカウントユーザーか
|
||||
- 「アカウントを見つけやすくする」が有効なユーザーか
|
||||
- Enhance: Goneを出さずに終了したサーバーへの配信停止を自動的に行うように
|
||||
- もしそのようなサーバーからから配信が届いた場合には自動的に配信を再開します
|
||||
- Enhance: 配信停止の理由を表示するように
|
||||
- Enhance: サーバーのお問い合わせ先URLを設定できるようになりました
|
||||
- Fix: Play作成時に設定した公開範囲が機能していない問題を修正
|
||||
- Fix: 正規化されていない状態のhashtagが連合されてきたhtmlに含まれているとhashtagが正しくhashtagに復元されない問題を修正
|
||||
- Fix: みつけるのアンケート欄にてチャンネルのアンケートが含まれてしまう問題を修正
|
||||
|
||||
### Client
|
||||
- Feat: アップロードするファイルの名前をランダム文字列にできるように
|
||||
- Feat: 個別のお知らせにリンクで飛べるように
|
||||
(Based on https://github.com/MisskeyIO/misskey/pull/639)
|
||||
- Enhance: 自分のノートの添付ファイルから直接ファイルの詳細ページに飛べるように
|
||||
- Enhance: 広告がMisskeyと同一ドメインの場合はRouterで遷移するように
|
||||
- Enhance: リアクション・いいねの総数を表示するように
|
||||
@ -27,6 +44,16 @@
|
||||
- Enhance: ノートについているリアクションの「もっと!」から、リアクションの一覧を表示できるように
|
||||
- Enhance: リプライにて引用がある場合テキストが空でもノートできるように
|
||||
- 引用したいノートのURLをコピーしリプライ投稿画面にペーストして添付することで達成できます
|
||||
- Enhance: フォローするかどうかの確認ダイアログを出せるように
|
||||
- Enhance: Playを手動でリロードできるように
|
||||
- Enhance: 通報のコメント内のリンクをクリックした際、ウィンドウで開くように
|
||||
- Enhance: `Ui:C:postForm` および `Ui:C:postFormButton` に `localOnly` と `visibility` を設定できるように
|
||||
- Enhance: AiScriptを0.18.0にバージョンアップ
|
||||
- Enhance: 通常のノートでも、お気に入りに登録したチャンネルにリノートできるように
|
||||
- Enhance: 長いテキストをペーストした際にテキストファイルとして添付するかどうかを選択できるように
|
||||
- Enhance: 新着ノートをサウンドで通知する機能をdeck UIに追加しました
|
||||
- Enhance: コントロールパネルのクイックアクションからファイルを照会できるように
|
||||
- Enhance: コントロールパネルのクイックアクションから通常の照会を行えるように
|
||||
- Fix: 一部のページ内リンクが正しく動作しない問題を修正
|
||||
- Fix: 周年の実績が閏年を考慮しない問題を修正
|
||||
- Fix: ローカルURLのプレビューポップアップが左上に表示される
|
||||
@ -41,10 +68,20 @@
|
||||
- Fix: ノート詳細ページにおいてCW付き引用リノートのCWボタンのラベルに「引用」が含まれていない問題を修正
|
||||
- Fix: ダイアログの入力で字数制限に違反していてもEnterキーが押せてしまう問題を修正
|
||||
- Fix: ダイレクト投稿の宛先が保存されない問題を修正
|
||||
- Fix: Playのページを離れたときに、Playが正常に初期化されない問題を修正
|
||||
- Fix: ページのOGP URLが間違っているのを修正
|
||||
- Fix: リバーシの対局を正しく共有できないことがある問題を修正
|
||||
- Fix: 通知をグループ化している際に、人数が正常に表示されないことがある問題を修正
|
||||
- Fix: 連合なしの状態の読み書きができない問題を修正
|
||||
- Fix: `/share` で日本語等を含むurlがurlエンコードされない問題を修正
|
||||
- Fix: ファイルを5つ以上添付してもテキストがないとノートが折りたたまれない問題を修正
|
||||
|
||||
### Server
|
||||
- Enhance: エンドポイント`antennas/update`の必須項目を`antennaId`のみに
|
||||
- Enhance: misskey-dev/summaly@5.1.0の取り込み(プレビュー生成処理の効率化)
|
||||
- Enhance: ドライブのファイルがNSFWかどうか個別に連合されるように (#13756)
|
||||
- 可能な場合、ノートの添付ファイルのセンシティブ判定がファイル単位になります
|
||||
- Fix: リモートから配送されたアクティビティにJSON-LD compactionをかける
|
||||
- Fix: フォローリクエストを作成する際に既存のものは削除するように
|
||||
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/440)
|
||||
- Fix: エンドポイント`notes/translate`のエラーを改善
|
||||
@ -53,7 +90,18 @@
|
||||
- Fix: リプライのみの引用リノートと、CWのみの引用リノートが純粋なリノートとして誤って扱われてしまう問題を修正
|
||||
- Fix: 登録にメール認証が必須になっている場合、登録されているメールアドレスを削除できないように
|
||||
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/606)
|
||||
- Fix: Add Cache-Control to Bull Board
|
||||
- Fix: nginx経由で/files/にRangeリクエストされた場合に正しく応答できないのを修正
|
||||
- Fix: 一部のタイムラインのストリーミングでインスタンスミュートが効かない問題を修正
|
||||
- Fix: グローバルタイムラインで返信が表示されないことがある問題を修正
|
||||
- Fix: リノートをミュートしたユーザの投稿のリノートがミュートされる問題を修正
|
||||
- Fix: AP Link等は添付ファイル扱いしないようになど (#13754)
|
||||
- Fix: FTTが有効かつsinceIdのみを指定した場合に帰って来るレスポンスが逆順である問題を修正
|
||||
- Fix: `/i/notifications`に `includeTypes`か`excludeTypes`を指定しているとき、通知が存在するのに空配列を返すことがある問題を修正
|
||||
- Fix: 複数idを指定する`users/show`が関係ないユーザを返すことがある問題を修正
|
||||
- Fix: `/tags` と `/user-tags` が検索エンジンにインデックスされないように
|
||||
- Fix: もともとセンシティブではないと連合されていたファイルがセンシティブとして連合された場合にセンシティブとしてそのファイルを扱うように
|
||||
- センシティブとして連合したファイルは非センシティブとして連合されてもセンシティブとして扱われます
|
||||
|
||||
## 2024.3.1
|
||||
|
||||
|
@ -23,6 +23,25 @@ Misskey의 전체 변경 사항을 확인하려면, [CHANGELOG.md#2024xx](CHANGE
|
||||
# 릴리즈 노트
|
||||
이 문서는 CherryPick의 변경 사항만 포함합니다.
|
||||
|
||||
## 4.9.0
|
||||
출시일: 2024/7/27<br>
|
||||
기반 Misskey 버전: 2024.5.0<br>
|
||||
Misskey의 전체 변경 사항을 확인하려면, [CHANGELOG.md#202450](CHANGELOG.md#202450) 문서를 참고하십시오.
|
||||
|
||||
### Client
|
||||
- Enhance: 노트 작성 폼에서 '공개 범위 기억하기' 설정을 변경할 수 있음
|
||||
- Fix: 타임라인 노트의 리액션 뷰어에 리모트 서버의 커스텀 이모지가 표시되지 않음
|
||||
- Fix: '리노트 공개 범위 지정' 옵션이 `없음`으로 설정된 경우 리노트를 할 수 없음
|
||||
- Fix: 아바타 장식을 설정할 때 설정 팝업이 두 번 표시될 수 있음
|
||||
- Fix: 코드 블록의 하이라이트가 실제 위치와 다르게 표시될 수 있음 (kokonect-link/cherrypick#475)
|
||||
|
||||
### Server
|
||||
- Feat: 리모트 유저의 아바타 장식을 여러 개 불러올 수 있음([yunochi/misskey@696787b3](https://github.com/yunochi/misskey/commit/696787b38bac31e7586899a5a59611a6fe50b9a1), [yunochi/misskey@4a5fcfe4](https://github.com/yunochi/misskey/commit/4a5fcfe43880f08380541caa6b7593b90306d103))
|
||||
- Enhance: 노트를 삭제해도 답글을 유지하도록 변경([yunochi/misskey@72feaecd](https://github.com/yunochi/misskey/commit/72feaecdc1d9bd358396053f6505c46ccb23ef74))
|
||||
- Fix: 유니코드 이모지로 리액션한 경우에도 리액션 알림의 양 끝에 `:`가 표시됨
|
||||
|
||||
---
|
||||
|
||||
## 4.8.0
|
||||
출시일: 2024/5/20<br>
|
||||
기반 Misskey 버전: 2024.3.1<br>
|
||||
|
@ -1,6 +1,6 @@
|
||||
# syntax = docker/dockerfile:1.4
|
||||
|
||||
ARG NODE_VERSION=20.10.0-bullseye
|
||||
ARG NODE_VERSION=20.12.2-bullseye
|
||||
|
||||
# build assets & compile TypeScript
|
||||
|
||||
|
@ -28,6 +28,10 @@
|
||||
|
||||
## Thanks
|
||||
|
||||
<a href="https://sentry.io/"><img src="https://github.com/misskey-dev/misskey/assets/4439005/98576556-222f-467a-94be-e98dbda1d852" height="30" alt="Sentry" /></a>
|
||||
|
||||
Thanks to [Sentry](https://sentry.io/) for providing the error tracking platform that helps us catch unexpected errors.
|
||||
|
||||
<a href="https://www.chromatic.com/"><img src="https://user-images.githubusercontent.com/321738/84662277-e3db4f80-af1b-11ea-88f5-91d67a5e59f6.png" height="30" alt="Chromatic" /></a>
|
||||
|
||||
Thanks to [Chromatic](https://www.chromatic.com/) for providing the visual testing platform that helps us review UI changes and catch visual regressions.
|
||||
|
@ -152,6 +152,22 @@ redis:
|
||||
# ID SETTINGS AFTER THAT!
|
||||
|
||||
id: "aidx"
|
||||
|
||||
# ┌────────────────┐
|
||||
#───┘ Error tracking └──────────────────────────────────────────
|
||||
|
||||
# Sentry is available for error tracking.
|
||||
# See the Sentry documentation for more details on options.
|
||||
|
||||
#sentryForBackend:
|
||||
# enableNodeProfiling: true
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
#sentryForFrontend:
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Other configuration └─────────────────────────────────────
|
||||
|
||||
|
@ -4,4 +4,4 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
PORT=$(grep '^port:' /cherrypick/.config/default.yml | awk 'NR==1{print $2; exit}')
|
||||
curl -s -S -o /dev/null "http://localhost:${PORT}"
|
||||
curl -Sfso/dev/null "http://localhost:${PORT}/healthz"
|
||||
|
@ -123,6 +123,7 @@ reactions: "التفاعلات"
|
||||
reactionSettingDescription2: "اسحب لترتيب ، انقر للحذف ، استخدم \"+\" للإضافة."
|
||||
rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات"
|
||||
attachCancel: "أزل المرفق"
|
||||
deleteFile: "حُذف الملف"
|
||||
markAsSensitive: "علّمه كمحتوى حساس"
|
||||
unmarkAsSensitive: "ألغ تعيينه كمحتوى حساس"
|
||||
enterFileName: "ادخل اسم الملف"
|
||||
@ -1029,6 +1030,8 @@ sourceCode: "الشفرة المصدرية"
|
||||
flip: "اقلب"
|
||||
lastNDays: "آخر {n} أيام"
|
||||
surrender: "ألغِ"
|
||||
_delivery:
|
||||
stop: "مُعلّق"
|
||||
_initialAccountSetting:
|
||||
accountCreated: "نجح إنشاء حسابك!"
|
||||
letsStartAccountSetup: "إذا كنت جديدًا لنعدّ حسابك الشخصي."
|
||||
@ -1583,8 +1586,21 @@ _webhookSettings:
|
||||
reaction: "عند التفاعل"
|
||||
_moderationLogTypes:
|
||||
suspend: "علِق"
|
||||
deleteDriveFile: "حُذف الملف"
|
||||
deleteNote: "حُذفت الملاحظة"
|
||||
createGlobalAnnouncement: "أُنشئ إعلان عام"
|
||||
createUserAnnouncement: "أُنشئ إعلان مستخدم"
|
||||
updateGlobalAnnouncement: "حُدث إعلان عام"
|
||||
updateUserAnnouncement: "حُدث إعلان مستخدم"
|
||||
resetPassword: "أعد تعيين كلمتك السرية"
|
||||
createInvitation: "ولِّد دعوة"
|
||||
_reversi:
|
||||
total: "المجموع"
|
||||
|
||||
lookingForPlayer: "يبحث عن خصم..."
|
||||
gameCanceled: "أُلغيت اللعبة."
|
||||
opponentHasSettingsChanged: "غيَر الخصم إعدادته."
|
||||
showBoardLabels: "اعرض ترقيم الصفوف والأعمدة على اللوح"
|
||||
useAvatarAsStone: "حوَل الحجارة إلى صور مستخدمين"
|
||||
_offlineScreen:
|
||||
title: "غير متصل - يتعذر الاتصال بالخادم"
|
||||
header: "يتعذر الاتصال بالخادم"
|
||||
|
@ -870,6 +870,10 @@ replies: "জবাব"
|
||||
renotes: "রিনোট"
|
||||
sourceCode: "সোর্স কোড"
|
||||
flip: "উল্টান"
|
||||
_delivery:
|
||||
stop: "স্থগিত করা হয়েছে"
|
||||
_type:
|
||||
none: "প্রকাশ করা হচ্ছে"
|
||||
_role:
|
||||
priority: "অগ্রাধিকার"
|
||||
_priority:
|
||||
@ -1452,4 +1456,3 @@ _moderationLogTypes:
|
||||
resetPassword: "পাসওয়ার্ড রিসেট করুন"
|
||||
_reversi:
|
||||
total: "মোট"
|
||||
|
||||
|
@ -400,6 +400,7 @@ name: "Nom"
|
||||
antennaSource: "Font de l'antena"
|
||||
antennaKeywords: "Paraules clau a seguir"
|
||||
antennaExcludeKeywords: "Paraules clau a excloure"
|
||||
antennaExcludeBots: "Exclou els bots"
|
||||
antennaKeywordsDescription: "Separar amb espais per la condició AND o amb salts de línia per la condició OR."
|
||||
notifyAntenna: "Notifica'm les publicacions noves"
|
||||
withFileAntenna: "Només les publicacions amb fitxers"
|
||||
@ -494,6 +495,7 @@ 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"
|
||||
showReactionsCount: "Mostra el nombre de reaccions a les publicacions"
|
||||
noHistory: "No hi ha un registre previ"
|
||||
signinHistory: "Historial d'autenticacions"
|
||||
enableAdvancedMfm: "Habilitar l'MFM avançat"
|
||||
@ -543,7 +545,7 @@ objectStorageUseProxyDesc: "Desactiva'l si no faràs servir un Proxy per les con
|
||||
objectStorageSetPublicRead: "Configurar les pujades com públiques "
|
||||
s3ForcePathStyleDesc: "Si s3ForcePathStyle es troba activat el nom del dipòsit s'ha d'incloure a l'adreça URL en comtes del nom del host. Potser que necessitis activar-ho quan facis servir, per exemple, Minio a un servidor propi."
|
||||
serverLogs: "Registres del servidor"
|
||||
deleteAll: "Esborrar tot"
|
||||
deleteAll: "Elimina-ho tot"
|
||||
showFixedPostForm: "Mostrar el formulari per escriure a l'inici de la línia de temps"
|
||||
showFixedPostFormInChannel: "Mostrar el formulari d'escriptura al principi de la línia de temps (Canals)"
|
||||
withRepliesByDefaultForNewlyFollowed: "Inclou les respostes d'usuaris nous seguits a la línia de temps per defecte."
|
||||
@ -691,9 +693,9 @@ reporter: "Denunciant "
|
||||
reporteeOrigin: "Origen de la denúncia "
|
||||
reporterOrigin: "Origen del denunciant"
|
||||
forwardReport: "Transferir la denúncia a una instància remota"
|
||||
forwardReportIsAnonymous: "En comptes del teu compte, es farà servir un compte anònim com a denunciat a la instància remota."
|
||||
send: "Enviar"
|
||||
abuseMarkAsResolved: "Marcar la denúncia com a resolta"
|
||||
forwardReportIsAnonymous: "En lloc del teu compte, es farà servir un compte anònim com a denunciant al servidor remot."
|
||||
send: "Envia"
|
||||
abuseMarkAsResolved: "Marca la denúncia com a resolta"
|
||||
openInNewTab: "Obre a una pestanya nova"
|
||||
openInSideView: "Obre a una vista lateral"
|
||||
defaultNavigationBehaviour: "Navegació per defecte"
|
||||
@ -853,7 +855,7 @@ customCss: "CSS personalitzat"
|
||||
customCssWarn: "Aquesta configuració només hauries de configurar-la si saps que fas. Si poses valors inadequats pots fer que el client deixi de funcionar correctament."
|
||||
global: "Global"
|
||||
squareAvatars: "Mostrar avatars quadrats"
|
||||
sent: "Enviar"
|
||||
sent: "Envia"
|
||||
received: "Rebut"
|
||||
searchResult: "Resultats de la cerca"
|
||||
hashtags: "Etiquetes"
|
||||
@ -991,6 +993,7 @@ neverShow: "No mostrar més "
|
||||
remindMeLater: "Recorda-m'ho més tard"
|
||||
didYouLikeMisskey: "T'està agradant CherryPick?"
|
||||
pleaseDonate: "A {host} fem servir el software lliure CherryPick. Considera fer un donatiu a CherryPick perquè pugui continuar el seu desenvolupament!"
|
||||
correspondingSourceIsAvailable: "El codi font corresponent està disponible a {anchor}."
|
||||
roles: "Rols"
|
||||
role: "Rols"
|
||||
noRole: "No s'han trobat rols"
|
||||
@ -1159,6 +1162,7 @@ showRenotes: "Mostrar impulsos"
|
||||
edited: "Editat"
|
||||
notificationRecieveConfig: "Paràmetres de notificacions"
|
||||
mutualFollow: "Seguidor mutu"
|
||||
followingOrFollower: "Seguit o seguidor"
|
||||
fileAttachedOnly: "Només notes amb adjunts"
|
||||
showRepliesToOthersInTimeline: "Mostrar les respostes a altres a la línia de temps"
|
||||
hideRepliesToOthersInTimeline: "Amagar les respostes a altres a la línia de temps"
|
||||
@ -1168,6 +1172,9 @@ confirmShowRepliesAll: "Aquesta opció no té marxa enrere. Vols mostrar les tev
|
||||
confirmHideRepliesAll: "Aquesta opció no té marxa enrere. Vols ocultar les teves respostes a tots els usuaris que segueixes a la línia de temps?"
|
||||
externalServices: "Serveis externs"
|
||||
sourceCode: "Codi font"
|
||||
repositoryUrl: "URL del repositori"
|
||||
feedback: "Opinió"
|
||||
feedbackUrl: "URL per a opinar"
|
||||
impressum: "Impressum"
|
||||
impressumUrl: "Adreça URL impressum"
|
||||
impressumDescription: "A països, com Alemanya, la inclusió de la informació de contacte de l'operador (un Impressum) és requereix de manera legal per llocs comercials."
|
||||
@ -1203,6 +1210,7 @@ soundWillBePlayed: "Es reproduiran efectes de so"
|
||||
showReplay: "Veure reproducció"
|
||||
replay: "Reproduir"
|
||||
replaying: "Reproduint"
|
||||
endReplay: "Tanca la redifusió"
|
||||
ranking: "Classificació"
|
||||
lastNDays: "Últims {n} dies"
|
||||
backToTitle: "Torna al títol"
|
||||
@ -1210,7 +1218,16 @@ hemisphere: "Geolocalització"
|
||||
withSensitive: "Incloure notes amb fitxers sensibles"
|
||||
userSaysSomethingSensitive: "La publicació de {name} conte material sensible"
|
||||
enableHorizontalSwipe: "Lliscar per canviar de pestanya"
|
||||
loading: "S’està carregant"
|
||||
surrender: "Cancel·lar "
|
||||
gameRetry: "Torna a provar"
|
||||
notUsePleaseLeaveBlank: "Si no voleu usar-ho, deixeu-ho en blanc"
|
||||
useTotp: "Usa una contrasenya d'un sol ús"
|
||||
useBackupCode: "Usa un codi de recuperació"
|
||||
_delivery:
|
||||
stop: "Suspés"
|
||||
_type:
|
||||
none: "S'està publicant"
|
||||
_bubbleGame:
|
||||
howToPlay: "Com es juga"
|
||||
_howToPlay:
|
||||
@ -1503,7 +1520,7 @@ _achievements:
|
||||
_viewAchievements3min:
|
||||
title: "M'agraden els èxits "
|
||||
description: "Mira la teva llista d'assoliments durant més de 3 minuts"
|
||||
_iLoveMisskey:
|
||||
_iLoveCherryPick:
|
||||
title: "Estimo CherryPick"
|
||||
description: "Publica \"I ❤ #CherryPick\""
|
||||
flavor: "L'equip de desenvolupament de CherryPick agraeix el vostre suport!"
|
||||
@ -1916,7 +1933,6 @@ _2fa:
|
||||
registerTOTP: "Registrar una aplicació autenticadora"
|
||||
step1: "Primer instal·la una aplicació autenticadora (com {a} o {b}) al teu dispositiu."
|
||||
step2: "Després escaneja el codi QR que es mostra en aquesta pantalla."
|
||||
step2Click: "Fent clic en aquest codi QR et permetrà registrar l'autenticació de doble factor a la teva clau de seguretat o en l'aplicació d'autenticació del teu dispositiu."
|
||||
step2Uri: "Escriu la següent URI si estàs fent servir una aplicació d'escriptori "
|
||||
step3Title: "Escriu un codi d'autenticació"
|
||||
step3: "Escriu el codi d'autenticació (token) que es mostra a la teva aplicació per finalitzar la configuració."
|
||||
@ -1990,7 +2006,6 @@ _permissions:
|
||||
"read:admin:server-info": "Veure informació del servidor"
|
||||
"read:admin:show-moderation-log": "Veure registre de moderació "
|
||||
"read:admin:show-user": "Veure informació privada de l'usuari "
|
||||
"read:admin:show-users": "Veure informació privada de l'usuari "
|
||||
"write:admin:suspend-user": "Suspendre usuari"
|
||||
"write:admin:unset-user-avatar": "Esborrar avatar d'usuari "
|
||||
"write:admin:unset-user-banner": "Esborrar bàner de l'usuari "
|
||||
@ -2256,4 +2271,3 @@ _externalResourceInstaller:
|
||||
title: "Paràmetres no vàlids "
|
||||
_reversi:
|
||||
total: "Total"
|
||||
|
||||
|
@ -1099,6 +1099,10 @@ sourceCode: "Zdrojový kód"
|
||||
flip: "Otočit"
|
||||
lastNDays: "Posledních {n} dnů"
|
||||
surrender: "Zrušit"
|
||||
_delivery:
|
||||
stop: "Suspendováno"
|
||||
_type:
|
||||
none: "Publikuji"
|
||||
_initialAccountSetting:
|
||||
accountCreated: "Váš účet byl úspěšně vytvořen!"
|
||||
letsStartAccountSetup: "Pro začátek si nastavte svůj profil."
|
||||
@ -1293,7 +1297,7 @@ _achievements:
|
||||
_viewAchievements3min:
|
||||
title: "Máš rád úspěchy"
|
||||
description: "Koukejte na váš seznam úspěchů alespoň po dobu 3 minut"
|
||||
_iLoveMisskey:
|
||||
_iLoveCherryPick:
|
||||
title: "Miluju CherryPick"
|
||||
description: "Zveřejněte \" I ❤ #CherryPick\""
|
||||
flavor: "Vývojový tým CherryPick si velmi váží vaší podpory!"
|
||||
@ -1669,7 +1673,6 @@ _2fa:
|
||||
registerTOTP: "Registrovat aplikaci autentizátoru"
|
||||
step1: "Nejprve si do zařízení nainstalujte aplikaci pro ověřování (například {a} nebo {b})."
|
||||
step2: "Poté naskenujte QR kód zobrazený na této obrazovce."
|
||||
step2Click: "Kliknutím na tento QR kód můžete zaregistrovat 2FA do bezpečnostního klíče nebo aplikace autentizace telefonu."
|
||||
step3Title: "Zadejte ověřovací kód"
|
||||
step3: "Pro dokončení nastavení zadejte token poskytnutý vaší aplikací."
|
||||
step4: "Od této chvíle budou všechny budoucí pokusy o přihlášení vyžadovat tento přihlašovací token."
|
||||
@ -1723,7 +1726,7 @@ _auth:
|
||||
shareAccessTitle: "Udělovat oprávnění k aplikacím"
|
||||
shareAccess: "Chcete autorizovat \"{name}\" pro přístup k tomuto účtu?"
|
||||
shareAccessAsk: "Opravdu chcete této aplikaci povolit přístup k vašemu účtu?"
|
||||
permission: "{jméno} požaduje tato oprávnění"
|
||||
permission: "{name} požaduje tato oprávnění"
|
||||
permissionAsk: "Tato aplikace požaduje následující oprávnění"
|
||||
pleaseGoBack: "Vraťte se prosím zpět do aplikace"
|
||||
callback: "Návrat k aplikaci"
|
||||
@ -1947,7 +1950,7 @@ _notification:
|
||||
youGotMention: "{name} vás zmínil"
|
||||
youGotReply: "{name} vám odpověděl"
|
||||
youGotQuote: "{name} vás citoval"
|
||||
youRenoted: "Poznámka od {jméno}"
|
||||
youRenoted: "Poznámka od {name}"
|
||||
youWereFollowed: "Máte nového následovníka"
|
||||
youReceivedFollowRequest: "Obdrželi jste žádost o sledování"
|
||||
yourFollowRequestAccepted: "Vaše žádost o sledování byla přijata"
|
||||
@ -2030,4 +2033,3 @@ _moderationLogTypes:
|
||||
createInvitation: "Vygenerovat pozvánku"
|
||||
_reversi:
|
||||
total: "Celkem"
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
---
|
||||
_lang_: "Dansk"
|
||||
|
||||
headlineMisskey: ""
|
||||
introMisskey: "ようこそ!CherryPickは、オープンソースの分散型マイクロブログサービスです。\n「ノート」を作成して、いま起こっていることを共有したり、あなたについて皆に発信しよう📡\n「リアクション」機能で、皆のノートに素早く反応を追加することもできます👍\n新しい世界を探検しよう🚀"
|
||||
|
@ -666,7 +666,7 @@ smtpSecureInfo: "Schalte dies aus, falls du STARTTLS verwendest."
|
||||
testEmail: "Emailversand testen"
|
||||
wordMute: "Wortstummschaltung"
|
||||
regexpError: "Fehler in einem regulären Ausdruck"
|
||||
regexpErrorDescription: "Im regulären Ausdruck deiner {tab}en Wortstummschaltungen ist ein Fehler aufgetreten:"
|
||||
regexpErrorDescription: "Im regulären Ausdruck deiner in Zeile {line} von {tab}en Wortstummschaltungen ist ein Fehler aufgetreten:"
|
||||
instanceMute: "Instanzstummschaltungen"
|
||||
userSaysSomething: "{name} hat etwas gesagt"
|
||||
makeActive: "Aktivieren"
|
||||
@ -1199,6 +1199,10 @@ addMfmFunction: "MFM hinzufügen"
|
||||
sfx: "Soundeffekte"
|
||||
lastNDays: "Letzten {n} Tage"
|
||||
surrender: "Abbrechen"
|
||||
_delivery:
|
||||
stop: "Gesperrt"
|
||||
_type:
|
||||
none: "Wird veröffentlicht"
|
||||
_announcement:
|
||||
forExistingUsers: "Nur für existierende Nutzer"
|
||||
forExistingUsersDescription: "Ist diese Option aktiviert, wird diese Ankündigung nur Nutzern angezeigt, die zum Zeitpunkt der Ankündigung bereits registriert sind. Ist sie deaktiviert, wird sie auch Nutzern, die sich nach dessen Veröffentlichung registrieren, angezeigt."
|
||||
@ -1905,7 +1909,6 @@ _2fa:
|
||||
registerTOTP: "Authentifizierungs-App registrieren"
|
||||
step1: "Installiere zuerst eine Authentifizierungsapp (z.B. {a} oder {b}) auf deinem Gerät."
|
||||
step2: "Dann, scanne den angezeigten QR-Code mit deinem Gerät."
|
||||
step2Click: "Durch Klicken dieses QR-Codes kannst du Verifikation mit deinem Security-Token oder einer App registrieren."
|
||||
step2Uri: "Nutzt du ein Desktopprogramm, gib folgende URI eingeben"
|
||||
step3Title: "Authentifizierungsscode eingeben"
|
||||
step3: "Gib zum Abschluss den Code (Token) ein, der von deiner App angezeigt wird."
|
||||
@ -2379,4 +2382,3 @@ _reversi:
|
||||
black: "Schwarz"
|
||||
white: "Weiß"
|
||||
total: "Gesamt"
|
||||
|
||||
|
@ -400,4 +400,3 @@ _moderationLogTypes:
|
||||
suspend: "Αποβολή"
|
||||
_reversi:
|
||||
total: "Σύνολο"
|
||||
|
||||
|
@ -185,6 +185,7 @@ enterEmoji: "Enter an emoji"
|
||||
renote: "Renote"
|
||||
unrenote: "Remove renote"
|
||||
renoted: "Renoted."
|
||||
renotedToX: "Renote from {name} users。"
|
||||
quoted: "Quoted."
|
||||
replied: "Replied."
|
||||
cantRenote: "This post can't be renoted."
|
||||
@ -192,6 +193,8 @@ cantReRenote: "A renote can't be renoted."
|
||||
quote: "Quote"
|
||||
inChannelRenote: "Channel-only Renote"
|
||||
inChannelQuote: "Channel-only Quote"
|
||||
renoteToChannel: "Renote to channel"
|
||||
renoteToOtherChannel: "Renote to other channel"
|
||||
pinnedNote: "Pinned note"
|
||||
pinned: "Pin to profile"
|
||||
you: "You"
|
||||
@ -210,7 +213,7 @@ overwriteFromPinnedEmojis: "Override from general settings"
|
||||
reactionSettingDescription2: "Drag to reorder, click to delete, press \"+\" to add."
|
||||
rememberNoteVisibility: "Remember note visibility settings"
|
||||
attachCancel: "Remove attachment"
|
||||
deleteFile: "File deleted"
|
||||
deleteFile: "Delete file"
|
||||
markAsSensitive: "Mark as sensitive"
|
||||
unmarkAsSensitive: "Unmark as sensitive"
|
||||
enterFileName: "Enter filename"
|
||||
@ -481,6 +484,7 @@ name: "Name"
|
||||
antennaSource: "Antenna source"
|
||||
antennaKeywords: "Keywords to listen to"
|
||||
antennaExcludeKeywords: "Keywords to exclude"
|
||||
antennaExcludeBots: "Exclude bot accounts"
|
||||
antennaKeywordsDescription: "Separate with spaces for an AND condition or with line breaks for an OR condition."
|
||||
notifyAntenna: "Notify about new notes"
|
||||
withFileAntenna: "Only notes with files"
|
||||
@ -557,6 +561,7 @@ noteOf: "Note by {user}"
|
||||
inviteToGroup: "Invite to group"
|
||||
quoteAttached: "Quote"
|
||||
quoteQuestion: "Append as quote?"
|
||||
attachAsFileQuestion: "The text in clipboard is long. Would you want to attach it as text file?"
|
||||
noMessagesYet: "No messages yet"
|
||||
newMessageExists: "There are new messages"
|
||||
onlyOneFileCanBeAttached: "You can only attach one file to a message"
|
||||
@ -587,6 +592,7 @@ disableDrawer: "Don't use drawer-style menus"
|
||||
youHaveNoGroups: "You have no groups"
|
||||
joinOrCreateGroup: "Get invited to a group or create your own."
|
||||
showNoteActionsOnlyHover: "Only show note actions on hover"
|
||||
showReactionsCount: "See the number of reactions in notes"
|
||||
noHistory: "No history available"
|
||||
signinHistory: "Login history"
|
||||
enableAdvancedMfm: "Enable advanced MFM"
|
||||
@ -1335,6 +1341,16 @@ enableHorizontalSwipe: "Swipe to switch tabs"
|
||||
loading: "Loading"
|
||||
surrender: "Cancel"
|
||||
gameRetry: "Retry"
|
||||
notUsePleaseLeaveBlank: "Leave blank if not used"
|
||||
useTotp: "Enter the One-Time Password"
|
||||
useBackupCode: "Use the backup codes"
|
||||
launchApp: "Launch the app"
|
||||
useNativeUIForVideoAudioPlayer: "Use UI of browser when play video and audio"
|
||||
keepOriginalFilename: "Keep original file name"
|
||||
keepOriginalFilenameDescription: "If you turn off this setting, files names will be replaced with random string automatically when you upload files."
|
||||
noDescription: "There is not the explanation"
|
||||
alwaysConfirmFollow: "Always confirm when following"
|
||||
inquiry: "Contact"
|
||||
showUnreadNotificationsCount: "Show the number of unread notifications"
|
||||
showCatOnly: "Show only cats"
|
||||
additionalPermissionsForFlash: "Allow to add permission to Play"
|
||||
@ -1357,6 +1373,15 @@ _showingAnimatedImages:
|
||||
inactive: "Stop after a certain amount of time"
|
||||
_messaging:
|
||||
direct: "Direct Message"
|
||||
_delivery:
|
||||
status: "Delivery status"
|
||||
stop: "Suspended"
|
||||
resume: "Delivery resume"
|
||||
_type:
|
||||
none: "Publishing"
|
||||
manuallySuspended: "Manually suspended"
|
||||
goneSuspended: "Server is suspended due to server deletion"
|
||||
autoSuspendedForNotResponding: "Server is suspended due to no responding"
|
||||
_bubbleGame:
|
||||
howToPlay: "How to play"
|
||||
hold: "Hold"
|
||||
@ -1901,6 +1926,11 @@ _role:
|
||||
roleAssignedTo: "Assigned to manual roles"
|
||||
isLocal: "Local user"
|
||||
isRemote: "Remote user"
|
||||
isCat: "Cat Users"
|
||||
isBot: "Bot Users"
|
||||
isSuspended: "Suspended user"
|
||||
isLocked: "Private accounts"
|
||||
isExplorable: "Effective user of \"make an account discoverable\""
|
||||
createdLessThan: "Less than X has passed since account creation"
|
||||
createdMoreThan: "More than X has passed since account creation"
|
||||
followersLessThanOrEq: "Has X or fewer followers"
|
||||
@ -1974,6 +2004,7 @@ _plugin:
|
||||
installWarn: "Please do not install untrustworthy plugins."
|
||||
manage: "Manage plugins"
|
||||
viewSource: "View source"
|
||||
viewLog: "Show log"
|
||||
_preferencesBackups:
|
||||
list: "Created backups"
|
||||
saveNew: "Save new backup"
|
||||
@ -2004,7 +2035,7 @@ _aboutMisskey:
|
||||
allContributors: "All contributors"
|
||||
source: "Source code"
|
||||
original: "Original"
|
||||
thisIsModifiedVersion: "{name} uses a modified version of the original Misskey."
|
||||
thisIsModifiedVersion: "{name} uses a modified version of the original CherryPick."
|
||||
translation: "Translate Misskey"
|
||||
donate: "Donate to Misskey"
|
||||
morePatrons: "We also appreciate the support of many other helpers not listed here. Thank you! 🥰"
|
||||
@ -2253,7 +2284,6 @@ _2fa:
|
||||
registerTOTP: "Register authenticator app"
|
||||
step1: "First, install an authentication app (such as {a} or {b}) on your device."
|
||||
step2: "Then, scan the QR code displayed on this screen."
|
||||
step2Click: "Clicking on this QR code will allow you to register 2FA to your security key or phone authenticator app."
|
||||
step2Uri: "Enter the following URI if you are using a desktop program"
|
||||
step3Title: "Enter an authentication code"
|
||||
step3: "Enter the authentication code (token) provided by your app to finish setup."
|
||||
@ -2277,6 +2307,7 @@ _2fa:
|
||||
backupCodesDescription: "You can use these codes to gain access to your account in case of becoming unable to use your two-factor authentificator app. Each can only be used once. Please keep them in a safe place."
|
||||
backupCodeUsedWarning: "A backup code has been used. Please reconfigure two-factor authentification as soon as possible if you are no longer able to use it."
|
||||
backupCodesExhaustedWarning: "All backup codes have been used. Should you lose access to your two-factor authentification app, you will be unable to access this account. Please reconfigure two-factor authentification."
|
||||
moreDetailedGuideHere: "Here is detailed guide"
|
||||
_permissions:
|
||||
"read:account": "View your account information"
|
||||
"write:account": "Edit your account information"
|
||||
@ -2327,7 +2358,6 @@ _permissions:
|
||||
"read:admin:server-info": "View server info"
|
||||
"read:admin:show-moderation-log": "View moderation log"
|
||||
"read:admin:show-user": "View private user info"
|
||||
"read:admin:show-users": "View private user info"
|
||||
"write:admin:suspend-user": "Suspend user"
|
||||
"write:admin:unset-user-avatar": "Remove user avatar"
|
||||
"write:admin:unset-user-banner": "Remove user banner"
|
||||
@ -2540,6 +2570,7 @@ _play:
|
||||
title: "Title"
|
||||
script: "Script"
|
||||
summary: "Description"
|
||||
visibilityDescription: "Putting it private means it won't be visible on your profile, but anyone that has the URL can still access it."
|
||||
_pages:
|
||||
newPage: "Create a new Page"
|
||||
editPage: "Edit this Page"
|
||||
@ -2584,6 +2615,8 @@ _pages:
|
||||
section: "Section"
|
||||
image: "Images"
|
||||
button: "Button"
|
||||
dynamic: "Dynamic Blocks"
|
||||
dynamicDescription: "This block has been abolished. Please use {play} from now on."
|
||||
note: "Embedded note"
|
||||
_note:
|
||||
id: "Note ID"
|
||||
@ -2615,6 +2648,7 @@ _notification:
|
||||
sendTestNotification: "Send test notification"
|
||||
notificationWillBeDisplayedLikeThis: "Notifications look like this"
|
||||
reactedBySomeUsers: "{n} users reacted"
|
||||
likedBySomeUsers: "{n} users liked your note"
|
||||
renotedBySomeUsers: "Renote from {n} users"
|
||||
followedBySomeUsers: "Followed by {n} users"
|
||||
flushNotification: "Clear notifications"
|
||||
@ -2842,7 +2876,24 @@ _reversi:
|
||||
_offlineScreen:
|
||||
title: "Offline - cannot connect to the server"
|
||||
header: "Unable to connect to the server"
|
||||
|
||||
_urlPreviewSetting:
|
||||
title: "URL preview settings"
|
||||
enable: "Enable URL preview"
|
||||
timeout: "Time out when getting preview (ms)"
|
||||
timeoutDescription: "If it takes longer than this value to get the preview, the preview won’t be generated."
|
||||
maximumContentLength: "Maximum Content-Length (bytes)"
|
||||
maximumContentLengthDescription: "If Content-Length is higher than this value, the preview won't be generated."
|
||||
requireContentLength: "Generate the preview only if you could get Content-Length"
|
||||
requireContentLengthDescription: "If other server doesn't return Content-Length, the preview won't be generated."
|
||||
userAgent: "User-Agent"
|
||||
userAgentDescription: "Sets the User-Agent to be used when retrieving previews. If left blank, the default User-Agent will be used."
|
||||
summaryProxy: "Proxy endpoints that generate previews"
|
||||
summaryProxyDescription: "Not CherryPick itself, but generate previews using Summaly Proxy."
|
||||
summaryProxyDescription2: "The following parameters are linked to the proxy as a query string. If the proxy does not support them, the values are ignored."
|
||||
_mediaControls:
|
||||
pip: "Picture in Picture"
|
||||
playbackRate: "Playback Speed"
|
||||
loop: "Loop playback"
|
||||
_abuse:
|
||||
_resolver:
|
||||
1hour: "one hour"
|
||||
|
@ -235,7 +235,7 @@ done: "Terminado"
|
||||
processing: "Procesando"
|
||||
preview: "Vista previa"
|
||||
default: "Predeterminado"
|
||||
defaultValueIs: "Predeterminado"
|
||||
defaultValueIs: "Por defecto: {value}"
|
||||
noCustomEmojis: "No hay emojis personalizados"
|
||||
noJobs: "No hay trabajos"
|
||||
federating: "Federando"
|
||||
@ -400,6 +400,7 @@ name: "Nombre"
|
||||
antennaSource: "Origen de la antena"
|
||||
antennaKeywords: "Palabras clave para recibir"
|
||||
antennaExcludeKeywords: "Palabras clave para excluir"
|
||||
antennaExcludeBots: "Excluir bots"
|
||||
antennaKeywordsDescription: "Separar con espacios es una declaración AND, separar con una linea nueva es una declaración OR"
|
||||
notifyAntenna: "Notificar nueva nota"
|
||||
withFileAntenna: "Sólo notas con archivos adjuntados"
|
||||
@ -506,6 +507,7 @@ disableDrawer: "No mostrar los menús en cajones"
|
||||
youHaveNoGroups: "Sin grupos"
|
||||
joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su propio grupo."
|
||||
showNoteActionsOnlyHover: "Mostrar acciones de la nota sólo al pasar el cursor"
|
||||
showReactionsCount: "Mostrar el número de reacciones en las notas"
|
||||
noHistory: "No hay datos en el historial"
|
||||
signinHistory: "Historial de ingresos"
|
||||
enableAdvancedMfm: "Habilitar MFM avanzado"
|
||||
@ -1005,6 +1007,7 @@ neverShow: "No mostrar de nuevo"
|
||||
remindMeLater: "Recordar después"
|
||||
didYouLikeMisskey: "¿Te gusta CherryPick?"
|
||||
pleaseDonate: "{host} usa el software gratuito CherryPick. Por favor ¡Considera donar al proyecto principal para que podamos continuar!"
|
||||
correspondingSourceIsAvailable: "El código fuente correspondiente se encuentra disponible en {anchor}"
|
||||
roles: "Roles"
|
||||
role: "Rol"
|
||||
noRole: "Rol no encontrado"
|
||||
@ -1056,6 +1059,7 @@ sensitiveWords: "Palabras sensibles"
|
||||
sensitiveWordsDescription: "La visibilidad de todas las notas que contienen cualquiera de las palabras configuradas serán puestas en \"Inicio\" automáticamente. Puedes enumerás varias separándolas con saltos de línea"
|
||||
sensitiveWordsDescription2: "Si se usan espacios se crearán expresiones AND y las palabras subsecuentes con barras inclinadas se convertirán en expresiones regulares."
|
||||
prohibitedWords: "Palabras explícitas"
|
||||
prohibitedWordsDescription: "Activa un error cuando se intenta publicar una nota que contiene una o varias palabras prohibidas. Se pueden establecer varias palabras, una por línea."
|
||||
prohibitedWordsDescription2: "Si se usan espacios se crearán expresiones AND y las palabras subsecuentes con barras inclinadas se convertirán en expresiones regulares."
|
||||
hiddenTags: "Hashtags ocultos"
|
||||
hiddenTagsDescription: "Selecciona las etiquetas que no se mostrarán en tendencias. Una etiqueta por línea."
|
||||
@ -1172,6 +1176,7 @@ showRenotes: "Mostrar renotas"
|
||||
edited: "Editado"
|
||||
notificationRecieveConfig: "Ajustes de Notificaciones"
|
||||
mutualFollow: "Os seguís mutuamente"
|
||||
followingOrFollower: "Siguiendo o seguidor"
|
||||
fileAttachedOnly: "Solo notas con archivos"
|
||||
showRepliesToOthersInTimeline: "Mostrar respuestas a otros en la línea de tiempo"
|
||||
hideRepliesToOthersInTimeline: "Ocultar respuestas a otros en la línea de tiempo"
|
||||
@ -1181,6 +1186,12 @@ confirmShowRepliesAll: "Esta operación es irreversible. ¿Confirmas que quieres
|
||||
confirmHideRepliesAll: "Esta operación es irreversible. ¿Confirmas que quieres ocultar tus respuestas a otros usuarios que sigues en tu línea de tiempo?"
|
||||
externalServices: "Servicios Externos"
|
||||
sourceCode: "Código fuente"
|
||||
sourceCodeIsNotYetProvided: "El código fuente aún no está disponible. Contacta con el administrador para solucionarlo."
|
||||
repositoryUrl: "URL del repositorio"
|
||||
repositoryUrlDescription: "Si estás usando CherryPick tal cual (sin cambios en el código fuente), entra en https://github.com/kokonect-link/cherrypick"
|
||||
repositoryUrlOrTarballRequired: "Si no has publicado un repositorio aún, deberás publicar un tarball en su lugar. Mira el archivo .config/example.yml para más información."
|
||||
feedback: "Comentarios"
|
||||
feedbackUrl: "URL de comentarios"
|
||||
impressum: "Impressum"
|
||||
impressumUrl: "Impressum URL"
|
||||
impressumDescription: "En algunos países, como Alemania, la inclusión del operador de datos (el Impressum) es requerido legalmente para sitios web comerciales."
|
||||
@ -1216,6 +1227,8 @@ soundWillBePlayed: "Se reproducirán efectos sonoros"
|
||||
showReplay: "Ver reproducción"
|
||||
replay: "Reproducir"
|
||||
replaying: "Reproduciendo"
|
||||
endReplay: "Terminar reproducción"
|
||||
copyReplayData: "Copiar datos de reproducción"
|
||||
ranking: "Clasificación"
|
||||
lastNDays: "Últimos {n} días"
|
||||
backToTitle: "Regresar al inicio"
|
||||
@ -1223,9 +1236,32 @@ hemisphere: "Región"
|
||||
withSensitive: "Mostrar notas que contengan material sensible"
|
||||
userSaysSomethingSensitive: "La publicación de {name} contiene material sensible"
|
||||
enableHorizontalSwipe: "Deslice para cambiar de pestaña"
|
||||
loading: "Cargando"
|
||||
surrender: "detener"
|
||||
gameRetry: "Reintentar"
|
||||
notUsePleaseLeaveBlank: "Dejar en blanco si no se usa"
|
||||
useTotp: "Introduce la contraseña de un solo uso"
|
||||
useBackupCode: "Usar códigos de respaldo"
|
||||
launchApp: "Ejecutar la app"
|
||||
useNativeUIForVideoAudioPlayer: "Usar la interfaz del navegador cuando se reproduce audio y vídeo"
|
||||
keepOriginalFilename: "Mantener el nombre original del archivo"
|
||||
noDescription: "No hay descripción"
|
||||
alwaysConfirmFollow: "Confirmar siempre cuando se sigue a alguien"
|
||||
_delivery:
|
||||
stop: "Suspendido"
|
||||
_type:
|
||||
none: "Publicando"
|
||||
_bubbleGame:
|
||||
howToPlay: "Cómo jugar"
|
||||
hold: "Mantener"
|
||||
_score:
|
||||
score: "Puntos"
|
||||
scoreYen: "Cantidad de dinero ganada"
|
||||
highScore: "Puntuación más alta"
|
||||
maxChain: "Número máximo de cadenas"
|
||||
yen: "{yen} Yenes"
|
||||
estimatedQty: "{qty} Piezas"
|
||||
scoreSweets: "{onigiriQtyWithUnit} Onigiris"
|
||||
_howToPlay:
|
||||
section1: "Ajuste la posición y deje caer el objeto en la caja"
|
||||
section2: "Cuando dos objetos del mismo tipo se tocan, cambian a otro tipo y consigues puntos"
|
||||
@ -1343,7 +1379,7 @@ _serverSettings:
|
||||
_accountMigration:
|
||||
moveFrom: "Trasladar de otra cuenta a ésta"
|
||||
moveFromSub: "Crear un alias para otra cuenta."
|
||||
moveFromLabel: "Cuenta desde la que se realiza el traslado:"
|
||||
moveFromLabel: "Cuenta desde la que se realiza el traslado #{n}"
|
||||
moveFromDescription: "Si quieres transferir seguidores de otra cuenta a esta cuenta y trasladarlos, tendrás que crear un alias aquí. Asegúrate de crearlo antes de realizar el traslado. Introduce la cuenta desde la que estás moviendo los seguidores así: @person@instance.com"
|
||||
moveTo: "Mover esta cuenta a una nueva"
|
||||
moveToLabel: "Cuenta destino:"
|
||||
@ -1605,8 +1641,11 @@ _achievements:
|
||||
description: "Tutorial completado"
|
||||
_bubbleGameExplodingHead:
|
||||
title: "🤯"
|
||||
description: "El objeto más grande en el juego de burbujas"
|
||||
_bubbleGameDoubleExplodingHead:
|
||||
title: "Doble 🤯"
|
||||
description: "Dos de los objetos más grandes en el juego de burbujas al mismo tiempo"
|
||||
flavor: "Puedes llenar el bento un poco de esta forma 🤯 🤯."
|
||||
_role:
|
||||
new: "Crear rol"
|
||||
edit: "Editar rol"
|
||||
@ -1647,6 +1686,7 @@ _role:
|
||||
gtlAvailable: "Explorar la línea de tiempo global"
|
||||
ltlAvailable: "Explorar la línea de tiempo local"
|
||||
canPublicNote: "Permitir la publicación"
|
||||
mentionMax: "Número máximo de menciones en una nota"
|
||||
canInvite: "Puede crear códigos de invitación"
|
||||
inviteLimit: "Límite de invitaciones"
|
||||
inviteLimitCycle: "Enfriamiento del límite de invitaciones"
|
||||
@ -1670,8 +1710,13 @@ _role:
|
||||
canUseTranslator: "Uso de traductor"
|
||||
avatarDecorationLimit: "Número máximo de decoraciones de avatar"
|
||||
_condition:
|
||||
roleAssignedTo: "Asignado a roles manuales"
|
||||
isLocal: "Usuario local"
|
||||
isRemote: "Usuario remoto"
|
||||
isCat: "Usuarios Gato"
|
||||
isBot: "Usuarios Bot"
|
||||
isSuspended: "Usuario suspendido"
|
||||
isLocked: "Cuentas privadas"
|
||||
createdLessThan: "Menos de X han pasado desde la creación de la cuenta"
|
||||
createdMoreThan: "Más de X han pasado desde la creación de la cuenta"
|
||||
followersLessThanOrEq: "Tiene X o menos seguidores"
|
||||
@ -1741,6 +1786,7 @@ _plugin:
|
||||
installWarn: "Por favor no instale plugins que no son de confianza"
|
||||
manage: "Gestionar plugins"
|
||||
viewSource: "Ver la fuente"
|
||||
viewLog: "Ver log"
|
||||
_preferencesBackups:
|
||||
list: "Respaldos creados"
|
||||
saveNew: "Guardar nuevo respaldo"
|
||||
@ -1770,6 +1816,8 @@ _aboutMisskey:
|
||||
contributors: "Principales colaboradores"
|
||||
allContributors: "Todos los colaboradores"
|
||||
source: "Código fuente"
|
||||
original: "Original"
|
||||
thisIsModifiedVersion: "{name} usa una versión modificada de CherryPick."
|
||||
translation: "Traducir Misskey"
|
||||
donate: "Donar a Misskey"
|
||||
morePatrons: "Muchas más personas nos apoyan. Muchas gracias🥰"
|
||||
@ -1996,7 +2044,6 @@ _2fa:
|
||||
registerTOTP: "Registrar aplicación autenticadora"
|
||||
step1: "Primero, instale en su dispositivo la aplicación de autenticación {a} o {b} u otra."
|
||||
step2: "Luego, escanee con la aplicación el código QR mostrado en pantalla."
|
||||
step2Click: "Clicking on this QR code will allow you to register 2FA to your security key or phone authenticator app.\nTocar este código QR te permitirá registrar la autenticación 2FA a tu llave de seguridad o aplicación autenticadora."
|
||||
step2Uri: "Si usas una aplicación de escritorio, introduce en ella la siguiente URL."
|
||||
step3Title: "Ingresa un código de autenticación"
|
||||
step3: "Para terminar, ingrese el token mostrado en la aplicación."
|
||||
@ -2020,6 +2067,7 @@ _2fa:
|
||||
backupCodesDescription: "En caso de que no puedas usar tu aplicación de autenticación, podrás usar los códigos de respaldo que figuran abajo para acceder a tu cuenta. Asegúrate de guardar en lugar seguro los códigos de respaldo. Cada uno de los códigos de respaldo es de un solo uso."
|
||||
backupCodeUsedWarning: "Has usado todos los códigos de respaldo. Si dejas de tener acceso a tu aplicación de autenticación, no podrás volver a iniciar sesión en tu cuenta. Por favor, reconfigura tu aplicación de autenticación lo antes posible."
|
||||
backupCodesExhaustedWarning: "Has usado todos los códigos de respaldo. Si dejas de tener acceso a tu aplicación de autenticación, no podrás volver a iniciar sesión en la cuenta que figura arriba. Por favor, reconfigura tu aplicación de autenticación lo antes posible."
|
||||
moreDetailedGuideHere: "Guía detallada"
|
||||
_permissions:
|
||||
"read:account": "Ver información de la cuenta"
|
||||
"write:account": "Editar información de la cuenta"
|
||||
@ -2061,6 +2109,7 @@ _permissions:
|
||||
"write:admin:delete-account": "Eliminar cuentas de usuario"
|
||||
"write:admin:delete-all-files-of-a-user": "Eliminar todos los archivos de un usuario"
|
||||
"read:admin:index-stats": "Ver datos indexados"
|
||||
"read:admin:table-stats": "Ver estadísticas de las tablas de la base de datos"
|
||||
"read:admin:user-ips": "Ver dirección IP de usuario"
|
||||
"read:admin:meta": "Ver metadatos de la instancia"
|
||||
"write:admin:reset-password": "Restablecer contraseñas de usuario"
|
||||
@ -2069,7 +2118,6 @@ _permissions:
|
||||
"read:admin:server-info": "Ver información del servidor"
|
||||
"read:admin:show-moderation-log": "Ver log de moderación"
|
||||
"read:admin:show-user": "Ver información privada de usuario"
|
||||
"read:admin:show-users": "Ver información privada de usuario"
|
||||
"write:admin:suspend-user": "Suspender cuentas de usuario"
|
||||
"write:admin:unset-user-avatar": "Quitar avatares de usuario"
|
||||
"write:admin:unset-user-banner": "Quitar banner de usuarios"
|
||||
@ -2282,6 +2330,7 @@ _play:
|
||||
title: "Título"
|
||||
script: "Script"
|
||||
summary: "Descripción"
|
||||
visibilityDescription: "Poniéndola como privada significa que no será visible en tu perfil, pero cualquiera que tenga la URL aún podrá acceder a ella."
|
||||
_pages:
|
||||
newPage: "Crear página"
|
||||
editPage: "Editar página"
|
||||
@ -2326,6 +2375,8 @@ _pages:
|
||||
section: "Sección"
|
||||
image: "Imagen"
|
||||
button: "Botón"
|
||||
dynamic: "Bloques Dinámicos"
|
||||
dynamicDescription: "Los bloques dinámicos están obsoletos. A partir de ahora, utiliza {play} por favor."
|
||||
note: "Nota embebida"
|
||||
_note:
|
||||
id: "Id de la nota"
|
||||
@ -2537,4 +2588,11 @@ _reversi:
|
||||
reversi: "Reversi"
|
||||
won: "{name} ha ganado"
|
||||
total: "Total"
|
||||
|
||||
_urlPreviewSetting:
|
||||
timeout: "Timeout de la carga de vista previa de las URLs (ms)"
|
||||
maximumContentLength: "Content-Length Máximo (bytes)"
|
||||
userAgent: "User-Agent"
|
||||
_mediaControls:
|
||||
pip: "Picture in Picture"
|
||||
playbackRate: "Velocidad de reproducción"
|
||||
loop: "Reproducción en bucle"
|
||||
|
@ -129,7 +129,7 @@ overwriteFromPinnedEmojisForReaction: "Remplacer par les émojis épinglés pour
|
||||
overwriteFromPinnedEmojis: "Remplacer par les émojis épinglés globalement"
|
||||
reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser « + » pour ajouter."
|
||||
rememberNoteVisibility: "Se souvenir de la visibilité des notes"
|
||||
attachCancel: "Supprimer le fichier attaché"
|
||||
attachCancel: "Supprimer le fichier joint"
|
||||
deleteFile: "Fichier supprimé"
|
||||
markAsSensitive: "Marquer comme sensible"
|
||||
unmarkAsSensitive: "Supprimer le marquage comme sensible"
|
||||
@ -400,6 +400,7 @@ name: "Nom"
|
||||
antennaSource: "Source de l’antenne"
|
||||
antennaKeywords: "Mots clés à recevoir"
|
||||
antennaExcludeKeywords: "Mots clés à exclure"
|
||||
antennaExcludeBots: "Exclure les comptes robot"
|
||||
antennaKeywordsDescription: "Séparer avec des espaces pour la condition AND. Séparer avec un saut de ligne pour une condition OR."
|
||||
notifyAntenna: "Me notifier pour les nouvelles notes"
|
||||
withFileAntenna: "Notes ayant des fichiers joints uniquement"
|
||||
@ -506,6 +507,7 @@ disableDrawer: "Les menus ne s'affichent pas dans le tiroir"
|
||||
youHaveNoGroups: "Vous n’avez aucun groupe"
|
||||
joinOrCreateGroup: "Vous pouvez être invité·e à rejoindre des groupes existants ou créer votre propre nouveau groupe."
|
||||
showNoteActionsOnlyHover: "Afficher les actions de note uniquement au survol"
|
||||
showReactionsCount: "Afficher le nombre de réactions des notes"
|
||||
noHistory: "Pas d'historique"
|
||||
signinHistory: "Historique de connexion"
|
||||
enableAdvancedMfm: "Activer la MFM avancée"
|
||||
@ -553,6 +555,7 @@ objectStorageUseSSLDesc: "Désactivez cette option si vous n'utilisez pas HTTPS
|
||||
objectStorageUseProxy: "Se connecter via proxy"
|
||||
objectStorageUseProxyDesc: "Désactivez cette option si vous n'utilisez pas de proxy pour la connexion API"
|
||||
objectStorageSetPublicRead: "Régler sur « public » lors de l'envoi"
|
||||
s3ForcePathStyleDesc: "Si s3ForcePathStyle est activé, le nom du compartiment doit être spécifié comme une partie du chemin de l'URL plutôt que le nom d'hôte. Il faudra peut-être l'activer lors de l'utilisation d'une instance de Minio autohébergée, etc."
|
||||
serverLogs: "Journal du serveur"
|
||||
deleteAll: "Supprimer tout"
|
||||
showFixedPostForm: "Afficher le formulaire de publication en haut du fil d'actualité"
|
||||
@ -667,7 +670,7 @@ testEmail: "Tester la distribution de courriel"
|
||||
wordMute: "Filtre de mots"
|
||||
hardWordMute: "Filtre de mots dur"
|
||||
regexpError: "Erreur d’expression régulière"
|
||||
regexpErrorDescription: "Une erreur s'est produite dans l'expression régulière sur la ligne {ligne} de votre mot muet {tab} :"
|
||||
regexpErrorDescription: "Une erreur s'est produite dans l'expression régulière sur la ligne {line} de votre mot muet {tab} :"
|
||||
instanceMute: "Instance en sourdine"
|
||||
userSaysSomething: "{name} a dit quelque chose"
|
||||
makeActive: "Activer"
|
||||
@ -687,6 +690,7 @@ useGlobalSettingDesc: "S'il est activé, les paramètres de notification de votr
|
||||
other: "Autre"
|
||||
regenerateLoginToken: "Régénérer le jeton de connexion"
|
||||
regenerateLoginTokenDescription: "Générer un nouveau jeton d'authentification. Cette opération ne devrait pas être nécessaire ; lors de la génération d'un nouveau jeton, tous les appareils seront déconnectés. "
|
||||
theKeywordWhenSearchingForCustomEmoji: "Ce mot-clé est utilisé lors de la recherche des émojis personnalisés."
|
||||
setMultipleBySeparatingWithSpace: "Vous pouvez en définir plusieurs, en les séparant par des espaces."
|
||||
fileIdOrUrl: "ID du fichier ou URL"
|
||||
behavior: "Comportement"
|
||||
@ -1003,6 +1007,7 @@ neverShow: "Ne plus afficher"
|
||||
remindMeLater: "Peut-être plus tard"
|
||||
didYouLikeMisskey: "Avez-vous aimé CherryPick ?"
|
||||
pleaseDonate: "CherryPick est le logiciel libre utilisé par {host}. Merci de faire un don pour que nous puissions continuer à le développer !"
|
||||
correspondingSourceIsAvailable: "Le code source correspondant est disponible à {anchor}"
|
||||
roles: "Rôles"
|
||||
role: "Rôles"
|
||||
noRole: "Aucun rôle"
|
||||
@ -1017,6 +1022,7 @@ youCannotCreateAnymore: "Vous avez atteint la limite de création."
|
||||
cannotPerformTemporary: "Temporairement indisponible"
|
||||
cannotPerformTemporaryDescription: "Temporairement indisponible puisque le nombre d'opérations dépasse la limite. Veuillez patienter un peu, puis réessayer."
|
||||
invalidParamError: "Paramètres invalides"
|
||||
invalidParamErrorDescription: "Les paramètres de la requête sont invalides. Il s'agit généralement d'un bogue, mais cela peut aussi être causé par un excès de caractères ou quelque chose de similaire."
|
||||
permissionDeniedError: "Opération refusée"
|
||||
permissionDeniedErrorDescription: "Ce compte n'a pas la permission d'effectuer cette opération."
|
||||
preset: "Préréglage"
|
||||
@ -1030,6 +1036,7 @@ thisPostMayBeAnnoyingCancel: "Annuler"
|
||||
thisPostMayBeAnnoyingIgnore: "Publier quand-même"
|
||||
collapseRenotes: "Réduire les renotes déjà vues"
|
||||
internalServerError: "Erreur interne du serveur"
|
||||
internalServerErrorDescription: "Une erreur inattendue s'est produite sur le serveur."
|
||||
copyErrorInfo: "Copier les détails de l’erreur"
|
||||
joinThisServer: "S'inscrire à cette instance"
|
||||
exploreOtherServers: "Trouver une autre instance"
|
||||
@ -1049,8 +1056,10 @@ nonSensitiveOnlyForLocalLikeOnlyForRemote: "Non sensibles seulement (mentions j'
|
||||
rolesAssignedToMe: "Rôles attribués à moi"
|
||||
resetPasswordConfirm: "Souhaitez-vous réinitialiser votre mot de passe ?"
|
||||
sensitiveWords: "Mots sensibles"
|
||||
sensitiveWordsDescription: "Définir la visibilité des notes contenant un mot défini ici au fil principal automatiquement. Vous pouvez définir plusieurs valeurs en les séparant par des sauts de ligne."
|
||||
sensitiveWordsDescription2: "Séparer par une espace pour créer une expression AND ; entourer de barres obliques pour créer une expression régulière."
|
||||
prohibitedWords: "Mots interdits"
|
||||
prohibitedWordsDescription: "Publier une note contenant un mot défini ici produira une erreur. Vous pouvez définir plusieurs valeurs en les séparant par des sauts de ligne."
|
||||
prohibitedWordsDescription2: "Séparer par une espace pour créer une expression AND ; entourer de barres obliques pour créer une expression régulière."
|
||||
hiddenTags: "Hashtags cachés"
|
||||
hiddenTagsDescription: "Les hashtags définis ne s'afficheront pas dans les tendances. Vous pouvez définir plusieurs hashtags en faisant un saut de ligne."
|
||||
@ -1096,9 +1105,11 @@ pleaseConfirmBelowBeforeSignup: "Pour vous inscrire sur cette instance, vous dev
|
||||
pleaseAgreeAllToContinue: "Pour continuer, veuillez accepter tous les champs ci-dessus."
|
||||
continue: "Continuer"
|
||||
preservedUsernames: "Noms d'utilisateur·rice réservés"
|
||||
preservedUsernamesDescription: "Énumérez les noms d'utilisateur à réserver, séparés par des nouvelles lignes. Les noms d'utilisateur spécifiés ici ne seront plus utilisables lors de la création d'un compte, sauf la création manuelle par un administrateur. De plus, les comptes existants ne seront pas affectés."
|
||||
createNoteFromTheFile: "Rédiger une note de ce fichier"
|
||||
archive: "Archive"
|
||||
channelArchiveConfirmTitle: "Voulez-vous vraiment archiver {name} ?"
|
||||
channelArchiveConfirmDescription: "Une fois archivé, le canal n'apparaîtra plus dans la liste des canaux ni dans les résultats de recherche, et la publication des nouvelles notes sera impossible."
|
||||
thisChannelArchived: "Ce canal a été archivé."
|
||||
displayOfNote: "Affichage de la note"
|
||||
initialAccountSetting: "Configuration initiale du profil"
|
||||
@ -1127,6 +1138,8 @@ createWithOptions: "Options"
|
||||
createCount: "Quantité à créer"
|
||||
inviteCodeCreated: "Code d'invitation créé"
|
||||
inviteLimitExceeded: "Vous avez atteint la limite de codes d'invitation que vous pouvez générer."
|
||||
createLimitRemaining: "Codes d'invitation pouvant être créés : {limit} restants"
|
||||
inviteLimitResetCycle: "Vous pouvez créer jusqu'à {limit} codes d'invitation en {time}."
|
||||
expirationDate: "Date d’expiration"
|
||||
noExpirationDate: "Ne pas expirer"
|
||||
inviteCodeUsedAt: "Code d'invitation utilisé à"
|
||||
@ -1146,11 +1159,14 @@ forYou: "Pour vous"
|
||||
currentAnnouncements: "Annonces actuelles"
|
||||
pastAnnouncements: "Annonces passées"
|
||||
youHaveUnreadAnnouncements: "Il y a des annonces non lues."
|
||||
useSecurityKey: "Suivez les instructions de votre navigateur ou de votre appareil pour utiliser une clé de sécurité ou une clé d'accès."
|
||||
replies: "Réponses"
|
||||
renotes: "Renotes"
|
||||
loadReplies: "Inclure les réponses"
|
||||
loadConversation: "Afficher la conversation"
|
||||
pinnedList: "Liste épinglée"
|
||||
keepScreenOn: "Garder l'écran toujours allumé"
|
||||
verifiedLink: "Votre propriété de ce lien a été vérifiée"
|
||||
notifyNotes: "Notifier à propos des nouvelles notes"
|
||||
unnotifyNotes: "Ne pas notifier pour la publication des notes"
|
||||
authentication: "Authentification"
|
||||
@ -1160,6 +1176,7 @@ showRenotes: "Afficher les renotes"
|
||||
edited: "Modifié"
|
||||
notificationRecieveConfig: "Paramètres des notifications"
|
||||
mutualFollow: "Abonnement mutuel"
|
||||
followingOrFollower: "Abonnement ou abonné"
|
||||
fileAttachedOnly: "Avec fichiers joints seulement"
|
||||
showRepliesToOthersInTimeline: "Afficher les réponses aux autres dans le fil"
|
||||
hideRepliesToOthersInTimeline: "Masquer les réponses aux autres dans le fil"
|
||||
@ -1215,10 +1232,16 @@ ranking: "Classement"
|
||||
lastNDays: "Derniers {n} jours"
|
||||
backToTitle: "Retourner au titre"
|
||||
hemisphere: "Votre région"
|
||||
withSensitive: "Afficher les notes contenant des fichiers joints sensibles"
|
||||
userSaysSomethingSensitive: "Note de {name} contenant des fichiers joints sensibles"
|
||||
enableHorizontalSwipe: "Glisser pour changer d'onglet"
|
||||
loading: "Chargement en cours"
|
||||
surrender: "Annuler"
|
||||
gameRetry: "Réessayer"
|
||||
_delivery:
|
||||
stop: "Suspendu·e"
|
||||
_type:
|
||||
none: "Publié"
|
||||
_bubbleGame:
|
||||
howToPlay: "Comment jouer"
|
||||
hold: "Réserver"
|
||||
@ -1226,15 +1249,25 @@ _bubbleGame:
|
||||
score: "Score"
|
||||
scoreYen: "Montant gagné"
|
||||
highScore: "Meilleur score"
|
||||
maxChain: "Nombre maximum de chaînes"
|
||||
yen: "{yen} yens"
|
||||
estimatedQty: "{qty} pièces"
|
||||
_announcement:
|
||||
forExistingUsers: "Pour les utilisateurs existants seulement"
|
||||
needConfirmationToRead: "Exiger la confirmation de la lecture"
|
||||
needConfirmationToReadDescription: "Si activé, afficher un dialogue de confirmation quand l'annonce est marquée comme lue. Aussi, elle sera exclue de « marquer tout comme lu » ."
|
||||
end: "Archiver l'annonce"
|
||||
tooManyActiveAnnouncementDescription: "Un grand nombre d'annonces actives peut baisser l'expérience utilisateur. Considérez d'archiver les annonces obsolètes."
|
||||
readConfirmTitle: "Marquer comme lu ?"
|
||||
readConfirmText: "Cela marquera le contenu de « {title} » 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."
|
||||
dialogAnnouncementUxWarn: "Avoir deux ou plus annonces de style dialogue en même temps pourrait nuire considérablement à l'expérience utilisateur. Veuillez les utiliser avec caution."
|
||||
silence: "Ne pas me notifier"
|
||||
silenceDescription: "Si activée, vous ne recevrez pas de notifications sur les annonces et n'aurez pas besoin de les marquer comme lues."
|
||||
_initialAccountSetting:
|
||||
accountCreated: "Votre compte a été créé avec succès !"
|
||||
letsStartAccountSetup: "Procédons au réglage initial du compte."
|
||||
letsFillYourProfile: "Commençons par configurer votre profil !"
|
||||
profileSetting: "Paramètres du profil"
|
||||
privacySetting: "Paramètres de confidentialité"
|
||||
initialAccountSettingCompleted: "Configuration du profil terminée avec succès !"
|
||||
@ -1302,7 +1335,7 @@ _initialTutorial:
|
||||
doItToContinue: "Marquez le fichier joint comme sensible pour procéder."
|
||||
_done:
|
||||
title: "Le tutoriel est terminé ! 🎉"
|
||||
description: "Les fonctionnalités introduites ici ne sont que quelques-unes. Pour savoir plus sur l'utilisation de CherryPick, veuillez consulter {lien}."
|
||||
description: "Les fonctionnalités introduites ici ne sont que quelques-unes. Pour savoir plus sur l'utilisation de CherryPick, veuillez consulter {link}."
|
||||
_timelineDescription:
|
||||
home: "Sur le fil principal, vous pouvez voir les notes des utilisateurs auxquels vous êtes abonné·e."
|
||||
local: "Sur le fil local, vous pouvez voir les notes de tous les utilisateurs sur cette instance."
|
||||
@ -1412,7 +1445,7 @@ _achievements:
|
||||
_followers1000:
|
||||
title: "Influenceur·euse"
|
||||
description: "Obtenir plus de 1000 abonné·e·s"
|
||||
_iLoveMisskey:
|
||||
_iLoveCherryPick:
|
||||
title: "J’adore CherryPick"
|
||||
description: "Publication « J’❤ #CherryPick »"
|
||||
flavor: "L'équipe de développement de CherryPick apprécie vraiment votre aide !"
|
||||
@ -1465,7 +1498,7 @@ _role:
|
||||
edit: "Modifier le rôle"
|
||||
name: "Nom du rôle"
|
||||
description: "Description du rôle"
|
||||
permission: "Rôle et autorisations"
|
||||
permission: "Autorisations du rôle"
|
||||
assignTarget: "Attribuer"
|
||||
manual: "Manuel"
|
||||
manualRoles: "Rôles manuels"
|
||||
@ -2071,7 +2104,7 @@ _notification:
|
||||
unreadAntennaNote: "Antenne {name}"
|
||||
roleAssigned: "Rôle attribué"
|
||||
emptyPushNotificationMessage: "Les notifications push ont été mises à jour"
|
||||
achievementEarned: "Accomplissement"
|
||||
achievementEarned: "Accomplissement déverrouillé"
|
||||
testNotification: "Tester la notification"
|
||||
reactedBySomeUsers: "{n} utilisateur·rice·s ont réagi"
|
||||
renotedBySomeUsers: "{n} utilisateur·rice·s ont renoté"
|
||||
@ -2089,7 +2122,7 @@ _notification:
|
||||
followRequestAccepted: "Demande d'abonnement acceptée"
|
||||
groupInvited: "Invitation à un groupe"
|
||||
roleAssigned: "Rôle reçu"
|
||||
achievementEarned: "Accomplissement"
|
||||
achievementEarned: "Déverrouillage d'accomplissement"
|
||||
app: "Notifications provenant des apps"
|
||||
_actions:
|
||||
followBack: "Suivre"
|
||||
@ -2227,5 +2260,5 @@ _dataSaver:
|
||||
title: "Mise en évidence du code"
|
||||
description: "Si la notation de mise en évidence du code est utilisée, par exemple dans la MFM, elle ne sera pas chargée tant qu'elle n'aura pas été tapée. La mise en évidence du code nécessite le chargement du fichier de définition de chaque langue à mettre en évidence, mais comme ces fichiers ne sont plus chargés automatiquement, on peut s'attendre à une réduction du trafic de données."
|
||||
_reversi:
|
||||
waitingBoth: "Préparez-vous"
|
||||
total: "Total"
|
||||
|
||||
|
@ -3,4 +3,3 @@ _lang_: "japanski"
|
||||
ok: "OK"
|
||||
gotIt: "Razumijem"
|
||||
cancel: "otkazati"
|
||||
|
||||
|
@ -16,4 +16,3 @@ _2fa:
|
||||
renewTOTPCancel: "Sispann"
|
||||
_widgets:
|
||||
profile: "pwofil"
|
||||
|
||||
|
@ -102,4 +102,3 @@ _deck:
|
||||
_columns:
|
||||
notifications: "Értesítések"
|
||||
tl: "Idővonal"
|
||||
|
||||
|
@ -108,11 +108,14 @@ enterEmoji: "Masukkan emoji"
|
||||
renote: "Renote"
|
||||
unrenote: "Hapus renote"
|
||||
renoted: "Telah direnote"
|
||||
renotedToX: "{name} telah merenote"
|
||||
cantRenote: "Postingan ini tidak dapat direnote"
|
||||
cantReRenote: "Renote tidak dapat direnote"
|
||||
quote: "Kutip"
|
||||
inChannelRenote: "Hanya renote dalam kanal"
|
||||
inChannelQuote: "Hanya kutip dalam kanal"
|
||||
renoteToChannel: "Renote ke kanal"
|
||||
renoteToOtherChannel: "Renote ke kanal lainnya"
|
||||
pinnedNote: "Catatan yang disematkan"
|
||||
pinned: "Sematkan ke profil"
|
||||
you: "Kamu"
|
||||
@ -400,6 +403,7 @@ name: "Nama"
|
||||
antennaSource: "Sumber Antenna"
|
||||
antennaKeywords: "Kata kunci yang diterima"
|
||||
antennaExcludeKeywords: "Kata kunci yang dikecualikan"
|
||||
antennaExcludeBots: "Kecualikan akun bot"
|
||||
antennaKeywordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR."
|
||||
notifyAntenna: "Beritahu untuk catatan baru"
|
||||
withFileAntenna: "Hanya tampilkan catatan dengan berkas yang dilampirkan"
|
||||
@ -476,6 +480,7 @@ noteOf: "Catatan milik {user}"
|
||||
inviteToGroup: "Undang ke grup"
|
||||
quoteAttached: "Dikutip"
|
||||
quoteQuestion: "Apakah kamu ingin menambahkan kutipan?"
|
||||
attachAsFileQuestion: "Teks dalam papan klip terlalu panjang. Apakah kamu ingin melampirkannya sebagai berkas teks?"
|
||||
noMessagesYet: "Tidak ada pesan"
|
||||
newMessageExists: "Kamu mendapatkan pesan baru"
|
||||
onlyOneFileCanBeAttached: "Kamu hanya dapat melampirkan satu berkas ke dalam pesan"
|
||||
@ -503,9 +508,10 @@ aboutX: "Tentang {x}"
|
||||
emojiStyle: "Gaya emoji"
|
||||
native: "Native"
|
||||
disableDrawer: "Jangan gunakan menu bergaya laci"
|
||||
showNoteActionsOnlyHover: "Hanya tampilkan aksi catatan saat ditunjuk"
|
||||
youHaveNoGroups: "Kamu tidak memiliki grup"
|
||||
joinOrCreateGroup: "Bergabunglah dengan grup atau kamu dapat membuat grupmu sendiri."
|
||||
showNoteActionsOnlyHover: "Hanya tampilkan aksi catatan saat ditunjuk"
|
||||
showReactionsCount: "Lihat jumlah reaksi dalam catatan"
|
||||
noHistory: "Tidak ada riwayat"
|
||||
signinHistory: "Riwayat masuk"
|
||||
enableAdvancedMfm: "Nyalakan MFM tingkat lanjut"
|
||||
@ -1005,6 +1011,7 @@ neverShow: "Jangan tampilkan lagi"
|
||||
remindMeLater: "Mungkin nanti"
|
||||
didYouLikeMisskey: "Apakah kamu mulai menyukai CherryPick?"
|
||||
pleaseDonate: "{host} menggunakan perangkat lunak bebas yaitu CherryPick. Kami sangat mengapresiasi sekali donasi dari kamu agar pengembangan CherryPick tetap dapat berlanjut!"
|
||||
correspondingSourceIsAvailable: "Sumber kode terkait tersedia di {anchor}"
|
||||
roles: "Peran"
|
||||
role: "Peran"
|
||||
noRole: "Peran tidak temukan"
|
||||
@ -1056,6 +1063,7 @@ 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."
|
||||
sensitiveWordsDescription2: "Menggunakan spasi akan membuat ekspresi AND dan kata kunci disekitarnya dengan garis miring akan mengubahnya menjadi ekspresi reguler."
|
||||
prohibitedWords: "Kata yang dilarang"
|
||||
prohibitedWordsDescription: "Menyalakan kesalahan ketika mencoba untuk memposting catatan dengan set kata-kata yang termasuk. Beberapa kata dapat diatur dan dipisahkan dengan baris baru."
|
||||
prohibitedWordsDescription2: "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."
|
||||
@ -1172,6 +1180,7 @@ showRenotes: "Tampilkan renote"
|
||||
edited: "Telah disunting"
|
||||
notificationRecieveConfig: "Pengaturan notifikasi"
|
||||
mutualFollow: "Saling mengikuti"
|
||||
followingOrFollower: "Mengikuti atau pengikut"
|
||||
fileAttachedOnly: "Hanya catatan dengan berkas"
|
||||
showRepliesToOthersInTimeline: "Tampilkan balasan ke pengguna lain dalam lini masa"
|
||||
hideRepliesToOthersInTimeline: "Sembunyikan balasan ke orang lain dari lini masa"
|
||||
@ -1181,6 +1190,12 @@ confirmShowRepliesAll: "Operasi ini tidak dapat diubah. Apakah kamu yakin untuk
|
||||
confirmHideRepliesAll: "Operasi ini tidak dapat diubah. Apakah kamu yakin untuk menyembunyikan balasan ke lainnya dari semua orang yang kamu ikuti di lini masa?"
|
||||
externalServices: "Layanan eksternal"
|
||||
sourceCode: "Sumber kode"
|
||||
sourceCodeIsNotYetProvided: "Sumber kode belum tersedia. Hubungi admin untuk memperbaiki masalah ini."
|
||||
repositoryUrl: "URL Repositori"
|
||||
repositoryUrlDescription: "Jika kamu menggunakan CherryPick begitu saja (tanpa ada perubahan dalam kode sumber), masukkan https://github.com/kokonect-link/cherrypick"
|
||||
repositoryUrlOrTarballRequired: "Apabila kamu masih mempublikasikan repositori, kamu setidaknya harus menyediakan berkas tarball. Lihat .config/example.yml untuk informasi lebih lanjut."
|
||||
feedback: "Umpan balik"
|
||||
feedbackUrl: "URL Umpan balik"
|
||||
impressum: "Impressum"
|
||||
impressumUrl: "Tautan Impressum"
|
||||
impressumDescription: "Pada beberapa negara seperti Jerman, inklusi dari informasi kontak operator (sebuah Impressum) diperlukan secara legal untuk situs web komersil."
|
||||
@ -1216,6 +1231,8 @@ soundWillBePlayed: "Suara yang akan dimainkan"
|
||||
showReplay: "Lihat tayangan ulang"
|
||||
replay: "Tayangan ulang"
|
||||
replaying: "Menayangkan Ulang"
|
||||
endReplay: "Keluat dari tayangan ulang"
|
||||
copyReplayData: "Salin data tayangan ulang"
|
||||
ranking: "Peringkat"
|
||||
lastNDays: "{n} hari terakhir"
|
||||
backToTitle: "Ke Judul"
|
||||
@ -1223,11 +1240,43 @@ hemisphere: "Letak kamu tinggal"
|
||||
withSensitive: "Lampirkan catatan dengan berkas sensitif"
|
||||
userSaysSomethingSensitive: "Postingan oleh {name} mengandung konten sensitif"
|
||||
enableHorizontalSwipe: "Geser untuk mengganti tab"
|
||||
loading: "Memuat..."
|
||||
surrender: "Batalkan"
|
||||
gameRetry: "Coba lagi"
|
||||
notUsePleaseLeaveBlank: "Kosongi bila tidak digunakan"
|
||||
useTotp: "Gunakan TOTP"
|
||||
useBackupCode: "Gunakan kode cadangan"
|
||||
launchApp: "Luncurkan Aplikasi"
|
||||
useNativeUIForVideoAudioPlayer: "Gunakan antarmuka peramban ketika memainkan video dan audio"
|
||||
keepOriginalFilename: "Simpan nama berkas asli"
|
||||
keepOriginalFilenameDescription: "Apabila pengaturan ini dimatikan, nama berkas akan diganti dengan string acak secara otomatis ketika kamu mengunggah berkas."
|
||||
noDescription: "Tidak ada deskripsi"
|
||||
alwaysConfirmFollow: "Selalu konfirmasi ketika mengikuti"
|
||||
inquiry: "Hubungi kami"
|
||||
_delivery:
|
||||
status: "Status pengiriman"
|
||||
stop: "Ditangguhkan"
|
||||
resume: "Lanjutkan pengiriman"
|
||||
_type:
|
||||
none: "Sedang menyiarkan langsung"
|
||||
manuallySuspended: "Ditangguhkan manual"
|
||||
goneSuspended: "Sedang ditangguhkan untuk penghapusan peladen"
|
||||
autoSuspendedForNotResponding: "Sedang ditangguhkan karena peladen tidak menjawab"
|
||||
_bubbleGame:
|
||||
howToPlay: "Cara bermain"
|
||||
hold: "Tahan"
|
||||
_score:
|
||||
score: "Skor"
|
||||
scoreYen: "Jumlah uang didapat"
|
||||
highScore: "Skor tertinggi"
|
||||
maxChain: "Jumlah skor berantai"
|
||||
yen: "{yen} Yen"
|
||||
estimatedQty: "{qty} buah"
|
||||
scoreSweets: "{onigiriQtyWithUnit} onigiri"
|
||||
_howToPlay:
|
||||
section1: "Atur posisi dan jatuhkan obyek ke dalam kotak."
|
||||
section2: "Ketika dua obyek menyentuh tipe yang sama satu sama lain, obyek tersebut akan berganti dan kamu mendapatkan poin skor."
|
||||
section3: "Permainan berakhir jika obyek memenuhi kotak. Capai skor tertinggi dengan menggabungkan obyek bersama sambil menghindari obyek tersebut memenuhi kotak permainan!"
|
||||
_announcement:
|
||||
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."
|
||||
@ -1271,26 +1320,59 @@ _initialTutorial:
|
||||
reply: "Klik pada tombol ini untuk membalas ke sebuah pesan. Bisa juga untuk membalas ke sebuah balasan dan melanjutkannya seperti percakapan selayaknya utas."
|
||||
renote: "Kamu dapat membagikan catatan ke lini masa milikmu. Kamu juga dapat mengutipnya dengan komentarmu."
|
||||
reaction: "Kamu dapat menambahkan reaksi ke Catatan. Detil lebih lanjut akan dijelaskan di halaman berikutnya."
|
||||
menu: "Kamu dapat melihat detil catatan, menyalin tautan, dan melakukan aksi lainnya."
|
||||
_reaction:
|
||||
title: "Apa itu Reaksi?"
|
||||
description: "Catatan dapat direaksi dengan berbagai emoji. Reaksi memperbolehkan kamu untuk mengekspresikan nuansa yang tidak dapat disampaikan hanya dengan sebuah \"suka\"."
|
||||
letsTryReacting: "Reaksi dapat ditambahkan dengan mengklik tombol '+' pada catatan. Coba lakukan mereaksi contoh catatan ini!"
|
||||
reactToContinue: "Tambahkan reaksi untuk melanjutkan."
|
||||
reactNotification: "Kamu akan menerima notifikasi real0time ketika seseorang mereaksi catatan kamu."
|
||||
reactDone: "Kamu dapat mengurungkan reaksi dengan menekan tombol '-'."
|
||||
_timeline:
|
||||
title: "Konsep Lini Masa"
|
||||
description1: "CherryPick menyediakan berbagai lini masa sesuai dengan penggunaan (beberapa mungkin tidak tersedia karena bergantung dengan kebijakan peladen)."
|
||||
home: "Kamu dapat melihat catatan dari akun yang kamu ikuti."
|
||||
local: "Kamu dapat melihat catatan dari semua pengguna yang ada pada peladen ini."
|
||||
social: "Catatan dari linimasa Beranda dan Lokal akan ditampilkan."
|
||||
global: "Kamu dapat melihat catatan dari semua peladen yang terhubung."
|
||||
description2: "Kamu dapat mengganti linimasa di bagian atas layar kamu kapan saja."
|
||||
description3: "Sebagai tambahan, terdapat juga linimasa daftar dan linimasa kanal. Untuk detil lebih lanjut, silahkan melihat ke tautan berikut: {link}."
|
||||
_postNote:
|
||||
title: "Pengaturan posting Catatan"
|
||||
description1: "Ketika memposting catatan ke CherryPick, terdapat beberapa opsi yang tersedia. Form posting terlihat seperti ini."
|
||||
_visibility:
|
||||
description: "Kamu dapat membatasi siapa yang dapat melihat catatan kamu."
|
||||
public: "Perlihatkan catatan ke semua pengguna."
|
||||
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."
|
||||
direct: "Hanya perlihatkan ke pengguna spesifik dan penerima akan diberi tahu. Dapat juga digunakan sebagai alternatif dari pesan langsung."
|
||||
doNotSendConfidencialOnDirect1: "Hati-hati ketika mengirim informasi yang sensitif!"
|
||||
doNotSendConfidencialOnDirect2: "Admin dari peladen dapat melihat apa yang kamu tulis. Hati-hati dengan informasi sensitif ketika mengirimkan catatan langsung kepada pengguna pada peladen yang tidak dipercaya."
|
||||
localOnly: "Memposting dengan opsi ini tidak akan memfederasi catatan ke peladen lain. Pengguna pada peladen lain tidak akan dapat melihat catatan ini secara langsung, meskipun dengan pengaturan visibilitas yang sudah diatur di atas."
|
||||
_cw:
|
||||
title: "Peringatan Konten (CW)"
|
||||
description: "Alih-alih isinya, konten yang ditulis dalam kolom 'komentar' akan ditampilkan. Menekan 'Selebihnya' akan menampilkan isi konten."
|
||||
_exampleNote:
|
||||
cw: "Peringatan: Bikin Lapar!"
|
||||
note: "Baru aja makan donat berlapis coklat 🍩😋"
|
||||
useCases: "Fungsi ini digunakan ketika mengikutik panduan peladen untuk catatan yang dibutuhkan atau untuk membatasi diri dari teks sensitif atau spoiler."
|
||||
_howToMakeAttachmentsSensitive:
|
||||
title: "Bagaimana menandai lampiran sebagai sensitif?"
|
||||
description: "Fungsi ini digunakan untuk lampiran yang dibutuhkan oleh panduan peladen atau sesuatu yang seharusnya tidak boleh dibiarkan begitu saja dengan cara menambahkan penanda \"sensitif\"."
|
||||
tryThisFile: "Coba tandai gambar yang dilampirkan pada form ini sebagai sensitif!"
|
||||
_exampleNote:
|
||||
note: "Ups, kesalahan banget buka penutup wadah natto..."
|
||||
method: "Untuk menandai lampiran sebagai sensitif, klik gambar pada berkas, buka menu, lalu klik \"Tandai sebagai sensitif\"."
|
||||
sensitiveSucceeded: "Ketika melampirkan berkas, mohon atur sensitifitas sesuai dengan panduan peladen."
|
||||
doItToContinue: "Tandai berkas terlampir sebagai sensitif untuk melanjutkan."
|
||||
_done:
|
||||
title: "Kamu telah menyelesaikan tutorial! 🎉"
|
||||
description: "Fungsi yang diperkenalkan di sini merupakan sebagian kecil dari fitur yang ada. Untuk pemahaman lebih detil dalam menggunakan CherryPick, kamu dapat merujuk ke {link}."
|
||||
_timelineDescription:
|
||||
home: "Pada linimasa Beranda, kamu dapat melihat catatan dari akun yang kamu ikuti."
|
||||
local: "Pada linimasa Lokal, kamu dapat melihat catatan dari semua pengguna yang ada pada peladen ini."
|
||||
social: "Linimasa sosial menampilkan catatan dari kedua linimasa Beranda dan Lokal."
|
||||
global: "Pada linimasa Global, kamu dapat melihat catatan dari semua peladen yang terhubung."
|
||||
_serverRules:
|
||||
description: "Daftar peraturan akan ditampilkan sebelum pendaftaran. Mengatur ringkasan dari Syarat dan Ketentuan sangat direkomendasikan."
|
||||
_serverSettings:
|
||||
@ -1302,6 +1384,9 @@ _serverSettings:
|
||||
manifestJsonOverride: "Ambil alih manifest.json"
|
||||
shortName: "Nama pendek"
|
||||
shortNameDescription: "Inisial untuk nama instansi yang dapat ditampilkan apabila nama lengkap resmi terlalu panjang."
|
||||
fanoutTimelineDescription: "Dapat meningkatkan performa dalam pengambilan data linimasa dan mengurangi beban pada database ketika dinyalakan. Sebagai gantinya, penggunaan memory pada Redis akan meningkan. Pertimbangkan untuk menonaktifkan fitur ini jika mengalami kekurangan memori pada server atau menyebabkan server tidak stabil."
|
||||
fanoutTimelineDbFallback: "Fallback ke database"
|
||||
fanoutTimelineDbFallbackDescription: "Ketika diaktifkan, lini masa akan fallback ke database untuk melakukan kueri tambahan apabila linimasa tidak disimpan dalam cache. Menonaktifkan ini dapat mengurangi beban server dengan mengeliminasi proses fallback, namun dapat berakibat membatasi jarak data dari lini masa yang dapat diambil."
|
||||
_accountMigration:
|
||||
moveFrom: "Pindahkan akun lain ke akun ini"
|
||||
moveFromSub: "Buat alias ke akun lain"
|
||||
@ -1478,7 +1563,7 @@ _achievements:
|
||||
_viewAchievements3min:
|
||||
title: "Suka Pencapaian"
|
||||
description: "Lugat daftar pencapaianmu setidaknya 3 menit"
|
||||
_iLoveMisskey:
|
||||
_iLoveCherryPick:
|
||||
title: "I Love CherryPick"
|
||||
description: "Catat \"I ❤ #CherryPick\""
|
||||
flavor: "Tim pengembang cherrypick sangat mengapresiasi dukungan kamu!"
|
||||
@ -1562,6 +1647,16 @@ _achievements:
|
||||
_smashTestNotificationButton:
|
||||
title: "Tes overflow"
|
||||
description: "Picu tes notifikasi secara berulang dalam waktu yang sangat pendek"
|
||||
_tutorialCompleted:
|
||||
title: "Ijazah Sekolah Dasar CherryPick"
|
||||
description: "Tutorial selesai"
|
||||
_bubbleGameExplodingHead:
|
||||
title: "🤯"
|
||||
description: "Obyek paling terbesar di permainan gelembung"
|
||||
_bubbleGameDoubleExplodingHead:
|
||||
title: "Ganda 🤯"
|
||||
description: "Dua dari obyek paling terbesar pada permainan gelembung di waktu yang sama"
|
||||
flavor: "Kamu dapat mengisi kotak makan siang seperti ini 🤯 🤯."
|
||||
_role:
|
||||
new: "Buat peran"
|
||||
edit: "Sunting peran"
|
||||
@ -1572,7 +1667,9 @@ _role:
|
||||
assignTarget: "Tipe tugas"
|
||||
descriptionOfAssignTarget: "<b>Manual</b> untuk mengganti secara manual siapa yang mendapatkan peran ini dan siapa yang tidak.\n<b>Kondisional</b> untuk pengguna secara otomatis dimasukkan atau dihapus dari peran berdasarkan kondisi yang ditentukan."
|
||||
manual: "Manual"
|
||||
manualRoles: "Peran manual"
|
||||
conditional: "Kondisional"
|
||||
conditionalRoles: "Peran kondisional"
|
||||
condition: "Kondisi"
|
||||
isConditionalRole: "Ini adalah peran kondisional"
|
||||
isPublic: "Publikkan Peran"
|
||||
@ -1600,6 +1697,7 @@ _role:
|
||||
gtlAvailable: "Dapat melihat lini masa global"
|
||||
ltlAvailable: "Dapat melihat lini masa lokal"
|
||||
canPublicNote: "Dapat mengirim catatan publik"
|
||||
mentionMax: "Jumlah maksimum sebutan dalam sebuah catatan"
|
||||
canInvite: "Dapat membuat kode undangan instansi"
|
||||
inviteLimit: "Batas jumlah undangan"
|
||||
inviteLimitCycle: "Interval Penerbitan Kode Undangan"
|
||||
@ -1621,9 +1719,16 @@ _role:
|
||||
canHideAds: "Dapat menyembunyikan iklan"
|
||||
canSearchNotes: "Penggunaan pencarian catatan"
|
||||
canUseTranslator: "Penggunaan penerjemah"
|
||||
avatarDecorationLimit: "Jumlah maksimum dekorasi avatar yang dapat diterapkan"
|
||||
_condition:
|
||||
roleAssignedTo: "Ditugaskan ke peran manual"
|
||||
isLocal: "Pengguna lokal"
|
||||
isRemote: "Pengguna remote"
|
||||
isCat: "Pengguna Kucing"
|
||||
isBot: "Pengguna Bot"
|
||||
isSuspended: "Pengguna yang ditangguhkan"
|
||||
isLocked: "Akun privat"
|
||||
isExplorable: "Pengguna efektif yang akunnya dapat dicari"
|
||||
createdLessThan: "Telah berlalu kurang dari X sejak pembuatan akun"
|
||||
createdMoreThan: "Telah berlalu lebih dari X sejak pembuatan akun"
|
||||
followersLessThanOrEq: "Memiliki pengikut X atau kurang dari tersebut"
|
||||
@ -1649,6 +1754,7 @@ _emailUnavailable:
|
||||
disposable: "Alamat surel temporer tidak dapat digunakan"
|
||||
mx: "Peladen alamat surel ini tidak valid"
|
||||
smtp: "Peladen alamat surel ini tidak merespon"
|
||||
banned: "Kamu tidak dapat mendaftar dengan alamat surel ini"
|
||||
_ffVisibility:
|
||||
public: "Terbitkan"
|
||||
followers: "Tampil untuk pengikut saja"
|
||||
@ -1692,6 +1798,7 @@ _plugin:
|
||||
installWarn: "Mohon jangan memasang plugin yang tidak dapat dipercayai."
|
||||
manage: "Manajemen plugin"
|
||||
viewSource: "Lihat sumber"
|
||||
viewLog: "Tampilkan log"
|
||||
_preferencesBackups:
|
||||
list: "Cadangan yang dibuat"
|
||||
saveNew: "Simpan cadangan baru"
|
||||
@ -1721,10 +1828,13 @@ _aboutMisskey:
|
||||
contributors: "Kontributor utama"
|
||||
allContributors: "Seluruh kontributor"
|
||||
source: "Sumber kode"
|
||||
original: "Asli"
|
||||
thisIsModifiedVersion: "{name} menggunakan versi modifikasi dari CherryPick yang asli."
|
||||
translation: "Terjemahkan Misskey"
|
||||
donate: "Donasi ke Misskey"
|
||||
morePatrons: "Kami sangat mengapresiasi dukungan dari banyak penolong lain yang tidak tercantum disini. Terima kasih! 🥰"
|
||||
patrons: "Pendukung"
|
||||
projectMembers: "Anggota proyek"
|
||||
_displayOfSensitiveMedia:
|
||||
respect: "Sembunyikan media yang ditandai sensitif"
|
||||
ignore: "Tampilkan media yang ditandai sensitif"
|
||||
@ -1813,6 +1923,7 @@ _channel:
|
||||
notesCount: "terdapat {n} catatan"
|
||||
nameAndDescription: "Nama dan deskripsi"
|
||||
nameOnly: "Hanya nama"
|
||||
allowRenoteToExternal: "Perbolehkan catat ulang dan kutipan di luar dari kanal"
|
||||
_menuDisplay:
|
||||
sideFull: "Horisontal"
|
||||
sideIcon: "Horisontal (Ikon)"
|
||||
@ -1943,7 +2054,6 @@ _2fa:
|
||||
registerTOTP: "Daftarkan aplikasi autentikator"
|
||||
step1: "Pertama, pasang aplikasi autentikasi (seperti {a} atau {b}) di perangkat kamu."
|
||||
step2: "Lalu, pindai kode QR yang ada di layar."
|
||||
step2Click: "Mengeklik kode QR ini akan membolehkanmu untuk mendaftarkan 2FA ke security-key atau aplikasi autentikator ponsel."
|
||||
step2Uri: "Masukkan URI berikut jika kamu menggunakan program desktop"
|
||||
step3Title: "Masukkan kode autentikasi"
|
||||
step3: "Masukkan token yang telah disediakan oleh aplikasimu untuk menyelesaikan pemasangan."
|
||||
@ -1967,6 +2077,7 @@ _2fa:
|
||||
backupCodesDescription: "Kamu dapat menggunakan kode ini untuk mendapatkan akses ke akun kamu apabila berada dalam situasi tidak dapat menggunakan aplikasi autentikasi 2-faktor yang kamu miliki. Setiap kode hanya dapat digunakan satu kali. Mohon simpan kode ini di tempat yang aman."
|
||||
backupCodeUsedWarning: "Kode cadangan telah digunakan. Mohon mengatur ulang autentikasi 2-faktor secepatnya apabila kamu sudah tidak dapat menggunakannya lagi."
|
||||
backupCodesExhaustedWarning: "Semua kode cadangan telah digunakan. Apabila kamu kehilangan akses pada aplikasi autentikasi 2-faktor milikmu, kamu tidak dapat mengakses akun ini lagi. Mohon atur ulang autentikasi 2-faktor kamu."
|
||||
moreDetailedGuideHere: "Berikut panduan detilnya"
|
||||
_permissions:
|
||||
"read:account": "Lihat informasi akun"
|
||||
"write:account": "Sunting informasi akun"
|
||||
@ -2017,7 +2128,6 @@ _permissions:
|
||||
"read:admin:server-info": "Lihat informasi peladen"
|
||||
"read:admin:show-moderation-log": "Lihat log moderasi"
|
||||
"read:admin:show-user": "Lihat informasi pengguna privat"
|
||||
"read:admin:show-users": "Lihat informasi pengguna privat"
|
||||
"write:admin:suspend-user": "Tangguhkan pengguna"
|
||||
"write:admin:unset-user-avatar": "Hapus avatar pengguna"
|
||||
"write:admin:unset-user-banner": "Hapus banner pengguna"
|
||||
@ -2230,6 +2340,7 @@ _play:
|
||||
title: "Judul"
|
||||
script: "Script"
|
||||
summary: "Deskripsi"
|
||||
visibilityDescription: "Membuat catatan ini privat berarti tidak akan terlihat pada profil kamu, namun siapapun yang memiliki URL dari catatan ini akan dapat mengaksesnya."
|
||||
_pages:
|
||||
newPage: "Buat halaman baru"
|
||||
editPage: "Sunting halaman"
|
||||
@ -2274,6 +2385,8 @@ _pages:
|
||||
section: "Bagian"
|
||||
image: "Gambar"
|
||||
button: "Tombol"
|
||||
dynamic: "Blok Dinamis"
|
||||
dynamicDescription: "Blok ini telah dihapus. Mohon gunakan {play} dari sekarang."
|
||||
note: "Catatan yang ditanam"
|
||||
_note:
|
||||
id: "ID Catatan"
|
||||
@ -2304,8 +2417,10 @@ _notification:
|
||||
sendTestNotification: "Kirim tes notifikasi"
|
||||
notificationWillBeDisplayedLikeThis: "Notifikasi akan terlihat seperti ini"
|
||||
reactedBySomeUsers: "{n} orang memberikan reaksi"
|
||||
likedBySomeUsers: "{n} pengguna menyukai catatan kamu"
|
||||
renotedBySomeUsers: "{n} orang telah merenote"
|
||||
followedBySomeUsers: "{n} orang telah mengikuti"
|
||||
flushNotification: "Bersihkan notifikasi"
|
||||
_types:
|
||||
all: "Semua"
|
||||
note: "Catatan baru"
|
||||
@ -2404,6 +2519,7 @@ _moderationLogTypes:
|
||||
resetPassword: "Atur ulang kata sandi"
|
||||
suspendRemoteInstance: "Instansi luar telah ditangguhkan"
|
||||
unsuspendRemoteInstance: "Instansi luar batal ditangguhkan"
|
||||
updateRemoteInstanceNote: "Catatan moderasi telah diperbaharui untuk peladen luar."
|
||||
markSensitiveDriveFile: "Berkas ditandai sensitif"
|
||||
unmarkSensitiveDriveFile: "Berkas batal ditandai sensitif"
|
||||
resolveAbuseReport: "Laporan terselesaikan"
|
||||
@ -2515,4 +2631,35 @@ _reversi:
|
||||
isLlotheo: "Pemain dengan batu yang sedikit menang (Llotheo)"
|
||||
loopedMap: "Peta melingkar"
|
||||
canPutEverywhere: "Keping dapat ditaruh dimana saja"
|
||||
|
||||
timeLimitForEachTurn: "Batas waktu untuk gantian"
|
||||
freeMatch: "Pertandingan bebas"
|
||||
lookingForPlayer: "Mencari lawan..."
|
||||
gameCanceled: "Permainan ini telah dibatalkan."
|
||||
shareToTlTheGameWhenStart: "Bagikan permainan ke lini masa ketika dimulai"
|
||||
iStartedAGame: "Permainan telah dimulai! #MisskeyReversi"
|
||||
opponentHasSettingsChanged: "Lawan telah mengganti pengaturan mereka."
|
||||
allowIrregularRules: "Aturan non-reguler (bebas sepenuhnya)"
|
||||
disallowIrregularRules: "Tanpa aturan non-reguler"
|
||||
showBoardLabels: "Tampilkan penomoran baris dan kolom pada papan"
|
||||
useAvatarAsStone: "Ubah batu menjadi avatar pengguna"
|
||||
_offlineScreen:
|
||||
title: "Luring - tidak dapat terhubung ke peladen"
|
||||
header: "Tidak dapat tersambung ke server"
|
||||
_urlPreviewSetting:
|
||||
title: "Pengaturan pratinjau URL"
|
||||
enable: "Aktifkan pratinjau URL"
|
||||
timeout: "Waktu timeout pratinjau URL (ms)"
|
||||
timeoutDescription: "Apabila ini memakan waktu lama dari nilai yang ditentukan untuk mendapatkan pratinjau, pratinjau tidak akan dibuat."
|
||||
maximumContentLength: "Content-Length Maksimum (bytes)"
|
||||
maximumContentLengthDescription: "Apabila Content-Length lebih besar dari nilai ini, pratinjau tidak akan dibuat."
|
||||
requireContentLength: "Buat pratinjau hanya ketika Content-Length dapat didapatkan"
|
||||
requireContentLengthDescription: "Apabila peladen lain tidak memberika Content-Length, pratinjau tidak akan dibuat."
|
||||
userAgent: "User-Agent"
|
||||
userAgentDescription: "Atur User-Agent yang digunakan untuk mengambil pratinjau. Apabila dibiarkan kosong, User-Agent bawaan akan digunakan."
|
||||
summaryProxy: "Titik akhir proksi yang membuat pratinjau"
|
||||
summaryProxyDescription: "Bukan untuk CherryPick, namun untuk menghasilkan pratinjau menggunakan Summaly Proxy."
|
||||
summaryProxyDescription2: "Parameter berikut tertautkan dengan proksi sebagai string kueri. Apabila proksi tidak mendukung tersebut, nilai di dalamnya diabaikan."
|
||||
_mediaControls:
|
||||
pip: "Gambar dalam Gambar"
|
||||
playbackRate: "Kecepatan Pemutaran"
|
||||
loop: "Ulangi Pemutaran"
|
||||
|
202
locales/index.d.ts
vendored
202
locales/index.d.ts
vendored
@ -762,6 +762,10 @@ export interface Locale extends ILocale {
|
||||
* リノートしました。
|
||||
*/
|
||||
"renoted": string;
|
||||
/**
|
||||
* {name} にリノートしました。
|
||||
*/
|
||||
"renotedToX": ParameterizedString<"name">;
|
||||
/**
|
||||
* ノートを引用しました。
|
||||
*/
|
||||
@ -790,6 +794,14 @@ export interface Locale extends ILocale {
|
||||
* チャンネル内引用
|
||||
*/
|
||||
"inChannelQuote": string;
|
||||
/**
|
||||
* チャンネルにリノート
|
||||
*/
|
||||
"renoteToChannel": string;
|
||||
/**
|
||||
* 他のチャンネルにリノート
|
||||
*/
|
||||
"renoteToOtherChannel": string;
|
||||
/**
|
||||
* ピン留めされたノート
|
||||
*/
|
||||
@ -1231,7 +1243,7 @@ export interface Locale extends ILocale {
|
||||
*/
|
||||
"silencedInstances": string;
|
||||
/**
|
||||
* サイレンスしたいサーバーのホストを改行で区切って設定します。サイレンスされたサーバーに所属するアカウントはすべて「サイレンス」として扱われ、フォローがすべてリクエストになり、フォロワーでないローカルアカウントにはメンションできなくなります。ブロックしたインスタンスには影響しません。
|
||||
* サイレンスしたいサーバーのホストを改行で区切って設定します。サイレンスされたサーバーに所属するアカウントはすべて「サイレンス」として扱われ、フォローがすべてリクエストになります。ブロックしたインスタンスには影響しません。
|
||||
*/
|
||||
"silencedInstancesDescription": string;
|
||||
/**
|
||||
@ -1598,6 +1610,10 @@ export interface Locale extends ILocale {
|
||||
* フォルダーを選択
|
||||
*/
|
||||
"selectFolders": string;
|
||||
/**
|
||||
* ファイルが選択されていません
|
||||
*/
|
||||
"fileNotSelected": string;
|
||||
/**
|
||||
* ファイル名を変更
|
||||
*/
|
||||
@ -2254,6 +2270,10 @@ export interface Locale extends ILocale {
|
||||
* 引用として添付しますか?
|
||||
*/
|
||||
"quoteQuestion": string;
|
||||
/**
|
||||
* クリップボードのテキストが長いです。テキストファイルとして添付しますか?
|
||||
*/
|
||||
"attachAsFileQuestion": string;
|
||||
/**
|
||||
* まだチャットはありません
|
||||
*/
|
||||
@ -3759,6 +3779,10 @@ export interface Locale extends ILocale {
|
||||
* 管理者情報が設定されていません。
|
||||
*/
|
||||
"noMaintainerInformationWarning": string;
|
||||
/**
|
||||
* 問い合わせ先URLが設定されていません。
|
||||
*/
|
||||
"noInquiryUrlWarning": string;
|
||||
/**
|
||||
* Botプロテクションが設定されていません。
|
||||
*/
|
||||
@ -4524,9 +4548,13 @@ export interface Locale extends ILocale {
|
||||
*/
|
||||
"thisPostMayBeAnnoyingIgnore": string;
|
||||
/**
|
||||
* 見たことのあるリノートを省略して表示
|
||||
* リノートのスマート省略
|
||||
*/
|
||||
"collapseRenotes": string;
|
||||
/**
|
||||
* リアクションやリノートをしたことがあるノートをたたんで表示します。
|
||||
*/
|
||||
"collapseRenotesDescription": string;
|
||||
/**
|
||||
* 特定のMFM構文を含むノートを省略して表示
|
||||
*/
|
||||
@ -5403,6 +5431,14 @@ export interface Locale extends ILocale {
|
||||
* 説明文はありません
|
||||
*/
|
||||
"noDescription": string;
|
||||
/**
|
||||
* フォローの際常に確認する
|
||||
*/
|
||||
"alwaysConfirmFollow": string;
|
||||
/**
|
||||
* お問い合わせ
|
||||
*/
|
||||
"inquiry": string;
|
||||
/**
|
||||
* 未読の通知の数を表示する
|
||||
*/
|
||||
@ -5483,6 +5519,38 @@ export interface Locale extends ILocale {
|
||||
*/
|
||||
"direct": string;
|
||||
};
|
||||
"_delivery": {
|
||||
/**
|
||||
* 配信状態
|
||||
*/
|
||||
"status": string;
|
||||
/**
|
||||
* 配信停止
|
||||
*/
|
||||
"stop": string;
|
||||
/**
|
||||
* 配信再開
|
||||
*/
|
||||
"resume": string;
|
||||
"_type": {
|
||||
/**
|
||||
* 配信中
|
||||
*/
|
||||
"none": string;
|
||||
/**
|
||||
* 手動停止中
|
||||
*/
|
||||
"manuallySuspended": string;
|
||||
/**
|
||||
* サーバー削除のため停止中
|
||||
*/
|
||||
"goneSuspended": string;
|
||||
/**
|
||||
* サーバー応答なしのため停止中
|
||||
*/
|
||||
"autoSuspendedForNotResponding": string;
|
||||
};
|
||||
};
|
||||
"_bubbleGame": {
|
||||
/**
|
||||
* 遊び方
|
||||
@ -6253,6 +6321,14 @@ export interface Locale extends ILocale {
|
||||
* 有効にすると、タイムラインがキャッシュされていない場合にDBへ追加で問い合わせを行うフォールバック処理を行います。無効にすると、フォールバック処理を行わないことでさらにサーバーの負荷を軽減することができますが、タイムラインが取得できる範囲に制限が生じます。
|
||||
*/
|
||||
"fanoutTimelineDbFallbackDescription": string;
|
||||
/**
|
||||
* 問い合わせ先URL
|
||||
*/
|
||||
"inquiryUrl": string;
|
||||
/**
|
||||
* サーバー運営者へのお問い合わせフォームのURLや、運営者の連絡先等が記載されたWebページのURLを指定します。
|
||||
*/
|
||||
"inquiryUrlDescription": string;
|
||||
};
|
||||
"_accountMigration": {
|
||||
/**
|
||||
@ -7448,6 +7524,26 @@ export interface Locale extends ILocale {
|
||||
* リモートユーザー
|
||||
*/
|
||||
"isRemote": string;
|
||||
/**
|
||||
* 猫ユーザー
|
||||
*/
|
||||
"isCat": string;
|
||||
/**
|
||||
* botユーザー
|
||||
*/
|
||||
"isBot": string;
|
||||
/**
|
||||
* サスペンド済みユーザー
|
||||
*/
|
||||
"isSuspended": string;
|
||||
/**
|
||||
* 鍵アカウントユーザー
|
||||
*/
|
||||
"isLocked": string;
|
||||
/**
|
||||
* 「アカウントを見つけやすくする」が有効なユーザー
|
||||
*/
|
||||
"isExplorable": string;
|
||||
/**
|
||||
* アカウント作成から~以内
|
||||
*/
|
||||
@ -9089,10 +9185,6 @@ export interface Locale extends ILocale {
|
||||
* ユーザーのプライベートな情報を見る
|
||||
*/
|
||||
"read:admin:show-user": string;
|
||||
/**
|
||||
* ユーザーのプライベートな情報を見る
|
||||
*/
|
||||
"read:admin:show-users": string;
|
||||
/**
|
||||
* ユーザーを凍結する
|
||||
*/
|
||||
@ -10317,6 +10409,10 @@ export interface Locale extends ILocale {
|
||||
* カラムを追加
|
||||
*/
|
||||
"addColumn": string;
|
||||
/**
|
||||
* 新着ノート通知の設定
|
||||
*/
|
||||
"newNoteNotificationSettings": string;
|
||||
/**
|
||||
* カラムの設定
|
||||
*/
|
||||
@ -10459,6 +10555,10 @@ export interface Locale extends ILocale {
|
||||
* Webhookを作成
|
||||
*/
|
||||
"createWebhook": string;
|
||||
/**
|
||||
* Webhookを編集
|
||||
*/
|
||||
"modifyWebhook": string;
|
||||
/**
|
||||
* 名前
|
||||
*/
|
||||
@ -10505,6 +10605,72 @@ export interface Locale extends ILocale {
|
||||
*/
|
||||
"mention": string;
|
||||
};
|
||||
"_systemEvents": {
|
||||
/**
|
||||
* ユーザーから通報があったとき
|
||||
*/
|
||||
"abuseReport": string;
|
||||
/**
|
||||
* ユーザーからの通報を処理したとき
|
||||
*/
|
||||
"abuseReportResolved": string;
|
||||
};
|
||||
/**
|
||||
* Webhookを削除しますか?
|
||||
*/
|
||||
"deleteConfirm": string;
|
||||
};
|
||||
"_abuseReport": {
|
||||
"_notificationRecipient": {
|
||||
/**
|
||||
* 通報の通知先を追加
|
||||
*/
|
||||
"createRecipient": string;
|
||||
/**
|
||||
* 通報の通知先を編集
|
||||
*/
|
||||
"modifyRecipient": string;
|
||||
/**
|
||||
* 通知先の種類
|
||||
*/
|
||||
"recipientType": string;
|
||||
"_recipientType": {
|
||||
/**
|
||||
* メール
|
||||
*/
|
||||
"mail": string;
|
||||
/**
|
||||
* Webhook
|
||||
*/
|
||||
"webhook": string;
|
||||
"_captions": {
|
||||
/**
|
||||
* モデレーター権限を持つユーザーのメールアドレスに通知を送ります(通報を受けた時のみ)
|
||||
*/
|
||||
"mail": string;
|
||||
/**
|
||||
* 指定したSystemWebhookに通知を送ります(通報を受けた時と通報を解決した時にそれぞれ発信)
|
||||
*/
|
||||
"webhook": string;
|
||||
};
|
||||
};
|
||||
/**
|
||||
* キーワード
|
||||
*/
|
||||
"keywords": string;
|
||||
/**
|
||||
* 通知先ユーザー
|
||||
*/
|
||||
"notifiedUser": string;
|
||||
/**
|
||||
* 使用するWebhook
|
||||
*/
|
||||
"notifiedWebhook": string;
|
||||
/**
|
||||
* 通知先を削除しますか?
|
||||
*/
|
||||
"deleteConfirm": string;
|
||||
};
|
||||
};
|
||||
"_moderationLogTypes": {
|
||||
/**
|
||||
@ -10651,6 +10817,30 @@ export interface Locale extends ILocale {
|
||||
* ユーザーのバナーを解除
|
||||
*/
|
||||
"unsetUserBanner": string;
|
||||
/**
|
||||
* SystemWebhookを作成
|
||||
*/
|
||||
"createSystemWebhook": string;
|
||||
/**
|
||||
* SystemWebhookを更新
|
||||
*/
|
||||
"updateSystemWebhook": string;
|
||||
/**
|
||||
* SystemWebhookを削除
|
||||
*/
|
||||
"deleteSystemWebhook": string;
|
||||
/**
|
||||
* 通報の通知先を作成
|
||||
*/
|
||||
"createAbuseReportNotificationRecipient": string;
|
||||
/**
|
||||
* 通報の通知先を更新
|
||||
*/
|
||||
"updateAbuseReportNotificationRecipient": string;
|
||||
/**
|
||||
* 通報の通知先を削除
|
||||
*/
|
||||
"deleteAbuseReportNotificationRecipient": string;
|
||||
};
|
||||
"_fileViewer": {
|
||||
/**
|
||||
|
@ -85,7 +85,7 @@ note: "Nota"
|
||||
notes: "Note"
|
||||
following: "Follow"
|
||||
followers: "Follower"
|
||||
followsYou: "Segue"
|
||||
followsYou: "Follower"
|
||||
createList: "Aggiungi una nuova lista"
|
||||
manageLists: "Gestisci liste"
|
||||
error: "Errore"
|
||||
@ -134,12 +134,12 @@ deleteFile: "File da Drive eliminato"
|
||||
markAsSensitive: "Segna come esplicito"
|
||||
unmarkAsSensitive: "Non segnare come esplicito "
|
||||
enterFileName: "Nome del file"
|
||||
mute: "Silenzia"
|
||||
mute: "Silenziare"
|
||||
unmute: "Riattiva l'audio"
|
||||
renoteMute: "Silenzia le Rinota"
|
||||
renoteMute: "Silenziare le Rinota"
|
||||
renoteUnmute: "Non silenziare le Rinota"
|
||||
block: "Blocca"
|
||||
unblock: "Sblocca"
|
||||
block: "Bloccare"
|
||||
unblock: "Sbloccare"
|
||||
suspend: "Sospensione"
|
||||
unsuspend: "Revoca la sospensione"
|
||||
blockConfirm: "Vuoi davvero bloccare il profilo?"
|
||||
@ -200,8 +200,8 @@ charts: "Grafici"
|
||||
perHour: "orario"
|
||||
perDay: "giornaliero"
|
||||
stopActivityDelivery: "Interrompi la distribuzione di attività"
|
||||
blockThisInstance: "Blocca questa istanza"
|
||||
silenceThisInstance: "Silenzia l'istanza"
|
||||
blockThisInstance: "Bloccare l'istanza"
|
||||
silenceThisInstance: "Silenziare l'istanza"
|
||||
operations: "Operazioni"
|
||||
software: "Software"
|
||||
version: "Versione"
|
||||
@ -223,7 +223,7 @@ blockedInstances: "Istanze bloccate"
|
||||
blockedInstancesDescription: "Elenca le istanze che vuoi bloccare, una per riga. Esse non potranno più interagire con la tua istanza."
|
||||
silencedInstances: "Istanze silenziate"
|
||||
silencedInstancesDescription: "Elenca i nomi host delle istanze che vuoi silenziare. Tutti i profili nelle istanze silenziate vengono trattati come tali. Possono solo inviare richieste di follow e menzionare soltanto i profili locali che seguono. Le istanze bloccate non sono interessate."
|
||||
muteAndBlock: "Silenziati / Bloccati"
|
||||
muteAndBlock: "Silenziare e bloccare"
|
||||
mutedUsers: "Profili silenziati"
|
||||
blockedUsers: "Profili bloccati"
|
||||
noUsers: "Non ci sono profili"
|
||||
@ -400,6 +400,7 @@ name: "Nome"
|
||||
antennaSource: "Fonte dell'antenna"
|
||||
antennaKeywords: "Parole chiavi da ricevere"
|
||||
antennaExcludeKeywords: "Parole chiavi da escludere"
|
||||
antennaExcludeBots: "Escludere i Bot"
|
||||
antennaKeywordsDescription: "Sparando con uno spazio indichi la condizione E (and). Separando con un a capo, indichi la condizione O (or)."
|
||||
notifyAntenna: "Invia notifiche delle nuove note"
|
||||
withFileAntenna: "Solo note con file in allegato"
|
||||
@ -410,7 +411,7 @@ withReplies: "Includere le risposte"
|
||||
connectedTo: "Connessione ai seguenti profili:"
|
||||
notesAndReplies: "Note e risposte"
|
||||
withFiles: "Con allegati"
|
||||
silence: "Silenzia"
|
||||
silence: "Silenziare"
|
||||
silenceConfirm: "Vuoi davvero silenziare questo profilo?"
|
||||
unsilence: "Riattiva"
|
||||
unsilenceConfirm: "Vuoi davvero riattivare questo profilo?"
|
||||
@ -450,7 +451,7 @@ share: "Condividi"
|
||||
notFound: "Non trovato"
|
||||
notFoundDescription: "Nessuna pagina corrisponde all'URL indicata."
|
||||
uploadFolder: "Destinazione caricamento predefinita"
|
||||
markAsReadAllNotifications: "Segna tutte le notifiche come lette"
|
||||
markAsReadAllNotifications: "Segnare tutte le notifiche come lette"
|
||||
markAsReadAllUnreadNotes: "Segna tutte le note come lette"
|
||||
markAsReadAllTalkMessages: "Segna tutte le chat come lette"
|
||||
help: "Guida"
|
||||
@ -506,6 +507,7 @@ disableDrawer: "Non mostrare il menù sul drawer"
|
||||
youHaveNoGroups: "Nessun gruppo"
|
||||
joinOrCreateGroup: "Puoi creare il tuo gruppo o essere invitat@ a gruppi che già esistono."
|
||||
showNoteActionsOnlyHover: "Mostra le azioni delle Note solo al passaggio del mouse"
|
||||
showReactionsCount: "Visualizza il numero di reazioni su una nota"
|
||||
noHistory: "Nessuna cronologia"
|
||||
signinHistory: "Storico degli accessi al profilo"
|
||||
enableAdvancedMfm: "Attiva MFM avanzati"
|
||||
@ -589,7 +591,7 @@ scratchpadDescription: "Lo Scratchpad offre un ambiente per esperimenti di AiScr
|
||||
output: "Uscita"
|
||||
script: "Script"
|
||||
disablePagesScript: "Disabilita AiScript nelle pagine"
|
||||
updateRemoteUser: "Aggiorna le informazioni dal profilo remoto"
|
||||
updateRemoteUser: "Aggiorna dati dal profilo remoto"
|
||||
unsetUserAvatar: "Rimozione foto profilo"
|
||||
unsetUserAvatarConfirm: "Vuoi davvero rimuovere la foto profilo?"
|
||||
unsetUserBanner: "Rimuovi intestazione profilo"
|
||||
@ -599,7 +601,7 @@ deleteAllFilesConfirm: "Vuoi davvero eliminare tutti i file?"
|
||||
removeAllFollowing: "Annulla tutti i follow"
|
||||
removeAllFollowingDescription: "Cancella tutti i follows del server {host}. Per favore, esegui se, ad esempio, l'istanza non esiste più."
|
||||
userSuspended: "L'utente è in sospensione"
|
||||
userSilenced: "Profilo silente."
|
||||
userSilenced: "Profilo silenziato"
|
||||
yourAccountSuspendedTitle: "Questo profilo è sospeso"
|
||||
yourAccountSuspendedDescription: "Questo profilo è stato sospeso a causa di una violazione del regolamento. Per informazioni, contattare l'amministrazione. Si prega di non creare un nuovo account."
|
||||
tokenRevoked: "Il token non è valido"
|
||||
@ -669,7 +671,7 @@ wordMute: "Filtri parole"
|
||||
hardWordMute: "Filtro parole forte"
|
||||
regexpError: "errore regex"
|
||||
regexpErrorDescription: "Si è verificato un errore nell'espressione regolare alla riga {line} della parola muta {tab}:"
|
||||
instanceMute: "Silenzia l'istanza"
|
||||
instanceMute: "Silenziare l'istanza"
|
||||
userSaysSomething: "{name} ha parlato"
|
||||
makeActive: "Attiva"
|
||||
display: "Visualizza"
|
||||
@ -694,14 +696,14 @@ fileIdOrUrl: "ID o URL del file"
|
||||
behavior: "Comportamento"
|
||||
sample: "Esempio"
|
||||
abuseReports: "Segnalazioni"
|
||||
reportAbuse: "Segnala"
|
||||
reportAbuseRenote: "Segnala la Rinota"
|
||||
reportAbuseOf: "Segnala {name}"
|
||||
reportAbuse: "Segnalare"
|
||||
reportAbuseRenote: "Segnalare la Rinota"
|
||||
reportAbuseOf: "Segnalare {name}"
|
||||
fillAbuseReportDescription: "Per favore, spiegaci il motivo della segnalazione. Se riguarda una Nota precisa, indica anche l'indirizzo URL."
|
||||
abuseReported: "La segnalazione è stata inviata. Grazie."
|
||||
reporter: "il corrispondente"
|
||||
reporteeOrigin: "Origine del segnalato"
|
||||
reporterOrigin: "Origine del segnalatore"
|
||||
reporteeOrigin: "Segnalazione a"
|
||||
reporterOrigin: "Segnalazione da"
|
||||
forwardReport: "Inoltro di un report a un'istanza remota."
|
||||
forwardReportIsAnonymous: "L'istanza remota non vedrà le tue informazioni, apparirai come profilo di sistema, anonimo."
|
||||
send: "Inviare"
|
||||
@ -873,7 +875,7 @@ troubleshooting: "Risoluzione problemi"
|
||||
useBlurEffect: "Utilizza effetto sfocatura"
|
||||
learnMore: "Più dettagli"
|
||||
misskeyUpdated: "CherryPick è stato aggiornato!"
|
||||
whatIsNew: "Visualizza le informazioni sull'aggiornamento"
|
||||
whatIsNew: "Informazioni sull'aggiornamento"
|
||||
translate: "Traduci"
|
||||
translatedFrom: "Traduzione da {x}"
|
||||
accountDeletionInProgress: "È in corso l'eliminazione del profilo"
|
||||
@ -899,7 +901,7 @@ manageAccounts: "Gestisci i profili"
|
||||
makeReactionsPublic: "Pubblicare la lista delle reazioni."
|
||||
makeReactionsPublicDescription: "La lista delle reazioni che avete fatto è a disposizione di tutti."
|
||||
classic: "Classico"
|
||||
muteThread: "Silenzia conversazione"
|
||||
muteThread: "Silenziare conversazione"
|
||||
unmuteThread: "Riattiva la conversazione"
|
||||
followingVisibility: "Visibilità dei profili seguiti"
|
||||
followersVisibility: "Visibilità dei profili che ti seguono"
|
||||
@ -983,11 +985,11 @@ shuffle: "Casuale"
|
||||
account: "Account"
|
||||
move: "Sposta"
|
||||
pushNotification: "Notifiche Push"
|
||||
subscribePushNotification: "Attiva le notifiche push"
|
||||
unsubscribePushNotification: "Disattiva le notifiche push"
|
||||
subscribePushNotification: "Attivare le notifiche push"
|
||||
unsubscribePushNotification: "Disattivare le notifiche push"
|
||||
pushNotificationAlreadySubscribed: "Le notifiche push sono già attivate"
|
||||
pushNotificationNotSupported: "Il client o il server non supporta le notifiche push"
|
||||
sendPushNotificationReadMessage: "Elimina le notifiche push dopo la relativa lettura"
|
||||
sendPushNotificationReadMessage: "Eliminare le notifiche push dopo la relativa lettura"
|
||||
sendPushNotificationReadMessageCaption: "Se possibile, verrà mostrata brevemente una notifica con il testo \"{emptyPushNotificationMessage}\". Potrebbe influire negativamente sulla durata della batteria."
|
||||
windowMaximize: "Ingrandisci"
|
||||
windowMinimize: "Contrai finestra"
|
||||
@ -1174,6 +1176,7 @@ showRenotes: "Includi le Rinota"
|
||||
edited: "Modificato"
|
||||
notificationRecieveConfig: "Preferenze di notifica"
|
||||
mutualFollow: "Follow reciproco"
|
||||
followingOrFollower: "Following o Follower"
|
||||
fileAttachedOnly: "Solo con allegati"
|
||||
showRepliesToOthersInTimeline: "Risposte altrui nella TL"
|
||||
hideRepliesToOthersInTimeline: "Nascondi Riposte altrui nella TL"
|
||||
@ -1224,6 +1227,8 @@ soundWillBePlayed: "Con musica ed effetti sonori"
|
||||
showReplay: "Vedi i replay"
|
||||
replay: "Replay"
|
||||
replaying: "Replay in corso"
|
||||
endReplay: "Termina replay"
|
||||
copyReplayData: "Copia replay"
|
||||
ranking: "Classifica"
|
||||
lastNDays: "Ultimi {n} giorni"
|
||||
backToTitle: "Torna al titolo"
|
||||
@ -1231,9 +1236,32 @@ hemisphere: "Geolocalizzazione"
|
||||
withSensitive: "Mostra le Note con allegati espliciti"
|
||||
userSaysSomethingSensitive: "Note da {name} con allegati espliciti"
|
||||
enableHorizontalSwipe: "Trascina per invertire i tab"
|
||||
loading: "Caricamento"
|
||||
surrender: "Annulla"
|
||||
gameRetry: "Riprova"
|
||||
notUsePleaseLeaveBlank: "Lasciare vuoto, se non in uso"
|
||||
useTotp: "Usare il codice OTP"
|
||||
useBackupCode: "Usare il codice usa-e-getta"
|
||||
launchApp: "Esegui l'App"
|
||||
useNativeUIForVideoAudioPlayer: "Riprodurre audio/video usando le funzionalità del browser"
|
||||
keepOriginalFilename: "Mantieni il nome file originale"
|
||||
keepOriginalFilenameDescription: "Disattivandola, i file verranno caricati usando nomi casuali."
|
||||
noDescription: "Manca la descrizione"
|
||||
_delivery:
|
||||
stop: "Sospensione"
|
||||
_type:
|
||||
none: "Pubblicazione"
|
||||
_bubbleGame:
|
||||
howToPlay: "Come giocare"
|
||||
hold: "Tieni"
|
||||
_score:
|
||||
score: "Punteggio"
|
||||
scoreYen: "Capitale"
|
||||
highScore: "Punteggio migliore"
|
||||
maxChain: "Miglior combo"
|
||||
yen: "{yen}¥"
|
||||
estimatedQty: "{qty} punti"
|
||||
scoreSweets: "Onigiri {onigiriQtyWithUnit}"
|
||||
_howToPlay:
|
||||
section1: "Scegli la posizione e rilascia l'oggetto nel contenitore."
|
||||
section2: "Se due oggetti dello stesso tipo si toccano, si trasformano in un oggetto diverso, aumentando il punteggio."
|
||||
@ -1249,7 +1277,7 @@ _announcement:
|
||||
readConfirmText: "Hai già letto \"{title}˝?"
|
||||
shouldNotBeUsedToPresentPermanentInfo: "Ti consigliamo di utilizzare gli annunci per pubblicare informazioni tempestive e limitate nel tempo, anziché informazioni importanti a lungo andare nel tempo, poiché potrebbero risultare difficili da ritrovare e peggiorare la fruibilità del servizio, specialmente alle nuove persone iscritte."
|
||||
dialogAnnouncementUxWarn: "Ti consigliamo di usarli con cautela, poiché è molto probabile che avere più di un annuncio in stile \"finestra di dialogo\" peggiori sensibilmente la fruibilità del servizio, specialmente alle nuove persone iscritte."
|
||||
silence: "Silenzia gli annunci"
|
||||
silence: "Silenziare gli annunci"
|
||||
silenceDescription: "Se attivi questa opzione, non riceverai notifiche sugli annunci, evitando di contrassegnarle come già lette."
|
||||
_initialAccountSetting:
|
||||
accountCreated: "Il tuo profilo è stato creato!"
|
||||
@ -1288,14 +1316,14 @@ _initialTutorial:
|
||||
letsTryReacting: "Puoi aggiungere una Reazione cliccando il bottone \"+\" (più) della relativa Nota. Prova ad aggiungerne una a questa Nota di esempio!"
|
||||
reactToContinue: "Aggiungere la Reazione ti consentirà di procedere col tutorial."
|
||||
reactNotification: "Quando qualcuno reagisce alle tue Note, ricevi una notifica in tempo reale."
|
||||
reactDone: "Puoi annullare la tua Reazione premendo il bottone \"ー\" (meno)"
|
||||
reactDone: "Annulla la tua Reazione premendo il bottone \"ー\" (meno)"
|
||||
_timeline:
|
||||
title: "Come funziona la Timeline"
|
||||
description1: "CherryPick fornisce alcune Timeline (sequenze cronologiche di Note). Una di queste potrebbe essere stata disattivata dagli amministratori."
|
||||
home: "Puoi vedere le Note provenienti dai profili che segui (follow)."
|
||||
local: "Puoi vedere tutte le Note pubblicate dai profili di questa istanza."
|
||||
social: "Puoi vedere sia le Note della Timeline Home che quelle della Timeline Locale, insieme!"
|
||||
global: "Puoi vedere le Note da pubblicate da tutte le altre istanze federate con la nostra."
|
||||
home: "le Note provenienti dai profili che segui (follow)."
|
||||
local: "tutte le Note pubblicate dai profili di questa istanza."
|
||||
social: "sia le Note della Timeline Home che quelle della Timeline Locale, insieme!"
|
||||
global: "le Note da pubblicate da tutte le altre istanze federate con la nostra."
|
||||
description2: "Nella parte superiore dello schermo, puoi scegliere una Timeline o l'altra in qualsiasi momento."
|
||||
description3: "Ci sono anche sequenze temporali di elenchi, sequenze temporali di canali, ecc. Per ulteriori dettagli, consultare il {link}.\nPuoi vedere anche Timeline delle liste di profili (se ne hai create), canali, ecc... Per i dettagli, visita {link}."
|
||||
_postNote:
|
||||
@ -1319,13 +1347,13 @@ _initialTutorial:
|
||||
useCases: "Utilizzalo per chiarire il contenuto della Nota, prima che sia letta. Come richiesto dal regolamento del server o per autoregolamentare spoiler e testi troppo espliciti."
|
||||
_howToMakeAttachmentsSensitive:
|
||||
title: "Come indicare che gli allegati sono espliciti?"
|
||||
description: "Contrassegnare gli allegati come espliciti, va fatto quando è richiesto dal regolamento del server o quando gli allegati non devono essere immediatamente visibili."
|
||||
description: "Si fa quando è richiesto dal regolamento del server o quando non devono essere visibili immediatamente."
|
||||
tryThisFile: "Prova a rendere esplicite le immagini allegate a questo modulo!"
|
||||
_exampleNote:
|
||||
note: "Ho fatto un errore aprendo il coperchio del natto... (fagioli di soia fermentati, particolarmente appiccicosi)"
|
||||
method: "Per indicare che un allegato è esplicito, tocca il file per aprirne il menu e scegliere la voce \"Segna come esplicito\"."
|
||||
sensitiveSucceeded: "Quando alleghi file, assicurati di indicare se è materiale esplicito, in modo appropriato, in base al regolamento del tuo server."
|
||||
doItToContinue: "Impostando l'immagine come esplicita, potrai procedere col tutorial."
|
||||
note: "AAA! Ho rotto il coperchio del natto... (fagioli di soia fermentati)"
|
||||
method: "Tocca il file, si aprirà il menu, scegli la voce \"Segna come esplicito\""
|
||||
sensitiveSucceeded: "Quando alleghi file, assicurati di indicare se è materiale esplicito in modo appropriato, decidi in base al regolamento dell'istanza."
|
||||
doItToContinue: "Imposta l'immagine come esplicita per procedere col tutorial."
|
||||
_done:
|
||||
title: "Il tutorial è finito! 🎉"
|
||||
description: "Queste sono solamente alcune delle funzionalità principali di CherryPick. Per ulteriori informazioni, {link}."
|
||||
@ -1351,7 +1379,7 @@ _serverSettings:
|
||||
_accountMigration:
|
||||
moveFrom: "Migra un altro profilo dentro a questo"
|
||||
moveFromSub: "Crea un alias verso un altro profilo remoto"
|
||||
moveFromLabel: "Profilo da cui migrare:"
|
||||
moveFromLabel: "Profilo da cui migrare #{n}"
|
||||
moveFromDescription: "Se desideri spostare i profili follower da un altro profilo a questo, devi prima creare un alias qui. Assicurati averlo creato PRIMA di eseguire l'attività! Inserisci l'indirizzo del profilo mittente in questo modo: @persona@istanza.it"
|
||||
moveTo: "Migrare questo profilo verso un un altro"
|
||||
moveToLabel: "Profilo verso cui migrare"
|
||||
@ -1658,6 +1686,7 @@ _role:
|
||||
gtlAvailable: "Disponibilità della Timeline Federata"
|
||||
ltlAvailable: "Disponibilità della Timeline Locale"
|
||||
canPublicNote: "Scrivere Note con Visibilità Pubblica"
|
||||
mentionMax: "Numero massimo di menzioni in una nota"
|
||||
canInvite: "Generare codici di invito all'istanza"
|
||||
inviteLimit: "Limite di codici invito"
|
||||
inviteLimitCycle: "Intervallo di emissione del codice di invito"
|
||||
@ -1681,6 +1710,7 @@ _role:
|
||||
canUseTranslator: "Tradurre le Note"
|
||||
avatarDecorationLimit: "Numero massimo di decorazioni foto profilo installabili"
|
||||
_condition:
|
||||
roleAssignedTo: "Assegnato a ruoli manualmente"
|
||||
isLocal: "Profilo locale"
|
||||
isRemote: "Profilo remoto"
|
||||
createdLessThan: "Profilo creato da meno di N"
|
||||
@ -1752,6 +1782,7 @@ _plugin:
|
||||
installWarn: "Si prega di installare soltanto estensioni che provengono da fonti affidabili."
|
||||
manage: "Gestisci estensioni"
|
||||
viewSource: "Visualizza sorgente"
|
||||
viewLog: "Mostra log"
|
||||
_preferencesBackups:
|
||||
list: "Elenco di impostazioni salvate in precedenza"
|
||||
saveNew: "Nuovo salvataggio"
|
||||
@ -1892,7 +1923,7 @@ _instanceMute:
|
||||
instanceMuteDescription: "Disattiva tutte le note, le note di rinvio (condivisione) dell'istanza configurata, comprese le risposte agli utenti dell'istanza."
|
||||
instanceMuteDescription2: "Impostazione separata da una nuova riga"
|
||||
title: "Nasconde le note dell'istanza configurata."
|
||||
heading: "Istanze da silenziare."
|
||||
heading: "Istanze da silenziare"
|
||||
_theme:
|
||||
explore: "Esplora temi"
|
||||
install: "Installa un tema"
|
||||
@ -2009,7 +2040,6 @@ _2fa:
|
||||
registerTOTP: "Registra una App di autenticazione a due fattori (2FA/MFA)"
|
||||
step1: "Innanzitutto, installa sul dispositivo un'App di autenticazione come {a} o {b}."
|
||||
step2: "Quindi, tramite la App installata, scansiona questo codice QR."
|
||||
step2Click: "Cliccando sul codice QR, puoi registrarlo con l'app di autenticazione o il portachiavi installato sul tuo dispositivo."
|
||||
step2Uri: "Inserisci il seguente URL se desideri utilizzare una App per PC"
|
||||
step3Title: "Inserisci il codice di verifica"
|
||||
step3: "Inserite il token visualizzato nell'app e il gioco è fatto."
|
||||
@ -2033,6 +2063,7 @@ _2fa:
|
||||
backupCodesDescription: "Puoi usare questi codici usa-e-getta per ottenere l'accesso al tuo profilo in caso sia impossibile usare l'App col codice OTP. Salvali in un posto sicuro."
|
||||
backupCodeUsedWarning: "È stato usato un codice usa-e-getta. Per favore, riconfigura l'autenticazione a due fattori il prima possibile, nel caso la configurazione precedente abbia smesso di funzionare."
|
||||
backupCodesExhaustedWarning: "Hai esaurito i codici usa-e-getta. Se l'App che genera il codice OTP non è più disponibile, non potrai più accedere al tuo profilo. Ripeti la configurazione per l'autenticazione a due fattori."
|
||||
moreDetailedGuideHere: "Informazioni dettagliate sull'autenticazione multi fattore (2FA/MFA)"
|
||||
_permissions:
|
||||
"read:account": "Visualizza le informazioni sul profilo"
|
||||
"write:account": "Modifica le informazioni sul profilo"
|
||||
@ -2049,8 +2080,8 @@ _permissions:
|
||||
"read:mutes": "Vedi i profili silenziati"
|
||||
"write:mutes": "Gestisci i profili silenziati"
|
||||
"write:notes": "Creare / Eliminare note"
|
||||
"read:notifications": "Visualizza notifiche"
|
||||
"write:notifications": "Gerisci notifiche"
|
||||
"read:notifications": "Visualizzare notifiche"
|
||||
"write:notifications": "Gestire notifiche"
|
||||
"read:reactions": "Vedi reazioni"
|
||||
"write:reactions": "Gerisci reazioni"
|
||||
"write:votes": "Votare"
|
||||
@ -2083,7 +2114,6 @@ _permissions:
|
||||
"read:admin:server-info": "Vedere le informazioni sul server"
|
||||
"read:admin:show-moderation-log": "Vedere lo storico di moderazione"
|
||||
"read:admin:show-user": "Vedere le informazioni private degli account utente"
|
||||
"read:admin:show-users": "Vedere le informazioni private degli account utente"
|
||||
"write:admin:suspend-user": "Sospendere i profili"
|
||||
"write:admin:unset-user-avatar": "Rimuovere la foto profilo dai profili"
|
||||
"write:admin:unset-user-banner": "Rimuovere l'immagine testata dai profili"
|
||||
@ -2296,6 +2326,7 @@ _play:
|
||||
title: "Titolo"
|
||||
script: "Script"
|
||||
summary: "Descrizione"
|
||||
visibilityDescription: "Impostarlo su privato significa che non verrà visualizzato sul tuo profilo, ma chiunque ha l'URL potrà comunque accedervi."
|
||||
_pages:
|
||||
newPage: "Crea pagina"
|
||||
editPage: "Modifica pagina"
|
||||
@ -2340,6 +2371,8 @@ _pages:
|
||||
section: "Sezione"
|
||||
image: "Immagini"
|
||||
button: "Pulsante"
|
||||
dynamic: "Riquadri dinamici"
|
||||
dynamicDescription: "Questo riquadro è obsoleto. Utilizza {play} da ora in poi."
|
||||
note: "Nota integrata"
|
||||
_note:
|
||||
id: "ID nota"
|
||||
@ -2365,13 +2398,15 @@ _notification:
|
||||
roleAssigned: "Ruolo assegnato"
|
||||
emptyPushNotificationMessage: "Le notifiche push sono state aggiornate."
|
||||
achievementEarned: "Obiettivo raggiunto"
|
||||
testNotification: "Prova la notifica"
|
||||
checkNotificationBehavior: "Prova il comportamento della notifica"
|
||||
testNotification: "Provare la notifica"
|
||||
checkNotificationBehavior: "Provare il comportamento della notifica"
|
||||
sendTestNotification: "Spedisci una notifica di prova"
|
||||
notificationWillBeDisplayedLikeThis: "La notifica apparirà così"
|
||||
reactedBySomeUsers: "{n} reazioni"
|
||||
likedBySomeUsers: "{n} apprezzamenti"
|
||||
renotedBySomeUsers: "{n} Rinota"
|
||||
followedBySomeUsers: "{n} nuovi follower"
|
||||
followedBySomeUsers: "{n} follower"
|
||||
flushNotification: "Azzera le notifiche"
|
||||
_types:
|
||||
all: "Tutto"
|
||||
note: "Nuove Note"
|
||||
@ -2424,8 +2459,8 @@ _deck:
|
||||
direct: "Note Dirette"
|
||||
roleTimeline: "Timeline Ruolo"
|
||||
_dialog:
|
||||
charactersExceeded: "Hai superato il limite di {max} caratteri! ({corrente})"
|
||||
charactersBelow: "Sei al di sotto del minimo di {min} caratteri! ({corrente})"
|
||||
charactersExceeded: "Hai superato il limite di {max} caratteri! ({current})"
|
||||
charactersBelow: "Sei al di sotto del minimo di {min} caratteri! ({current})"
|
||||
_disabledTimeline:
|
||||
title: "Timeline disabilitata"
|
||||
description: "Il ruolo in cui sei non ti permette di leggere questa timeline"
|
||||
@ -2470,6 +2505,7 @@ _moderationLogTypes:
|
||||
resetPassword: "Password azzerata"
|
||||
suspendRemoteInstance: "Istanza remota sospesa"
|
||||
unsuspendRemoteInstance: "Istanza remota riattivata"
|
||||
updateRemoteInstanceNote: "Aggiornamento del promemoria di moderazione per il server remoto"
|
||||
markSensitiveDriveFile: "File nel Drive segnato come esplicito"
|
||||
unmarkSensitiveDriveFile: "File nel Drive segnato come non esplicito"
|
||||
resolveAbuseReport: "Segnalazione risolta"
|
||||
@ -2590,7 +2626,24 @@ _reversi:
|
||||
opponentHasSettingsChanged: "L'avversario ha cambiato configurazione"
|
||||
allowIrregularRules: "Regole inconsuete (completamente libere)"
|
||||
disallowIrregularRules: "Impedire le regole inconsuete"
|
||||
showBoardLabels: "Mostra le coordinate del gioco"
|
||||
useAvatarAsStone: "Immagini profilo come pedine"
|
||||
_offlineScreen:
|
||||
title: "Scollegato. Impossibile connettersi al server"
|
||||
header: "Impossibile connettersi al server"
|
||||
|
||||
_urlPreviewSetting:
|
||||
title: "Impostazioni per l'anteprima delle URL"
|
||||
enable: "Attiva l'anteprima delle URL"
|
||||
timeout: "Timeout dell'anteprima in millisecondi"
|
||||
timeoutDescription: "Impegna al massimo il tempo indicato, altrimenti ignora l'anteprima"
|
||||
maximumContentLength: "Grandezza del contenuto (Content-Length in byte)"
|
||||
maximumContentLengthDescription: "Se la grandezza supera il valore, l'anteprima verrà ignorata."
|
||||
requireContentLength: "Genenerare l'anteprima solo quando è definito Content-Length"
|
||||
requireContentLengthDescription: "In assenza di questo parametro dal server remoto, l'anteprima verrà ignorata."
|
||||
userAgent: "User-Agent"
|
||||
userAgentDescription: "Definire con quale User-Agent si intende identificarsi durante l'acquisizione di un'anteprima. Se è vuoto, useremo il valore predefinito."
|
||||
summaryProxy: "Endpoint proxy che genera l'anteprima"
|
||||
_mediaControls:
|
||||
pip: "Sovraimpressione"
|
||||
playbackRate: "Velocità di riproduzione"
|
||||
loop: "Ripetizione infinita"
|
||||
|
@ -185,6 +185,7 @@ enterEmoji: "絵文字を入力"
|
||||
renote: "リノート"
|
||||
unrenote: "リノート解除"
|
||||
renoted: "リノートしました。"
|
||||
renotedToX: "{name} にリノートしました。"
|
||||
quoted: "ノートを引用しました。"
|
||||
replied: "返信を投稿しました。"
|
||||
cantRenote: "この投稿はリノートできません。"
|
||||
@ -192,6 +193,8 @@ cantReRenote: "リノートをリノートすることはできません。"
|
||||
quote: "引用"
|
||||
inChannelRenote: "チャンネル内リノート"
|
||||
inChannelQuote: "チャンネル内引用"
|
||||
renoteToChannel: "チャンネルにリノート"
|
||||
renoteToOtherChannel: "他のチャンネルにリノート"
|
||||
pinnedNote: "ピン留めされたノート"
|
||||
pinned: "ピン留め"
|
||||
you: "あなた"
|
||||
@ -302,7 +305,7 @@ clearCachedFilesConfirm: "キャッシュされたリモートファイルをす
|
||||
blockedInstances: "ブロックしたサーバー"
|
||||
blockedInstancesDescription: "ブロックしたいサーバーのホストを改行で区切って設定します。ブロックされたサーバーは、このインスタンスとやり取りできなくなります。"
|
||||
silencedInstances: "サイレンスしたサーバー"
|
||||
silencedInstancesDescription: "サイレンスしたいサーバーのホストを改行で区切って設定します。サイレンスされたサーバーに所属するアカウントはすべて「サイレンス」として扱われ、フォローがすべてリクエストになり、フォロワーでないローカルアカウントにはメンションできなくなります。ブロックしたインスタンスには影響しません。"
|
||||
silencedInstancesDescription: "サイレンスしたいサーバーのホストを改行で区切って設定します。サイレンスされたサーバーに所属するアカウントはすべて「サイレンス」として扱われ、フォローがすべてリクエストになります。ブロックしたインスタンスには影響しません。"
|
||||
muteAndBlock: "ミュートとブロック"
|
||||
mutedUsers: "ミュートしたユーザー"
|
||||
blockedUsers: "ブロックしたユーザー"
|
||||
@ -394,6 +397,7 @@ selectFile: "ファイルを選択"
|
||||
selectFiles: "ファイルを選択"
|
||||
selectFolder: "フォルダーを選択"
|
||||
selectFolders: "フォルダーを選択"
|
||||
fileNotSelected: "ファイルが選択されていません"
|
||||
renameFile: "ファイル名を変更"
|
||||
folderName: "フォルダー名"
|
||||
createFolder: "フォルダーを作成"
|
||||
@ -558,6 +562,7 @@ noteOf: "{user}のノート"
|
||||
inviteToGroup: "グループに招待"
|
||||
quoteAttached: "引用付き"
|
||||
quoteQuestion: "引用として添付しますか?"
|
||||
attachAsFileQuestion: "クリップボードのテキストが長いです。テキストファイルとして添付しますか?"
|
||||
noMessagesYet: "まだチャットはありません"
|
||||
newMessageExists: "新しいメッセージがあります"
|
||||
onlyOneFileCanBeAttached: "メッセージに添付できるファイルはひとつです"
|
||||
@ -934,6 +939,7 @@ administration: "管理"
|
||||
accounts: "アカウント"
|
||||
switch: "切り替え"
|
||||
noMaintainerInformationWarning: "管理者情報が設定されていません。"
|
||||
noInquiryUrlWarning: "問い合わせ先URLが設定されていません。"
|
||||
noBotProtectionWarning: "Botプロテクションが設定されていません。"
|
||||
configure: "設定する"
|
||||
postToGallery: "ギャラリーへ投稿"
|
||||
@ -1125,7 +1131,8 @@ thisPostMayBeAnnoying: "この投稿は迷惑になる可能性があります
|
||||
thisPostMayBeAnnoyingHome: "ホームに投稿"
|
||||
thisPostMayBeAnnoyingCancel: "やめる"
|
||||
thisPostMayBeAnnoyingIgnore: "このまま投稿"
|
||||
collapseRenotes: "見たことのあるリノートを省略して表示"
|
||||
collapseRenotes: "リノートのスマート省略"
|
||||
collapseRenotesDescription: "リアクションやリノートをしたことがあるノートをたたんで表示します。"
|
||||
collapseDefault: "特定のMFM構文を含むノートを省略して表示"
|
||||
internalServerError: "サーバー内部エラー"
|
||||
internalServerErrorDescription: "サーバー内部で予期しないエラーが発生しました。"
|
||||
@ -1345,6 +1352,8 @@ useNativeUIForVideoAudioPlayer: "動画・音声の再生にブラウザのUIを
|
||||
keepOriginalFilename: "オリジナルのファイル名を保持"
|
||||
keepOriginalFilenameDescription: "この設定をオフにすると、アップロード時にファイル名が自動でランダム文字列に置き換えられます。"
|
||||
noDescription: "説明文はありません"
|
||||
alwaysConfirmFollow: "フォローの際常に確認する"
|
||||
inquiry: "お問い合わせ"
|
||||
showUnreadNotificationsCount: "未読の通知の数を表示する"
|
||||
showCatOnly: "キャット付きのみ"
|
||||
additionalPermissionsForFlash: "Playへの追加許可"
|
||||
@ -1372,6 +1381,16 @@ _showingAnimatedImages:
|
||||
_messaging:
|
||||
direct: "ダイレクトメッセージ"
|
||||
|
||||
_delivery:
|
||||
status: "配信状態"
|
||||
stop: "配信停止"
|
||||
resume: "配信再開"
|
||||
_type:
|
||||
none: "配信中"
|
||||
manuallySuspended: "手動停止中"
|
||||
goneSuspended: "サーバー削除のため停止中"
|
||||
autoSuspendedForNotResponding: "サーバー応答なしのため停止中"
|
||||
|
||||
_bubbleGame:
|
||||
howToPlay: "遊び方"
|
||||
hold: "ホールド"
|
||||
@ -1589,6 +1608,8 @@ _serverSettings:
|
||||
fanoutTimelineDescription: "有効にすると、各種タイムラインを取得する際のパフォーマンスが大幅に向上し、データベースへの負荷を軽減することが可能です。ただし、Redisのメモリ使用量は増加します。サーバーのメモリ容量が少ない場合、または動作が不安定な場合は無効にすることができます。"
|
||||
fanoutTimelineDbFallback: "データベースへのフォールバック"
|
||||
fanoutTimelineDbFallbackDescription: "有効にすると、タイムラインがキャッシュされていない場合にDBへ追加で問い合わせを行うフォールバック処理を行います。無効にすると、フォールバック処理を行わないことでさらにサーバーの負荷を軽減することができますが、タイムラインが取得できる範囲に制限が生じます。"
|
||||
inquiryUrl: "問い合わせ先URL"
|
||||
inquiryUrlDescription: "サーバー運営者へのお問い合わせフォームのURLや、運営者の連絡先等が記載されたWebページのURLを指定します。"
|
||||
|
||||
_accountMigration:
|
||||
moveFrom: "別のアカウントからこのアカウントに移行"
|
||||
@ -1930,6 +1951,11 @@ _role:
|
||||
roleAssignedTo: "マニュアルロールにアサイン済み"
|
||||
isLocal: "ローカルユーザー"
|
||||
isRemote: "リモートユーザー"
|
||||
isCat: "猫ユーザー"
|
||||
isBot: "botユーザー"
|
||||
isSuspended: "サスペンド済みユーザー"
|
||||
isLocked: "鍵アカウントユーザー"
|
||||
isExplorable: "「アカウントを見つけやすくする」が有効なユーザー"
|
||||
createdLessThan: "アカウント作成から~以内"
|
||||
createdMoreThan: "アカウント作成から~経過"
|
||||
followersLessThanOrEq: "フォロワー数が~以下"
|
||||
@ -2388,7 +2414,6 @@ _permissions:
|
||||
"read:admin:server-info": "サーバーの情報を見る"
|
||||
"read:admin:show-moderation-log": "モデレーションログを見る"
|
||||
"read:admin:show-user": "ユーザーのプライベートな情報を見る"
|
||||
"read:admin:show-users": "ユーザーのプライベートな情報を見る"
|
||||
"write:admin:suspend-user": "ユーザーを凍結する"
|
||||
"write:admin:unset-user-avatar": "ユーザーのアバターを削除する"
|
||||
"write:admin:unset-user-banner": "ユーザーのバーナーを削除する"
|
||||
@ -2728,6 +2753,7 @@ _deck:
|
||||
alwaysShowMainColumn: "常にメインカラムを表示"
|
||||
columnAlign: "カラムの寄せ"
|
||||
addColumn: "カラムを追加"
|
||||
newNoteNotificationSettings: "新着ノート通知の設定"
|
||||
configureColumn: "カラムの設定"
|
||||
swapLeft: "左に移動"
|
||||
swapRight: "右に移動"
|
||||
@ -2771,6 +2797,7 @@ _drivecleaner:
|
||||
|
||||
_webhookSettings:
|
||||
createWebhook: "Webhookを作成"
|
||||
modifyWebhook: "Webhookを編集"
|
||||
name: "名前"
|
||||
secret: "シークレット"
|
||||
events: "Webhookを実行するタイミング"
|
||||
@ -2783,6 +2810,26 @@ _webhookSettings:
|
||||
renote: "Renoteされたとき"
|
||||
reaction: "リアクションがあったとき"
|
||||
mention: "メンションされたとき"
|
||||
_systemEvents:
|
||||
abuseReport: "ユーザーから通報があったとき"
|
||||
abuseReportResolved: "ユーザーからの通報を処理したとき"
|
||||
deleteConfirm: "Webhookを削除しますか?"
|
||||
|
||||
_abuseReport:
|
||||
_notificationRecipient:
|
||||
createRecipient: "通報の通知先を追加"
|
||||
modifyRecipient: "通報の通知先を編集"
|
||||
recipientType: "通知先の種類"
|
||||
_recipientType:
|
||||
mail: "メール"
|
||||
webhook: "Webhook"
|
||||
_captions:
|
||||
mail: "モデレーター権限を持つユーザーのメールアドレスに通知を送ります(通報を受けた時のみ)"
|
||||
webhook: "指定したSystemWebhookに通知を送ります(通報を受けた時と通報を解決した時にそれぞれ発信)"
|
||||
keywords: "キーワード"
|
||||
notifiedUser: "通知先ユーザー"
|
||||
notifiedWebhook: "使用するWebhook"
|
||||
deleteConfirm: "通知先を削除しますか?"
|
||||
|
||||
_moderationLogTypes:
|
||||
createRole: "ロールを作成"
|
||||
@ -2821,6 +2868,12 @@ _moderationLogTypes:
|
||||
deleteAvatarDecoration: "アイコンデコレーションを削除"
|
||||
unsetUserAvatar: "ユーザーのアイコンを解除"
|
||||
unsetUserBanner: "ユーザーのバナーを解除"
|
||||
createSystemWebhook: "SystemWebhookを作成"
|
||||
updateSystemWebhook: "SystemWebhookを更新"
|
||||
deleteSystemWebhook: "SystemWebhookを削除"
|
||||
createAbuseReportNotificationRecipient: "通報の通知先を作成"
|
||||
updateAbuseReportNotificationRecipient: "通報の通知先を更新"
|
||||
deleteAbuseReportNotificationRecipient: "通報の通知先を削除"
|
||||
|
||||
_fileViewer:
|
||||
title: "ファイルの詳細"
|
||||
|
@ -400,6 +400,7 @@ name: "名前"
|
||||
antennaSource: "受信ソース(このソースは食われへん)"
|
||||
antennaKeywords: "受信キーワード"
|
||||
antennaExcludeKeywords: "除外キーワード"
|
||||
antennaExcludeBots: "Botアカウントを除外"
|
||||
antennaKeywordsDescription: "スペースで区切ったるとAND指定で、改行で区切ったるとOR指定や"
|
||||
notifyAntenna: "新しいノートを通知すんで"
|
||||
withFileAntenna: "なんか添付されたノートだけ"
|
||||
@ -506,6 +507,7 @@ disableDrawer: "メニューをドロワーで表示せえへん"
|
||||
youHaveNoGroups: "グループがあらへんねぇ。"
|
||||
joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループ作ってからやってな"
|
||||
showNoteActionsOnlyHover: "ノートの操作部をホバー時のみ表示するで"
|
||||
showReactionsCount: "ノートのリアクション数を表示する"
|
||||
noHistory: "履歴はないわ。"
|
||||
signinHistory: "ログイン履歴"
|
||||
enableAdvancedMfm: "ややこしいMFMもありにする"
|
||||
@ -1056,6 +1058,8 @@ resetPasswordConfirm: "パスワード作り直すんでええな?"
|
||||
sensitiveWords: "けったいな単語"
|
||||
sensitiveWordsDescription: "設定した単語が入っとるノートの公開範囲をホームにしたるわ。改行で区切ったら複数設定できるで。"
|
||||
sensitiveWordsDescription2: "スペースで区切るとAND指定、キーワードをスラッシュで囲んだら正規表現や。"
|
||||
prohibitedWords: "禁止ワード"
|
||||
prohibitedWordsDescription: "設定した言葉が含まれるノートを投稿しようとしたら、エラーが出るようにするで。改行で区切って複数設定できるで。"
|
||||
prohibitedWordsDescription2: "スペースで区切るとAND指定、キーワードをスラッシュで囲んだら正規表現や。"
|
||||
hiddenTags: "見えてへんハッシュタグ"
|
||||
hiddenTagsDescription: "設定したタグを最近流行りのとこに見えんようにすんで。複数設定するときは改行で区切ってな。"
|
||||
@ -1172,6 +1176,7 @@ showRenotes: "リノート出す"
|
||||
edited: "いじったやつ"
|
||||
notificationRecieveConfig: "通知もらうかの設定"
|
||||
mutualFollow: "お互いフォローしてんで"
|
||||
followingOrFollower: "フォロー中またはフォロワー"
|
||||
fileAttachedOnly: "ファイルのっけてあるやつだけ"
|
||||
showRepliesToOthersInTimeline: "タイムラインに他の人への返信とかも入れるで"
|
||||
hideRepliesToOthersInTimeline: "タイムラインに他の人への返信とかは入れへん"
|
||||
@ -1181,6 +1186,12 @@ confirmShowRepliesAll: "これは元に戻せへんから慎重に決めてや
|
||||
confirmHideRepliesAll: "これは元に戻せへんから慎重に決めてや。本当にタイムラインに今フォローしとる全員の返信を入れへんのか?"
|
||||
externalServices: "他のサイトのサービス"
|
||||
sourceCode: "ソースコード"
|
||||
sourceCodeIsNotYetProvided: "ソースコードはまだ提供されてへんで。問題の修正について管理者に問い合わせてみ。"
|
||||
repositoryUrl: "リポジトリURL"
|
||||
repositoryUrlDescription: "ソースコードが公開されているリポジトリがある場合、そのURLを記入するで。Misskeyをそのまんま(ソースコードにいかなる変更も加えずに)使っとる場合は https://github.com/misskey-dev/misskey と記入するで。"
|
||||
repositoryUrlOrTarballRequired: "リポジトリを公開してへんなら、代わりにtarballを提供する必要があるで。詳細は.config/example.ymlを参照してな。"
|
||||
feedback: "フィードバック"
|
||||
feedbackUrl: "フィードバックURL"
|
||||
impressum: "運営者の情報"
|
||||
impressumUrl: "運営者の情報URL"
|
||||
impressumDescription: "ドイツとかの一部んところではな、表示が義務付けられてんねん(Impressum)。"
|
||||
@ -1216,6 +1227,8 @@ soundWillBePlayed: "サウンドが再生されるで"
|
||||
showReplay: "リプレイ見る"
|
||||
replay: "リプレイ"
|
||||
replaying: "リプレイ中"
|
||||
endReplay: "リプレイを終了"
|
||||
copyReplayData: "リプレイデータをコピー"
|
||||
ranking: "ランキング"
|
||||
lastNDays: "直近{n}日"
|
||||
backToTitle: "タイトルへ"
|
||||
@ -1223,9 +1236,34 @@ hemisphere: "住んでる地域"
|
||||
withSensitive: "センシティブなファイルを含むノートを表示"
|
||||
userSaysSomethingSensitive: "{name}のセンシティブなファイルを含む投稿"
|
||||
enableHorizontalSwipe: "スワイプしてタブを切り替える"
|
||||
loading: "読み込み中"
|
||||
surrender: "やめとく"
|
||||
gameRetry: "もういっちょ"
|
||||
notUsePleaseLeaveBlank: "使用せえへん場合は空欄にしてや"
|
||||
useTotp: "ワンタイムパスワードを使う"
|
||||
useBackupCode: "バックアップコードを使う"
|
||||
launchApp: "アプリを起動"
|
||||
useNativeUIForVideoAudioPlayer: "動画・音声の再生にブラウザのUIを使用する"
|
||||
keepOriginalFilename: "オリジナルのファイル名を保持"
|
||||
keepOriginalFilenameDescription: "この設定をオフにすると、アップロード時にファイル名が自動でランダム文字列に置き換えられるで。"
|
||||
noDescription: "説明文はあらへんで"
|
||||
alwaysConfirmFollow: "フォローの際常に確認する"
|
||||
inquiry: "問い合わせ"
|
||||
_delivery:
|
||||
stop: "配信せぇへん"
|
||||
_type:
|
||||
none: "配信しとる"
|
||||
_bubbleGame:
|
||||
howToPlay: "遊び方"
|
||||
hold: "ホールド"
|
||||
_score:
|
||||
score: "スコア"
|
||||
scoreYen: "稼いだ金額"
|
||||
highScore: "ハイスコア"
|
||||
maxChain: "最大チェーン数"
|
||||
yen: "{yen}円"
|
||||
estimatedQty: "{qty}個分"
|
||||
scoreSweets: "おにぎり {onigiriQtyWithUnit}"
|
||||
_howToPlay:
|
||||
section1: "位置を調整してハコにモノを落とすで。"
|
||||
section2: "同じもんがくっついたら別のやつになって、スコアがもらえるで。"
|
||||
@ -1516,7 +1554,7 @@ _achievements:
|
||||
_viewAchievements3min:
|
||||
title: "実績好き"
|
||||
description: "実績一覧を3分以上眺め続けた"
|
||||
_iLoveMisskey:
|
||||
_iLoveCherryPick:
|
||||
title: "CherryPick好きやねん"
|
||||
description: "\"I ❤ #CherryPick\"を投稿した"
|
||||
flavor: "CherryPickを使ってくれておおきにな~ by 開発チーム"
|
||||
@ -1650,6 +1688,7 @@ _role:
|
||||
gtlAvailable: "グローバルタイムライン見る"
|
||||
ltlAvailable: "ローカルタイムライン見る"
|
||||
canPublicNote: "パブリック投稿できるか"
|
||||
mentionMax: "ノート内の最大メンション数"
|
||||
canInvite: "サーバー招待コード作る"
|
||||
inviteLimit: "招待コード作れる数"
|
||||
inviteLimitCycle: "招待コードの作れる間隔"
|
||||
@ -1673,8 +1712,14 @@ _role:
|
||||
canUseTranslator: "翻訳使えるかどうか"
|
||||
avatarDecorationLimit: "アイコンデコのいっちばんつけれる数"
|
||||
_condition:
|
||||
roleAssignedTo: "マニュアルロールにアサイン済み"
|
||||
isLocal: "ローカルユーザー"
|
||||
isRemote: "リモートユーザー"
|
||||
isCat: "猫ユーザー"
|
||||
isBot: "botユーザー"
|
||||
isSuspended: "サスペンド済みユーザー"
|
||||
isLocked: "鍵アカウントユーザー"
|
||||
isExplorable: "「アカウントを見つけやすくする」が有効なユーザー"
|
||||
createdLessThan: "アカウント作ってから~以内"
|
||||
createdMoreThan: "アカウント作ってから~経過"
|
||||
followersLessThanOrEq: "フォロワー数が~以下"
|
||||
@ -1744,6 +1789,7 @@ _plugin:
|
||||
installWarn: "信頼できへんプラグインはインストールせんとってな"
|
||||
manage: "プラグインの管理"
|
||||
viewSource: "ソース見る"
|
||||
viewLog: "ログを表示"
|
||||
_preferencesBackups:
|
||||
list: "作ったバックアップ"
|
||||
saveNew: "新しく保存"
|
||||
@ -1758,8 +1804,8 @@ _preferencesBackups:
|
||||
deleteConfirm: "{name}を消すん?"
|
||||
renameConfirm: "「{old}」を「{new}」に変えるん?"
|
||||
noBackups: "バックアップはないで。「新しく保存」ってとこでこのクライアント設定を鯖に保存できるで。"
|
||||
createdAt: "作った日時:{date}{time}"
|
||||
updatedAt: "更新日時:{date}{time}"
|
||||
createdAt: "作った日時: {date} {time}"
|
||||
updatedAt: "更新日時: {date} {time}"
|
||||
cannotLoad: "読み込みできへん..."
|
||||
invalidFile: "ファイル形式が違うで?"
|
||||
_registry:
|
||||
@ -1773,6 +1819,8 @@ _aboutMisskey:
|
||||
contributors: "主な貢献者"
|
||||
allContributors: "全ての貢献者"
|
||||
source: "ソースコード"
|
||||
original: "オリジナル"
|
||||
thisIsModifiedVersion: "{name}はオリジナルのMisskeyをいじったバージョンをつこうてるで。"
|
||||
translation: "Misskeyを翻訳"
|
||||
donate: "Misskeyに寄付"
|
||||
morePatrons: "他にもぎょうさんの人からサポートしてもろてんねん。ほんまおおきに🥰"
|
||||
@ -1999,7 +2047,6 @@ _2fa:
|
||||
registerTOTP: "認証アプリの設定はじめる"
|
||||
step1: "ほんなら、{a}や{b}とかの認証アプリを使っとるデバイスにインストールしてな。"
|
||||
step2: "次に、ここにあるQRコードをアプリでスキャンしてな~。"
|
||||
step2Click: "QRコード押したら、今使とる端末に入っとる認証アプリとかキーリングに登録できるで。"
|
||||
step2Uri: "デスクトップアプリを使う時は次のURIを入れるで"
|
||||
step3Title: "確認コードを入れてーや"
|
||||
step3: "アプリに映っとる確認コード(トークン)を入れて終わりや。"
|
||||
@ -2023,6 +2070,7 @@ _2fa:
|
||||
backupCodesDescription: "認証アプリが使用できんなった場合、以下のバックアップコードを使ってアカウントにアクセスできるで。これらのコードは必ず安全な場所に置いときや。各コードは一回だけ使用できるで。"
|
||||
backupCodeUsedWarning: "バックアップコードが使用されたで。認証アプリが使えなくなってるん場合、なるべく早く認証アプリを再設定しや。"
|
||||
backupCodesExhaustedWarning: "バックアップコードが全て使用されたで。認証アプリを利用できん場合、これ以上アカウントにアクセスできなくなるで。認証アプリを再登録しや。"
|
||||
moreDetailedGuideHere: "詳細なガイドはこちら"
|
||||
_permissions:
|
||||
"read:account": "アカウントの情報を見るで"
|
||||
"write:account": "アカウントの情報を変更するで"
|
||||
@ -2073,7 +2121,6 @@ _permissions:
|
||||
"read:admin:server-info": "サーバーの情報見る"
|
||||
"read:admin:show-moderation-log": "モデレーションログ見る"
|
||||
"read:admin:show-user": "ユーザーのプライベートな情報見る"
|
||||
"read:admin:show-users": "ユーザーのプライベートな情報見る"
|
||||
"write:admin:suspend-user": "ユーザーを凍結"
|
||||
"write:admin:unset-user-avatar": "ユーザーのアバターを削除"
|
||||
"write:admin:unset-user-banner": "ユーザーのバナーを削除"
|
||||
@ -2286,6 +2333,7 @@ _play:
|
||||
title: "タイトル"
|
||||
script: "スクリプト"
|
||||
summary: "説明"
|
||||
visibilityDescription: "非公開に設定するとプロフィールに表示されへんくなるけど、URLを知っとる人は引き続きアクセスできるで。"
|
||||
_pages:
|
||||
newPage: "ページを作る"
|
||||
editPage: "ページの編集"
|
||||
@ -2330,6 +2378,8 @@ _pages:
|
||||
section: "セクション"
|
||||
image: "画像"
|
||||
button: "ボタン"
|
||||
dynamic: "動的ブロック"
|
||||
dynamicDescription: "このブロックは廃止されとるで。今後は{play}を利用してや。"
|
||||
note: "ノート埋め込み"
|
||||
_note:
|
||||
id: "ノートID"
|
||||
@ -2360,8 +2410,10 @@ _notification:
|
||||
sendTestNotification: "テスト通知を送信するで"
|
||||
notificationWillBeDisplayedLikeThis: "通知はこのように表示されるで"
|
||||
reactedBySomeUsers: "{n}人がツッコんだで"
|
||||
likedBySomeUsers: "{n}人がいいねしたで"
|
||||
renotedBySomeUsers: "{n}人がリノートしたで"
|
||||
followedBySomeUsers: "{n}人にフォローされたで"
|
||||
flushNotification: "通知の履歴をリセットする"
|
||||
_types:
|
||||
all: "すべて"
|
||||
note: "あんたらの新規投稿"
|
||||
@ -2460,6 +2512,7 @@ _moderationLogTypes:
|
||||
resetPassword: "パスワードをリセット"
|
||||
suspendRemoteInstance: "リモートサーバーを止めんで"
|
||||
unsuspendRemoteInstance: "リモートサーバーを再開すんで"
|
||||
updateRemoteInstanceNote: "リモートサーバーのモデレーションノート更新"
|
||||
markSensitiveDriveFile: "ファイルをセンシティブ付与"
|
||||
unmarkSensitiveDriveFile: "ファイルをセンシティブ解除"
|
||||
resolveAbuseReport: "苦情を解決"
|
||||
@ -2580,7 +2633,26 @@ _reversi:
|
||||
opponentHasSettingsChanged: "相手が設定変えたで"
|
||||
allowIrregularRules: "変則許可 (完全フリー)"
|
||||
disallowIrregularRules: "変則なし"
|
||||
showBoardLabels: "盤面に行・列番号を表示"
|
||||
useAvatarAsStone: "石をアイコンにする"
|
||||
_offlineScreen:
|
||||
title: "オフライン - サーバーに接続できひんで"
|
||||
header: "サーバーに接続できへんわ"
|
||||
|
||||
_urlPreviewSetting:
|
||||
title: "URLプレビューの設定"
|
||||
enable: "URLプレビューを有効にする"
|
||||
timeout: "プレビュー取得時のタイムアウト(ms)"
|
||||
timeoutDescription: "プレビュー取得の所要時間がこの値を超えた場合、プレビューは生成されへんで。"
|
||||
maximumContentLength: "Content-Lengthの最大値(byte)"
|
||||
maximumContentLengthDescription: "Content-Lengthがこの値を超えた場合、プレビューは生成されへんで。"
|
||||
requireContentLength: "Content-Lengthが取得できた場合のみプレビューを生成"
|
||||
requireContentLengthDescription: "相手サーバがContent-Lengthを返さない場合、プレビューは生成されへんで。"
|
||||
userAgent: "User-Agent"
|
||||
userAgentDescription: "プレビュー取得時に使用されるUser-Agentを設定するで。空欄の場合、デフォルトのUser-Agentが使用されるで。"
|
||||
summaryProxy: "プレビューを生成するプロキシのエンドポイント"
|
||||
summaryProxyDescription: "Misskey本体やなく、サマリープロキシを使用してプレビューを生成するで。"
|
||||
summaryProxyDescription2: "プロキシには下記パラメータがクエリ文字列として連携されるで。プロキシ側がこれらをサポートせえへんときは、設定値は無視されるで。"
|
||||
_mediaControls:
|
||||
pip: "ピクチャインピクチャ"
|
||||
playbackRate: "再生速度"
|
||||
loop: "ループ再生"
|
||||
|
@ -1,4 +1,3 @@
|
||||
---
|
||||
_lang_: "la .lojban."
|
||||
headlineMisskey: "lo se tcana noi jorne fi loi notci"
|
||||
|
||||
|
@ -104,4 +104,3 @@ _deck:
|
||||
_columns:
|
||||
notifications: "Ilɣuyen"
|
||||
list: "Tibdarin"
|
||||
|
||||
|
@ -84,4 +84,3 @@ _deck:
|
||||
notifications: "ಅಧಿಸೂಚನೆಗಳು"
|
||||
tl: "ಸಮಯಸಾಲು"
|
||||
mentions: "ಹೆಸರಿಸಿದ"
|
||||
|
||||
|
@ -16,8 +16,8 @@ cancel: "아이예"
|
||||
noThankYou: "뎃어예"
|
||||
enterUsername: "사용자 이럼 서기"
|
||||
renotedBy: "{user}님이 리노트햇어예"
|
||||
noNotes: "노트가 없십니다"
|
||||
noNotifications: "알림이 없십니다"
|
||||
noNotes: "노트가 어ᇝ십니다"
|
||||
noNotifications: "알림이 어ᇝ십니다"
|
||||
instance: "서버"
|
||||
settings: "설정"
|
||||
notificationSettings: "알림 설정"
|
||||
@ -26,7 +26,7 @@ otherSettings: "다린 설정"
|
||||
openInWindow: "창서 옐기"
|
||||
profile: "프로필"
|
||||
timeline: "타임라인"
|
||||
noAccountDescription: "자기소개가 없십니다"
|
||||
noAccountDescription: "자기소개가 어ᇝ십니다"
|
||||
login: "로그인"
|
||||
loggingIn: "로그인하고 잇어예"
|
||||
logout: "로그아웃"
|
||||
@ -80,7 +80,7 @@ unfollowConfirm: "{name}님얼 고마 팔로잉합니꺼?"
|
||||
exportRequested: "내가기 요청얼 햇십니다. 시간이 쪼매 걸릴 깁니다. 요청이 껕나모 ‘드라이브’에 옇십니다."
|
||||
importRequested: "가오기 요청얼 햇십니다. 시간이 쪼매 걸릴 깁니다."
|
||||
lists: "리스트"
|
||||
noLists: "리스트가 없십니다"
|
||||
noLists: "리스트가 어ᇝ십니다"
|
||||
note: "노트"
|
||||
notes: "노트"
|
||||
following: "팔로잉"
|
||||
@ -161,7 +161,7 @@ youCanCleanRemoteFilesCache: "파일 간리으 🗑️ 모냥얼 누질리모
|
||||
cacheRemoteSensitiveFiles: "웬겍으 수ᇚ힌 파일얼 캐시하기"
|
||||
cacheRemoteSensitiveFilesDescription: "요 설정얼 꺼모 웬겍 수ᇚ힌 파일이 캐시하지 아이하고 바리 링크합니다."
|
||||
flagAsBot: "자동 게정입니다"
|
||||
flagAsBotDescription: "요 게정얼 프로그램서 설라먼 키야 합니다. 키모 다런 개발자가 반엉얼 끋없이 데풀이하지 몬 하게 도아 줄 수 잇고 CherryPick으 시스템서 자동 게정이 뎁니다."
|
||||
flagAsBotDescription: "요 게정얼 프로그램서 설라먼 키야 합니다. 키모 다런 개발자가 반엉얼 끋어ᇝ이 데풀이하지 몬 하게 도아 줄 수 잇고 CherryPick으 시스템서 자동 게정이 뎁니다."
|
||||
flagAsCat: "애웅애웅애웅애웅!"
|
||||
flagAsCatDescription: "애옹?"
|
||||
flagShowTimelineReplies: "타임라인서 노트으 답하기 보기"
|
||||
@ -176,7 +176,7 @@ wallpaper: "벡지"
|
||||
setWallpaper: "벡지 설정"
|
||||
removeWallpaper: "벡지 뭉캐기"
|
||||
searchWith: "찾기: {q}"
|
||||
youHaveNoLists: "리스트가 없십니다"
|
||||
youHaveNoLists: "리스트가 어ᇝ십니다"
|
||||
followConfirm: "{name}님얼 팔로잉합니꺼?"
|
||||
proxyAccount: "프락시 게정"
|
||||
proxyAccountDescription: "프락시 게정언 턱벨한 조겐서 웬겍 팔로잉얼 하넌 게정입니다. 사용자가 웬겍 사용자럴 리스트에 옇얼 때 리스트에 옇언 사용자럴 누도 팔로잉 아이하모 할동이 서버로 아이 오니께 요 게정이 아인 프락시 게정얼 팔로잉하게 합니다."
|
||||
@ -210,17 +210,17 @@ instanceInfo: "서버 정보"
|
||||
statistics: "통게"
|
||||
clearQueue: "대기옐 비우기"
|
||||
clearQueueConfirmTitle: "대기옐얼 비웁니꺼?"
|
||||
clearQueueConfirmText: "대기옐에 잇넌 걸얼 아이 보냅니다. 흐이 요 동작언 할 필요가 없십니다."
|
||||
clearQueueConfirmText: "대기옐에 잇넌 걸얼 아이 보냅니다. 흐이 요 동작언 할 필요가 어ᇝ십니다."
|
||||
clearCachedFiles: "캐시 비우기"
|
||||
clearCachedFilesConfirm: "캐시한 웬겍 파일얼 말캉 뭉캡니꺼?"
|
||||
blockedInstances: "차단한 서버"
|
||||
blockedInstancesDescription: "차단할라넌 서버으 호스트럴 줄 바꿈해서로 비이 줍니다. 차단한 서버넌 요 서버하고 교류 몬 합니다."
|
||||
silencedInstances: "수ᇚ훈 서버"
|
||||
silencedInstancesDescription: "수ᇚ훌라넌 서버으 호스트럴 줄 바꿈해서로 비이 줍니다. 수ᇚ훈 서버으 게정언 말캉 ‘수ᇚ후기’가 데서 팔로잉 요청만 데고 팔로워가 아인 로컬 게정서 멘션얼 몬 합니다. 차단한 서버넌 상간 없십니다."
|
||||
silencedInstancesDescription: "수ᇚ훌라넌 서버으 호스트럴 줄 바꿈해서로 비이 줍니다. 수ᇚ훈 서버으 게정언 말캉 ‘수ᇚ후기’가 데서 팔로잉 요청만 데고 팔로워가 아인 로컬 게정서 멘션얼 몬 합니다. 차단한 서버넌 상간 어ᇝ십니다."
|
||||
muteAndBlock: "수ᇚ훔하고 차단"
|
||||
mutedUsers: "수ᇚ훈 사용자"
|
||||
blockedUsers: "차단한 사용자"
|
||||
noUsers: "사용자가 없십니다"
|
||||
noUsers: "사용자가 어ᇝ십니다"
|
||||
editProfile: "프로필 적기"
|
||||
noteDeleteConfirm: "요 노트럴 뭉캡니꺼?"
|
||||
pinLimitExceeded: "더 몬 붙입니다"
|
||||
@ -230,15 +230,15 @@ processing: "처리하고 잇어예"
|
||||
preview: "미리보기"
|
||||
default: "기본값"
|
||||
defaultValueIs: "기본값: {value}"
|
||||
noCustomEmojis: "이모지가 없십니다"
|
||||
noJobs: "작업이 없십니다"
|
||||
noCustomEmojis: "이모지가 어ᇝ십니다"
|
||||
noJobs: "작업이 어ᇝ십니다"
|
||||
federating: "옌합하고 잇어예"
|
||||
blocked: "차단햇어예"
|
||||
suspended: "고만 보내예"
|
||||
all: "말캉"
|
||||
subscribing: "구독하고 잇어예"
|
||||
publishing: "보내고 잇어예"
|
||||
notResponding: "답이 없어예"
|
||||
notResponding: "답이 어ᇝ어예"
|
||||
instanceFollowing: "서버으 팔로잉"
|
||||
instanceFollowers: "서버으 팔로워"
|
||||
instanceUsers: "서버으 사용자"
|
||||
@ -275,7 +275,7 @@ uploadFromUrlRequested: "올리기럴 요청햇십니다"
|
||||
uploadFromUrlMayTakeTime: "올리기가 껕날라먼 시간이 쪼매 걸릴 깁니다."
|
||||
explore: "살펴보기"
|
||||
messageRead: "이럿어예"
|
||||
noMoreHistory: "요카마 엣날 기록이 없십니다"
|
||||
noMoreHistory: "요카마 옛날 기록이 어ᇝ십니다"
|
||||
startMessaging: "대화하기"
|
||||
nUsersRead: "{n}멩이 이럿십니다"
|
||||
agreeTo: "{0}에 동이하기"
|
||||
@ -432,28 +432,28 @@ securityKey: "보안키"
|
||||
lastUsed: "마지막 쓰임"
|
||||
lastUsedAt: "마지막 쓰임: {t}"
|
||||
unregister: "맨걸기 무루기"
|
||||
passwordLessLogin: "비밀번호 없시 로그인"
|
||||
passwordLessLoginDescription: "비밀번호 말고 보안키나 패스키 같은 것만 써 가 로그인합니다."
|
||||
passwordLessLogin: "비밀번호 어ᇝ이 로그인"
|
||||
passwordLessLoginDescription: "비밀번호 어ᇝ이 보안 키나 패스 키만 서서 로그인합니다."
|
||||
resetPassword: "비밀번호 재설정"
|
||||
newPasswordIs: "새 비밀번호는 \"{password}\" 입니다"
|
||||
newPasswordIs: "새 비밀번호넌 ‘{password}’입니다"
|
||||
reduceUiAnimation: "화면 움직임 효과들을 수ᇚ후기"
|
||||
share: "노누기"
|
||||
notFound: "몬 찾앗십니다"
|
||||
notFoundDescription: "고런 주소로 들어가는 하멘은 없십니다."
|
||||
uploadFolder: "기본 업로드 위치"
|
||||
markAsReadAllNotifications: "모든 알림 이럿다고 표시"
|
||||
markAsReadAllUnreadNotes: "모든 글 이럿다고 표시"
|
||||
markAsReadAllTalkMessages: "모든 대화 이럿다고 표시"
|
||||
notFoundDescription: "선 주소에 맞넌 페이지가 어ᇝ십니다."
|
||||
uploadFolder: "기본 올리기 위치"
|
||||
markAsReadAllNotifications: "모던 알림얼 읽엄 포시"
|
||||
markAsReadAllUnreadNotes: "모던 걸얼 읽엄 포시"
|
||||
markAsReadAllTalkMessages: "모던 대화 읽엄 포시"
|
||||
help: "도움말"
|
||||
inputMessageHere: "여따가 메시지를 입력해주이소"
|
||||
close: "닫기"
|
||||
inputMessageHere: "옇다 메시지럴 서이소"
|
||||
close: "꺼기"
|
||||
invites: "초대하기"
|
||||
members: "멤버"
|
||||
transfer: "양도"
|
||||
members: "구성원"
|
||||
transfer: "넘구기"
|
||||
title: "제목"
|
||||
text: "글"
|
||||
text: "걸"
|
||||
enable: "키기"
|
||||
next: "다음"
|
||||
next: "다엄"
|
||||
retype: "다시 서기"
|
||||
noteOf: "{user}님으 노트"
|
||||
quoteAttached: "따옴"
|
||||
@ -468,6 +468,7 @@ tooShort: "억수로 짜립니다"
|
||||
tooLong: "억수로 집니다"
|
||||
passwordMatched: "맞십니다"
|
||||
passwordNotMatched: "안 맞십니다"
|
||||
signinWith: "{n}서 로그인"
|
||||
signinFailed: "로그인 몬 했십니다. 고 이름이랑 비밀번호 제대로 썼는가 확인해 주이소."
|
||||
or: "아니면"
|
||||
language: "언어"
|
||||
@ -512,13 +513,13 @@ useObjectStorage: "오브젝트 스토리지 키기"
|
||||
objectStorageBaseUrl: "Base URL"
|
||||
objectStorageBaseUrlDesc: "오브젝트 (미디어) 참조 링크 만들 때 쓰는 URL임다. CDN 내지 프락시를 쓴다 카멘은 그 URL을 갖다 늫고, 아이면 써먹을 서비스네 가이드를 봐봐가 공개적으로 접근할 수 있는 주소를 여 넣어 주이소. 그니께, 내가 AWS S3을 쓴다 카면은 'https://<bucket>.s3.amazonaws.com', GCS를 쓴다 카면 'https://storage.googleapis.com/<bucket>' 처럼 쓰믄 되입니더."
|
||||
objectStorageBucket: "Bucket"
|
||||
objectStorageBucketDesc: "써먹을 서비스의 바께쓰 이름을 여 써 주이소."
|
||||
objectStorageBucketDesc: "설 서비스으 버킷 이럼얼 서 주이소."
|
||||
objectStoragePrefix: "Prefix"
|
||||
objectStoragePrefixDesc: "요 Prefix 디렉토리 안에다가 파일이 들어감다."
|
||||
objectStorageEndpoint: "Endpoint"
|
||||
objectStorageEndpointDesc: "AWS S3을 쓸라멘 요는 비워두고, 아이멘은 그 서비스 가이드에 맞게 endpoint를 넣어 주이소. '<host>' 내지 '<host>:<port>'처럼 넣십니다."
|
||||
objectStorageEndpointDesc: "AWS S3넌 비아 두고 다런 것언 거 서비스으 엔드포인트럴 서 주이소. ‘<host>’나 ‘<host>:<port>’맨치로 섭니다."
|
||||
objectStorageRegion: "Region"
|
||||
objectStorageRegionDesc: "'xx-east-1' 같은 region 이름을 옇어 주이소. 만약에 내 서비스엔 region 같은 개념이 읎다, 카면은 대신에 'us-east-1'라고 해 두이소. AWS 설정 파일이나 환경 변수를 끌어다 쓰겠다믄 요는 비워 두이소."
|
||||
objectStorageRegionDesc: "‘xx-east-1’맨치로 리전 이럼얼 서 주이소. 설 서비스에 리전 개넴이 어ᇝ어먼 ‘us-east-1’라고 해 두이소. 에이더블유에스 설정 파일이나 환겡 벤수가 이ᇇ어면 비아 두이소."
|
||||
objectStorageUseSSL: "SSL 쓰기"
|
||||
objectStorageUseSSLDesc: "API 호출할 때 HTTPS 안 쓸거면은 꺼 두이소"
|
||||
objectStorageUseProxy: "연결에 프락시 사용"
|
||||
@ -534,7 +535,7 @@ newNoteRecived: "새 노트 있어예"
|
||||
sounds: "소리"
|
||||
sound: "소리"
|
||||
listen: "듣기"
|
||||
none: "없음"
|
||||
none: "어ᇝ엄"
|
||||
showInPage: "바닥서 보기"
|
||||
popout: "새 창 열기"
|
||||
volume: "음량"
|
||||
@ -542,13 +543,13 @@ masterVolume: "대빵 음량"
|
||||
notUseSound: "음소거하기"
|
||||
useSoundOnlyWhenActive: "CherryPick이 활성화되어 있을 때만 소리 내기"
|
||||
details: "자세히"
|
||||
chooseEmoji: "이모지 선택"
|
||||
chooseEmoji: "이모지 개리기"
|
||||
unableToProcess: "작업 다 몬 했십니다"
|
||||
recentUsed: "최근 쓴 놈"
|
||||
install: "설치"
|
||||
uninstall: "삭제"
|
||||
installedApps: "설치된 애플리케이션"
|
||||
nothing: "뭣도 없어예"
|
||||
nothing: "어ᇝ어예"
|
||||
installedDate: "설치한 날"
|
||||
lastUsedDate: "마지막 사용"
|
||||
state: "상태"
|
||||
@ -579,6 +580,7 @@ enableInfiniteScroll: "알아서 더 보기"
|
||||
useCw: "내용 수ᇚ후기"
|
||||
description: "설멩"
|
||||
describeFile: "캡션 옇기"
|
||||
enterFileDescription: "캡션 서기"
|
||||
author: "맨던 사람"
|
||||
manage: "간리"
|
||||
emailServer: "전자우펜 서버"
|
||||
@ -598,6 +600,7 @@ reporter: "신고한 사람"
|
||||
reporteeOrigin: "신고덴 사람"
|
||||
reporterOrigin: "신고한 곳"
|
||||
forwardReport: "웬겍 서버에 신고 보내기"
|
||||
waitingFor: "{x}(얼)럴 지달리고 잇십니다"
|
||||
random: "무작이"
|
||||
system: "시스템"
|
||||
clip: "클립 맨걸기"
|
||||
@ -610,10 +613,13 @@ followersCount: "팔로워 수"
|
||||
noteFavoritesCount: "질겨찾기한 노트 수"
|
||||
clips: "클립 맨걸기"
|
||||
clearCache: "캐시 비우기"
|
||||
typingUsers: "{users} 님이 서고 잇어예"
|
||||
unlikeConfirm: "좋네예럴 무룹니꺼?"
|
||||
info: "정보"
|
||||
selectAccount: "계정 개리기"
|
||||
user: "사용자"
|
||||
administration: "간리"
|
||||
translatedFrom: "{x}서 번옉"
|
||||
on: "킴"
|
||||
off: "껌"
|
||||
hide: "수ᇚ후기"
|
||||
@ -625,6 +631,8 @@ oneDay: "하리"
|
||||
oneWeek: "한 주"
|
||||
oneMonth: "한 달"
|
||||
file: "파일"
|
||||
typeToConfirm: "게속할라먼 {x}럴 누질라 주이소"
|
||||
pleaseSelect: "개리 주이소"
|
||||
tools: "도구"
|
||||
like: "좋네예!"
|
||||
unlike: "좋네예 무루기"
|
||||
@ -632,7 +640,7 @@ numberOfLikes: "좋네예 수"
|
||||
show: "보기"
|
||||
roles: "옉할"
|
||||
role: "옉할"
|
||||
noRole: "옉할이 없십니다"
|
||||
noRole: "옉할이 어ᇝ십니다"
|
||||
thisPostMayBeAnnoyingCancel: "아이예"
|
||||
likeOnly: "좋네예마"
|
||||
myClips: "내 클립"
|
||||
@ -641,6 +649,10 @@ replies: "답하기"
|
||||
renotes: "리노트"
|
||||
attach: "옇기"
|
||||
surrender: "아이예"
|
||||
_delivery:
|
||||
stop: "고만 보내예"
|
||||
_type:
|
||||
none: "보내고 잇어예"
|
||||
_initialAccountSetting:
|
||||
startTutorial: "길라잡이 하기"
|
||||
_initialTutorial:
|
||||
@ -691,7 +703,7 @@ _achievements:
|
||||
description: "첫 노트럴 질겨찾기에 담앗어예"
|
||||
_myNoteFavorited1:
|
||||
description: "다런 사람이 내 노트럴 질겨찾기에 담앗십니다"
|
||||
_iLoveMisskey:
|
||||
_iLoveCherryPick:
|
||||
description: "“I ❤ #CherryPick”럴 섰어예"
|
||||
_postedAt0min0sec:
|
||||
description: "0분 0초에 노트를 섰어예"
|
||||
@ -720,6 +732,7 @@ _theme:
|
||||
_sfx:
|
||||
note: "새 노트"
|
||||
notification: "알림"
|
||||
reaction: "리액션 개리기"
|
||||
_2fa:
|
||||
step3Title: "학인 기호럴 서기"
|
||||
renewTOTPCancel: "뎃어예"
|
||||
@ -744,6 +757,9 @@ _cw:
|
||||
_visibility:
|
||||
home: "덜머리"
|
||||
followers: "팔로워"
|
||||
_postForm:
|
||||
_placeholders:
|
||||
e: "옇다 서 주이소"
|
||||
_profile:
|
||||
name: "이럼"
|
||||
username: "사용자 이럼"
|
||||
@ -796,5 +812,8 @@ _moderationLogTypes:
|
||||
resetPassword: "비밀번호 재설정"
|
||||
resolveAbuseReport: "신고 해겔하기"
|
||||
_reversi:
|
||||
total: "합계"
|
||||
|
||||
reversi: "리버시"
|
||||
chooseBoard: "보드 개리기"
|
||||
black: "꺼멍"
|
||||
white: "허영"
|
||||
total: "합게"
|
||||
|
@ -17,7 +17,7 @@ opacity: "불투명도"
|
||||
noteUpdatedAt: "편집됨: {date} {time}"
|
||||
editReaction: "리액션 편집"
|
||||
removeReaction: "리액션 삭제"
|
||||
noNyaization: "고양이체를 표시하지 않기"
|
||||
noNyaization: "고양이체로 표시하지 않기"
|
||||
revertNoNyaization: "고양이체를 포함하여 표시"
|
||||
viewTextSource: "텍스트 소스 보기"
|
||||
disableNoteEditConfirm: "노트 편집을 계속 진행할까요?"
|
||||
@ -113,9 +113,9 @@ addUser: "사용자 추가"
|
||||
favorite: "즐겨찾기"
|
||||
favorites: "즐겨찾기"
|
||||
unfavorite: "즐겨찾기에서 제거"
|
||||
favorited: "즐겨찾기에 등록했어요"
|
||||
alreadyFavorited: "이미 즐겨찾기에 등록되어 있어요"
|
||||
cantFavorite: "즐겨찾기에 등록하지 못했어요"
|
||||
favorited: "즐겨찾기에 등록했어요."
|
||||
alreadyFavorited: "이미 즐겨찾기에 등록되어 있어요."
|
||||
cantFavorite: "즐겨찾기에 등록하지 못했어요."
|
||||
pin: "프로필에 고정"
|
||||
unpin: "프로필에서 고정 해제"
|
||||
copyContent: "내용 복사"
|
||||
@ -169,9 +169,9 @@ error: "오류"
|
||||
somethingHappened: "오류가 발생했어요"
|
||||
retry: "다시 시도"
|
||||
pageLoadError: "페이지를 불러오지 못했어요."
|
||||
pageLoadErrorDescription: "네트워크 연결 또는 브라우저 캐시로 인해 발생했을 가능성이 높아요. 캐시를 삭제하거나, 잠시 후 다시 시도해 주세요."
|
||||
pageLoadErrorDescription: "네트워크 연결 문제 또는 브라우저 캐시로 인해 발생했을 가능성이 높아요. 캐시를 삭제하거나, 잠시 후 다시 시도해 주세요."
|
||||
serverIsDead: "서버에서 응답이 없어요. 잠시 후 다시 시도해 주세요."
|
||||
youShouldUpgradeClient: "이 페이지를 표시하려면 페이지를 새로 고침해서 새로운 버전의 클라이언트를 이용해 주세요!"
|
||||
youShouldUpgradeClient: "이 페이지를 보려면 페이지를 새로 고친 뒤, 새로운 버전의 클라이언트로 이용해 주세요."
|
||||
enterListName: "리스트 이름 입력"
|
||||
privacy: "프라이버시"
|
||||
makeFollowManuallyApprove: "팔로우를 수동으로 승인"
|
||||
@ -199,8 +199,8 @@ clickToShow: "클릭하여 보기"
|
||||
doubleClickToShow: "두 번 탭하여 보기"
|
||||
sensitive: "열람 주의"
|
||||
add: "추가"
|
||||
reaction: "리액션"
|
||||
reactions: "리액션"
|
||||
reaction: "반응"
|
||||
reactions: "반응"
|
||||
emojiPicker: "이모지 선택기"
|
||||
pinnedEmojisForReactionSettingDescription: "리액션을 할 때 프로필에 고정해서 표시할 이모지를 설정할 수 있어요"
|
||||
pinnedEmojisSettingDescription: "이모지를 입력할 때 프로필에 고정해서 표시할 이모지를 설정할 수 있어요"
|
||||
@ -249,7 +249,7 @@ cacheRemoteSensitiveFilesDescription: "이 설정을 비활성화하면 리모
|
||||
flagAsBot: "삐릭, 삐리리릭? 저는 봇입니다."
|
||||
flagAsBotDescription: "이 계정을 자동화된 수단으로 운용할 경우에 활성화해 주세요. 이 플래그를 활성화하면, 다른 봇이 이를 참고하여 봇 끼리의 무한 연쇄 반응을 회피하거나, 이 계정의 시스템 상에서의 취급이 봇 운영에 최적화되는 등의 변화가 생겨요"
|
||||
flagAsCat: "나는 고양이다냥"
|
||||
flagAsCatDescription: "이 계정이 고양이라면 활성화해 달라냥"
|
||||
flagAsCatDescription: "냥?(이 계정이 고양이라면 눌러 달라냥)"
|
||||
flagShowTimelineReplies: "타임라인에 노트의 답글을 표시하기"
|
||||
flagShowTimelineRepliesDescription: "이 설정을 활성화하면 타임라인에 다른 사용자 간의 답글을 표시해요."
|
||||
autoAcceptFollowed: "팔로우 중인 사용자로부터의 팔로우 요청을 자동 수락"
|
||||
@ -310,7 +310,7 @@ noUsers: "아무도 없어요"
|
||||
editProfile: "프로필 수정"
|
||||
noteDeleteConfirm: "이 노트를 삭제할까요?"
|
||||
pinLimitExceeded: "더 이상 고정할 수 없어요."
|
||||
intro: "CherryPick의 설치가 완료되었어요! 이제 관리자 계정을 생성해주세요."
|
||||
intro: "CherryPick의 설치를 완료했어요! 이제 관리자 계정을 만들 차례에요."
|
||||
done: "완료"
|
||||
processing: "처리 중"
|
||||
preview: "미리보기"
|
||||
@ -377,7 +377,7 @@ activity: "활동"
|
||||
images: "이미지"
|
||||
image: "이미지"
|
||||
birthday: "생일"
|
||||
yearsOld: "{age}세"
|
||||
yearsOld: "만 {age} 세"
|
||||
registeredDate: "등록일"
|
||||
location: "장소"
|
||||
theme: "테마"
|
||||
@ -481,6 +481,7 @@ name: "이름"
|
||||
antennaSource: "받을 소스"
|
||||
antennaKeywords: "받을 키워드"
|
||||
antennaExcludeKeywords: "제외할 키워드"
|
||||
antennaExcludeBots: "봇 계정 제외"
|
||||
antennaKeywordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으로 구분하는 경우 OR로 지정할 수 있어요"
|
||||
notifyAntenna: "새로운 노트를 알림"
|
||||
withFileAntenna: "파일이 첨부된 노트만"
|
||||
@ -560,7 +561,7 @@ quoteQuestion: "인용해서 작성하시겠어요?"
|
||||
noMessagesYet: "너무.. 너무 조용해요.."
|
||||
newMessageExists: "새로운 메시지가 있어요!"
|
||||
onlyOneFileCanBeAttached: "메시지에는 하나의 파일만 첨부할 수 있어요!"
|
||||
signinRequired: "로그인이 필요해요"
|
||||
signinRequired: "진행하기 전에 먼저 로그인이 필요해요"
|
||||
invitations: "초대"
|
||||
invitationCode: "초대 코드"
|
||||
checking: "확인하고 있어요.."
|
||||
@ -587,6 +588,7 @@ disableDrawer: "드로어 메뉴를 사용하지 않기"
|
||||
youHaveNoGroups: "그룹이 없어요"
|
||||
joinOrCreateGroup: "다른 그룹의 초대를 받거나, 직접 새 그룹을 만들 수 있어요!"
|
||||
showNoteActionsOnlyHover: "노트 액션 버튼을 마우스를 올렸을 때에만 표시"
|
||||
showReactionsCount: "노트의 반응 수 표시하기"
|
||||
noHistory: "기록이 없어요"
|
||||
signinHistory: "로그인 기록"
|
||||
enableAdvancedMfm: "고급 MFM 활성화"
|
||||
@ -624,13 +626,13 @@ useObjectStorage: "오브젝트 스토리지 사용"
|
||||
objectStorageBaseUrl: "Base URL"
|
||||
objectStorageBaseUrlDesc: "오브젝트 (미디어) 참조 URL을 만들 때 사용되는 URL이에요. CDN 또는 프록시를 사용하는 경우 그 URL을 지정하고, 그 외의 경우 사용할 서비스의 가이드에 따라 공개적으로 액세스 할 수 있는 주소를 지정해 주세요. 예를 들어, AWS S3의 경우 'https://<bucket>.s3.amazonaws.com', GCS등의 경우 'https://storage.googleapis.com/<bucket>' 와 같이 지정해 주세요."
|
||||
objectStorageBucket: "Bucket"
|
||||
objectStorageBucketDesc: "사용 서비스의 bucket명을 지정해 주세요."
|
||||
objectStorageBucketDesc: "사용하는 서비스의 bucket 이름을 지정해 주세요."
|
||||
objectStoragePrefix: "Prefix"
|
||||
objectStoragePrefixDesc: "이 Prefix 의 디렉토리 아래에 파일이 저장돼요."
|
||||
objectStorageEndpoint: "Endpoint"
|
||||
objectStorageEndpointDesc: "AWS S3의 경우 공란, 다른 서비스의 경우 각 서비스의 가이드에 맞게 endpoint를 설정해 주세요. '<host>' 혹은 '<host>:<port>' 와 같이 지정해 주세요."
|
||||
objectStorageEndpointDesc: "AWS S3를 사용한다면 비워 두고 다른 서비스는 각 서비스의 endpoint를 설정해 주세요. ‘<host>’ 혹은 ‘<host>:<port>’와 같이 지정해 주세요."
|
||||
objectStorageRegion: "Region"
|
||||
objectStorageRegionDesc: "'xx-east-1'와 같이 region을 지정해 주세요. 사용하는 서비스에 region 개념이 없는 경우 'us-east-1'으로 설정해 주세요. AWS 설정 파일 또는 환경 변수를 참조할 경우에는 비워주세요."
|
||||
objectStorageRegionDesc: "‘xx-east-1’처럼 region을 지정해 주세요. 사용하는 서비스에 region 개념이 없으면 ‘us-east-1’처럼 설정해 주세요. AWS 설정 파일이나 환경 변수가 있으면 비워 주세요."
|
||||
objectStorageUseSSL: "SSL 사용"
|
||||
objectStorageUseSSLDesc: "API 호출시 HTTPS 를 사용하지 않는 경우 OFF 로 설정해 주세요"
|
||||
objectStorageUseProxy: "연결에 프록시 사용"
|
||||
@ -677,7 +679,7 @@ scratchpadDescription: "스크래치 패드는 AiScript 의 테스트 환경을
|
||||
output: "출력"
|
||||
script: "스크립트"
|
||||
disablePagesScript: "Pages 에서 AiScript 를 사용하지 않음"
|
||||
updateRemoteUser: "리모트 사용자 정보 갱신"
|
||||
updateRemoteUser: "원격 사용자 정보 갱신"
|
||||
unsetUserAvatar: "아바타 제거"
|
||||
unsetUserAvatarConfirm: "아바타를 제거할까요?"
|
||||
unsetUserBanner: "배너 제거"
|
||||
@ -760,7 +762,7 @@ regexpErrorDescription: "{tab}단어 뮤트 {line}행의 정규 표현식에 오
|
||||
instanceMute: "서버 뮤트"
|
||||
userSaysSomething: "{name}님이 뭔가 말했어요!"
|
||||
makeActive: "활성화"
|
||||
display: "표시"
|
||||
display: "보기"
|
||||
copy: "복사"
|
||||
metrics: "통계"
|
||||
overview: "요약"
|
||||
@ -809,7 +811,7 @@ createNew: "새로 만들기"
|
||||
optional: "옵션"
|
||||
createNewClip: "새 클립 만들기"
|
||||
unclip: "클립 해제"
|
||||
confirmToUnclipAlreadyClippedNote: "이 노트는 이미 \"{name}\" 클립에 포함되어 있어요. 클립을 해제할까요?"
|
||||
confirmToUnclipAlreadyClippedNote: "이 노트는 이미 ‘{name}’ 클립에 포함되어 있어요. 노트를 클립에서 제외할까요?"
|
||||
public: "공개"
|
||||
private: "비공개"
|
||||
i18nInfo: "CherryPick은 자원봉사자들에 의해 다양한 언어로 번역되고 있어요. {link}에서 번역에 참가할 수 있어요."
|
||||
@ -822,13 +824,13 @@ repliedCount: "받은 답글 수"
|
||||
renotedCount: "받은 리노트 수"
|
||||
followingCount: "팔로우 수"
|
||||
followersCount: "팔로워 수"
|
||||
sentReactionsCount: "보낸 리액션 수"
|
||||
receivedReactionsCount: "받은 리액션 수"
|
||||
pollVotesCount: "투표한 횟수"
|
||||
pollVotedCount: "투표받은 횟수"
|
||||
sentReactionsCount: "반응 수"
|
||||
receivedReactionsCount: "받은 반응 수"
|
||||
pollVotesCount: "투표 수"
|
||||
pollVotedCount: "받은 투표 수"
|
||||
yes: "예"
|
||||
no: "아니오"
|
||||
driveFilesCount: "드라이브 파일 개수"
|
||||
driveFilesCount: "드라이브에 있는 파일 수"
|
||||
driveUsage: "드라이브 사용량"
|
||||
noCrawle: "검색엔진의 인덱싱 거부"
|
||||
noCrawleDescription: "검색엔진이 사용자 페이지, 노트, 페이지 등의 콘텐츠를 인덱싱하지 못하게 해요."
|
||||
@ -1200,10 +1202,10 @@ continue: "계속"
|
||||
preservedUsernames: "예약된 사용자 이름"
|
||||
preservedUsernamesDescription: "예약할 사용자 이름을 한 줄에 하나씩 입력해 주세요. 여기에서 지정한 사용자 이름으로는 계정을 생성할 수 없게 돼요. 단, 관리자 권한으로 계정을 생성할 때에는 해당되지 않으며, 이미 존재하는 계정도 영향을 받지 않아요."
|
||||
createNoteFromTheFile: "이 파일로 노트 작성"
|
||||
archive: "아카이브"
|
||||
channelArchiveConfirmTitle: "{name} 을(를) 아카이브할까요?"
|
||||
channelArchiveConfirmDescription: "아카이브한 채널은 채널 목록과 검색 결과에 표시되지 않으며, 채널에 새로운 노트를 작성할 수 없게 돼요."
|
||||
thisChannelArchived: "이 채널은 아카이브 되었어요."
|
||||
archive: "보관"
|
||||
channelArchiveConfirmTitle: "{name} 을(를) 보관할까요?"
|
||||
channelArchiveConfirmDescription: "보관한 채널은 채널 목록과 검색 결과에 표시되지 않으며, 채널에 새로운 노트를 작성할 수 없게 돼요."
|
||||
thisChannelArchived: "이 채널은 보관되었어요."
|
||||
displayOfNote: "노트 표시"
|
||||
initialAccountSetting: "초기 설정"
|
||||
youFollowing: "팔로잉"
|
||||
@ -1272,6 +1274,7 @@ showRenotes: "리노트 표시"
|
||||
edited: "편집됨"
|
||||
notificationRecieveConfig: "알림 설정"
|
||||
mutualFollow: "맞팔로우"
|
||||
followingOrFollower: "팔로 중이거나 팔로워"
|
||||
fileAttachedOnly: "미디어를 포함한 노트만"
|
||||
showRepliesToOthersInTimeline: "타임라인에 다른 사람에게 보내는 답글을 포함"
|
||||
hideRepliesToOthersInTimeline: "타임라인에 다른 사람에게 보내는 답글을 포함하지 않음"
|
||||
@ -1322,14 +1325,23 @@ soundWillBePlayed: "사운드가 재생돼요"
|
||||
showReplay: "리플레이 보기"
|
||||
replay: "리플레이"
|
||||
replaying: "리플레이 중"
|
||||
endReplay: "리플레이 종료"
|
||||
copyReplayData: "리플레이 데이터를 복사"
|
||||
ranking: "랭킹"
|
||||
lastNDays: "최근 {n}일"
|
||||
backToTitle: "타이틀로 가기"
|
||||
hemisphere: "거주 지역"
|
||||
withSensitive: "민감한 파일이 포함된 노트 표시"
|
||||
userSaysSomethingSensitive: "{name}님의 민감한 파일이 포함된 게시물"
|
||||
withSensitive: "민감한 파일이 포함된 노트 보기"
|
||||
userSaysSomethingSensitive: "{name}님의 게시물에는 민감한 파일이 포함되어 있어요"
|
||||
enableHorizontalSwipe: "밀어서 탭 전환"
|
||||
loading: "불러오는 중"
|
||||
surrender: "그만두기"
|
||||
gameRetry: "다시 시도"
|
||||
notUsePleaseLeaveBlank: "사용하지 않는 경우에는 비워두세요."
|
||||
useTotp: "일회용 비밀번호 사용"
|
||||
useBackupCode: "백업 코드 사용"
|
||||
launchApp: "앱 실행"
|
||||
useNativeUIForVideoAudioPlayer: "미디어 재생 시 브라우저 UI 사용"
|
||||
showUnreadNotificationsCount: "읽지 않은 알림 수 표시"
|
||||
showCatOnly: "고양이만 보기"
|
||||
additionalPermissionsForFlash: "Play에 대한 추가 권한"
|
||||
@ -1352,8 +1364,21 @@ _showingAnimatedImages:
|
||||
inactive: "일정 시간이 지나면 멈춤"
|
||||
_messaging:
|
||||
direct: "다이렉트 메시지"
|
||||
_delivery:
|
||||
stop: "정지됨"
|
||||
_type:
|
||||
none: "배포 중"
|
||||
_bubbleGame:
|
||||
howToPlay: "플레이 방법"
|
||||
hold: "홀드"
|
||||
_score:
|
||||
score: "점수"
|
||||
scoreYen: "번 돈"
|
||||
highScore: "최고 점수"
|
||||
maxChain: "최대 콤보 수"
|
||||
yen: "{yen}엔"
|
||||
estimatedQty: "{qty}개"
|
||||
scoreSweets: "오니기리 {onigiriQtyWithUnit}"
|
||||
_howToPlay:
|
||||
section1: "위치를 조정하여 상자에 물건을 떨어뜨려요."
|
||||
section2: "같은 종류의 물건이 붙으면 다른 물건으로 바뀌면서 점수를 얻을 수 있어요."
|
||||
@ -1364,10 +1389,10 @@ _announcement:
|
||||
needConfirmationToRead: "읽음으로 표시하기 전에 확인하기"
|
||||
needConfirmationToReadDescription: "활성화하면 이 공지사항을 읽음으로 표시하기 전에 확인 알림창을 표시해요. '모두 읽음'의 대상에서도 제외돼요."
|
||||
end: "공지 내리기"
|
||||
tooManyActiveAnnouncementDescription: "공지사항이 너무 많으면 사용자 경험에 영향을 끼칠 가능성이 있어요. 오래된 공지사항은 아카이브하는 것을 권장해요."
|
||||
tooManyActiveAnnouncementDescription: "공지사항이 너무 많으면 사용자 경험에 영향을 끼칠 가능성이 있어요. 오래된 공지사항은 보관하는 것을 권장해요."
|
||||
readConfirmTitle: "읽음으로 표시할까요?"
|
||||
readConfirmText: "\"{title}\"을(를) 읽음으로 표시해요."
|
||||
shouldNotBeUsedToPresentPermanentInfo: "신규 사용자의 사용자 경험에 악영향을 끼칠 수 있으므로, 일시적인 알림 수단으로만 사용하고 고정된 정보에는 사용을 지양하는 것을 추천해요."
|
||||
readConfirmText: "〈{title}〉의 내용을 읽음으로 표시해요."
|
||||
shouldNotBeUsedToPresentPermanentInfo: "신규 사용자의 이용 경험에 악영향을 끼칠 수 있으므로, 일시적인 알림 수단으로만 사용하고 고정된 정보에는 사용을 지양하는 것을 추천해요."
|
||||
dialogAnnouncementUxWarn: "다이얼로그 형태의 알림이 동시에 2개 이상 존재하는 경우, 사용자 경험에 악영향을 끼칠 수 있으므로 신중히 결정하는 것을 권장드려요."
|
||||
silence: "조용히 알림"
|
||||
silenceDescription: "활성화하면 공지사항에 대한 알림이 가지 않게 되며, 확인 버튼을 누르지 않아도 공지사항이 읽음으로 표시돼요."
|
||||
@ -1766,10 +1791,10 @@ _achievements:
|
||||
description: "3개 이상의 창을 열었어요"
|
||||
_driveFolderCircularReference:
|
||||
title: "순환 참조"
|
||||
description: "드라이브 폴더가 자신을 가리키도록 만드려고 시도했어요"
|
||||
description: "드라이브 폴더에 스스로를 넣었어요"
|
||||
_reactWithoutRead:
|
||||
title: "읽고 답하긴 하시는 건가요?"
|
||||
description: "100자가 넘는 노트가 작성되고 3초 안에 반응했어요"
|
||||
description: "100자가 넘는 노트를 작성한 뒤 3초 안에 반응했어요"
|
||||
_clickedClickHere:
|
||||
title: "여길 눌러보세요. 그리고 위를 쳐다보세요."
|
||||
description: "위를 보셨나요? 그렇다면 당신은 속으셨네요!"
|
||||
@ -1860,6 +1885,7 @@ _role:
|
||||
ltlAvailable: "로컬 타임라인 보이기"
|
||||
canPublicNote: "공개 노트 허용"
|
||||
canEditNote: "노트 편집 허용"
|
||||
mentionMax: "노트에서 언급할 수 있는 멘션 수"
|
||||
canInvite: "서버 초대 코드 발행"
|
||||
inviteLimit: "초대 한도"
|
||||
inviteLimitCycle: "초대 발급 간격"
|
||||
@ -1869,13 +1895,13 @@ _role:
|
||||
driveCapacity: "드라이브 용량"
|
||||
alwaysMarkNsfw: "파일을 항상 NSFW로 지정"
|
||||
pinMax: "고정할 수 있는 노트 수"
|
||||
antennaMax: "최대 안테나 생성 허용 수"
|
||||
antennaMax: "만들 수 있는 안테나 수"
|
||||
wordMuteMax: "단어 뮤트할 수 있는 문자 수"
|
||||
webhookMax: "생성할 수 있는 웹훅 수"
|
||||
clipMax: "생성할 수 있는 클립 수"
|
||||
noteEachClipsMax: "각 클립에 추가할 수 있는 노트 수"
|
||||
userListMax: "생성할 수 있는 사용자 리스트 수"
|
||||
userEachUserListsMax: "사용자 리스트당 최대 사용자 수"
|
||||
userEachUserListsMax: "사용자 리스트에 추가할 수 있는 사용자 수"
|
||||
rateLimitFactor: "요청 빈도 제한"
|
||||
descriptionOfRateLimitFactor: "작을수록 제한이 완화되고, 클수록 제한이 강화돼요."
|
||||
canHideAds: "광고 숨기기"
|
||||
@ -1883,6 +1909,7 @@ _role:
|
||||
canUseTranslator: "번역 기능 이용 가능 여부"
|
||||
avatarDecorationLimit: "최대로 붙일 수 있는 아바타 장식 개수"
|
||||
_condition:
|
||||
roleAssignedTo: "수동 역할에 이미 할당됨"
|
||||
isLocal: "로컬 사용자"
|
||||
isRemote: "리모트 사용자"
|
||||
createdLessThan: "가입한 지 다음 일수 이내인 사용자"
|
||||
@ -1958,6 +1985,7 @@ _plugin:
|
||||
installWarn: "신뢰할 수 없는 플러그인은 설치하지 않는 것이 좋아요."
|
||||
manage: "플러그인 관리"
|
||||
viewSource: "소스 보기"
|
||||
viewLog: "로그 보기"
|
||||
_preferencesBackups:
|
||||
list: "생성한 백업"
|
||||
saveNew: "새 백업 만들기"
|
||||
@ -1968,10 +1996,10 @@ _preferencesBackups:
|
||||
cannotSave: "저장하지 못했어요"
|
||||
nameAlreadyExists: "\"{name}\" 백업이 이미 있어요. 다른 이름을 설정해 주세요."
|
||||
applyConfirm: "\"{name}\" 백업을 이 기기에 적용할까요? 현재 설정은 덮어쓰기 돼요!"
|
||||
saveConfirm: "{name} 을 덮어쓸까요?"
|
||||
deleteConfirm: "{name} 을(를) 삭제할까요?"
|
||||
renameConfirm: "\"{old}\" 백업을 \"{new}\"(으)로 바꿀까요?"
|
||||
noBackups: "저장된 백업이 없어요. \"새 백업 만들기\"를 눌러 이 클라이언트 설정을 서버에 백업할 수 있어요!"
|
||||
saveConfirm: "{name} 백업을 덮어쓸까요?"
|
||||
deleteConfirm: "{name} 백업을 삭제할까요?"
|
||||
renameConfirm: "‘{old}’ 백업의 이름을 ‘{new}’(으)로 바꿀까요?"
|
||||
noBackups: "저장된 백업이 없어요. \"새 백업 만들기\"를 눌러 현재 클라이언트의 설정을 서버에 백업할 수 있어요!"
|
||||
createdAt: "생성 날짜: {date} {time}"
|
||||
updatedAt: "갱신 날짜: {date} {time}"
|
||||
cannotLoad: "가져오기에 실패했어요"
|
||||
@ -2237,8 +2265,7 @@ _2fa:
|
||||
registerTOTP: "인증 앱 설정 시작"
|
||||
step1: "먼저, {a}나 {b}등의 인증 앱을 사용 중인 디바이스에 설치해 주세요."
|
||||
step2: "인증 앱을 설치했다면, 표시되어 있는 QR 코드를 앱으로 스캔해 주세요."
|
||||
step2Click: "QR 코드를 클릭하면 기기에 설치된 인증 앱에 등록할 수 있어요."
|
||||
step2Uri: "데스크톱 앱을 사용하러면 다음 URI를 입력해 주세요:"
|
||||
step2Uri: "데스크톱 앱을 사용하려면 다음 URI를 입력해 주세요:"
|
||||
step3Title: "인증 코드 입력"
|
||||
step3: "앱에 표시된 토큰을 입력하면 완료돼요!"
|
||||
setupCompleted: "설정을 완료했어요!"
|
||||
@ -2311,7 +2338,6 @@ _permissions:
|
||||
"read:admin:server-info": "서버 정보 보기"
|
||||
"read:admin:show-moderation-log": "모더레이션 기록 보기"
|
||||
"read:admin:show-user": "사용자 개인정보 보기"
|
||||
"read:admin:show-users": "사용자 개인정보 보기"
|
||||
"write:admin:suspend-user": "사용자 정지하기"
|
||||
"write:admin:unset-user-avatar": "사용자 아바타 삭제하기"
|
||||
"write:admin:unset-user-banner": "사용자 배너 삭제하기"
|
||||
@ -2494,15 +2520,15 @@ _charts:
|
||||
storageUsageTotal: "스토리지 사용량 합계"
|
||||
_instanceCharts:
|
||||
requests: "요청"
|
||||
users: "사용자 수 증감"
|
||||
users: "사용자 수 변동"
|
||||
usersTotal: "누적 사용자 수"
|
||||
notes: "노트 수 증감"
|
||||
notes: "노트 수 변동"
|
||||
notesTotal: "누적 노트 수"
|
||||
ff: "팔로잉/팔로워 증감"
|
||||
ff: "팔로잉/팔로워 변동"
|
||||
ffTotal: "누적 팔로잉/팔로워 수"
|
||||
cacheSize: "캐시 용량 증감"
|
||||
cacheSize: "캐시 용량 변동"
|
||||
cacheSizeTotal: "누적 캐시 용량"
|
||||
files: "파일 수 증감"
|
||||
files: "파일 수 변동"
|
||||
filesTotal: "누적 파일 수"
|
||||
_timelines:
|
||||
home: "홈"
|
||||
@ -2524,6 +2550,7 @@ _play:
|
||||
title: "제목"
|
||||
script: "스크립트"
|
||||
summary: "설명"
|
||||
visibilityDescription: "비공개로 설정하면 프로필에 표시하지 않지만 URL을 아는 사람은 계속해서 접속할 수 있습니다."
|
||||
_pages:
|
||||
newPage: "페이지 만들기"
|
||||
editPage: "페이지 편집"
|
||||
@ -2568,6 +2595,8 @@ _pages:
|
||||
section: "섹션"
|
||||
image: "이미지"
|
||||
button: "버튼"
|
||||
dynamic: "동적 블록"
|
||||
dynamicDescription: "이 블록은 폐지되었습니다. 이제부터 {play}에서 이용해 주세요."
|
||||
note: "노트필기"
|
||||
_note:
|
||||
id: "노트 ID"
|
||||
@ -2599,8 +2628,10 @@ _notification:
|
||||
sendTestNotification: "테스트 알림 보내기"
|
||||
notificationWillBeDisplayedLikeThis: "알림이 이렇게 표시돼요!"
|
||||
reactedBySomeUsers: "{n}명이 반응했어요"
|
||||
likedBySomeUsers: "{n}명이 좋아요를 눌렀어요"
|
||||
renotedBySomeUsers: "{n}명이 리노트했어요"
|
||||
followedBySomeUsers: "{n}명에게 팔로우됨"
|
||||
flushNotification: "모든 알림 지우기"
|
||||
_types:
|
||||
all: "전부"
|
||||
note: "사용자의 새 게시물"
|
||||
@ -2609,7 +2640,7 @@ _notification:
|
||||
reply: "답글"
|
||||
renote: "리노트"
|
||||
quote: "인용"
|
||||
reaction: "리액션"
|
||||
reaction: "반응"
|
||||
pollEnded: "투표가 종료됨"
|
||||
receiveFollowRequest: "팔로우 요청을 받음"
|
||||
followRequestAccepted: "팔로우 요청이 승인됨"
|
||||
@ -2653,7 +2684,7 @@ _deck:
|
||||
direct: "다이렉트"
|
||||
roleTimeline: "역할 타임라인"
|
||||
_dialog:
|
||||
charactersExceeded: "최대 글자수를 초과했어요! 현재 {current} / 최대 {min}"
|
||||
charactersExceeded: "최대 글자수를 초과했어요! 현재 {current} / 최대 {max}"
|
||||
charactersBelow: "최소 글자수 미만이에요! 현재 {current} / 최소 {min}"
|
||||
_disabledTimeline:
|
||||
title: "비활성화된 타임라인"
|
||||
@ -2778,7 +2809,7 @@ _dataSaver:
|
||||
_hemisphere:
|
||||
N: "북반구"
|
||||
S: "남반구"
|
||||
caption: "일부 클라이언트에서 계절을 설정할 때 사용돼요."
|
||||
caption: "일부 클라이언트 설정에서 계절을 설정할 때 사용돼요."
|
||||
_reversi:
|
||||
reversi: "리버시"
|
||||
gameSettings: "대국 설정"
|
||||
@ -2806,24 +2837,44 @@ _reversi:
|
||||
total: "합계"
|
||||
turnCount: "{count}턴째"
|
||||
myGames: "내 대국"
|
||||
allGames: "모두의 대국"
|
||||
allGames: "모든 대국"
|
||||
ended: "종료"
|
||||
playing: "대국 중"
|
||||
isLlotheo: "돌이 적은 사람이 승리(로세오)"
|
||||
isLlotheo: "돌이 적은 쪽이 승리(로세오)"
|
||||
loopedMap: "반복 맵"
|
||||
canPutEverywhere: "어디에나 둘 수 있는 모드"
|
||||
timeLimitForEachTurn: "1턴의 시간 제한"
|
||||
freeMatch: "프리 매치"
|
||||
lookingForPlayer: "대전 상대를 찾고 있어요"
|
||||
timeLimitForEachTurn: "각 수의 시간 제한"
|
||||
freeMatch: "자유 대국"
|
||||
lookingForPlayer: "대국 상대를 찾고 있어요"
|
||||
gameCanceled: "대국이 취소되었어요"
|
||||
shareToTlTheGameWhenStart: "대국 시작 시 타임라인에 대국 게시하기"
|
||||
iStartedAGame: "대국이 시작되었어요! #MisskeyReversi"
|
||||
opponentHasSettingsChanged: "상대방이 게임 설정을 변경했어요"
|
||||
allowIrregularRules: "변칙 허용(완전 자유)"
|
||||
disallowIrregularRules: "변칙 없음"
|
||||
allowIrregularRules: "규칙 변경 허용(완전 자유)"
|
||||
disallowIrregularRules: "규칙 변경 없음"
|
||||
showBoardLabels: "판에 행·열 번호 표시"
|
||||
useAvatarAsStone: "돌을 아이콘으로 표시"
|
||||
_offlineScreen:
|
||||
title: "오프라인 - 서버에 연결할 수 없음"
|
||||
header: "서버에 연결할 수 없어요"
|
||||
_urlPreviewSetting:
|
||||
title: "URL 미리보기 설정"
|
||||
enable: "URL 미리보기 활성화"
|
||||
timeout: "미리보기를 불러올 때의 타임아웃 (ms)"
|
||||
timeoutDescription: "미리보기를 로딩하는데 걸리는 시간이 지정한 시간보다 오래 걸리면 미리보기를 생성하지 않아요."
|
||||
maximumContentLength: "Content-Length의 최대치 (byte)"
|
||||
maximumContentLengthDescription: "Content-Length가 이 값을 넘어서면 미리보기를 생성하지 않아요."
|
||||
requireContentLength: "Content-Length를 반환했을 때만 미리보기 만들기"
|
||||
requireContentLengthDescription: "원격 서버가 Content-Length를 반환하지 않는다면 미리보기를 만들지 않아요."
|
||||
userAgent: "User-Agent"
|
||||
userAgentDescription: "미리보기를 얻을 때 사용한 User-Agent를 설정해요. 비어 있다면 기본값의 User-Agent를 사용해요."
|
||||
summaryProxy: "미리보기를 만든 프록시의 엔드포인트"
|
||||
summaryProxyDescription: "CherryPick에서 미리보기를 만들지 않고 Summary Proxy를 경유해 미리보기를 만들어요."
|
||||
summaryProxyDescription2: "프록시는 아래 변수를 쿼리 문자열로 연동해요. 프록시에서 이를 지원하지 않으면 설정값을 무시해요."
|
||||
_mediaControls:
|
||||
pip: "화면 속 화면"
|
||||
playbackRate: "재생 속도"
|
||||
loop: "반복 재생"
|
||||
_abuse:
|
||||
_resolver:
|
||||
1hour: "1시간"
|
||||
|
@ -395,6 +395,10 @@ searchByGoogle: "ຄົ້ນຫາ"
|
||||
file: "ໄຟລ໌"
|
||||
replies: "ຕອບໄປທີ"
|
||||
renotes: "Renote"
|
||||
_delivery:
|
||||
stop: "ໂຈະ"
|
||||
_type:
|
||||
none: "ການພິມເຜີຍແຜ່"
|
||||
_role:
|
||||
_priority:
|
||||
middle: "ປານກາງ"
|
||||
@ -467,4 +471,3 @@ _webhookSettings:
|
||||
name: "ຊື່"
|
||||
_moderationLogTypes:
|
||||
suspend: "ລະງັບ"
|
||||
|
||||
|
@ -429,6 +429,10 @@ loggedInAsBot: "Momenteel als bot ingelogd"
|
||||
icon: "Avatar"
|
||||
replies: "Antwoord"
|
||||
renotes: "Herdelen"
|
||||
_delivery:
|
||||
stop: "Opgeschort"
|
||||
_type:
|
||||
none: "Publiceren"
|
||||
_email:
|
||||
_follow:
|
||||
title: "volgde jou"
|
||||
@ -498,4 +502,3 @@ _webhookSettings:
|
||||
_moderationLogTypes:
|
||||
suspend: "Opschorten"
|
||||
resetPassword: "Wachtwoord terugzetten"
|
||||
|
||||
|
@ -464,6 +464,8 @@ icon: "Avatar"
|
||||
replies: "Svar"
|
||||
renotes: "Renote"
|
||||
surrender: "Avbryt"
|
||||
_delivery:
|
||||
stop: "Suspendert"
|
||||
_initialAccountSetting:
|
||||
theseSettingsCanEditLater: "Du kan endre disse innstillingene senere."
|
||||
_achievements:
|
||||
@ -723,4 +725,3 @@ _webhookSettings:
|
||||
name: "Navn"
|
||||
_moderationLogTypes:
|
||||
suspend: "Suspender"
|
||||
|
||||
|
@ -20,6 +20,7 @@ noNotes: "Brak wpisów"
|
||||
noNotifications: "Brak powiadomień"
|
||||
instance: "Instancja"
|
||||
settings: "Ustawienia"
|
||||
notificationSettings: "Powiadomienia"
|
||||
basicSettings: "Podstawowe ustawienia"
|
||||
otherSettings: "Pozostałe ustawienia"
|
||||
openInWindow: "Otwórz w oknie"
|
||||
@ -44,13 +45,20 @@ pin: "Przypnij do profilu"
|
||||
unpin: "Odepnij z profilu"
|
||||
copyContent: "Skopiuj zawartość"
|
||||
copyLink: "Skopiuj odnośnik"
|
||||
copyLinkRenote: "Skopiuj link renote'a"
|
||||
delete: "Usuń"
|
||||
deleteAndEdit: "Usuń i edytuj"
|
||||
deleteAndEditConfirm: "Czy na pewno chcesz usunąć ten wpis i zedytować go? Utracisz wszystkie reakcje, udostępnienia i odpowiedzi do tego wpisu."
|
||||
addToList: "Dodaj do listy"
|
||||
addToAntenna: "Dodaj do anteny"
|
||||
sendMessage: "Wyślij wiadomość"
|
||||
copyRSS: "Kopiuj RSS"
|
||||
copyUsername: "Kopiuj nazwę użytkownika"
|
||||
copyUserId: "Kopiuj ID użytkownika"
|
||||
copyNoteId: "Kopiuj ID notatki"
|
||||
copyFileId: "Kopiuj ID pliku"
|
||||
copyFolderId: "Kopiuj ID folderu"
|
||||
copyProfileUrl: "Kopiuj URL profilu"
|
||||
searchUser: "Wyszukiwanie użytkowników"
|
||||
reply: "Odpowiedz"
|
||||
loadMore: "Załaduj więcej"
|
||||
@ -103,6 +111,8 @@ renoted: "Udostępniono."
|
||||
cantRenote: "Ten wpis nie może zostać udostępniony."
|
||||
cantReRenote: "Udostępnienie nie może zostać udostępnione."
|
||||
quote: "Cytuj"
|
||||
inChannelRenote: "Renote tylko na kanale"
|
||||
inChannelQuote: "Cytat tylko na kanale"
|
||||
pinnedNote: "Przypięty wpis"
|
||||
pinned: "Przypnij do profilu"
|
||||
you: "Ty"
|
||||
@ -111,14 +121,23 @@ sensitive: "NSFW"
|
||||
add: "Dodaj"
|
||||
reaction: "Reakcja"
|
||||
reactions: "Reakcja"
|
||||
emojiPicker: "Selektor Emoji"
|
||||
pinnedEmojisForReactionSettingDescription: "Ustaw emotikony które powinny być przypięte i od razu wyświetlone podczas reagowania."
|
||||
pinnedEmojisSettingDescription: "Ustaw emotikony które powinny być przypięte i wyświetlone podczas przeglądania selektora Emoji"
|
||||
emojiPickerDisplay: "Wyświetlanie selektora Emoji"
|
||||
overwriteFromPinnedEmojisForReaction: "Zastąp z ustawień reakcji"
|
||||
overwriteFromPinnedEmojis: "Zastąp z ogólnych ustawień"
|
||||
reactionSettingDescription2: "Przeciągnij aby zmienić kolejność, naciśnij aby usunąć, naciśnij „+” aby dodać"
|
||||
rememberNoteVisibility: "Zapamiętuj ustawienia widoczności wpisu"
|
||||
attachCancel: "Usuń załącznik"
|
||||
deleteFile: "Usuń plik"
|
||||
markAsSensitive: "Oznacz jako NSFW"
|
||||
unmarkAsSensitive: "Cofnij NSFW"
|
||||
enterFileName: "Wprowadź nazwę pliku"
|
||||
mute: "Wycisz"
|
||||
unmute: "Cofnij wyciszenie"
|
||||
renoteMute: "Wycisz renote'y"
|
||||
renoteUnmute: "Wyłącz wyciszenie renote'ów"
|
||||
block: "Zablokuj"
|
||||
unblock: "Odblokuj"
|
||||
suspend: "Zawieś"
|
||||
@ -128,8 +147,10 @@ unblockConfirm: "Czy na pewno chcesz odblokować to konto?"
|
||||
suspendConfirm: "Czy na pewno chcesz zawiesić to konto?"
|
||||
unsuspendConfirm: "Czy na pewno chcesz cofnąć zawieszenie tego konta?"
|
||||
selectList: "Wybierz listę"
|
||||
editList: "Edytuj listę"
|
||||
selectChannel: "Wybierz kanał"
|
||||
selectAntenna: "Wybierz Antennę"
|
||||
editAntenna: "Edytuj antenę"
|
||||
selectWidget: "Wybierz widżet"
|
||||
editWidgets: "Edytuj widżety"
|
||||
editWidgetsExit: "Gotowe"
|
||||
@ -142,11 +163,15 @@ addEmoji: "Dodaj emoji"
|
||||
settingGuide: "Proponowana konfiguracja"
|
||||
cacheRemoteFiles: "Przechowuj zdalne pliki w pamięci podręcznej"
|
||||
cacheRemoteFilesDescription: "Gdy ta opcja jest wyłączona, zdalne pliki są ładowane bezpośrednio ze zdalnych instancji. Wyłączenie the opcji zmniejszy użycie powierzchni dyskowej, ale zwiększy transfer, ponieważ miniaturki nie będą generowane."
|
||||
youCanCleanRemoteFilesCache: "Możesz wyczyścić cache poprzez kliknięcie przycisku 🗑️ w widoku menedżera plików."
|
||||
cacheRemoteSensitiveFiles: "Przechowuj wrażliwe zdalne pliki w pamięci podręcznej"
|
||||
cacheRemoteSensitiveFilesDescription: "Gdy ta opcja jest wyłączona, wrażliwe pliki zdalne są wczytywane bezpośrednio ze zdalnej instancji bez cacheowania."
|
||||
flagAsBot: "To konto jest botem"
|
||||
flagAsBotDescription: "Jeżeli ten kanał jest kontrolowany przez jakiś program, ustaw tę opcję. Jeżeli włączona, będzie działać jako flaga informująca innych programistów, aby zapobiegać nieskończonej interakcji z różnymi botami i dostosowywać wewnętrzne systemy CherryPick, traktując konto jako bota."
|
||||
flagAsCat: "To konto jest kotem"
|
||||
flagAsCatDescription: "Przełącz tę opcję, aby konto było oznaczone jako kot."
|
||||
flagShowTimelineReplies: "Pokazuj odpowiedzi na osi czasu"
|
||||
flagShowTimelineRepliesDescription: "Gdy włączone, pokazuje odpowiedzi użytkowników na notatki innych użytkowników w osi czasu."
|
||||
autoAcceptFollowed: "Automatycznie przyjmuj prośby o możliwość obserwacji od użytkowników, których obserwujesz"
|
||||
addAccount: "Dodaj konto"
|
||||
reloadAccountsList: "Odśwież listę kont"
|
||||
@ -176,6 +201,7 @@ perHour: "co godzinę"
|
||||
perDay: "co dzień"
|
||||
stopActivityDelivery: "Przestań przesyłać aktywności"
|
||||
blockThisInstance: "Zablokuj tę instancję"
|
||||
silenceThisInstance: "Wycisz tę instancję"
|
||||
operations: "Działania"
|
||||
software: "Oprogramowanie"
|
||||
version: "Wersja"
|
||||
@ -195,6 +221,8 @@ clearCachedFiles: "Wyczyść pamięć podręczną"
|
||||
clearCachedFilesConfirm: "Czy na pewno chcesz usunąć wszystkie zdalne pliki z pamięci podręcznej?"
|
||||
blockedInstances: "Zablokowane instancje"
|
||||
blockedInstancesDescription: "Wypisz nazwy hostów instancji, które powinny zostać zablokowane. Wypisane instancje nie będą mogły dłużej komunikować się z tą instancją."
|
||||
silencedInstances: "Wyciszone instancje"
|
||||
silencedInstancesDescription: "Wypisz nazwy hostów instancji, które chcesz wyciszyć. Wszystkie konta wymienionych instancji będą traktowane jako wyciszone, będą mogły jedynie wysyłać prośby o obserwację i nie będą mogły wspominać kont lokalnych, jeśli nie będą obserwowane. Nie będzie to miało wpływu na zablokowane instancje."
|
||||
muteAndBlock: "Wycisz / Zablokuj"
|
||||
mutedUsers: "Wyciszeni użytkownicy"
|
||||
blockedUsers: "Zablokowani użytkownicy"
|
||||
@ -239,10 +267,12 @@ removed: "Pomyślnie usunięto"
|
||||
removeAreYouSure: "Czy na pewno chcesz usunąć „{x}”?"
|
||||
deleteAreYouSure: "Czy na pewno chcesz usunąć „{x}”?"
|
||||
resetAreYouSure: "Czy na pewno chcesz zresetować?"
|
||||
areYouSure: "Na pewno?"
|
||||
saved: "Zapisano"
|
||||
messaging: "Wiadomości"
|
||||
upload: "Wyślij"
|
||||
keepOriginalUploading: "Zachowaj oryginalny obraz"
|
||||
keepOriginalUploadingDescription: "Zapisuje oryginalnie przesłany obraz w niezmienionej postaci. Jeśli ta opcja jest wyłączona, po przesłaniu zostanie wygenerowana wersja do wyświetlenia w Internecie."
|
||||
fromDrive: "Z dysku"
|
||||
fromUrl: "Z adresu URL"
|
||||
uploadFromUrl: "Wyślij z adresu URL"
|
||||
@ -255,7 +285,10 @@ noMoreHistory: "Nie ma dalszej historii"
|
||||
startMessaging: "Rozpocznij czat"
|
||||
nUsersRead: "przeczytano przez {n}"
|
||||
agreeTo: "Wyrażam zgodę na {0}"
|
||||
agree: "Zatwierdź"
|
||||
agreeBelow: "Zaakceptuj poniżej"
|
||||
basicNotesBeforeCreateAccount: "Ważne notatki"
|
||||
termsOfService: "Warunki usługi"
|
||||
start: "Rozpocznij"
|
||||
home: "Strona główna"
|
||||
remoteUserCaution: "Te informacje mogą nie być aktualne, ponieważ użytkownik pochodzi ze zdalnej instancji."
|
||||
@ -285,6 +318,7 @@ folderName: "Nazwa katalogu"
|
||||
createFolder: "Utwórz katalog"
|
||||
renameFolder: "Zmień nazwę katalogu"
|
||||
deleteFolder: "Usuń ten katalog"
|
||||
folder: "Folder"
|
||||
addFile: "Dodaj plik"
|
||||
emptyDrive: "Dysk jest pusty"
|
||||
emptyFolder: "Ten katalog jest pusty"
|
||||
@ -298,6 +332,7 @@ copyUrl: "Skopiuj adres URL"
|
||||
rename: "Zmień nazwę"
|
||||
avatar: "Awatar"
|
||||
banner: "Baner"
|
||||
displayOfSensitiveMedia: "Wyświetlanie wrażliwej zawartości"
|
||||
whenServerDisconnected: "Po utracie połączenia z serwerem"
|
||||
disconnectedFromServer: "Utracono połączenie z serwerem."
|
||||
reload: "Odśwież"
|
||||
@ -345,8 +380,11 @@ hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Włącz hCaptcha"
|
||||
hcaptchaSiteKey: "Klucz strony"
|
||||
hcaptchaSecretKey: "Tajny klucz"
|
||||
mcaptcha: "mCaptcha"
|
||||
enableMcaptcha: "Włącz mCaptcha"
|
||||
mcaptchaSiteKey: "Klucz strony"
|
||||
mcaptchaSecretKey: "Tajny klucz"
|
||||
mcaptchaInstanceUrl: "URL instancji mCaptcha"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "Włącz reCAPTCHA"
|
||||
recaptchaSiteKey: "Klucz strony"
|
||||
@ -389,15 +427,19 @@ aboutMisskey: "O CherryPick"
|
||||
administrator: "Admin"
|
||||
token: "Token"
|
||||
2fa: "Klucz 2FA "
|
||||
setupOf2fa: "Skonfiguruj dwuetapową autentykację"
|
||||
totp: "Klucz aplikacji uwierzytelniającej (totp)"
|
||||
totpDescription: "Opis klucza czasowego"
|
||||
moderator: "Moderator"
|
||||
moderation: "Moderacja"
|
||||
moderationNote: "Notka moderacyjna"
|
||||
addModerationNote: "Dodaj notkę moderacyjną"
|
||||
moderationLogs: "Logi moderacyjne"
|
||||
nUsersMentioned: "{n} wspomnianych użytkowników"
|
||||
securityKeyAndPasskey: "Klucz bezpieczeństwa i klucze Passkey"
|
||||
securityKey: "Klucz bezpieczeństwa"
|
||||
lastUsed: "Ostatnio używane"
|
||||
lastUsedAt: "Ostatnio używane w"
|
||||
lastUsedAt: "Ostatnio używane: {t}"
|
||||
unregister: "Cofnij rejestrację"
|
||||
passwordLessLogin: "Skonfiguruj logowanie bez użycia hasła"
|
||||
passwordLessLoginDescription: "Opis logowania bez użycia hasła"
|
||||
@ -463,8 +505,12 @@ native: "Natywny"
|
||||
disableDrawer: "Nie używaj menu w stylu szuflady"
|
||||
youHaveNoGroups: "Nie masz żadnych grup"
|
||||
joinOrCreateGroup: "Uzyskaj zaproszenie do dołączenia do grupy lub utwórz własną grupę."
|
||||
showNoteActionsOnlyHover: "Pokazuj akcje notatek tylko po najechaniu myszką"
|
||||
showReactionsCount: "Wyświetl liczbę reakcji na notatkę"
|
||||
noHistory: "Brak historii"
|
||||
signinHistory: "Historia logowania"
|
||||
enableAdvancedMfm: "Włącz zaawansowane MFM"
|
||||
enableAnimatedMfm: "Włącz animowane MFM"
|
||||
doing: "Przetwarzanie..."
|
||||
category: "Kategoria"
|
||||
tags: "Tagi"
|
||||
@ -473,6 +519,8 @@ createAccount: "Utwórz konto"
|
||||
existingAccount: "Istniejące konto"
|
||||
regenerate: "Wygeneruj ponownie"
|
||||
fontSize: "Rozmiar czcionki"
|
||||
mediaListWithOneImageAppearance: "Wysokość list multimediów z tylko jednym obrazem"
|
||||
limitTo: "Limituj do {x}"
|
||||
noFollowRequests: "Nie masz żadnych oczekujących próśb o możliwość obserwacji"
|
||||
openImageInNewTab: "Otwórz obraz w nowej karcie"
|
||||
dashboard: "Kokpit"
|
||||
@ -492,6 +540,7 @@ showFeaturedNotesInTimeline: "Pokazuj wyróżnione wpisy w osi czasu"
|
||||
objectStorage: "Pamięć obiektowa"
|
||||
useObjectStorage: "Używaj pamięci obiektowej"
|
||||
objectStorageBaseUrl: "Podstawowy URL"
|
||||
objectStorageBaseUrlDesc: "Adres URL używany jako odniesienie. Podaj adres URL swojego CDN lub Proxy, gdy używasz któregokolwiek z nich.\nDla S3 użyj 'https://<bucket>.s3.amazonaws.com' a dla GCS lub równej usługi użyj 'https://storage.googleapis.com/<bucket>', itd."
|
||||
objectStorageBucket: "Bucket"
|
||||
objectStorageBucketDesc: "Podaj nazwę „wiadra” używaną przez konfigurowaną usługę."
|
||||
objectStoragePrefix: "Prefiks"
|
||||
@ -504,9 +553,13 @@ objectStorageUseSSL: "Użyj SSL"
|
||||
objectStorageUseSSLDesc: "Wyłącz, jeżeli nie zamierzasz używać HTTPS dla połączenia z API"
|
||||
objectStorageUseProxy: "Połącz przez proxy"
|
||||
objectStorageUseProxyDesc: "Wyłącz, jeżeli nie zamierzasz używać proxy dla połączenia z pamięcią blokową"
|
||||
objectStorageSetPublicRead: "Ustaw opcję \"public-read\" przy przesyłaniu"
|
||||
s3ForcePathStyleDesc: "Jeśli opcja s3ForcePathStyle jest włączona, nazwa Bucket'u musi być zawarta w ścieżce adresu URL, a nie w nazwie hosta adresu URL. Włączenie tego ustawienia może być konieczne w przypadku użycia usług takich jak self-hosted instancja Minio."
|
||||
serverLogs: "Dziennik zdarzeń"
|
||||
deleteAll: "Usuń wszystkie"
|
||||
showFixedPostForm: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
|
||||
showFixedPostFormInChannel: "Wyświetl formularz postowania w górnej części osi czasu (Kanały)"
|
||||
withRepliesByDefaultForNewlyFollowed: "Domyślnie uwzględnij odpowiedzi nowo obserwowanych użytkowników w osi czasu"
|
||||
newNoteRecived: "Masz nowy wpis"
|
||||
sounds: "Dźwięk"
|
||||
sound: "Dźwięki"
|
||||
@ -516,6 +569,8 @@ showInPage: "Pokaż na stronie"
|
||||
popout: "Popout"
|
||||
volume: "Głośność"
|
||||
masterVolume: "Głośność główna"
|
||||
notUseSound: "Wyłącz dźwięk"
|
||||
useSoundOnlyWhenActive: "Puszczaj dźwięki tylko, gdy CherryPick jest aktywne."
|
||||
details: "Szczegóły"
|
||||
chooseEmoji: "Wybierz emoji"
|
||||
unableToProcess: "Nie udało się dokończyć działania."
|
||||
@ -536,6 +591,10 @@ output: "Wyjście"
|
||||
script: "Skrypt"
|
||||
disablePagesScript: "Wyłącz AiScript na Stronach"
|
||||
updateRemoteUser: "Aktualizuj zdalne dane o użytkowniku"
|
||||
unsetUserAvatar: "Usuń awatar"
|
||||
unsetUserAvatarConfirm: "Czy na pewno chcesz usunąć awatar tego użytkownika?"
|
||||
unsetUserBanner: "Usuń baner"
|
||||
unsetUserBannerConfirm: "Czy na pewno chcesz usunąć baner?"
|
||||
deleteAllFiles: "Usuń wszystkie pliki"
|
||||
deleteAllFilesConfirm: "Czy na pewno chcesz usunąć wszystkie pliki?"
|
||||
removeAllFollowing: "Przestań obserwować"
|
||||
@ -551,6 +610,7 @@ accountDeletedDescription: "Opis konta usuniętego"
|
||||
menu: "Menu"
|
||||
divider: "Rozdzielacz"
|
||||
addItem: "Dodaj element"
|
||||
rearrange: "Posortuj"
|
||||
relays: "Przekaźniki"
|
||||
addRelay: "Dodaj przekaźnik"
|
||||
inboxUrl: "Adres URL skrzynki nadawczej"
|
||||
@ -585,6 +645,7 @@ medium: "Średnie"
|
||||
small: "Małe"
|
||||
generateAccessToken: "Generuj token dostępu"
|
||||
permission: "Uprawnienia"
|
||||
adminPermission: "Uprawnienia administracyjne"
|
||||
enableAll: "Włącz wszystko"
|
||||
disableAll: "Wyłącz wszystko"
|
||||
tokenRequested: "Przydziel dostęp do konta"
|
||||
@ -602,9 +663,12 @@ smtpPort: "Port"
|
||||
smtpUser: "Nazwa użytkownika"
|
||||
smtpPass: "Hasło"
|
||||
emptyToDisableSmtpAuth: "Pozostaw adres e-mail i hasło puste, aby wyłączyć weryfikację SMTP"
|
||||
smtpSecure: "Użyj niejawnego SSL/TLS dla połączeń SMTP"
|
||||
smtpSecureInfo: "Wyłącz, jeżeli używasz STARTTLS"
|
||||
testEmail: "Przetestuj dostarczanie wiadomości e-mail"
|
||||
wordMute: "Wyciszenie słowa"
|
||||
regexpError: "Błąd wyrażenia regularnego"
|
||||
regexpErrorDescription: "Wystąpił błąd w wyrażeniu regularnym w linii {line} twoich {tab} wyciszeń:"
|
||||
instanceMute: "Wyciszone instancje"
|
||||
userSaysSomething: "{name} powiedział(-a) coś"
|
||||
makeActive: "Aktywuj"
|
||||
@ -624,18 +688,22 @@ useGlobalSettingDesc: "Jeżeli włączone, zostaną wykorzystane ustawienia powi
|
||||
other: "Inne"
|
||||
regenerateLoginToken: "Generuj token logowania ponownie"
|
||||
regenerateLoginTokenDescription: "Regeneruje token używany wewnętrznie podczas logowania. Zazwyczaj nie jest to konieczne. Po regeneracji wszystkie urządzenia zostaną wylogowane."
|
||||
theKeywordWhenSearchingForCustomEmoji: "To jest słowo kluczowe używane podczas wyszukiwania customowych Emoji."
|
||||
setMultipleBySeparatingWithSpace: "Możesz ustawić wiele, oddzielając je spacjami."
|
||||
fileIdOrUrl: "ID pliku albo URL"
|
||||
behavior: "Zachowanie"
|
||||
sample: "Przykład"
|
||||
abuseReports: "Zgłoszenia"
|
||||
reportAbuse: "Zgłoś"
|
||||
reportAbuseRenote: "Zgłoś renote"
|
||||
reportAbuseOf: "Zgłoś {name}"
|
||||
fillAbuseReportDescription: "Wypełnij szczegóły zgłoszenia. Jeżeli dotyczy ono określonego wpisu, uwzględnij jego adres URL."
|
||||
abuseReported: "Twoje zgłoszenie zostało wysłane. Dziękujemy."
|
||||
reporter: "Zgłaszający"
|
||||
reporteeOrigin: "Pochodzenie zgłoszonego"
|
||||
reporterOrigin: "Pochodzenie zgłaszającego"
|
||||
forwardReport: "Przekaż zgłoszenie do innej instancji"
|
||||
forwardReportIsAnonymous: "Zamiast twojego konta, anonimowe konto systemowe będzie wyświetlone jako zgłaszający na instancji zdalnej."
|
||||
send: "Wyślij"
|
||||
abuseMarkAsResolved: "Oznacz zgłoszenie jako rozwiązane"
|
||||
openInNewTab: "Otwórz w nowej karcie"
|
||||
@ -680,6 +748,7 @@ lockedAccountInfo: "Dopóki nie ustawisz widoczności wpisu na \"Obserwujący\",
|
||||
alwaysMarkSensitive: "Oznacz domyślnie jako NSFW"
|
||||
loadRawImages: "Wyświetlaj zdjęcia w załącznikach w całości zamiast miniatur"
|
||||
disableShowingAnimatedImages: "Nie odtwarzaj animowanych obrazów"
|
||||
highlightSensitiveMedia: "Podkreśl wrażliwą zawartość"
|
||||
verificationEmailSent: "Wiadomość weryfikacyjna została wysłana. Odwiedź uwzględniony odnośnik, aby ukończyć weryfikację."
|
||||
notSet: "Nie ustawiono"
|
||||
emailVerified: "Adres e-mail został potwierdzony"
|
||||
@ -690,6 +759,8 @@ contact: "Kontakt"
|
||||
useSystemFont: "Używaj domyślnej czcionki systemu"
|
||||
clips: "Klipy"
|
||||
experimentalFeatures: "Eksperymentalne funkcje"
|
||||
experimental: "Eksperymentalne"
|
||||
thisIsExperimentalFeature: "Ta funkcja jest eksperymentalna. Jej funkcjonalność może ulec zmianie, i może ona nie funkcjonować tak, jak zamierzono."
|
||||
developer: "Programista"
|
||||
makeExplorable: "Pokazuj konto na stronie „Eksploruj”"
|
||||
makeExplorableDescription: "Jeżeli wyłączysz tę opcję, Twoje konto nie będzie wyświetlać się w sekcji „Eksploruj”."
|
||||
@ -707,12 +778,14 @@ onlineUsersCount: "{n} osób jest online"
|
||||
nUsers: "{n} użytkowników"
|
||||
nNotes: "{n} wpisów"
|
||||
sendErrorReports: "Wyślij raporty o błędach"
|
||||
sendErrorReportsDescription: "Gdy włączone, jeśli wystąpi problem, szczegółowe informacje o błędach będą udostępniane CherryPick, pomagając ulepszyć jakość CherryPick.\nBędzie to zawierało informacje takie jak wersja twojego systemu operacyjnego, jakiej przeglądarki używasz, twoja aktywność w CherryPick, itd."
|
||||
myTheme: "Mój motyw"
|
||||
backgroundColor: "Tło"
|
||||
accentColor: "Akcent"
|
||||
textColor: "Tekst"
|
||||
saveAs: "Zapisz jako…"
|
||||
advanced: "Zaawansowane"
|
||||
advancedSettings: "Zaawansowane ustawienia"
|
||||
value: "Wartość"
|
||||
createdAt: "Utworzono"
|
||||
updatedAt: "Zaktualizowano"
|
||||
@ -772,12 +845,14 @@ noMaintainerInformationWarning: "Informacje o administratorze nie są skonfiguro
|
||||
noBotProtectionWarning: "Zabezpieczenie przed botami nie jest skonfigurowane."
|
||||
configure: "Skonfiguruj"
|
||||
postToGallery: "Opublikuj w galerii"
|
||||
postToHashtag: "Postuj do tego hashtagu"
|
||||
gallery: "Galeria"
|
||||
recentPosts: "Ostatnie wpisy"
|
||||
popularPosts: "Popularne wpisy"
|
||||
shareWithNote: "Udostępnij z wpisem"
|
||||
ads: "Reklamy"
|
||||
expiration: "Ankieta kończy się"
|
||||
startingperiod: "Początek"
|
||||
memo: "Notatki"
|
||||
priority: "Priorytet"
|
||||
high: "Wysoki"
|
||||
@ -804,13 +879,19 @@ translatedFrom: "Przetłumaczone z {x}"
|
||||
accountDeletionInProgress: "Trwa usuwanie konta"
|
||||
usernameInfo: "Nazwa, która identyfikuje Twoje konto spośród innych na tym serwerze. Możesz użyć alfabetu (a~z, A~Z), cyfr (0~9) lub podkreślników (_). Nazwy użytkownika nie mogą być później zmieniane."
|
||||
aiChanMode: "Tryb Ai"
|
||||
devMode: "Tryb programisty"
|
||||
keepCw: "Zostaw ostrzeżenia o zawartości"
|
||||
pubSub: "Konta Pub/Sub"
|
||||
lastCommunication: "Ostatnia komunikacja"
|
||||
resolved: "Rozwiązane"
|
||||
unresolved: "Nierozwiązane"
|
||||
breakFollow: "Usuń obserwującego"
|
||||
breakFollowConfirm: "Czy na pewno usunąć tego obserwującego?"
|
||||
itsOn: "Włączone"
|
||||
itsOff: "Wyłączone"
|
||||
on: "Włączone"
|
||||
off: "Wyłączone"
|
||||
emailRequiredForSignup: "Wymagaj adresu e-mail do rejestracji"
|
||||
unread: "Nieodczytane"
|
||||
filter: "Filtr"
|
||||
controlPanel: "Panel sterowania"
|
||||
@ -820,6 +901,8 @@ makeReactionsPublicDescription: "To spowoduje, że lista wszystkich Twoich dotyc
|
||||
classic: "Klasyczny"
|
||||
muteThread: "Wycisz wątek"
|
||||
unmuteThread: "Wyłącz wyciszenie wątku"
|
||||
followingVisibility: "Widoczność obserwacji"
|
||||
followersVisibility: "Widoczność obserwujących"
|
||||
continueThread: "Pokaż kontynuację wątku"
|
||||
deleteAccountConfirm: "Spowoduje to nieodwracalne usunięcie Twojego konta. Kontynuować?"
|
||||
incorrectPassword: "Nieprawidłowe hasło."
|
||||
@ -834,9 +917,14 @@ overridedDeviceKind: "Typ urządzenia"
|
||||
smartphone: "Smartfon"
|
||||
tablet: "Tablet"
|
||||
auto: "Automatycznie"
|
||||
themeColor: "Motyw kolorystyczny"
|
||||
size: "Rozmiar"
|
||||
numberOfColumn: "Liczba kolumn"
|
||||
searchByGoogle: "Szukaj"
|
||||
instanceDefaultLightTheme: "Domyślny motyw dla trybu jasnego"
|
||||
instanceDefaultDarkTheme: "Domyślny motyw dla trybu ciemnego"
|
||||
instanceDefaultThemeDescription: "Opis domyślnego motywu instancji"
|
||||
mutePeriod: "Okres wyciszenia"
|
||||
period: "Ankieta kończy się"
|
||||
indefinitely: "Nigdy"
|
||||
tenMinutes: "10 minut"
|
||||
@ -845,29 +933,50 @@ oneDay: "1 dzień"
|
||||
oneWeek: "1 tydzień"
|
||||
oneMonth: "jeden miesiąc"
|
||||
failedToFetchAccountInformation: "Nie udało się uzyskać informacji o koncie"
|
||||
rateLimitExceeded: "Limit szybkości przekroczony"
|
||||
cropImage: "Przytnij obraz"
|
||||
cropImageAsk: "Czy chcesz przyciąć obrazek?"
|
||||
cropYes: "Tak, przytnij"
|
||||
cropNo: "Nie chce przycinać"
|
||||
file: "Pliki"
|
||||
recentNHours: "W ciągu ostatnich {n} godzin"
|
||||
recentNDays: "W ciągu ostatnich {n} dni"
|
||||
noEmailServerWarning: "Serwer Email nie jest skonfigurowany"
|
||||
recommended: "Zalecane"
|
||||
check: "Zweryfikuj"
|
||||
driveCapOverrideLabel: "Zmień limit pojemności dysku użytkownika"
|
||||
requireAdminForView: "Aby to zobaczyć, musisz być administratorem"
|
||||
isSystemAccount: "To jest konto stworzone i zarządzane przez system"
|
||||
typeToConfirm: "Wprowadź {x}, aby potwierdzić"
|
||||
deleteAccount: "Usuń konto"
|
||||
document: "Dokumentacja"
|
||||
numberOfPageCache: "Ilość stron w cache"
|
||||
numberOfPageCacheDescription: "Zwiększenie tej liczby polepszy wygodę, ale spowoduje większe obciążenie jako użycie pamięci na urządzeniu użytkownika."
|
||||
logoutConfirm: "Czy na pewno chcesz się wylogować?"
|
||||
lastActiveDate: "Ostatnio użyte w"
|
||||
statusbar: "Pasek stanu"
|
||||
pleaseSelect: "Wybierz opcję"
|
||||
reverse: "Odwróć"
|
||||
colored: "Kolorowe"
|
||||
refreshInterval: "Okres aktualizacji"
|
||||
label: "Etykieta"
|
||||
type: "Typ"
|
||||
speed: "Prędkość"
|
||||
slow: "Wolny"
|
||||
fast: "Szybki"
|
||||
sensitiveMediaDetection: "Detekcja wrażliwej zawartości"
|
||||
localOnly: "Lokalne tylko"
|
||||
remoteOnly: "Tylko zdalne instancje"
|
||||
failedToUpload: "Przesyłanie nie powiodło się"
|
||||
cannotUploadBecauseInappropriate: "Nie można przesłać tego pliku, ponieważ jego części zostały wykryte jako potencjalnie nieodpowiednie."
|
||||
cannotUploadBecauseNoFreeSpace: "Przesyłanie nie powiodło się z powodu braku miejsca na dysku."
|
||||
cannotUploadBecauseExceedsFileSizeLimit: "Nie można przesłać pliku, ponieważ wykracza on poza limit wielkości pliku."
|
||||
beta: "Beta"
|
||||
enableAutoSensitive: "Automatyczne oznaczanie NSFW"
|
||||
enableAutoSensitiveDescription: "Umożliwia automatyczne wykrywanie i oznaczanie zawartości NSFW za pomocą uczenia maszynowego. Nawet jeśli ta opcja jest wyłączona, może być włączona w całej instancji."
|
||||
activeEmailValidationDescription: "Włącza bardziej restrykcyjną walidację adresów e-mail, co obejmuje sprawdzanie adresów jednorazowych i czy komunikacja z tym adresem jest możliwa. Gdy wyłączone, tylko format adresu e-mail jest sprawdzany."
|
||||
navbar: "Pasek nawigacyjny"
|
||||
shuffle: "Mieszaj"
|
||||
account: "Konta"
|
||||
move: "Przenieś"
|
||||
pushNotification: "Powiadomienia"
|
||||
@ -877,22 +986,74 @@ pushNotificationAlreadySubscribed: "Powiadomienia push są włączone"
|
||||
pushNotificationNotSupported: "Przeglądarka lub instancja nie obsługuje powiadomień push"
|
||||
sendPushNotificationReadMessage: "Usuń powiadomienia push po przeczytaniu powiadomień i wiadomości."
|
||||
sendPushNotificationReadMessageCaption: "Chwilowo pojawi się powiadomienie \"{emptyPushNotificationMessage}\". Może wzrosnąć zużycie baterii urządzenia."
|
||||
windowMaximize: "Maksymalizuj"
|
||||
windowMinimize: "Minimalizuj"
|
||||
windowRestore: "Przywróć"
|
||||
caption: "Legenda"
|
||||
loggedInAsBot: "Jesteś obecnie zalogowany/a jako bot"
|
||||
tools: "Narzędzia"
|
||||
cannotLoad: "Nie można wczytać"
|
||||
numberOfProfileView: "Wyświetlenia profilu"
|
||||
like: "Polub"
|
||||
unlike: "Usuń polubienie"
|
||||
numberOfLikes: "Liczba polubień"
|
||||
show: "Wyświetlanie"
|
||||
neverShow: "Nie pokazuj ponownie"
|
||||
remindMeLater: "Przypomnij później"
|
||||
didYouLikeMisskey: "Czy CherryPick się tobie spodobało?"
|
||||
pleaseDonate: "{host} używa darmowego oprogramowania — CherryPick. Bylibyśmy bardzo wdzięczni za datki, które pozwolą na kontynuację rozwoju CherryPick!"
|
||||
correspondingSourceIsAvailable: "Odpowiedni kod źródłowy jest dostępny pod {anchor}."
|
||||
roles: "Role"
|
||||
role: "Rola"
|
||||
noRole: "Rola nie znaleziona"
|
||||
normalUser: "Normalny użytkownik"
|
||||
undefined: "Niezdefiniowane"
|
||||
assign: "Przydziel"
|
||||
unassign: "Cofnij przydzielenie"
|
||||
color: "Kolor"
|
||||
manageCustomEmojis: "Zarządzaj niestandardowymi Emoji"
|
||||
manageAvatarDecorations: "Zarządzaj dekoracjami awatara"
|
||||
invalidParamError: "Błąd parametrów"
|
||||
permissionDeniedError: "Odrzucono operacje"
|
||||
permissionDeniedErrorDescription: "Konto nie posiada uprawnień"
|
||||
preset: "Konfiguracja"
|
||||
selectFromPresets: "Wybierz konfiguracje"
|
||||
achievements: "Osiągnięcia"
|
||||
thisPostMayBeAnnoyingCancel: "Odrzuć"
|
||||
internalServerError: "Wewnętrzny błąd serwera"
|
||||
internalServerErrorDescription: "Niespodziewany błąd po stronie serwera"
|
||||
copyErrorInfo: "Kopiuj informacje o błędzie"
|
||||
joinThisServer: "Dołącz do chaty"
|
||||
disableFederationOk: "Wyłącz federacje"
|
||||
invitationRequiredToRegister: "Ten serwer wymaga zaproszenia. Tylko osoby z zaproszeniem mogą się zarejestrować"
|
||||
emailNotSupported: "Wysyłanie wiadomości E-mail nie jest obsługiwane na tym serwerze"
|
||||
postToTheChannel: "Publikuj na kanale"
|
||||
youFollowing: "Śledzeni"
|
||||
icon: "Awatar"
|
||||
replies: "Odpowiedz"
|
||||
renotes: "Udostępnij"
|
||||
sourceCode: "Kod źródłowy"
|
||||
flip: "Odwróć"
|
||||
lastNDays: "W ciągu ostatnich {n} dni"
|
||||
surrender: "Odrzuć"
|
||||
gameRetry: "Spróbuj ponownie"
|
||||
_delivery:
|
||||
stop: "Zawieszono"
|
||||
_type:
|
||||
none: "Publikowanie"
|
||||
_bubbleGame:
|
||||
_score:
|
||||
score: "Wynik"
|
||||
_role:
|
||||
assignTarget: "Przydziel"
|
||||
priority: "Priorytet"
|
||||
_priority:
|
||||
low: "Niski"
|
||||
middle: "Średnie"
|
||||
high: "Wysoki"
|
||||
_options:
|
||||
canManageCustomEmojis: "Zarządzaj niestandardowymi Emoji"
|
||||
canManageAvatarDecorations: "Zarządzaj dekoracjami awatara"
|
||||
_sensitiveMediaDetection:
|
||||
description: "Zmniejsza wysiłek związany z moderacją serwera dzięki automatycznemu rozpoznawaniu zawartości NSFW za pomocą uczenia maszynowego. To nieznacznie zwiększy obciążenie serwera."
|
||||
setSensitiveFlagAutomatically: "Oznacz jako NSFW"
|
||||
@ -1480,4 +1641,3 @@ _moderationLogTypes:
|
||||
resetPassword: "Zresetuj hasło"
|
||||
_reversi:
|
||||
total: "Łącznie"
|
||||
|
||||
|
@ -733,9 +733,9 @@ reloadToApplySetting: "As configurações serão refletidas após recarregar a p
|
||||
needReloadToApply: "É necessário recarregar a página para refletir as alterações."
|
||||
showTitlebar: "Exibir barra de título"
|
||||
clearCache: "Limpar o cache"
|
||||
onlineUsersCount: "Pessoas Online"
|
||||
nUsers: "Usuários"
|
||||
nNotes: "Notas"
|
||||
onlineUsersCount: "{n} Pessoas Online"
|
||||
nUsers: "{n} Usuários"
|
||||
nNotes: "{n} Notas"
|
||||
sendErrorReports: "Enviar relatórios de erro"
|
||||
sendErrorReportsDescription: "Ao ativar essa opção, informações detalhadas de erro serão compartilhadas com o CherryPick em caso de problemas, o que pode ajudar a melhorar a qualidade do software. As informações de erro podem incluir a versão do sistema operacional, o tipo de navegador e o sua atividade no CherryPick."
|
||||
myTheme: "Meu tema"
|
||||
@ -767,7 +767,7 @@ emailNotification: "Notificações por e-mail"
|
||||
publish: "Publicar"
|
||||
inChannelSearch: "Pesquisar no canal"
|
||||
useReactionPickerForContextMenu: "Clique com o botão direito do mouse para abrir o seletor de reações."
|
||||
typingUsers: "digitando"
|
||||
typingUsers: "{users} pessoas digitando"
|
||||
jumpToSpecifiedDate: "Pular para uma data específica"
|
||||
showingPastTimeline: "Visualizar linha de tempo anterior"
|
||||
clear: "Limpar"
|
||||
@ -834,7 +834,7 @@ learnMore: "Saiba mais"
|
||||
misskeyUpdated: "CherryPick foi atualizado!"
|
||||
whatIsNew: "Ver atualizações"
|
||||
translate: "Traduzir"
|
||||
translatedFrom: "Traduzido de"
|
||||
translatedFrom: "Traduzido de {x}"
|
||||
accountDeletionInProgress: "Encerramento de conta em andamento"
|
||||
usernameInfo: "O nome para identificar exclusivamente a sua conta no servidor. Pode conter letras (az, AZ), números (0~9) e sublinhados (_). O nome de usuário não pode ser alterado posteriormente."
|
||||
aiChanMode: "Modo AI-chan"
|
||||
@ -1012,6 +1012,10 @@ keepScreenOn: "Manter a tela do dispositivo sempre ligada"
|
||||
flip: "Inversão"
|
||||
lastNDays: "Últimos {n} dias"
|
||||
surrender: "Cancelar"
|
||||
_delivery:
|
||||
stop: "Suspenso"
|
||||
_type:
|
||||
none: "Publicando"
|
||||
_initialAccountSetting:
|
||||
followUsers: "Siga usuários que lhe interessam para criar a sua linha do tempo."
|
||||
_serverSettings:
|
||||
@ -1301,8 +1305,8 @@ _preferencesBackups:
|
||||
_channel:
|
||||
featured: "Destaques"
|
||||
following: "Seguindo"
|
||||
usersCount: "usuários ativos"
|
||||
notesCount: "notas"
|
||||
usersCount: "{n} usuários ativos"
|
||||
notesCount: "{n} notas"
|
||||
nameAndDescription: "Nome e descrição"
|
||||
_menuDisplay:
|
||||
sideFull: "Exibir painel lateral inteiro"
|
||||
@ -1502,4 +1506,3 @@ _moderationLogTypes:
|
||||
resetPassword: "Redefinir senha"
|
||||
_reversi:
|
||||
total: "Total"
|
||||
|
||||
|
@ -651,6 +651,10 @@ show: "Arată"
|
||||
icon: "Avatar"
|
||||
replies: "Răspunde"
|
||||
renotes: "Re-notează"
|
||||
_delivery:
|
||||
stop: "Suspendat"
|
||||
_type:
|
||||
none: "Publicare"
|
||||
_role:
|
||||
_priority:
|
||||
middle: "Mediu"
|
||||
@ -730,4 +734,3 @@ _moderationLogTypes:
|
||||
resetPassword: "Resetează parola"
|
||||
_reversi:
|
||||
total: "Total"
|
||||
|
||||
|
@ -17,7 +17,7 @@ noThankYou: "Нет, спасибо"
|
||||
enterUsername: "Введите имя пользователя"
|
||||
renotedBy: "{user} делится"
|
||||
noNotes: "Нет ни одной заметки"
|
||||
noNotifications: "Нет ни одного уведомления"
|
||||
noNotifications: "Нет уведомлений"
|
||||
instance: "Инстанс"
|
||||
settings: "Настройки"
|
||||
notificationSettings: "Настройки уведомлений"
|
||||
@ -129,6 +129,7 @@ overwriteFromPinnedEmojis: "Заменить на эмодзи из общего
|
||||
reactionSettingDescription2: "Расставляйте перетаскиванием, удаляйте нажатием, добавляйте кнопкой «+»."
|
||||
rememberNoteVisibility: "Запоминать видимость заметок"
|
||||
attachCancel: "Удалить вложение"
|
||||
deleteFile: "Удалить файл"
|
||||
markAsSensitive: "Отметить как «не для всех»"
|
||||
unmarkAsSensitive: "Снять отметку «не для всех»"
|
||||
enterFileName: "Введите имя файла"
|
||||
@ -312,6 +313,7 @@ folderName: "Имя папки"
|
||||
createFolder: "Создать папку"
|
||||
renameFolder: "Переименовать папку"
|
||||
deleteFolder: "Удалить папку"
|
||||
folder: "Папка"
|
||||
addFile: "Добавить файл"
|
||||
emptyDrive: "Диск пуст"
|
||||
emptyFolder: "Папка пуста"
|
||||
@ -373,6 +375,8 @@ hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Включить hCaptcha"
|
||||
hcaptchaSiteKey: "Ключ сайта"
|
||||
hcaptchaSecretKey: "Секретный ключ"
|
||||
mcaptcha: "mCaptcha"
|
||||
enableMcaptcha: "Включить mCaptcha"
|
||||
mcaptchaSiteKey: "Ключ сайта"
|
||||
mcaptchaSecretKey: "Секретный ключ"
|
||||
recaptcha: "reCAPTCHA"
|
||||
@ -554,6 +558,8 @@ showInPage: "Показать страницу"
|
||||
popout: "Развернуть"
|
||||
volume: "Громкость"
|
||||
masterVolume: "Основная регулировка громкости"
|
||||
notUseSound: "Выключить звук"
|
||||
useSoundOnlyWhenActive: "Использовать звук, когда Misskey активен."
|
||||
details: "Подробнее"
|
||||
chooseEmoji: "Выберите эмодзи"
|
||||
unableToProcess: "Не удаётся завершить операцию"
|
||||
@ -574,6 +580,10 @@ output: "Выходы"
|
||||
script: "Скрипт"
|
||||
disablePagesScript: "Отключить скрипты на «Страницах»"
|
||||
updateRemoteUser: "Обновить данные пользователя с его сервера"
|
||||
unsetUserAvatar: "Убрать аватар"
|
||||
unsetUserAvatarConfirm: "Вы точно хотите убрать аватар?"
|
||||
unsetUserBanner: "Убрать баннер"
|
||||
unsetUserBannerConfirm: "Вы точно хотите убрать баннер?"
|
||||
deleteAllFiles: "Удалить все файлы"
|
||||
deleteAllFilesConfirm: "Вы хотите удалить все файлы?"
|
||||
removeAllFollowing: "Удалить всех подписчиков"
|
||||
@ -624,6 +634,7 @@ medium: "Средне"
|
||||
small: "Мелко"
|
||||
generateAccessToken: "Создать токен доступа"
|
||||
permission: "Разрешения"
|
||||
adminPermission: "Доступ администратора"
|
||||
enableAll: "Включить все"
|
||||
disableAll: "Выключить всё"
|
||||
tokenRequested: "Открыть доступ к учётной записи"
|
||||
@ -645,6 +656,7 @@ smtpSecure: "Использовать SSL/TLS для SMTP-соединений"
|
||||
smtpSecureInfo: "Выключите при использовании STARTTLS."
|
||||
testEmail: "Проверка доставки электронной почты"
|
||||
wordMute: "Скрытие слов"
|
||||
hardWordMute: ""
|
||||
regexpError: "Ошибка в регулярном выражении"
|
||||
regexpErrorDescription: "В списке {tab} скрытых слов, в строке {line} обнаружена синтаксическая ошибка:"
|
||||
instanceMute: "Глушение инстансов"
|
||||
@ -1098,8 +1110,13 @@ renotes: "Репост"
|
||||
loadReplies: "Показать ответы"
|
||||
sourceCode: "Исходный код"
|
||||
flip: "Переворот"
|
||||
code: "Код"
|
||||
lastNDays: "Последние {n} сут"
|
||||
surrender: "Этот пост не может быть отменен."
|
||||
_delivery:
|
||||
stop: "Заморожено"
|
||||
_type:
|
||||
none: "Публикация"
|
||||
_initialAccountSetting:
|
||||
accountCreated: "Аккаунт успешно создан!"
|
||||
letsStartAccountSetup: "Давайте настроим вашу учётную запись."
|
||||
@ -1711,7 +1728,6 @@ _2fa:
|
||||
registerTOTP: "Начните настраивать приложение-аутентификатор"
|
||||
step1: "Прежде всего, установите на устройство приложение для аутентификации, например, {a} или {b}."
|
||||
step2: "Далее отсканируйте отображаемый QR-код при помощи приложения."
|
||||
step2Click: "Нажав на QR-код, вы можете зарегистрироваться с помощью приложения для аутентификации или брелка для ключей, установленного на вашем устройстве."
|
||||
step3Title: "Введите проверочный код"
|
||||
step3: "И наконец, введите код, который покажет приложение."
|
||||
step4: "Теперь при каждом входе на сайт вам нужно будет вводить код из приложения аналогичным образом."
|
||||
@ -2064,4 +2080,3 @@ _moderationLogTypes:
|
||||
resetPassword: "Сброс пароля:"
|
||||
_reversi:
|
||||
total: "Всего"
|
||||
|
||||
|
@ -1,2 +1,19 @@
|
||||
---
|
||||
|
||||
_lang_: "සිංහල"
|
||||
monthAndDay: "{month}-{day}"
|
||||
username: "පරිශීලක නාමය"
|
||||
password: "මුරපදය"
|
||||
cancel: "අවලංගු කරන්න"
|
||||
instance: "සර්වර්"
|
||||
login: "පිවිසෙන්න"
|
||||
users: "පරිශීලක"
|
||||
note: "නෝට්"
|
||||
notes: "නෝට්"
|
||||
instances: "සර්වර්"
|
||||
smtpUser: "පරිශීලක නාමය"
|
||||
smtpPass: "මුරපදය"
|
||||
user: "පරිශීලක"
|
||||
_sfx:
|
||||
note: "නෝට්"
|
||||
_profile:
|
||||
username: "පරිශීලක නාමය"
|
||||
|
@ -936,6 +936,10 @@ renotes: "Preposlať"
|
||||
sourceCode: "Zdrojový kód"
|
||||
flip: "Preklopiť"
|
||||
lastNDays: "Posledných {n} dní"
|
||||
_delivery:
|
||||
stop: "Zmrazené"
|
||||
_type:
|
||||
none: "Zverejňovanie"
|
||||
_role:
|
||||
priority: "Priorita"
|
||||
_priority:
|
||||
@ -1534,4 +1538,3 @@ _moderationLogTypes:
|
||||
resetPassword: "Resetovať heslo"
|
||||
_reversi:
|
||||
total: "Celkom"
|
||||
|
||||
|
@ -488,6 +488,10 @@ dataSaver: "Databesparing"
|
||||
icon: "Profilbild"
|
||||
replies: "Svara"
|
||||
renotes: "Omnotera"
|
||||
_delivery:
|
||||
stop: "Suspenderad"
|
||||
_type:
|
||||
none: "Publiceras"
|
||||
_achievements:
|
||||
_types:
|
||||
_open3windows:
|
||||
@ -577,4 +581,3 @@ _webhookSettings:
|
||||
_moderationLogTypes:
|
||||
suspend: "Suspendera"
|
||||
resetPassword: "Återställ Lösenord"
|
||||
|
||||
|
@ -33,7 +33,7 @@ logout: "ออกจากระบบ"
|
||||
signup: "สร้างบัญชีผู้ใช้"
|
||||
uploading: "กำลังอัปโหลด"
|
||||
save: "บันทึก"
|
||||
users: "ผู้ใช้งาน"
|
||||
users: "ผู้ใช้"
|
||||
addUser: "เพิ่มผู้ใช้"
|
||||
favorite: "รายการโปรด"
|
||||
favorites: "รายการโปรด"
|
||||
@ -400,6 +400,7 @@ name: "ชื่อ"
|
||||
antennaSource: "แหล่งเสาอากาศ"
|
||||
antennaKeywords: "คีย์เวิร์ดที่ควรฟัง"
|
||||
antennaExcludeKeywords: "คีย์เวิร์ดที่จะยกเว้น"
|
||||
antennaExcludeBots: "ยกเว้นบัญชีบอต"
|
||||
antennaKeywordsDescription: "คั่นด้วยช่องว่างสำหรับเงื่อนไข AND หรือด้วยการขึ้นบรรทัดใหม่สำหรับเงื่อนไข OR"
|
||||
notifyAntenna: "แจ้งเตือนเกี่ยวกับโน้ตใหม่"
|
||||
withFileAntenna: "เฉพาะโน้ตที่มีไฟล์"
|
||||
@ -506,6 +507,7 @@ disableDrawer: "อย่าใช้ลิ้นชักสไตล์เม
|
||||
youHaveNoGroups: "คุณยังไม่มีกลุ่ม"
|
||||
joinOrCreateGroup: "รับเชิญเข้าร่วมกลุ่มหรือสร้างกลุ่มของคุณเองเลยนะ"
|
||||
showNoteActionsOnlyHover: "แสดงการดำเนินการเฉพาะโน้ตเมื่อโฮเวอร์"
|
||||
showReactionsCount: "แสดงจำนวนรีแอกชั่นในโน้ต"
|
||||
noHistory: "ไม่มีประวัติ"
|
||||
signinHistory: "ประวัติการเข้าสู่ระบบ"
|
||||
enableAdvancedMfm: "เปิดใช้งาน MFM ขั้นสูง"
|
||||
@ -837,7 +839,7 @@ switchAccount: "สลับบัญชีผู้ใช้"
|
||||
enabled: "เปิดใช้งาน"
|
||||
disabled: "ปิดการใช้งาน"
|
||||
quickAction: "ปุ่มลัด"
|
||||
user: "ผู้ใช้งาน"
|
||||
user: "ผู้ใช้"
|
||||
administration: "การจัดการ"
|
||||
accounts: "บัญชีผู้ใช้"
|
||||
switch: "สลับ"
|
||||
@ -1237,6 +1239,20 @@ enableHorizontalSwipe: "ปัดเพื่อสลับแท็บ"
|
||||
loading: "กำลังโหลด"
|
||||
surrender: "ยอมแพ้"
|
||||
gameRetry: "เริ่มเกมใหม่"
|
||||
notUsePleaseLeaveBlank: "หากไม่ได้ใช้กรุณาเว้นว่างไว้"
|
||||
useTotp: "ใช้รหัสผ่านแบบใช้ครั้งเดียว (TOTP)"
|
||||
useBackupCode: "ใช้รหัสสำรอง"
|
||||
launchApp: "เริ่มแอป"
|
||||
useNativeUIForVideoAudioPlayer: "ใช้ UI ของเบราว์เซอร์เพื่อเล่นวิดีโอ/เสียง"
|
||||
keepOriginalFilename: "คงชื่อไฟล์เดิมไว้"
|
||||
keepOriginalFilenameDescription: "หากปิดการตั้งค่านี้ ในระหว่างการอัปโหลดชื่อไฟล์จะถูกแทนที่ด้วยสตริงแบบสุ่มโดยอัตโนมัติ"
|
||||
noDescription: "ไม่มีข้อความอธิบาย"
|
||||
alwaysConfirmFollow: "แสดงข้อความยืนยันเมื่อกดติดตาม"
|
||||
inquiry: "ติดต่อเรา"
|
||||
_delivery:
|
||||
stop: "ถูกระงับ"
|
||||
_type:
|
||||
none: "กำลังเผยแพร่"
|
||||
_bubbleGame:
|
||||
howToPlay: "วิธีเล่น"
|
||||
hold: "หยุดชั่วคราว"
|
||||
@ -1365,7 +1381,7 @@ _serverSettings:
|
||||
_accountMigration:
|
||||
moveFrom: "ย้ายข้อมูลบัญชีอื่นไปยังอีกบัญชีนี้หนึ่ง"
|
||||
moveFromSub: "สร้างนามแฝงไปยังบัญชีอื่น"
|
||||
moveFromLabel: "บัญชีที่จะย้ายจาก:"
|
||||
moveFromLabel: "บัญชีที่จะย้ายจาก #{n}"
|
||||
moveFromDescription: "ถ้าหากคุณต้องการโอนข้อมูล คุณจำเป็นต้องสร้างบัญชีสำรองสำหรับการย้ายบัญชี หลังจากนั้นป้อนบัญชีที่จะย้ายไปในรูปแบบต่อไปนี้: @person@instance.com"
|
||||
moveTo: "ย้ายข้อมูลบัญชีนี้ไปยังบัญชีอีกหนึ่ง"
|
||||
moveToLabel: "บัญชีที่จะย้ายไปที่:"
|
||||
@ -1538,7 +1554,7 @@ _achievements:
|
||||
_viewAchievements3min:
|
||||
title: "ชอบบรรลุความสําเร็จ"
|
||||
description: "มองดูรายการความสำเร็จของคุณเป็นเวลาอย่างน้อย 3 นาที"
|
||||
_iLoveMisskey:
|
||||
_iLoveCherryPick:
|
||||
title: "ฉันรัก CherryPick"
|
||||
description: "โพสต์ “I ❤ #CherryPick”"
|
||||
flavor: "ขอบคุณพระคุณเป็นอย่างสูงที่ท่านใช้ CherryPick นะคะ ! by ทีมผู้พัฒนา"
|
||||
@ -1700,6 +1716,11 @@ _role:
|
||||
roleAssignedTo: "มอบหมายให้มีบทบาทแบบทำมือ"
|
||||
isLocal: "ผู้ใช้ในพื้นที่"
|
||||
isRemote: "ผู้ใช้ระยะไกล"
|
||||
isCat: "ผู้ใช้ที่เป็นแมว"
|
||||
isBot: "ผู้ใช้ที่เป็นบอต"
|
||||
isSuspended: "ผู้ใช้ที่ถูกระงับ"
|
||||
isLocked: "ผู้ใช้บัญชีไม่เปิดเผยสาธารณะ"
|
||||
isExplorable: "ผู้ใช้ที่เปิดใช้งาน “ทำให้บัญชีของฉันค้นหาได้ง่ายขึ้น”"
|
||||
createdLessThan: "สร้างน้อยกว่า"
|
||||
createdMoreThan: "สร้างมากกว่า"
|
||||
followersLessThanOrEq: "จำนวนผู้ติดตามน้อยกว่าหรือเท่ากับ\n"
|
||||
@ -1769,6 +1790,7 @@ _plugin:
|
||||
installWarn: "กรุณาอย่าติดตั้งปลั๊กอินที่ไม่น่าเชื่อถือนะคะ"
|
||||
manage: "จัดการปลั๊กอิน"
|
||||
viewSource: "ดูต้นฉบับ"
|
||||
viewLog: "แสดงปูม"
|
||||
_preferencesBackups:
|
||||
list: "สร้างการสำรองข้อมูล"
|
||||
saveNew: "บันทึกข้อมูลสำรองใหม่"
|
||||
@ -2026,7 +2048,6 @@ _2fa:
|
||||
registerTOTP: "ลงทะเบียนแอพตัวตรวจสอบสิทธิ์"
|
||||
step1: "ขั้นตอนแรก ติดตั้งแอปยืนยันตัวตน (เช่น {a} หรือ {b}) บนอุปกรณ์ของคุณ"
|
||||
step2: "จากนั้นสแกนรหัส QR ที่แสดงบนหน้าจอนี้"
|
||||
step2Click: "การคลิกที่รหัส QR นี้จะช่วยให้คุณนั้นสามารถลงทะเบียน 2FA กับคีย์ความปลอดภัยหรือแอปตรวจสอบความถูกต้องของโทรศัพท์ได้"
|
||||
step2Uri: "ป้อนใส่ URL ดังต่อไปนี้ถ้าหากคุณใช้โปรแกรมเดสก์ท็อป"
|
||||
step3Title: "ป้อนรหัสยืนยัน"
|
||||
step3: "ป้อนโทเค็นที่แอปของคุณให้มาเพื่อเสร็จสิ้นการตั้งค่า"
|
||||
@ -2050,6 +2071,7 @@ _2fa:
|
||||
backupCodesDescription: "หากแอปยืนยันตัวตนของคุณไม่พร้อมใช้งาน คุณสามารถใช้รหัสสำรองด้านล่างเพื่อเข้าถึงบัญชีของคุณได้ อย่าลืมเก็บรหัสเหล่านี้ไว้ในที่ปลอดภัย แต่ละรหัสสามารถใช้ได้เพียงครั้งเดียวเท่านั้น"
|
||||
backupCodeUsedWarning: "มีการใช้รหัสสำรองแล้ว โปรดกรุณากำหนดค่าการตรวจสอบสิทธิ์แบบสองปัจจัยโดยเร็วที่สุดถ้าหากคุณยังไม่สามารถใช้งานได้อีก"
|
||||
backupCodesExhaustedWarning: "รหัสสำรองทั้งหมดถูกใช้แล้ว ถ้าหากคุณยังสูญเสียการเข้าถึงแอปการตรวจสอบสิทธิ์แบบสองปัจจัยคุณจะยังไม่สามารถเข้าถึงบัญชีนี้ได้ กรุณากำหนดค่าการรับรองความถูกต้องด้วยการยืนยันสองชั้น"
|
||||
moreDetailedGuideHere: "คลิกที่นี่เพื่อดูคำแนะนำโดยละเอียด"
|
||||
_permissions:
|
||||
"read:account": "ดูข้อมูลบัญชีของคุณ"
|
||||
"write:account": "แก้ไขข้อมูลบัญชีของคุณ"
|
||||
@ -2100,7 +2122,6 @@ _permissions:
|
||||
"read:admin:server-info": "ดูข้อมูลเซิร์ฟเวอร์"
|
||||
"read:admin:show-moderation-log": "ดูปูมการแก้ไข"
|
||||
"read:admin:show-user": "ดูข้อมูลส่วนตัวของผู้ใช้"
|
||||
"read:admin:show-users": "ดูข้อมูลส่วนตัวของผู้ใช้"
|
||||
"write:admin:suspend-user": "ระงับผู้ใช้"
|
||||
"write:admin:unset-user-avatar": "ลบอวตารผู้ใช้"
|
||||
"write:admin:unset-user-banner": "ลบแบนเนอร์ผู้ใช้"
|
||||
@ -2313,6 +2334,7 @@ _play:
|
||||
title: "หัวข้อ"
|
||||
script: "สคริปต์"
|
||||
summary: "รายละเอียด"
|
||||
visibilityDescription: "หากตั้งค่าเป็นส่วนตัว มันจะไม่ปรากฏในโปรไฟล์อีกต่อไป แต่ผู้ที่ทราบ URL ของมันจะยังสามารถเข้าถึงได้"
|
||||
_pages:
|
||||
newPage: "สร้างหน้าเพจใหม่"
|
||||
editPage: "แก้ไขหน้าเพจ"
|
||||
@ -2357,6 +2379,8 @@ _pages:
|
||||
section: "ประเภท"
|
||||
image: "รูปภาพ"
|
||||
button: "ปุ่ม"
|
||||
dynamic: "บล็อกแบบไดนามิก"
|
||||
dynamicDescription: "บล็อกนี้ล้าสมัยแล้ว โปรดใช้ {play} แทน นับจากนี้เป็นต้นไป"
|
||||
note: "โน้ตที่ฝังตัว"
|
||||
_note:
|
||||
id: "โน้ต ID"
|
||||
@ -2387,6 +2411,7 @@ _notification:
|
||||
sendTestNotification: "ส่งทดสอบการแจ้งเตือน"
|
||||
notificationWillBeDisplayedLikeThis: "การแจ้งเตือนมีลักษณะแบบนี้"
|
||||
reactedBySomeUsers: "ถูกรีแอคชั่นโดยผู้ใช้ {n} ราย"
|
||||
likedBySomeUsers: "{n} คนถูกใจ"
|
||||
renotedBySomeUsers: "รีโน้ตจากผู้ใช้ {n} ราย"
|
||||
followedBySomeUsers: "มีผู้ติดตาม {n} ราย"
|
||||
flushNotification: "ล้างประวัติการแจ้งเตือน"
|
||||
@ -2614,4 +2639,21 @@ _reversi:
|
||||
_offlineScreen:
|
||||
title: "ออฟไลน์ - ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้"
|
||||
header: "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้"
|
||||
|
||||
_urlPreviewSetting:
|
||||
title: "การตั้งค่าการแสดงตัวอย่าง URL"
|
||||
enable: "เปิดใช้งานการแสดงตัวอย่าง URL"
|
||||
timeout: "เวลาจำกัดในการโหลดตัวอย่าง URL (ms)"
|
||||
timeoutDescription: "หากเวลาที่ใช้ในการโหลดเกินค่านี้ จะไม่มีการสร้างการแสดงตัวอย่าง"
|
||||
maximumContentLength: "ค่าสูงสุดของ Content-Length (byte)"
|
||||
maximumContentLengthDescription: "หาก Content-Length เกินค่านี้ จะไม่มีการสร้างการแสดงตัวอย่าง"
|
||||
requireContentLength: "สร้างการแสดงตัวอย่างเฉพาะในกรณีที่รับ Content-Length ไหว"
|
||||
requireContentLengthDescription: "หากเซิร์ฟเวอร์อื่นไม่ส่งคืน Content-Length จะไม่มีการสร้างการแสดงตัวอย่าง"
|
||||
userAgent: "User-Agent"
|
||||
userAgentDescription: "ตั้งค่า User-Agent ที่ใช้ในการรับการแสดงตัวอย่าง หากเว้นว่างไว้ ระบบจะใช้ User-Agent เริ่มต้น"
|
||||
summaryProxy: "endpoint ของพร็อกซีที่สร้างการแสดงตัวอย่าง"
|
||||
summaryProxyDescription: "สร้างการแสดงตัวอย่างด้วย summary Proxy แทนที่จะใช้เนื้อหา Misskey"
|
||||
summaryProxyDescription2: "พารามิเตอร์ต่อไปนี้จะถูกใช้เป็นสตริงการสืบค้นเพื่อเชื่อมต่อกับพร็อกซี หากฝั่งพร็อกซีไม่รองรับการตั้งค่าเหล่านี้จะถูกละเว้น"
|
||||
_mediaControls:
|
||||
pip: "รูปภาพในรูปภาม"
|
||||
playbackRate: "ความเร็วในการเล่น"
|
||||
loop: "เล่นวนซ้ำ"
|
||||
|
@ -378,6 +378,10 @@ addMemo: "Kısa not ekle"
|
||||
icon: "Avatar"
|
||||
replies: "yanıt"
|
||||
renotes: "vazgeçme"
|
||||
_delivery:
|
||||
stop: "Askıya alınmış"
|
||||
_type:
|
||||
none: "Paylaşım"
|
||||
_accountDelete:
|
||||
started: "Silme işlemi başlatıldı"
|
||||
_email:
|
||||
@ -456,4 +460,3 @@ _deck:
|
||||
_moderationLogTypes:
|
||||
suspend: "askıya al"
|
||||
resetPassword: "Şifre sıfırlama"
|
||||
|
||||
|
@ -17,4 +17,3 @@ _2fa:
|
||||
renewTOTPCancel: "ئۇنى توختىتىڭ"
|
||||
_widgets:
|
||||
profile: "profile"
|
||||
|
||||
|
@ -928,6 +928,10 @@ renotes: "Поширити"
|
||||
sourceCode: "Вихідний код"
|
||||
flip: "Перевернути"
|
||||
lastNDays: "Останні {n} днів"
|
||||
_delivery:
|
||||
stop: "Призупинено"
|
||||
_type:
|
||||
none: "Публікація"
|
||||
_achievements:
|
||||
earnedAt: "Відкрито"
|
||||
_types:
|
||||
@ -1704,4 +1708,3 @@ _moderationLogTypes:
|
||||
resetPassword: "Скинути пароль"
|
||||
_reversi:
|
||||
total: "Всього"
|
||||
|
||||
|
@ -846,6 +846,10 @@ icon: "Avatar"
|
||||
replies: "Javob berish"
|
||||
renotes: "Qayta qayd etish"
|
||||
flip: "Teskari"
|
||||
_delivery:
|
||||
stop: "To'xtatilgan"
|
||||
_type:
|
||||
none: "Yuborilmoqda"
|
||||
_achievements:
|
||||
_types:
|
||||
_viewInstanceChart:
|
||||
@ -1091,4 +1095,3 @@ _moderationLogTypes:
|
||||
resetPassword: "Parolni tiklash"
|
||||
_reversi:
|
||||
total: "Jami"
|
||||
|
||||
|
53
locales/verify.js
Normal file
53
locales/verify.js
Normal file
@ -0,0 +1,53 @@
|
||||
import locales from './index.js';
|
||||
|
||||
let valid = true;
|
||||
|
||||
function writeError(type, lang, tree, data) {
|
||||
process.stderr.write(JSON.stringify({ type, lang, tree, data }));
|
||||
process.stderr.write('\n');
|
||||
valid = false;
|
||||
}
|
||||
|
||||
function verify(expected, actual, lang, trace) {
|
||||
for (let key in expected) {
|
||||
if (!Object.prototype.hasOwnProperty.call(actual, key)) {
|
||||
continue;
|
||||
}
|
||||
if (typeof expected[key] === 'object') {
|
||||
if (typeof actual[key] !== 'object') {
|
||||
writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'object', actual: typeof actual[key] });
|
||||
continue;
|
||||
}
|
||||
verify(expected[key], actual[key], lang, trace ? `${trace}.${key}` : key);
|
||||
} else if (typeof expected[key] === 'string') {
|
||||
switch (typeof actual[key]) {
|
||||
case 'object':
|
||||
writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'string', actual: 'object' });
|
||||
break;
|
||||
case 'undefined':
|
||||
continue;
|
||||
case 'string':
|
||||
const expectedParameters = new Set(expected[key].match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
|
||||
const actualParameters = new Set(actual[key].match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
|
||||
for (let parameter of expectedParameters) {
|
||||
if (!actualParameters.has(parameter)) {
|
||||
writeError('missing_parameter', lang, trace ? `${trace}.${key}` : key, { parameter });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const { ['ja-JP']: original, ...verifiees } = locales;
|
||||
|
||||
for (let lang in verifiees) {
|
||||
if (!Object.prototype.hasOwnProperty.call(locales, lang)) {
|
||||
continue;
|
||||
}
|
||||
verify(original, verifiees[lang], lang);
|
||||
}
|
||||
|
||||
if (!valid) {
|
||||
process.exit(1);
|
||||
}
|
@ -121,9 +121,11 @@ sensitive: "Nhạy cảm"
|
||||
add: "Thêm"
|
||||
reaction: "Biểu cảm"
|
||||
reactions: "Biểu cảm"
|
||||
emojiPicker: "Bộ chọn biểu tượng cảm xúc"
|
||||
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"
|
||||
attachCancel: "Gỡ tập tin đính kèm"
|
||||
deleteFile: "Xoá tệp tin"
|
||||
markAsSensitive: "Đánh dấu là nhạy cảm"
|
||||
unmarkAsSensitive: "Bỏ đánh dấu nhạy cảm"
|
||||
enterFileName: "Nhập tên tập tin"
|
||||
@ -257,6 +259,7 @@ removed: "Đã xóa"
|
||||
removeAreYouSure: "Bạn có chắc muốn gỡ \"{x}\"?"
|
||||
deleteAreYouSure: "Bạn có chắc muốn xóa \"{x}\"?"
|
||||
resetAreYouSure: "Bạn có chắc muốn đặt lại?"
|
||||
areYouSure: "Bạn chắc chứ?"
|
||||
saved: "Đã lưu"
|
||||
messaging: "Trò chuyện"
|
||||
upload: "Tải lên"
|
||||
@ -307,6 +310,7 @@ folderName: "Tên thư mục"
|
||||
createFolder: "Tạo thư mục"
|
||||
renameFolder: "Đổi tên thư mục"
|
||||
deleteFolder: "Xóa thư mục"
|
||||
folder: "Thư mục"
|
||||
addFile: "Thêm tập tin"
|
||||
emptyDrive: "Ổ đĩa của bạn trống trơn"
|
||||
emptyFolder: "Thư mục trống"
|
||||
@ -368,6 +372,8 @@ hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Bật hCaptcha"
|
||||
hcaptchaSiteKey: "Khóa của trang"
|
||||
hcaptchaSecretKey: "Khóa bí mật"
|
||||
mcaptcha: "mCaptcha"
|
||||
enableMcaptcha: "Bật mCaptcha"
|
||||
mcaptchaSiteKey: "Khóa của trang"
|
||||
mcaptchaSecretKey: "Khóa bí mật"
|
||||
recaptcha: "reCAPTCHA"
|
||||
@ -385,6 +391,7 @@ name: "Tên"
|
||||
antennaSource: "Nguồn trạm phát sóng"
|
||||
antennaKeywords: "Từ khóa để nghe"
|
||||
antennaExcludeKeywords: "Từ khóa để lọc ra"
|
||||
antennaExcludeBots: "Loại trừ các tài khoản bot"
|
||||
antennaKeywordsDescription: "Phân cách bằng dấu cách cho điều kiện AND hoặc bằng xuống dòng cho điều kiện OR."
|
||||
notifyAntenna: "Thông báo có tút mới"
|
||||
withFileAntenna: "Chỉ những tút có media"
|
||||
@ -549,6 +556,7 @@ showInPage: "Hiện trong trang"
|
||||
popout: "Pop-out"
|
||||
volume: "Âm lượng"
|
||||
masterVolume: "Âm thanh chung"
|
||||
notUseSound: "Tắt tiếng"
|
||||
details: "Chi tiết"
|
||||
chooseEmoji: "Chọn emoji"
|
||||
unableToProcess: "Không thể hoàn tất hành động"
|
||||
@ -569,6 +577,10 @@ output: "Nguồn ra"
|
||||
script: "Kịch bản"
|
||||
disablePagesScript: "Tắt AiScript trên Trang"
|
||||
updateRemoteUser: "Cập nhật thông tin người dùng ở máy chủ khác"
|
||||
unsetUserAvatar: "Gỡ ảnh đại diện"
|
||||
unsetUserAvatarConfirm: "Bạn có chắc muốn gỡ ảnh đại diện?"
|
||||
unsetUserBanner: "Gỡ ảnh bìa"
|
||||
unsetUserBannerConfirm: "Bạn có chắc muốn gỡ ảnh bìa?"
|
||||
deleteAllFiles: "Xóa toàn bộ tập tin"
|
||||
deleteAllFilesConfirm: "Bạn có chắc xóa toàn bộ tập tin?"
|
||||
removeAllFollowing: "Ngưng theo dõi tất cả mọi người"
|
||||
@ -871,6 +883,8 @@ makeReactionsPublicDescription: "Điều này sẽ hiển thị công khai danh
|
||||
classic: "Cổ điển"
|
||||
muteThread: "Không quan tâm nữa"
|
||||
unmuteThread: "Quan tâm tút này"
|
||||
followingVisibility: "Hiển thị lượt theo dõi"
|
||||
followersVisibility: "Hiển thị người theo dõi"
|
||||
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?"
|
||||
incorrectPassword: "Sai mật khẩu."
|
||||
@ -982,6 +996,7 @@ assign: "Phân công"
|
||||
unassign: "Hủy phân công"
|
||||
color: "Màu sắc"
|
||||
manageCustomEmojis: "Quản lý CustomEmoji"
|
||||
manageAvatarDecorations: "Quản lý trang trí ảnh đại diện"
|
||||
youCannotCreateAnymore: "Bạn đã tới giới hạn tạo."
|
||||
cannotPerformTemporary: "Tạm thời không sử dụng được"
|
||||
cannotPerformTemporaryDescription: "Tạm thời không sử dụng được vì lần số điều kiện quá giới hạn. Thử lại sau mọt lát nữa."
|
||||
@ -1005,18 +1020,24 @@ copyErrorInfo: "Sao chép thông tin lỗi"
|
||||
joinThisServer: "Đăng ký trên chủ máy này"
|
||||
exploreOtherServers: "Tìm chủ máy khác"
|
||||
letsLookAtTimeline: "Thử xem Timeline"
|
||||
disableFederationOk: "Vô hiệu hoá"
|
||||
emailNotSupported: "Máy chủ này không hỗ trợ gửi email"
|
||||
postToTheChannel: "Đăng lên kênh"
|
||||
cannotBeChangedLater: "Không thể thay đổi sau này."
|
||||
likeOnly: "Chỉ lượt thích"
|
||||
rolesAssignedToMe: "Vai trò được giao cho tôi"
|
||||
resetPasswordConfirm: "Bạn thực sự muốn đặt lại mật khẩu?"
|
||||
sensitiveWords: "Các từ nhạy cảm"
|
||||
prohibitedWords: "Các từ bị cấm"
|
||||
license: "Giấy phép"
|
||||
unfavoriteConfirm: "Bạn thực sự muốn xoá khỏi mục yêu thích?"
|
||||
retryAllQueuesConfirmTitle: "Bạn có muốn thử lại?"
|
||||
retryAllQueuesConfirmText: "Điều này sẽ tạm thời làm tăng mức độ tải của máy chủ."
|
||||
enableChartsForRemoteUser: "Tạo biểu đồ người dùng từ xa"
|
||||
video: "Video"
|
||||
videos: "Các video"
|
||||
audio: "Âm thanh"
|
||||
audioFiles: "Âm thanh"
|
||||
dataSaver: "Tiết kiệm dung lượng"
|
||||
accountMigration: "Chuyển tài khoản"
|
||||
accountMoved: "Người dùng này đã chuyển sang một tài khoản mới:"
|
||||
@ -1033,36 +1054,88 @@ vertical: "Dọc"
|
||||
horizontal: "Thanh bên"
|
||||
position: "Vị trí"
|
||||
serverRules: "Luật của máy chủ"
|
||||
pleaseConfirmBelowBeforeSignup: "Để đăng ký trên máy chủ này, bạn phải xem xét và đồng ý với những điều sau."
|
||||
pleaseAgreeAllToContinue: "Bạn phải đồng ý tất cả điều trên để tiếp tục."
|
||||
continue: "Tiếp tục"
|
||||
archive: "Lưu trữ"
|
||||
thisChannelArchived: "Kênh này đã được lưu trữ."
|
||||
initialAccountSetting: "Thiết lập hồ sơ"
|
||||
youFollowing: "Đang theo dõi"
|
||||
preventAiLearning: "Từ chối sử dụng công nghệ Máy Học (AI Sáng Tạo)"
|
||||
options: "Tùy chọn"
|
||||
specifyUser: "Người dùng chỉ định"
|
||||
failedToPreviewUrl: "Không thể xem trước"
|
||||
update: "Cập nhật"
|
||||
later: "Để sau"
|
||||
goToMisskey: "Tới CherryPick"
|
||||
installed: "Đã tải xuống"
|
||||
branding: "Thương hiệu"
|
||||
turnOffToImprovePerformance: "Tắt mục này có thể cải thiện hiệu năng."
|
||||
createInviteCode: "Tạo lời mời"
|
||||
createWithOptions: "Tạo cùng tùy chọn"
|
||||
createCount: "Số lượng mời"
|
||||
inviteCodeCreated: "Lời mời đã được tạo"
|
||||
inviteLimitExceeded: "Bạn đã vượt quá số lượng mời mà bạn có thể tạo."
|
||||
createLimitRemaining: "Giới hạn lượt mời: Còn lại {limit}"
|
||||
inviteLimitResetCycle: "Giới hạn này sẽ được đặt lại về {limit} lúc {time}."
|
||||
expirationDate: "Ngày hết hạn"
|
||||
noExpirationDate: "Vô thời hạn"
|
||||
inviteCodeUsedAt: "Mã mời đã được sử dụng lúc"
|
||||
registeredUserUsingInviteCode: "Lời mời đã được sử dụng bởi"
|
||||
waitingForMailAuth: "Đang chờ xác nhận email"
|
||||
inviteCodeCreator: "Lời mời đã được tạo bởi"
|
||||
usedAt: "Sử dụng vào lúc"
|
||||
unused: "Chưa được sử dụng"
|
||||
used: "Đã được sử dụng"
|
||||
expired: "Đã hết hạn"
|
||||
doYouAgree: "Đồng ý?"
|
||||
iHaveReadXCarefullyAndAgree: "Tôi đã đọc và đồng ý với \"x\"."
|
||||
beSureToReadThisAsItIsImportant: "Hãy đọc kỹ vì nó rất quan trọng."
|
||||
iHaveReadXCarefullyAndAgree: "Tôi đã đọc và đồng ý với \"{x}\"."
|
||||
dialog: "Hộp thoại"
|
||||
icon: "Ảnh đại diện"
|
||||
forYou: "Dành cho bạn"
|
||||
currentAnnouncements: "Thông báo hiện tại"
|
||||
pastAnnouncements: "Thông báo trước đó"
|
||||
youHaveUnreadAnnouncements: "Có thông báo chưa đọc."
|
||||
useSecurityKey: "Làm theo hướng dẫn trên trình duyệt hoặc thiết bị của bạn để sử dụng khóa bảo mật hoặc mật mã."
|
||||
replies: "Trả lời"
|
||||
renotes: "Đăng lại"
|
||||
loadReplies: "Hiển thị các trả lời"
|
||||
loadConversation: "Xem cuộc trò chuyện"
|
||||
pinnedList: "Các mục đã được ghim"
|
||||
keepScreenOn: "Giữ màn hình luôn bật"
|
||||
verifiedLink: "Chúng tôi đã xác nhận bạn là chủ sở hữu của đường dẫn này"
|
||||
authentication: "Xác thực"
|
||||
authenticationRequiredToContinue: "Vui lòng xác thực để tiếp tục"
|
||||
dateAndTime: "Ngày và giờ"
|
||||
edited: "Đã chỉnh sửa"
|
||||
notificationRecieveConfig: "Cài đặt thông báo"
|
||||
mutualFollow: "Theo dõi lẫn nhau"
|
||||
followingOrFollower: "Đang theo dõi hoặc người theo dõi"
|
||||
externalServices: "Các dịch vụ bên ngoài"
|
||||
sourceCode: "Mã nguồn"
|
||||
feedback: "Phản hồi"
|
||||
feedbackUrl: "URL phản hồi"
|
||||
privacyPolicy: "Chính sách bảo mật"
|
||||
privacyPolicyUrl: "URL Chính sách bảo mật"
|
||||
tosAndPrivacyPolicy: "Điều khoản sử dụng và Chính sách bảo mật"
|
||||
avatarDecorations: "Trang trí ảnh đại diện"
|
||||
attach: "Mặc"
|
||||
detach: "Bỏ"
|
||||
detachAll: "Bỏ tất cả"
|
||||
angle: "Góc"
|
||||
flip: "Lật"
|
||||
showAvatarDecorations: "Hiển thị trang trí ảnh đại diện"
|
||||
releaseToRefresh: "Thả để làm mới"
|
||||
refreshing: "Đang làm mới"
|
||||
pullDownToRefresh: "Kéo xuống để làm mới"
|
||||
cwNotationRequired: "Nếu \"Ẩn nội dung\" được bật thì cần phải có chú thích."
|
||||
lastNDays: "{n} ngày trước"
|
||||
surrender: "Từ chối"
|
||||
_delivery:
|
||||
stop: "Đã vô hiệu hóa"
|
||||
_type:
|
||||
none: "Đang đăng"
|
||||
_announcement:
|
||||
forExistingUsers: "Chỉ những người dùng đã tồn tại"
|
||||
forExistingUsersDescription: "Nếu được bật, thông báo này sẽ chỉ hiển thị với những người dùng đã tồn tại vào lúc thông báo được tạo. Nếu tắt đi, những tài khoản mới đăng ký sau khi thông báo được đăng lên cũng sẽ thấy nó."
|
||||
@ -1223,7 +1296,7 @@ _achievements:
|
||||
_viewAchievements3min:
|
||||
title: "Yêu Thành tích"
|
||||
description: "Ngắm danh sách thành tích đến tận hơn 3 phút"
|
||||
_iLoveMisskey:
|
||||
_iLoveCherryPick:
|
||||
title: "Tôi Yêu CherryPick"
|
||||
description: "Đăng lời nói \"I ❤ #CherryPick\""
|
||||
flavor: "Xin chân thành cảm ơn bạn đã sử dụng CherryPick!! by Đội ngũ phát triển"
|
||||
@ -1297,6 +1370,7 @@ _role:
|
||||
ltlAvailable: "Xem Timeline trong máy chủ này"
|
||||
canPublicNote: "Cho phép đăng bài công khai"
|
||||
canManageCustomEmojis: "Quản lý CustomEmoji"
|
||||
canManageAvatarDecorations: "Quản lý trang trí ảnh đại diện"
|
||||
driveCapacity: "Dữ liệu Drive"
|
||||
pinMax: "Giới hạn ghim bài viết"
|
||||
antennaMax: "Giới hạn tạo ăng ten"
|
||||
@ -1593,7 +1667,6 @@ _2fa:
|
||||
registerTOTP: "Đăng ký ứng dụng xác thực"
|
||||
step1: "Trước tiên, hãy cài đặt một ứng dụng xác minh (chẳng hạn như {a} hoặc {b}) trên thiết bị của bạn."
|
||||
step2: "Sau đó, quét mã QR hiển thị trên màn hình này."
|
||||
step2Click: "Quét mã QR trên ứng dụng xác thực (Authy, Google authenticator, v.v.)"
|
||||
step3Title: "Nhập mã xác thực"
|
||||
step3: "Nhập mã token do ứng dụng của bạn cung cấp để hoàn tất thiết lập."
|
||||
step4: "Kể từ bây giờ, những lần đăng nhập trong tương lai sẽ yêu cầu mã token đăng nhập đó."
|
||||
@ -1878,7 +1951,7 @@ _notification:
|
||||
yourFollowRequestAccepted: "Yêu cầu theo dõi của bạn đã được chấp nhận"
|
||||
youWereInvitedToGroup: "Bạn đã được mời tham gia nhóm"
|
||||
pollEnded: "Cuộc bình chọn đã kết thúc"
|
||||
unreadAntennaNote: "Ăng ten"
|
||||
unreadAntennaNote: "Ăng ten {name}"
|
||||
emptyPushNotificationMessage: "Đã cập nhật thông báo đẩy"
|
||||
achievementEarned: "Hoàn thành Achievement"
|
||||
_types:
|
||||
@ -1941,6 +2014,6 @@ _webhookSettings:
|
||||
_moderationLogTypes:
|
||||
suspend: "Vô hiệu hóa"
|
||||
resetPassword: "Đặt lại mật khẩu"
|
||||
createInvitation: "Tạo lời mời"
|
||||
_reversi:
|
||||
total: "Tổng cộng"
|
||||
|
||||
|
@ -58,7 +58,7 @@ copyUserId: "复制用户 ID"
|
||||
copyNoteId: "复制帖子 ID"
|
||||
copyFileId: "复制文件ID"
|
||||
copyFolderId: "复制文件夹ID"
|
||||
copyProfileUrl: "复制配置文件URL"
|
||||
copyProfileUrl: "复制个人资料URL"
|
||||
searchUser: "搜索用户"
|
||||
reply: "回复"
|
||||
loadMore: "查看更多"
|
||||
@ -108,11 +108,14 @@ enterEmoji: "输入表情符号"
|
||||
renote: "转发"
|
||||
unrenote: "取消转发"
|
||||
renoted: "已转发。"
|
||||
renotedToX: "转帖给 {name}"
|
||||
cantRenote: "该帖无法转发。"
|
||||
cantReRenote: "转发无法被再次转发。"
|
||||
quote: "引用"
|
||||
inChannelRenote: "在频道内转发"
|
||||
inChannelQuote: "在频道内引用"
|
||||
renoteToChannel: "转帖至频道"
|
||||
renoteToOtherChannel: "转帖至其它频道"
|
||||
pinnedNote: "已置顶的帖子"
|
||||
pinned: "置顶"
|
||||
you: "您"
|
||||
@ -313,6 +316,7 @@ selectFile: "选择文件"
|
||||
selectFiles: "选择文件"
|
||||
selectFolder: "选择文件夹"
|
||||
selectFolders: "选择多个文件夹"
|
||||
fileNotSelected: "未选择文件"
|
||||
renameFile: "重命名文件"
|
||||
folderName: "文件夹名称"
|
||||
createFolder: "创建文件夹"
|
||||
@ -400,6 +404,7 @@ name: "名称"
|
||||
antennaSource: "接收来源"
|
||||
antennaKeywords: "包含关键字"
|
||||
antennaExcludeKeywords: "排除关键字"
|
||||
antennaExcludeBots: "排除机器人账户"
|
||||
antennaKeywordsDescription: "AND 条件用空格分隔,OR 条件用换行符分隔。"
|
||||
notifyAntenna: "开启通知"
|
||||
withFileAntenna: "仅带有附件的帖子"
|
||||
@ -476,6 +481,7 @@ noteOf: "{user} 的帖子"
|
||||
inviteToGroup: "群组邀请"
|
||||
quoteAttached: "已引用"
|
||||
quoteQuestion: "是否引用此链接内容?"
|
||||
attachAsFileQuestion: "剪贴板内的文字过长。要转换为文本文件并添加吗?"
|
||||
noMessagesYet: "现在没有新的聊天"
|
||||
newMessageExists: "新信息"
|
||||
onlyOneFileCanBeAttached: "只能添加一个附件"
|
||||
@ -506,6 +512,7 @@ disableDrawer: "不显示抽屉菜单"
|
||||
youHaveNoGroups: "没有群组"
|
||||
joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。"
|
||||
showNoteActionsOnlyHover: "仅在悬停时显示帖子操作"
|
||||
showReactionsCount: "显示帖子的回应数"
|
||||
noHistory: "没有历史记录"
|
||||
signinHistory: "登录历史"
|
||||
enableAdvancedMfm: "启用扩展 MFM"
|
||||
@ -626,7 +633,7 @@ disablePlayer: "关闭播放器"
|
||||
expandTweet: "展开帖子"
|
||||
themeEditor: "主题编辑器"
|
||||
description: "描述"
|
||||
describeFile: "添加标题"
|
||||
describeFile: "添加描述"
|
||||
enterFileDescription: "输入标题"
|
||||
author: "作者"
|
||||
leaveConfirm: "存在未保存的更改。要放弃更改吗?"
|
||||
@ -1033,6 +1040,7 @@ thisPostMayBeAnnoyingHome: "发到首页"
|
||||
thisPostMayBeAnnoyingCancel: "取消"
|
||||
thisPostMayBeAnnoyingIgnore: "就这样发布"
|
||||
collapseRenotes: "省略显示已经看过的转发内容"
|
||||
collapseRenotesDescription: "将回应过或转贴过的贴子折叠表示。"
|
||||
internalServerError: "内部服务器错误"
|
||||
internalServerErrorDescription: "内部服务器发生了预期外的错误"
|
||||
copyErrorInfo: "复制错误信息"
|
||||
@ -1215,7 +1223,7 @@ code: "代码"
|
||||
reloadRequiredToApplySettings: "需要重新载入来使设置生效"
|
||||
remainingN: "剩余:{n}"
|
||||
overwriteContentConfirm: "将覆盖现有内容。确定吗?"
|
||||
seasonalScreenEffect: "应景的画面效果"
|
||||
seasonalScreenEffect: "符合当前季节的画面效果"
|
||||
decorate: "装饰"
|
||||
addMfmFunction: "添加装饰"
|
||||
enableQuickAddMfmFunction: "显示高级 MFM 选择器"
|
||||
@ -1237,6 +1245,25 @@ enableHorizontalSwipe: "滑动切换标签页"
|
||||
loading: "读取中"
|
||||
surrender: "取消"
|
||||
gameRetry: "重试"
|
||||
notUsePleaseLeaveBlank: "如不使用请留空"
|
||||
useTotp: "使用一次性代码"
|
||||
useBackupCode: "使用备用代码"
|
||||
launchApp: "启动应用"
|
||||
useNativeUIForVideoAudioPlayer: "使用浏览器的 UI 播放动画及音频"
|
||||
keepOriginalFilename: "保持原文件名"
|
||||
keepOriginalFilenameDescription: "若关闭此设置,上传文件时文件名将被替换为随机字符。"
|
||||
noDescription: "没有描述"
|
||||
alwaysConfirmFollow: "总是确认关注"
|
||||
inquiry: "联系我们"
|
||||
_delivery:
|
||||
status: "投递状态"
|
||||
stop: "停止投递"
|
||||
resume: "继续投递"
|
||||
_type:
|
||||
none: "投递中"
|
||||
manuallySuspended: "手动停止中"
|
||||
goneSuspended: "因服务器被删除而停止"
|
||||
autoSuspendedForNotResponding: "因服务器无应答而停止"
|
||||
_bubbleGame:
|
||||
howToPlay: "游戏说明"
|
||||
hold: "抓住"
|
||||
@ -1247,6 +1274,7 @@ _bubbleGame:
|
||||
maxChain: "最高连击数"
|
||||
yen: "{yen} 日元"
|
||||
estimatedQty: "约 {qty} 个"
|
||||
scoreSweets: "相当于 {onigiriQtyWithUnit} 饭团"
|
||||
_howToPlay:
|
||||
section1: "对准位置将Emoji投入盒子。"
|
||||
section2: "相同的Emoji相互接触合成后会得到新的Emoji,以此获得分数。"
|
||||
@ -1364,7 +1392,7 @@ _serverSettings:
|
||||
_accountMigration:
|
||||
moveFrom: "从别的账号迁移到此账户"
|
||||
moveFromSub: "为另一个账户建立别名"
|
||||
moveFromLabel: "迁移前的账户"
|
||||
moveFromLabel: "迁移前的账户 #{n}"
|
||||
moveFromDescription: "如果迁移时需要继承其他账户的关注者,你需要创建一个别名。此操作需要在迁移前完成!\n请像这样输入要迁移的账户:@username@server.example.com\n如果要删除,请将输入字段留空,并保存(不推荐)。"
|
||||
moveTo: "把这个账户迁移到新的账户"
|
||||
moveToLabel: "迁移后的账户"
|
||||
@ -1537,7 +1565,7 @@ _achievements:
|
||||
_viewAchievements3min:
|
||||
title: "成就爱好者"
|
||||
description: "盯着成就看三分钟"
|
||||
_iLoveMisskey:
|
||||
_iLoveCherryPick:
|
||||
title: "I Love CherryPick"
|
||||
description: "发布 \"I ❤ #CherryPick\" 帖子"
|
||||
flavor: "感谢您使用 CherryPick ! by 开发团队"
|
||||
@ -1698,6 +1726,11 @@ _role:
|
||||
roleAssignedTo: "已分配给手动角色"
|
||||
isLocal: "是本地用户"
|
||||
isRemote: "是远程用户"
|
||||
isCat: "猫猫用户"
|
||||
isBot: "机器人用户"
|
||||
isSuspended: "停用的用户"
|
||||
isLocked: "锁推用户"
|
||||
isExplorable: "启用“使账号可见”的用户"
|
||||
createdLessThan: "账户创建时间少于"
|
||||
createdMoreThan: "账户创建时间超过"
|
||||
followersLessThanOrEq: "关注者不多于"
|
||||
@ -1767,6 +1800,7 @@ _plugin:
|
||||
installWarn: "请不要安装不可信的插件。"
|
||||
manage: "管理插件..."
|
||||
viewSource: "查看源代码"
|
||||
viewLog: "显示日志"
|
||||
_preferencesBackups:
|
||||
list: "已创建的备份"
|
||||
saveNew: "另存为"
|
||||
@ -2024,7 +2058,6 @@ _2fa:
|
||||
registerTOTP: "开始设置认证应用"
|
||||
step1: "首先,在您的设备上安装验证应用,例如 {a} 或 {b}。"
|
||||
step2: "然后,扫描屏幕上显示的二维码。"
|
||||
step2Click: "通过点击二维码,您可以使用设备上安装的身份验证器应用程序或密钥环进行注册"
|
||||
step2Uri: "如果使用桌面应用程序的话,请输入下面的 URI"
|
||||
step3Title: "输入验证码"
|
||||
step3: "输入您的应用提供的动态口令以完成设置。"
|
||||
@ -2048,6 +2081,7 @@ _2fa:
|
||||
backupCodesDescription: "如果无法使用认证应用,可以使用以下的备用代码来访问账户。请务必将这些代码保存在安全的地方。每个代码仅可使用一次。"
|
||||
backupCodeUsedWarning: "已使用备用代码。如果无法使用认证应用,请尽快重新设定。"
|
||||
backupCodesExhaustedWarning: "已使用完所有的备用代码。如果无法使用认证应用,将无法再访问您的账户。请再次设定认证应用。"
|
||||
moreDetailedGuideHere: "此处为详细指南"
|
||||
_permissions:
|
||||
"read:account": "查看账户信息"
|
||||
"write:account": "更改帐户信息"
|
||||
@ -2098,7 +2132,6 @@ _permissions:
|
||||
"read:admin:server-info": "查看服务器信息"
|
||||
"read:admin:show-moderation-log": "查看管理日志"
|
||||
"read:admin:show-user": "查看用户的非公开信息"
|
||||
"read:admin:show-users": "查看用户的非公开信息"
|
||||
"write:admin:suspend-user": "冻结用户"
|
||||
"write:admin:unset-user-avatar": "删除用户头像"
|
||||
"write:admin:unset-user-banner": "删除用户横幅"
|
||||
@ -2311,6 +2344,7 @@ _play:
|
||||
title: "标题"
|
||||
script: "脚本"
|
||||
summary: "描述"
|
||||
visibilityDescription: "设置为不公开后资料将不再显示,但知道 URL 的人仍可继续访问。"
|
||||
_pages:
|
||||
newPage: "创建页面"
|
||||
editPage: "编辑页面"
|
||||
@ -2355,6 +2389,8 @@ _pages:
|
||||
section: "章节"
|
||||
image: "图片"
|
||||
button: "按钮"
|
||||
dynamic: "动态区块"
|
||||
dynamicDescription: "这个区块已经废弃。以后请使用{play}。"
|
||||
note: "嵌入的帖子"
|
||||
_note:
|
||||
id: "帖子 ID"
|
||||
@ -2385,6 +2421,7 @@ _notification:
|
||||
sendTestNotification: "发送测试通知"
|
||||
notificationWillBeDisplayedLikeThis: "通知将会这样表示"
|
||||
reactedBySomeUsers: "{n} 人回应了"
|
||||
likedBySomeUsers: "{n}人赞了你的帖子"
|
||||
renotedBySomeUsers: "{n} 人转发了"
|
||||
followedBySomeUsers: "被 {n} 人关注"
|
||||
flushNotification: "重置通知历史"
|
||||
@ -2412,6 +2449,7 @@ _deck:
|
||||
alwaysShowMainColumn: "总是显示主列"
|
||||
columnAlign: "列对齐"
|
||||
addColumn: "添加列"
|
||||
newNoteNotificationSettings: "新帖子通知设定"
|
||||
configureColumn: "列设置"
|
||||
swapLeft: "向左移动"
|
||||
swapRight: "向右移动"
|
||||
@ -2568,6 +2606,7 @@ _hemisphere:
|
||||
_reversi:
|
||||
reversi: "黑白棋"
|
||||
gameSettings: "对局设置"
|
||||
chooseBoard: "选择棋盘"
|
||||
blackOrWhite: "先手/后手"
|
||||
blackIs: "{name}执黑(先手)"
|
||||
rules: "规则"
|
||||
@ -2594,6 +2633,8 @@ _reversi:
|
||||
allGames: "所有对局"
|
||||
ended: "结束"
|
||||
playing: "对局中"
|
||||
isLlotheo: "落子少的一方获胜(又名奥赛罗)"
|
||||
loopedMap: "循环棋盘"
|
||||
canPutEverywhere: "无限制放置模式"
|
||||
timeLimitForEachTurn: "1回合的时间限制"
|
||||
freeMatch: "自由匹配"
|
||||
@ -2609,4 +2650,21 @@ _reversi:
|
||||
_offlineScreen:
|
||||
title: "离线——无法连接到服务器"
|
||||
header: "无法连接到服务器"
|
||||
|
||||
_urlPreviewSetting:
|
||||
title: "设置 URL 预览"
|
||||
enable: "启用 URL 预览"
|
||||
timeout: "超时阈值(ms)"
|
||||
timeoutDescription: "如果获取预览所用时间超过这个值,则不生成预览。"
|
||||
maximumContentLength: "Content-Length 的最大值(byte)"
|
||||
maximumContentLengthDescription: "如果 Content-Length 超过这个值,则不生成预览。"
|
||||
requireContentLength: "仅在能取得 Content-Length 时生成预览"
|
||||
requireContentLengthDescription: "如果目标服务器不返回 Content-Length,则不生成预览。"
|
||||
userAgent: "User-Agent"
|
||||
userAgentDescription: "设定获取预览时使用的 User-Agent。留空时将使用默认的 User-Agent。"
|
||||
summaryProxy: "用来生成预览的代理的 endpoint。"
|
||||
summaryProxyDescription: "不使用 Misskey 本体,而是通过 Summaly Proxy 生成预览。"
|
||||
summaryProxyDescription2: "下面的参数将作为查询字符串发送至代理。代理侧如果不支持此设置,则忽略设定值。"
|
||||
_mediaControls:
|
||||
pip: "画中画"
|
||||
playbackRate: "播放速度"
|
||||
loop: "循环播放"
|
||||
|
@ -108,11 +108,14 @@ enterEmoji: "輸入表情符號"
|
||||
renote: "轉發"
|
||||
unrenote: "取消轉發"
|
||||
renoted: "轉發成功。"
|
||||
renotedToX: "轉發給 {name} 了。"
|
||||
cantRenote: "無法轉發此貼文。"
|
||||
cantReRenote: "無法轉發之前已經轉發過的內容。"
|
||||
quote: "引用"
|
||||
inChannelRenote: "在頻道內轉發"
|
||||
inChannelQuote: "在頻道內引用"
|
||||
renoteToChannel: "轉發至頻道"
|
||||
renoteToOtherChannel: "轉發至其他頻道"
|
||||
pinnedNote: "已置頂的貼文"
|
||||
pinned: "置頂"
|
||||
you: "您"
|
||||
@ -169,7 +172,7 @@ cacheRemoteSensitiveFilesDescription: "若停用這個設定,則不會快取
|
||||
flagAsBot: "此使用者是機器人"
|
||||
flagAsBotDescription: "如果本帳戶是由程式控制,請啟用此選項。啟用後,會作為標示幫助其他開發者防止機器人之間產生無限互動的行為,並會調整 CherryPick 內部系統將本帳戶識別為機器人。"
|
||||
flagAsCat: "此帳戶是一隻貓,喵~~~!!!"
|
||||
flagAsCatDescription: "如果想將本帳戶標示為一隻貓,請開啟此標示"
|
||||
flagAsCatDescription: "喵喵喵??"
|
||||
flagShowTimelineReplies: "在時間軸上顯示貼文的回覆"
|
||||
flagShowTimelineRepliesDescription: "啟用後,時間軸除了顯示使用者的貼文以外,還會顯示使用者對其他貼文的回覆。"
|
||||
autoAcceptFollowed: "自動允許來自追隨中使用者的追隨請求"
|
||||
@ -205,7 +208,7 @@ silenceThisInstance: "禁言此伺服器"
|
||||
operations: "操作"
|
||||
software: "軟體"
|
||||
version: "版本"
|
||||
metadata: "元資料"
|
||||
metadata: "詮釋資料"
|
||||
withNFiles: "{n} 個檔案"
|
||||
monitor: "監視器"
|
||||
jobQueue: "佇列"
|
||||
@ -313,6 +316,7 @@ selectFile: "選擇檔案"
|
||||
selectFiles: "選擇檔案"
|
||||
selectFolder: "選擇資料夾"
|
||||
selectFolders: "選擇資料夾"
|
||||
fileNotSelected: "尚未選擇檔案"
|
||||
renameFile: "重新命名檔案"
|
||||
folderName: "資料夾名稱"
|
||||
createFolder: "新增資料夾"
|
||||
@ -366,7 +370,7 @@ enableRegistration: "開放新使用者註冊"
|
||||
invite: "邀請"
|
||||
driveCapacityPerLocalAccount: "每個本地使用者的雲端硬碟容量"
|
||||
driveCapacityPerRemoteAccount: "每個非本地用戶的雲端空間大小"
|
||||
inMb: "以Mbps為單位"
|
||||
inMb: "以 MB 為單位"
|
||||
bannerUrl: "橫幅圖片URL"
|
||||
backgroundImageUrl: "背景圖片的來源網址 "
|
||||
basicInfo: "基本資訊"
|
||||
@ -378,12 +382,12 @@ pinnedClipId: "置頂的摘錄ID"
|
||||
pinnedNotes: "已置頂的貼文"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "啟用 hCaptcha"
|
||||
hcaptchaSiteKey: "網站金鑰"
|
||||
hcaptchaSecretKey: "金鑰"
|
||||
hcaptchaSiteKey: "hcaptchaSiteKey"
|
||||
hcaptchaSecretKey: "hcaptchaSecretKey"
|
||||
mcaptcha: "mCaptcha"
|
||||
enableMcaptcha: "啟用 mCaptcha"
|
||||
mcaptchaSiteKey: "網站金鑰"
|
||||
mcaptchaSecretKey: "金鑰"
|
||||
mcaptchaSecretKey: "私密金鑰"
|
||||
mcaptchaInstanceUrl: "mCaptcha 的實例網址"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "啟用 reCAPTCHA"
|
||||
@ -391,8 +395,8 @@ recaptchaSiteKey: "網站金鑰"
|
||||
recaptchaSecretKey: "金鑰"
|
||||
turnstile: "Turnstile"
|
||||
enableTurnstile: "啟用 Turnstile"
|
||||
turnstileSiteKey: "網站金鑰"
|
||||
turnstileSecretKey: "金鑰"
|
||||
turnstileSiteKey: "turnstileSiteKey"
|
||||
turnstileSecretKey: "turnstileSecretKey"
|
||||
avoidMultiCaptchaConfirm: "使用多種驗證方式可能會造成干擾,您要關閉其他驗證方式嗎?您可以按「取消」保留多種驗證方式。"
|
||||
antennas: "天線"
|
||||
manageAntennas: "管理天線"
|
||||
@ -400,6 +404,7 @@ name: "名稱"
|
||||
antennaSource: "接收來源"
|
||||
antennaKeywords: "包含關鍵字"
|
||||
antennaExcludeKeywords: "排除關鍵字"
|
||||
antennaExcludeBots: "排除機器人帳戶"
|
||||
antennaKeywordsDescription: "空格代表「以及」(AND),換行代表「或者」(OR)"
|
||||
notifyAntenna: "通知有新貼文"
|
||||
withFileAntenna: "僅帶有附件的貼文"
|
||||
@ -471,11 +476,12 @@ title: "標題"
|
||||
text: "文字"
|
||||
enable: "啟用"
|
||||
next: "下一步"
|
||||
retype: "再次輸入"
|
||||
retype: "重新輸入"
|
||||
noteOf: "{user}的貼文"
|
||||
inviteToGroup: "邀請至群組"
|
||||
quoteAttached: "引用"
|
||||
quoteQuestion: "是否要引用?"
|
||||
attachAsFileQuestion: "剪貼簿的文字較長。請問是否要將其以文字檔的方式附加呢?"
|
||||
noMessagesYet: "沒有訊息"
|
||||
newMessageExists: "有新的訊息"
|
||||
onlyOneFileCanBeAttached: "只能加入一個附件"
|
||||
@ -506,6 +512,7 @@ disableDrawer: "不顯示下拉式選單"
|
||||
youHaveNoGroups: "找不到群組"
|
||||
joinOrCreateGroup: "請加入現有群組,或創建新群組。"
|
||||
showNoteActionsOnlyHover: "僅在游標停留時顯示貼文的操作選項"
|
||||
showReactionsCount: "顯示貼文的反應數目"
|
||||
noHistory: "沒有歷史紀錄"
|
||||
signinHistory: "登入歷史"
|
||||
enableAdvancedMfm: "啟用進階 MFM"
|
||||
@ -612,7 +619,7 @@ addItem: "新增項目"
|
||||
rearrange: "排序方式"
|
||||
relays: "中繼器"
|
||||
addRelay: "新增中繼器"
|
||||
inboxUrl: "收件夾URL"
|
||||
inboxUrl: "收件夾 URL"
|
||||
addedRelays: "已加入的中繼器"
|
||||
serviceworkerInfo: "如要使用推播通知,需要啟用此選項並設定金鑰。"
|
||||
deletedNote: "已刪除的貼文"
|
||||
@ -762,7 +769,7 @@ experimentalFeatures: "實驗中的功能"
|
||||
experimental: "實驗性"
|
||||
thisIsExperimentalFeature: "這是實驗性的功能。可能會有變更規格和不能正常動作的可能性。"
|
||||
developer: "開發者"
|
||||
makeExplorable: "使自己的帳戶能夠在「探索」頁面中顯示"
|
||||
makeExplorable: "使自己的帳戶更容易被找到"
|
||||
makeExplorableDescription: "如果關閉,帳戶將不會被顯示在「探索」頁面中。"
|
||||
showGapBetweenNotesInTimeline: "分開顯示時間軸上的貼文"
|
||||
duplicate: "複製"
|
||||
@ -801,7 +808,7 @@ newVersionOfClientAvailable: "新版本的客戶端可用。"
|
||||
usageAmount: "使用量"
|
||||
capacity: "容量"
|
||||
inUse: "已使用"
|
||||
editCode: "編輯代碼"
|
||||
editCode: "編輯程式碼"
|
||||
apply: "套用"
|
||||
receiveAnnouncementFromInstance: "接收來自伺服器的通知"
|
||||
emailNotification: "郵件通知"
|
||||
@ -1033,6 +1040,7 @@ thisPostMayBeAnnoyingHome: "發佈到首頁"
|
||||
thisPostMayBeAnnoyingCancel: "退出"
|
||||
thisPostMayBeAnnoyingIgnore: "直接發佈貼文"
|
||||
collapseRenotes: "省略顯示已看過的轉發貼文"
|
||||
collapseRenotesDescription: "將已做過反應和轉發的貼文折疊顯示。"
|
||||
internalServerError: "內部伺服器錯誤"
|
||||
internalServerErrorDescription: "內部伺服器出現意外錯誤。"
|
||||
copyErrorInfo: "複製錯誤資訊"
|
||||
@ -1074,7 +1082,7 @@ enableChartsForFederatedInstances: "生成遠端伺服器的圖表"
|
||||
showClipButtonInNoteFooter: "新增摘錄按鈕至貼文"
|
||||
reactionsDisplaySize: "反應的顯示尺寸"
|
||||
limitWidthOfReaction: "限制反應的最大寬度,並縮小顯示尺寸。"
|
||||
noteIdOrUrl: "貼文ID或URL"
|
||||
noteIdOrUrl: "貼文 ID 或 URL"
|
||||
video: "影片"
|
||||
videos: "影片"
|
||||
audio: "音效"
|
||||
@ -1089,7 +1097,7 @@ addMemo: "新增備註"
|
||||
editMemo: "編輯備註"
|
||||
reactionsList: "反應列表"
|
||||
renotesList: "轉發貼文列表"
|
||||
notificationDisplay: "通知的顯示"
|
||||
notificationDisplay: "通知"
|
||||
leftTop: "左上"
|
||||
rightTop: "右上"
|
||||
leftBottom: "左下"
|
||||
@ -1191,15 +1199,15 @@ repositoryUrlOrTarballRequired: "如果儲存庫不是公開的,則必須提
|
||||
feedback: "意見回饋"
|
||||
feedbackUrl: "意見回饋 URL"
|
||||
impressum: "營運者資訊"
|
||||
impressumUrl: "營運者資訊網址"
|
||||
impressumUrl: "營運者資訊 URL"
|
||||
impressumDescription: "在德國與部份地區必須要明確顯示營運者資訊。"
|
||||
privacyPolicy: "隱私政策"
|
||||
privacyPolicyUrl: "隱私政策網址"
|
||||
privacyPolicyUrl: "隱私政策 URL"
|
||||
tosAndPrivacyPolicy: "服務條款和隱私政策"
|
||||
avatarDecorations: "頭像裝飾"
|
||||
attach: "裝上"
|
||||
detach: "取下"
|
||||
detachAll: "移除所有裝飾"
|
||||
detachAll: "全部移除"
|
||||
angle: "角度"
|
||||
flip: "翻轉"
|
||||
showAvatarDecorations: "顯示頭像裝飾"
|
||||
@ -1217,7 +1225,7 @@ remainingN: "剩餘:{n}"
|
||||
overwriteContentConfirm: "確定要覆蓋目前的內容嗎?"
|
||||
seasonalScreenEffect: "隨季節變換畫面的呈現"
|
||||
decorate: "設置頭像裝飾"
|
||||
addMfmFunction: "插入MFM功能語法"
|
||||
addMfmFunction: "插入 MFM 功能語法"
|
||||
enableQuickAddMfmFunction: "顯示高級 MFM 選擇器"
|
||||
bubbleGame: "氣泡遊戲"
|
||||
sfx: "音效"
|
||||
@ -1237,6 +1245,25 @@ enableHorizontalSwipe: "滑動切換時間軸"
|
||||
loading: "載入中"
|
||||
surrender: "退出"
|
||||
gameRetry: "再試一次"
|
||||
notUsePleaseLeaveBlank: "如果不使用的話請留白"
|
||||
useTotp: "使用一次性密碼"
|
||||
useBackupCode: "使用備用驗證碼"
|
||||
launchApp: "啟動 APP"
|
||||
useNativeUIForVideoAudioPlayer: "使用瀏覽器的 UI 播放影片與音訊"
|
||||
keepOriginalFilename: "保留原始檔名"
|
||||
keepOriginalFilenameDescription: "如果關閉此設置,上傳時檔案名稱會自動替換為隨機字串。"
|
||||
noDescription: "沒有說明文字"
|
||||
alwaysConfirmFollow: "點擊追隨時總是顯示確認訊息"
|
||||
inquiry: "聯絡我們"
|
||||
_delivery:
|
||||
status: "傳送狀態"
|
||||
stop: "停止傳送"
|
||||
resume: "恢復傳送"
|
||||
_type:
|
||||
none: "直播中"
|
||||
manuallySuspended: "手動暫停中"
|
||||
goneSuspended: "因為伺服器刪除所以暫停中"
|
||||
autoSuspendedForNotResponding: "因為伺服器沒有回應所以暫停中"
|
||||
_bubbleGame:
|
||||
howToPlay: "玩法說明"
|
||||
hold: "保留"
|
||||
@ -1245,7 +1272,7 @@ _bubbleGame:
|
||||
scoreYen: "賺取的金額"
|
||||
highScore: "最高分"
|
||||
maxChain: "最大結合數"
|
||||
yen: "{yen} 日圓"
|
||||
yen: "{yen}円"
|
||||
estimatedQty: "{qty}個"
|
||||
scoreSweets: "飯糰 {onigiriQtyWithUnit}"
|
||||
_howToPlay:
|
||||
@ -1273,7 +1300,7 @@ _initialAccountSetting:
|
||||
privacySetting: "隱私設定"
|
||||
theseSettingsCanEditLater: "這裡的設定可以在之後變更。"
|
||||
youCanEditMoreSettingsInSettingsPageLater: "除此之外,還可以在「設定」頁面進行各種設定。之後請確認看看。"
|
||||
followUsers: "為了構築時間軸,試著追蹤您感興趣的使用者吧。"
|
||||
followUsers: "為了構築時間軸,試著追隨您感興趣的使用者吧。"
|
||||
pushNotificationDescription: "啟用推送通知,就可以在設備上接收{name}的通知。"
|
||||
initialAccountSettingCompleted: "初始設定完成了!"
|
||||
haveFun: "盡情享受{name}吧!"
|
||||
@ -1328,7 +1355,7 @@ _initialTutorial:
|
||||
title: "隱藏內容(CW)"
|
||||
description: "將顯示「註釋」中寫入的內容而不是本文。按一下「顯示內容」以顯示本文。"
|
||||
_exampleNote:
|
||||
cw: "美食恐怖主義注意"
|
||||
cw: "注意消夜文"
|
||||
note: "我吃了一個巧克力甜甜圈🍩😋"
|
||||
useCases: "伺服器的服務條款可能會規範特定的貼文需要使用隱藏內容,除此之外也會用在隱藏劇情洩漏與敏感內容的貼文。"
|
||||
_howToMakeAttachmentsSensitive:
|
||||
@ -1353,7 +1380,7 @@ _serverRules:
|
||||
_serverSettings:
|
||||
iconUrl: "圖示的 URL"
|
||||
appIconDescription: "指定顯示 {host} 為應用程式時的圖示。"
|
||||
appIconUsageExample: "例如:漸進式網路應用程式(PWA)、於手機桌面新增書籤"
|
||||
appIconUsageExample: "例如:PWA 或是在手機桌面作為書籤等"
|
||||
appIconStyleRecommendation: "因為可能會裁剪成圓形或圓角,所以建議用單色填滿邊框及背景。"
|
||||
appIconResolutionMustBe: "解析度必須為 {resolution}。"
|
||||
manifestJsonOverride: "覆寫 manifest.json"
|
||||
@ -1362,10 +1389,12 @@ _serverSettings:
|
||||
fanoutTimelineDescription: "如果啟用的話,檢索各個時間軸的性能會顯著提昇,資料庫的負荷也會減少。不過,Redis 的記憶體使用量會增加。如果伺服器的記憶體容量比較少或者運行不穩定,可以停用。"
|
||||
fanoutTimelineDbFallback: "資料庫的回退"
|
||||
fanoutTimelineDbFallbackDescription: "若啟用,在時間軸沒有快取的情況下將執行回退處理以額外查詢資料庫。若停用,可以透過不執行回退處理來進一步減少伺服器的負荷,但會限制可取得的時間軸範圍。"
|
||||
inquiryUrl: "聯絡表單網址"
|
||||
inquiryUrlDescription: "指定伺服器運營者的聯絡表單網址或包含運營者聯絡資訊網頁的網址。"
|
||||
_accountMigration:
|
||||
moveFrom: "從其他帳戶遷移到這個帳戶"
|
||||
moveFromSub: "為另一個帳戶建立別名"
|
||||
moveFromLabel: "要遷移過來的帳戶:"
|
||||
moveFromLabel: "要遷移過來的帳戶 #{n}"
|
||||
moveFromDescription: "如果你想把追隨者從別的帳戶遷移過來,必須先在這裡建立別名。請務必在執行遷移之前建立別名!請像這樣輸入要遷移的帳戶:@person@instance.com"
|
||||
moveTo: "將這個帳戶遷移至新的帳戶"
|
||||
moveToLabel: "要遷移到的帳戶:"
|
||||
@ -1538,7 +1567,7 @@ _achievements:
|
||||
_viewAchievements3min:
|
||||
title: "成就發燒友"
|
||||
description: "看著成就列表超過三分鐘"
|
||||
_iLoveMisskey:
|
||||
_iLoveCherryPick:
|
||||
title: "I Love CherryPick"
|
||||
description: "發佈「I ❤ #CherryPick」"
|
||||
flavor: "感謝您使用 CherryPick!by 開發團隊"
|
||||
@ -1561,7 +1590,7 @@ _achievements:
|
||||
_postedAt0min0sec:
|
||||
title: "報時"
|
||||
description: "在零分零秒發佈貼文"
|
||||
flavor: "啵、啵、啵、嗶ーー"
|
||||
flavor: "啵.啵.啵.嗶ー"
|
||||
_selfQuote:
|
||||
title: "自我引用"
|
||||
description: "引用了自己的貼文"
|
||||
@ -1700,6 +1729,11 @@ _role:
|
||||
roleAssignedTo: "手動指派角色完成"
|
||||
isLocal: "本地使用者"
|
||||
isRemote: "遠端使用者"
|
||||
isCat: "貓使用者"
|
||||
isBot: "機器人使用者"
|
||||
isSuspended: "被停權的使用者"
|
||||
isLocked: "上鎖的使用者"
|
||||
isExplorable: "開啟了「使您的帳戶更容易被找到」功能的使用者"
|
||||
createdLessThan: "帳戶加入時間不超過"
|
||||
createdMoreThan: "帳戶加入時間已超過"
|
||||
followersLessThanOrEq: "追隨者人數在~以下"
|
||||
@ -1769,6 +1803,7 @@ _plugin:
|
||||
installWarn: "請不要安裝來源不明的外掛。"
|
||||
manage: "管理外掛"
|
||||
viewSource: "檢視原始碼"
|
||||
viewLog: "顯示記錄 "
|
||||
_preferencesBackups:
|
||||
list: "已備份的設定檔"
|
||||
saveNew: "另存新檔"
|
||||
@ -1923,7 +1958,7 @@ _theme:
|
||||
invalid: "佈景主題格式錯誤"
|
||||
make: "製作佈景主題"
|
||||
base: "基於"
|
||||
addConstant: "添加常數"
|
||||
addConstant: "新增常數"
|
||||
constant: "常數"
|
||||
defaultValue: "預設值"
|
||||
color: "顏色"
|
||||
@ -2000,22 +2035,22 @@ _soundSettings:
|
||||
_ago:
|
||||
future: "未來"
|
||||
justNow: "剛剛"
|
||||
secondsAgo: "{n} 秒前"
|
||||
minutesAgo: "{n} 分鐘前 "
|
||||
hoursAgo: "{n} 小時前"
|
||||
daysAgo: "{n} 天前"
|
||||
weeksAgo: "{n} 週前"
|
||||
monthsAgo: "{n} 個月前"
|
||||
yearsAgo: "{n} 年前"
|
||||
secondsAgo: "{n}秒前"
|
||||
minutesAgo: "{n}分鐘前"
|
||||
hoursAgo: "{n}小時前"
|
||||
daysAgo: "{n}天前"
|
||||
weeksAgo: "{n}周前"
|
||||
monthsAgo: "{n}個月前"
|
||||
yearsAgo: "{n}年前"
|
||||
invalid: "無"
|
||||
_timeIn:
|
||||
seconds: "{n} 秒後"
|
||||
minutes: "{n} 分後"
|
||||
hours: "{n} 小時後"
|
||||
days: "{n} 日後"
|
||||
weeks: "{n} 週後"
|
||||
months: "{n} 個月後"
|
||||
years: "{n} 年後"
|
||||
seconds: "{n}秒後"
|
||||
minutes: "{n}分鐘後"
|
||||
hours: "{n}小時後"
|
||||
days: "{n}天後"
|
||||
weeks: "{n}周後"
|
||||
months: "{n}個月後"
|
||||
years: "{n}年後"
|
||||
_time:
|
||||
second: "秒"
|
||||
minute: "分鐘"
|
||||
@ -2026,7 +2061,6 @@ _2fa:
|
||||
registerTOTP: "開始設定驗證應用程式"
|
||||
step1: "首先,在您的裝置上安裝驗證程式,例如 {a} 或 {b}。"
|
||||
step2: "然後,掃描螢幕上的 QR 碼。"
|
||||
step2Click: "您可以點擊 QR 碼,以使用裝置上的驗證應用程式或金鑰環註冊。"
|
||||
step2Uri: "使用桌面版應用程式時,請輸入以下的 URI"
|
||||
step3Title: "輸入驗證碼"
|
||||
step3: "輸入應用程式所提供的權杖以完成設定。"
|
||||
@ -2050,6 +2084,7 @@ _2fa:
|
||||
backupCodesDescription: "如果驗證應用程式不能用了,可以使用以下的備用驗證碼存取您的帳戶。請務必妥善保管這個驗證碼。每個驗證碼只能使用一次。"
|
||||
backupCodeUsedWarning: "已使用備用驗證碼。如果無法使用驗證應用程式,請盡快重新設定。"
|
||||
backupCodesExhaustedWarning: "已使用所有備用驗證碼。如果無法使用驗證應用程式,則將無法再存取您的帳戶。請重新設定您的驗證應用程式。"
|
||||
moreDetailedGuideHere: "請點擊此處查看詳細說明。"
|
||||
_permissions:
|
||||
"read:account": "查看我的帳戶資訊"
|
||||
"write:account": "更改我的帳戶資訊"
|
||||
@ -2093,19 +2128,18 @@ _permissions:
|
||||
"read:admin:index-stats": "查看資料庫索引的相關資訊"
|
||||
"read:admin:table-stats": "查看資料庫表格的相關資訊"
|
||||
"read:admin:user-ips": "查看使用者的 IP 位址"
|
||||
"read:admin:meta": "查看實例的元資料"
|
||||
"read:admin:meta": "查看實例的詮釋資料"
|
||||
"write:admin:reset-password": "重設使用者的密碼"
|
||||
"write:admin:resolve-abuse-user-report": "解決來自使用者的檢舉"
|
||||
"write:admin:send-email": "發送郵件"
|
||||
"read:admin:server-info": "查看伺服器的資訊"
|
||||
"read:admin:show-moderation-log": "查看審查紀錄"
|
||||
"read:admin:show-user": "查看使用者的私密資訊"
|
||||
"read:admin:show-users": "查看使用者的私密資訊"
|
||||
"write:admin:suspend-user": "凍結使用者"
|
||||
"write:admin:unset-user-avatar": "刪除使用者的頭像"
|
||||
"write:admin:unset-user-banner": "刪除使用者的橫幅"
|
||||
"write:admin:unsuspend-user": "解除凍結使用者"
|
||||
"write:admin:meta": "編輯實例的元資料"
|
||||
"write:admin:meta": "編輯實例的詮釋資料"
|
||||
"write:admin:user-note": "編輯審查筆記"
|
||||
"write:admin:roles": "編輯角色"
|
||||
"read:admin:roles": "查看角色"
|
||||
@ -2154,13 +2188,13 @@ _antennaSources:
|
||||
userGroup: "來自特定群組的貼文"
|
||||
userBlacklist: "除指定使用者外的所有貼文"
|
||||
_weekday:
|
||||
sunday: "週日"
|
||||
monday: "週一"
|
||||
tuesday: "週二"
|
||||
wednesday: "週三"
|
||||
thursday: "週四"
|
||||
friday: "週五"
|
||||
saturday: "週六"
|
||||
sunday: "星期天"
|
||||
monday: "星期一"
|
||||
tuesday: "星期二"
|
||||
wednesday: "星期三"
|
||||
thursday: "星期四"
|
||||
friday: "星期五"
|
||||
saturday: "星期六"
|
||||
_widgets:
|
||||
profile: "個人檔案"
|
||||
instanceInfo: "伺服器資訊"
|
||||
@ -2209,7 +2243,7 @@ _poll:
|
||||
deadlineDate: "截止日期"
|
||||
deadlineTime: "小時"
|
||||
duration: "時長"
|
||||
votesCount: "{n} 票"
|
||||
votesCount: "{n}票"
|
||||
totalVotes: "合計 {n} 票"
|
||||
vote: "投票"
|
||||
showResult: "顯示結果"
|
||||
@ -2242,7 +2276,7 @@ _postForm:
|
||||
e: "寫些什麼吧……"
|
||||
f: "靜待發文……"
|
||||
_profile:
|
||||
name: "名稱"
|
||||
name: "名字"
|
||||
username: "使用者名稱"
|
||||
description: "關於我"
|
||||
youCanIncludeHashtags: "你也可以在「關於我」中加上 #tag"
|
||||
@ -2275,7 +2309,7 @@ _charts:
|
||||
notesIncDec: "貼文増減"
|
||||
localNotesIncDec: "本地貼文増減"
|
||||
remoteNotesIncDec: "遠端貼文數目增减"
|
||||
notesTotal: "貼文合共"
|
||||
notesTotal: "貼文總數"
|
||||
filesIncDec: "檔案增減"
|
||||
filesTotal: "檔案總數"
|
||||
storageUsageIncDec: "儲存空間增減"
|
||||
@ -2301,10 +2335,10 @@ _timelines:
|
||||
_play:
|
||||
new: "新增 Play"
|
||||
edit: "編輯 Play"
|
||||
created: "已新增Play "
|
||||
updated: "已更新Play "
|
||||
created: "已新增 Play "
|
||||
updated: "已更新 Play "
|
||||
deleted: "已刪除 Play"
|
||||
pageSetting: "Play設定"
|
||||
pageSetting: "Play 設定"
|
||||
editThisPage: "編輯此 Play"
|
||||
viewSource: "檢視原始碼"
|
||||
my: "自己的 Play"
|
||||
@ -2313,10 +2347,11 @@ _play:
|
||||
title: "標題"
|
||||
script: "腳本"
|
||||
summary: "描述"
|
||||
visibilityDescription: "如果您將其設為私密,它將不再顯示在您的個人資料中,但知道該 URL 的人仍然可以存取它。"
|
||||
_pages:
|
||||
newPage: "建立頁面"
|
||||
editPage: "編輯頁面"
|
||||
readPage: "正檢視原始碼"
|
||||
readPage: "正在檢視原始碼"
|
||||
created: "頁面已建立"
|
||||
updated: "頁面已更新"
|
||||
deleted: "頁面已被刪除"
|
||||
@ -2343,7 +2378,7 @@ _pages:
|
||||
hideTitleWhenPinned: "被置頂於個人資料時隱藏頁面標題"
|
||||
font: "字型"
|
||||
fontSerif: "襯線體"
|
||||
fontSansSerif: "無襯線體"
|
||||
fontSansSerif: "黑體"
|
||||
eyeCatchingImageSet: "設定封面影像"
|
||||
eyeCatchingImageRemove: "刪除封面影像"
|
||||
chooseBlock: "新增方塊"
|
||||
@ -2357,6 +2392,8 @@ _pages:
|
||||
section: "區段"
|
||||
image: "圖片"
|
||||
button: "按鈕"
|
||||
dynamic: "動態方塊"
|
||||
dynamicDescription: "這個方塊已經廢止,現在開始請使用 {play}。"
|
||||
note: "嵌式貼文"
|
||||
_note:
|
||||
id: "貼文ID"
|
||||
@ -2387,6 +2424,7 @@ _notification:
|
||||
sendTestNotification: "發送測試通知"
|
||||
notificationWillBeDisplayedLikeThis: "通知會以這樣的方式顯示"
|
||||
reactedBySomeUsers: "{n}人做出了反應"
|
||||
likedBySomeUsers: "{n} 人按了讚"
|
||||
renotedBySomeUsers: "{n}人做了轉發"
|
||||
followedBySomeUsers: "被{n}人追隨了"
|
||||
flushNotification: "重置通知歷史紀錄"
|
||||
@ -2414,6 +2452,7 @@ _deck:
|
||||
alwaysShowMainColumn: "總是顯示主欄"
|
||||
columnAlign: "對齊欄位"
|
||||
addColumn: "新增欄位"
|
||||
newNoteNotificationSettings: "新貼文通知的設定"
|
||||
configureColumn: "欄位的設定"
|
||||
swapLeft: "向左移動"
|
||||
swapRight: "向右移動"
|
||||
@ -2452,7 +2491,7 @@ _drivecleaner:
|
||||
orderByCreatedAtAsc: "按新增日期降序排列"
|
||||
_webhookSettings:
|
||||
createWebhook: "建立 Webhook"
|
||||
name: "名稱"
|
||||
name: "名字"
|
||||
secret: "密鑰"
|
||||
events: "何時運行 Webhook"
|
||||
active: "已啟用"
|
||||
@ -2614,4 +2653,21 @@ _reversi:
|
||||
_offlineScreen:
|
||||
title: "離線-無法連接伺服器"
|
||||
header: "無法連接伺服器"
|
||||
|
||||
_urlPreviewSetting:
|
||||
title: "URL 預覽設定"
|
||||
enable: "啟用 URL 預覽"
|
||||
timeout: "取得預覽的逾時時間 (ms)"
|
||||
timeoutDescription: "若取得預覽所需的時間超過這個值,則不會產生預覽。"
|
||||
maximumContentLength: "Content-Length 的最大値 (byte)"
|
||||
maximumContentLengthDescription: "若 Content-Length 超過這個值,則不會產生預覽。"
|
||||
requireContentLength: "僅在能夠取得 Content-Length 時,才產生預覽。"
|
||||
requireContentLengthDescription: "若對方的伺服器未回傳 Content -Length,則不會產生預覽。"
|
||||
userAgent: "User-Agent"
|
||||
userAgentDescription: "設定獲取預覽時使用的 User-Agent 。如果留空,將使用預設的 User-Agent 。"
|
||||
summaryProxy: "產生預覽的代理端點"
|
||||
summaryProxyDescription: "使用摘要代理程式而不是 Misskey 本身產生預覽。"
|
||||
summaryProxyDescription2: "以下參數會作為查詢字串連結到代理。如果代理端不支援,這些設定將被忽略。"
|
||||
_mediaControls:
|
||||
pip: "畫中畫"
|
||||
playbackRate: "播放速度"
|
||||
loop: "循環播放"
|
||||
|
28
package.json
28
package.json
@ -1,13 +1,13 @@
|
||||
{
|
||||
"name": "cherrypick",
|
||||
"version": "4.8.0",
|
||||
"basedMisskeyVersion": "2024.3.1",
|
||||
"version": "4.9.0",
|
||||
"basedMisskeyVersion": "2024.5.0",
|
||||
"codename": "nasubi",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/kokonect-link/cherrypick.git"
|
||||
},
|
||||
"packageManager": "pnpm@8.15.4",
|
||||
"packageManager": "pnpm@9.0.6",
|
||||
"workspaces": [
|
||||
"packages/frontend",
|
||||
"packages/backend",
|
||||
@ -52,24 +52,24 @@
|
||||
"lodash": "4.17.21"
|
||||
},
|
||||
"dependencies": {
|
||||
"cssnano": "6.0.5",
|
||||
"cssnano": "6.1.2",
|
||||
"execa": "8.0.1",
|
||||
"fast-glob": "3.3.2",
|
||||
"ignore-walk": "6.0.4",
|
||||
"js-yaml": "4.1.0",
|
||||
"postcss": "8.4.35",
|
||||
"tar": "6.2.0",
|
||||
"terser": "5.28.1",
|
||||
"typescript": "5.3.3",
|
||||
"esbuild": "0.19.11",
|
||||
"glob": "10.3.10"
|
||||
"postcss": "8.4.38",
|
||||
"tar": "6.2.1",
|
||||
"terser": "5.30.3",
|
||||
"typescript": "5.4.5",
|
||||
"esbuild": "0.20.2",
|
||||
"glob": "10.3.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.11.28",
|
||||
"@typescript-eslint/eslint-plugin": "7.1.0",
|
||||
"@typescript-eslint/parser": "7.1.0",
|
||||
"@types/node": "20.12.7",
|
||||
"@typescript-eslint/eslint-plugin": "7.7.1",
|
||||
"@typescript-eslint/parser": "7.7.1",
|
||||
"cross-env": "7.0.3",
|
||||
"cypress": "13.6.6",
|
||||
"cypress": "13.7.3",
|
||||
"eslint": "8.57.0",
|
||||
"ncp": "2.0.0",
|
||||
"start-server-and-test": "2.0.3"
|
||||
|
@ -0,0 +1,14 @@
|
||||
|
||||
export class NoRecursiveDelete1711722198590 {
|
||||
name = 'NoRecursiveDelete1711722198590'
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_17cb3553c700a4985dff5a30ff5"`);
|
||||
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_17cb3553c700a4985dff5a30ff5" FOREIGN KEY ("replyId") REFERENCES "note"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_17cb3553c700a4985dff5a30ff5"`);
|
||||
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_17cb3553c700a4985dff5a30ff5" FOREIGN KEY ("replyId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
}
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class AbuseReportNotification1713656541000 {
|
||||
name = 'AbuseReportNotification1713656541000'
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`
|
||||
CREATE TABLE "system_webhook" (
|
||||
"id" varchar(32) NOT NULL,
|
||||
"isActive" boolean NOT NULL DEFAULT true,
|
||||
"updatedAt" timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"latestSentAt" timestamp with time zone NULL DEFAULT NULL,
|
||||
"latestStatus" integer NULL DEFAULT NULL,
|
||||
"name" varchar(255) NOT NULL,
|
||||
"on" varchar(128) [] NOT NULL DEFAULT '{}'::character varying[],
|
||||
"url" varchar(1024) NOT NULL,
|
||||
"secret" varchar(1024) NOT NULL,
|
||||
CONSTRAINT "PK_system_webhook_id" PRIMARY KEY ("id")
|
||||
);
|
||||
CREATE INDEX "IDX_system_webhook_isActive" ON "system_webhook" ("isActive");
|
||||
CREATE INDEX "IDX_system_webhook_on" ON "system_webhook" USING gin ("on");
|
||||
|
||||
CREATE TABLE "abuse_report_notification_recipient" (
|
||||
"id" varchar(32) NOT NULL,
|
||||
"isActive" boolean NOT NULL DEFAULT true,
|
||||
"updatedAt" timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"name" varchar(255) NOT NULL,
|
||||
"method" varchar(64) NOT NULL,
|
||||
"userId" varchar(32) NULL DEFAULT NULL,
|
||||
"systemWebhookId" varchar(32) NULL DEFAULT NULL,
|
||||
CONSTRAINT "PK_abuse_report_notification_recipient_id" PRIMARY KEY ("id"),
|
||||
CONSTRAINT "FK_abuse_report_notification_recipient_userId1" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION,
|
||||
CONSTRAINT "FK_abuse_report_notification_recipient_userId2" FOREIGN KEY ("userId") REFERENCES "user_profile"("userId") ON DELETE CASCADE ON UPDATE NO ACTION,
|
||||
CONSTRAINT "FK_abuse_report_notification_recipient_systemWebhookId" FOREIGN KEY ("systemWebhookId") REFERENCES "system_webhook"("id") ON DELETE CASCADE ON UPDATE NO ACTION
|
||||
);
|
||||
CREATE INDEX "IDX_abuse_report_notification_recipient_isActive" ON "abuse_report_notification_recipient" ("isActive");
|
||||
CREATE INDEX "IDX_abuse_report_notification_recipient_method" ON "abuse_report_notification_recipient" ("method");
|
||||
CREATE INDEX "IDX_abuse_report_notification_recipient_userId" ON "abuse_report_notification_recipient" ("userId");
|
||||
CREATE INDEX "IDX_abuse_report_notification_recipient_systemWebhookId" ON "abuse_report_notification_recipient" ("systemWebhookId");
|
||||
`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE "abuse_report_notification_recipient" DROP CONSTRAINT "FK_abuse_report_notification_recipient_userId1";
|
||||
ALTER TABLE "abuse_report_notification_recipient" DROP CONSTRAINT "FK_abuse_report_notification_recipient_userId2";
|
||||
ALTER TABLE "abuse_report_notification_recipient" DROP CONSTRAINT "FK_abuse_report_notification_recipient_systemWebhookId";
|
||||
DROP INDEX "IDX_abuse_report_notification_recipient_isActive";
|
||||
DROP INDEX "IDX_abuse_report_notification_recipient_method";
|
||||
DROP INDEX "IDX_abuse_report_notification_recipient_userId";
|
||||
DROP INDEX "IDX_abuse_report_notification_recipient_systemWebhookId";
|
||||
DROP TABLE "abuse_report_notification_recipient";
|
||||
|
||||
DROP INDEX "IDX_system_webhook_isActive";
|
||||
DROP INDEX "IDX_system_webhook_on";
|
||||
DROP TABLE "system_webhook";
|
||||
`);
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class ChannelIdDenormalizedForMiPoll1716129964060 {
|
||||
name = 'ChannelIdDenormalizedForMiPoll1716129964060'
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "poll" ADD "channelId" character varying(32)`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "poll"."channelId" IS '[Denormalized]'`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_c1240fcc9675946ea5d6c2860e" ON "poll" ("channelId") `);
|
||||
await queryRunner.query(`UPDATE "poll" SET "channelId" = "note"."channelId" FROM "note" WHERE "poll"."noteId" = "note"."id"`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`DROP INDEX "public"."IDX_c1240fcc9675946ea5d6c2860e"`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "poll"."channelId" IS '[Denormalized]'`);
|
||||
await queryRunner.query(`ALTER TABLE "poll" DROP COLUMN "channelId"`);
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class NotRespondingSince1716345015347 {
|
||||
name = 'NotRespondingSince1716345015347'
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "instance" ADD "notRespondingSince" TIMESTAMP WITH TIME ZONE`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "notRespondingSince"`);
|
||||
}
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class SuspensionStateInsteadOfIsSspended1716345771510 {
|
||||
name = 'SuspensionStateInsteadOfIsSspended1716345771510'
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`CREATE TYPE "public"."instance_suspensionstate_enum" AS ENUM('none', 'manuallySuspended', 'goneSuspended', 'autoSuspendedForNotResponding')`);
|
||||
|
||||
await queryRunner.query(`DROP INDEX "public"."IDX_34500da2e38ac393f7bb6b299c"`);
|
||||
|
||||
await queryRunner.query(`ALTER TABLE "instance" RENAME COLUMN "isSuspended" TO "suspensionState"`);
|
||||
|
||||
await queryRunner.query(`ALTER TABLE "instance" ALTER COLUMN "suspensionState" DROP DEFAULT`);
|
||||
|
||||
await queryRunner.query(`ALTER TABLE "instance" ALTER COLUMN "suspensionState" TYPE "public"."instance_suspensionstate_enum" USING (
|
||||
CASE "suspensionState"
|
||||
WHEN TRUE THEN 'manuallySuspended'::instance_suspensionstate_enum
|
||||
ELSE 'none'::instance_suspensionstate_enum
|
||||
END
|
||||
)`);
|
||||
|
||||
await queryRunner.query(`ALTER TABLE "instance" ALTER COLUMN "suspensionState" SET DEFAULT 'none'`);
|
||||
|
||||
await queryRunner.query(`CREATE INDEX "IDX_3ede46f507c87ad698051d56a8" ON "instance" ("suspensionState") `);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`DROP INDEX "public"."IDX_3ede46f507c87ad698051d56a8"`);
|
||||
|
||||
await queryRunner.query(`ALTER TABLE "instance" ALTER COLUMN "suspensionState" DROP DEFAULT`);
|
||||
|
||||
await queryRunner.query(`ALTER TABLE "instance" ALTER COLUMN "suspensionState" TYPE boolean USING (
|
||||
CASE "suspensionState"
|
||||
WHEN 'none'::instance_suspensionstate_enum THEN FALSE
|
||||
ELSE TRUE
|
||||
END
|
||||
)`);
|
||||
|
||||
await queryRunner.query(`ALTER TABLE "instance" ALTER COLUMN "suspensionState" SET DEFAULT false`);
|
||||
|
||||
await queryRunner.query(`ALTER TABLE "instance" RENAME COLUMN "suspensionState" TO "isSuspended"`);
|
||||
|
||||
await queryRunner.query(`CREATE INDEX "IDX_34500da2e38ac393f7bb6b299c" ON "instance" ("isSuspended") `);
|
||||
|
||||
await queryRunner.query(`DROP TYPE "public"."instance_suspensionstate_enum"`);
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class RemoveAntennaNotify1716450883149 {
|
||||
name = 'RemoveAntennaNotify1716450883149'
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "notify"`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ADD "notify" boolean NOT NULL`);
|
||||
}
|
||||
}
|
16
packages/backend/migration/1717117195275-inquiryUrl.js
Normal file
16
packages/backend/migration/1717117195275-inquiryUrl.js
Normal file
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class InquiryUrl1717117195275 {
|
||||
name = 'InquiryUrl1717117195275'
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "inquiryUrl" character varying(1024)`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "inquiryUrl"`);
|
||||
}
|
||||
}
|
@ -4,7 +4,7 @@
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"engines": {
|
||||
"node": ">=20.10.0"
|
||||
"node": "^20.10.0"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "node ./built/boot/entry.js",
|
||||
@ -12,9 +12,9 @@
|
||||
"migrate": "pnpm typeorm migration:run -d ormconfig.js",
|
||||
"revert": "pnpm typeorm migration:revert -d ormconfig.js",
|
||||
"check:connect": "node ./scripts/check_connect.js",
|
||||
"build": "swc src -d built -D",
|
||||
"build:test": "swc test-server -d built-test -D --config-file test-server/.swcrc",
|
||||
"watch:swc": "swc src -d built -D -w",
|
||||
"build": "swc src -d built -D --strip-leading-paths",
|
||||
"build:test": "swc test-server -d built-test -D --config-file test-server/.swcrc --strip-leading-paths",
|
||||
"watch:swc": "swc src -d built -D -w --strip-leading-paths",
|
||||
"build:tsc": "tsc -p tsconfig.json && tsc-alias -p tsconfig.json",
|
||||
"watch": "node ./scripts/watch.mjs",
|
||||
"restart": "pnpm build && pnpm start",
|
||||
@ -66,43 +66,46 @@
|
||||
"utf-8-validate": "6.0.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "3.540.0",
|
||||
"@aws-sdk/lib-storage": "3.413.0",
|
||||
"@bull-board/api": "5.14.2",
|
||||
"@bull-board/fastify": "5.14.2",
|
||||
"@bull-board/ui": "5.14.2",
|
||||
"@discordapp/twemoji": "15.0.2",
|
||||
"@aws-sdk/client-s3": "3.412.0",
|
||||
"@aws-sdk/lib-storage": "3.412.0",
|
||||
"@bull-board/api": "5.17.0",
|
||||
"@bull-board/fastify": "5.17.0",
|
||||
"@bull-board/ui": "5.17.0",
|
||||
"@discordapp/twemoji": "15.0.3",
|
||||
"@fastify/accepts": "4.3.0",
|
||||
"@fastify/cookie": "9.3.1",
|
||||
"@fastify/cors": "8.5.0",
|
||||
"@fastify/express": "2.3.0",
|
||||
"@fastify/http-proxy": "9.3.0",
|
||||
"@fastify/multipart": "8.1.0",
|
||||
"@fastify/static": "6.12.0",
|
||||
"@fastify/view": "8.2.0",
|
||||
"@fastify/cors": "9.0.1",
|
||||
"@fastify/express": "3.0.0",
|
||||
"@fastify/http-proxy": "9.5.0",
|
||||
"@fastify/multipart": "8.2.0",
|
||||
"@fastify/static": "7.0.3",
|
||||
"@fastify/view": "9.1.0",
|
||||
"@google-cloud/logging": "^10.5.0",
|
||||
"@google-cloud/translate": "^7.2.1",
|
||||
"@misskey-dev/sharp-read-bmp": "1.2.0",
|
||||
"@misskey-dev/summaly": "5.1.0",
|
||||
"@nestjs/common": "10.3.3",
|
||||
"@nestjs/core": "10.3.3",
|
||||
"@nestjs/testing": "10.3.3",
|
||||
"@napi-rs/canvas": "^0.1.52",
|
||||
"@nestjs/common": "10.3.8",
|
||||
"@nestjs/core": "10.3.8",
|
||||
"@nestjs/testing": "10.3.8",
|
||||
"@peertube/http-signature": "1.7.0",
|
||||
"@simplewebauthn/server": "9.0.3",
|
||||
"@sentry/node": "^8.5.0",
|
||||
"@sentry/profiling-node": "^8.5.0",
|
||||
"@simplewebauthn/server": "10.0.0",
|
||||
"@sinonjs/fake-timers": "11.2.2",
|
||||
"@smithy/node-http-handler": "2.1.10",
|
||||
"@swc/cli": "0.1.63",
|
||||
"@swc/core": "1.3.107",
|
||||
"@twemoji/parser": "15.0.0",
|
||||
"@smithy/node-http-handler": "2.5.0",
|
||||
"@swc/cli": "0.3.12",
|
||||
"@swc/core": "1.4.17",
|
||||
"@twemoji/parser": "15.1.1",
|
||||
"@vitalets/google-translate-api": "9.2.0",
|
||||
"accepts": "1.3.8",
|
||||
"ajv": "8.12.0",
|
||||
"archiver": "6.0.1",
|
||||
"async-mutex": "0.4.1",
|
||||
"ajv": "8.13.0",
|
||||
"archiver": "7.0.1",
|
||||
"async-mutex": "0.5.0",
|
||||
"bcryptjs": "2.4.3",
|
||||
"blurhash": "2.0.5",
|
||||
"body-parser": "1.20.2",
|
||||
"bullmq": "5.4.0",
|
||||
"bullmq": "5.7.8",
|
||||
"cacheable-lookup": "7.0.0",
|
||||
"cbor": "9.0.2",
|
||||
"chalk": "5.3.0",
|
||||
@ -115,84 +118,83 @@
|
||||
"content-disposition": "0.5.4",
|
||||
"date-fns": "2.30.0",
|
||||
"deep-email-validator": "0.1.21",
|
||||
"fastify": "4.25.2",
|
||||
"fastify": "4.26.2",
|
||||
"fastify-raw-body": "4.3.0",
|
||||
"feed": "4.2.2",
|
||||
"file-type": "19.0.0",
|
||||
"fluent-ffmpeg": "2.1.2",
|
||||
"form-data": "4.0.0",
|
||||
"got": "14.2.0",
|
||||
"got": "14.2.1",
|
||||
"happy-dom": "10.0.3",
|
||||
"hpagent": "1.2.0",
|
||||
"htmlescape": "1.1.1",
|
||||
"http-link-header": "1.1.2",
|
||||
"ioredis": "5.3.2",
|
||||
"http-link-header": "1.1.3",
|
||||
"ioredis": "5.4.1",
|
||||
"ip-cidr": "3.1.0",
|
||||
"ipaddr.js": "2.1.0",
|
||||
"ipaddr.js": "2.2.0",
|
||||
"is-svg": "5.0.0",
|
||||
"js-yaml": "4.1.0",
|
||||
"jsdom": "23.2.0",
|
||||
"jsdom": "24.0.0",
|
||||
"json5": "2.2.3",
|
||||
"jsonld": "8.3.2",
|
||||
"jsrsasign": "11.1.0",
|
||||
"meilisearch": "0.37.0",
|
||||
"meilisearch": "0.38.0",
|
||||
"microformats-parser": "2.0.2",
|
||||
"mime-types": "2.1.35",
|
||||
"misskey-reversi": "workspace:*",
|
||||
"ms": "3.0.0-canary.1",
|
||||
"nanoid": "5.0.6",
|
||||
"nanoid": "5.0.7",
|
||||
"nested-property": "4.0.0",
|
||||
"node-fetch": "3.3.2",
|
||||
"nodemailer": "6.9.10",
|
||||
"nodemailer": "6.9.13",
|
||||
"nsfwjs": "2.4.2",
|
||||
"oauth": "0.10.0",
|
||||
"oauth2orize": "1.12.0",
|
||||
"oauth2orize-pkce": "0.1.2",
|
||||
"os-utils": "0.0.14",
|
||||
"otpauth": "9.2.2",
|
||||
"otpauth": "9.2.3",
|
||||
"parse5": "7.1.2",
|
||||
"pg": "8.11.3",
|
||||
"pg": "8.11.5",
|
||||
"pkce-challenge": "4.1.0",
|
||||
"probe-image-size": "7.2.3",
|
||||
"promise-limit": "2.7.0",
|
||||
"pug": "3.0.2",
|
||||
"punycode": "2.3.1",
|
||||
"pureimage": "0.3.17",
|
||||
"qrcode": "1.5.3",
|
||||
"random-seed": "0.3.0",
|
||||
"ratelimiter": "3.4.1",
|
||||
"re2": "1.20.9",
|
||||
"re2": "1.20.10",
|
||||
"redis-lock": "0.1.4",
|
||||
"reflect-metadata": "0.2.1",
|
||||
"reflect-metadata": "0.2.2",
|
||||
"rename": "1.0.4",
|
||||
"rss-parser": "3.13.0",
|
||||
"rxjs": "7.8.1",
|
||||
"sanitize-html": "2.12.1",
|
||||
"sanitize-html": "2.13.0",
|
||||
"secure-json-parse": "2.7.0",
|
||||
"sharp": "0.33.2",
|
||||
"sharp": "0.33.3",
|
||||
"slacc": "0.0.10",
|
||||
"strict-event-emitter-types": "2.0.0",
|
||||
"stringz": "2.1.0",
|
||||
"strip-ansi": "^7.1.0",
|
||||
"systeminformation": "5.22.0",
|
||||
"systeminformation": "5.22.7",
|
||||
"tinycolor2": "1.6.0",
|
||||
"tmp": "0.2.2",
|
||||
"tmp": "0.2.3",
|
||||
"tsc-alias": "1.8.8",
|
||||
"tsconfig-paths": "4.2.0",
|
||||
"typeorm": "0.3.20",
|
||||
"typescript": "5.3.3",
|
||||
"typescript": "5.4.5",
|
||||
"ulid": "2.3.0",
|
||||
"vary": "1.1.2",
|
||||
"web-push": "3.6.7",
|
||||
"ws": "8.16.0",
|
||||
"ws": "8.17.0",
|
||||
"xev": "3.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@jest/globals": "29.7.0",
|
||||
"@misskey-dev/eslint-plugin": "1.0.0",
|
||||
"@nestjs/platform-express": "10.3.3",
|
||||
"@simplewebauthn/types": "9.0.1",
|
||||
"@swc/jest": "0.2.31",
|
||||
"@nestjs/platform-express": "10.3.8",
|
||||
"@simplewebauthn/types": "10.0.0",
|
||||
"@swc/jest": "0.2.36",
|
||||
"@types/accepts": "1.3.7",
|
||||
"@types/archiver": "6.0.2",
|
||||
"@types/bcryptjs": "2.4.6",
|
||||
@ -202,20 +204,20 @@
|
||||
"@types/fluent-ffmpeg": "2.1.24",
|
||||
"@types/htmlescape": "^1.1.3",
|
||||
"@types/http-link-header": "1.0.5",
|
||||
"@types/jest": "29.5.11",
|
||||
"@types/jest": "29.5.12",
|
||||
"@types/js-yaml": "4.0.9",
|
||||
"@types/jsdom": "21.1.6",
|
||||
"@types/jsonld": "1.5.13",
|
||||
"@types/jsrsasign": "10.5.12",
|
||||
"@types/jsrsasign": "10.5.14",
|
||||
"@types/mime-types": "2.1.4",
|
||||
"@types/ms": "0.7.34",
|
||||
"@types/node": "20.11.22",
|
||||
"@types/node": "20.12.7",
|
||||
"@types/node-fetch": "3.0.3",
|
||||
"@types/nodemailer": "6.4.14",
|
||||
"@types/nodemailer": "6.4.15",
|
||||
"@types/oauth": "0.9.4",
|
||||
"@types/oauth2orize": "1.11.3",
|
||||
"@types/oauth2orize": "1.11.5",
|
||||
"@types/oauth2orize-pkce": "0.1.2",
|
||||
"@types/pg": "8.11.2",
|
||||
"@types/pg": "8.11.5",
|
||||
"@types/pug": "2.0.10",
|
||||
"@types/punycode": "2.1.4",
|
||||
"@types/qrcode": "1.5.5",
|
||||
@ -231,8 +233,8 @@
|
||||
"@types/vary": "1.1.3",
|
||||
"@types/web-push": "3.6.3",
|
||||
"@types/ws": "8.5.10",
|
||||
"@typescript-eslint/eslint-plugin": "7.1.0",
|
||||
"@typescript-eslint/parser": "7.1.0",
|
||||
"@typescript-eslint/eslint-plugin": "7.7.1",
|
||||
"@typescript-eslint/parser": "7.7.1",
|
||||
"aws-sdk-client-mock": "3.0.1",
|
||||
"cross-env": "7.0.3",
|
||||
"eslint": "8.57.0",
|
||||
|
@ -7,7 +7,7 @@ import { LoggerService } from '@nestjs/common';
|
||||
import Logger from '@/logger.js';
|
||||
|
||||
const logger = new Logger('core', 'cyan');
|
||||
const nestLogger = logger.createSubLogger('nest', 'green', false);
|
||||
const nestLogger = logger.createSubLogger('nest', 'green');
|
||||
|
||||
export class NestLogger implements LoggerService {
|
||||
/**
|
||||
|
@ -16,6 +16,7 @@ import Logger from '@/logger.js';
|
||||
import { envOption } from '../env.js';
|
||||
import { masterMain } from './master.js';
|
||||
import { workerMain } from './worker.js';
|
||||
import { readyRef } from './ready.js';
|
||||
|
||||
import 'reflect-metadata';
|
||||
|
||||
@ -25,7 +26,7 @@ Error.stackTraceLimit = Infinity;
|
||||
EventEmitter.defaultMaxListeners = 128;
|
||||
|
||||
const logger = new Logger('core', 'cyan');
|
||||
const clusterLogger = logger.createSubLogger('cluster', 'orange', false);
|
||||
const clusterLogger = logger.createSubLogger('cluster', 'orange');
|
||||
const ev = new Xev();
|
||||
|
||||
//#region Events
|
||||
@ -102,6 +103,8 @@ if (cluster.isWorker || envOption.disableClustering) {
|
||||
await workerMain();
|
||||
}
|
||||
|
||||
readyRef.value = true;
|
||||
|
||||
// ユニットテスト時にMisskeyが子プロセスで起動された時のため
|
||||
// それ以外のときは process.send は使えないので弾く
|
||||
if (process.send) {
|
||||
|
@ -10,6 +10,8 @@ import * as os from 'node:os';
|
||||
import cluster from 'node:cluster';
|
||||
import chalk from 'chalk';
|
||||
import chalkTemplate from 'chalk-template';
|
||||
import * as Sentry from '@sentry/node';
|
||||
import { nodeProfilingIntegration } from '@sentry/profiling-node';
|
||||
import Logger from '@/logger.js';
|
||||
import { loadConfig } from '@/config.js';
|
||||
import type { Config } from '@/config.js';
|
||||
@ -23,7 +25,7 @@ const _dirname = dirname(_filename);
|
||||
const meta = JSON.parse(fs.readFileSync(`${_dirname}/../../../../built/meta.json`, 'utf-8'));
|
||||
|
||||
const logger = new Logger('core', 'cyan');
|
||||
const bootLogger = logger.createSubLogger('boot', 'magenta', false);
|
||||
const bootLogger = logger.createSubLogger('boot', 'magenta');
|
||||
|
||||
const themeColor = chalk.hex('#ffa9c3');
|
||||
|
||||
@ -74,6 +76,24 @@ export async function masterMain() {
|
||||
|
||||
bootLogger.succ(chalk.hex('#ffa9c3')('Cherry') + chalk.hex('#95e3e8')('Pick') + (' initialized'));
|
||||
|
||||
if (config.sentryForBackend) {
|
||||
Sentry.init({
|
||||
integrations: [
|
||||
...(config.sentryForBackend.enableNodeProfiling ? [nodeProfilingIntegration()] : []),
|
||||
],
|
||||
|
||||
// Performance Monitoring
|
||||
tracesSampleRate: 1.0, // Capture 100% of the transactions
|
||||
|
||||
// Set sampling rate for profiling - this is relative to tracesSampleRate
|
||||
profilesSampleRate: 1.0,
|
||||
|
||||
maxBreadcrumbs: 0,
|
||||
|
||||
...config.sentryForBackend.options,
|
||||
});
|
||||
}
|
||||
|
||||
if (envOption.disableClustering) {
|
||||
if (envOption.onlyServer) {
|
||||
await server();
|
||||
|
6
packages/backend/src/boot/ready.ts
Normal file
6
packages/backend/src/boot/ready.ts
Normal file
@ -0,0 +1,6 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export const readyRef = { value: false };
|
@ -4,13 +4,36 @@
|
||||
*/
|
||||
|
||||
import cluster from 'node:cluster';
|
||||
import * as Sentry from '@sentry/node';
|
||||
import { nodeProfilingIntegration } from '@sentry/profiling-node';
|
||||
import { envOption } from '@/env.js';
|
||||
import { loadConfig } from '@/config.js';
|
||||
import { jobQueue, server } from './common.js';
|
||||
|
||||
/**
|
||||
* Init worker process
|
||||
*/
|
||||
export async function workerMain() {
|
||||
const config = loadConfig();
|
||||
|
||||
if (config.sentryForBackend) {
|
||||
Sentry.init({
|
||||
integrations: [
|
||||
...(config.sentryForBackend.enableNodeProfiling ? [nodeProfilingIntegration()] : []),
|
||||
],
|
||||
|
||||
// Performance Monitoring
|
||||
tracesSampleRate: 1.0, // Capture 100% of the transactions
|
||||
|
||||
// Set sampling rate for profiling - this is relative to tracesSampleRate
|
||||
profilesSampleRate: 1.0,
|
||||
|
||||
maxBreadcrumbs: 0,
|
||||
|
||||
...config.sentryForBackend.options,
|
||||
});
|
||||
}
|
||||
|
||||
if (envOption.onlyServer) {
|
||||
await server();
|
||||
} else if (envOption.onlyQueue) {
|
||||
|
@ -7,6 +7,7 @@ import * as fs from 'node:fs';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { dirname, resolve } from 'node:path';
|
||||
import * as yaml from 'js-yaml';
|
||||
import * as Sentry from '@sentry/node';
|
||||
import type { RedisOptions } from 'ioredis';
|
||||
|
||||
type RedisOptionsSource = Partial<RedisOptions> & {
|
||||
@ -56,6 +57,8 @@ type Source = {
|
||||
index: string;
|
||||
scope?: 'local' | 'global' | string[];
|
||||
};
|
||||
sentryForBackend?: { options: Partial<Sentry.NodeOptions>; enableNodeProfiling: boolean; };
|
||||
sentryForFrontend?: { options: Partial<Sentry.NodeOptions> };
|
||||
|
||||
publishTarballInsteadOfProvideRepositoryUrl?: boolean;
|
||||
|
||||
@ -183,6 +186,8 @@ export type Config = {
|
||||
redisForPubsub: RedisOptions & RedisOptionsSource;
|
||||
redisForJobQueue: RedisOptions & RedisOptionsSource;
|
||||
redisForTimelines: RedisOptions & RedisOptionsSource;
|
||||
sentryForBackend: { options: Partial<Sentry.NodeOptions>; enableNodeProfiling: boolean; } | undefined;
|
||||
sentryForFrontend: { options: Partial<Sentry.NodeOptions> } | undefined;
|
||||
perChannelMaxNoteCacheCount: number;
|
||||
perUserNotificationsMaxCount: number;
|
||||
deactivateAntennaThreshold: number;
|
||||
@ -253,6 +258,8 @@ export function loadConfig(): Config {
|
||||
redisForPubsub: config.redisForPubsub ? convertRedisOptions(config.redisForPubsub, host) : redis,
|
||||
redisForJobQueue: config.redisForJobQueue ? convertRedisOptions(config.redisForJobQueue, host) : redis,
|
||||
redisForTimelines: config.redisForTimelines ? convertRedisOptions(config.redisForTimelines, host) : redis,
|
||||
sentryForBackend: config.sentryForBackend,
|
||||
sentryForFrontend: config.sentryForFrontend,
|
||||
id: config.id,
|
||||
proxy: config.proxy,
|
||||
proxySmtp: config.proxySmtp,
|
||||
|
406
packages/backend/src/core/AbuseReportNotificationService.ts
Normal file
406
packages/backend/src/core/AbuseReportNotificationService.ts
Normal file
@ -0,0 +1,406 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
import { Inject, Injectable, type OnApplicationShutdown } from '@nestjs/common';
|
||||
import { Brackets, In, IsNull, Not } from 'typeorm';
|
||||
import * as Redis from 'ioredis';
|
||||
import sanitizeHtml from 'sanitize-html';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { GlobalEvents, GlobalEventService } from '@/core/GlobalEventService.js';
|
||||
import { isNotNull } from '@/misc/is-not-null.js';
|
||||
import type {
|
||||
AbuseReportNotificationRecipientRepository,
|
||||
MiAbuseReportNotificationRecipient,
|
||||
MiAbuseUserReport,
|
||||
MiUser,
|
||||
} from '@/models/_.js';
|
||||
import { EmailService } from '@/core/EmailService.js';
|
||||
import { MetaService } from '@/core/MetaService.js';
|
||||
import { RoleService } from '@/core/RoleService.js';
|
||||
import { RecipientMethod } from '@/models/AbuseReportNotificationRecipient.js';
|
||||
import { ModerationLogService } from '@/core/ModerationLogService.js';
|
||||
import { SystemWebhookService } from '@/core/SystemWebhookService.js';
|
||||
import { IdService } from './IdService.js';
|
||||
|
||||
@Injectable()
|
||||
export class AbuseReportNotificationService implements OnApplicationShutdown {
|
||||
constructor(
|
||||
@Inject(DI.abuseReportNotificationRecipientRepository)
|
||||
private abuseReportNotificationRecipientRepository: AbuseReportNotificationRecipientRepository,
|
||||
@Inject(DI.redisForSub)
|
||||
private redisForSub: Redis.Redis,
|
||||
private idService: IdService,
|
||||
private roleService: RoleService,
|
||||
private systemWebhookService: SystemWebhookService,
|
||||
private emailService: EmailService,
|
||||
private metaService: MetaService,
|
||||
private moderationLogService: ModerationLogService,
|
||||
private globalEventService: GlobalEventService,
|
||||
) {
|
||||
this.redisForSub.on('message', this.onMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* 管理者用Redisイベントを用いて{@link abuseReports}の内容を管理者各位に通知する.
|
||||
* 通知先ユーザは{@link RoleService.getModeratorIds}の取得結果に依る.
|
||||
*
|
||||
* @see RoleService.getModeratorIds
|
||||
* @see GlobalEventService.publishAdminStream
|
||||
*/
|
||||
@bindThis
|
||||
public async notifyAdminStream(abuseReports: MiAbuseUserReport[]) {
|
||||
if (abuseReports.length <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const moderatorIds = await this.roleService.getModeratorIds(true, true);
|
||||
|
||||
for (const moderatorId of moderatorIds) {
|
||||
for (const abuseReport of abuseReports) {
|
||||
this.globalEventService.publishAdminStream(
|
||||
moderatorId,
|
||||
'newAbuseUserReport',
|
||||
{
|
||||
id: abuseReport.id,
|
||||
targetUserId: abuseReport.targetUserId,
|
||||
reporterId: abuseReport.reporterId,
|
||||
comment: abuseReport.comment,
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mailを用いて{@link abuseReports}の内容を管理者各位に通知する.
|
||||
* メールアドレスの送信先は以下の通り.
|
||||
* - モデレータ権限所有者ユーザ(設定画面からメールアドレスの設定を行っているユーザに限る)
|
||||
* - metaテーブルに設定されているメールアドレス
|
||||
*
|
||||
* @see EmailService.sendEmail
|
||||
*/
|
||||
@bindThis
|
||||
public async notifyMail(abuseReports: MiAbuseUserReport[]) {
|
||||
if (abuseReports.length <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const recipientEMailAddresses = await this.fetchEMailRecipients().then(it => it
|
||||
.filter(it => it.isActive && it.userProfile?.emailVerified)
|
||||
.map(it => it.userProfile?.email)
|
||||
.filter(isNotNull),
|
||||
);
|
||||
|
||||
// 送信先の鮮度を保つため、毎回取得する
|
||||
const meta = await this.metaService.fetch(true);
|
||||
recipientEMailAddresses.push(
|
||||
...(meta.email ? [meta.email] : []),
|
||||
);
|
||||
|
||||
if (recipientEMailAddresses.length <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const mailAddress of recipientEMailAddresses) {
|
||||
await Promise.all(
|
||||
abuseReports.map(it => {
|
||||
// TODO: 送信処理はJobQueue化したい
|
||||
return this.emailService.sendEmail(
|
||||
mailAddress,
|
||||
'New Abuse Report',
|
||||
sanitizeHtml(it.comment),
|
||||
sanitizeHtml(it.comment),
|
||||
);
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* SystemWebhookを用いて{@link abuseReports}の内容を管理者各位に通知する.
|
||||
* ここではJobQueueへのエンキューのみを行うため、即時実行されない.
|
||||
*
|
||||
* @see SystemWebhookService.enqueueSystemWebhook
|
||||
*/
|
||||
@bindThis
|
||||
public async notifySystemWebhook(
|
||||
abuseReports: MiAbuseUserReport[],
|
||||
type: 'abuseReport' | 'abuseReportResolved',
|
||||
) {
|
||||
if (abuseReports.length <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const recipientWebhookIds = await this.fetchWebhookRecipients()
|
||||
.then(it => it
|
||||
.filter(it => it.isActive && it.systemWebhookId && it.method === 'webhook')
|
||||
.map(it => it.systemWebhookId)
|
||||
.filter(isNotNull));
|
||||
for (const webhookId of recipientWebhookIds) {
|
||||
await Promise.all(
|
||||
abuseReports.map(it => {
|
||||
return this.systemWebhookService.enqueueSystemWebhook(
|
||||
webhookId,
|
||||
type,
|
||||
it,
|
||||
);
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 通報の通知先一覧を取得する.
|
||||
*
|
||||
* @param {Object} [params] クエリの取得条件
|
||||
* @param {Object} [params.method] 取得する通知先の通知方法
|
||||
* @param {Object} [opts] 動作時の詳細なオプション
|
||||
* @param {boolean} [opts.removeUnauthorized] 副作用としてモデレータ権限を持たない送信先ユーザをDBから削除するかどうか(default: true)
|
||||
* @param {boolean} [opts.joinUser] 通知先のユーザ情報をJOINするかどうか(default: false)
|
||||
* @param {boolean} [opts.joinSystemWebhook] 通知先のSystemWebhook情報をJOINするかどうか(default: false)
|
||||
* @see removeUnauthorizedRecipientUsers
|
||||
*/
|
||||
@bindThis
|
||||
public async fetchRecipients(
|
||||
params?: {
|
||||
ids?: MiAbuseReportNotificationRecipient['id'][],
|
||||
method?: RecipientMethod[],
|
||||
},
|
||||
opts?: {
|
||||
removeUnauthorized?: boolean,
|
||||
joinUser?: boolean,
|
||||
joinSystemWebhook?: boolean,
|
||||
},
|
||||
): Promise<MiAbuseReportNotificationRecipient[]> {
|
||||
const query = this.abuseReportNotificationRecipientRepository.createQueryBuilder('recipient');
|
||||
|
||||
if (opts?.joinUser) {
|
||||
query.innerJoinAndSelect('user', 'user', 'recipient.userId = user.id');
|
||||
query.innerJoinAndSelect('recipient.userProfile', 'userProfile');
|
||||
}
|
||||
|
||||
if (opts?.joinSystemWebhook) {
|
||||
query.innerJoinAndSelect('recipient.systemWebhook', 'systemWebhook');
|
||||
}
|
||||
|
||||
if (params?.ids) {
|
||||
query.andWhere({ id: In(params.ids) });
|
||||
}
|
||||
|
||||
if (params?.method) {
|
||||
query.andWhere(new Brackets(qb => {
|
||||
if (params.method?.includes('email')) {
|
||||
qb.orWhere({ method: 'email', userId: Not(IsNull()) });
|
||||
}
|
||||
if (params.method?.includes('webhook')) {
|
||||
qb.orWhere({ method: 'webhook', userId: IsNull() });
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
const recipients = await query.getMany();
|
||||
if (recipients.length <= 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// アサイン有効期限切れはイベントで拾えないので、このタイミングでチェック及び削除(オプション)
|
||||
return (opts?.removeUnauthorized ?? true)
|
||||
? await this.removeUnauthorizedRecipientUsers(recipients)
|
||||
: recipients;
|
||||
}
|
||||
|
||||
/**
|
||||
* EMailの通知先一覧を取得する.
|
||||
* リレーション先の{@link MiUser}および{@link MiUserProfile}も同時に取得する.
|
||||
*
|
||||
* @param {Object} [opts]
|
||||
* @param {boolean} [opts.removeUnauthorized] 副作用としてモデレータ権限を持たない送信先ユーザをDBから削除するかどうか(default: true)
|
||||
* @see removeUnauthorizedRecipientUsers
|
||||
*/
|
||||
@bindThis
|
||||
public async fetchEMailRecipients(opts?: {
|
||||
removeUnauthorized?: boolean
|
||||
}): Promise<MiAbuseReportNotificationRecipient[]> {
|
||||
return this.fetchRecipients({ method: ['email'] }, { joinUser: true, ...opts });
|
||||
}
|
||||
|
||||
/**
|
||||
* Webhookの通知先一覧を取得する.
|
||||
* リレーション先の{@link MiSystemWebhook}も同時に取得する.
|
||||
*/
|
||||
@bindThis
|
||||
public fetchWebhookRecipients(): Promise<MiAbuseReportNotificationRecipient[]> {
|
||||
return this.fetchRecipients({ method: ['webhook'] }, { joinSystemWebhook: true });
|
||||
}
|
||||
|
||||
/**
|
||||
* 通知先を作成する.
|
||||
*/
|
||||
@bindThis
|
||||
public async createRecipient(
|
||||
params: {
|
||||
isActive: MiAbuseReportNotificationRecipient['isActive'];
|
||||
name: MiAbuseReportNotificationRecipient['name'];
|
||||
method: MiAbuseReportNotificationRecipient['method'];
|
||||
userId: MiAbuseReportNotificationRecipient['userId'];
|
||||
systemWebhookId: MiAbuseReportNotificationRecipient['systemWebhookId'];
|
||||
},
|
||||
updater: MiUser,
|
||||
): Promise<MiAbuseReportNotificationRecipient> {
|
||||
const id = this.idService.gen();
|
||||
await this.abuseReportNotificationRecipientRepository.insert({
|
||||
...params,
|
||||
id,
|
||||
});
|
||||
|
||||
const created = await this.abuseReportNotificationRecipientRepository.findOneByOrFail({ id: id });
|
||||
|
||||
this.moderationLogService
|
||||
.log(updater, 'createAbuseReportNotificationRecipient', {
|
||||
recipientId: id,
|
||||
recipient: created,
|
||||
})
|
||||
.then();
|
||||
|
||||
return created;
|
||||
}
|
||||
|
||||
/**
|
||||
* 通知先を更新する.
|
||||
*/
|
||||
@bindThis
|
||||
public async updateRecipient(
|
||||
params: {
|
||||
id: MiAbuseReportNotificationRecipient['id'];
|
||||
isActive: MiAbuseReportNotificationRecipient['isActive'];
|
||||
name: MiAbuseReportNotificationRecipient['name'];
|
||||
method: MiAbuseReportNotificationRecipient['method'];
|
||||
userId: MiAbuseReportNotificationRecipient['userId'];
|
||||
systemWebhookId: MiAbuseReportNotificationRecipient['systemWebhookId'];
|
||||
},
|
||||
updater: MiUser,
|
||||
): Promise<MiAbuseReportNotificationRecipient> {
|
||||
const beforeEntity = await this.abuseReportNotificationRecipientRepository.findOneByOrFail({ id: params.id });
|
||||
|
||||
await this.abuseReportNotificationRecipientRepository.update(params.id, {
|
||||
isActive: params.isActive,
|
||||
updatedAt: new Date(),
|
||||
name: params.name,
|
||||
method: params.method,
|
||||
userId: params.userId,
|
||||
systemWebhookId: params.systemWebhookId,
|
||||
});
|
||||
|
||||
const afterEntity = await this.abuseReportNotificationRecipientRepository.findOneByOrFail({ id: params.id });
|
||||
|
||||
this.moderationLogService
|
||||
.log(updater, 'updateAbuseReportNotificationRecipient', {
|
||||
recipientId: params.id,
|
||||
before: beforeEntity,
|
||||
after: afterEntity,
|
||||
})
|
||||
.then();
|
||||
|
||||
return afterEntity;
|
||||
}
|
||||
|
||||
/**
|
||||
* 通知先を削除する.
|
||||
*/
|
||||
@bindThis
|
||||
public async deleteRecipient(
|
||||
id: MiAbuseReportNotificationRecipient['id'],
|
||||
updater: MiUser,
|
||||
) {
|
||||
const entity = await this.abuseReportNotificationRecipientRepository.findBy({ id });
|
||||
|
||||
await this.abuseReportNotificationRecipientRepository.delete(id);
|
||||
|
||||
this.moderationLogService
|
||||
.log(updater, 'deleteAbuseReportNotificationRecipient', {
|
||||
recipientId: id,
|
||||
recipient: entity,
|
||||
})
|
||||
.then();
|
||||
}
|
||||
|
||||
/**
|
||||
* モデレータ権限を持たない(*1)通知先ユーザを削除する.
|
||||
*
|
||||
* *1: 以下の両方を満たすものの事を言う
|
||||
* - 通知先にユーザIDが設定されている
|
||||
* - 付与ロールにモデレータ権限がない or アサインの有効期限が切れている
|
||||
*
|
||||
* @param recipients 通知先一覧の配列
|
||||
* @returns {@lisk recipients}からモデレータ権限を持たない通知先を削除した配列
|
||||
*/
|
||||
@bindThis
|
||||
private async removeUnauthorizedRecipientUsers(recipients: MiAbuseReportNotificationRecipient[]): Promise<MiAbuseReportNotificationRecipient[]> {
|
||||
const userRecipients = recipients.filter(it => it.userId !== null);
|
||||
const recipientUserIds = new Set(userRecipients.map(it => it.userId).filter(isNotNull));
|
||||
if (recipientUserIds.size <= 0) {
|
||||
// ユーザが通知先として設定されていない場合、この関数での処理を行うべきレコードが無い
|
||||
return recipients;
|
||||
}
|
||||
|
||||
// モデレータ権限の有無で通知先設定を振り分ける
|
||||
const authorizedUserIds = await this.roleService.getModeratorIds(true, true);
|
||||
const authorizedUserRecipients = Array.of<MiAbuseReportNotificationRecipient>();
|
||||
const unauthorizedUserRecipients = Array.of<MiAbuseReportNotificationRecipient>();
|
||||
for (const recipient of userRecipients) {
|
||||
// eslint-disable-next-line
|
||||
if (authorizedUserIds.includes(recipient.userId!)) {
|
||||
authorizedUserRecipients.push(recipient);
|
||||
} else {
|
||||
unauthorizedUserRecipients.push(recipient);
|
||||
}
|
||||
}
|
||||
|
||||
// モデレータ権限を持たない通知先をDBから削除する
|
||||
if (unauthorizedUserRecipients.length > 0) {
|
||||
await this.abuseReportNotificationRecipientRepository.delete(unauthorizedUserRecipients.map(it => it.id));
|
||||
}
|
||||
const nonUserRecipients = recipients.filter(it => it.userId === null);
|
||||
return [...nonUserRecipients, ...authorizedUserRecipients].sort((a, b) => a.id.localeCompare(b.id));
|
||||
}
|
||||
|
||||
@bindThis
|
||||
private async onMessage(_: string, data: string): Promise<void> {
|
||||
const obj = JSON.parse(data);
|
||||
if (obj.channel !== 'internal') {
|
||||
return;
|
||||
}
|
||||
|
||||
const { type } = obj.message as GlobalEvents['internal']['payload'];
|
||||
switch (type) {
|
||||
case 'roleUpdated':
|
||||
case 'roleDeleted':
|
||||
case 'userRoleUnassigned': {
|
||||
// 場合によってはキャッシュ更新よりも先にここが呼ばれてしまう可能性があるのでnextTickで遅延実行
|
||||
process.nextTick(async () => {
|
||||
const recipients = await this.abuseReportNotificationRecipientRepository.findBy({
|
||||
userId: Not(IsNull()),
|
||||
});
|
||||
await this.removeUnauthorizedRecipientUsers(recipients);
|
||||
});
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public dispose(): void {
|
||||
this.redisForSub.off('message', this.onMessage);
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public onApplicationShutdown(signal?: string | undefined): void {
|
||||
this.dispose();
|
||||
}
|
||||
}
|
128
packages/backend/src/core/AbuseReportService.ts
Normal file
128
packages/backend/src/core/AbuseReportService.ts
Normal file
@ -0,0 +1,128 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import { In } from 'typeorm';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import type { AbuseUserReportsRepository, MiAbuseUserReport, MiUser, UsersRepository } from '@/models/_.js';
|
||||
import { AbuseReportNotificationService } from '@/core/AbuseReportNotificationService.js';
|
||||
import { QueueService } from '@/core/QueueService.js';
|
||||
import { InstanceActorService } from '@/core/InstanceActorService.js';
|
||||
import { ApRendererService } from '@/core/activitypub/ApRendererService.js';
|
||||
import { ModerationLogService } from '@/core/ModerationLogService.js';
|
||||
import { IdService } from './IdService.js';
|
||||
|
||||
@Injectable()
|
||||
export class AbuseReportService {
|
||||
constructor(
|
||||
@Inject(DI.abuseUserReportsRepository)
|
||||
private abuseUserReportsRepository: AbuseUserReportsRepository,
|
||||
@Inject(DI.usersRepository)
|
||||
private usersRepository: UsersRepository,
|
||||
private idService: IdService,
|
||||
private abuseReportNotificationService: AbuseReportNotificationService,
|
||||
private queueService: QueueService,
|
||||
private instanceActorService: InstanceActorService,
|
||||
private apRendererService: ApRendererService,
|
||||
private moderationLogService: ModerationLogService,
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* ユーザからの通報をDBに記録し、その内容を下記の手段で管理者各位に通知する.
|
||||
* - 管理者用Redisイベント
|
||||
* - EMail(モデレータ権限所有者ユーザ+metaテーブルに設定されているメールアドレス)
|
||||
* - SystemWebhook
|
||||
*
|
||||
* @param params 通報内容. もし複数件の通報に対応した時のために、あらかじめ複数件を処理できる前提で考える
|
||||
* @see AbuseReportNotificationService.notify
|
||||
*/
|
||||
@bindThis
|
||||
public async report(params: {
|
||||
targetUserId: MiAbuseUserReport['targetUserId'],
|
||||
targetUserHost: MiAbuseUserReport['targetUserHost'],
|
||||
reporterId: MiAbuseUserReport['reporterId'],
|
||||
reporterHost: MiAbuseUserReport['reporterHost'],
|
||||
comment: string,
|
||||
}[]) {
|
||||
const entities = params.map(param => {
|
||||
return {
|
||||
id: this.idService.gen(),
|
||||
targetUserId: param.targetUserId,
|
||||
targetUserHost: param.targetUserHost,
|
||||
reporterId: param.reporterId,
|
||||
reporterHost: param.reporterHost,
|
||||
comment: param.comment,
|
||||
};
|
||||
});
|
||||
|
||||
const reports = Array.of<MiAbuseUserReport>();
|
||||
for (const entity of entities) {
|
||||
const report = await this.abuseUserReportsRepository.insertOne(entity);
|
||||
reports.push(report);
|
||||
}
|
||||
|
||||
return Promise.all([
|
||||
this.abuseReportNotificationService.notifyAdminStream(reports),
|
||||
this.abuseReportNotificationService.notifySystemWebhook(reports, 'abuseReport'),
|
||||
this.abuseReportNotificationService.notifyMail(reports),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通報を解決し、その内容を下記の手段で管理者各位に通知する.
|
||||
* - SystemWebhook
|
||||
*
|
||||
* @param params 通報内容. もし複数件の通報に対応した時のために、あらかじめ複数件を処理できる前提で考える
|
||||
* @param operator 通報を処理したユーザ
|
||||
* @see AbuseReportNotificationService.notify
|
||||
*/
|
||||
@bindThis
|
||||
public async resolve(
|
||||
params: {
|
||||
reportId: string;
|
||||
forward: boolean;
|
||||
}[],
|
||||
operator: MiUser,
|
||||
) {
|
||||
const paramsMap = new Map(params.map(it => [it.reportId, it]));
|
||||
const reports = await this.abuseUserReportsRepository.findBy({
|
||||
id: In(params.map(it => it.reportId)),
|
||||
});
|
||||
|
||||
for (const report of reports) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
const ps = paramsMap.get(report.id)!;
|
||||
|
||||
await this.abuseUserReportsRepository.update(report.id, {
|
||||
resolved: true,
|
||||
assigneeId: operator.id,
|
||||
forwarded: ps.forward && report.targetUserHost !== null,
|
||||
});
|
||||
|
||||
if (ps.forward && report.targetUserHost != null) {
|
||||
const actor = await this.instanceActorService.getInstanceActor();
|
||||
const targetUser = await this.usersRepository.findOneByOrFail({ id: report.targetUserId });
|
||||
|
||||
// eslint-disable-next-line
|
||||
const flag = this.apRendererService.renderFlag(actor, targetUser.uri!, report.comment);
|
||||
const contextAssignedFlag = this.apRendererService.addContext(flag);
|
||||
this.queueService.deliver(actor, contextAssignedFlag, targetUser.inbox, false);
|
||||
}
|
||||
|
||||
this.moderationLogService
|
||||
.log(operator, 'resolveAbuseReport', {
|
||||
reportId: report.id,
|
||||
report: report,
|
||||
forwarded: ps.forward && report.targetUserHost !== null,
|
||||
})
|
||||
.then();
|
||||
}
|
||||
|
||||
return this.abuseUserReportsRepository.findBy({ id: In(reports.map(it => it.id)) })
|
||||
.then(reports => this.abuseReportNotificationService.notifySystemWebhook(reports, 'abuseReportResolved'));
|
||||
}
|
||||
}
|
@ -4,13 +4,14 @@
|
||||
*/
|
||||
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import { Brackets } from 'typeorm';
|
||||
import { Brackets, EntityNotFoundError } from 'typeorm';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import type { MiUser } from '@/models/User.js';
|
||||
import type { AnnouncementReadsRepository, AnnouncementsRepository, MiAnnouncement, MiAnnouncementRead, UsersRepository } from '@/models/_.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { Packed } from '@/misc/json-schema.js';
|
||||
import { IdService } from '@/core/IdService.js';
|
||||
import { AnnouncementEntityService } from '@/core/entities/AnnouncementEntityService.js';
|
||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||
import { ModerationLogService } from '@/core/ModerationLogService.js';
|
||||
|
||||
@ -29,6 +30,7 @@ export class AnnouncementService {
|
||||
private idService: IdService,
|
||||
private globalEventService: GlobalEventService,
|
||||
private moderationLogService: ModerationLogService,
|
||||
private announcementEntityService: AnnouncementEntityService,
|
||||
) {
|
||||
}
|
||||
|
||||
@ -65,7 +67,7 @@ export class AnnouncementService {
|
||||
|
||||
@bindThis
|
||||
public async create(values: Partial<MiAnnouncement>, moderator?: MiUser): Promise<{ raw: MiAnnouncement; packed: Packed<'Announcement'> }> {
|
||||
const announcement = await this.announcementsRepository.insert({
|
||||
const announcement = await this.announcementsRepository.insertOne({
|
||||
id: this.idService.gen(),
|
||||
updatedAt: null,
|
||||
title: values.title,
|
||||
@ -77,9 +79,9 @@ export class AnnouncementService {
|
||||
silence: values.silence,
|
||||
needConfirmationToRead: values.needConfirmationToRead,
|
||||
userId: values.userId,
|
||||
}).then(x => this.announcementsRepository.findOneByOrFail(x.identifiers[0]));
|
||||
});
|
||||
|
||||
const packed = (await this.packMany([announcement]))[0];
|
||||
const packed = await this.announcementEntityService.pack(announcement);
|
||||
|
||||
if (announcement.isActive) {
|
||||
if (values.userId) {
|
||||
@ -179,6 +181,24 @@ export class AnnouncementService {
|
||||
}
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public async getAnnouncement(announcementId: MiAnnouncement['id'], me: MiUser | null): Promise<Packed<'Announcement'>> {
|
||||
const announcement = await this.announcementsRepository.findOneByOrFail({ id: announcementId });
|
||||
if (me) {
|
||||
if (announcement.userId && announcement.userId !== me.id) {
|
||||
throw new EntityNotFoundError(this.announcementsRepository.metadata.target, { id: announcementId });
|
||||
}
|
||||
|
||||
const read = await this.announcementReadsRepository.findOneBy({
|
||||
announcementId: announcement.id,
|
||||
userId: me.id,
|
||||
});
|
||||
return this.announcementEntityService.pack({ ...announcement, isRead: read !== null }, me);
|
||||
} else {
|
||||
return this.announcementEntityService.pack(announcement, null);
|
||||
}
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public async read(user: MiUser, announcementId: MiAnnouncement['id']): Promise<void> {
|
||||
try {
|
||||
@ -195,29 +215,4 @@ export class AnnouncementService {
|
||||
this.globalEventService.publishMainStream(user.id, 'readAllAnnouncements');
|
||||
}
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public async packMany(
|
||||
announcements: MiAnnouncement[],
|
||||
me?: { id: MiUser['id'] } | null | undefined,
|
||||
options?: {
|
||||
reads?: MiAnnouncementRead[];
|
||||
},
|
||||
): Promise<Packed<'Announcement'>[]> {
|
||||
const reads = me ? (options?.reads ?? await this.getReads(me.id)) : [];
|
||||
return announcements.map(announcement => ({
|
||||
id: announcement.id,
|
||||
createdAt: this.idService.parse(announcement.id).date.toISOString(),
|
||||
updatedAt: announcement.updatedAt?.toISOString() ?? null,
|
||||
text: announcement.text,
|
||||
title: announcement.title,
|
||||
imageUrl: announcement.imageUrl,
|
||||
icon: announcement.icon,
|
||||
display: announcement.display,
|
||||
needConfirmationToRead: announcement.needConfirmationToRead,
|
||||
silence: announcement.silence,
|
||||
forYou: announcement.userId === me?.id,
|
||||
isRead: reads.some(read => read.announcementId === announcement.id),
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
@ -21,6 +21,7 @@ import type { Config } from '@/config.js';
|
||||
@Injectable()
|
||||
export class AvatarDecorationService implements OnApplicationShutdown {
|
||||
public cache: MemorySingleCache<MiAvatarDecoration[]>;
|
||||
public cacheWithRemote: MemorySingleCache<MiAvatarDecoration[]>;
|
||||
|
||||
constructor(
|
||||
@Inject(DI.config)
|
||||
@ -44,6 +45,7 @@ export class AvatarDecorationService implements OnApplicationShutdown {
|
||||
private httpRequestService: HttpRequestService,
|
||||
) {
|
||||
this.cache = new MemorySingleCache<MiAvatarDecoration[]>(1000 * 60 * 30);
|
||||
this.cacheWithRemote = new MemorySingleCache<MiAvatarDecoration[]>(1000 * 60 * 30);
|
||||
|
||||
this.redisForSub.on('message', this.onMessage);
|
||||
}
|
||||
@ -69,10 +71,10 @@ export class AvatarDecorationService implements OnApplicationShutdown {
|
||||
|
||||
@bindThis
|
||||
public async create(options: Partial<MiAvatarDecoration>, moderator?: MiUser): Promise<MiAvatarDecoration> {
|
||||
const created = await this.avatarDecorationsRepository.insert({
|
||||
const created = await this.avatarDecorationsRepository.insertOne({
|
||||
id: this.idService.gen(),
|
||||
...options,
|
||||
}).then(x => this.avatarDecorationsRepository.findOneByOrFail(x.identifiers[0]));
|
||||
});
|
||||
|
||||
this.globalEventService.publishInternalEvent('avatarDecorationCreated', created);
|
||||
|
||||
@ -137,16 +139,15 @@ export class AvatarDecorationService implements OnApplicationShutdown {
|
||||
});
|
||||
|
||||
const userData: any = await res.json();
|
||||
const avatarDecorations = userData.avatarDecorations?.[0];
|
||||
const userAvatarDecorations = userData.avatarDecorations ?? undefined;
|
||||
|
||||
if (!avatarDecorations) {
|
||||
if (!userAvatarDecorations || userAvatarDecorations.length === 0) {
|
||||
const updates = {} as Partial<MiUser>;
|
||||
updates.avatarDecorations = [];
|
||||
await this.usersRepository.update({ id: user.id }, updates);
|
||||
return;
|
||||
}
|
||||
|
||||
const avatarDecorationId = avatarDecorations.id;
|
||||
const instanceHost = instance.host;
|
||||
const decorationApiUrl = `https://${instanceHost}/api/get-avatar-decorations`;
|
||||
const allRes = await this.httpRequestService.send(decorationApiUrl, {
|
||||
@ -154,46 +155,61 @@ export class AvatarDecorationService implements OnApplicationShutdown {
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({}),
|
||||
});
|
||||
|
||||
const allDecorations: any = await allRes.json();
|
||||
let name;
|
||||
let description;
|
||||
for (const decoration of allDecorations) {
|
||||
if (decoration.id === avatarDecorationId) {
|
||||
name = decoration.name;
|
||||
description = decoration.description;
|
||||
break;
|
||||
}
|
||||
}
|
||||
const existingDecoration = await this.avatarDecorationsRepository.findOneBy({
|
||||
host: userHost,
|
||||
remoteId: avatarDecorationId,
|
||||
});
|
||||
const decorationData = {
|
||||
name: name,
|
||||
description: description,
|
||||
url: this.getProxiedUrl(avatarDecorations.url, 'static'),
|
||||
remoteId: avatarDecorationId,
|
||||
host: userHost,
|
||||
};
|
||||
if (existingDecoration == null) {
|
||||
await this.create(decorationData);
|
||||
} else {
|
||||
await this.update(existingDecoration.id, decorationData);
|
||||
}
|
||||
const findDecoration = await this.avatarDecorationsRepository.findOneBy({
|
||||
host: userHost,
|
||||
remoteId: avatarDecorationId,
|
||||
});
|
||||
const updates = {} as Partial<MiUser>;
|
||||
updates.avatarDecorations = [{
|
||||
id: findDecoration?.id ?? '',
|
||||
angle: avatarDecorations.angle ?? 0,
|
||||
flipH: avatarDecorations.flipH ?? false,
|
||||
offsetX: avatarDecorations.offsetX ?? 0,
|
||||
offsetY: avatarDecorations.offsetY ?? 0,
|
||||
scale: avatarDecorations.scale ?? 1,
|
||||
opacity: avatarDecorations.opacity ?? 1,
|
||||
}];
|
||||
updates.avatarDecorations = [];
|
||||
|
||||
for (const avatarDecoration of userAvatarDecorations) {
|
||||
let name;
|
||||
let description;
|
||||
const avatarDecorationId = avatarDecoration.id;
|
||||
|
||||
for (const decoration of allDecorations) {
|
||||
// eslint-disable-next-line eqeqeq
|
||||
if (decoration.id == avatarDecorationId) {
|
||||
name = decoration.name;
|
||||
description = decoration.description;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const existingDecoration = await this.avatarDecorationsRepository.findOneBy({
|
||||
host: userHost,
|
||||
remoteId: avatarDecorationId,
|
||||
});
|
||||
|
||||
const decorationData = {
|
||||
name: name,
|
||||
description: description,
|
||||
url: this.getProxiedUrl(avatarDecoration.url, 'static'),
|
||||
remoteId: avatarDecorationId,
|
||||
host: userHost,
|
||||
};
|
||||
|
||||
if (existingDecoration == null) {
|
||||
await this.create(decorationData);
|
||||
this.cacheWithRemote.delete();
|
||||
} else {
|
||||
await this.update(existingDecoration.id, decorationData);
|
||||
this.cacheWithRemote.delete();
|
||||
}
|
||||
|
||||
const findDecoration = await this.avatarDecorationsRepository.findOneBy({
|
||||
host: userHost,
|
||||
remoteId: avatarDecorationId,
|
||||
});
|
||||
|
||||
updates.avatarDecorations.push({
|
||||
id: findDecoration?.id ?? '',
|
||||
angle: avatarDecoration.angle ?? 0,
|
||||
flipH: avatarDecoration.flipH ?? false,
|
||||
offsetX: avatarDecoration.offsetX ?? 0,
|
||||
offsetY: avatarDecoration.offsetY ?? 0,
|
||||
scale: avatarDecoration.scale ?? 1,
|
||||
opacity: avatarDecoration.opacity ?? 1,
|
||||
});
|
||||
}
|
||||
await this.usersRepository.update({ id: user.id }, updates);
|
||||
}
|
||||
|
||||
@ -220,7 +236,7 @@ export class AvatarDecorationService implements OnApplicationShutdown {
|
||||
if (!withRemote) {
|
||||
return this.cache.fetch(() => this.avatarDecorationsRepository.find({ where: { host: IsNull() } }));
|
||||
} else {
|
||||
return this.cache.fetch(() => this.avatarDecorationsRepository.find());
|
||||
return this.cacheWithRemote.fetch(() => this.avatarDecorationsRepository.find());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -45,13 +45,13 @@ export class ClipService {
|
||||
throw new ClipService.TooManyClipsError();
|
||||
}
|
||||
|
||||
const clip = await this.clipsRepository.insert({
|
||||
const clip = await this.clipsRepository.insertOne({
|
||||
id: this.idService.gen(),
|
||||
userId: me.id,
|
||||
name: name,
|
||||
isPublic: isPublic,
|
||||
description: description,
|
||||
}).then(x => this.clipsRepository.findOneByOrFail(x.identifiers[0]));
|
||||
});
|
||||
|
||||
return clip;
|
||||
}
|
||||
|
@ -5,6 +5,13 @@
|
||||
|
||||
import { Module } from '@nestjs/common';
|
||||
import { FanoutTimelineEndpointService } from '@/core/FanoutTimelineEndpointService.js';
|
||||
import { AbuseReportService } from '@/core/AbuseReportService.js';
|
||||
import { SystemWebhookEntityService } from '@/core/entities/SystemWebhookEntityService.js';
|
||||
import {
|
||||
AbuseReportNotificationRecipientEntityService,
|
||||
} from '@/core/entities/AbuseReportNotificationRecipientEntityService.js';
|
||||
import { AbuseReportNotificationService } from '@/core/AbuseReportNotificationService.js';
|
||||
import { SystemWebhookService } from '@/core/SystemWebhookService.js';
|
||||
import { AccountMoveService } from './AccountMoveService.js';
|
||||
import { AccountUpdateService } from './AccountUpdateService.js';
|
||||
import { AiService } from './AiService.js';
|
||||
@ -58,7 +65,7 @@ import { UserMutingService } from './UserMutingService.js';
|
||||
import { UserSuspendService } from './UserSuspendService.js';
|
||||
import { UserAuthService } from './UserAuthService.js';
|
||||
import { VideoProcessingService } from './VideoProcessingService.js';
|
||||
import { WebhookService } from './WebhookService.js';
|
||||
import { UserWebhookService } from './UserWebhookService.js';
|
||||
import { ProxyAccountService } from './ProxyAccountService.js';
|
||||
import { UtilityService } from './UtilityService.js';
|
||||
import { FileInfoService } from './FileInfoService.js';
|
||||
@ -86,6 +93,7 @@ import ApRequestChart from './chart/charts/ap-request.js';
|
||||
import { ChartManagementService } from './chart/ChartManagementService.js';
|
||||
|
||||
import { AbuseUserReportEntityService } from './entities/AbuseUserReportEntityService.js';
|
||||
import { AnnouncementEntityService } from './entities/AnnouncementEntityService.js';
|
||||
import { AntennaEntityService } from './entities/AntennaEntityService.js';
|
||||
import { AppEntityService } from './entities/AppEntityService.js';
|
||||
import { AuthSessionEntityService } from './entities/AuthSessionEntityService.js';
|
||||
@ -132,7 +140,7 @@ import { ApMfmService } from './activitypub/ApMfmService.js';
|
||||
import { ApRendererService } from './activitypub/ApRendererService.js';
|
||||
import { ApRequestService } from './activitypub/ApRequestService.js';
|
||||
import { ApResolverService } from './activitypub/ApResolverService.js';
|
||||
import { LdSignatureService } from './activitypub/LdSignatureService.js';
|
||||
import { JsonLdService } from './activitypub/JsonLdService.js';
|
||||
import { RemoteLoggerService } from './RemoteLoggerService.js';
|
||||
import { RemoteUserResolveService } from './RemoteUserResolveService.js';
|
||||
import { WebfingerService } from './WebfingerService.js';
|
||||
@ -149,6 +157,8 @@ import type { Provider } from '@nestjs/common';
|
||||
|
||||
//#region 文字列ベースでのinjection用(循環参照対応のため)
|
||||
const $LoggerService: Provider = { provide: 'LoggerService', useExisting: LoggerService };
|
||||
const $AbuseReportService: Provider = { provide: 'AbuseReportService', useExisting: AbuseReportService };
|
||||
const $AbuseReportNotificationService: Provider = { provide: 'AbuseReportNotificationService', useExisting: AbuseReportNotificationService };
|
||||
const $AccountMoveService: Provider = { provide: 'AccountMoveService', useExisting: AccountMoveService };
|
||||
const $AccountUpdateService: Provider = { provide: 'AccountUpdateService', useExisting: AccountUpdateService };
|
||||
const $AiService: Provider = { provide: 'AiService', useExisting: AiService };
|
||||
@ -203,7 +213,8 @@ const $UserMutingService: Provider = { provide: 'UserMutingService', useExisting
|
||||
const $UserSuspendService: Provider = { provide: 'UserSuspendService', useExisting: UserSuspendService };
|
||||
const $UserAuthService: Provider = { provide: 'UserAuthService', useExisting: UserAuthService };
|
||||
const $VideoProcessingService: Provider = { provide: 'VideoProcessingService', useExisting: VideoProcessingService };
|
||||
const $WebhookService: Provider = { provide: 'WebhookService', useExisting: WebhookService };
|
||||
const $UserWebhookService: Provider = { provide: 'UserWebhookService', useExisting: UserWebhookService };
|
||||
const $SystemWebhookService: Provider = { provide: 'SystemWebhookService', useExisting: SystemWebhookService };
|
||||
const $UtilityService: Provider = { provide: 'UtilityService', useExisting: UtilityService };
|
||||
const $FileInfoService: Provider = { provide: 'FileInfoService', useExisting: FileInfoService };
|
||||
const $SearchService: Provider = { provide: 'SearchService', useExisting: SearchService };
|
||||
@ -231,6 +242,8 @@ const $ApRequestChart: Provider = { provide: 'ApRequestChart', useExisting: ApRe
|
||||
const $ChartManagementService: Provider = { provide: 'ChartManagementService', useExisting: ChartManagementService };
|
||||
|
||||
const $AbuseUserReportEntityService: Provider = { provide: 'AbuseUserReportEntityService', useExisting: AbuseUserReportEntityService };
|
||||
const $AnnouncementEntityService: Provider = { provide: 'AnnouncementEntityService', useExisting: AnnouncementEntityService };
|
||||
const $AbuseReportNotificationRecipientEntityService: Provider = { provide: 'AbuseReportNotificationRecipientEntityService', useExisting: AbuseReportNotificationRecipientEntityService };
|
||||
const $AntennaEntityService: Provider = { provide: 'AntennaEntityService', useExisting: AntennaEntityService };
|
||||
const $AppEntityService: Provider = { provide: 'AppEntityService', useExisting: AppEntityService };
|
||||
const $AuthSessionEntityService: Provider = { provide: 'AuthSessionEntityService', useExisting: AuthSessionEntityService };
|
||||
@ -267,6 +280,7 @@ const $FlashLikeEntityService: Provider = { provide: 'FlashLikeEntityService', u
|
||||
const $RoleEntityService: Provider = { provide: 'RoleEntityService', useExisting: RoleEntityService };
|
||||
const $ReversiGameEntityService: Provider = { provide: 'ReversiGameEntityService', useExisting: ReversiGameEntityService };
|
||||
const $MetaEntityService: Provider = { provide: 'MetaEntityService', useExisting: MetaEntityService };
|
||||
const $SystemWebhookEntityService: Provider = { provide: 'SystemWebhookEntityService', useExisting: SystemWebhookEntityService };
|
||||
|
||||
const $ApAudienceService: Provider = { provide: 'ApAudienceService', useExisting: ApAudienceService };
|
||||
const $ApDbResolverService: Provider = { provide: 'ApDbResolverService', useExisting: ApDbResolverService };
|
||||
@ -277,7 +291,7 @@ const $ApMfmService: Provider = { provide: 'ApMfmService', useExisting: ApMfmSer
|
||||
const $ApRendererService: Provider = { provide: 'ApRendererService', useExisting: ApRendererService };
|
||||
const $ApRequestService: Provider = { provide: 'ApRequestService', useExisting: ApRequestService };
|
||||
const $ApResolverService: Provider = { provide: 'ApResolverService', useExisting: ApResolverService };
|
||||
const $LdSignatureService: Provider = { provide: 'LdSignatureService', useExisting: LdSignatureService };
|
||||
const $JsonLdService: Provider = { provide: 'JsonLdService', useExisting: JsonLdService };
|
||||
const $RemoteLoggerService: Provider = { provide: 'RemoteLoggerService', useExisting: RemoteLoggerService };
|
||||
const $RemoteUserResolveService: Provider = { provide: 'RemoteUserResolveService', useExisting: RemoteUserResolveService };
|
||||
const $WebfingerService: Provider = { provide: 'WebfingerService', useExisting: WebfingerService };
|
||||
@ -295,6 +309,8 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
],
|
||||
providers: [
|
||||
LoggerService,
|
||||
AbuseReportService,
|
||||
AbuseReportNotificationService,
|
||||
AccountMoveService,
|
||||
AccountUpdateService,
|
||||
AiService,
|
||||
@ -349,7 +365,8 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
UserSuspendService,
|
||||
UserAuthService,
|
||||
VideoProcessingService,
|
||||
WebhookService,
|
||||
UserWebhookService,
|
||||
SystemWebhookService,
|
||||
UtilityService,
|
||||
FileInfoService,
|
||||
SearchService,
|
||||
@ -377,6 +394,8 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
ChartManagementService,
|
||||
|
||||
AbuseUserReportEntityService,
|
||||
AnnouncementEntityService,
|
||||
AbuseReportNotificationRecipientEntityService,
|
||||
AntennaEntityService,
|
||||
AppEntityService,
|
||||
AuthSessionEntityService,
|
||||
@ -413,6 +432,7 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
RoleEntityService,
|
||||
ReversiGameEntityService,
|
||||
MetaEntityService,
|
||||
SystemWebhookEntityService,
|
||||
|
||||
ApAudienceService,
|
||||
ApDbResolverService,
|
||||
@ -423,7 +443,7 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
ApRendererService,
|
||||
ApRequestService,
|
||||
ApResolverService,
|
||||
LdSignatureService,
|
||||
JsonLdService,
|
||||
RemoteLoggerService,
|
||||
RemoteUserResolveService,
|
||||
WebfingerService,
|
||||
@ -437,6 +457,8 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
|
||||
//#region 文字列ベースでのinjection用(循環参照対応のため)
|
||||
$LoggerService,
|
||||
$AbuseReportService,
|
||||
$AbuseReportNotificationService,
|
||||
$AccountMoveService,
|
||||
$AccountUpdateService,
|
||||
$AiService,
|
||||
@ -491,7 +513,8 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
$UserSuspendService,
|
||||
$UserAuthService,
|
||||
$VideoProcessingService,
|
||||
$WebhookService,
|
||||
$UserWebhookService,
|
||||
$SystemWebhookService,
|
||||
$UtilityService,
|
||||
$FileInfoService,
|
||||
$SearchService,
|
||||
@ -519,6 +542,8 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
$ChartManagementService,
|
||||
|
||||
$AbuseUserReportEntityService,
|
||||
$AnnouncementEntityService,
|
||||
$AbuseReportNotificationRecipientEntityService,
|
||||
$AntennaEntityService,
|
||||
$AppEntityService,
|
||||
$AuthSessionEntityService,
|
||||
@ -555,6 +580,7 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
$RoleEntityService,
|
||||
$ReversiGameEntityService,
|
||||
$MetaEntityService,
|
||||
$SystemWebhookEntityService,
|
||||
|
||||
$ApAudienceService,
|
||||
$ApDbResolverService,
|
||||
@ -565,7 +591,7 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
$ApRendererService,
|
||||
$ApRequestService,
|
||||
$ApResolverService,
|
||||
$LdSignatureService,
|
||||
$JsonLdService,
|
||||
$RemoteLoggerService,
|
||||
$RemoteUserResolveService,
|
||||
$WebfingerService,
|
||||
@ -580,6 +606,8 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
exports: [
|
||||
QueueModule,
|
||||
LoggerService,
|
||||
AbuseReportService,
|
||||
AbuseReportNotificationService,
|
||||
AccountMoveService,
|
||||
AccountUpdateService,
|
||||
AiService,
|
||||
@ -634,7 +662,8 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
UserSuspendService,
|
||||
UserAuthService,
|
||||
VideoProcessingService,
|
||||
WebhookService,
|
||||
UserWebhookService,
|
||||
SystemWebhookService,
|
||||
UtilityService,
|
||||
FileInfoService,
|
||||
SearchService,
|
||||
@ -661,6 +690,8 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
ChartManagementService,
|
||||
|
||||
AbuseUserReportEntityService,
|
||||
AnnouncementEntityService,
|
||||
AbuseReportNotificationRecipientEntityService,
|
||||
AntennaEntityService,
|
||||
AppEntityService,
|
||||
AuthSessionEntityService,
|
||||
@ -697,6 +728,7 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
RoleEntityService,
|
||||
ReversiGameEntityService,
|
||||
MetaEntityService,
|
||||
SystemWebhookEntityService,
|
||||
|
||||
ApAudienceService,
|
||||
ApDbResolverService,
|
||||
@ -707,7 +739,7 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
ApRendererService,
|
||||
ApRequestService,
|
||||
ApResolverService,
|
||||
LdSignatureService,
|
||||
JsonLdService,
|
||||
RemoteLoggerService,
|
||||
RemoteUserResolveService,
|
||||
WebfingerService,
|
||||
@ -721,6 +753,8 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
|
||||
//#region 文字列ベースでのinjection用(循環参照対応のため)
|
||||
$LoggerService,
|
||||
$AbuseReportService,
|
||||
$AbuseReportNotificationService,
|
||||
$AccountMoveService,
|
||||
$AccountUpdateService,
|
||||
$AiService,
|
||||
@ -775,7 +809,8 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
$UserSuspendService,
|
||||
$UserAuthService,
|
||||
$VideoProcessingService,
|
||||
$WebhookService,
|
||||
$UserWebhookService,
|
||||
$SystemWebhookService,
|
||||
$UtilityService,
|
||||
$FileInfoService,
|
||||
$SearchService,
|
||||
@ -802,6 +837,8 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
$ChartManagementService,
|
||||
|
||||
$AbuseUserReportEntityService,
|
||||
$AnnouncementEntityService,
|
||||
$AbuseReportNotificationRecipientEntityService,
|
||||
$AntennaEntityService,
|
||||
$AppEntityService,
|
||||
$AuthSessionEntityService,
|
||||
@ -838,6 +875,7 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
$RoleEntityService,
|
||||
$ReversiGameEntityService,
|
||||
$MetaEntityService,
|
||||
$SystemWebhookEntityService,
|
||||
|
||||
$ApAudienceService,
|
||||
$ApDbResolverService,
|
||||
@ -848,7 +886,7 @@ const $ApEventService: Provider = { provide: 'ApEventService', useExisting: ApEv
|
||||
$ApRendererService,
|
||||
$ApRequestService,
|
||||
$ApResolverService,
|
||||
$LdSignatureService,
|
||||
$JsonLdService,
|
||||
$RemoteLoggerService,
|
||||
$RemoteUserResolveService,
|
||||
$WebfingerService,
|
||||
|
@ -20,7 +20,7 @@ import { query } from '@/misc/prelude/url.js';
|
||||
import type { Serialized } from '@/types.js';
|
||||
import { ModerationLogService } from '@/core/ModerationLogService.js';
|
||||
|
||||
const parseEmojiStrRegexp = /^(\w+)(?:@([\w.-]+))?$/;
|
||||
const parseEmojiStrRegexp = /^([-\w]+)(?:@([\w.-]+))?$/;
|
||||
|
||||
@Injectable()
|
||||
export class CustomEmojiService implements OnApplicationShutdown {
|
||||
@ -68,7 +68,7 @@ export class CustomEmojiService implements OnApplicationShutdown {
|
||||
localOnly: boolean;
|
||||
roleIdsThatCanBeUsedThisEmojiAsReaction: MiRole['id'][];
|
||||
}, moderator?: MiUser): Promise<MiEmoji> {
|
||||
const emoji = await this.emojisRepository.insert({
|
||||
const emoji = await this.emojisRepository.insertOne({
|
||||
id: this.idService.gen(),
|
||||
updatedAt: new Date(),
|
||||
name: data.name,
|
||||
@ -82,7 +82,7 @@ export class CustomEmojiService implements OnApplicationShutdown {
|
||||
isSensitive: data.isSensitive,
|
||||
localOnly: data.localOnly,
|
||||
roleIdsThatCanBeUsedThisEmojiAsReaction: data.roleIdsThatCanBeUsedThisEmojiAsReaction,
|
||||
}).then(x => this.emojisRepository.findOneByOrFail(x.identifiers[0]));
|
||||
});
|
||||
|
||||
if (data.host == null) {
|
||||
this.localEmojisCache.refresh();
|
||||
@ -349,10 +349,11 @@ export class CustomEmojiService implements OnApplicationShutdown {
|
||||
@bindThis
|
||||
public async populateEmojis(emojiNames: string[], noteUserHost: string | null): Promise<Record<string, string>> {
|
||||
const emojis = await Promise.all(emojiNames.map(x => this.populateEmoji(x, noteUserHost)));
|
||||
const res = {} as any;
|
||||
const res = {} as Record<string, string>;
|
||||
for (let i = 0; i < emojiNames.length; i++) {
|
||||
if (emojis[i] != null) {
|
||||
res[emojiNames[i]] = emojis[i];
|
||||
const resolvedEmoji = emojis[i];
|
||||
if (resolvedEmoji != null) {
|
||||
res[emojiNames[i]] = resolvedEmoji;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
|
@ -229,7 +229,7 @@ export class DriveService {
|
||||
file.size = size;
|
||||
file.storedInternal = false;
|
||||
|
||||
return await this.driveFilesRepository.insert(file).then(x => this.driveFilesRepository.findOneByOrFail(x.identifiers[0]));
|
||||
return await this.driveFilesRepository.insertOne(file);
|
||||
} else { // use internal storage
|
||||
const accessKey = randomUUID();
|
||||
const thumbnailAccessKey = 'thumbnail-' + randomUUID();
|
||||
@ -263,7 +263,7 @@ export class DriveService {
|
||||
file.md5 = hash;
|
||||
file.size = size;
|
||||
|
||||
return await this.driveFilesRepository.insert(file).then(x => this.driveFilesRepository.findOneByOrFail(x.identifiers[0]));
|
||||
return await this.driveFilesRepository.insertOne(file);
|
||||
}
|
||||
}
|
||||
|
||||
@ -510,14 +510,20 @@ export class DriveService {
|
||||
|
||||
if (user && !force) {
|
||||
// Check if there is a file with the same hash
|
||||
const much = await this.driveFilesRepository.findOneBy({
|
||||
const matched = await this.driveFilesRepository.findOneBy({
|
||||
md5: info.md5,
|
||||
userId: user.id,
|
||||
});
|
||||
|
||||
if (much) {
|
||||
this.registerLogger.info(`file with same hash is found: ${much.id}`);
|
||||
return much;
|
||||
if (matched) {
|
||||
this.registerLogger.info(`file with same hash is found: ${matched.id}`);
|
||||
if (sensitive && !matched.isSensitive) {
|
||||
// The file is federated as sensitive for this time, but was federated as non-sensitive before.
|
||||
// Therefore, update the file to sensitive.
|
||||
await this.driveFilesRepository.update({ id: matched.id }, { isSensitive: true });
|
||||
matched.isSensitive = true;
|
||||
}
|
||||
return matched;
|
||||
}
|
||||
}
|
||||
|
||||
@ -622,7 +628,7 @@ export class DriveService {
|
||||
file.type = info.type.mime;
|
||||
file.storedInternal = false;
|
||||
|
||||
file = await this.driveFilesRepository.insert(file).then(x => this.driveFilesRepository.findOneByOrFail(x.identifiers[0]));
|
||||
file = await this.driveFilesRepository.insertOne(file);
|
||||
} catch (err) {
|
||||
// duplicate key error (when already registered)
|
||||
if (isDuplicateKeyValueError(err)) {
|
||||
|
@ -15,6 +15,7 @@ import type { UserProfilesRepository } from '@/models/_.js';
|
||||
import { LoggerService } from '@/core/LoggerService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { HttpRequestService } from '@/core/HttpRequestService.js';
|
||||
import { QueueService } from '@/core/QueueService.js';
|
||||
|
||||
@Injectable()
|
||||
export class EmailService {
|
||||
@ -31,6 +32,7 @@ export class EmailService {
|
||||
private loggerService: LoggerService,
|
||||
private utilityService: UtilityService,
|
||||
private httpRequestService: HttpRequestService,
|
||||
private queueService: QueueService,
|
||||
) {
|
||||
this.logger = this.loggerService.getLogger('email');
|
||||
}
|
||||
|
@ -62,8 +62,8 @@ export class FanoutTimelineEndpointService {
|
||||
// 呼び出し元と以下の処理をシンプルにするためにdbFallbackを置き換える
|
||||
if (!ps.useDbFallback) ps.dbFallback = () => Promise.resolve([]);
|
||||
|
||||
const shouldPrepend = ps.sinceId && !ps.untilId;
|
||||
const idCompare: (a: string, b: string) => number = shouldPrepend ? (a, b) => a < b ? -1 : 1 : (a, b) => a > b ? -1 : 1;
|
||||
const ascending = ps.sinceId && !ps.untilId;
|
||||
const idCompare: (a: string, b: string) => number = ascending ? (a, b) => a < b ? -1 : 1 : (a, b) => a > b ? -1 : 1;
|
||||
|
||||
const redisResult = await this.fanoutTimelineService.getMulti(ps.redisTimelines, ps.untilId, ps.sinceId);
|
||||
|
||||
@ -122,7 +122,7 @@ export class FanoutTimelineEndpointService {
|
||||
filter = (note) => {
|
||||
if (isUserRelated(note, userIdsWhoBlockingMe, ps.ignoreAuthorFromBlock)) return false;
|
||||
if (isUserRelated(note, userIdsWhoMeMuting, ps.ignoreAuthorFromMute)) return false;
|
||||
if (isRenote(note) && !isQuote(note) && isUserRelated(note, userIdsWhoMeMutingRenotes, ps.ignoreAuthorFromMute)) return false;
|
||||
if (!ps.ignoreAuthorFromMute && isRenote(note) && !isQuote(note) && userIdsWhoMeMutingRenotes.has(note.userId)) return false;
|
||||
if (isInstanceMuted(note, userMutedInstances)) return false;
|
||||
|
||||
return parentFilter(note);
|
||||
@ -148,9 +148,7 @@ export class FanoutTimelineEndpointService {
|
||||
|
||||
if (ps.allowPartial ? redisTimeline.length !== 0 : redisTimeline.length >= ps.limit) {
|
||||
// 十分Redisからとれた
|
||||
const result = redisTimeline.slice(0, ps.limit);
|
||||
if (shouldPrepend) result.reverse();
|
||||
return result;
|
||||
return redisTimeline.slice(0, ps.limit);
|
||||
}
|
||||
}
|
||||
|
||||
@ -158,8 +156,7 @@ export class FanoutTimelineEndpointService {
|
||||
const remainingToRead = ps.limit - redisTimeline.length;
|
||||
let dbUntil: string | null;
|
||||
let dbSince: string | null;
|
||||
if (shouldPrepend) {
|
||||
redisTimeline.reverse();
|
||||
if (ascending) {
|
||||
dbUntil = ps.untilId;
|
||||
dbSince = noteIds[noteIds.length - 1];
|
||||
} else {
|
||||
@ -167,7 +164,7 @@ export class FanoutTimelineEndpointService {
|
||||
dbSince = ps.sinceId;
|
||||
}
|
||||
const gotFromDb = await ps.dbFallback(dbUntil, dbSince, remainingToRead);
|
||||
return shouldPrepend ? [...gotFromDb, ...redisTimeline] : [...redisTimeline, ...gotFromDb];
|
||||
return [...redisTimeline, ...gotFromDb];
|
||||
}
|
||||
|
||||
return await ps.dbFallback(ps.untilId, ps.sinceId, ps.limit);
|
||||
|
@ -55,11 +55,11 @@ export class FederatedInstanceService implements OnApplicationShutdown {
|
||||
const index = await this.instancesRepository.findOneBy({ host });
|
||||
|
||||
if (index == null) {
|
||||
const i = await this.instancesRepository.insert({
|
||||
const i = await this.instancesRepository.insertOne({
|
||||
id: this.idService.gen(),
|
||||
host,
|
||||
firstRetrievedAt: new Date(),
|
||||
}).then(x => this.instancesRepository.findOneByOrFail(x.identifiers[0]));
|
||||
});
|
||||
|
||||
this.federatedInstanceCache.set(host, i);
|
||||
return i;
|
||||
|
@ -155,7 +155,7 @@ export class FetchInstanceMetadataService {
|
||||
throw new Error('No wellknown links');
|
||||
}
|
||||
|
||||
const links = wellknown.links as any[];
|
||||
const links = wellknown.links as ({ rel: string, href: string; })[];
|
||||
|
||||
const link1_0 = links.find(link => link.rel === 'http://nodeinfo.diaspora.software/ns/schema/1.0');
|
||||
const link2_0 = links.find(link => link.rel === 'http://nodeinfo.diaspora.software/ns/schema/2.0');
|
||||
|
@ -20,6 +20,7 @@ import type { MiAbuseUserReport } from '@/models/AbuseUserReport.js';
|
||||
import type { MiSignin } from '@/models/Signin.js';
|
||||
import type { MiPage } from '@/models/Page.js';
|
||||
import type { MiWebhook } from '@/models/Webhook.js';
|
||||
import type { MiSystemWebhook } from '@/models/SystemWebhook.js';
|
||||
import type { MiMeta } from '@/models/Meta.js';
|
||||
import { MiAvatarDecoration, MiReversiGame, MiRole, MiRoleAssignment } from '@/models/_.js';
|
||||
import type { Packed } from '@/misc/json-schema.js';
|
||||
@ -258,6 +259,9 @@ export interface InternalEventTypes {
|
||||
webhookCreated: MiWebhook;
|
||||
webhookDeleted: MiWebhook;
|
||||
webhookUpdated: MiWebhook;
|
||||
systemWebhookCreated: MiSystemWebhook;
|
||||
systemWebhookDeleted: MiSystemWebhook;
|
||||
systemWebhookUpdated: MiSystemWebhook;
|
||||
antennaCreated: MiAntenna;
|
||||
antennaDeleted: MiAntenna;
|
||||
antennaUpdated: MiAntenna;
|
||||
|
@ -23,8 +23,8 @@ export class LoggerService {
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public getLogger(domain: string, color?: KEYWORD | undefined, store?: boolean) {
|
||||
public getLogger(domain: string, color?: KEYWORD | undefined) {
|
||||
const logger = this.cloudLogging?.log(this.config.cloudLogging?.logName ?? 'cherrypick');
|
||||
return new Logger(domain, color, store, logger);
|
||||
return new Logger(domain, color, logger);
|
||||
}
|
||||
}
|
||||
|
@ -6,10 +6,11 @@
|
||||
import { URL } from 'node:url';
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import * as parse5 from 'parse5';
|
||||
import { Window } from 'happy-dom';
|
||||
import { Window, XMLSerializer } from 'happy-dom';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import type { Config } from '@/config.js';
|
||||
import { intersperse } from '@/misc/prelude/array.js';
|
||||
import { normalizeForSearch } from '@/misc/normalize-for-search.js';
|
||||
import type { IMentionedRemoteUsers } from '@/models/Note.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import * as TreeAdapter from '../../node_modules/parse5/dist/tree-adapters/default.js';
|
||||
@ -33,6 +34,8 @@ export class MfmService {
|
||||
// some AP servers like Pixelfed use br tags as well as newlines
|
||||
html = html.replace(/<br\s?\/?>\r?\n/gi, '\n');
|
||||
|
||||
const normalizedHashtagNames = hashtagNames == null ? undefined : new Set<string>(hashtagNames.map(x => normalizeForSearch(x)));
|
||||
|
||||
const dom = parse5.parseFragment(html);
|
||||
|
||||
let text = '';
|
||||
@ -85,7 +88,7 @@ export class MfmService {
|
||||
const href = node.attrs.find(x => x.name === 'href');
|
||||
|
||||
// ハッシュタグ
|
||||
if (hashtagNames && href && hashtagNames.map(x => x.toLowerCase()).includes(txt.toLowerCase())) {
|
||||
if (normalizedHashtagNames && href && normalizedHashtagNames.has(normalizeForSearch(txt))) {
|
||||
text += txt;
|
||||
// メンション
|
||||
} else if (txt.startsWith('@') && !(rel && rel.value.startsWith('me '))) {
|
||||
@ -244,6 +247,8 @@ export class MfmService {
|
||||
|
||||
const doc = window.document;
|
||||
|
||||
const body = doc.createElement('p');
|
||||
|
||||
function appendChildren(children: mfm.MfmNode[], targetElement: any): void {
|
||||
if (children) {
|
||||
for (const child of children.map(x => (handlers as any)[x.type](x))) targetElement.appendChild(child);
|
||||
@ -454,8 +459,8 @@ export class MfmService {
|
||||
},
|
||||
};
|
||||
|
||||
appendChildren(nodes, doc.body);
|
||||
appendChildren(nodes, body);
|
||||
|
||||
return `<p>${doc.body.innerHTML}</p>`;
|
||||
return new XMLSerializer().serializeToString(body);
|
||||
}
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ import InstanceChart from '@/core/chart/charts/instance.js';
|
||||
import ActiveUsersChart from '@/core/chart/charts/active-users.js';
|
||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||
import { NotificationService } from '@/core/NotificationService.js';
|
||||
import { WebhookService } from '@/core/WebhookService.js';
|
||||
import { UserWebhookService } from '@/core/UserWebhookService.js';
|
||||
import { HashtagService } from '@/core/HashtagService.js';
|
||||
import { AntennaService } from '@/core/AntennaService.js';
|
||||
import { QueueService } from '@/core/QueueService.js';
|
||||
@ -210,7 +210,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||
private federatedInstanceService: FederatedInstanceService,
|
||||
private hashtagService: HashtagService,
|
||||
private antennaService: AntennaService,
|
||||
private webhookService: WebhookService,
|
||||
private webhookService: UserWebhookService,
|
||||
private featuredService: FeaturedService,
|
||||
private remoteUserResolveService: RemoteUserResolveService,
|
||||
private apDeliverManagerService: ApDeliverManagerService,
|
||||
@ -482,6 +482,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||
noteVisibility: insert.visibility,
|
||||
userId: user.id,
|
||||
userHost: user.host,
|
||||
channelId: insert.channelId,
|
||||
});
|
||||
|
||||
await transactionalEntityManager.insert(MiPoll, poll);
|
||||
@ -630,7 +631,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||
this.webhookService.getActiveWebhooks().then(webhooks => {
|
||||
webhooks = webhooks.filter(x => x.userId === user.id && x.on.includes('note'));
|
||||
for (const webhook of webhooks) {
|
||||
this.queueService.webhookDeliver(webhook, 'note', {
|
||||
this.queueService.userWebhookDeliver(webhook, 'note', {
|
||||
note: noteObj,
|
||||
});
|
||||
}
|
||||
@ -657,7 +658,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||
|
||||
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === data.reply!.userId && x.on.includes('reply'));
|
||||
for (const webhook of webhooks) {
|
||||
this.queueService.webhookDeliver(webhook, 'reply', {
|
||||
this.queueService.userWebhookDeliver(webhook, 'reply', {
|
||||
note: noteObj,
|
||||
});
|
||||
}
|
||||
@ -680,7 +681,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||
|
||||
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === data.renote!.userId && x.on.includes('renote'));
|
||||
for (const webhook of webhooks) {
|
||||
this.queueService.webhookDeliver(webhook, 'renote', {
|
||||
this.queueService.userWebhookDeliver(webhook, 'renote', {
|
||||
note: noteObj,
|
||||
});
|
||||
}
|
||||
@ -812,7 +813,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||
|
||||
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === u.id && x.on.includes('mention'));
|
||||
for (const webhook of webhooks) {
|
||||
this.queueService.webhookDeliver(webhook, 'mention', {
|
||||
this.queueService.userWebhookDeliver(webhook, 'mention', {
|
||||
note: detailPackedNote,
|
||||
});
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user