Merge branch 'develop' into enh-15290

This commit is contained in:
kakkokari-gtyih 2025-05-23 17:22:31 +09:00
commit bbe1313800
457 changed files with 13725 additions and 9176 deletions

View File

@ -215,20 +215,9 @@ proxyBypassHosts:
# Media Proxy # Media Proxy
#mediaProxy: https://example.com/proxy #mediaProxy: https://example.com/proxy
# Proxy remote files (default: true)
proxyRemoteFiles: true
# Sign to ActivityPub GET request (default: true)
signToActivityPubGet: true
allowedPrivateNetworks: [ allowedPrivateNetworks: [
'127.0.0.1/32' '127.0.0.1/32'
] ]
# Disable automatic redirect for ActivityPub object lookup. (default: false)
# This is a strong defense against potential impersonation attacks if the viewer instance has inadequate validation.
# However it will make it impossible for other instances to lookup third-party user and notes through your URL.
#disallowExternalApRedirect: true
# Upload or download file size limits (bytes) # Upload or download file size limits (bytes)
#maxFileSize: 262144000 #maxFileSize: 262144000

View File

@ -227,12 +227,6 @@ proxyBypassHosts:
# Media Proxy # Media Proxy
#mediaProxy: https://example.com/proxy #mediaProxy: https://example.com/proxy
# Proxy remote files (default: true)
proxyRemoteFiles: true
# Sign to ActivityPub GET request (default: true)
signToActivityPubGet: true
# For security reasons, uploading attachments from the intranet is prohibited, # For security reasons, uploading attachments from the intranet is prohibited,
# but exceptions can be made from the following settings. Default value is "undefined". # but exceptions can be made from the following settings. Default value is "undefined".
# Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)). # Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)).
@ -240,11 +234,6 @@ signToActivityPubGet: true
# '127.0.0.1/32' # '127.0.0.1/32'
#] #]
# Disable automatic redirect for ActivityPub object lookup. (default: false)
# This is a strong defense against potential impersonation attacks if the viewer instance has inadequate validation.
# However it will make it impossible for other instances to lookup third-party user and notes through your URL.
#disallowExternalApRedirect: true
# Upload or download file size limits (bytes) # Upload or download file size limits (bytes)
#maxFileSize: 262144000 #maxFileSize: 262144000

View File

@ -319,19 +319,12 @@ proxyBypassHosts:
# * Perform image compression (on a different server resource than the main process) # * Perform image compression (on a different server resource than the main process)
#mediaProxy: https://example.com/proxy #mediaProxy: https://example.com/proxy
# Proxy remote files (default: true)
# Proxy remote files by this instance or mediaProxy to prevent remote files from running in remote domains.
proxyRemoteFiles: true
# Movie Thumbnail Generation URL # Movie Thumbnail Generation URL
# There is no reference implementation. # There is no reference implementation.
# For example, Misskey will point to the following URL: # For example, Misskey will point to the following URL:
# https://example.com/thumbnail.webp?thumbnail=1&url=https%3A%2F%2Fstorage.example.com%2Fpath%2Fto%2Fvideo.mp4 # https://example.com/thumbnail.webp?thumbnail=1&url=https%3A%2F%2Fstorage.example.com%2Fpath%2Fto%2Fvideo.mp4
#videoThumbnailGenerator: https://example.com #videoThumbnailGenerator: https://example.com
# Sign to ActivityPub GET request (default: true)
signToActivityPubGet: true
# For security reasons, uploading attachments from the intranet is prohibited, # For security reasons, uploading attachments from the intranet is prohibited,
# but exceptions can be made from the following settings. Default value is "undefined". # but exceptions can be made from the following settings. Default value is "undefined".
# Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)). # Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)).
@ -339,11 +332,6 @@ signToActivityPubGet: true
# '127.0.0.1/32' # '127.0.0.1/32'
#] #]
# Disable automatic redirect for ActivityPub object lookup. (default: false)
# This is a strong defense against potential impersonation attacks if the viewer instance has inadequate validation.
# However it will make it impossible for other instances to lookup third-party user and notes through your URL.
#disallowExternalApRedirect: true
# Upload or download file size limits (bytes) # Upload or download file size limits (bytes)
#maxFileSize: 262144000 #maxFileSize: 262144000

View File

@ -5,7 +5,7 @@
"workspaceFolder": "/workspace", "workspaceFolder": "/workspace",
"features": { "features": {
"ghcr.io/devcontainers/features/node:1": { "ghcr.io/devcontainers/features/node:1": {
"version": "22.11.0" "version": "22.15.0"
}, },
"ghcr.io/devcontainers-extra/features/pnpm:2": { "ghcr.io/devcontainers-extra/features/pnpm:2": {
"version": "10.10.0" "version": "10.10.0"

View File

@ -202,12 +202,6 @@ proxyBypassHosts:
# Media Proxy # Media Proxy
#mediaProxy: https://example.com/proxy #mediaProxy: https://example.com/proxy
# Proxy remote files (default: true)
proxyRemoteFiles: true
# Sign to ActivityPub GET request (default: true)
signToActivityPubGet: true
allowedPrivateNetworks: [ allowedPrivateNetworks: [
'127.0.0.1/32' '127.0.0.1/32'
] ]

1
.github/min.node-version vendored Normal file
View File

@ -0,0 +1 @@
20.10.0

View File

@ -58,6 +58,7 @@ jobs:
"packages/frontend/test" "packages/frontend/test"
"packages/frontend-embed/@types" "packages/frontend-embed/@types"
"packages/frontend-embed/src" "packages/frontend-embed/src"
"packages/icons-subsetter/src"
"packages/misskey-bubble-game/src" "packages/misskey-bubble-game/src"
"packages/misskey-reversi/src" "packages/misskey-reversi/src"
"packages/sw/src" "packages/sw/src"

View File

@ -17,7 +17,6 @@ jobs:
strategy: strategy:
matrix: matrix:
node-version: [22.11.0]
api-json-name: [api-base.json, api-head.json] api-json-name: [api-base.json, api-head.json]
include: include:
- api-json-name: api-base.json - api-json-name: api-base.json
@ -32,10 +31,10 @@ jobs:
submodules: true submodules: true
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v4.1.0 uses: pnpm/action-setup@v4.1.0
- name: Use Node.js ${{ matrix.node-version }} - name: Use Node.js
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v4.4.0
with: with:
node-version: ${{ matrix.node-version }} node-version-file: '.node-version'
cache: 'pnpm' cache: 'pnpm'
- run: pnpm i --frozen-lockfile - run: pnpm i --frozen-lockfile
- name: Check pnpm-lock.yaml - name: Check pnpm-lock.yaml

View File

@ -10,6 +10,7 @@ on:
- packages/frontend/** - packages/frontend/**
- packages/frontend-shared/** - packages/frontend-shared/**
- packages/frontend-embed/** - packages/frontend-embed/**
- packages/icons-subsetter/**
- packages/sw/** - packages/sw/**
- packages/misskey-js/** - packages/misskey-js/**
- packages/misskey-bubble-game/** - packages/misskey-bubble-game/**
@ -22,6 +23,7 @@ on:
- packages/frontend/** - packages/frontend/**
- packages/frontend-shared/** - packages/frontend-shared/**
- packages/frontend-embed/** - packages/frontend-embed/**
- packages/icons-subsetter/**
- packages/sw/** - packages/sw/**
- packages/misskey-js/** - packages/misskey-js/**
- packages/misskey-bubble-game/** - packages/misskey-bubble-game/**
@ -55,6 +57,7 @@ jobs:
- frontend - frontend
- frontend-shared - frontend-shared
- frontend-embed - frontend-embed
- icons-subsetter
- sw - sw
- misskey-js - misskey-js
- misskey-bubble-game - misskey-bubble-game

View File

@ -15,22 +15,17 @@ jobs:
contents: read contents: read
id-token: write id-token: write
strategy:
matrix:
node-version: [22.11.0]
steps: steps:
- uses: actions/checkout@v4.2.2 - uses: actions/checkout@v4.2.2
with: with:
submodules: true submodules: true
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v4.1.0 uses: pnpm/action-setup@v4.1.0
- name: Use Node.js ${{ matrix.node-version }} - name: Use Node.js
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v4.4.0
with: with:
node-version: ${{ matrix.node-version }} node-version-file: '.node-version'
cache: 'pnpm' cache: 'pnpm'
registry-url: 'https://registry.npmjs.org'
- name: Publish package - name: Publish package
run: | run: |
pnpm i --frozen-lockfile pnpm i --frozen-lockfile

View File

@ -38,7 +38,7 @@ jobs:
run: git checkout "$(git rev-list --parents -n1 HEAD | cut -d" " -f3)" run: git checkout "$(git rev-list --parents -n1 HEAD | cut -d" " -f3)"
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v4.1.0 uses: pnpm/action-setup@v4.1.0
- name: Use Node.js 20.x - name: Use Node.js
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v4.4.0
with: with:
node-version-file: '.node-version' node-version-file: '.node-version'
@ -78,7 +78,7 @@ jobs:
if: github.event_name == 'pull_request_target' if: github.event_name == 'pull_request_target'
id: chromatic_pull_request id: chromatic_pull_request
run: | run: |
CHROMATIC_PARAMETER="$(node packages/frontend/.storybook/changes.js $(git diff-tree --no-commit-id --name-only -r origin/${GITHUB_BASE_REF}...origin/${GITHUB_HEAD_REF} | xargs))" CHROMATIC_PARAMETER="$(node packages/frontend/.storybook/changes.js $(git diff --name-only origin/${GITHUB_BASE_REF}...origin/${GITHUB_HEAD_REF} | xargs))"
if [ "$CHROMATIC_PARAMETER" = " --skip" ]; then if [ "$CHROMATIC_PARAMETER" = " --skip" ]; then
echo "skip=true" >> $GITHUB_OUTPUT echo "skip=true" >> $GITHUB_OUTPUT
fi fi

View File

@ -22,10 +22,11 @@ jobs:
unit: unit:
name: Unit tests (backend) name: Unit tests (backend)
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
node-version: [22.11.0] node-version-file:
- .node-version
- .github/min.node-version
services: services:
postgres: postgres:
@ -61,10 +62,10 @@ jobs:
exit 1 exit 1
fi fi
done done
- name: Use Node.js ${{ matrix.node-version }} - name: Use Node.js
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v4.4.0
with: with:
node-version: ${{ matrix.node-version }} node-version-file: ${{ matrix.node-version-file }}
cache: 'pnpm' cache: 'pnpm'
- run: pnpm i --frozen-lockfile - run: pnpm i --frozen-lockfile
- name: Check pnpm-lock.yaml - name: Check pnpm-lock.yaml
@ -84,10 +85,11 @@ jobs:
e2e: e2e:
name: E2E tests (backend) name: E2E tests (backend)
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
node-version: [22.11.0] node-version-file:
- .node-version
- .github/min.node-version
services: services:
postgres: postgres:
@ -108,10 +110,10 @@ jobs:
submodules: true submodules: true
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v4.1.0 uses: pnpm/action-setup@v4.1.0
- name: Use Node.js ${{ matrix.node-version }} - name: Use Node.js
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v4.4.0
with: with:
node-version: ${{ matrix.node-version }} node-version-file: ${{ matrix.node-version-file }}
cache: 'pnpm' cache: 'pnpm'
- run: pnpm i --frozen-lockfile - run: pnpm i --frozen-lockfile
- name: Check pnpm-lock.yaml - name: Check pnpm-lock.yaml

View File

@ -21,7 +21,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
node-version: [22.11.0] node-version-file:
- .node-version
- .github/min.node-version
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
@ -43,10 +45,10 @@ jobs:
exit 1 exit 1
fi fi
done done
- name: Use Node.js ${{ matrix.node-version }} - name: Use Node.js
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v4.4.0
with: with:
node-version: ${{ matrix.node-version }} node-version-file: ${{ matrix.node-version-file }}
cache: 'pnpm' cache: 'pnpm'
- name: Build Misskey - name: Build Misskey
run: | run: |
@ -54,6 +56,7 @@ jobs:
pnpm build pnpm build
- name: Setup - name: Setup
run: | run: |
echo "NODE_VERSION=$(cat ${{ matrix.node-version-file }})" >> $GITHUB_ENV
cd packages/backend/test-federation cd packages/backend/test-federation
bash ./setup.sh bash ./setup.sh
sudo chmod 644 ./certificates/*.test.key sudo chmod 644 ./certificates/*.test.key

View File

@ -27,20 +27,16 @@ jobs:
name: Unit tests (frontend) name: Unit tests (frontend)
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy:
matrix:
node-version: [22.11.0]
steps: steps:
- uses: actions/checkout@v4.2.2 - uses: actions/checkout@v4.2.2
with: with:
submodules: true submodules: true
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v4.1.0 uses: pnpm/action-setup@v4.1.0
- name: Use Node.js ${{ matrix.node-version }} - name: Use Node.js
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v4.4.0
with: with:
node-version: ${{ matrix.node-version }} node-version-file: '.node-version'
cache: 'pnpm' cache: 'pnpm'
- run: pnpm i --frozen-lockfile - run: pnpm i --frozen-lockfile
- name: Check pnpm-lock.yaml - name: Check pnpm-lock.yaml
@ -64,7 +60,6 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
node-version: [22.11.0]
browser: [chrome] browser: [chrome]
services: services:
@ -92,10 +87,10 @@ jobs:
# if: ${{ matrix.browser == 'firefox' }} # if: ${{ matrix.browser == 'firefox' }}
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v4.1.0 uses: pnpm/action-setup@v4.1.0
- name: Use Node.js ${{ matrix.node-version }} - name: Use Node.js
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v4.4.0
with: with:
node-version: ${{ matrix.node-version }} node-version-file: '.node-version'
cache: 'pnpm' cache: 'pnpm'
- run: pnpm i --frozen-lockfile - run: pnpm i --frozen-lockfile
- name: Copy Configure - name: Copy Configure

View File

@ -20,11 +20,6 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy:
matrix:
node-version: [22.11.0]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4.2.2 uses: actions/checkout@v4.2.2
@ -32,10 +27,10 @@ jobs:
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v4.1.0 uses: pnpm/action-setup@v4.1.0
- name: Setup Node.js ${{ matrix.node-version }} - name: Setup Node.js
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v4.4.0
with: with:
node-version: ${{ matrix.node-version }} node-version-file: '.node-version'
cache: 'pnpm' cache: 'pnpm'
- name: Install dependencies - name: Install dependencies

View File

@ -15,20 +15,16 @@ jobs:
name: Production build name: Production build
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy:
matrix:
node-version: [22.11.0]
steps: steps:
- uses: actions/checkout@v4.2.2 - uses: actions/checkout@v4.2.2
with: with:
submodules: true submodules: true
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v4.1.0 uses: pnpm/action-setup@v4.1.0
- name: Use Node.js ${{ matrix.node-version }} - name: Use Node.js
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v4.4.0
with: with:
node-version: ${{ matrix.node-version }} node-version-file: '.node-version'
cache: 'pnpm' cache: 'pnpm'
- run: pnpm i --frozen-lockfile - run: pnpm i --frozen-lockfile
- name: Check pnpm-lock.yaml - name: Check pnpm-lock.yaml

View File

@ -16,20 +16,16 @@ jobs:
validate-api-json: validate-api-json:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy:
matrix:
node-version: [22.11.0]
steps: steps:
- uses: actions/checkout@v4.2.2 - uses: actions/checkout@v4.2.2
with: with:
submodules: true submodules: true
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v4.1.0 uses: pnpm/action-setup@v4.1.0
- name: Use Node.js ${{ matrix.node-version }} - name: Use Node.js
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v4.4.0
with: with:
node-version: ${{ matrix.node-version }} node-version-file: '.node-version'
cache: 'pnpm' cache: 'pnpm'
- name: Install Redocly CLI - name: Install Redocly CLI
run: npm i -g @redocly/cli run: npm i -g @redocly/cli

View File

@ -1 +1 @@
22.11.0 22.15.0

View File

@ -1,3 +1,97 @@
## 2025.5.1
### Note
- 設定ファイルの以下の項目がコントロールパネルから設定するようになりました
- signToActivityPubGet
- proxyRemoteFiles
- disallowExternalApRedirect
- 許可しないかどうかではなく、許可するかどうかの設定(allowExternalApRedirect)になりました
### General
- Feat: 非ログインでサーバーを閲覧された際に、サーバー内のコンテンツを非公開にすることができるようになりました
- モデレーションが行き届きにくい不適切なリモートコンテンツなどが、自サーバー経由で図らずもインターネットに公開されてしまうことによるトラブル防止などに役立ちます
- 「全て公開(今までの挙動)」「ローカルのコンテンツだけ公開(=サーバー内で受信されたリモートのコンテンツは公開しない)」「何も公開しない」から選択できます
- デフォルト値は「ローカルのコンテンツだけ公開」になっています
- Feat: ロールでアップロード可能なファイル種別を設定可能になりました
- デフォルトは**テキスト、JSON、画像、動画、音声ファイル**になっています。zipなど、その他の種別のファイルは含まれていないため、必要に応じて設定を変更してください。
- Enhance: UIのアイコンデータの読み込みを軽量化
### Client
- Feat: ドライブのUIが強化されました
- 複数のファイルをまとめて移動できるようになりました
- Feat: ファイルのアップロードUIが一新されました
- アップロード前にファイル情報を確認できるようになりました
- 圧縮の品質を選択できるようになりました
- アップロードに失敗したときに再試行できるようになりました
- アップロード前に画像のクロッピングを行えるようになりました
- ファイルサイズのチェックは圧縮後の実際にアップロードされるサイズで行われるようになりました
- ファイルのアップロードを中断できるようになりました
- Feat: サーバー初期設定ウィザードが実装されました
- 簡単なウィザードに従うだけで、サーバーに最適な設定が適用されます
- Feat: Websocket接続を行わずにMisskeyを利用するNo Websocketモードが実装されました(beta)
- サーバーのパフォーマンス向上に寄与することが期待されます
- 何らの理由によりWebsocket接続が行えない環境でも快適に利用可能です
- 従来のWebsocket接続を行うモードはリアルタイムモードとして再定義されました
- チャットなど、一部の機能は引き続き設定に関わらずWebsocket接続が行われます
- Feat: 絵文字をミュート可能にする機能
- 絵文字(ユニコードの絵文字・カスタム絵文字)毎にミュートし、不可視化することができるようになりました
- Feat: モバイルデバイスで折りたたまれたUIの展開表示に全画面ページを使用できるように(実験的)
- Enhance: メモリ使用量を軽減しました
- Enhance: 画像の高品質なプレースホルダを無効化してパフォーマンスを向上させるオプションを追加
- Enhance: 招待されているが参加していないルームを開いたときに、招待を承認するかどうか尋ねるように
- Enhance: リプライ元にアンケートがあることが表示されるように
- Enhance: ノートのサーバー情報のデザインを改善・パフォーマンス向上
(Based on https://github.com/taiyme/misskey/pull/198, https://github.com/taiyme/misskey/pull/211, https://github.com/taiyme/misskey/pull/283)
- Enhance: ユーザー設定でURLプレビューを無効化できるように
- Enhance: ヒントとコツを追加
- Enhance: ヒントとコツを再表示できるように
- Enhance: AiScriptからtoastを表示する関数 `Mk:toast` を追加
- Enhance: シンタックスハイライトのエンジンをJavaScriptベースのものに変更
- フロントエンドの読み込みサイズを軽量化しました
- ほとんどの言語のハイライトは問題なく行えますが、互換性の問題により一部の言語が正常にハイライトできなくなる可能性があります。詳しくは https://shiki.style/references/engine-js-compat をご覧ください。
- Fix: "時計"ウィジェット(Clock)において、Transparent設定が有効でも、その背景が透過されない問題を修正
- Fix: 一定時間操作がなかったら動画プレイヤーのコントロールを隠すように
### Server
- Enhance: チャットルームの最大メンバー数を30人から50人に調整
- Enhance: ノートのレスポンスにアンケートが添付されているかどうかを示すフラグ`hasPoll`を追加
- Enhance: チャットルームのレスポンスに招待されているかどうかを示すフラグ`invitationExists`を追加
- Enhance: レートリミットの計算方法を調整 (#13997)
- Fix: チャットルームが削除された場合・チャットルームから抜けた場合に、未読状態が残り続けることがあるのを修正
- Fix: ユーザ除外アンテナをインポートできない問題を修正
- Fix: アンテナのセンシティブなチャンネルのノートを含むかどうかの情報がエクスポートされない問題を修正
- Fix: 連合モードが「なし」の場合に、生成されるHTML内のactivity jsonへのリンクタグを省略するように
- Fix: コントロールパネルから招待コードを作成すると作成者の情報が記録されない問題を修正
## 2025.5.0
### Note
- DockerのNode.jsが22.15.0に更新されました
### Client
- Feat: マウスで中ボタンドラッグによりタイムラインを引っ張って更新できるように
- アクセシビリティ設定からオフにすることもできます
- Enhance: タイムラインのパフォーマンスを向上
- Enhance: バックアップされた設定のプロファイルを削除できるように
- Fix: 一部のブラウザでアコーディオンメニューのアニメーションが動作しない問題を修正
- Fix: ダイアログのお知らせが画面からはみ出ることがある問題を修正
- Fix: ユーザーポップアップでエラーが生じてもインジケーターが表示され続けてしまう問題を修正
### Server
- Enhance: 凍結されたユーザのノートが各種タイムラインで表示されないように `#15775`
- Enhance: 連合先のソフトウェア及びバージョン名により配信停止を行えるように `#15727`
- Enhance: 2025.4.1 で追加されたインデックスの再生成をノートの追加しながら行えるようになりました。 `#15915`
- `MISSKEY_MIGRATION_CREATE_INDEX_CONCURRENTLY` 環境変数を `1` にセットしていると、巨大なテーブルの既存のカラムに関するインデックス再生成が`CREATE INDEX CONCURRENTLY`を使用するようになりました。
- 複数のサーバープロセスをクラスタリングしているサーバーにおいて、一部のプロセスが起動している状態でこのオプションを有効にしてマイグレーションすることにより、ダウンタイムを削減することができます。
- ただし、このオプションを有効にする場合、インデックスの作成にかかる時間が倍~3倍以上になることがあります。
- また、大きなインスタンスである場合にはインデックスの作成に失敗し、複数回再試行する必要がある可能性があります。
- Fix: チャンネルのフォロー一覧の結果が一部正しくないのを修正 (#12175)
- Fix: ファイルをアップロードした際にファイル名が常に untitled になる問題を修正
- Fix: ファイルのアップロードに失敗することがある問題を修正
- 投稿フォーム上で画像のクロップを行うと、`Invalid Param.`エラーでノートが投稿出来なくなる問題も解決されます。
- この事象によって既にノートが投稿出来ない状態になっている場合は、投稿フォーム右上のメニューから、下書きデータの「リセット」を行ってください。
## 2025.4.1 ## 2025.4.1
### General ### General

View File

@ -258,6 +258,12 @@ Misskey uses Vue(v3) as its front-end framework.
- **When creating a new component, please use the Composition API (with [setup sugar](https://v3.vuejs.org/api/sfc-script-setup.html) and [ref sugar](https://github.com/vuejs/rfcs/discussions/369)) instead of the Options API.** - **When creating a new component, please use the Composition API (with [setup sugar](https://v3.vuejs.org/api/sfc-script-setup.html) and [ref sugar](https://github.com/vuejs/rfcs/discussions/369)) instead of the Options API.**
- Some of the existing components are implemented in the Options API, but it is an old implementation. Refactors that migrate those components to the Composition API are also welcome. - Some of the existing components are implemented in the Options API, but it is an old implementation. Refactors that migrate those components to the Composition API are also welcome.
## Tabler Icons
アイコンは、Production Build時に使用されていないものが削除されるようになっています。
**アイコンを動的に設定する際には、 `ti-${someVal}` のような、アイコン名のみを動的に変化させる実装を行わないでください。**
必ず `ti-xxx` のような完全なクラス名を含めるようにしてください。
## nirax ## nirax
niraxは、Misskeyで使用しているオリジナルのフロントエンドルーティングシステムです。 niraxは、Misskeyで使用しているオリジナルのフロントエンドルーティングシステムです。
**vue-routerから影響を多大に受けているので、まずはvue-routerについて学ぶことをお勧めします。** **vue-routerから影響を多大に受けているので、まずはvue-routerについて学ぶことをお勧めします。**

View File

@ -1,6 +1,6 @@
# syntax = docker/dockerfile:1.4 # syntax = docker/dockerfile:1.4
ARG NODE_VERSION=22.11.0-bookworm ARG NODE_VERSION=22.15.0-bookworm
# build assets & compile TypeScript # build assets & compile TypeScript
@ -22,6 +22,7 @@ COPY --link ["packages/backend/package.json", "./packages/backend/"]
COPY --link ["packages/frontend-shared/package.json", "./packages/frontend-shared/"] COPY --link ["packages/frontend-shared/package.json", "./packages/frontend-shared/"]
COPY --link ["packages/frontend/package.json", "./packages/frontend/"] COPY --link ["packages/frontend/package.json", "./packages/frontend/"]
COPY --link ["packages/frontend-embed/package.json", "./packages/frontend-embed/"] COPY --link ["packages/frontend-embed/package.json", "./packages/frontend-embed/"]
COPY --link ["packages/icons-subsetter/package.json", "./packages/icons-subsetter/"]
COPY --link ["packages/sw/package.json", "./packages/sw/"] COPY --link ["packages/sw/package.json", "./packages/sw/"]
COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"] COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
COPY --link ["packages/misskey-reversi/package.json", "./packages/misskey-reversi/"] COPY --link ["packages/misskey-reversi/package.json", "./packages/misskey-reversi/"]

BIN
assets/ui-icons.afdesign Normal file

Binary file not shown.

View File

@ -221,9 +221,6 @@ id: "aidx"
# Media Proxy # Media Proxy
#mediaProxy: https://example.com/proxy #mediaProxy: https://example.com/proxy
# Sign to ActivityPub GET request (default: true)
signToActivityPubGet: true
#allowedPrivateNetworks: [ #allowedPrivateNetworks: [
# '127.0.0.1/32' # '127.0.0.1/32'
#] #]

View File

@ -2,11 +2,6 @@ import { defineConfig } from 'cypress'
export default defineConfig({ export default defineConfig({
e2e: { e2e: {
// We've imported your old cypress plugins here.
// You may want to clean this up later by importing these.
setupNodeEvents(on, config) {
return require('./cypress/plugins/index.js')(on, config)
},
baseUrl: 'http://localhost:61812', baseUrl: 'http://localhost:61812',
}, },
}) })

View File

@ -31,6 +31,15 @@ describe('Before setup instance', () => {
// なぜか動かない // なぜか動かない
//cy.wait('@signup').should('have.property', 'response.statusCode'); //cy.wait('@signup').should('have.property', 'response.statusCode');
cy.wait('@signup'); cy.wait('@signup');
cy.intercept('POST', '/api/admin/update-meta').as('update-meta');
cy.get('[data-cy-next]').click();
cy.get('[data-cy-next]').click();
cy.get('[data-cy-server-name] input').type('Testskey');
cy.get('[data-cy-server-setup-wizard-apply]').click();
cy.wait('@update-meta');
}); });
}); });

View File

@ -1,22 +0,0 @@
/// <reference types="cypress" />
// ***********************************************************
// This example plugins/index.js can be used to load plugins
//
// You can change the location of this file or turn off loading
// the plugins file with the 'pluginsFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/plugins-guide
// ***********************************************************
// This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing)
/**
* @type {Cypress.PluginConfig}
*/
// eslint-disable-next-line no-unused-vars
module.exports = (on, config) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
}

View File

@ -215,7 +215,6 @@ noUsers: "ليس هناك مستخدمون"
editProfile: "تعديل الملف التعريفي" editProfile: "تعديل الملف التعريفي"
noteDeleteConfirm: "هل تريد حذف هذه الملاحظة؟" noteDeleteConfirm: "هل تريد حذف هذه الملاحظة؟"
pinLimitExceeded: "لا يمكنك تثبيت الملاحظات بعد الآن." pinLimitExceeded: "لا يمكنك تثبيت الملاحظات بعد الآن."
intro: "لقد انتهت عملية تنصيب Misskey. الرجاء إنشاء حساب إداري."
done: "تمّ" done: "تمّ"
processing: "المعالجة جارية" processing: "المعالجة جارية"
preview: "معاينة" preview: "معاينة"
@ -676,7 +675,6 @@ experimental: "اختباري"
developer: "المطور" developer: "المطور"
makeExplorable: "أظهر الحساب في صفحة \"استكشاف\"" makeExplorable: "أظهر الحساب في صفحة \"استكشاف\""
makeExplorableDescription: "بتعطيل هذا الخيار لن يظهر حسابك في صفحة \"استكشاف\"" makeExplorableDescription: "بتعطيل هذا الخيار لن يظهر حسابك في صفحة \"استكشاف\""
showGapBetweenNotesInTimeline: "أظهر فجوات بين المشاركات في الخيط الزمني"
left: "يسار" left: "يسار"
center: "وسط" center: "وسط"
wide: "عريض" wide: "عريض"
@ -1254,7 +1252,6 @@ _theme:
buttonBg: "خلفية الأزرار" buttonBg: "خلفية الأزرار"
buttonHoverBg: "خلفية الأزرار (عند التمرير فوقها)" buttonHoverBg: "خلفية الأزرار (عند التمرير فوقها)"
inputBorder: "حواف حقل الإدخال" inputBorder: "حواف حقل الإدخال"
driveFolderBg: "خلفية مجلد قرص التخزين"
messageBg: "خلفية المحادثة" messageBg: "خلفية المحادثة"
_sfx: _sfx:
note: "الملاحظات" note: "الملاحظات"

View File

@ -215,7 +215,6 @@ noUsers: "কোন ব্যাবহারকারী নেই"
editProfile: "প্রোফাইল সম্পাদনা করুন" editProfile: "প্রোফাইল সম্পাদনা করুন"
noteDeleteConfirm: "আপনি কি নোট ডিলিট করার ব্যাপারে নিশ্চিত?" noteDeleteConfirm: "আপনি কি নোট ডিলিট করার ব্যাপারে নিশ্চিত?"
pinLimitExceeded: "আপনি আর কোন নোট পিন করতে পারবেন না" pinLimitExceeded: "আপনি আর কোন নোট পিন করতে পারবেন না"
intro: "Misskey এর ইন্সটলেশন সম্পন্ন হয়েছে!দয়া করে অ্যাডমিন ইউজার তৈরি করুন।"
done: "সম্পন্ন" done: "সম্পন্ন"
processing: "প্রক্রিয়াধীন..." processing: "প্রক্রিয়াধীন..."
preview: "পূর্বরূপ দেখুন" preview: "পূর্বরূপ দেখুন"
@ -673,7 +672,6 @@ experimentalFeatures: "পরীক্ষামূলক বৈশিষ্ট
developer: "ডেভেলপার" developer: "ডেভেলপার"
makeExplorable: "অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায় দেখান" makeExplorable: "অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায় দেখান"
makeExplorableDescription: "আপনি এটি বন্ধ করলে, আপনার অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায় প্রদর্শিত হবে না।" makeExplorableDescription: "আপনি এটি বন্ধ করলে, আপনার অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায় প্রদর্শিত হবে না।"
showGapBetweenNotesInTimeline: "টাইমলাইন এবং নোটের মাঝে ফাকা জায়গা রাখুন"
duplicate: "প্রতিরূপ" duplicate: "প্রতিরূপ"
left: "বাম" left: "বাম"
center: "মাঝখান" center: "মাঝখান"
@ -1019,7 +1017,6 @@ _theme:
buttonBg: "বাটনের পটভূমি" buttonBg: "বাটনের পটভূমি"
buttonHoverBg: "বাটনের পটভূমি (হভার)" buttonHoverBg: "বাটনের পটভূমি (হভার)"
inputBorder: "ইনপুট ফিল্ডের বর্ডার" inputBorder: "ইনপুট ফিল্ডের বর্ডার"
driveFolderBg: "ড্রাইভ ফোল্ডারের পটভূমি"
badge: "ব্যাজ" badge: "ব্যাজ"
messageBg: "চ্যাটের পটভূমি" messageBg: "চ্যাটের পটভূমি"
fgHighlighted: "হাইলাইট করা পাঠ্য" fgHighlighted: "হাইলাইট করা পাঠ্য"

View File

@ -220,6 +220,7 @@ silenceThisInstance: "Silencia aquesta instància "
mediaSilenceThisInstance: "Silenciar els arxius d'aquesta instància " mediaSilenceThisInstance: "Silenciar els arxius d'aquesta instància "
operations: "Accions" operations: "Accions"
software: "Programari" software: "Programari"
softwareName: "Nom del programari"
version: "Versió" version: "Versió"
metadata: "Metadades" metadata: "Metadades"
withNFiles: "{n} fitxer(s)" withNFiles: "{n} fitxer(s)"
@ -250,7 +251,6 @@ noUsers: "No hi ha usuaris"
editProfile: "Edita el perfil" editProfile: "Edita el perfil"
noteDeleteConfirm: "Segur que voleu eliminar aquesta publicació?" noteDeleteConfirm: "Segur que voleu eliminar aquesta publicació?"
pinLimitExceeded: "No podeu fixar més publicacions" pinLimitExceeded: "No podeu fixar més publicacions"
intro: "La instal·lació de Misskey ha acabat! Crea un usuari d'administrador."
done: "Fet" done: "Fet"
processing: "S'està processant..." processing: "S'està processant..."
preview: "Vista prèvia" preview: "Vista prèvia"
@ -298,6 +298,7 @@ uploadFromUrl: "Carrega des d'un enllaç"
uploadFromUrlDescription: "Enllaç del fitxer que vols carregar" uploadFromUrlDescription: "Enllaç del fitxer que vols carregar"
uploadFromUrlRequested: "Càrrega sol·licitada" uploadFromUrlRequested: "Càrrega sol·licitada"
uploadFromUrlMayTakeTime: "La càrrega des de l'enllaç pot trigar un temps" uploadFromUrlMayTakeTime: "La càrrega des de l'enllaç pot trigar un temps"
uploadNFiles: "Pujar {n} arxius"
explore: "Explora" explore: "Explora"
messageRead: "Vist" messageRead: "Vist"
noMoreHistory: "No hi ha res més per veure" noMoreHistory: "No hi ha res més per veure"
@ -575,8 +576,10 @@ showFixedPostForm: "Mostrar el formulari per escriure a l'inici de la línia de
showFixedPostFormInChannel: "Mostrar el formulari d'escriptura al principi de la línia de temps (Canals)" showFixedPostFormInChannel: "Mostrar el formulari d'escriptura al principi de la línia de temps (Canals)"
withRepliesByDefaultForNewlyFollowed: "Inclou les respostes d'usuaris nous que segueixes a la línia de temps per defecte." withRepliesByDefaultForNewlyFollowed: "Inclou les respostes d'usuaris nous que segueixes a la línia de temps per defecte."
newNoteRecived: "Hi ha publicacions noves" newNoteRecived: "Hi ha publicacions noves"
newNote: "Notes noves"
sounds: "Sons" sounds: "Sons"
sound: "So" sound: "So"
notificationSoundSettings: "Configuració del so de notificació"
listen: "Escoltar" listen: "Escoltar"
none: "Res" none: "Res"
showInPage: "Mostrar a la pàgina " showInPage: "Mostrar a la pàgina "
@ -784,7 +787,6 @@ thisIsExperimentalFeature: "Aquesta és una característica experimental. La sev
developer: "Programador" developer: "Programador"
makeExplorable: "Fes que el compte sigui visible a la secció \"Explorar\"" makeExplorable: "Fes que el compte sigui visible a la secció \"Explorar\""
makeExplorableDescription: "Si desactives aquesta opció, el teu compte no sortirà a la secció \"Explorar\"" makeExplorableDescription: "Si desactives aquesta opció, el teu compte no sortirà a la secció \"Explorar\""
showGapBetweenNotesInTimeline: "Notes separades a la línia de temps"
duplicate: "Duplicat" duplicate: "Duplicat"
left: "Esquerra" left: "Esquerra"
center: "Centre" center: "Centre"
@ -792,6 +794,7 @@ wide: "Gran"
narrow: "Estret" narrow: "Estret"
reloadToApplySetting: "Aquest ajust només s'aplicarà després de recarregar la pàgina. Vols fer-ho ara?" reloadToApplySetting: "Aquest ajust només s'aplicarà després de recarregar la pàgina. Vols fer-ho ara?"
needReloadToApply: "Es requereix recarregar per reflectir aquesta opció " needReloadToApply: "Es requereix recarregar per reflectir aquesta opció "
needToRestartServerToApply: "És necessari reiniciar el servidor perquè tinguin efecte els canvis."
showTitlebar: "Mostra la barra del títol " showTitlebar: "Mostra la barra del títol "
clearCache: "Esborra la memòria cau" clearCache: "Esborra la memòria cau"
onlineUsersCount: "{n} Usuaris es troben en línia " onlineUsersCount: "{n} Usuaris es troben en línia "
@ -1237,7 +1240,6 @@ showAvatarDecorations: "Mostrar les decoracions dels avatars"
releaseToRefresh: "Deixar anar per actualitzar" releaseToRefresh: "Deixar anar per actualitzar"
refreshing: "Recarregant..." refreshing: "Recarregant..."
pullDownToRefresh: "Llisca cap a baix per recarregar" pullDownToRefresh: "Llisca cap a baix per recarregar"
disableStreamingTimeline: "Desactivar l'actualització en temps real de les línies de temps"
useGroupedNotifications: "Mostrar les notificacions agrupades " useGroupedNotifications: "Mostrar les notificacions agrupades "
signupPendingError: "Hi ha hagut un problema verificant l'adreça de correu electrònic. L'enllaç pot haver caducat." signupPendingError: "Hi ha hagut un problema verificant l'adreça de correu electrònic. L'enllaç pot haver caducat."
cwNotationRequired: "Si està activat \"Amagar contingut\" s'ha d'escriure una descripció " cwNotationRequired: "Si està activat \"Amagar contingut\" s'ha d'escriure una descripció "
@ -1347,6 +1349,16 @@ readonly: "Només lectura"
goToDeck: "Tornar al tauler" goToDeck: "Tornar al tauler"
federationJobs: "Treballs sindicats " federationJobs: "Treballs sindicats "
driveAboutTip: "Al Disc veure's una llista de tots els arxius que has anat pujant.<br>\nPots tornar-los a fer servir adjuntant-los a notes noves o pots adelantar-te i pujar arxius per publicar-los més tard!<br>\n<b>Tingués en compte que si esborres un arxiu també desapareixerà de tots els llocs on l'has fet servir (notes, pàgines, avatars, imatges de capçalera, etc.)</b><br>\nTambé pots crear carpetes per organitzar les." driveAboutTip: "Al Disc veure's una llista de tots els arxius que has anat pujant.<br>\nPots tornar-los a fer servir adjuntant-los a notes noves o pots adelantar-te i pujar arxius per publicar-los més tard!<br>\n<b>Tingués en compte que si esborres un arxiu també desapareixerà de tots els llocs on l'has fet servir (notes, pàgines, avatars, imatges de capçalera, etc.)</b><br>\nTambé pots crear carpetes per organitzar les."
scrollToClose: "Desplaçar per tancar"
advice: "Consell"
realtimeMode: "Mode en temps real"
turnItOn: "Activar"
turnItOff: "Desactivar"
emojiMute: "Silenciar emojis"
emojiUnmute: "Deixar de silenciar emojis"
muteX: "Silenciar {x}"
unmuteX: "Deixar de silenciar {x}"
abort: "Cancel·lar"
_chat: _chat:
noMessagesYet: "Encara no tens missatges " noMessagesYet: "Encara no tens missatges "
newMessage: "Missatge nou" newMessage: "Missatge nou"
@ -1380,6 +1392,8 @@ _chat:
chatNotAvailableInOtherAccount: "La funció de xat es troba desactivada al compte de l'altre usuari." chatNotAvailableInOtherAccount: "La funció de xat es troba desactivada al compte de l'altre usuari."
cannotChatWithTheUser: "No pots xatejar amb aquest usuari" cannotChatWithTheUser: "No pots xatejar amb aquest usuari"
cannotChatWithTheUser_description: "El xat està desactivat o l'altra part encara no l'ha obert." cannotChatWithTheUser_description: "El xat està desactivat o l'altra part encara no l'ha obert."
youAreNotAMemberOfThisRoomButInvited: "No participes en aquesta sala, però has rebut una invitació. Per participar accepta la invitació."
doYouAcceptInvitation: "Acceptes la invitació?"
chatWithThisUser: "Xateja amb aquest usuari" chatWithThisUser: "Xateja amb aquest usuari"
thisUserAllowsChatOnlyFromFollowers: "Aquest usuari només accepta xats d'usuaris que el segueixen." thisUserAllowsChatOnlyFromFollowers: "Aquest usuari només accepta xats d'usuaris que el segueixen."
thisUserAllowsChatOnlyFromFollowing: "Aquest usuari només accepta xats d'usuaris que segueix." thisUserAllowsChatOnlyFromFollowing: "Aquest usuari només accepta xats d'usuaris que segueix."
@ -1419,10 +1433,19 @@ _settings:
makeEveryTextElementsSelectable: "Fes que tots els elements del text siguin seleccionables" makeEveryTextElementsSelectable: "Fes que tots els elements del text siguin seleccionables"
makeEveryTextElementsSelectable_description: "L'activació pot reduir la usabilitat en determinades ocasions." makeEveryTextElementsSelectable_description: "L'activació pot reduir la usabilitat en determinades ocasions."
useStickyIcons: "Utilitza icones fixes" useStickyIcons: "Utilitza icones fixes"
enableHighQualityImagePlaceholders: "Mostrar marcadors de posició per imatges d'alta qualitat"
uiAnimations: "Animacions de la interfície"
showNavbarSubButtons: "Mostrar sub botons a la barra de navegació " showNavbarSubButtons: "Mostrar sub botons a la barra de navegació "
ifOn: "Quan s'activa" ifOn: "Quan s'activa"
ifOff: "Quan es desactiva" ifOff: "Quan es desactiva"
enableSyncThemesBetweenDevices: "Sincronitzar els temes instal·lats entre dispositius" enableSyncThemesBetweenDevices: "Sincronitzar els temes instal·lats entre dispositius"
enablePullToRefresh: "Lliscar i actualitzar "
enablePullToRefresh_description: "Amb el ratolí, llisca mentre prems la roda."
realtimeMode_description: "Estableix una connexió amb el servidor i actualitza el contingut en temps real. Pot consumir més dades i bateria."
contentsUpdateFrequency: "Freqüència d'adquisició del contingut"
contentsUpdateFrequency_description: "Com més alt sigui l'adquisició de contingut en temps real, més baixa el rendiment i més consum de dades i bateria."
contentsUpdateFrequency_description2: "Quan s'activa el mode en temps real, el contingut s'actualitza en temps real, independentment d'aquesta configuració."
showUrlPreview: "Mostrar vista prèvia d'URL"
_chat: _chat:
showSenderName: "Mostrar el nom del remitent" showSenderName: "Mostrar el nom del remitent"
sendOnEnter: "Introdueix per enviar" sendOnEnter: "Introdueix per enviar"
@ -1430,6 +1453,7 @@ _preferencesProfile:
profileName: "Nom del perfil" profileName: "Nom del perfil"
profileNameDescription: "Estableix un nom que identifiqui aquest dispositiu." profileNameDescription: "Estableix un nom que identifiqui aquest dispositiu."
profileNameDescription2: "Per exemple: \"PC Principal\", \"Smartphone\", etc" profileNameDescription2: "Per exemple: \"PC Principal\", \"Smartphone\", etc"
manageProfiles: "Gestionar perfils"
_preferencesBackup: _preferencesBackup:
autoBackup: "Còpia de seguretat automàtica " autoBackup: "Còpia de seguretat automàtica "
restoreFromBackup: "Restaurar des d'una còpia de seguretat" restoreFromBackup: "Restaurar des d'una còpia de seguretat"
@ -1468,6 +1492,7 @@ _delivery:
manuallySuspended: "Suspendre manualment" manuallySuspended: "Suspendre manualment"
goneSuspended: "Servidor suspès perquè el servidor s'ha esborrat" goneSuspended: "Servidor suspès perquè el servidor s'ha esborrat"
autoSuspendedForNotResponding: "Servidor suspès perquè el servidor no respon" autoSuspendedForNotResponding: "Servidor suspès perquè el servidor no respon"
softwareSuspended: "Suspès perquè el programari ha deixat de desenvolupar-se "
_bubbleGame: _bubbleGame:
howToPlay: "Com es juga" howToPlay: "Com es juga"
hold: "Mantenir" hold: "Mantenir"
@ -1599,6 +1624,23 @@ _serverSettings:
openRegistration: "Registres oberts" openRegistration: "Registres oberts"
openRegistrationWarning: "Obrir els registres és arriscat. Es recomana obrir-los només si el servidor és monitorat constantment i per respondre immediatament davant qualsevol problema." openRegistrationWarning: "Obrir els registres és arriscat. Es recomana obrir-los només si el servidor és monitorat constantment i per respondre immediatament davant qualsevol problema."
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "Si no es detecta activitat per part del moderador durant un període de temps, aquesta opció es desactiva automàticament per evitar el correu brossa." thisSettingWillAutomaticallyOffWhenModeratorsInactive: "Si no es detecta activitat per part del moderador durant un període de temps, aquesta opció es desactiva automàticament per evitar el correu brossa."
deliverSuspendedSoftware: "Programari que ja no es distribueix"
deliverSuspendedSoftwareDescription: "Pots especificar un rang de noms i versions del programari del servidor per detenir l'entrega, per exemple, degut a vulnerabilitats. Aquesta informació la proporciona el servidor i la seva fiabilitat no es garantitzada. Es pot fer servir una especificació de rang sencer per especificar una versió, però es recomana especificar una versió anterior, com >= 2024.3.1-0, perquè especificar >= 2024.3.1 no incloure versions personalitzades com 2024.3.1-custom.0."
singleUserMode: "Mode un usuari"
singleUserMode_description: "Si ets l'únic usuari d'aquesta instància, activant aquest mode optimitzaràs el funcionament."
signToActivityPubGet: "Formar sol·licituds GET"
signToActivityPubGet_description: " Això normalment hauria d'estar activat. Desactivar aquesta opció pot millorar els problemes de comunicació amb algunes de les instàncies federades, però també pot fer impossibles les comunicacions amb altres servidors."
proxyRemoteFiles: "Proxy d'arxius remots"
proxyRemoteFiles_description: "Quan està habilitat, fa de proxy i serveix arxius remots. Això ajuda a generar les miniatures de les imatges i a protegir la privacitat dels usuaris."
allowExternalApRedirect: "Permetre el reencaminament per consultes fent servir ActivityPub."
allowExternalApRedirect_description: "Si aquesta opció s'activa, altres servidors poden consultar continguts de tercers mitjançant aquest servidor, però això pot donar peu a la suplantació de continguts."
userGeneratedContentsVisibilityForVisitor: "L'abast de la publicació del contingut generat per l'usuari"
userGeneratedContentsVisibilityForVisitor_description: "Això ajuda a evitar problemes com que continguts remots inadequats que no hagin estat moderats correctament es publiquin a internet mitjançant el teu servidor."
userGeneratedContentsVisibilityForVisitor_description2: "La publicació incondicional de tots els continguts del servidor a internet, incloent-hi els continguts remots rebuts pel servidor, comporta riscos. Això és extremadament important per els espectadors que desconeixen el caràcter descentralitzat dels continguts, ja que poden percebre erroneament els continguts remots com contingut generat per el propi servidor."
_userGeneratedContentsVisibilityForVisitor:
all: "Tot obert al públic "
localOnly: "Només es publiquen els continguts locals, el contingut remot es manté privat"
none: "Tot privat"
_accountMigration: _accountMigration:
moveFrom: "Migrar un altre compte a aquest" moveFrom: "Migrar un altre compte a aquest"
moveFromSub: "Crear un àlies per un altre compte" moveFromSub: "Crear un àlies per un altre compte"
@ -2156,7 +2198,6 @@ _theme:
buttonBg: "Fons botó " buttonBg: "Fons botó "
buttonHoverBg: "Fons botó (en passar-hi per sobre)" buttonHoverBg: "Fons botó (en passar-hi per sobre)"
inputBorder: "Contorn del cap d'introducció " inputBorder: "Contorn del cap d'introducció "
driveFolderBg: "Fons de la carpeta Disc"
badge: "Insígnia " badge: "Insígnia "
messageBg: "Fons del xat" messageBg: "Fons del xat"
fgHighlighted: "Text ressaltat" fgHighlighted: "Text ressaltat"
@ -2792,9 +2833,12 @@ _dataSaver:
_avatar: _avatar:
title: "Avatars animats" title: "Avatars animats"
description: "Detenir l'animació dels avatars animats. Les imatges animades solen tenir un pes més gran que les imatges normals, reduint el tràfic disponible." description: "Detenir l'animació dels avatars animats. Les imatges animades solen tenir un pes més gran que les imatges normals, reduint el tràfic disponible."
_urlPreview: _urlPreviewThumbnail:
title: "Miniatures vista prèvia de l'URL" title: "Amagar les miniatures de la vista prèvia d'URL"
description: "Les imatges en miniatura que serveixen com a vista prèvia de les URLs no es tornaran a carregar." description: "Les imatges en miniatura de la vista prèvia d'URL ja no es carreguen"
_disableUrlPreview:
title: "Desactivar la vista prèvia d'URL"
description: "Desactiva la funció de previsualització d'URL. A diferència de les imatges en miniatura soles, això redueix la càrrega de la mateixa informació vinculada."
_code: _code:
title: "Ressaltat del codi " title: "Ressaltat del codi "
description: "Quan s'utilitza codi MFM, no es llegeix fins que es copiï. En els punts destacats del codi s'han de llegir els fitxers definits per a cada llengua que resulti alt, però no es poden llegir automàticament, per la qual cosa es poden reduir les quantitats de comunicació." description: "Quan s'utilitza codi MFM, no es llegeix fins que es copiï. En els punts destacats del codi s'han de llegir els fitxers definits per a cada llengua que resulti alt, però no es poden llegir automàticament, per la qual cosa es poden reduir les quantitats de comunicació."
@ -2925,10 +2969,6 @@ _customEmojisManager:
uploadSettingDescription: "En aquesta pantalla pots configurar el que s'ha de fer quan es puja un Emoji." uploadSettingDescription: "En aquesta pantalla pots configurar el que s'ha de fer quan es puja un Emoji."
directoryToCategoryLabel: "Escriu el nom del directori al camp de \"categoria\"" directoryToCategoryLabel: "Escriu el nom del directori al camp de \"categoria\""
directoryToCategoryCaption: "Quan arrossegues un directori, escriu el nom del directori al camp categoria." directoryToCategoryCaption: "Quan arrossegues un directori, escriu el nom del directori al camp categoria."
emojiInputAreaCaption: "Selecciona els Emojis que vols registrar gent servir un dels mètodes."
emojiInputAreaList1: "Arrossega i deixar anar fitxers o directoris dintre del quadrat."
emojiInputAreaList2: "Clica l'enllaç per seleccionar un fitxer des del teu ordinador."
emojiInputAreaList3: "Clica aquest enllaç per seleccionar del Disc"
confirmRegisterEmojisDescription: "Registrar els Emojis de la llista com a nous Emojis personalitzats. Vols continuar? (Per evitar una sobrecàrrega només {count} Emojis es poden registrar d'una sola vegada)" confirmRegisterEmojisDescription: "Registrar els Emojis de la llista com a nous Emojis personalitzats. Vols continuar? (Per evitar una sobrecàrrega només {count} Emojis es poden registrar d'una sola vegada)"
confirmClearEmojisDescription: "Descartar els canvis i esborrar els Emojis de la llista. Vols continuar?" confirmClearEmojisDescription: "Descartar els canvis i esborrar els Emojis de la llista. Vols continuar?"
confirmUploadEmojisDescription: "Pujar els {count} fitxers que has arrossegat al disc. Vols continuar?" confirmUploadEmojisDescription: "Pujar els {count} fitxers que has arrossegat al disc. Vols continuar?"
@ -3004,3 +3044,59 @@ _search:
pleaseEnterServerHost: "Introdueix l'adreça de la instància " pleaseEnterServerHost: "Introdueix l'adreça de la instància "
pleaseSelectUser: "Selecciona un usuari" pleaseSelectUser: "Selecciona un usuari"
serverHostPlaceholder: "Ex: misskey.example.com" serverHostPlaceholder: "Ex: misskey.example.com"
_serverSetupWizard:
installCompleted: "La instal·lació de Misskey ha finalitzat!"
firstCreateAccount: "Primer crea un compte d'administrador."
accountCreated: "Compte d'administrador creat."
serverSetting: "Configuració del servidor"
youCanEasilyConfigureOptimalServerSettingsWithThisWizard: "Aquest assistent t'ajuda a fer una configuració òptima del servidor."
settingsYouMakeHereCanBeChangedLater: "Els canvis que facis ara poden modificar-se més tard."
howWillYouUseMisskey: "Com es fa servir Misskey?"
_use:
single: "Servidor per una sola persona"
single_description: "Fes-ho servir com el teu propi servidor dedicat"
single_youCanCreateMultipleAccounts: "Es poden crear diferents comptes segons siguin les teves necessitats, inclús quan es fa servir com a servidor unipersonal."
group: "Servidor per a grups"
group_description: "Invita altres usuaris de la teva confiança i fes-ho servir amb més d'una persona."
open: "Servidor obert"
open_description: "Operar per donar cabuda a un nombre no determinat d'usuaris."
openServerAdvice: "Acceptar un nombre no determinat d'usuaris comporta alguns riscos. Es recomana operar amb un sistema de moderació fiable per fer front als problemes."
openServerAntiSpamAdvice: "També s'ha de tenir molta cura amb la seguretat, per exemple habilitant funcions anti-bot com reCAPTCHA, per assegurar-te que el teu servidor no es converteix en un trampolí per contingut brossa."
howManyUsersDoYouExpect: "Quantes persones preveus?"
_scale:
small: "Menys de 100 (petita escala)"
medium: "Més de 100 i menys de 1000 (mida mitjana)"
large: "Més de 1000 persones (gran escala)"
largeScaleServerAdvice: "Els grans servidors poden requerir coneixements avançats d'infraestructures, com balanceig de càrregues i replicació de base de dades."
doYouConnectToFediverse: "Desitges connectar-te amb el Fedivers?"
doYouConnectToFediverse_description1: "Quan es connecta amb una xarxa de servidors distribuïts (Fedivers), els continguts poden intercanviar-se amb altres servidors i entre ells."
doYouConnectToFediverse_description2: "La connexió amb el Fedivers també es coneix com a \"federació\"."
youCanConfigureMoreFederationSettingsLater: "Les configuracions avançades, com especificar els servidors amb els quals es pot federar, es poden fer més tard."
adminInfo: "Informació de l'administrador "
adminInfo_description: "Estableix la informació de l'administrador que es farà servir per rebre consultes."
adminInfo_mustBeFilled: "Aquesta informació ha de ser omplerta si el servidor té els registres oberts o la federació es troba activada."
followingSettingsAreRecommended: "Es recomana la següent configuració "
applyTheseSettings: "Aplicar aquesta configuració "
skipSettings: "Saltar la configuració "
settingsCompleted: "Configuració finalitzada "
settingsCompleted_description: "Gràcies per la teva ajuda. Ara que ja està tot llest, pots començar a fer servir el servidor immediatament."
settingsCompleted_description2: "La configuració avançada del servidor també poden fer-se des del \"Tauler de control\"."
donationRequest: "Una donació, si us plau"
_donationRequest:
text1: "Misskey és un programari gratuït fet per voluntaris."
text2: "Si ho desitges, agrairíem molt la teva donació per poder seguir desenvolupant el projecte."
text3: "També hi ha privilegis especials per als donants!"
_uploader:
compressedToX: "Comprimit a {x}"
savedXPercent: "{x}% d'estalvi "
abortConfirm: "Hi ha un arxiu que no s'ha pujat, vols cancel·lar?"
doneConfirm: "Hi han fitxers no pujats, vols completar-los?"
maxFileSizeIsX: "La mida màxima d'arxiu que es pot pujar és {x}."
_clientPerformanceIssueTip:
title: "Si creus que el consum de bateria és molt alt"
makeSureDisabledAdBlocker: "Desactiva els bloquejadors de publicitat"
makeSureDisabledAdBlocker_description: "Els bloquejadors d'anuncis pot afectar el rendiment, comprova que no estiguin activats per característiques del sistema operatiu o del navegador."
makeSureDisabledCustomCss: "Desactiva CSS personalitzat"
makeSureDisabledCustomCss_description: "L'anul·lació dels estils pot afectar el rendiment. Comprova que el CSS personalitzat o les extensions que reescriuen estils no estiguin activats."
makeSureDisabledAddons: "Desactiva extensions"
makeSureDisabledAddons_description: "Algunes extensions poden interferir en el comportament del client i afectar el rendiment. Desactiva les extensions del navegador i comprovar-ho."

View File

@ -1,7 +1,7 @@
--- ---
_lang_: "Čeština" _lang_: "Čeština"
headlineMisskey: "Síť propojená poznámkami" headlineMisskey: "Síť propojená poznámkami"
introMisskey: "Vítejte! Misskey je otevřený a decentralizovaný microblogový servis.\n\"Poznámkami\" můžete sdílet co se zrovna děje se všemi ve Vašem okolí. 📡\nPomocí \"reakcí\" můžete sdílet své názory a pocity na ostatní poznámky. 👍\nPojďte objevovat nový svět! 🚀" introMisskey: "Vítejte! Misskey je otevřená a decentralizovaná microblogovací služba.\n\"Poznámkami\" můžete sdílet co se zrovna děje se všemi ve Vašem okolí. 📡\nPomocí \"reakcí\" můžete sdílet své názory a pocity na ostatní poznámky. 👍\nPojďte objevovat nový svět! 🚀"
poweredByMisskeyDescription: "{name} je jeden ze serverů využívající open source platformu <b>Misskey<b> (nazývaná \"Misskey instance\")." poweredByMisskeyDescription: "{name} je jeden ze serverů využívající open source platformu <b>Misskey<b> (nazývaná \"Misskey instance\")."
monthAndDay: "{day}. {month}." monthAndDay: "{day}. {month}."
search: "Vyhledávání" search: "Vyhledávání"
@ -19,7 +19,7 @@ gotIt: "Rozumím!"
cancel: "Zrušit" cancel: "Zrušit"
noThankYou: "Ne děkuji" noThankYou: "Ne děkuji"
enterUsername: "Zadej uživatelské jméno" enterUsername: "Zadej uživatelské jméno"
renotedBy: "{user} přeposla/a" renotedBy: "{user} přeposlal*a"
noNotes: "Žádné poznámky" noNotes: "Žádné poznámky"
noNotifications: "Žádná oznámení" noNotifications: "Žádná oznámení"
instance: "Instance" instance: "Instance"
@ -65,6 +65,7 @@ copyFileId: "Kopírovat ID souboru"
copyFolderId: "Kopírovat ID složky" copyFolderId: "Kopírovat ID složky"
copyProfileUrl: "Kopírovat URL profilu" copyProfileUrl: "Kopírovat URL profilu"
searchUser: "Vyhledat uživatele" searchUser: "Vyhledat uživatele"
searchThisUsersNotes: "Prohledat poznámky uživatele"
reply: "Odpovědět" reply: "Odpovědět"
loadMore: "Zobrazit více" loadMore: "Zobrazit více"
showMore: "Zobrazit více" showMore: "Zobrazit více"
@ -228,7 +229,6 @@ noUsers: "Žádní uživatelé"
editProfile: "Upravit můj profil" editProfile: "Upravit můj profil"
noteDeleteConfirm: "Jste si jistí že chcete smazat tuhle poznámku?" noteDeleteConfirm: "Jste si jistí že chcete smazat tuhle poznámku?"
pinLimitExceeded: "Nemůžete připnout další poznámky." pinLimitExceeded: "Nemůžete připnout další poznámky."
intro: "Instalace Misskey byla dokončena! Prosím vytvořte admina."
done: "Hotovo" done: "Hotovo"
processing: "Zpracovávám" processing: "Zpracovávám"
preview: "Náhled" preview: "Náhled"
@ -726,7 +726,6 @@ thisIsExperimentalFeature: "Tohle je experimentální funkce. Její funkce se m
developer: "Vývojář" developer: "Vývojář"
makeExplorable: "Udělat účet viditelný v \"Objevit\"" makeExplorable: "Udělat účet viditelný v \"Objevit\""
makeExplorableDescription: "Pokud tohle vypnete, tak se účet přestane zobrazovat v sekci \"Objevit\"." makeExplorableDescription: "Pokud tohle vypnete, tak se účet přestane zobrazovat v sekci \"Objevit\"."
showGapBetweenNotesInTimeline: "Zobrazit mezeru mezi příspěvkama na časové ose"
duplicate: "Duplikovat" duplicate: "Duplikovat"
left: "Vlevo" left: "Vlevo"
center: "Uprostřed" center: "Uprostřed"
@ -1647,7 +1646,6 @@ _theme:
buttonBg: "Pozadí tlačítka" buttonBg: "Pozadí tlačítka"
buttonHoverBg: "Pozadí tlačítka (Hover)" buttonHoverBg: "Pozadí tlačítka (Hover)"
inputBorder: "Ohraničení vstupního pole" inputBorder: "Ohraničení vstupního pole"
driveFolderBg: "Pozadí složky disku"
badge: "Odznak" badge: "Odznak"
messageBg: "Pozadí chatu" messageBg: "Pozadí chatu"
fgHighlighted: "Zvýrazněný text" fgHighlighted: "Zvýrazněný text"

View File

@ -220,6 +220,7 @@ silenceThisInstance: "Instanz stummschalten"
mediaSilenceThisInstance: "Medien dieses Servers stummschalten" mediaSilenceThisInstance: "Medien dieses Servers stummschalten"
operations: "Aktionen" operations: "Aktionen"
software: "Software" software: "Software"
softwareName: "Software Name"
version: "Version" version: "Version"
metadata: "Metadaten" metadata: "Metadaten"
withNFiles: "{n} Datei(en)" withNFiles: "{n} Datei(en)"
@ -250,7 +251,6 @@ noUsers: "Keine Benutzer gefunden"
editProfile: "Profil bearbeiten" editProfile: "Profil bearbeiten"
noteDeleteConfirm: "Möchtest du diese Notiz wirklich löschen?" noteDeleteConfirm: "Möchtest du diese Notiz wirklich löschen?"
pinLimitExceeded: "Du kannst nicht noch mehr Notizen anheften." pinLimitExceeded: "Du kannst nicht noch mehr Notizen anheften."
intro: "Misskey ist installiert! Lass uns nun ein Administratorkonto einrichten."
done: "Fertig" done: "Fertig"
processing: "In Bearbeitung …" processing: "In Bearbeitung …"
preview: "Vorschau" preview: "Vorschau"
@ -784,7 +784,6 @@ thisIsExperimentalFeature: "Dies ist eine experimentelle Funktion. Änderungen a
developer: "Entwickler" developer: "Entwickler"
makeExplorable: "Benutzerkonto in „Erkunden“ sichtbar machen" makeExplorable: "Benutzerkonto in „Erkunden“ sichtbar machen"
makeExplorableDescription: "Wenn diese Option deaktiviert ist, ist dein Benutzerkonto nicht im „Erkunden“-Bereich sichtbar." makeExplorableDescription: "Wenn diese Option deaktiviert ist, ist dein Benutzerkonto nicht im „Erkunden“-Bereich sichtbar."
showGapBetweenNotesInTimeline: "Abstände zwischen Notizen auf der Chronik anzeigen"
duplicate: "Duplizieren" duplicate: "Duplizieren"
left: "Links" left: "Links"
center: "Mittig" center: "Mittig"
@ -1237,7 +1236,6 @@ showAvatarDecorations: "Profilbilddekoration anzeigen"
releaseToRefresh: "Zum Aktualisieren loslassen" releaseToRefresh: "Zum Aktualisieren loslassen"
refreshing: "Wird aktualisiert..." refreshing: "Wird aktualisiert..."
pullDownToRefresh: "Zum Aktualisieren ziehen" pullDownToRefresh: "Zum Aktualisieren ziehen"
disableStreamingTimeline: "Echtzeitaktualisierung der Chronik deaktivieren"
useGroupedNotifications: "Benachrichtigungen gruppieren" useGroupedNotifications: "Benachrichtigungen gruppieren"
signupPendingError: "Beim Überprüfen der Mailadresse ist etwas schiefgelaufen. Der Link könnte abgelaufen sein." signupPendingError: "Beim Überprüfen der Mailadresse ist etwas schiefgelaufen. Der Link könnte abgelaufen sein."
cwNotationRequired: "Ist \"Inhaltswarnung verwenden\" aktiviert, muss eine Beschreibung gegeben werden." cwNotationRequired: "Ist \"Inhaltswarnung verwenden\" aktiviert, muss eine Beschreibung gegeben werden."
@ -1347,6 +1345,7 @@ readonly: "Nur Lesezugriff"
goToDeck: "Zurück zum Deck" goToDeck: "Zurück zum Deck"
federationJobs: "Föderation Jobs" federationJobs: "Föderation Jobs"
driveAboutTip: "In Drive sehen Sie eine Liste der Dateien, die Sie in der Vergangenheit hochgeladen haben. <br>\nSie können diese Dateien wiederverwenden um sie zu beispiel an Notizen anzuhängen, oder sie können Dateien vorab hochzuladen, um sie später zu versenden! <br>\n<b>Wenn Sie eine Datei löschen, verschwindet sie auch von allen Stellen, an denen Sie sie verwendet haben (Notizen, Seiten, Avatare, Banner usw.).</b><br>\nSie können auch Ordner erstellen, um sie zu organisieren." driveAboutTip: "In Drive sehen Sie eine Liste der Dateien, die Sie in der Vergangenheit hochgeladen haben. <br>\nSie können diese Dateien wiederverwenden um sie zu beispiel an Notizen anzuhängen, oder sie können Dateien vorab hochzuladen, um sie später zu versenden! <br>\n<b>Wenn Sie eine Datei löschen, verschwindet sie auch von allen Stellen, an denen Sie sie verwendet haben (Notizen, Seiten, Avatare, Banner usw.).</b><br>\nSie können auch Ordner erstellen, um sie zu organisieren."
scrollToClose: "Zum Schließen scrollen"
_chat: _chat:
noMessagesYet: "Noch keine Nachrichten" noMessagesYet: "Noch keine Nachrichten"
newMessage: "Neue Nachricht" newMessage: "Neue Nachricht"
@ -1423,6 +1422,8 @@ _settings:
ifOn: "Wenn eingeschaltet" ifOn: "Wenn eingeschaltet"
ifOff: "Wenn ausgeschaltet" ifOff: "Wenn ausgeschaltet"
enableSyncThemesBetweenDevices: "Synchronisierung von installierten Themen auf verschiedenen Endgeräten" enableSyncThemesBetweenDevices: "Synchronisierung von installierten Themen auf verschiedenen Endgeräten"
enablePullToRefresh: "Ziehen zum Aktualisieren"
enablePullToRefresh_description: "Bei Benutzung einer Maus, mit gedrücktem Mausrad ziehen"
_chat: _chat:
showSenderName: "Name des Absenders anzeigen" showSenderName: "Name des Absenders anzeigen"
sendOnEnter: "Eingabetaste sendet Nachricht" sendOnEnter: "Eingabetaste sendet Nachricht"
@ -1430,6 +1431,7 @@ _preferencesProfile:
profileName: "Profilname" profileName: "Profilname"
profileNameDescription: "Lege einen Namen fest, der dieses Gerät identifiziert." profileNameDescription: "Lege einen Namen fest, der dieses Gerät identifiziert."
profileNameDescription2: "Beispiel: \"Haupt-PC\", \"Smartphone\"" profileNameDescription2: "Beispiel: \"Haupt-PC\", \"Smartphone\""
manageProfiles: "Profile verwalten"
_preferencesBackup: _preferencesBackup:
autoBackup: "Automatische Sicherung" autoBackup: "Automatische Sicherung"
restoreFromBackup: "Wiederherstellen aus der Sicherung" restoreFromBackup: "Wiederherstellen aus der Sicherung"
@ -1468,6 +1470,7 @@ _delivery:
manuallySuspended: "Manuell gesperrt" manuallySuspended: "Manuell gesperrt"
goneSuspended: "Gesperrt wegen Löschung des Servers" goneSuspended: "Gesperrt wegen Löschung des Servers"
autoSuspendedForNotResponding: "Gesperrt, weil der Server nicht antwortet" autoSuspendedForNotResponding: "Gesperrt, weil der Server nicht antwortet"
softwareSuspended: "Ausgesetzt, weil die Software nicht mehr beliefert wird"
_bubbleGame: _bubbleGame:
howToPlay: "Wie man spielt" howToPlay: "Wie man spielt"
hold: "Halten" hold: "Halten"
@ -1599,6 +1602,8 @@ _serverSettings:
openRegistration: "Registrierung von Konten aktivieren" openRegistration: "Registrierung von Konten aktivieren"
openRegistrationWarning: "Das Aktivieren von Registrierungen ist riskant. Es wird empfohlen, sie nur dann zu aktivieren, wenn der Server ständig überwacht wird und im Falle eines Problems sofort reagiert werden kann." openRegistrationWarning: "Das Aktivieren von Registrierungen ist riskant. Es wird empfohlen, sie nur dann zu aktivieren, wenn der Server ständig überwacht wird und im Falle eines Problems sofort reagiert werden kann."
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "Wenn über einen bestimmten Zeitraum keine Moderatorenaktivität festgestellt wird, wird diese Einstellung automatisch deaktiviert, um Spam zu verhindern." thisSettingWillAutomaticallyOffWhenModeratorsInactive: "Wenn über einen bestimmten Zeitraum keine Moderatorenaktivität festgestellt wird, wird diese Einstellung automatisch deaktiviert, um Spam zu verhindern."
deliverSuspendedSoftware: "Software, die nicht mehr beliefert wird"
deliverSuspendedSoftwareDescription: "Sie können eine Auswahl von Namen und Versionen verschiedener Serversoftware angeben, um die Zustellung zu stoppen, z. B. aufgrund von Sicherheitslücken. Diese Versionsinformationen werden vom Server bereitgestellt und ihre Zuverlässigkeit ist nicht garantiert. Es wird jedoch empfohlen, eine Vorabversion anzugeben, wie z. B. >= 2024.3.1-0, da die Angabe >= 2024.3.1 keine benutzerdefinierten Versionen wie 2024.3.1-custom.0 einschließt."
_accountMigration: _accountMigration:
moveFrom: "Von einem anderen Konto zu diesem migrieren" moveFrom: "Von einem anderen Konto zu diesem migrieren"
moveFromSub: "Alias für ein anderes Konto erstellen" moveFromSub: "Alias für ein anderes Konto erstellen"
@ -2156,7 +2161,6 @@ _theme:
buttonBg: "Hintergrund von Schaltflächen" buttonBg: "Hintergrund von Schaltflächen"
buttonHoverBg: "Hintergrund von Schaltflächen (Mouseover)" buttonHoverBg: "Hintergrund von Schaltflächen (Mouseover)"
inputBorder: "Rahmen von Eingabefeldern" inputBorder: "Rahmen von Eingabefeldern"
driveFolderBg: "Hintergrund von Drive-Ordnern"
badge: "Wappen" badge: "Wappen"
messageBg: "Hintergrund von Chats" messageBg: "Hintergrund von Chats"
fgHighlighted: "Hervorgehobener Text" fgHighlighted: "Hervorgehobener Text"
@ -2792,9 +2796,6 @@ _dataSaver:
_avatar: _avatar:
title: "Animierte Profilbilder deaktivieren" title: "Animierte Profilbilder deaktivieren"
description: "Die Animation von Profilbildern wird angehalten. Da animierte Bilder eine größere Dateigröße haben können als normale Bilder, kann dies den Datenverkehr weiter reduzieren." description: "Die Animation von Profilbildern wird angehalten. Da animierte Bilder eine größere Dateigröße haben können als normale Bilder, kann dies den Datenverkehr weiter reduzieren."
_urlPreview:
title: "URL-Vorschaubilder ausblenden"
description: "URL-Vorschaubilder werden nicht mehr geladen."
_code: _code:
title: "Code-Hervorhebungen ausblenden" title: "Code-Hervorhebungen ausblenden"
description: "Wenn Code-Hervorhebungen in MFM usw. verwendet werden, werden sie erst geladen, wenn sie angetippt werden. Die Syntaxhervorhebung erfordert das Herunterladen der Definitionsdateien für jede Programmiersprache. Es ist daher zu erwarten, dass die Deaktivierung des automatischen Ladens dieser Dateien die Menge des Datenverkehrs reduziert." description: "Wenn Code-Hervorhebungen in MFM usw. verwendet werden, werden sie erst geladen, wenn sie angetippt werden. Die Syntaxhervorhebung erfordert das Herunterladen der Definitionsdateien für jede Programmiersprache. Es ist daher zu erwarten, dass die Deaktivierung des automatischen Ladens dieser Dateien die Menge des Datenverkehrs reduziert."
@ -2925,10 +2926,6 @@ _customEmojisManager:
uploadSettingDescription: "Hier kannst du das Verhalten beim Hochladen von Emojis konfigurieren." uploadSettingDescription: "Hier kannst du das Verhalten beim Hochladen von Emojis konfigurieren."
directoryToCategoryLabel: "Gib den Namen des Verzeichnisses in das Feld „Kategorie“ ein" directoryToCategoryLabel: "Gib den Namen des Verzeichnisses in das Feld „Kategorie“ ein"
directoryToCategoryCaption: "Wenn du ein Verzeichnis ziehst und ablegst, gib den Verzeichnisnamen in das Feld „Kategorie“ ein." directoryToCategoryCaption: "Wenn du ein Verzeichnis ziehst und ablegst, gib den Verzeichnisnamen in das Feld „Kategorie“ ein."
emojiInputAreaCaption: "Wählen Sie die Emojis aus, die Sie mit einer der folgenden Methoden speichern möchten."
emojiInputAreaList1: "Ziehe Bilddateien oder Verzeichnisse per Drag-and-drop in diesen Rahmen"
emojiInputAreaList2: "Klicke auf diesen Link, um von deinem PC aus zu wählen"
emojiInputAreaList3: "Klicke auf diesen Link, um vom Drive aus zu wählen"
confirmRegisterEmojisDescription: "Füge die in der Liste aufgeführten Emojis als neue benutzerdefinierte Emojis hinzu. Bist du sicher? (Um eine Überlastung zu vermeiden, können nur {count} Emoji(s) in einem Vorgang hinzugefügt werden)" confirmRegisterEmojisDescription: "Füge die in der Liste aufgeführten Emojis als neue benutzerdefinierte Emojis hinzu. Bist du sicher? (Um eine Überlastung zu vermeiden, können nur {count} Emoji(s) in einem Vorgang hinzugefügt werden)"
confirmClearEmojisDescription: "Verwerfe die Bearbeitungen und lösche die Emojis aus der Liste. Bist du sicher, dass du fortfahren möchtest?" confirmClearEmojisDescription: "Verwerfe die Bearbeitungen und lösche die Emojis aus der Liste. Bist du sicher, dass du fortfahren möchtest?"
confirmUploadEmojisDescription: "Lade die {count} abgelegte(n) Datei(en) in das Drive hoch. Bist du sicher, dass du fortfahren möchtest?" confirmUploadEmojisDescription: "Lade die {count} abgelegte(n) Datei(en) in das Drive hoch. Bist du sicher, dass du fortfahren möchtest?"

View File

@ -220,6 +220,7 @@ silenceThisInstance: "Silence this instance"
mediaSilenceThisInstance: "Media-silence this server" mediaSilenceThisInstance: "Media-silence this server"
operations: "Operations" operations: "Operations"
software: "Software" software: "Software"
softwareName: "Software"
version: "Version" version: "Version"
metadata: "Metadata" metadata: "Metadata"
withNFiles: "{n} file(s)" withNFiles: "{n} file(s)"
@ -250,7 +251,6 @@ noUsers: "There are no users"
editProfile: "Edit profile" editProfile: "Edit profile"
noteDeleteConfirm: "Are you sure you want to delete this note?" noteDeleteConfirm: "Are you sure you want to delete this note?"
pinLimitExceeded: "You cannot pin any more notes" pinLimitExceeded: "You cannot pin any more notes"
intro: "Installation of Misskey has been finished! Please create an admin user."
done: "Done" done: "Done"
processing: "Processing..." processing: "Processing..."
preview: "Preview" preview: "Preview"
@ -298,6 +298,7 @@ uploadFromUrl: "Upload from a URL"
uploadFromUrlDescription: "URL of the file you want to upload" uploadFromUrlDescription: "URL of the file you want to upload"
uploadFromUrlRequested: "Upload requested" uploadFromUrlRequested: "Upload requested"
uploadFromUrlMayTakeTime: "It may take some time until the upload is complete." uploadFromUrlMayTakeTime: "It may take some time until the upload is complete."
uploadNFiles: "Upload {n} files"
explore: "Explore" explore: "Explore"
messageRead: "Read" messageRead: "Read"
noMoreHistory: "There is no further history" noMoreHistory: "There is no further history"
@ -575,6 +576,7 @@ showFixedPostForm: "Display the posting form at the top of the timeline"
showFixedPostFormInChannel: "Display the posting form at the top of the timeline (Channels)" showFixedPostFormInChannel: "Display the posting form at the top of the timeline (Channels)"
withRepliesByDefaultForNewlyFollowed: "Include replies by newly followed users in the timeline by default" withRepliesByDefaultForNewlyFollowed: "Include replies by newly followed users in the timeline by default"
newNoteRecived: "There are new notes" newNoteRecived: "There are new notes"
newNote: "New Note"
sounds: "Sounds" sounds: "Sounds"
sound: "Sounds" sound: "Sounds"
listen: "Listen" listen: "Listen"
@ -784,7 +786,6 @@ thisIsExperimentalFeature: "This is an experimental feature. Its functionality i
developer: "Developer" developer: "Developer"
makeExplorable: "Make account visible in \"Explore\"" makeExplorable: "Make account visible in \"Explore\""
makeExplorableDescription: "If you turn this off, your account will not show up in the \"Explore\" section." makeExplorableDescription: "If you turn this off, your account will not show up in the \"Explore\" section."
showGapBetweenNotesInTimeline: "Show a gap between posts on the timeline"
duplicate: "Duplicate" duplicate: "Duplicate"
left: "Left" left: "Left"
center: "Center" center: "Center"
@ -792,6 +793,7 @@ wide: "Wide"
narrow: "Narrow" narrow: "Narrow"
reloadToApplySetting: "This setting will only apply after a page reload. Reload now?" reloadToApplySetting: "This setting will only apply after a page reload. Reload now?"
needReloadToApply: "A reload is required for this to be reflected." needReloadToApply: "A reload is required for this to be reflected."
needToRestartServerToApply: "A Misskey restart is required to reflect the change."
showTitlebar: "Show title bar" showTitlebar: "Show title bar"
clearCache: "Clear cache" clearCache: "Clear cache"
onlineUsersCount: "{n} users are online" onlineUsersCount: "{n} users are online"
@ -1237,7 +1239,6 @@ showAvatarDecorations: "Show avatar decorations"
releaseToRefresh: "Release to refresh" releaseToRefresh: "Release to refresh"
refreshing: "Refreshing..." refreshing: "Refreshing..."
pullDownToRefresh: "Pull down to refresh" pullDownToRefresh: "Pull down to refresh"
disableStreamingTimeline: "Disable real-time timeline updates"
useGroupedNotifications: "Display grouped notifications" useGroupedNotifications: "Display grouped notifications"
signupPendingError: "There was a problem verifying the email address. The link may have expired." signupPendingError: "There was a problem verifying the email address. The link may have expired."
cwNotationRequired: "If \"Hide content\" is enabled, a description must be provided." cwNotationRequired: "If \"Hide content\" is enabled, a description must be provided."
@ -1347,6 +1348,15 @@ readonly: "Read only"
goToDeck: "Return to Deck" goToDeck: "Return to Deck"
federationJobs: "Federation Jobs" federationJobs: "Federation Jobs"
driveAboutTip: "In Drive, a list of files you've uploaded in the past will be displayed. <br> \nYou can reuse these files when attaching them to notes, or you can upload files in advance to post later. <br> \n<b>Be careful when deleting a file, as it will not be available in all places where it was used (such as notes, pages, avatars, banners, etc.).</b> <br> \nYou can also create folders to organize your files." driveAboutTip: "In Drive, a list of files you've uploaded in the past will be displayed. <br> \nYou can reuse these files when attaching them to notes, or you can upload files in advance to post later. <br> \n<b>Be careful when deleting a file, as it will not be available in all places where it was used (such as notes, pages, avatars, banners, etc.).</b> <br> \nYou can also create folders to organize your files."
scrollToClose: "Scroll to close"
advice: "Advice"
realtimeMode: "Real-time mode"
turnItOn: "Turn on"
turnItOff: "Turn off"
emojiMute: "Mute emoji"
emojiUnmute: "Unmute emoji"
muteX: "Mute {x}"
unmuteX: "Unmute {x}"
_chat: _chat:
noMessagesYet: "No messages yet" noMessagesYet: "No messages yet"
newMessage: "New message" newMessage: "New message"
@ -1380,6 +1390,8 @@ _chat:
chatNotAvailableInOtherAccount: "The chat function is disabled for the other user." chatNotAvailableInOtherAccount: "The chat function is disabled for the other user."
cannotChatWithTheUser: "Cannot start a chat with this user" cannotChatWithTheUser: "Cannot start a chat with this user"
cannotChatWithTheUser_description: "Chat is either unavailable or the other party has not enabled chat." cannotChatWithTheUser_description: "Chat is either unavailable or the other party has not enabled chat."
youAreNotAMemberOfThisRoomButInvited: "You are not a participant in this room, but you have received an invitation. Please accept the invitation to join."
doYouAcceptInvitation: "Do you accept the invitation?"
chatWithThisUser: "Chat with user" chatWithThisUser: "Chat with user"
thisUserAllowsChatOnlyFromFollowers: "This user accepts chats from followers only." thisUserAllowsChatOnlyFromFollowers: "This user accepts chats from followers only."
thisUserAllowsChatOnlyFromFollowing: "This user accepts chats only from users they follow." thisUserAllowsChatOnlyFromFollowing: "This user accepts chats only from users they follow."
@ -1419,10 +1431,19 @@ _settings:
makeEveryTextElementsSelectable: "Make all text elements selectable" makeEveryTextElementsSelectable: "Make all text elements selectable"
makeEveryTextElementsSelectable_description: "Enabling this may reduce usability in some situations." makeEveryTextElementsSelectable_description: "Enabling this may reduce usability in some situations."
useStickyIcons: "Make icons follow while scrolling" useStickyIcons: "Make icons follow while scrolling"
enableHighQualityImagePlaceholders: "Display placeholders for high quality images"
uiAnimations: "UI Animations"
showNavbarSubButtons: "Show sub-buttons on the navigation bar" showNavbarSubButtons: "Show sub-buttons on the navigation bar"
ifOn: "When turned on" ifOn: "When turned on"
ifOff: "When turned off" ifOff: "When turned off"
enableSyncThemesBetweenDevices: "Synchronize installed themes across devices" enableSyncThemesBetweenDevices: "Synchronize installed themes across devices"
enablePullToRefresh: "Pull to Refresh"
enablePullToRefresh_description: "When using a mouse, drag while pressing in the scroll wheel."
realtimeMode_description: "Establishes a connection with the server and updates content in real time. This may increase traffic and memory consumption."
contentsUpdateFrequency: "Frequency of content retrieval"
contentsUpdateFrequency_description: "The higher the value the more the content updates but it lowers the performance and increases the traffic and memory consumption."
contentsUpdateFrequency_description2: "When real-time mode is on, content is updated in real time regardless of this setting."
showUrlPreview: "Show URL preview"
_chat: _chat:
showSenderName: "Show sender's name" showSenderName: "Show sender's name"
sendOnEnter: "Press Enter to send" sendOnEnter: "Press Enter to send"
@ -1430,6 +1451,7 @@ _preferencesProfile:
profileName: "Profile name" profileName: "Profile name"
profileNameDescription: "Set a name that identifies this device." profileNameDescription: "Set a name that identifies this device."
profileNameDescription2: "Example: \"Main PC\", \"Smartphone\"" profileNameDescription2: "Example: \"Main PC\", \"Smartphone\""
manageProfiles: "Manage Profiles"
_preferencesBackup: _preferencesBackup:
autoBackup: "Auto backup" autoBackup: "Auto backup"
restoreFromBackup: "Restore from backup" restoreFromBackup: "Restore from backup"
@ -1468,6 +1490,7 @@ _delivery:
manuallySuspended: "Manually suspended" manuallySuspended: "Manually suspended"
goneSuspended: "Server is suspended due to server deletion" goneSuspended: "Server is suspended due to server deletion"
autoSuspendedForNotResponding: "Server is suspended due to no responding" autoSuspendedForNotResponding: "Server is suspended due to no responding"
softwareSuspended: "Suspended as this software is no longer being distributed to"
_bubbleGame: _bubbleGame:
howToPlay: "How to play" howToPlay: "How to play"
hold: "Hold" hold: "Hold"
@ -1599,6 +1622,23 @@ _serverSettings:
openRegistration: "Make the account creation open" openRegistration: "Make the account creation open"
openRegistrationWarning: "Opening registration carries risks. It is recommended to only enable it if you have a system in place to continuously monitor the server and respond immediately in case of any issues." openRegistrationWarning: "Opening registration carries risks. It is recommended to only enable it if you have a system in place to continuously monitor the server and respond immediately in case of any issues."
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "If no moderator activity is detected for a while, this setting will be automatically turned off to prevent spam." thisSettingWillAutomaticallyOffWhenModeratorsInactive: "If no moderator activity is detected for a while, this setting will be automatically turned off to prevent spam."
deliverSuspendedSoftware: "Suspended Software"
deliverSuspendedSoftwareDescription: "You can specify a range of names and versions of the server's software to stop delivery for vulnerability or other reasons. This version information is provided by the server and is not guaranteed to be reliable. A semver range specification can be used to specify the version, but specifying >= 2024.3.1 will not include custom versions such as 2024.3.1-custom.0, so it is recommended that a prerelease specification be used, such as >= 2024.3.1-0"
singleUserMode: "Single user mode"
singleUserMode_description: "If you are the only user of this server, enabling this mode will optimize its performance."
signToActivityPubGet: "Sign ActivityPub GET requests"
signToActivityPubGet_description: "Normally, this should be enabled. Disabling it may improve issues related to federation, but on the other hand it could disable federation towards some other servers."
proxyRemoteFiles: "Proxy remote files"
proxyRemoteFiles_description: "When enabled, the server will proxy and serve remote files. This is useful for generating image thumbnails and protecting user privacy."
allowExternalApRedirect: "Allow redirects for queries via ActivityPub"
allowExternalApRedirect_description: "If enabled, other servers can query third-party content through this server but this may result in content spoofing."
userGeneratedContentsVisibilityForVisitor: "Visibility of user-generated content to guests"
userGeneratedContentsVisibilityForVisitor_description: "This is useful for preventing problems caused by inappropriate remote content that is not well moderated from being unintentionally published on the Internet via your own server."
userGeneratedContentsVisibilityForVisitor_description2: "Unconditionally publishing all content on the server to the Internet, including remote content received by the server is risky. This is especially important for guests who are unaware of the distributed nature of the content, as they may mistakenly believe that even remote content is content created by users on the server."
_userGeneratedContentsVisibilityForVisitor:
all: "Everything is public"
localOnly: "Only local content is published, remote content is kept private"
none: "Everything is private"
_accountMigration: _accountMigration:
moveFrom: "Migrate another account to this one" moveFrom: "Migrate another account to this one"
moveFromSub: "Create alias to another account" moveFromSub: "Create alias to another account"
@ -2156,7 +2196,6 @@ _theme:
buttonBg: "Button background" buttonBg: "Button background"
buttonHoverBg: "Button background (Hover)" buttonHoverBg: "Button background (Hover)"
inputBorder: "Input field border" inputBorder: "Input field border"
driveFolderBg: "Drive folder background"
badge: "Badge" badge: "Badge"
messageBg: "Chat background" messageBg: "Chat background"
fgHighlighted: "Highlighted Text" fgHighlighted: "Highlighted Text"
@ -2792,9 +2831,12 @@ _dataSaver:
_avatar: _avatar:
title: "Avatar image" title: "Avatar image"
description: "Stop avatar image animation. Animated images can be larger in file size than normal images, potentially leading to further reductions in data traffic." description: "Stop avatar image animation. Animated images can be larger in file size than normal images, potentially leading to further reductions in data traffic."
_urlPreview: _urlPreviewThumbnail:
title: "URL preview thumbnails" title: "Hide URL preview thumbnails"
description: "URL preview thumbnail images will no longer be loaded." description: "URL preview thumbnail images will no longer be loaded."
_disableUrlPreview:
title: "Disable URL preview"
description: "Disables the URL preview function. Unlike thumbnail images, this function reduces the loading of the linked information itself."
_code: _code:
title: "Code highlighting" title: "Code highlighting"
description: "If code highlighting notations are used in MFM, etc., they will not load until tapped. Syntax highlighting requires downloading the highlight definition files for each programming language. Therefore, disabling the automatic loading of these files is expected to reduce the amount of communication data." description: "If code highlighting notations are used in MFM, etc., they will not load until tapped. Syntax highlighting requires downloading the highlight definition files for each programming language. Therefore, disabling the automatic loading of these files is expected to reduce the amount of communication data."
@ -2925,10 +2967,6 @@ _customEmojisManager:
uploadSettingDescription: "On this screen, you can configure the behavior when uploading Emojis." uploadSettingDescription: "On this screen, you can configure the behavior when uploading Emojis."
directoryToCategoryLabel: "Enter the directory name in the \"category\" field" directoryToCategoryLabel: "Enter the directory name in the \"category\" field"
directoryToCategoryCaption: "When you drag and drop a directory, enter the directory name in the \"category\" field." directoryToCategoryCaption: "When you drag and drop a directory, enter the directory name in the \"category\" field."
emojiInputAreaCaption: "Select the Emojis you wish to register using one of the methods."
emojiInputAreaList1: "Drag and drop image files or a directory into this frame"
emojiInputAreaList2: "Click this link to select from your computer"
emojiInputAreaList3: "Click this link to select from the drive"
confirmRegisterEmojisDescription: "Register the Emojis from the list as new custom Emojis. Are you sure to continue? (To avoid overload, only {count} Emoji(s) can be registered in a single operation)" confirmRegisterEmojisDescription: "Register the Emojis from the list as new custom Emojis. Are you sure to continue? (To avoid overload, only {count} Emoji(s) can be registered in a single operation)"
confirmClearEmojisDescription: "Discard the edits and clear the Emojis from the list. Are you sure to continue?" confirmClearEmojisDescription: "Discard the edits and clear the Emojis from the list. Are you sure to continue?"
confirmUploadEmojisDescription: "Upload the dragged and dropped {count} file(s) to the drive. Are you sure to continue?" confirmUploadEmojisDescription: "Upload the dragged and dropped {count} file(s) to the drive. Are you sure to continue?"
@ -3004,3 +3042,59 @@ _search:
pleaseEnterServerHost: "Enter the server host" pleaseEnterServerHost: "Enter the server host"
pleaseSelectUser: "Select user" pleaseSelectUser: "Select user"
serverHostPlaceholder: "Example: misskey.example.com" serverHostPlaceholder: "Example: misskey.example.com"
_serverSetupWizard:
installCompleted: "Misskey installation is now complete!"
firstCreateAccount: "To begin, create an administrator account."
accountCreated: "Administrator account has been created!"
serverSetting: "Server Settings"
youCanEasilyConfigureOptimalServerSettingsWithThisWizard: "This wizard makes it easier to configure the server settings."
settingsYouMakeHereCanBeChangedLater: "The settings that were changed via this wizard can be adjusted later."
howWillYouUseMisskey: "How will you use Misskey?"
_use:
single: "Single User server"
single_description: "Use it alone as your own server."
single_youCanCreateMultipleAccounts: "Multiple accounts can be created as needed, even when operated as a single user server."
group: "Group server"
group_description: "Invite other trusted users to use it with more than one user."
open: "Public server"
open_description: "Allow anyone to register."
openServerAdvice: "Accepting a large number of unknown users involves risk. We recommend that you operate with a reliable moderation system to handle any problems."
openServerAntiSpamAdvice: "To prevent your server from becoming a stepping stone for spam, you should also pay close attention to security by enabling anti-bot functions such as reCAPTCHA."
howManyUsersDoYouExpect: "How many users do you expect?"
_scale:
small: "Less than 100 (small scale)"
medium: "More than 100 and less than 1000 users (medium size)"
large: "More than 1000 (Large scale)"
largeScaleServerAdvice: "Large servers may require advanced infrastructure knowledge, such as load balancing and database replication."
doYouConnectToFediverse: "Do you want to connect to the Fediverse?"
doYouConnectToFediverse_description1: "When connected to a network of distributed servers (Fediverse) content can be exchanged with other servers."
doYouConnectToFediverse_description2: "Connecting with the Fediverse is also called \"federation\""
youCanConfigureMoreFederationSettingsLater: "Advanced settings such as specifying federated servers can be configured later."
adminInfo: "Administrator information"
adminInfo_description: "Sets the administrator information used to receive inquiries."
adminInfo_mustBeFilled: "Must be entered if public server or federation is on."
followingSettingsAreRecommended: "The following settings are recommended"
applyTheseSettings: "Apply these settings"
skipSettings: "Skip settings"
settingsCompleted: "Setup is now complete!"
settingsCompleted_description: "Thank you for your time. Now that everything is ready, you can start using the server right away."
settingsCompleted_description2: "The server settings can be changed from the “Control Panel”"
donationRequest: "Donation Request"
_donationRequest:
text1: "Misskey is a free software developed by volunteers."
text2: "We would appreciate your support so that we can continue to develop this software further into the future."
text3: "There are also special benefits for supporters!"
_uploader:
compressedToX: "Compressed to {x}"
savedXPercent: "Saving {x}%"
abortConfirm: "Some files have not been uploaded, do you want to abort?"
doneConfirm: "Some files have not been uploaded, do you want to continue anyway?"
maxFileSizeIsX: "The maximum file size that can be uploaded is {x}"
_clientPerformanceIssueTip:
title: "Performance tips"
makeSureDisabledAdBlocker: "Disable your adblocker"
makeSureDisabledAdBlocker_description: "Adblockers can affect performance, please make sure that adblockers are not enabled by your system or browser features/extensions."
makeSureDisabledCustomCss: "Disable custom CSS"
makeSureDisabledCustomCss_description: "Overriding styles can affect performance. Please make sure that custom CSS or extensions that override styles are not enabled."
makeSureDisabledAddons: "Disable extensions"
makeSureDisabledAddons_description: "Some extensions may interfere with client behavior and affect performance. Please disable your browser extensions and see if this improves the situation."

View File

@ -220,6 +220,7 @@ silenceThisInstance: "Silenciar esta instancia"
mediaSilenceThisInstance: "Silencia la Multimedia(Imágenes,videos...) para este servidor" mediaSilenceThisInstance: "Silencia la Multimedia(Imágenes,videos...) para este servidor"
operations: "Operaciones" operations: "Operaciones"
software: "Software" software: "Software"
softwareName: "Nombre del software"
version: "Versión" version: "Versión"
metadata: "Metadatos" metadata: "Metadatos"
withNFiles: "{n} archivos" withNFiles: "{n} archivos"
@ -250,7 +251,6 @@ noUsers: "No hay usuarios"
editProfile: "Editar perfil" editProfile: "Editar perfil"
noteDeleteConfirm: "¿Desea borrar esta nota?" noteDeleteConfirm: "¿Desea borrar esta nota?"
pinLimitExceeded: "Ya no se pueden fijar más posts" pinLimitExceeded: "Ya no se pueden fijar más posts"
intro: "¡La instalación de Misskey ha terminado! Crea el usuario administrador."
done: "Terminado" done: "Terminado"
processing: "Procesando" processing: "Procesando"
preview: "Vista previa" preview: "Vista previa"
@ -575,6 +575,7 @@ showFixedPostForm: "Mostrar el formulario de las entradas encima de la línea de
showFixedPostFormInChannel: "Mostrar el formulario de publicación por encima de la cronología (Canales)" showFixedPostFormInChannel: "Mostrar el formulario de publicación por encima de la cronología (Canales)"
withRepliesByDefaultForNewlyFollowed: "Incluir por defecto respuestas de usuarios recién seguidos en la línea de tiempo" withRepliesByDefaultForNewlyFollowed: "Incluir por defecto respuestas de usuarios recién seguidos en la línea de tiempo"
newNoteRecived: "Tienes una nota nueva" newNoteRecived: "Tienes una nota nueva"
newNote: "Nueva nota"
sounds: "Sonidos" sounds: "Sonidos"
sound: "Sonidos" sound: "Sonidos"
listen: "Escuchar" listen: "Escuchar"
@ -784,7 +785,6 @@ thisIsExperimentalFeature: "Se trata de una función experimental. Las especific
developer: "Desarrolladores" developer: "Desarrolladores"
makeExplorable: "Hacer visible la cuenta en \"Explorar\"" makeExplorable: "Hacer visible la cuenta en \"Explorar\""
makeExplorableDescription: "Si desactiva esta opción, su cuenta no aparecerá en la sección \"Explorar\"." makeExplorableDescription: "Si desactiva esta opción, su cuenta no aparecerá en la sección \"Explorar\"."
showGapBetweenNotesInTimeline: "Mostrar un intervalo entre notas en la línea de tiempo"
duplicate: "Duplicar" duplicate: "Duplicar"
left: "Izquierda" left: "Izquierda"
center: "Centrar" center: "Centrar"
@ -792,6 +792,7 @@ wide: "Ancho"
narrow: "Estrecho" narrow: "Estrecho"
reloadToApplySetting: "Esta configuración sólo se aplicará después de recargar la página. ¿Recargar ahora?" reloadToApplySetting: "Esta configuración sólo se aplicará después de recargar la página. ¿Recargar ahora?"
needReloadToApply: "Se requiere un reinicio para la aplicar los cambios" needReloadToApply: "Se requiere un reinicio para la aplicar los cambios"
needToRestartServerToApply: "Se requiere un reinicio para la aplicar los cambios"
showTitlebar: "Mostrar la barra de título" showTitlebar: "Mostrar la barra de título"
clearCache: "Limpiar caché" clearCache: "Limpiar caché"
onlineUsersCount: "{n} usuarios en línea" onlineUsersCount: "{n} usuarios en línea"
@ -1237,7 +1238,6 @@ showAvatarDecorations: "Mostrar decoraciones de avatar"
releaseToRefresh: "Soltar para recargar" releaseToRefresh: "Soltar para recargar"
refreshing: "Recargando..." refreshing: "Recargando..."
pullDownToRefresh: "Tira hacia abajo para recargar" pullDownToRefresh: "Tira hacia abajo para recargar"
disableStreamingTimeline: "Desactivar actualizaciones en tiempo real de la línea de tiempo"
useGroupedNotifications: "Mostrar notificaciones agrupadas" useGroupedNotifications: "Mostrar notificaciones agrupadas"
signupPendingError: "Ha habido un problema al verificar tu dirección de correo electrónico. Es posible que el enlace haya caducado." signupPendingError: "Ha habido un problema al verificar tu dirección de correo electrónico. Es posible que el enlace haya caducado."
cwNotationRequired: "Si se ha activado \"ocultar contenido\", es necesario proporcionar una descripción." cwNotationRequired: "Si se ha activado \"ocultar contenido\", es necesario proporcionar una descripción."
@ -1328,12 +1328,16 @@ preferenceSyncConflictTitle: "Los valores configurados existen en el servidor."
preferenceSyncConflictText: "Los ajustes de sincronización activados guardarán sus valores en el servidor. Sin embargo, hay valores existentes en el servidor. ¿Qué conjunto de valores desea sobrescribir?" preferenceSyncConflictText: "Los ajustes de sincronización activados guardarán sus valores en el servidor. Sin embargo, hay valores existentes en el servidor. ¿Qué conjunto de valores desea sobrescribir?"
preferenceSyncConflictChoiceServer: "Valores de configuración del servidor" preferenceSyncConflictChoiceServer: "Valores de configuración del servidor"
preferenceSyncConflictChoiceDevice: "Valor configurado en el dispositivo" preferenceSyncConflictChoiceDevice: "Valor configurado en el dispositivo"
preferenceSyncConflictChoiceCancel: "Cancelar la activación de la sincronización"
paste: "Pegar" paste: "Pegar"
emojiPalette: "Paleta emoji" emojiPalette: "Paleta emoji"
postForm: "Formulario" postForm: "Formulario"
textCount: "caracteres"
information: "Información" information: "Información"
chat: "Chat" chat: "Chat"
migrateOldSettings: "Migrar la configuración anterior" migrateOldSettings: "Migrar la configuración anterior"
migrateOldSettings_description: "Esto debería hacerse automáticamente, pero si por alguna razón la migración no ha tenido éxito, puede activar usted mismo el proceso de migración manualmente. Se sobrescribirá la información de configuración actual."
compress: "Comprimir"
right: "Derecha" right: "Derecha"
bottom: "Abajo" bottom: "Abajo"
top: "Arriba" top: "Arriba"
@ -1342,6 +1346,16 @@ settingsMigrating: "La configuración está siendo migrada, por favor espera un
readonly: "Solo Lectura" readonly: "Solo Lectura"
goToDeck: "Volver al Deck" goToDeck: "Volver al Deck"
federationJobs: "Trabajos de Federación" federationJobs: "Trabajos de Federación"
driveAboutTip: "En Drive, aparecerá una lista de los archivos que has subido en el pasado. <br> \nPuedes reutilizar estos archivos al adjuntarlos a notas, o puedes subir archivos por adelantado para publicarlos más tarde. <br> \n<b>Ten cuidado al eliminar un archivo, ya que no estará disponible en todos los lugares donde se utilizó (como notas, páginas, avatares, banners, etc.).</b> <br> \nTambién puedes crear carpetas para organizar tus archivos."
scrollToClose: "Desliza para cerrar"
advice: "Consejos"
realtimeMode: "Modo en tiempo real"
turnItOn: "Activar"
turnItOff: "Desactivar"
emojiMute: "Silenciar emojis"
emojiUnmute: "No Silenciar emojis"
muteX: "Silenciar {x}"
unmuteX: "Dejar de silenciar {x}"
_chat: _chat:
noMessagesYet: "Aún no hay mensajes" noMessagesYet: "Aún no hay mensajes"
newMessage: "Mensajes nuevos" newMessage: "Mensajes nuevos"
@ -1375,6 +1389,8 @@ _chat:
chatNotAvailableInOtherAccount: "La función de chat está desactivada para el otro usuario." chatNotAvailableInOtherAccount: "La función de chat está desactivada para el otro usuario."
cannotChatWithTheUser: "No se puede iniciar un chat con este usuario" cannotChatWithTheUser: "No se puede iniciar un chat con este usuario"
cannotChatWithTheUser_description: "El chat no está disponible o la otra parte no ha habilitado el chat." cannotChatWithTheUser_description: "El chat no está disponible o la otra parte no ha habilitado el chat."
youAreNotAMemberOfThisRoomButInvited: "No eres participante en esta sala, pero has recibido una invitación. Por favor, acepta la invitación para unirte."
doYouAcceptInvitation: "¿Aceptas la invitación?"
chatWithThisUser: "Chatear" chatWithThisUser: "Chatear"
thisUserAllowsChatOnlyFromFollowers: "Este usuario sólo acepta chats de seguidores." thisUserAllowsChatOnlyFromFollowers: "Este usuario sólo acepta chats de seguidores."
thisUserAllowsChatOnlyFromFollowing: "Este usuario sólo acepta chats de los usuarios a los que sigue." thisUserAllowsChatOnlyFromFollowing: "Este usuario sólo acepta chats de los usuarios a los que sigue."
@ -1391,15 +1407,29 @@ _chat:
_emojiPalette: _emojiPalette:
palettes: "Paleta\n" palettes: "Paleta\n"
enableSyncBetweenDevicesForPalettes: "Activar la sincronización de paletas entre dispositivos" enableSyncBetweenDevicesForPalettes: "Activar la sincronización de paletas entre dispositivos"
paletteForMain: "Paleta principal"
paletteForReaction: "Paleta de reacción"
_settings: _settings:
driveBanner: "Puedes gestionar y configurar la unidad, comprobar su uso y configurar los ajustes de carga de archivos."
pluginBanner: "Puedes ampliar las funciones del cliente con plugins. Puedes instalar plugins, configurarlos y gestionarlos individualmente."
notificationsBanner: "Puede configurar los tipos y el alcance de las notificaciones del servidor y las notificaciones push."
api: "API" api: "API"
webhook: "Webhook" webhook: "Webhook"
serviceConnection: "Integraciones"
serviceConnectionBanner: "Gestione y configure tokens de acceso y Webhooks para integrarse con aplicaciones o servicios externos."
accountData: "Datos de la cuenta"
accountDataBanner: "Exportación e importación para gestionar los datos de la cuenta."
muteAndBlockBanner: "Puedes configurar y gestionar ajustes para ocultar contenidos y restringir acciones a usuarios específicos."
accessibilityBanner: "Puedes personalizar los visuales y el comportamiento del cliente, y configurar los ajustes para optimizar el uso."
timelineAndNote: "Líneas del tiempo y notas" timelineAndNote: "Líneas del tiempo y notas"
makeEveryTextElementsSelectable_description: "Activar esta opción puede reducir la usabilidad en algunas situaciones." makeEveryTextElementsSelectable_description: "Activar esta opción puede reducir la usabilidad en algunas situaciones."
useStickyIcons: "Hacer que los iconos te sigan cuando desplaces" useStickyIcons: "Hacer que los iconos te sigan cuando desplaces"
showNavbarSubButtons: "Mostrar los sub-botones en la barra de navegación." showNavbarSubButtons: "Mostrar los sub-botones en la barra de navegación."
ifOn: "Si está activado" ifOn: "Si está activado"
ifOff: "Si está desactivado"
enableSyncThemesBetweenDevices: "Sincronizar los temas instalados entre dispositivos." enableSyncThemesBetweenDevices: "Sincronizar los temas instalados entre dispositivos."
enablePullToRefresh: "Tirar para actualizar"
enablePullToRefresh_description: "Si utiliza un ratón, arrastre mientras pulsa la rueda de desplazamiento."
_chat: _chat:
showSenderName: "Mostrar el nombre del remitente" showSenderName: "Mostrar el nombre del remitente"
sendOnEnter: "Intro para enviar" sendOnEnter: "Intro para enviar"
@ -2091,7 +2121,6 @@ _theme:
buttonBg: "Fondo de botón" buttonBg: "Fondo de botón"
buttonHoverBg: "Fondo de botón (hover)" buttonHoverBg: "Fondo de botón (hover)"
inputBorder: "Borde de los campos de entrada" inputBorder: "Borde de los campos de entrada"
driveFolderBg: "Fondo de capeta del drive"
badge: "Medalla" badge: "Medalla"
messageBg: "Fondo de chat" messageBg: "Fondo de chat"
fgHighlighted: "Texto resaltado" fgHighlighted: "Texto resaltado"
@ -2670,9 +2699,6 @@ _dataSaver:
_avatar: _avatar:
title: "Avatares animados" title: "Avatares animados"
description: "Desactiva la animación de los avatares. Las imágenes animadas pueden llegar a ser de mayor tamaño que las normales, por lo que al desactivarlas puedes reducir el consumo de datos." description: "Desactiva la animación de los avatares. Las imágenes animadas pueden llegar a ser de mayor tamaño que las normales, por lo que al desactivarlas puedes reducir el consumo de datos."
_urlPreview:
title: "Vista previa de URLs"
description: "Desactiva la carga de vistas previas de las URLs."
_code: _code:
title: "Resaltar código" title: "Resaltar código"
description: "Si se usa resaltado de código en MFM, etc., no se cargará hasta pulsar en ello. El resaltado de sintaxis requiere la descarga de archivos de definición para cada lenguaje de programación. Debido a esto, al deshabilitar la carga automática de estos archivos reducirás el consumo de datos." description: "Si se usa resaltado de código en MFM, etc., no se cargará hasta pulsar en ello. El resaltado de sintaxis requiere la descarga de archivos de definición para cada lenguaje de programación. Debido a esto, al deshabilitar la carga automática de estos archivos reducirás el consumo de datos."

View File

@ -238,7 +238,6 @@ noUsers: "Il ny a pas dutilisateur·rice·s"
editProfile: "Modifier votre profil" editProfile: "Modifier votre profil"
noteDeleteConfirm: "Êtes-vous sûr·e de vouloir supprimer cette note ?" noteDeleteConfirm: "Êtes-vous sûr·e de vouloir supprimer cette note ?"
pinLimitExceeded: "Vous ne pouvez plus épingler dautres notes." pinLimitExceeded: "Vous ne pouvez plus épingler dautres notes."
intro: "Linstallation de Misskey est terminée ! Veuillez créer un compte administrateur."
done: "Terminé" done: "Terminé"
processing: "Traitement en cours" processing: "Traitement en cours"
preview: "Aperçu" preview: "Aperçu"
@ -760,7 +759,6 @@ thisIsExperimentalFeature: "Ceci est une fonctionnalité expérimentale. Il y a
developer: "Développeur" developer: "Développeur"
makeExplorable: "Rendre le compte visible sur la page \"Découvrir\"." makeExplorable: "Rendre le compte visible sur la page \"Découvrir\"."
makeExplorableDescription: "Si vous désactivez cette option, votre compte n'apparaîtra pas sur la page \"Découvrir\"." makeExplorableDescription: "Si vous désactivez cette option, votre compte n'apparaîtra pas sur la page \"Découvrir\"."
showGapBetweenNotesInTimeline: "Afficher un écart entre les notes sur la Timeline"
duplicate: "Duliquer" duplicate: "Duliquer"
left: "Gauche" left: "Gauche"
center: "Centrer" center: "Centrer"
@ -1209,7 +1207,6 @@ showAvatarDecorations: "Afficher les décorations d'avatar"
releaseToRefresh: "Relâcher pour rafraîchir" releaseToRefresh: "Relâcher pour rafraîchir"
refreshing: "Rafraîchissement..." refreshing: "Rafraîchissement..."
pullDownToRefresh: "Tirer vers le bas pour rafraîchir" pullDownToRefresh: "Tirer vers le bas pour rafraîchir"
disableStreamingTimeline: "Désactiver les mises à jour en temps réel de la ligne du temps"
useGroupedNotifications: "Grouper les notifications" useGroupedNotifications: "Grouper les notifications"
signupPendingError: "Un problème est survenu lors de la vérification de votre adresse e-mail. Le lien a peut-être expiré." signupPendingError: "Un problème est survenu lors de la vérification de votre adresse e-mail. Le lien a peut-être expiré."
cwNotationRequired: "Si « Masquer le contenu » est activé, une description doit être fournie." cwNotationRequired: "Si « Masquer le contenu » est activé, une description doit être fournie."
@ -1837,7 +1834,6 @@ _theme:
buttonBg: "Arrière-plan du bouton" buttonBg: "Arrière-plan du bouton"
buttonHoverBg: "Arrière-plan du bouton (survolé)" buttonHoverBg: "Arrière-plan du bouton (survolé)"
inputBorder: "Cadre de la zone de texte" inputBorder: "Cadre de la zone de texte"
driveFolderBg: "Arrière-plan du dossier de disque"
badge: "Badge" badge: "Badge"
messageBg: "Arrière plan de la discussion" messageBg: "Arrière plan de la discussion"
fgHighlighted: "Texte mis en évidence" fgHighlighted: "Texte mis en évidence"
@ -2336,9 +2332,6 @@ _dataSaver:
_avatar: _avatar:
title: "Animation d'avatars" title: "Animation d'avatars"
description: "Arrête l'animation d'avatars. Comme les images animées peuvent être plus volumineuses que les images normales, cela permet de réduire davantage le trafic de données." description: "Arrête l'animation d'avatars. Comme les images animées peuvent être plus volumineuses que les images normales, cela permet de réduire davantage le trafic de données."
_urlPreview:
title: "Vignettes d'aperçu des URL"
description: "Les vignettes d'aperçu des URL ne seront plus chargées."
_code: _code:
title: "Mise en évidence du code" 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." 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."

View File

@ -241,7 +241,6 @@ noUsers: "Tidak ada pengguna"
editProfile: "Sunting profil" editProfile: "Sunting profil"
noteDeleteConfirm: "Apakah kamu yakin ingin menghapus catatan ini?" noteDeleteConfirm: "Apakah kamu yakin ingin menghapus catatan ini?"
pinLimitExceeded: "Kamu tidak dapat menyematkan catatan lagi" pinLimitExceeded: "Kamu tidak dapat menyematkan catatan lagi"
intro: "Instalasi Misskey telah selesai! Mohon untuk membuat pengguna admin."
done: "Selesai" done: "Selesai"
processing: "Memproses" processing: "Memproses"
preview: "Pratinjau" preview: "Pratinjau"
@ -761,7 +760,6 @@ thisIsExperimentalFeature: "Fitur ini eksperimental. Fungsionalitas dari fitur i
developer: "Pengembang" developer: "Pengembang"
makeExplorable: "Buat akun tampil di \"Jelajahi\"" makeExplorable: "Buat akun tampil di \"Jelajahi\""
makeExplorableDescription: "Jika kamu mematikan ini, akun kamu tidak akan muncul di menu \"Jelajahi\"" makeExplorableDescription: "Jika kamu mematikan ini, akun kamu tidak akan muncul di menu \"Jelajahi\""
showGapBetweenNotesInTimeline: "Tampilkan jarak diantara catatan pada lini masa"
duplicate: "Duplikat" duplicate: "Duplikat"
left: "Kiri" left: "Kiri"
center: "Tengah" center: "Tengah"
@ -1206,7 +1204,6 @@ showAvatarDecorations: "Tampilkan dekorasi avatar"
releaseToRefresh: "Lepaskan untuk memuat ulang" releaseToRefresh: "Lepaskan untuk memuat ulang"
refreshing: "Sedang memuat ulang..." refreshing: "Sedang memuat ulang..."
pullDownToRefresh: "Tarik ke bawah untuk memuat ulang" pullDownToRefresh: "Tarik ke bawah untuk memuat ulang"
disableStreamingTimeline: "Nonaktifkan pembaharuan lini masa real-time"
useGroupedNotifications: "Tampilkan notifikasi secara dikelompokkan" useGroupedNotifications: "Tampilkan notifikasi secara dikelompokkan"
signupPendingError: "Terdapat masalah ketika memverifikasi alamat surel. Tautan kemungkinan telah kedaluwarsa." signupPendingError: "Terdapat masalah ketika memverifikasi alamat surel. Tautan kemungkinan telah kedaluwarsa."
cwNotationRequired: "Jika \"Sembunyikan konten\" diaktifkan, deskripsi harus disediakan." cwNotationRequired: "Jika \"Sembunyikan konten\" diaktifkan, deskripsi harus disediakan."
@ -1952,7 +1949,6 @@ _theme:
buttonBg: "Latar belakang tombol" buttonBg: "Latar belakang tombol"
buttonHoverBg: "Latar belakang tombol (Mengambang)" buttonHoverBg: "Latar belakang tombol (Mengambang)"
inputBorder: "Batas bidang masukan" inputBorder: "Batas bidang masukan"
driveFolderBg: "Latar belakang folder drive"
badge: "Lencana" badge: "Lencana"
messageBg: "Latar belakang obrolan" messageBg: "Latar belakang obrolan"
fgHighlighted: "Teks yang disorot" fgHighlighted: "Teks yang disorot"
@ -2533,9 +2529,6 @@ _dataSaver:
_avatar: _avatar:
title: "Gambar avatar" title: "Gambar avatar"
description: "Hentikan animasi gambar avatar. Gambar animasi dapat berukuran lebih besar dari gambar biasa, berpotensi pada pengurangan lalu lintas data lebih jauh." description: "Hentikan animasi gambar avatar. Gambar animasi dapat berukuran lebih besar dari gambar biasa, berpotensi pada pengurangan lalu lintas data lebih jauh."
_urlPreview:
title: "Gambar kecil URL pratinjau"
description: "Gambar kecil URL pratinjau tidak akan dimuat lagi."
_code: _code:
title: "Penyorotan kode" title: "Penyorotan kode"
description: "Jika notasi penyorotan kode digunakan di MFM, dll. Fungsi tersebut tidak akan dimuat apabila tidak diketuk. Penyorotan sintaks membutuhkan pengunduhan berkas definisi penyorotan untuk setiap bahasa pemrograman. Oleh sebab itu, menonaktifkan pemuatan otomatis dari berkas ini dilakukan untuk mengurangi jumlah komunikasi data." description: "Jika notasi penyorotan kode digunakan di MFM, dll. Fungsi tersebut tidak akan dimuat apabila tidak diketuk. Penyorotan sintaks membutuhkan pengunduhan berkas definisi penyorotan untuk setiap bahasa pemrograman. Oleh sebab itu, menonaktifkan pemuatan otomatis dari berkas ini dilakukan untuk mengurangi jumlah komunikasi data."

480
locales/index.d.ts vendored
View File

@ -715,7 +715,7 @@ export interface Locale extends ILocale {
*/ */
"cacheRemoteFiles": string; "cacheRemoteFiles": string;
/** /**
* default.ymlでproxyRemoteFilesをtrueにすることをお勧めします *
*/ */
"cacheRemoteFilesDescription": string; "cacheRemoteFilesDescription": string;
/** /**
@ -906,6 +906,10 @@ export interface Locale extends ILocale {
* *
*/ */
"software": string; "software": string;
/**
*
*/
"softwareName": string;
/** /**
* *
*/ */
@ -1026,10 +1030,6 @@ export interface Locale extends ILocale {
* *
*/ */
"pinLimitExceeded": string; "pinLimitExceeded": string;
/**
* Misskeyのインストールが完了しました
*/
"intro": string;
/** /**
* *
*/ */
@ -1218,6 +1218,10 @@ export interface Locale extends ILocale {
* *
*/ */
"uploadFromUrlMayTakeTime": string; "uploadFromUrlMayTakeTime": string;
/**
* {n}
*/
"uploadNFiles": ParameterizedString<"n">;
/** /**
* *
*/ */
@ -2326,6 +2330,10 @@ export interface Locale extends ILocale {
* *
*/ */
"newNoteRecived": string; "newNoteRecived": string;
/**
*
*/
"newNote": string;
/** /**
* *
*/ */
@ -2334,6 +2342,10 @@ export interface Locale extends ILocale {
* *
*/ */
"sound": string; "sound": string;
/**
*
*/
"notificationSoundSettings": string;
/** /**
* *
*/ */
@ -3162,10 +3174,6 @@ export interface Locale extends ILocale {
* *
*/ */
"makeExplorableDescription": string; "makeExplorableDescription": string;
/**
*
*/
"showGapBetweenNotesInTimeline": string;
/** /**
* *
*/ */
@ -3190,6 +3198,10 @@ export interface Locale extends ILocale {
* *
*/ */
"reloadToApplySetting": string; "reloadToApplySetting": string;
/**
*
*/
"needToRestartServerToApply": string;
/** /**
* *
*/ */
@ -4014,6 +4026,10 @@ export interface Locale extends ILocale {
* *
*/ */
"cannotUploadBecauseExceedsFileSizeLimit": string; "cannotUploadBecauseExceedsFileSizeLimit": string;
/**
*
*/
"cannotUploadBecauseUnallowedFileType": string;
/** /**
* *
*/ */
@ -4970,10 +4986,6 @@ export interface Locale extends ILocale {
* *
*/ */
"pullDownToRefresh": string; "pullDownToRefresh": string;
/**
*
*/
"disableStreamingTimeline": string;
/** /**
* *
*/ */
@ -5413,6 +5425,58 @@ export interface Locale extends ILocale {
* *
*/ */
"driveAboutTip": string; "driveAboutTip": string;
/**
*
*/
"scrollToClose": string;
/**
*
*/
"advice": string;
/**
*
*/
"realtimeMode": string;
/**
*
*/
"turnItOn": string;
/**
*
*/
"turnItOff": string;
/**
*
*/
"emojiMute": string;
/**
*
*/
"emojiUnmute": string;
/**
* {x}
*/
"muteX": ParameterizedString<"x">;
/**
* {x}
*/
"unmuteX": ParameterizedString<"x">;
/**
*
*/
"abort": string;
/**
*
*/
"tip": string;
/**
*
*/
"redisplayAllTips": string;
/**
*
*/
"hideAllTips": string;
"_chat": { "_chat": {
/** /**
* *
@ -5543,6 +5607,14 @@ export interface Locale extends ILocale {
* 使 * 使
*/ */
"cannotChatWithTheUser_description": string; "cannotChatWithTheUser_description": string;
/**
*
*/
"youAreNotAMemberOfThisRoomButInvited": string;
/**
*
*/
"doYouAcceptInvitation": string;
/** /**
* *
*/ */
@ -5693,6 +5765,14 @@ export interface Locale extends ILocale {
* *
*/ */
"useStickyIcons": string; "useStickyIcons": string;
/**
*
*/
"enableHighQualityImagePlaceholders": string;
/**
* UIのアニメーション
*/
"uiAnimations": string;
/** /**
* *
*/ */
@ -5709,6 +5789,34 @@ export interface Locale extends ILocale {
* *
*/ */
"enableSyncThemesBetweenDevices": string; "enableSyncThemesBetweenDevices": string;
/**
*
*/
"enablePullToRefresh": string;
/**
*
*/
"enablePullToRefresh_description": string;
/**
*
*/
"realtimeMode_description": string;
/**
*
*/
"contentsUpdateFrequency": string;
/**
*
*/
"contentsUpdateFrequency_description": string;
/**
*
*/
"contentsUpdateFrequency_description2": string;
/**
* URLプレビューを表示する
*/
"showUrlPreview": string;
"_chat": { "_chat": {
/** /**
* *
@ -5733,6 +5841,10 @@ export interface Locale extends ILocale {
* : PC * : PC
*/ */
"profileNameDescription2": string; "profileNameDescription2": string;
/**
*
*/
"manageProfiles": string;
}; };
"_preferencesBackup": { "_preferencesBackup": {
/** /**
@ -5875,6 +5987,10 @@ export interface Locale extends ILocale {
* *
*/ */
"autoSuspendedForNotResponding": string; "autoSuspendedForNotResponding": string;
/**
*
*/
"softwareSuspended": string;
}; };
}; };
"_bubbleGame": { "_bubbleGame": {
@ -6360,6 +6476,72 @@ export interface Locale extends ILocale {
* *
*/ */
"thisSettingWillAutomaticallyOffWhenModeratorsInactive": string; "thisSettingWillAutomaticallyOffWhenModeratorsInactive": string;
/**
*
*/
"deliverSuspendedSoftware": string;
/**
* semver 使>= 2024.3.1 2024.3.1-custom.0 >= 2024.3.1-0 prerelease
*/
"deliverSuspendedSoftwareDescription": string;
/**
*
*/
"singleUserMode": string;
/**
*
*/
"singleUserMode_description": string;
/**
* GETリクエストに署名する
*/
"signToActivityPubGet": string;
/**
*
*/
"signToActivityPubGet_description": string;
/**
*
*/
"proxyRemoteFiles": string;
/**
*
*/
"proxyRemoteFiles_description": string;
/**
* ActivityPub経由の照会にリダイレクトを許可する
*/
"allowExternalApRedirect": string;
/**
*
*/
"allowExternalApRedirect_description": string;
/**
*
*/
"userGeneratedContentsVisibilityForVisitor": string;
/**
*
*/
"userGeneratedContentsVisibilityForVisitor_description": string;
/**
*
*/
"userGeneratedContentsVisibilityForVisitor_description2": string;
"_userGeneratedContentsVisibilityForVisitor": {
/**
*
*/
"all": string;
/**
*
*/
"localOnly": string;
/**
*
*/
"none": string;
};
}; };
"_accountMigration": { "_accountMigration": {
/** /**
@ -7567,6 +7749,14 @@ export interface Locale extends ILocale {
* *
*/ */
"chatAvailability": string; "chatAvailability": string;
/**
*
*/
"uploadableFileTypes": string;
/**
* MIMEタイプを指定します(*)(: image/*)
*/
"uploadableFileTypes_caption": string;
}; };
"_condition": { "_condition": {
/** /**
@ -8385,10 +8575,6 @@ export interface Locale extends ILocale {
* *
*/ */
"inputBorder": string; "inputBorder": string;
/**
*
*/
"driveFolderBg": string;
/** /**
* *
*/ */
@ -10808,7 +10994,7 @@ export interface Locale extends ILocale {
*/ */
"description": string; "description": string;
}; };
"_urlPreview": { "_urlPreviewThumbnail": {
/** /**
* URLプレビューのサムネイルを非表示 * URLプレビューのサムネイルを非表示
*/ */
@ -10818,6 +11004,16 @@ export interface Locale extends ILocale {
*/ */
"description": string; "description": string;
}; };
"_disableUrlPreview": {
/**
* URLプレビューを無効化
*/
"title": string;
/**
* URLプレビュー機能を無効化します
*/
"description": string;
};
"_code": { "_code": {
/** /**
* *
@ -11303,22 +11499,6 @@ export interface Locale extends ILocale {
* "category" * "category"
*/ */
"directoryToCategoryCaption": string; "directoryToCategoryCaption": string;
/**
*
*/
"emojiInputAreaCaption": string;
/**
*
*/
"emojiInputAreaList1": string;
/**
* PCから選択する
*/
"emojiInputAreaList2": string;
/**
*
*/
"emojiInputAreaList3": string;
/** /**
* {count} * {count}
*/ */
@ -11592,6 +11772,238 @@ export interface Locale extends ILocale {
*/ */
"serverHostPlaceholder": string; "serverHostPlaceholder": string;
}; };
"_serverSetupWizard": {
/**
* Misskeyのインストールが完了しました
*/
"installCompleted": string;
/**
*
*/
"firstCreateAccount": string;
/**
*
*/
"accountCreated": string;
/**
*
*/
"serverSetting": string;
/**
*
*/
"youCanEasilyConfigureOptimalServerSettingsWithThisWizard": string;
/**
*
*/
"settingsYouMakeHereCanBeChangedLater": string;
/**
* Misskeyをどのように使いますか
*/
"howWillYouUseMisskey": string;
"_use": {
/**
*
*/
"single": string;
/**
* 使
*/
"single_description": string;
/**
*
*/
"single_youCanCreateMultipleAccounts": string;
/**
*
*/
"group": string;
/**
* 使
*/
"group_description": string;
/**
*
*/
"open": string;
/**
*
*/
"open_description": string;
};
/**
*
*/
"openServerAdvice": string;
/**
* reCAPTCHAといったアンチボット機能を有効にするなど
*/
"openServerAntiSpamAdvice": string;
/**
*
*/
"howManyUsersDoYouExpect": string;
"_scale": {
/**
* 100 ()
*/
"small": string;
/**
* 1001000 ()
*/
"medium": string;
/**
* 1000 ()
*/
"large": string;
};
/**
*
*/
"largeScaleServerAdvice": string;
/**
* Fediverseと接続しますか
*/
"doYouConnectToFediverse": string;
/**
* (Fediverse)
*/
"doYouConnectToFediverse_description1": string;
/**
* Fediverseと接続することは
*/
"doYouConnectToFediverse_description2": string;
/**
*
*/
"youCanConfigureMoreFederationSettingsLater": string;
/**
*
*/
"adminInfo": string;
/**
* 使
*/
"adminInfo_description": string;
/**
*
*/
"adminInfo_mustBeFilled": string;
/**
*
*/
"followingSettingsAreRecommended": string;
/**
*
*/
"applyTheseSettings": string;
/**
*
*/
"skipSettings": string;
/**
*
*/
"settingsCompleted": string;
/**
* 使
*/
"settingsCompleted_description": string;
/**
*
*/
"settingsCompleted_description2": string;
/**
*
*/
"donationRequest": string;
"_donationRequest": {
/**
* Misskeyは有志によって開発されている無料のソフトウェアです
*/
"text1": string;
/**
*
*/
"text2": string;
/**
*
*/
"text3": string;
};
};
"_uploader": {
/**
* {x}
*/
"compressedToX": ParameterizedString<"x">;
/**
* {x}%
*/
"savedXPercent": ParameterizedString<"x">;
/**
*
*/
"abortConfirm": string;
/**
*
*/
"doneConfirm": string;
/**
* {x}
*/
"maxFileSizeIsX": ParameterizedString<"x">;
/**
*
*/
"allowedTypes": string;
/**
*
*/
"tip": string;
};
"_clientPerformanceIssueTip": {
/**
*
*/
"title": string;
/**
*
*/
"makeSureDisabledAdBlocker": string;
/**
* OSの機能やブラウザの機能
*/
"makeSureDisabledAdBlocker_description": string;
/**
* CSSを無効にしてください
*/
"makeSureDisabledCustomCss": string;
/**
* CSSや
*/
"makeSureDisabledCustomCss_description": string;
/**
*
*/
"makeSureDisabledAddons": string;
/**
*
*/
"makeSureDisabledAddons_description": string;
};
"_clip": {
/**
*
*/
"tip": string;
};
"_userLists": {
/**
*
*/
"tip": string;
};
} }
declare const locales: { declare const locales: {
[lang: string]: Locale; [lang: string]: Locale;

View File

@ -250,7 +250,6 @@ noUsers: "Non ci sono profili"
editProfile: "Modifica profilo" editProfile: "Modifica profilo"
noteDeleteConfirm: "Vuoi davvero eliminare questa Nota?" noteDeleteConfirm: "Vuoi davvero eliminare questa Nota?"
pinLimitExceeded: "Non puoi fissare altre note " pinLimitExceeded: "Non puoi fissare altre note "
intro: "L'installazione di Misskey è terminata! Si prega di creare il profilo amministratore."
done: "Fine" done: "Fine"
processing: "In elaborazione" processing: "In elaborazione"
preview: "Anteprima" preview: "Anteprima"
@ -784,7 +783,6 @@ thisIsExperimentalFeature: "Questa è una funzionalità sperimentale. Potrebbe e
developer: "Sviluppatore" developer: "Sviluppatore"
makeExplorable: "Profilo visibile pubblicamente nella pagina \"Esplora\"" makeExplorable: "Profilo visibile pubblicamente nella pagina \"Esplora\""
makeExplorableDescription: "Disabilitando questa opzione, il tuo profilo non verrà elencato nella pagina \"Esplora\"." makeExplorableDescription: "Disabilitando questa opzione, il tuo profilo non verrà elencato nella pagina \"Esplora\"."
showGapBetweenNotesInTimeline: "Mostrare un intervallo tra le note sulla timeline"
duplicate: "Duplica" duplicate: "Duplica"
left: "Sinistra" left: "Sinistra"
center: "Centro" center: "Centro"
@ -1237,7 +1235,6 @@ showAvatarDecorations: "Mostra decorazione della foto profilo"
releaseToRefresh: "Rilascia per aggiornare" releaseToRefresh: "Rilascia per aggiornare"
refreshing: "Aggiornamento..." refreshing: "Aggiornamento..."
pullDownToRefresh: "Trascinare per aggiornare" pullDownToRefresh: "Trascinare per aggiornare"
disableStreamingTimeline: "Disabilitare gli aggiornamenti della TL in tempo reale"
useGroupedNotifications: "Mostra le notifiche raggruppate" useGroupedNotifications: "Mostra le notifiche raggruppate"
signupPendingError: "Si è verificato un problema durante la verifica del tuo indirizzo email. Potrebbe essere scaduto il collegamento temporaneo." signupPendingError: "Si è verificato un problema durante la verifica del tuo indirizzo email. Potrebbe essere scaduto il collegamento temporaneo."
cwNotationRequired: "Devi indicare perché il contenuto è indicato come esplicito." cwNotationRequired: "Devi indicare perché il contenuto è indicato come esplicito."
@ -2153,7 +2150,6 @@ _theme:
buttonBg: "Sfondo del pulsante" buttonBg: "Sfondo del pulsante"
buttonHoverBg: "Sfondo del pulsante (sorvolato)" buttonHoverBg: "Sfondo del pulsante (sorvolato)"
inputBorder: "Inquadra casella di testo" inputBorder: "Inquadra casella di testo"
driveFolderBg: "Sfondo della cartella di disco"
badge: "Distintivo" badge: "Distintivo"
messageBg: "Sfondo della chat" messageBg: "Sfondo della chat"
fgHighlighted: "Testo in evidenza." fgHighlighted: "Testo in evidenza."
@ -2789,9 +2785,6 @@ _dataSaver:
_avatar: _avatar:
title: "Immagine del profilo" title: "Immagine del profilo"
description: "Impedire l'animazione per l'immagine del profilo. Le immagini animate possono avere dimensioni file maggiori rispetto a quelle normali, puoi ridurre ulteriormente l'utilizzo dei dati." description: "Impedire l'animazione per l'immagine del profilo. Le immagini animate possono avere dimensioni file maggiori rispetto a quelle normali, puoi ridurre ulteriormente l'utilizzo dei dati."
_urlPreview:
title: "Anteprime delle URL"
description: "Impedire il caricamento delle anteprime URL."
_code: _code:
title: "Codice evidenziato" title: "Codice evidenziato"
description: "Impedire che il codice sorgente sia automaticamente evidenziato. Evidenziare il codice richiede il caricamento di un file per ogni linguaggio. Puoi evidenziare soltanto il codice che intendi leggere e ridurre il traffico inutilizzato." description: "Impedire che il codice sorgente sia automaticamente evidenziato. Evidenziare il codice richiede il caricamento di un file per ogni linguaggio. Puoi evidenziare soltanto il codice che intendi leggere e ridurre il traffico inutilizzato."
@ -2922,10 +2915,6 @@ _customEmojisManager:
uploadSettingDescription: "Questa schermata ti permette di scegliere il comportamento durante il caricamento delle emoji." uploadSettingDescription: "Questa schermata ti permette di scegliere il comportamento durante il caricamento delle emoji."
directoryToCategoryLabel: "Inseriscile in una cartella omonima alla categoria" directoryToCategoryLabel: "Inseriscile in una cartella omonima alla categoria"
directoryToCategoryCaption: "Crea il campo categoria in base alla cartella." directoryToCategoryCaption: "Crea il campo categoria in base alla cartella."
emojiInputAreaCaption: "Seleziona l'emoji da registrare utilizzando uno dei metodi."
emojiInputAreaList1: "Trascinare una immagine o una cartella in quest'area"
emojiInputAreaList2: "Clicca per scegliere file dal tuo dispositivo"
emojiInputAreaList3: "Clicca per selezionare dal Drive"
confirmRegisterEmojisDescription: "Registrazione delle emoji elencate come nuove emoji personalizzate. Vuoi davvero procedere? (Per evitare sovraccarichi, puoi registrare al massimo {count} emoji per volta)" confirmRegisterEmojisDescription: "Registrazione delle emoji elencate come nuove emoji personalizzate. Vuoi davvero procedere? (Per evitare sovraccarichi, puoi registrare al massimo {count} emoji per volta)"
confirmClearEmojisDescription: "Annullare le modifiche e cancella le emoji nell'elenco. Confermi?" confirmClearEmojisDescription: "Annullare le modifiche e cancella le emoji nell'elenco. Confermi?"
confirmUploadEmojisDescription: "Caricamento sul Drive di {count} file locali. Vuoi davvero procedere?" confirmUploadEmojisDescription: "Caricamento sul Drive di {count} file locali. Vuoi davvero procedere?"

View File

@ -174,7 +174,7 @@ emojiUrl: "絵文字画像URL"
addEmoji: "絵文字を追加" addEmoji: "絵文字を追加"
settingGuide: "おすすめ設定" settingGuide: "おすすめ設定"
cacheRemoteFiles: "リモートのファイルをキャッシュする" cacheRemoteFiles: "リモートのファイルをキャッシュする"
cacheRemoteFilesDescription: "この設定を有効にすると、リモートファイルをこのサーバーのストレージにキャッシュするようになります。画像の表示が高速になりますが、サーバーのストレージを多く消費します。リモートユーザーがどれほどキャッシュを保持するかは、ロールによるドライブ容量制限によって決定されます。この制限を超えた場合、古いファイルからキャッシュが削除されリンクになります。この設定が無効の場合、リモートのファイルを最初からリンクとして保持しますが、画像のサムネイル生成やユーザーのプライバシー保護のために、default.ymlでproxyRemoteFilesをtrueにすることをお勧めします。" cacheRemoteFilesDescription: "この設定を有効にすると、リモートファイルをこのサーバーのストレージにキャッシュするようになります。画像の表示が高速になりますが、サーバーのストレージを多く消費します。リモートユーザーがどれほどキャッシュを保持するかは、ロールによるドライブ容量制限によって決定されます。この制限を超えた場合、古いファイルからキャッシュが削除されリンクになります。この設定が無効の場合、リモートのファイルを最初からリンクとして保持します。"
youCanCleanRemoteFilesCache: "ファイル管理の🗑️ボタンで全てのキャッシュを削除できます。" youCanCleanRemoteFilesCache: "ファイル管理の🗑️ボタンで全てのキャッシュを削除できます。"
cacheRemoteSensitiveFiles: "リモートのセンシティブなファイルをキャッシュする" cacheRemoteSensitiveFiles: "リモートのセンシティブなファイルをキャッシュする"
cacheRemoteSensitiveFilesDescription: "この設定を無効にすると、リモートのセンシティブなファイルはキャッシュせず直リンクするようになります。" cacheRemoteSensitiveFilesDescription: "この設定を無効にすると、リモートのセンシティブなファイルはキャッシュせず直リンクするようになります。"
@ -222,6 +222,7 @@ silenceThisInstance: "サーバーをサイレンス"
mediaSilenceThisInstance: "サーバーをメディアサイレンス" mediaSilenceThisInstance: "サーバーをメディアサイレンス"
operations: "操作" operations: "操作"
software: "ソフトウェア" software: "ソフトウェア"
softwareName: "ソフトウェア名"
version: "バージョン" version: "バージョン"
metadata: "メタデータ" metadata: "メタデータ"
withNFiles: "{n}つのファイル" withNFiles: "{n}つのファイル"
@ -252,7 +253,6 @@ noUsers: "ユーザーはいません"
editProfile: "プロフィールを編集" editProfile: "プロフィールを編集"
noteDeleteConfirm: "このノートを削除しますか?" noteDeleteConfirm: "このノートを削除しますか?"
pinLimitExceeded: "これ以上ピン留めできません" pinLimitExceeded: "これ以上ピン留めできません"
intro: "Misskeyのインストールが完了しました管理者アカウントを作成しましょう。"
done: "完了" done: "完了"
processing: "処理中" processing: "処理中"
preview: "プレビュー" preview: "プレビュー"
@ -300,6 +300,7 @@ uploadFromUrl: "URLアップロード"
uploadFromUrlDescription: "アップロードしたいファイルのURL" uploadFromUrlDescription: "アップロードしたいファイルのURL"
uploadFromUrlRequested: "アップロードをリクエストしました" uploadFromUrlRequested: "アップロードをリクエストしました"
uploadFromUrlMayTakeTime: "アップロードが完了するまで時間がかかる場合があります。" uploadFromUrlMayTakeTime: "アップロードが完了するまで時間がかかる場合があります。"
uploadNFiles: "{n}個のファイルをアップロード"
explore: "みつける" explore: "みつける"
messageRead: "既読" messageRead: "既読"
noMoreHistory: "これより過去の履歴はありません" noMoreHistory: "これより過去の履歴はありません"
@ -577,8 +578,10 @@ showFixedPostForm: "タイムライン上部に投稿フォームを表示する
showFixedPostFormInChannel: "タイムライン上部に投稿フォームを表示する(チャンネル)" showFixedPostFormInChannel: "タイムライン上部に投稿フォームを表示する(チャンネル)"
withRepliesByDefaultForNewlyFollowed: "フォローする際、デフォルトで返信をTLに含むようにする" withRepliesByDefaultForNewlyFollowed: "フォローする際、デフォルトで返信をTLに含むようにする"
newNoteRecived: "新しいノートがあります" newNoteRecived: "新しいノートがあります"
newNote: "新しいノート"
sounds: "サウンド" sounds: "サウンド"
sound: "サウンド" sound: "サウンド"
notificationSoundSettings: "通知音の設定"
listen: "聴く" listen: "聴く"
none: "なし" none: "なし"
showInPage: "ページで表示" showInPage: "ページで表示"
@ -786,13 +789,13 @@ thisIsExperimentalFeature: "これは実験的な機能です。仕様が変更
developer: "開発者" developer: "開発者"
makeExplorable: "アカウントを見つけやすくする" makeExplorable: "アカウントを見つけやすくする"
makeExplorableDescription: "オフにすると、「みつける」にアカウントが載らなくなります。" makeExplorableDescription: "オフにすると、「みつける」にアカウントが載らなくなります。"
showGapBetweenNotesInTimeline: "タイムラインのノートを離して表示"
duplicate: "複製" duplicate: "複製"
left: "左" left: "左"
center: "中央" center: "中央"
wide: "広い" wide: "広い"
narrow: "狭い" narrow: "狭い"
reloadToApplySetting: "設定はページリロード後に反映されます。" reloadToApplySetting: "設定はページリロード後に反映されます。"
needToRestartServerToApply: "反映にはサーバーの再起動が必要です。"
showTitlebar: "タイトルバーを表示する" showTitlebar: "タイトルバーを表示する"
clearCache: "キャッシュをクリア" clearCache: "キャッシュをクリア"
onlineUsersCount: "{n}人がオンライン" onlineUsersCount: "{n}人がオンライン"
@ -999,6 +1002,7 @@ failedToUpload: "アップロード失敗"
cannotUploadBecauseInappropriate: "不適切な内容を含む可能性があると判定されたためアップロードできません。" cannotUploadBecauseInappropriate: "不適切な内容を含む可能性があると判定されたためアップロードできません。"
cannotUploadBecauseNoFreeSpace: "ドライブの空き容量が無いためアップロードできません。" cannotUploadBecauseNoFreeSpace: "ドライブの空き容量が無いためアップロードできません。"
cannotUploadBecauseExceedsFileSizeLimit: "ファイルサイズの制限を超えているためアップロードできません。" cannotUploadBecauseExceedsFileSizeLimit: "ファイルサイズの制限を超えているためアップロードできません。"
cannotUploadBecauseUnallowedFileType: "許可されていないファイル種別のためアップロードできません。"
beta: "ベータ" beta: "ベータ"
enableAutoSensitive: "自動センシティブ判定" enableAutoSensitive: "自動センシティブ判定"
enableAutoSensitiveDescription: "利用可能な場合は、機械学習を利用して自動でメディアにセンシティブフラグを設定します。この機能をオフにしても、サーバーによっては自動で設定されることがあります。" enableAutoSensitiveDescription: "利用可能な場合は、機械学習を利用して自動でメディアにセンシティブフラグを設定します。この機能をオフにしても、サーバーによっては自動で設定されることがあります。"
@ -1238,7 +1242,6 @@ showAvatarDecorations: "アイコンのデコレーションを表示"
releaseToRefresh: "離してリロード" releaseToRefresh: "離してリロード"
refreshing: "リロード中" refreshing: "リロード中"
pullDownToRefresh: "引っ張ってリロード" pullDownToRefresh: "引っ張ってリロード"
disableStreamingTimeline: "タイムラインのリアルタイム更新を無効にする"
useGroupedNotifications: "通知をグルーピング" useGroupedNotifications: "通知をグルーピング"
signupPendingError: "メールアドレスの確認中に問題が発生しました。リンクの有効期限が切れている可能性があります。" signupPendingError: "メールアドレスの確認中に問題が発生しました。リンクの有効期限が切れている可能性があります。"
cwNotationRequired: "「内容を隠す」がオンの場合は注釈の記述が必要です。" cwNotationRequired: "「内容を隠す」がオンの場合は注釈の記述が必要です。"
@ -1348,6 +1351,19 @@ readonly: "読み取り専用"
goToDeck: "デッキへ戻る" goToDeck: "デッキへ戻る"
federationJobs: "連合ジョブ" federationJobs: "連合ジョブ"
driveAboutTip: "ドライブでは、過去にアップロードしたファイルの一覧が表示されます。<br>\nートに添付する際に再利用したり、あとで投稿するファイルを予めアップロードしておくこともできます。<br>\n<b>ファイルを削除すると、今までそのファイルを使用した全ての場所(ノート、ページ、アバター、バナー等)からも見えなくなるので注意してください。</b><br>\nフォルダを作って整理することもできます。" driveAboutTip: "ドライブでは、過去にアップロードしたファイルの一覧が表示されます。<br>\nートに添付する際に再利用したり、あとで投稿するファイルを予めアップロードしておくこともできます。<br>\n<b>ファイルを削除すると、今までそのファイルを使用した全ての場所(ノート、ページ、アバター、バナー等)からも見えなくなるので注意してください。</b><br>\nフォルダを作って整理することもできます。"
scrollToClose: "スクロールして閉じる"
advice: "アドバイス"
realtimeMode: "リアルタイムモード"
turnItOn: "オンにする"
turnItOff: "オフにする"
emojiMute: "絵文字ミュート"
emojiUnmute: "絵文字ミュート解除"
muteX: "{x}をミュート"
unmuteX: "{x}のミュートを解除"
abort: "中止"
tip: "ヒントとコツ"
redisplayAllTips: "全ての「ヒントとコツ」を再表示"
hideAllTips: "全ての「ヒントとコツ」を非表示"
_chat: _chat:
noMessagesYet: "まだメッセージはありません" noMessagesYet: "まだメッセージはありません"
@ -1382,6 +1398,8 @@ _chat:
chatNotAvailableInOtherAccount: "相手のアカウントでチャット機能が使えない状態になっています。" chatNotAvailableInOtherAccount: "相手のアカウントでチャット機能が使えない状態になっています。"
cannotChatWithTheUser: "このユーザーとのチャットを開始できません" cannotChatWithTheUser: "このユーザーとのチャットを開始できません"
cannotChatWithTheUser_description: "チャットが使えない状態になっているか、相手がチャットを開放していません。" cannotChatWithTheUser_description: "チャットが使えない状態になっているか、相手がチャットを開放していません。"
youAreNotAMemberOfThisRoomButInvited: "あなたはこのルームの参加者ではありませんが、招待が届いています。参加するには、招待を承認してください。"
doYouAcceptInvitation: "招待を承認しますか?"
chatWithThisUser: "チャットする" chatWithThisUser: "チャットする"
thisUserAllowsChatOnlyFromFollowers: "このユーザーはフォロワーからのみチャットを受け付けています。" thisUserAllowsChatOnlyFromFollowers: "このユーザーはフォロワーからのみチャットを受け付けています。"
thisUserAllowsChatOnlyFromFollowing: "このユーザーは、このユーザーがフォローしているユーザーからのみチャットを受け付けています。" thisUserAllowsChatOnlyFromFollowing: "このユーザーは、このユーザーがフォローしているユーザーからのみチャットを受け付けています。"
@ -1423,10 +1441,19 @@ _settings:
makeEveryTextElementsSelectable: "全てのテキスト要素を選択可能にする" makeEveryTextElementsSelectable: "全てのテキスト要素を選択可能にする"
makeEveryTextElementsSelectable_description: "有効にすると、一部のシチュエーションでのユーザビリティが低下する場合があります。" makeEveryTextElementsSelectable_description: "有効にすると、一部のシチュエーションでのユーザビリティが低下する場合があります。"
useStickyIcons: "アイコンをスクロールに追従させる" useStickyIcons: "アイコンをスクロールに追従させる"
enableHighQualityImagePlaceholders: "高品質な画像のプレースホルダを表示"
uiAnimations: "UIのアニメーション"
showNavbarSubButtons: "ナビゲーションバーに副ボタンを表示" showNavbarSubButtons: "ナビゲーションバーに副ボタンを表示"
ifOn: "オンのとき" ifOn: "オンのとき"
ifOff: "オフのとき" ifOff: "オフのとき"
enableSyncThemesBetweenDevices: "デバイス間でインストールしたテーマを同期" enableSyncThemesBetweenDevices: "デバイス間でインストールしたテーマを同期"
enablePullToRefresh: "ひっぱって更新"
enablePullToRefresh_description: "マウスでは、ホイールを押し込みながらドラッグします。"
realtimeMode_description: "サーバーと接続を確立し、リアルタイムでコンテンツを更新します。通信量とバッテリーの消費が多くなる場合があります。"
contentsUpdateFrequency: "コンテンツの取得頻度"
contentsUpdateFrequency_description: "高いほどリアルタイムにコンテンツが更新されますが、パフォーマンスが低下し、通信量とバッテリーの消費が多くなります。"
contentsUpdateFrequency_description2: "リアルタイムモードがオンのときは、この設定に関わらずリアルタイムでコンテンツが更新されます。"
showUrlPreview: "URLプレビューを表示する"
_chat: _chat:
showSenderName: "送信者の名前を表示" showSenderName: "送信者の名前を表示"
@ -1436,6 +1463,7 @@ _preferencesProfile:
profileName: "プロファイル名" profileName: "プロファイル名"
profileNameDescription: "このデバイスを識別する名前を設定してください。" profileNameDescription: "このデバイスを識別する名前を設定してください。"
profileNameDescription2: "例: 「メインPC」、「スマホ」など" profileNameDescription2: "例: 「メインPC」、「スマホ」など"
manageProfiles: "プロファイルの管理"
_preferencesBackup: _preferencesBackup:
autoBackup: "自動バックアップ" autoBackup: "自動バックアップ"
@ -1478,6 +1506,7 @@ _delivery:
manuallySuspended: "手動停止中" manuallySuspended: "手動停止中"
goneSuspended: "サーバー削除のため停止中" goneSuspended: "サーバー削除のため停止中"
autoSuspendedForNotResponding: "サーバー応答なしのため停止中" autoSuspendedForNotResponding: "サーバー応答なしのため停止中"
softwareSuspended: "配信停止中のソフトウェアであるため停止中"
_bubbleGame: _bubbleGame:
howToPlay: "遊び方" howToPlay: "遊び方"
@ -1616,6 +1645,24 @@ _serverSettings:
openRegistration: "アカウントの作成をオープンにする" openRegistration: "アカウントの作成をオープンにする"
openRegistrationWarning: "登録を開放することはリスクが伴います。サーバーを常に監視し、トラブルが発生した際にすぐに対応できる体制がある場合のみオンにすることを推奨します。" openRegistrationWarning: "登録を開放することはリスクが伴います。サーバーを常に監視し、トラブルが発生した際にすぐに対応できる体制がある場合のみオンにすることを推奨します。"
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "一定期間モデレーターのアクティビティが検出されなかった場合、スパム防止のためこの設定は自動でオフになります。" thisSettingWillAutomaticallyOffWhenModeratorsInactive: "一定期間モデレーターのアクティビティが検出されなかった場合、スパム防止のためこの設定は自動でオフになります。"
deliverSuspendedSoftware: "配信停止中のソフトウェア"
deliverSuspendedSoftwareDescription: "脆弱性などの理由で、サーバーのソフトウェアの名前及びバージョンの範囲を指定して配信を停止できます。このバージョン情報はサーバーが提供したものであり、信頼性は保証されません。バージョン指定には semver の範囲指定が使用できますが、>= 2024.3.1 と指定すると 2024.3.1-custom.0 のようなカスタムバージョンが含まれないため、>= 2024.3.1-0 のように prerelease の指定を行うことを推奨します。"
singleUserMode: "お一人様モード"
singleUserMode_description: "このサーバーを利用するのが自分だけの場合、このモードを有効にすることで動作が最適化されます。"
signToActivityPubGet: "GETリクエストに署名する"
signToActivityPubGet_description: "通常は有効にしてください。連合の通信に関する問題がある場合に、無効にすると改善することがありますが、逆にサーバーによっては通信が不可になることがあります。"
proxyRemoteFiles: "リモートファイルをプロキシする"
proxyRemoteFiles_description: "有効にすると、リモートのファイルをプロキシして提供します。画像のサムネイル生成やユーザーのプライバシー保護に役立ちます。"
allowExternalApRedirect: "ActivityPub経由の照会にリダイレクトを許可する"
allowExternalApRedirect_description: "有効にすると、他のサーバーがこのサーバーを通して第三者のコンテンツを照会することが可能になりますが、コンテンツのなりすましが発生する可能性があります。"
userGeneratedContentsVisibilityForVisitor: "非利用者に対するユーザー作成コンテンツの公開範囲"
userGeneratedContentsVisibilityForVisitor_description: "モデレーションが行き届きにくい不適切なリモートコンテンツなどが、自サーバー経由で図らずもインターネットに公開されてしまうことによるトラブル防止などに役立ちます。"
userGeneratedContentsVisibilityForVisitor_description2: "サーバーで受信したリモートのコンテンツを含め、サーバー内の全てのコンテンツを無条件でインターネットに公開することはリスクが伴います。特に、分散型の特性を知らない閲覧者にとっては、リモートのコンテンツであってもサーバー内で作成されたコンテンツであると誤って認識してしまう可能性があるため、注意が必要です。"
_userGeneratedContentsVisibilityForVisitor:
all: "全て公開"
localOnly: "ローカルコンテンツのみ公開し、リモートコンテンツは非公開"
none: "全て非公開"
_accountMigration: _accountMigration:
moveFrom: "別のアカウントからこのアカウントに移行" moveFrom: "別のアカウントからこのアカウントに移行"
@ -1959,6 +2006,8 @@ _role:
canImportMuting: "ミュートのインポートを許可" canImportMuting: "ミュートのインポートを許可"
canImportUserLists: "リストのインポートを許可" canImportUserLists: "リストのインポートを許可"
chatAvailability: "チャットを許可" chatAvailability: "チャットを許可"
uploadableFileTypes: "アップロード可能なファイル種別"
uploadableFileTypes_caption: "MIMEタイプを指定します。改行で区切って複数指定できるほか、アスタリスク(*)でワイルドカード指定できます。(例: image/*)"
_condition: _condition:
roleAssignedTo: "マニュアルロールにアサイン済み" roleAssignedTo: "マニュアルロールにアサイン済み"
isLocal: "ローカルユーザー" isLocal: "ローカルユーザー"
@ -2198,7 +2247,6 @@ _theme:
buttonBg: "ボタンの背景" buttonBg: "ボタンの背景"
buttonHoverBg: "ボタンの背景 (ホバー)" buttonHoverBg: "ボタンの背景 (ホバー)"
inputBorder: "入力ボックスの縁取り" inputBorder: "入力ボックスの縁取り"
driveFolderBg: "ドライブフォルダーの背景"
badge: "バッジ" badge: "バッジ"
messageBg: "チャットの背景" messageBg: "チャットの背景"
fgHighlighted: "強調された文字" fgHighlighted: "強調された文字"
@ -2872,9 +2920,12 @@ _dataSaver:
_avatar: _avatar:
title: "アイコン画像のアニメーションを無効化" title: "アイコン画像のアニメーションを無効化"
description: "アイコン画像のアニメーションが停止します。アニメーション画像は通常の画像よりファイルサイズが大きいことがあるので、データ通信量をさらに削減できます。" description: "アイコン画像のアニメーションが停止します。アニメーション画像は通常の画像よりファイルサイズが大きいことがあるので、データ通信量をさらに削減できます。"
_urlPreview: _urlPreviewThumbnail:
title: "URLプレビューのサムネイルを非表示" title: "URLプレビューのサムネイルを非表示"
description: "URLプレビューのサムネイル画像が読み込まれなくなります。" description: "URLプレビューのサムネイル画像が読み込まれなくなります。"
_disableUrlPreview:
title: "URLプレビューを無効化"
description: "URLプレビュー機能を無効化します。サムネイル画像だけと違い、リンク先の情報の読み込み自体を削減できます。"
_code: _code:
title: "コードハイライトを非表示" title: "コードハイライトを非表示"
description: "MFMなどでコードハイライト記法が使われている場合、タップするまで読み込まれなくなります。コードハイライトではハイライトする言語ごとにその定義ファイルを読み込む必要がありますが、それらが自動で読み込まれなくなるため、通信量の削減が見込めます。" description: "MFMなどでコードハイライト記法が使われている場合、タップするまで読み込まれなくなります。コードハイライトではハイライトする言語ごとにその定義ファイルを読み込む必要がありますが、それらが自動で読み込まれなくなるため、通信量の削減が見込めます。"
@ -3014,10 +3065,6 @@ _customEmojisManager:
uploadSettingDescription: "この画面で絵文字アップロードを行う際の動作を設定できます。" uploadSettingDescription: "この画面で絵文字アップロードを行う際の動作を設定できます。"
directoryToCategoryLabel: "ディレクトリ名を\"category\"に入力する" directoryToCategoryLabel: "ディレクトリ名を\"category\"に入力する"
directoryToCategoryCaption: "ディレクトリをドラッグ・ドロップした時に、ディレクトリ名を\"category\"に入力します。" directoryToCategoryCaption: "ディレクトリをドラッグ・ドロップした時に、ディレクトリ名を\"category\"に入力します。"
emojiInputAreaCaption: "いずれかの方法で登録する絵文字を選択してください。"
emojiInputAreaList1: "この枠に画像ファイルまたはディレクトリをドラッグ&ドロップ"
emojiInputAreaList2: "このリンクをクリックしてPCから選択する"
emojiInputAreaList3: "このリンクをクリックしてドライブから選択する"
confirmRegisterEmojisDescription: "リストに表示されている絵文字を新たなカスタム絵文字として登録します。よろしいですか?(負荷を避けるため、一度の操作で登録可能な絵文字は{count}件までです)" confirmRegisterEmojisDescription: "リストに表示されている絵文字を新たなカスタム絵文字として登録します。よろしいですか?(負荷を避けるため、一度の操作で登録可能な絵文字は{count}件までです)"
confirmClearEmojisDescription: "編集内容を破棄し、リストに表示されている絵文字をクリアします。よろしいですか?" confirmClearEmojisDescription: "編集内容を破棄し、リストに表示されている絵文字をクリアします。よろしいですか?"
confirmUploadEmojisDescription: "ドラッグ&ドロップされた{count}個のファイルをドライブにアップロードします。実行しますか?" confirmUploadEmojisDescription: "ドラッグ&ドロップされた{count}個のファイルをドライブにアップロードします。実行しますか?"
@ -3100,3 +3147,70 @@ _search:
pleaseEnterServerHost: "サーバーのホストを入力してください" pleaseEnterServerHost: "サーバーのホストを入力してください"
pleaseSelectUser: "ユーザーを選択してください" pleaseSelectUser: "ユーザーを選択してください"
serverHostPlaceholder: "例: misskey.example.com" serverHostPlaceholder: "例: misskey.example.com"
_serverSetupWizard:
installCompleted: "Misskeyのインストールが完了しました"
firstCreateAccount: "まずは、管理者アカウントを作成しましょう。"
accountCreated: "管理者アカウントが作成されました!"
serverSetting: "サーバーの設定"
youCanEasilyConfigureOptimalServerSettingsWithThisWizard: "このウィザードで簡単に最適なサーバーの設定が行えます。"
settingsYouMakeHereCanBeChangedLater: "ここでの設定は、あとからでも変更できます。"
howWillYouUseMisskey: "Misskeyをどのように使いますか"
_use:
single: "お一人様サーバー"
single_description: "自分専用のサーバーとして、一人で使う"
single_youCanCreateMultipleAccounts: "お一人様サーバーとして運用する場合でも、アカウントは必要に応じて複数作成可能です。"
group: "グループサーバー"
group_description: "信頼できる他の利用者を招待して、複数人で使う"
open: "オープンサーバー"
open_description: "不特定多数の利用者を受け入れる運営を行う"
openServerAdvice: "不特定多数の利用者を受け入れることはリスクが伴います。トラブルに対処できるよう、確実なモデレーション体制で運営することを推奨します。"
openServerAntiSpamAdvice: "自サーバーがスパムの踏み台にならないように、reCAPTCHAといったアンチボット機能を有効にするなど、セキュリティについても細心の注意が必要です。"
howManyUsersDoYouExpect: "どれくらいの人数を想定していますか?"
_scale:
small: "100人以下 (小規模)"
medium: "100人以上1000人以下 (中規模)"
large: "1000人以上 (大規模)"
largeScaleServerAdvice: "大規模なサーバーでは、ロードバランシングやデータベースのレプリケーションなど、高度なインフラストラクチャーの知識が必要になる場合があります。"
doYouConnectToFediverse: "Fediverseと接続しますか"
doYouConnectToFediverse_description1: "分散型サーバーで構成されるネットワーク(Fediverse)に接続すると、他のサーバーと相互にコンテンツのやり取りが可能です。"
doYouConnectToFediverse_description2: "Fediverseと接続することは「連合」とも呼ばれます。"
youCanConfigureMoreFederationSettingsLater: "連合可能なサーバーの指定など、高度な設定も後ほど可能です。"
adminInfo: "管理者情報"
adminInfo_description: "問い合わせを受け付けるために使用される管理者情報を設定します。"
adminInfo_mustBeFilled: "オープンサーバー、または連合がオンの場合は必ず入力が必要です。"
followingSettingsAreRecommended: "以下の設定が推奨されます"
applyTheseSettings: "この設定を適用"
skipSettings: "設定をスキップ"
settingsCompleted: "設定が完了しました!"
settingsCompleted_description: "お疲れ様でした。準備が整ったので、さっそくサーバーの使用を開始できます。"
settingsCompleted_description2: "詳細なサーバー設定は、「コントロールパネル」から行えます。"
donationRequest: "寄付のお願い"
_donationRequest:
text1: "Misskeyは有志によって開発されている無料のソフトウェアです。"
text2: "今後も開発を続けられるように、よろしければぜひカンパをお願いいたします。"
text3: "支援者向け特典もあります!"
_uploader:
compressedToX: "{x}に圧縮"
savedXPercent: "{x}%節約"
abortConfirm: "アップロードされていないファイルがありますが、中止しますか?"
doneConfirm: "アップロードされていないファイルがありますが、完了しますか?"
maxFileSizeIsX: "アップロード可能な最大ファイルサイズは{x}です。"
allowedTypes: "アップロード可能なファイル種別"
tip: "ファイルはまだアップロードされていません。このダイアログで、アップロード前の確認・リネーム・圧縮・クロッピングなどが行えます。準備が出来たら、「アップロード」ボタンを押してアップロードを開始できます。"
_clientPerformanceIssueTip:
title: "バッテリー消費が多いと感じたら"
makeSureDisabledAdBlocker: "アドブロッカーを無効にしてください"
makeSureDisabledAdBlocker_description: "アドブロッカーはパフォーマンスに影響を及ぼすことがあります。OSの機能やブラウザの機能・アドオンなどでアドブロッカーが有効になっていないか確認してください。"
makeSureDisabledCustomCss: "カスタムCSSを無効にしてください"
makeSureDisabledCustomCss_description: "スタイルを上書きするとパフォーマンスに影響を及ぼすことがあります。カスタムCSSや、スタイルを上書きする拡張機能が有効になっていないか確認してください。"
makeSureDisabledAddons: "拡張機能を無効にしてください"
makeSureDisabledAddons_description: "一部の拡張機能はクライアントの動作に干渉しパフォーマンスに影響を及ぼすことがあります。ブラウザの拡張機能を無効にして改善するか確認してください。"
_clip:
tip: "クリップは、ノートをまとめることができる機能です。"
_userLists:
tip: "任意のユーザーが含まれるリストを作成できます。作成したリストはタイムラインとして表示可能です。"

View File

@ -234,7 +234,7 @@ clearQueue: "キューをほかす"
clearQueueConfirmTitle: "キューをほかしとこか?" clearQueueConfirmTitle: "キューをほかしとこか?"
clearQueueConfirmText: "未配達の投稿は配送されんなるで。ふつうこの操作を行う必要は無いんやけどな。" clearQueueConfirmText: "未配達の投稿は配送されんなるで。ふつうこの操作を行う必要は無いんやけどな。"
clearCachedFiles: "キャッシュをほかす" clearCachedFiles: "キャッシュをほかす"
clearCachedFilesConfirm: "キャッシュされとるリモートファイルをみんなほかしてええか?" clearCachedFilesConfirm: "キャッシュされとるリモートファイルを全部ほかしてええか?"
blockedInstances: "ブロックしたサーバー" blockedInstances: "ブロックしたサーバー"
blockedInstancesDescription: "ブロックしたいサーバーのホストを改行で区切って設定してな。ブロックされてもうたサーバーとはもう金輪際やり取りできひんくなるで。" blockedInstancesDescription: "ブロックしたいサーバーのホストを改行で区切って設定してな。ブロックされてもうたサーバーとはもう金輪際やり取りできひんくなるで。"
silencedInstances: "サーバーサイレンスされてんねん" silencedInstances: "サーバーサイレンスされてんねん"
@ -250,7 +250,6 @@ noUsers: "ユーザーはおらん"
editProfile: "プロフィールをいじる" editProfile: "プロフィールをいじる"
noteDeleteConfirm: "このノートをほかしてええか?" noteDeleteConfirm: "このノートをほかしてええか?"
pinLimitExceeded: "これ以上ピン留めできひん" pinLimitExceeded: "これ以上ピン留めできひん"
intro: "Misskeyのインストールが完了したで管理者アカウントを作ってや。"
done: "でけた" done: "でけた"
processing: "処理しとる" processing: "処理しとる"
preview: "プレビュー" preview: "プレビュー"
@ -781,7 +780,6 @@ thisIsExperimentalFeature: "これは実験的な機能やから、仕様が変
developer: "開発者やで" developer: "開発者やで"
makeExplorable: "アカウントを見つけやすくするで" makeExplorable: "アカウントを見つけやすくするで"
makeExplorableDescription: "オフにすると、「みつける」にアカウントが載らんくなるで。" makeExplorableDescription: "オフにすると、「みつける」にアカウントが載らんくなるで。"
showGapBetweenNotesInTimeline: "タイムラインのノートを離して表示するで"
duplicate: "複製" duplicate: "複製"
left: "左" left: "左"
center: "真ん中" center: "真ん中"
@ -1233,7 +1231,6 @@ showAvatarDecorations: "アイコンのデコレーション映す"
releaseToRefresh: "離したらリロード" releaseToRefresh: "離したらリロード"
refreshing: "リロードしとる" refreshing: "リロードしとる"
pullDownToRefresh: "引っ張ってリロードするで" pullDownToRefresh: "引っ張ってリロードするで"
disableStreamingTimeline: "タイムラインのリアルタイム更新をやめるで"
useGroupedNotifications: "通知をグループ分けして出すで" useGroupedNotifications: "通知をグループ分けして出すで"
signupPendingError: "メアド確認してたらなんか変なことなったわ。リンクの期限切れてるかもしれん。" signupPendingError: "メアド確認してたらなんか変なことなったわ。リンクの期限切れてるかもしれん。"
cwNotationRequired: "「内容を隠す」んやったら注釈書かなアカンで。" cwNotationRequired: "「内容を隠す」んやったら注釈書かなアカンで。"
@ -2028,7 +2025,6 @@ _theme:
buttonBg: "ボタンの背景" buttonBg: "ボタンの背景"
buttonHoverBg: "ボタンの背景 (ホバー)" buttonHoverBg: "ボタンの背景 (ホバー)"
inputBorder: "入力ボックスの縁取り" inputBorder: "入力ボックスの縁取り"
driveFolderBg: "ドライブフォルダーの背景"
badge: "バッジ" badge: "バッジ"
messageBg: "チャットの背景" messageBg: "チャットの背景"
fgHighlighted: "強調されとる文字" fgHighlighted: "強調されとる文字"
@ -2651,9 +2647,6 @@ _dataSaver:
_avatar: _avatar:
title: "アイコンの絵" title: "アイコンの絵"
description: "アイコン画像のアニメが止まるで。普通の画像よりもデータ量がでかいから、もっと通信量を節約できるねん。" description: "アイコン画像のアニメが止まるで。普通の画像よりもデータ量がでかいから、もっと通信量を節約できるねん。"
_urlPreview:
title: "URLプレビューのサムネイル画像"
description: "URLプレビューのサムネイル画像が読み込まへんなるで。"
_code: _code:
title: "コードハイライト" title: "コードハイライト"
description: "MFMとかでコードハイライト記法が使われてるとき、タップするまで読み込まれへんくなるで。コードハイライトではハイライトする言語ごとにその決めてるファイルを読む必要はあんねんな。けどな、それは自動で読み込まれなくなるから、通信量を少なくできることができるねん。" description: "MFMとかでコードハイライト記法が使われてるとき、タップするまで読み込まれへんくなるで。コードハイライトではハイライトする言語ごとにその決めてるファイルを読む必要はあんねんな。けどな、それは自動で読み込まれなくなるから、通信量を少なくできることができるねん。"
@ -2784,10 +2777,6 @@ _customEmojisManager:
uploadSettingDescription: "この画面で絵文字アップロードするときの動きを設定できるで。" uploadSettingDescription: "この画面で絵文字アップロードするときの動きを設定できるで。"
directoryToCategoryLabel: "ディレクトリ名を\"category\"に入力する" directoryToCategoryLabel: "ディレクトリ名を\"category\"に入力する"
directoryToCategoryCaption: "ディレクトリをドラッグ・ドロップした時に、ディレクトリ名を\"category\"に入力します。" directoryToCategoryCaption: "ディレクトリをドラッグ・ドロップした時に、ディレクトリ名を\"category\"に入力します。"
emojiInputAreaCaption: "どれかの方法で登録する絵文字を選択して。"
emojiInputAreaList1: "この枠に画像ファイルかディレクトリをドラッグ&ドロップ"
emojiInputAreaList2: "このリンクをクリックしてPCから選択する"
emojiInputAreaList3: "このリンクをクリックしてドライブから選択する"
confirmRegisterEmojisDescription: "リストに表示されてる絵文字を新たなカスタム絵文字として登録するで。ほんまにええか? (サーバーがしんどくなるから、一回で登録できる絵文字は{count}件までやで)" confirmRegisterEmojisDescription: "リストに表示されてる絵文字を新たなカスタム絵文字として登録するで。ほんまにええか? (サーバーがしんどくなるから、一回で登録できる絵文字は{count}件までやで)"
confirmClearEmojisDescription: "編集内容をほかして、リストに表示されている絵文字をクリアするで。ほんまにええか?" confirmClearEmojisDescription: "編集内容をほかして、リストに表示されている絵文字をクリアするで。ほんまにええか?"
confirmUploadEmojisDescription: "ドラッグ&ドロップされた{count}個のファイルをドライブにアップロードするで。ほんまにええか?" confirmUploadEmojisDescription: "ドラッグ&ドロップされた{count}個のファイルをドライブにアップロードするで。ほんまにええか?"

View File

@ -224,7 +224,6 @@ noUsers: "사용자가 어ᇝ십니다"
editProfile: "프로필 적기" editProfile: "프로필 적기"
noteDeleteConfirm: "요 노트럴 뭉캡니꺼?" noteDeleteConfirm: "요 노트럴 뭉캡니꺼?"
pinLimitExceeded: "더 몬 붙입니다" pinLimitExceeded: "더 몬 붙입니다"
intro: "Misskey럴 다 깔앗십니다! 간리자 게정얼 맨걸어 보입시다."
done: "햇어예" done: "햇어예"
processing: "처리하고 잇어예" processing: "처리하고 잇어예"
preview: "미리보기" preview: "미리보기"

View File

@ -220,6 +220,7 @@ silenceThisInstance: "서버를 사일런스"
mediaSilenceThisInstance: "서버의 미디어를 사일런스" mediaSilenceThisInstance: "서버의 미디어를 사일런스"
operations: "작업" operations: "작업"
software: "소프트웨어" software: "소프트웨어"
softwareName: "소프트웨어 이름"
version: "버전" version: "버전"
metadata: "메타데이터" metadata: "메타데이터"
withNFiles: "{n}개의 파일" withNFiles: "{n}개의 파일"
@ -250,7 +251,6 @@ noUsers: "아무도 없습니다"
editProfile: "프로필 수정" editProfile: "프로필 수정"
noteDeleteConfirm: "이 노트를 삭제하시겠습니까?" noteDeleteConfirm: "이 노트를 삭제하시겠습니까?"
pinLimitExceeded: "더 이상 고정할 수 없습니다." pinLimitExceeded: "더 이상 고정할 수 없습니다."
intro: "Misskey의 설치가 완료되었습니다! 관리자 계정을 생성해주세요."
done: "완료" done: "완료"
processing: "처리중" processing: "처리중"
preview: "미리보기" preview: "미리보기"
@ -784,7 +784,6 @@ thisIsExperimentalFeature: "이 기능은 실험적인 기능입니다. 사양
developer: "개발자" developer: "개발자"
makeExplorable: "계정을 쉽게 발견하도록 하기" makeExplorable: "계정을 쉽게 발견하도록 하기"
makeExplorableDescription: "비활성화하면 \"발견하기\"에 나의 계정을 표시하지 않습니다." makeExplorableDescription: "비활성화하면 \"발견하기\"에 나의 계정을 표시하지 않습니다."
showGapBetweenNotesInTimeline: "타임라인의 노트 사이를 띄워서 표시"
duplicate: "복제" duplicate: "복제"
left: "왼쪽" left: "왼쪽"
center: "가운데" center: "가운데"
@ -1237,7 +1236,6 @@ showAvatarDecorations: "아바타 장식 표시"
releaseToRefresh: "놓아서 새로고침" releaseToRefresh: "놓아서 새로고침"
refreshing: "새로고침 중" refreshing: "새로고침 중"
pullDownToRefresh: "아래로 내려서 새로고침" pullDownToRefresh: "아래로 내려서 새로고침"
disableStreamingTimeline: "타임라인의 실시간 갱신을 무효화하기"
useGroupedNotifications: "알림을 그룹화하고 표시" useGroupedNotifications: "알림을 그룹화하고 표시"
signupPendingError: "메일 주소 확인중에 문제가 발생했습니다. 링크의 유효기간이 지났을 가능성이 있습니다." signupPendingError: "메일 주소 확인중에 문제가 발생했습니다. 링크의 유효기간이 지났을 가능성이 있습니다."
cwNotationRequired: "'내용을 숨기기'를 체크한 경우 주석을 써야 합니다." cwNotationRequired: "'내용을 숨기기'를 체크한 경우 주석을 써야 합니다."
@ -1346,6 +1344,8 @@ settingsMigrating: "설정을 이전하는 중입니다. 잠시 기다려주십
readonly: "읽기 전용" readonly: "읽기 전용"
goToDeck: "덱으로 돌아가기" goToDeck: "덱으로 돌아가기"
federationJobs: "연합 작업" federationJobs: "연합 작업"
driveAboutTip: "드라이브는 이전에 업로드한 파일 목록을 표시해요. <br>\n노트에 첨부할 때 다시 사용하거나 나중에 게시할 파일을 미리 업로드할 수 있어요. <br>\n<b>파일을 삭제하면, 지금까지 그 파일을 사용한 모든 장소(노트, 페이지, 아바타, 배너 등)에서도 보이지 않게 되므로 주의해 주세요. 폴더를 만들고 정리할 수도 있어요.</b><br>"
scrollToClose: "스크롤하여 닫기"
_chat: _chat:
noMessagesYet: "아직 메시지가 없습니다" noMessagesYet: "아직 메시지가 없습니다"
newMessage: "새로운 메시지" newMessage: "새로운 메시지"
@ -1422,6 +1422,8 @@ _settings:
ifOn: "켜져 있을 때" ifOn: "켜져 있을 때"
ifOff: "꺼져 있을 때" ifOff: "꺼져 있을 때"
enableSyncThemesBetweenDevices: "기기 간 설치한 테마 동기화" enableSyncThemesBetweenDevices: "기기 간 설치한 테마 동기화"
enablePullToRefresh: "계속해서 갱신"
enablePullToRefresh_description: "마우스에서 휠을 누르면서 드래그해요."
_chat: _chat:
showSenderName: "발신자 이름 표시" showSenderName: "발신자 이름 표시"
sendOnEnter: "엔터로 보내기" sendOnEnter: "엔터로 보내기"
@ -1429,6 +1431,7 @@ _preferencesProfile:
profileName: "프로필 이름" profileName: "프로필 이름"
profileNameDescription: "이 디바이스를 식별할 이름을 설정해 주세요." profileNameDescription: "이 디바이스를 식별할 이름을 설정해 주세요."
profileNameDescription2: "예: '메인PC', '스마트폰' 등" profileNameDescription2: "예: '메인PC', '스마트폰' 등"
manageProfiles: "프로파일 관리"
_preferencesBackup: _preferencesBackup:
autoBackup: "자동 백업" autoBackup: "자동 백업"
restoreFromBackup: "백업으로 복구" restoreFromBackup: "백업으로 복구"
@ -1467,6 +1470,7 @@ _delivery:
manuallySuspended: "수동 정지 중" manuallySuspended: "수동 정지 중"
goneSuspended: "서버 삭제를 이유로 정지 중" goneSuspended: "서버 삭제를 이유로 정지 중"
autoSuspendedForNotResponding: "서버 응답 없음을 이유로 정지 중" autoSuspendedForNotResponding: "서버 응답 없음을 이유로 정지 중"
softwareSuspended: "전달 정지 중인 소프트웨어이므로 정지 중"
_bubbleGame: _bubbleGame:
howToPlay: "설명" howToPlay: "설명"
hold: "홀드" hold: "홀드"
@ -1598,6 +1602,8 @@ _serverSettings:
openRegistration: "회원 가입을 활성화 하기" openRegistration: "회원 가입을 활성화 하기"
openRegistrationWarning: "회원 가입을 개방하는 것은 리스크가 따릅니다. 서버를 항상 감시할 수 있고, 문제가 발생했을 때 바로 대응할 수 있는 상태에서만 활성화 하는 것을 권장합니다." openRegistrationWarning: "회원 가입을 개방하는 것은 리스크가 따릅니다. 서버를 항상 감시할 수 있고, 문제가 발생했을 때 바로 대응할 수 있는 상태에서만 활성화 하는 것을 권장합니다."
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "일정 기간동안 모더레이터의 활동이 감지되지 않는 경우, 스팸 방지를 위해 이 설정은 자동으로 꺼집니다." thisSettingWillAutomaticallyOffWhenModeratorsInactive: "일정 기간동안 모더레이터의 활동이 감지되지 않는 경우, 스팸 방지를 위해 이 설정은 자동으로 꺼집니다."
deliverSuspendedSoftware: "전달 정지 중인 소프트웨어"
deliverSuspendedSoftwareDescription: "취약성 등의 이유로 서버의 소프트웨어 이름 및 버전 범위를 지정하여 전달을 정지할 수 있어요. 이 버전 정보는 서버가 제공한 것이며 신뢰성은 보장되지 않아요. 버전 지정에는 semver의 범위 지정을 사용할 수 있지만, >= 2024.3.1로 지정하면 2024.3.1-custom.0과 같은 custom.0과 같은 custom 버전이 포함되지 않기 때문에 >= 2024.3.1-0과 같이 prerelease를 지정하는 것이 좋아요."
_accountMigration: _accountMigration:
moveFrom: "다른 계정에서 이 계정으로 이사" moveFrom: "다른 계정에서 이 계정으로 이사"
moveFromSub: "다른 계정에 대한 별칭을 생성" moveFromSub: "다른 계정에 대한 별칭을 생성"
@ -1915,6 +1921,7 @@ _role:
canManageCustomEmojis: "커스텀 이모지 관리" canManageCustomEmojis: "커스텀 이모지 관리"
canManageAvatarDecorations: "아바타 꾸미기 관리" canManageAvatarDecorations: "아바타 꾸미기 관리"
driveCapacity: "드라이브 용량" driveCapacity: "드라이브 용량"
maxFileSize: "업로드 가능한 최대 파일 크기"
alwaysMarkNsfw: "파일을 항상 NSFW로 지정" alwaysMarkNsfw: "파일을 항상 NSFW로 지정"
canUpdateBioMedia: "아바타 및 배너 이미지 변경 허용" canUpdateBioMedia: "아바타 및 배너 이미지 변경 허용"
pinMax: "고정할 수 있는 노트 수" pinMax: "고정할 수 있는 노트 수"
@ -2154,7 +2161,6 @@ _theme:
buttonBg: "버튼 배경" buttonBg: "버튼 배경"
buttonHoverBg: "버튼 배경 (호버)" buttonHoverBg: "버튼 배경 (호버)"
inputBorder: "입력 필드 테두리" inputBorder: "입력 필드 테두리"
driveFolderBg: "드라이브 폴더 배경"
badge: "배지" badge: "배지"
messageBg: "대화 배경" messageBg: "대화 배경"
fgHighlighted: "강조된 텍스트" fgHighlighted: "강조된 텍스트"
@ -2790,9 +2796,6 @@ _dataSaver:
_avatar: _avatar:
title: "아이콘 이미지" title: "아이콘 이미지"
description: "아이콘 이미지의 애니메이션을 멈춥니다. 애니메이션 이미지는 일반 이미지보다 파일 크기가 클 수 있으므로 데이터 사용량을 더 줄일 수 있습니다." description: "아이콘 이미지의 애니메이션을 멈춥니다. 애니메이션 이미지는 일반 이미지보다 파일 크기가 클 수 있으므로 데이터 사용량을 더 줄일 수 있습니다."
_urlPreview:
title: "URL 미리보기의 섬네일"
description: "URL 미리보기의 섬네일 이미지를 불러오지 않게 됩니다."
_code: _code:
title: "문자열 강조" title: "문자열 강조"
description: "MFM 등으로 문자열 강조 기법을 사용할 때 누르기 전에는 불러오지 않습니다. 문자열 강조에서는 강조할 언어마다 그 정의 파일을 불러와야 하지만 이를 자동으로 불러오지 않으므로 데이터 사용량을 줄일 수 있습니다." description: "MFM 등으로 문자열 강조 기법을 사용할 때 누르기 전에는 불러오지 않습니다. 문자열 강조에서는 강조할 언어마다 그 정의 파일을 불러와야 하지만 이를 자동으로 불러오지 않으므로 데이터 사용량을 줄일 수 있습니다."
@ -2923,10 +2926,6 @@ _customEmojisManager:
uploadSettingDescription: "여기서 이모지를 업로드 할 때의 동작을 설정할 수 있습니다." uploadSettingDescription: "여기서 이모지를 업로드 할 때의 동작을 설정할 수 있습니다."
directoryToCategoryLabel: "디렉토리 이름을 \"category\"로 입력하기" directoryToCategoryLabel: "디렉토리 이름을 \"category\"로 입력하기"
directoryToCategoryCaption: "디렉토리를 드래그 앤 드롭한 경우, 디렉토리 이름을 \"category\"로 입력합니다." directoryToCategoryCaption: "디렉토리를 드래그 앤 드롭한 경우, 디렉토리 이름을 \"category\"로 입력합니다."
emojiInputAreaCaption: "이모지를 등록할 방법을 선택해주세요."
emojiInputAreaList1: "이 틀 안에 이미지 파일 또는 디렉토리를 끌어서 가져오기"
emojiInputAreaList2: "이 링크를 클릭해서 PC에서 선택하기"
emojiInputAreaList3: "이 링크를 클릭해서 드라이브에서 선택하기"
confirmRegisterEmojisDescription: "리스트에 표시되어진 이모지를 새로운 커스텀 이모지로 등록합니다. 실행할까요? (부하를 피하기 위해, 한 번에 등록할 수 있는 이모지는 {count}건까지 입니다.)" confirmRegisterEmojisDescription: "리스트에 표시되어진 이모지를 새로운 커스텀 이모지로 등록합니다. 실행할까요? (부하를 피하기 위해, 한 번에 등록할 수 있는 이모지는 {count}건까지 입니다.)"
confirmClearEmojisDescription: "편집 내용을 지우고, 목록에 표시되어진 이모지를 지웁니다. 실행할까요?" confirmClearEmojisDescription: "편집 내용을 지우고, 목록에 표시되어진 이모지를 지웁니다. 실행할까요?"
confirmUploadEmojisDescription: "드래그 앤 드롭한 {count}개의 파일을 드라이브에 업로드 합니다. 실행할까요?" confirmUploadEmojisDescription: "드래그 앤 드롭한 {count}개의 파일을 드라이브에 업로드 합니다. 실행할까요?"

View File

@ -250,7 +250,6 @@ noUsers: "Er zijn geen gebruikers."
editProfile: "Bewerk Profiel" editProfile: "Bewerk Profiel"
noteDeleteConfirm: "Ben je zeker dat je dit bericht wil verwijderen?" noteDeleteConfirm: "Ben je zeker dat je dit bericht wil verwijderen?"
pinLimitExceeded: "Je kunt geen berichten meer vastprikken" pinLimitExceeded: "Je kunt geen berichten meer vastprikken"
intro: "Installatie van Misskey geëindigd! Maak nu een beheerder aan."
done: "Klaar" done: "Klaar"
processing: "Bezig met verwerken" processing: "Bezig met verwerken"
preview: "Voorbeeld" preview: "Voorbeeld"
@ -784,7 +783,6 @@ thisIsExperimentalFeature: "Dit is een experimentele functie. De functionaliteit
developer: "Ontwikkelaar" developer: "Ontwikkelaar"
makeExplorable: "Gebruikersaccount zichtbaar maken in “Verkennen”" makeExplorable: "Gebruikersaccount zichtbaar maken in “Verkennen”"
makeExplorableDescription: "Als deze optie is uitgeschakeld, is uw gebruikersaccount niet zichtbaar in het gedeelte “Verkennen”." makeExplorableDescription: "Als deze optie is uitgeschakeld, is uw gebruikersaccount niet zichtbaar in het gedeelte “Verkennen”."
showGapBetweenNotesInTimeline: "Een gat tussen noten op de tijdlijn weergeven"
duplicate: "Dupliceren" duplicate: "Dupliceren"
left: "Links" left: "Links"
center: "Center" center: "Center"

View File

@ -171,7 +171,6 @@ noUsers: "Det er ingen brukere"
editProfile: "Rediger profil" editProfile: "Rediger profil"
noteDeleteConfirm: "Er du sikker på at du vil slette denne Noten?" noteDeleteConfirm: "Er du sikker på at du vil slette denne Noten?"
pinLimitExceeded: "Du kan ikke feste flere." pinLimitExceeded: "Du kan ikke feste flere."
intro: "Installasjonen av Misskey er ferdig! Vennligst opprett en administratorkonto."
done: "Ferdig" done: "Ferdig"
default: "Standard" default: "Standard"
defaultValueIs: "Standard: {value}" defaultValueIs: "Standard: {value}"

View File

@ -230,7 +230,6 @@ noUsers: "Brak użytkowników"
editProfile: "Edytuj profil" editProfile: "Edytuj profil"
noteDeleteConfirm: "Czy na pewno chcesz usunąć ten wpis?" noteDeleteConfirm: "Czy na pewno chcesz usunąć ten wpis?"
pinLimitExceeded: "Nie możesz przypiąć więcej wpisów." pinLimitExceeded: "Nie możesz przypiąć więcej wpisów."
intro: "Zakończono instalację Misskey! Utwórz konto administratora."
done: "Gotowe" done: "Gotowe"
processing: "Przetwarzanie" processing: "Przetwarzanie"
preview: "Podgląd" preview: "Podgląd"
@ -749,7 +748,6 @@ thisIsExperimentalFeature: "Ta funkcja jest eksperymentalna. Jej funkcjonalnoś
developer: "Programista" developer: "Programista"
makeExplorable: "Pokazuj konto na stronie „Eksploruj”" makeExplorable: "Pokazuj konto na stronie „Eksploruj”"
makeExplorableDescription: "Jeżeli wyłączysz tę opcję, Twoje konto nie będzie wyświetlać się w sekcji „Eksploruj”." makeExplorableDescription: "Jeżeli wyłączysz tę opcję, Twoje konto nie będzie wyświetlać się w sekcji „Eksploruj”."
showGapBetweenNotesInTimeline: "Pokazuj odstęp między wpisami na osi czasu."
duplicate: "Duplikuj" duplicate: "Duplikuj"
left: "Lewo" left: "Lewo"
center: "Wyśsrodkuj" center: "Wyśsrodkuj"
@ -1233,7 +1231,6 @@ _theme:
buttonBg: "Tło przycisku" buttonBg: "Tło przycisku"
buttonHoverBg: "Tło przycisku (po najechaniu)" buttonHoverBg: "Tło przycisku (po najechaniu)"
inputBorder: "Obramowanie pola wejścia" inputBorder: "Obramowanie pola wejścia"
driveFolderBg: "Tło folderu na dysku"
badge: "Odznaka" badge: "Odznaka"
messageBg: "Tło czatu" messageBg: "Tło czatu"
fgHighlighted: "Wyróżniony tekst" fgHighlighted: "Wyróżniony tekst"

View File

@ -143,9 +143,9 @@ deleteFile: "Excluir arquivo"
markAsSensitive: "Marcar como sensível" markAsSensitive: "Marcar como sensível"
unmarkAsSensitive: "Desmarcar como sensível" unmarkAsSensitive: "Desmarcar como sensível"
enterFileName: "Digite o nome do arquivo" enterFileName: "Digite o nome do arquivo"
mute: "Mutar" mute: "Silenciar"
unmute: "Desmutar" unmute: "Desmutar"
renoteMute: "Mutar repostagens" renoteMute: "Silenciar repostagens"
renoteUnmute: "Reativar repostagens" renoteUnmute: "Reativar repostagens"
block: "Bloquear" block: "Bloquear"
unblock: "Desbloquear" unblock: "Desbloquear"
@ -220,6 +220,7 @@ silenceThisInstance: "Silenciar essa instância"
mediaSilenceThisInstance: "Silenciar a mídia dessa instância" mediaSilenceThisInstance: "Silenciar a mídia dessa instância"
operations: "Operações" operations: "Operações"
software: "Software" software: "Software"
softwareName: "Software"
version: "Versão" version: "Versão"
metadata: "Metadados" metadata: "Metadados"
withNFiles: "{n} arquivo(s)" withNFiles: "{n} arquivo(s)"
@ -250,7 +251,6 @@ noUsers: "Sem usuários"
editProfile: "Editar Perfil" editProfile: "Editar Perfil"
noteDeleteConfirm: "Deseja excluir esta nota?" noteDeleteConfirm: "Deseja excluir esta nota?"
pinLimitExceeded: "Não é possível fixar novas notas" pinLimitExceeded: "Não é possível fixar novas notas"
intro: "A instalação do Misskey está completa! Crie uma conta de administrador."
done: "Concluído" done: "Concluído"
processing: "Em Progresso" processing: "Em Progresso"
preview: "Pré-visualizar" preview: "Pré-visualizar"
@ -575,6 +575,7 @@ showFixedPostForm: "Exibir o formulário de postagem na parte superior da linha
showFixedPostFormInChannel: "Exibir o campo de postagem na parte superior da linha do tempo (canais)" showFixedPostFormInChannel: "Exibir o campo de postagem na parte superior da linha do tempo (canais)"
withRepliesByDefaultForNewlyFollowed: "Incluir respostas por usuários recém-seguidos na linha do tempo por padrão" withRepliesByDefaultForNewlyFollowed: "Incluir respostas por usuários recém-seguidos na linha do tempo por padrão"
newNoteRecived: "Nova nota recebida" newNoteRecived: "Nova nota recebida"
newNote: "Nova Nota"
sounds: "Sons" sounds: "Sons"
sound: "Sons" sound: "Sons"
listen: "Ouvir" listen: "Ouvir"
@ -784,7 +785,6 @@ thisIsExperimentalFeature: "Este é um recurso experimental. As funções podem
developer: "Programador" developer: "Programador"
makeExplorable: "Deixe a sua conta encontrável em \"Explorar\"." makeExplorable: "Deixe a sua conta encontrável em \"Explorar\"."
makeExplorableDescription: "Se você desativá-lo, outros usuários não poderão encontrar a sua conta na aba Descoberta." makeExplorableDescription: "Se você desativá-lo, outros usuários não poderão encontrar a sua conta na aba Descoberta."
showGapBetweenNotesInTimeline: "Mostrar um espaço entre as notas na linha de tempo"
duplicate: "Duplicar" duplicate: "Duplicar"
left: "Esquerda" left: "Esquerda"
center: "Centralizar" center: "Centralizar"
@ -792,6 +792,7 @@ wide: "Largo"
narrow: "Estreito" narrow: "Estreito"
reloadToApplySetting: "As configurações serão refletidas após recarregar a página. Deseja recarregar agora?" reloadToApplySetting: "As configurações serão refletidas após recarregar a página. Deseja recarregar agora?"
needReloadToApply: "É necessário recarregar a página para refletir as alterações." needReloadToApply: "É necessário recarregar a página para refletir as alterações."
needToRestartServerToApply: "É necessário reiniciar o servidor para aplicar as mudanças."
showTitlebar: "Exibir barra de título" showTitlebar: "Exibir barra de título"
clearCache: "Limpar o cache" clearCache: "Limpar o cache"
onlineUsersCount: "{n} Pessoas Online" onlineUsersCount: "{n} Pessoas Online"
@ -1237,7 +1238,6 @@ showAvatarDecorations: "Exibir decorações de avatar"
releaseToRefresh: "Solte para atualizar" releaseToRefresh: "Solte para atualizar"
refreshing: "Atualizando..." refreshing: "Atualizando..."
pullDownToRefresh: "Puxe para baixo para atualizar" pullDownToRefresh: "Puxe para baixo para atualizar"
disableStreamingTimeline: "Desabilitar atualizações em tempo real da linha do tempo"
useGroupedNotifications: "Agrupar notificações" useGroupedNotifications: "Agrupar notificações"
signupPendingError: "Houve um problema ao verificar o endereço de email. O link pode ter expirado." signupPendingError: "Houve um problema ao verificar o endereço de email. O link pode ter expirado."
cwNotationRequired: "Se \"Esconder conteúdo\" está habilitado, uma descrição deve ser adicionada." cwNotationRequired: "Se \"Esconder conteúdo\" está habilitado, uma descrição deve ser adicionada."
@ -1346,6 +1346,16 @@ settingsMigrating: "Configurações estão sendo migradas, aguarde... (Você pod
readonly: "Ler apenas" readonly: "Ler apenas"
goToDeck: "Voltar ao Deck" goToDeck: "Voltar ao Deck"
federationJobs: "Tarefas de Federação" federationJobs: "Tarefas de Federação"
driveAboutTip: "No Drive, uma lista de arquivos enviados no passado será exibida. <br>\nVocê pode reutilizar esses arquivos anexando-os às notas, ou você pode enviar arquivos para publicar posteriormente. <br>\n<b>Cuidado ao excluir um arquivo, pois ele será removido de quaisquer outros lugares onde está sendo utilizado (notas, páginas, avatares, banners, etc.)</b><br>\nVocê também pode criar pastas para organizar seus arquivos."
scrollToClose: "Role a página para fechar"
advice: "Dica"
realtimeMode: "Modo tempo-real"
turnItOn: "Ativar"
turnItOff: "Desativar"
emojiMute: "Silenciar emoji"
emojiUnmute: "Reativar emoji"
muteX: "Silenciar {x}"
unmuteX: "Reativar {x}"
_chat: _chat:
noMessagesYet: "Ainda não há mensagens" noMessagesYet: "Ainda não há mensagens"
newMessage: "Nova mensagem" newMessage: "Nova mensagem"
@ -1379,6 +1389,8 @@ _chat:
chatNotAvailableInOtherAccount: "A função de conversas está desabilitadas para o outro usuário." chatNotAvailableInOtherAccount: "A função de conversas está desabilitadas para o outro usuário."
cannotChatWithTheUser: "Não é possível conversar com esse usuário." cannotChatWithTheUser: "Não é possível conversar com esse usuário."
cannotChatWithTheUser_description: "Conversas estão indisponíveis ou o outro usuário não as habilitou." cannotChatWithTheUser_description: "Conversas estão indisponíveis ou o outro usuário não as habilitou."
youAreNotAMemberOfThisRoomButInvited: "Você não é um participante da sala, mas recebeu um convite. Por favor, aceite o convite para entrar."
doYouAcceptInvitation: "Aceita o convite?"
chatWithThisUser: "Conversar com usuário" chatWithThisUser: "Conversar com usuário"
thisUserAllowsChatOnlyFromFollowers: "Esse usuário aceita conversar apenas com seguidores." thisUserAllowsChatOnlyFromFollowers: "Esse usuário aceita conversar apenas com seguidores."
thisUserAllowsChatOnlyFromFollowing: "Esse usuário aceita conversar apenas com quem segue." thisUserAllowsChatOnlyFromFollowing: "Esse usuário aceita conversar apenas com quem segue."
@ -1418,10 +1430,18 @@ _settings:
makeEveryTextElementsSelectable: "Tornar todos os elementos de texto selecionáveis" makeEveryTextElementsSelectable: "Tornar todos os elementos de texto selecionáveis"
makeEveryTextElementsSelectable_description: "Habilitar isso pode reduzir a usabilidade em algumas situações" makeEveryTextElementsSelectable_description: "Habilitar isso pode reduzir a usabilidade em algumas situações"
useStickyIcons: "Fazer ícones acompanharem a rolagem da tela" useStickyIcons: "Fazer ícones acompanharem a rolagem da tela"
enableHighQualityImagePlaceholders: "Exibir prévias para imagens de alta qualidade"
uiAnimations: "Animações de UI"
showNavbarSubButtons: "Mostrar sub-botões na barra de navegação" showNavbarSubButtons: "Mostrar sub-botões na barra de navegação"
ifOn: "Quando ligado" ifOn: "Quando ligado"
ifOff: "Quando desligado" ifOff: "Quando desligado"
enableSyncThemesBetweenDevices: "Sincronizar temas instalados entre dispositivos" enableSyncThemesBetweenDevices: "Sincronizar temas instalados entre dispositivos"
enablePullToRefresh: "Puxe para atualizar"
enablePullToRefresh_description: "Quando estiver utilizando um mouse, arraste enquanto aperta a roda de rolagem."
realtimeMode_description: "Estabelece uma conexão com o servidor e atualiza o conteúdo em tempo real. Isso pode aumentar o tráfego e uso de memória."
contentsUpdateFrequency: "Frequência da obtenção de conteúdo"
contentsUpdateFrequency_description: "Quanto maior o valor, mais o conteúdo atualiza. Porém, há uma diminuição do desempenho e aumento do tráfego e consumo de memória."
contentsUpdateFrequency_description2: "Quando o modo tempo-real está ativado, o conteúdo é atualizado em tempo real, ignorando essa opção."
_chat: _chat:
showSenderName: "Exibir nome de usuário do remetente" showSenderName: "Exibir nome de usuário do remetente"
sendOnEnter: "Pressionar Enter para enviar" sendOnEnter: "Pressionar Enter para enviar"
@ -1429,6 +1449,7 @@ _preferencesProfile:
profileName: "Nome do perfil" profileName: "Nome do perfil"
profileNameDescription: "Defina o nome que identifica esse dispositivo." profileNameDescription: "Defina o nome que identifica esse dispositivo."
profileNameDescription2: "Exemplo: \"Computador Principal\", \"Celular\"" profileNameDescription2: "Exemplo: \"Computador Principal\", \"Celular\""
manageProfiles: "Gerenciar Perfis"
_preferencesBackup: _preferencesBackup:
autoBackup: "Backup automático" autoBackup: "Backup automático"
restoreFromBackup: "Restaurar backup" restoreFromBackup: "Restaurar backup"
@ -1467,6 +1488,7 @@ _delivery:
manuallySuspended: "Suspenso manualmente" manuallySuspended: "Suspenso manualmente"
goneSuspended: "Servidor foi suspenso devido ao seu apagamento" goneSuspended: "Servidor foi suspenso devido ao seu apagamento"
autoSuspendedForNotResponding: "Servidor foi suspenso por não responder" autoSuspendedForNotResponding: "Servidor foi suspenso por não responder"
softwareSuspended: "Suspenso, pois esse software não está recebendo conteúdo"
_bubbleGame: _bubbleGame:
howToPlay: "Como jogar" howToPlay: "Como jogar"
hold: "Próximos" hold: "Próximos"
@ -1598,6 +1620,23 @@ _serverSettings:
openRegistration: "Abrir a criação de contas" openRegistration: "Abrir a criação de contas"
openRegistrationWarning: "Abrir cadastros contém riscos. É recomendado apenas habilitá-los se houver um sistema de monitoramento contínuo e resolução imediata de problemas." openRegistrationWarning: "Abrir cadastros contém riscos. É recomendado apenas habilitá-los se houver um sistema de monitoramento contínuo e resolução imediata de problemas."
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "Se nenhuma atividade da moderação for detectada por um tempo, essa configuração será desativada para prevenir spam." thisSettingWillAutomaticallyOffWhenModeratorsInactive: "Se nenhuma atividade da moderação for detectada por um tempo, essa configuração será desativada para prevenir spam."
deliverSuspendedSoftware: "Software Suspenso"
deliverSuspendedSoftwareDescription: "Você pode especificar uma faixa de nomes e versões do software de servidores para cancelar o envio de conteúdo por motivos como vulnerabilidades. Essa informação da versão é providenciada pelo servidor e pode não ser confiável. Uma faixa semver pode ser utilizada para especificar a versão, mas colocar '>= 2024.3.1' não incluirá versões personalizadas como '2024.3.1-custom.0'. Logo, é recomendado inserir uma especificação como '>= 2024.3.1-0'"
singleUserMode: "Modo de usuário único"
singleUserMode_description: "Se você é o único usuário desse servidor, habilitar esse modo irá otimizar a performance."
signToActivityPubGet: "Assinar solicitações GET do ActivityPub"
signToActivityPubGet_description: "Normalmente, isso deve ser habilitado. Desabilitar pode melhorar o desempenho na federação, mas também pode cortar a federação com alguns servidores."
proxyRemoteFiles: "Passar arquivos remotos por proxy"
proxyRemoteFiles_description: "Se habilitado, o servidor irá servir arquivos remotos através de um proxy. Isso é útil para gerar prévias de imagens e proteger a privacidade do usuário."
allowExternalApRedirect: "Permitir redirecionamento de conteúdo pelo ActivityPub"
allowExternalApRedirect_description: "Se habilitado, outros servidores podem solicitar conteúdo de terceiros através desse servidor, o que pode resultar em falsificação de conteúdo (spoofing)."
userGeneratedContentsVisibilityForVisitor: "Visibilidade de conteúdo dos usuários para visitantes"
userGeneratedContentsVisibilityForVisitor_description: "Isso é útil para prevenir problemas causados por conteúdo inapropriado de usuários remotos de servidores com pouca ou nenhuma moderação, que pode ser hospedado na internet a partir desse servidor."
userGeneratedContentsVisibilityForVisitor_description2: "Publicar todo o conteúdo do servidor para a internet pode ser arriscado. Isso é especialmente importante para visitantes que desconhecem a natureza distribuída do conteúdo na internet, pois eles podem acreditar que o conteúdo remoto é criado por usuários desse servidor."
_userGeneratedContentsVisibilityForVisitor:
all: "Tudo é público"
localOnly: "Conteúdo local é publicado, conteúdo remoto é privado"
none: "Tudo é privado"
_accountMigration: _accountMigration:
moveFrom: "Migrar outra conta para essa" moveFrom: "Migrar outra conta para essa"
moveFromSub: "Criar um 'alias' a outra conta" moveFromSub: "Criar um 'alias' a outra conta"
@ -1915,6 +1954,7 @@ _role:
canManageCustomEmojis: "Permitir gerenciar emojis personalizados" canManageCustomEmojis: "Permitir gerenciar emojis personalizados"
canManageAvatarDecorations: "Gerenciar decorações de avatar" canManageAvatarDecorations: "Gerenciar decorações de avatar"
driveCapacity: "Capacidade do drive" driveCapacity: "Capacidade do drive"
maxFileSize: "Tamanho máximo de envio de arquivos"
alwaysMarkNsfw: "Sempre marcar arquivos como NSFW" alwaysMarkNsfw: "Sempre marcar arquivos como NSFW"
canUpdateBioMedia: "Permitir a edição de ícone ou imagem do banner." canUpdateBioMedia: "Permitir a edição de ícone ou imagem do banner."
pinMax: "Número máximo de notas fixadas" pinMax: "Número máximo de notas fixadas"
@ -2154,7 +2194,6 @@ _theme:
buttonBg: "Plano de fundo de botão" buttonBg: "Plano de fundo de botão"
buttonHoverBg: "Plano de fundo de botão (Selecionado)" buttonHoverBg: "Plano de fundo de botão (Selecionado)"
inputBorder: "Borda de campo digitável" inputBorder: "Borda de campo digitável"
driveFolderBg: "Plano de fundo da pasta no Drive"
badge: "Emblema" badge: "Emblema"
messageBg: "Plano de fundo do chat" messageBg: "Plano de fundo do chat"
fgHighlighted: "Texto Destacado" fgHighlighted: "Texto Destacado"
@ -2790,9 +2829,6 @@ _dataSaver:
_avatar: _avatar:
title: "Imagem do avatar" title: "Imagem do avatar"
description: "Parar animação de avatares. Imagens animadas podem ter um arquivo mais pesado do que imagens normais, potencialmente levando a reduções no tráfego de dados." description: "Parar animação de avatares. Imagens animadas podem ter um arquivo mais pesado do que imagens normais, potencialmente levando a reduções no tráfego de dados."
_urlPreview:
title: "Miniaturas na prévia de URLs"
description: "Miniaturas na prévia de URLs não serão mais carregadas."
_code: _code:
title: "Destaque de código" title: "Destaque de código"
description: "Se as notações de formatação de código forem utilizadas em MFM, elas não irão carregar até serem selecionadas. Destaque de código exige baixar arquivos de alta definição para cada linguagem de programação. Logo, desabilitar o carregamento automático desses arquivos diminui a quantidade de informação comunicada." description: "Se as notações de formatação de código forem utilizadas em MFM, elas não irão carregar até serem selecionadas. Destaque de código exige baixar arquivos de alta definição para cada linguagem de programação. Logo, desabilitar o carregamento automático desses arquivos diminui a quantidade de informação comunicada."
@ -2923,10 +2959,6 @@ _customEmojisManager:
uploadSettingDescription: "Nessa tela, você pode configurar o comportamento ao enviar Emojis." uploadSettingDescription: "Nessa tela, você pode configurar o comportamento ao enviar Emojis."
directoryToCategoryLabel: "Transformar as pastas em categorias" directoryToCategoryLabel: "Transformar as pastas em categorias"
directoryToCategoryCaption: "Quando você arrastar um diretório, converter o caminho das pastas no campo \"categoria\"." directoryToCategoryCaption: "Quando você arrastar um diretório, converter o caminho das pastas no campo \"categoria\"."
emojiInputAreaCaption: "Selecione Emojis que você deseja registrar utilizando um dos métodos."
emojiInputAreaList1: "Arraste arquivos de imagem ou diretórios dentro desse quadro"
emojiInputAreaList2: "Clique nesse link para abrir a seleção de arquivos"
emojiInputAreaList3: "Clique nesse link para selecionar do drive"
confirmRegisterEmojisDescription: "Registrando os Emojis da lista como novos Emojis personalizados. Deseja continuar? (Para evitar sobrecarga, apenas {count} Emoji(s) podem ser registrados em uma única operação)" confirmRegisterEmojisDescription: "Registrando os Emojis da lista como novos Emojis personalizados. Deseja continuar? (Para evitar sobrecarga, apenas {count} Emoji(s) podem ser registrados em uma única operação)"
confirmClearEmojisDescription: "Descartando edições e limpando Emojis da lista. Deseja continuar?" confirmClearEmojisDescription: "Descartando edições e limpando Emojis da lista. Deseja continuar?"
confirmUploadEmojisDescription: "Enviando {count} arquivo(s) arrastados ao drive. Deseja continuar?" confirmUploadEmojisDescription: "Enviando {count} arquivo(s) arrastados ao drive. Deseja continuar?"
@ -3002,3 +3034,53 @@ _search:
pleaseEnterServerHost: "Insira o endereço do servidor" pleaseEnterServerHost: "Insira o endereço do servidor"
pleaseSelectUser: "Selecione um usuário" pleaseSelectUser: "Selecione um usuário"
serverHostPlaceholder: "Exemplo: misskey.example.com" serverHostPlaceholder: "Exemplo: misskey.example.com"
_serverSetupWizard:
installCompleted: "Instalação do Misskey concluída!"
firstCreateAccount: "Para iniciar, crie uma conta de administrador."
accountCreated: "Conta de administrador foi criada!"
serverSetting: "Configurações de Servidor"
youCanEasilyConfigureOptimalServerSettingsWithThisWizard: "O assistente facilita a configuração do servidor."
settingsYouMakeHereCanBeChangedLater: "Configurações alteradas pelo assistente podem ser ajustadas posteriormente."
howWillYouUseMisskey: "Como você usará o Misskey?"
_use:
single: "Servidor de Usuário Único"
single_description: "Utilizar servidor sozinho."
single_youCanCreateMultipleAccounts: "Múltiplas contas podem ser criadas se necessário, mesmo operando como servidor de usuário único."
group: "Servidor de Grupo"
group_description: "Convide outros usuários confiáveis para utilizar com mais de um usuário"
open: "Servidor Público"
open_description: "Permitir registro de todos."
openServerAdvice: "Aceitar um número alto de pessoas desconhecidas pode envolve um risco. Recomendamos que você opere com um sistema de moderação confiável para resolver quaisquer problemas."
openServerAntiSpamAdvice: "Para prevenir que o seu servidor se torne alvo de spam, é essencial cuidar da segurança habilitando recursos antibot como o reCAPTCHA."
howManyUsersDoYouExpect: "Quantos usuários você espera?"
_scale:
small: "Menos que 100 (pequeno porte)"
medium: "Entre 100 e 1000 usuários (médio porte)"
large: "Mais que 1000 usuários (larga escala)"
largeScaleServerAdvice: "Servidores de larga escala podem precisar de conhecimento avançado de infraestrutura, como balanceamento de carga e replicação de banco de dados."
doYouConnectToFediverse: "Você deseja conectar-se com o Fediverso?"
doYouConnectToFediverse_description1: "Quando conectado com uma rede distribuída de servidores (Fediverso), o conteúdo pode ser trocado com outros servidores."
doYouConnectToFediverse_description2: "Conectar com o Fediverso também é chamado de \"federação\""
youCanConfigureMoreFederationSettingsLater: "Configurações adicionais como especificar servidores para conectar-se com podem ser feitas posteriormente"
adminInfo: "Informações da administração"
adminInfo_description: "Define as informações do administrador usadas para receber consultas."
adminInfo_mustBeFilled: "Deve ser preenchido se o servidor é público ou se a federação está ativa."
followingSettingsAreRecommended: "As configurações a seguir são recomendadas"
applyTheseSettings: "Aplicar essas configurações"
skipSettings: "Pular configuração"
settingsCompleted: "Instalação concluída!"
settingsCompleted_description: "Obrigado pelo seu tempo. Agora que tudo está pronto, você pode começar a utilizar o servidor."
settingsCompleted_description2: "As configurações do servidor podem ser alteradas no \"Painel de Controle\""
donationRequest: "Solicitação de Doação"
_donationRequest:
text1: "Misskey é software aberto desenvolvido por voluntários."
text2: "Nós apreciaríamos o seu apoio para podermos continuar o desenvolvimento desse software no futuro."
text3: "Também há benefícios especiais para apoiadores!"
_clientPerformanceIssueTip:
title: "Dicas de desempenho"
makeSureDisabledAdBlocker: "Desative o seu bloqueador de anúncios"
makeSureDisabledAdBlocker_description: "Bloqueadores de anúncios podem afetar o desempenho. Certifique-se que eles não estão habilitados no seu sistema ou nos recursos/extensões do navegador. "
makeSureDisabledCustomCss: "Desabilite CSS personalizado"
makeSureDisabledCustomCss_description: "Substituir o estilo da página pode afetar o desempenho. Certifique-se que o CSS personalizado ou extensões que modifiquem o estilo da página estejam desabilitados."
makeSureDisabledAddons: "Desabilite extensões"
makeSureDisabledAddons_description: "Algumas extensões podem afetar comportamentos do cliente e afetar o desempenho. Por favor, desative as extensões do seu navegador e veja se isso melhora a situação."

View File

@ -250,7 +250,6 @@ noUsers: "Niciun utilizator"
editProfile: "Editează profilul" editProfile: "Editează profilul"
noteDeleteConfirm: "Ești sigur(ă) că vrei să ștergi această notă?" noteDeleteConfirm: "Ești sigur(ă) că vrei să ștergi această notă?"
pinLimitExceeded: "Nu poți mai fixa mai multe note" pinLimitExceeded: "Nu poți mai fixa mai multe note"
intro: "Misskey s-a instalat! Te rog crează un utilizator admin."
done: "Gata" done: "Gata"
processing: "Se procesează" processing: "Se procesează"
preview: "Previzualizare" preview: "Previzualizare"
@ -784,7 +783,6 @@ thisIsExperimentalFeature: "Aceasta este o funcție experimentală. Funcționali
developer: "Dezvoltator" developer: "Dezvoltator"
makeExplorable: "Fă-ți contul vizibil în secțiunea„Explorați”" makeExplorable: "Fă-ți contul vizibil în secțiunea„Explorați”"
makeExplorableDescription: "Dacă dezactivezi această opțiune, contul dvs. nu va fi vizibil în secțiunea\"Explorați\"." makeExplorableDescription: "Dacă dezactivezi această opțiune, contul dvs. nu va fi vizibil în secțiunea\"Explorați\"."
showGapBetweenNotesInTimeline: "Afișați un decalaj între postările de pe cronologie"
duplicate: "Duplicat" duplicate: "Duplicat"
left: "Stânga" left: "Stânga"
center: "Centru" center: "Centru"

View File

@ -5,6 +5,7 @@ introMisskey: "Добро пожаловать! Misskey — это децент
poweredByMisskeyDescription: "{name} сервис на платформе с открытым исходным кодом <b>Misskey</b>, называемый экземпляром Misskey." poweredByMisskeyDescription: "{name} сервис на платформе с открытым исходным кодом <b>Misskey</b>, называемый экземпляром Misskey."
monthAndDay: "{day}.{month}" monthAndDay: "{day}.{month}"
search: "Поиск" search: "Поиск"
reset: "Сброс"
notifications: "Уведомления" notifications: "Уведомления"
username: "Имя пользователя" username: "Имя пользователя"
password: "Пароль" password: "Пароль"
@ -48,6 +49,7 @@ pin: "Закрепить в профиле"
unpin: "Открепить от профиля" unpin: "Открепить от профиля"
copyContent: "Скопировать содержимое" copyContent: "Скопировать содержимое"
copyLink: "Скопировать ссылку" copyLink: "Скопировать ссылку"
copyRemoteLink: "Скопировать ссылку на репост"
copyLinkRenote: "Скопировать ссылку на репост" copyLinkRenote: "Скопировать ссылку на репост"
delete: "Удалить" delete: "Удалить"
deleteAndEdit: "Удалить и отредактировать" deleteAndEdit: "Удалить и отредактировать"
@ -215,8 +217,10 @@ perDay: "По дням"
stopActivityDelivery: "Остановить отправку обновлений активности" stopActivityDelivery: "Остановить отправку обновлений активности"
blockThisInstance: "Блокировать этот инстанс" blockThisInstance: "Блокировать этот инстанс"
silenceThisInstance: "Заглушить этот инстанс" silenceThisInstance: "Заглушить этот инстанс"
mediaSilenceThisInstance: "Заглушить сервер"
operations: "Операции" operations: "Операции"
software: "Программы" software: "Программы"
softwareName: "Software Name"
version: "Версия" version: "Версия"
metadata: "Метаданные" metadata: "Метаданные"
withNFiles: "Файлы, {n} шт." withNFiles: "Файлы, {n} шт."
@ -235,7 +239,11 @@ clearCachedFilesConfirm: "Удалить все закэшированные ф
blockedInstances: "Заблокированные инстансы" blockedInstances: "Заблокированные инстансы"
blockedInstancesDescription: "Введите список инстансов, которые хотите заблокировать. Они больше не смогут обмениваться с вашим инстансом." blockedInstancesDescription: "Введите список инстансов, которые хотите заблокировать. Они больше не смогут обмениваться с вашим инстансом."
silencedInstances: "Заглушённые инстансы" silencedInstances: "Заглушённые инстансы"
silencedInstancesDescription: "Перечислите имена серверов, которые вы хотите отключить, разделив их новой строкой. Все учетные записи, принадлежащие к указанным в списке серверам, будут заблокированы и смогут отправлять запросы только на повторное использование и не смогут указывать локальные учетные записи, если они не будут отслеживаться. Это не повлияет на заблокированные серверы."
mediaSilencedInstances: "Заглушённые сервера"
mediaSilencedInstancesDescription: "Укажите названия серверов, для которых вы хотите отключить доступ к файлам, по одному серверу в строке. Все учетные записи, принадлежащие к перечисленным серверам, будут считаться конфиденциальными и не смогут использовать пользовательские эмодзи. Это никак не повлияет на заблокированные серверы."
federationAllowedHosts: "Серверы, поддерживающие федерацию" federationAllowedHosts: "Серверы, поддерживающие федерацию"
federationAllowedHostsDescription: "Укажите имена серверов, для которых вы хотите разрешить объединение, разделив их разделителями строк."
muteAndBlock: "Скрытие и блокировка" muteAndBlock: "Скрытие и блокировка"
mutedUsers: "Скрытые пользователи" mutedUsers: "Скрытые пользователи"
blockedUsers: "Заблокированные пользователи" blockedUsers: "Заблокированные пользователи"
@ -243,7 +251,6 @@ noUsers: "Нет ни одного пользователя"
editProfile: "Редактировать профиль" editProfile: "Редактировать профиль"
noteDeleteConfirm: "Вы хотите удалить эту заметку?" noteDeleteConfirm: "Вы хотите удалить эту заметку?"
pinLimitExceeded: "Нельзя закрепить ещё больше заметок" pinLimitExceeded: "Нельзя закрепить ещё больше заметок"
intro: "Установка Misskey завершена! А теперь создайте учетную запись администратора."
done: "Готово" done: "Готово"
processing: "Обработка" processing: "Обработка"
preview: "Предпросмотр" preview: "Предпросмотр"
@ -294,6 +301,7 @@ uploadFromUrlMayTakeTime: "Загрузка может занять некото
explore: "Обзор" explore: "Обзор"
messageRead: "Прочитали" messageRead: "Прочитали"
noMoreHistory: "История закончилась" noMoreHistory: "История закончилась"
startChat: "Начать чат"
nUsersRead: "Прочитали {n}" nUsersRead: "Прочитали {n}"
agreeTo: "Я соглашаюсь с {0}" agreeTo: "Я соглашаюсь с {0}"
agree: "Согласен" agree: "Согласен"
@ -416,6 +424,7 @@ antennaExcludeBots: "Исключать ботов"
antennaKeywordsDescription: "Пишите слова через пробел в одной строке, чтобы ловить их появление вместе; на отдельных строках располагайте слова, или группы слов, чтобы ловить любые из них." antennaKeywordsDescription: "Пишите слова через пробел в одной строке, чтобы ловить их появление вместе; на отдельных строках располагайте слова, или группы слов, чтобы ловить любые из них."
notifyAntenna: "Уведомлять о новых заметках" notifyAntenna: "Уведомлять о новых заметках"
withFileAntenna: "Только заметки с вложениями" withFileAntenna: "Только заметки с вложениями"
excludeNotesInSensitiveChannel: "Исключить заметки из конфиденциальных каналов"
enableServiceworker: "Включить ServiceWorker" enableServiceworker: "Включить ServiceWorker"
antennaUsersDescription: "Пишите каждое название аккаута на отдельной строке" antennaUsersDescription: "Пишите каждое название аккаута на отдельной строке"
caseSensitive: "С учётом регистра" caseSensitive: "С учётом регистра"
@ -446,6 +455,8 @@ totpDescription: "Описание приложения-аутентификат
moderator: "Модератор" moderator: "Модератор"
moderation: "Модерация" moderation: "Модерация"
moderationNote: "Примечания модератора" moderationNote: "Примечания модератора"
moderationNoteDescription: "Вы можете заполнять заметки, которые будут доступны только модераторам."
addModerationNote: ""
moderationLogs: "Журнал модерации" moderationLogs: "Журнал модерации"
nUsersMentioned: "Упомянуло пользователей: {n}" nUsersMentioned: "Упомянуло пользователей: {n}"
securityKeyAndPasskey: "Ключ безопасности и парольная фраза" securityKeyAndPasskey: "Ключ безопасности и парольная фраза"
@ -506,6 +517,8 @@ emojiStyle: "Стиль эмодзи"
native: "Системные" native: "Системные"
menuStyle: "Стиль меню" menuStyle: "Стиль меню"
style: "Стиль" style: "Стиль"
drawer: "Панель"
popup: "Всплывающие окна"
showNoteActionsOnlyHover: "Показывать кнопки у заметок только при наведении" showNoteActionsOnlyHover: "Показывать кнопки у заметок только при наведении"
showReactionsCount: "Видеть количество реакций на заметках" showReactionsCount: "Видеть количество реакций на заметках"
noHistory: "История пока пуста" noHistory: "История пока пуста"
@ -560,6 +573,7 @@ serverLogs: "Журнал сервера"
deleteAll: "Удалить всё" deleteAll: "Удалить всё"
showFixedPostForm: "Показывать поле для ввода новой заметки наверху ленты" showFixedPostForm: "Показывать поле для ввода новой заметки наверху ленты"
showFixedPostFormInChannel: "Показывать поле для ввода новой заметки наверху ленты (каналы)" showFixedPostFormInChannel: "Показывать поле для ввода новой заметки наверху ленты (каналы)"
withRepliesByDefaultForNewlyFollowed: "По умолчанию включайте ответы новых пользователей, на которых вы подписались, во временную шкалу"
newNoteRecived: "Появилась новая заметка" newNoteRecived: "Появилась новая заметка"
sounds: "Звуки" sounds: "Звуки"
sound: "Звуки" sound: "Звуки"
@ -572,6 +586,7 @@ masterVolume: "Основная регулировка громкости"
notUseSound: "Выключить звук" notUseSound: "Выключить звук"
useSoundOnlyWhenActive: "Воспроизводить звук только когда Misskey активен." useSoundOnlyWhenActive: "Воспроизводить звук только когда Misskey активен."
details: "Подробнее" details: "Подробнее"
renoteDetails: "Узнать больше"
chooseEmoji: "Выберите эмодзи" chooseEmoji: "Выберите эмодзи"
unableToProcess: "Не удаётся завершить операцию" unableToProcess: "Не удаётся завершить операцию"
recentUsed: "Последние использованные" recentUsed: "Последние использованные"
@ -587,6 +602,8 @@ ascendingOrder: "по возрастанию"
descendingOrder: "По убыванию" descendingOrder: "По убыванию"
scratchpad: "Когтеточка" scratchpad: "Когтеточка"
scratchpadDescription: "«Когтеточка» — это место для опытов с AiScript. Здесь можно писать программы, взаимодействующие с Misskey, запускать и смотреть что из этого получается." scratchpadDescription: "«Когтеточка» — это место для опытов с AiScript. Здесь можно писать программы, взаимодействующие с Misskey, запускать и смотреть что из этого получается."
uiInspector: "Средство проверки пользовательского интерфейса"
uiInspectorDescription: "Вы можете просмотреть список экземпляров компонентов пользовательского интерфейса, существующих в памяти. Элементы пользовательского интерфейса генерируются с помощью серии функций Ui:C:."
output: "Выходы" output: "Выходы"
script: "Скрипт" script: "Скрипт"
disablePagesScript: "Отключить скрипты на «Страницах»" disablePagesScript: "Отключить скрипты на «Страницах»"
@ -667,14 +684,19 @@ smtpSecure: "Использовать SSL/TLS для SMTP-соединений"
smtpSecureInfo: "Выключите при использовании STARTTLS." smtpSecureInfo: "Выключите при использовании STARTTLS."
testEmail: "Проверка доставки электронной почты" testEmail: "Проверка доставки электронной почты"
wordMute: "Скрытие слов" wordMute: "Скрытие слов"
wordMuteDescription: "Сведите к минимуму записи, содержащие указанное утверждение. Нажмите на свернутую запись, чтобы отобразить ее."
hardWordMute: "Строгое скрытие слов" hardWordMute: "Строгое скрытие слов"
showMutedWord: "Отображать слово без уведомления (звука)"
hardWordMuteDescription: "Скрыть заметки, содержащие указанное слово или фразу. В отличие от word mute, заметка будет полностью скрыта от просмотра."
regexpError: "Ошибка в регулярном выражении" regexpError: "Ошибка в регулярном выражении"
regexpErrorDescription: "В списке {tab} скрытых слов, в строке {line} обнаружена синтаксическая ошибка:" regexpErrorDescription: "В списке {tab} скрытых слов, в строке {line} обнаружена синтаксическая ошибка:"
instanceMute: "Глушение инстансов" instanceMute: "Глушение инстансов"
userSaysSomething: "{name} что-то сообщает" userSaysSomething: "{name} что-то сообщает"
userSaysSomethingAbout: "{name} что-то говорил о「{word}」"
makeActive: "Активировать" makeActive: "Активировать"
display: "Отображение" display: "Отображение"
copy: "Копировать" copy: "Копировать"
copiedToClipboard: "Скопированы в буфер обмена"
metrics: "Метрики" metrics: "Метрики"
overview: "Обзор" overview: "Обзор"
logs: "Журналы" logs: "Журналы"
@ -762,7 +784,6 @@ thisIsExperimentalFeature: "Это экспериментальная функц
developer: "Разработчик" developer: "Разработчик"
makeExplorable: "Опубликовать профиль в «Обзоре»." makeExplorable: "Опубликовать профиль в «Обзоре»."
makeExplorableDescription: "Если выключить, ваш профиль не будет показан в разделе «Обзор»." makeExplorableDescription: "Если выключить, ваш профиль не будет показан в разделе «Обзор»."
showGapBetweenNotesInTimeline: "Показывать разделитель между заметками в ленте"
duplicate: "Дубликат" duplicate: "Дубликат"
left: "Слева" left: "Слева"
center: "По центру" center: "По центру"
@ -840,6 +861,7 @@ administration: "Управление"
accounts: "Учётные записи" accounts: "Учётные записи"
switch: "Переключение" switch: "Переключение"
noMaintainerInformationWarning: "Не заполнены сведения об администраторах" noMaintainerInformationWarning: "Не заполнены сведения об администраторах"
noInquiryUrlWarning: "URL-адрес контактной формы еще не задан."
noBotProtectionWarning: "Ботозащита не настроена" noBotProtectionWarning: "Ботозащита не настроена"
configure: "Настроить" configure: "Настроить"
postToGallery: "Опубликовать в галерею" postToGallery: "Опубликовать в галерею"
@ -904,6 +926,7 @@ followersVisibility: "Видимость подписчиков"
continueThread: "Показать следующие ответы" continueThread: "Показать следующие ответы"
deleteAccountConfirm: "Учётная запись будет безвозвратно удалена. Подтверждаете?" deleteAccountConfirm: "Учётная запись будет безвозвратно удалена. Подтверждаете?"
incorrectPassword: "Пароль неверен." incorrectPassword: "Пароль неверен."
incorrectTotp: "Введен неверный одноразовый пароль или срок его действия истек."
voteConfirm: "Отдать голос за «{choice}»?" voteConfirm: "Отдать голос за «{choice}»?"
hide: "Спрятать" hide: "Спрятать"
useDrawerReactionPickerForMobile: "Выдвижная палитра на мобильном устройстве" useDrawerReactionPickerForMobile: "Выдвижная палитра на мобильном устройстве"
@ -928,6 +951,9 @@ oneHour: "1 час"
oneDay: "1 день" oneDay: "1 день"
oneWeek: "1 неделя" oneWeek: "1 неделя"
oneMonth: "1 месяц" oneMonth: "1 месяц"
threeMonths: "3 месяца"
oneYear: "1 год"
threeDays: "3 дня"
reflectMayTakeTime: "Изменения могут занять время для отображения" reflectMayTakeTime: "Изменения могут занять время для отображения"
failedToFetchAccountInformation: "Не удалось получить информацию об аккаунте" failedToFetchAccountInformation: "Не удалось получить информацию об аккаунте"
rateLimitExceeded: "Ограничение скорости превышено" rateLimitExceeded: "Ограничение скорости превышено"
@ -952,6 +978,7 @@ document: "Документ"
numberOfPageCache: "Количество сохранённых страниц в кэше" numberOfPageCache: "Количество сохранённых страниц в кэше"
numberOfPageCacheDescription: "Описание количества страниц в кэше" numberOfPageCacheDescription: "Описание количества страниц в кэше"
logoutConfirm: "Вы хотите выйти из аккаунта?" logoutConfirm: "Вы хотите выйти из аккаунта?"
logoutWillClearClientData: "Когда вы выйдете из системы, информация о конфигурации клиента будет удалена из браузера.Чтобы иметь возможность восстановить информацию о вашей конфигурации при повторном входе в систему, пожалуйста, включите опцию автоматического резервного копирования в настройках."
lastActiveDate: "Последняя дата использования" lastActiveDate: "Последняя дата использования"
statusbar: "Статусбар" statusbar: "Статусбар"
pleaseSelect: "Пожалуйста, выберите" pleaseSelect: "Пожалуйста, выберите"
@ -1001,6 +1028,7 @@ neverShow: "Больше не показывать"
remindMeLater: "Напомнить позже" remindMeLater: "Напомнить позже"
didYouLikeMisskey: "Вам нравится Misskey?" didYouLikeMisskey: "Вам нравится Misskey?"
pleaseDonate: "Сайт {host} работает на Misskey. Это бесплатное программное обеспечение, и ваши пожертвования очень бы помогли продолжать его разработку!" pleaseDonate: "Сайт {host} работает на Misskey. Это бесплатное программное обеспечение, и ваши пожертвования очень бы помогли продолжать его разработку!"
correspondingSourceIsAvailable: "Соответствующий исходный код можно найти по адресу {anchor} "
roles: "Роли" roles: "Роли"
role: "Роль" role: "Роль"
noRole: "Нет роли" noRole: "Нет роли"
@ -1056,6 +1084,7 @@ prohibitedWords: "Запрещённые слова"
prohibitedWordsDescription: "Включает вывод ошибки при попытке опубликовать пост, содержащий указанное слово/набор слов.\nМножество слов может быть указано, разделяемые новой строкой." prohibitedWordsDescription: "Включает вывод ошибки при попытке опубликовать пост, содержащий указанное слово/набор слов.\nМножество слов может быть указано, разделяемые новой строкой."
prohibitedWordsDescription2: "Разделение пробелом создаёт спецификацию AND, а разделение косой чертой создаёт регулярное выражение." prohibitedWordsDescription2: "Разделение пробелом создаёт спецификацию AND, а разделение косой чертой создаёт регулярное выражение."
hiddenTags: "Скрытые хештеги" hiddenTags: "Скрытые хештеги"
hiddenTagsDescription: "Установленные теги не будут отображаться в тренде, можно установить несколько тегов."
notesSearchNotAvailable: "Поиск заметок недоступен" notesSearchNotAvailable: "Поиск заметок недоступен"
license: "Лицензия" license: "Лицензия"
unfavoriteConfirm: "Удалить избранное?" unfavoriteConfirm: "Удалить избранное?"
@ -1066,6 +1095,7 @@ retryAllQueuesConfirmTitle: "Хотите попробовать ещё раз?"
retryAllQueuesConfirmText: "Нагрузка на сервер может увеличиться" retryAllQueuesConfirmText: "Нагрузка на сервер может увеличиться"
enableChartsForRemoteUser: "Создание диаграмм для удалённых пользователей" enableChartsForRemoteUser: "Создание диаграмм для удалённых пользователей"
enableChartsForFederatedInstances: "Создание диаграмм для удалённых серверов" enableChartsForFederatedInstances: "Создание диаграмм для удалённых серверов"
enableStatsForFederatedInstances: "Получить информацию об удаленном сервере"
showClipButtonInNoteFooter: "Показать кнопку добавления в подборку в меню действий с заметкой" showClipButtonInNoteFooter: "Показать кнопку добавления в подборку в меню действий с заметкой"
reactionsDisplaySize: "Размер реакций" reactionsDisplaySize: "Размер реакций"
limitWidthOfReaction: "Ограничить максимальную ширину реакций и отображать их в уменьшенном размере." limitWidthOfReaction: "Ограничить максимальную ширину реакций и отображать их в уменьшенном размере."
@ -1101,6 +1131,7 @@ preservedUsernames: "Зарезервированные имена пользо
preservedUsernamesDescription: "Перечислите зарезервированные имена пользователей, отделяя их строками. Они станут недоступны при создании учётной записи. Это ограничение не применяется при создании учётной записи администраторами. Также, уже существующие учётные записи останутся без изменений." preservedUsernamesDescription: "Перечислите зарезервированные имена пользователей, отделяя их строками. Они станут недоступны при создании учётной записи. Это ограничение не применяется при создании учётной записи администраторами. Также, уже существующие учётные записи останутся без изменений."
createNoteFromTheFile: "Создать заметку из этого файла" createNoteFromTheFile: "Создать заметку из этого файла"
archive: "Архив" archive: "Архив"
archived: "Архивировано"
unarchive: "Разархивировать" unarchive: "Разархивировать"
channelArchiveConfirmTitle: "Переместить {name} в архив?" channelArchiveConfirmTitle: "Переместить {name} в архив?"
channelArchiveConfirmDescription: "Архивированные каналы перестанут отображаться в списке каналов или результатах поиска. В них также нельзя будет добавлять новые записи." channelArchiveConfirmDescription: "Архивированные каналы перестанут отображаться в списке каналов или результатах поиска. В них также нельзя будет добавлять новые записи."
@ -1121,6 +1152,7 @@ rolesThatCanBeUsedThisEmojiAsReaction: "Роли тех, кому можно и
rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "Если здесь ничего не указать, в качестве реакции эту эмодзи сможет использовать каждый." rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "Если здесь ничего не указать, в качестве реакции эту эмодзи сможет использовать каждый."
rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "Эти роли должны быть общедоступными." rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "Эти роли должны быть общедоступными."
cancelReactionConfirm: "Вы действительно хотите удалить свою реакцию?" cancelReactionConfirm: "Вы действительно хотите удалить свою реакцию?"
changeReactionConfirm: "Вы действительно хотите удалить свою реакцию?"
later: "Позже" later: "Позже"
goToMisskey: "К Misskey" goToMisskey: "К Misskey"
additionalEmojiDictionary: "Дополнительные словари эмодзи" additionalEmojiDictionary: "Дополнительные словари эмодзи"
@ -1130,9 +1162,16 @@ enableServerMachineStats: "Опубликовать характеристики
enableIdenticonGeneration: "Включить генерацию иконки пользователя" enableIdenticonGeneration: "Включить генерацию иконки пользователя"
turnOffToImprovePerformance: "Отключение этого параметра может повысить производительность." turnOffToImprovePerformance: "Отключение этого параметра может повысить производительность."
createInviteCode: "Создать код приглашения" createInviteCode: "Создать код приглашения"
createWithOptions: "Используйте параметры для создания"
createCount: "Количество приглашений" createCount: "Количество приглашений"
inviteCodeCreated: "Создан пригласительный код"
inviteLimitExceeded: "Достигнут предел количества пригласительных кодов, которые могут быть созданы."
createLimitRemaining: "Пригласительные коды, которые могут быть созданы: {limit} "
inviteLimitResetCycle: "За определенное {time} Вы можете создать неограниченное количество пригласительных кодов {limit} "
expirationDate: "Дата истечения" expirationDate: "Дата истечения"
noExpirationDate: "Бессрочно" noExpirationDate: "Бессрочно"
inviteCodeUsedAt: "Дата и время, когда был использован пригласительный код"
registeredUserUsingInviteCode: "Пользователи, которые использовали пригласительный код"
unused: "Неиспользованное" unused: "Неиспользованное"
used: "Использован" used: "Использован"
expired: "Срок действия приглашения истёк" expired: "Срок действия приглашения истёк"
@ -1159,7 +1198,6 @@ privacyPolicyUrl: "Ссылка на Политику Конфиденциаль
attach: "Прикрепить" attach: "Прикрепить"
angle: "Угол" angle: "Угол"
flip: "Переворот" flip: "Переворот"
disableStreamingTimeline: "Отключить обновление ленты в режиме реального времени"
useGroupedNotifications: "Отображать уведомления сгруппировано" useGroupedNotifications: "Отображать уведомления сгруппировано"
doReaction: "Добавить реакцию" doReaction: "Добавить реакцию"
code: "Код" code: "Код"
@ -1710,7 +1748,6 @@ _theme:
buttonBg: "Фон кнопки" buttonBg: "Фон кнопки"
buttonHoverBg: "Текст кнопки" buttonHoverBg: "Текст кнопки"
inputBorder: "Рамка поля ввода" inputBorder: "Рамка поля ввода"
driveFolderBg: "Фон папки «Диска»"
badge: "Значок" badge: "Значок"
messageBg: "Фон беседы" messageBg: "Фон беседы"
fgHighlighted: "Подсвеченный текст" fgHighlighted: "Подсвеченный текст"

View File

@ -1,10 +1,18 @@
--- ---
_lang_: "සිංහල" _lang_: "සිංහල"
monthAndDay: "{month}-{day}" monthAndDay: "{month}-{day}"
search: "සොයන්න"
reset: "යළි සකසන්න"
notifications: "දැනුම්දීම්"
username: "පරිශීලක නාමය" username: "පරිශීලක නාමය"
password: "මුරපදය" password: "මුරපදය"
ok: "හරි"
gotIt: "තේරුණා"
cancel: "අවලංගු කරන්න" cancel: "අවලංගු කරන්න"
noThankYou: "එපා, ස්තුතියි"
noNotifications: "දැනුම්දීම් නැත"
instance: "සර්වර්" instance: "සර්වර්"
settings: "සැකසුම්"
login: "පිවිසෙන්න" login: "පිවිසෙන්න"
users: "පරිශීලක" users: "පරිශීලක"
note: "නෝට්" note: "නෝට්"
@ -13,10 +21,19 @@ instances: "සර්වර්"
smtpUser: "පරිශීලක නාමය" smtpUser: "පරිශීලක නාමය"
smtpPass: "මුරපදය" smtpPass: "මුරපදය"
user: "පරිශීලක" user: "පරිශීලක"
searchByGoogle: "සොයන්න"
_sfx: _sfx:
note: "නෝට්" note: "නෝට්"
notification: "දැනුම්දීම්"
_2fa:
renewTOTPCancel: "එපා, ස්තුතියි"
_widgets:
notifications: "දැනුම්දීම්"
_profile: _profile:
username: "පරිශීලක නාමය" username: "පරිශීලක නාමය"
_notification: _notification:
_types: _types:
login: "පිවිසෙන්න" login: "පිවිසෙන්න"
_deck:
_columns:
notifications: "දැනුම්දීම්"

View File

@ -204,7 +204,6 @@ noUsers: "Žiadni používatelia"
editProfile: "Upraviť profil" editProfile: "Upraviť profil"
noteDeleteConfirm: "Naozaj chcete odstrániť túto poznámku?" noteDeleteConfirm: "Naozaj chcete odstrániť túto poznámku?"
pinLimitExceeded: "Ďalšie poznámky už nemôžete pripnúť." pinLimitExceeded: "Ďalšie poznámky už nemôžete pripnúť."
intro: "Inštalácia Misskey je dokončená! Prosím vytvorte administrátora."
done: "Hotovo" done: "Hotovo"
processing: "Pracujem..." processing: "Pracujem..."
preview: "Náhľad" preview: "Náhľad"
@ -682,7 +681,6 @@ experimentalFeatures: "Experimentálne funkcie"
developer: "Vývojár" developer: "Vývojár"
makeExplorable: "Spraviť účet viditeľný v \"Objavovať\"" makeExplorable: "Spraviť účet viditeľný v \"Objavovať\""
makeExplorableDescription: "Ak toto vypnete, váš účet sa nezobrazí v sekcii \"Objavovat\"." makeExplorableDescription: "Ak toto vypnete, váš účet sa nezobrazí v sekcii \"Objavovat\"."
showGapBetweenNotesInTimeline: "Zobraziť medzeru medzi príspevkami časovej osi."
duplicate: "Duplikovať" duplicate: "Duplikovať"
left: "Naľavo" left: "Naľavo"
center: "Stred" center: "Stred"
@ -1110,7 +1108,6 @@ _theme:
buttonBg: "Pozadie tlačidla" buttonBg: "Pozadie tlačidla"
buttonHoverBg: "Pozadie tlačidla (pod kurzorom)" buttonHoverBg: "Pozadie tlačidla (pod kurzorom)"
inputBorder: "Okraj vstupného poľa" inputBorder: "Okraj vstupného poľa"
driveFolderBg: "Pozadie priečinu disku"
badge: "Odznak" badge: "Odznak"
messageBg: "Pozadie chatu" messageBg: "Pozadie chatu"
fgHighlighted: "Zvýraznený text" fgHighlighted: "Zvýraznený text"

View File

@ -211,7 +211,6 @@ noUsers: "Det finns inga användare"
editProfile: "Redigera profil" editProfile: "Redigera profil"
noteDeleteConfirm: "Är du säker på att du vill ta bort denna not?" noteDeleteConfirm: "Är du säker på att du vill ta bort denna not?"
pinLimitExceeded: "Du kan inte fästa fler noter" pinLimitExceeded: "Du kan inte fästa fler noter"
intro: "Misskey har installerats! Vänligen skapa en adminanvändare."
done: "Klar" done: "Klar"
processing: "Bearbetar..." processing: "Bearbetar..."
preview: "Förhandsvisning" preview: "Förhandsvisning"

View File

@ -250,7 +250,6 @@ noUsers: "ไม่พบผู้ใช้งาน"
editProfile: "แก้ไขโปรไฟล์" editProfile: "แก้ไขโปรไฟล์"
noteDeleteConfirm: "ต้องการลบโน้ตนี้ใช่ไหม?" noteDeleteConfirm: "ต้องการลบโน้ตนี้ใช่ไหม?"
pinLimitExceeded: "คุณไม่สามารถปักหมุดโน้ตเพิ่มเติมใดๆได้อีก" pinLimitExceeded: "คุณไม่สามารถปักหมุดโน้ตเพิ่มเติมใดๆได้อีก"
intro: "การติดตั้ง Misskey เสร็จสิ้นแล้วนะ! โปรดสร้างผู้ใช้งานที่เป็นผู้ดูแลระบบ"
done: "เสร็จสิ้น" done: "เสร็จสิ้น"
processing: "กำลังประมวลผล..." processing: "กำลังประมวลผล..."
preview: "แสดงตัวอย่าง" preview: "แสดงตัวอย่าง"
@ -778,7 +777,6 @@ thisIsExperimentalFeature: "นี่เป็นฟีเจอร์ทดล
developer: "สำหรับนักพัฒนา" developer: "สำหรับนักพัฒนา"
makeExplorable: "ทำให้บัญชีมองเห็นใน “สำรวจ”" makeExplorable: "ทำให้บัญชีมองเห็นใน “สำรวจ”"
makeExplorableDescription: "ถ้าหากคุณปิดการทำงานนี้ บัญชีของคุณนั้นจะไม่แสดงในส่วน “สำรวจ”" makeExplorableDescription: "ถ้าหากคุณปิดการทำงานนี้ บัญชีของคุณนั้นจะไม่แสดงในส่วน “สำรวจ”"
showGapBetweenNotesInTimeline: "แสดงช่องว่างระหว่างโพสต์บนไทม์ไลน์"
duplicate: "ทำซ้ำ" duplicate: "ทำซ้ำ"
left: "ซ้าย" left: "ซ้าย"
center: "กึ่งกลาง" center: "กึ่งกลาง"
@ -1227,7 +1225,6 @@ showAvatarDecorations: "แสดงตกแต่งอวตาร"
releaseToRefresh: "ปล่อยเพื่อรีเฟรช" releaseToRefresh: "ปล่อยเพื่อรีเฟรช"
refreshing: "กำลังรีเฟรช..." refreshing: "กำลังรีเฟรช..."
pullDownToRefresh: "ดึงลงเพื่อรีเฟรช" pullDownToRefresh: "ดึงลงเพื่อรีเฟรช"
disableStreamingTimeline: "ปิดใช้งานอัปเดตไทม์ไลน์แบบเรียลไทม์"
useGroupedNotifications: "แสดงผลการแจ้งเตือนแบบกลุ่มแล้ว" useGroupedNotifications: "แสดงผลการแจ้งเตือนแบบกลุ่มแล้ว"
signupPendingError: "มีปัญหาในการตรวจสอบที่อยู่อีเมลลิงก์อาจหมดอายุแล้ว" signupPendingError: "มีปัญหาในการตรวจสอบที่อยู่อีเมลลิงก์อาจหมดอายุแล้ว"
cwNotationRequired: "หากเปิดใช้งาน “ซ่อนเนื้อหา” จะต้องระบุคำอธิบาย" cwNotationRequired: "หากเปิดใช้งาน “ซ่อนเนื้อหา” จะต้องระบุคำอธิบาย"
@ -2010,7 +2007,6 @@ _theme:
buttonBg: "ปุ่มพื้นหลัง" buttonBg: "ปุ่มพื้นหลัง"
buttonHoverBg: "ปุ่มพื้นหลัง (โฮเวอร์)" buttonHoverBg: "ปุ่มพื้นหลัง (โฮเวอร์)"
inputBorder: "เส้นขอบของช่องป้อนข้อมูล" inputBorder: "เส้นขอบของช่องป้อนข้อมูล"
driveFolderBg: "พื้นหลังโฟลเดอร์ไดรฟ์"
badge: "ตรา" badge: "ตรา"
messageBg: "พื้นหลังแชท" messageBg: "พื้นหลังแชท"
fgHighlighted: "ข้อความที่ไฮไลต์" fgHighlighted: "ข้อความที่ไฮไลต์"
@ -2628,9 +2624,6 @@ _dataSaver:
_avatar: _avatar:
title: "รูปไอคอน" title: "รูปไอคอน"
description: "ระงับการเคลื่อนไหวของภาพไอคอน ภาพเคลื่อนไหวอาจมีขนาดไฟล์ใหญ่กว่าภาพปกติ ดังนั้นจึงสามารถช่วยในการลดการใช้ข้อมูล" description: "ระงับการเคลื่อนไหวของภาพไอคอน ภาพเคลื่อนไหวอาจมีขนาดไฟล์ใหญ่กว่าภาพปกติ ดังนั้นจึงสามารถช่วยในการลดการใช้ข้อมูล"
_urlPreview:
title: "ธัมบ์เนลแสดงตัวอย่าง URL"
description: "ธัมบ์เนลแสดงตัวอย่าง URL จะไม่โหลดโดยอัตโนมัติ"
_code: _code:
title: "ไฮไลต์โค้ด" title: "ไฮไลต์โค้ด"
description: "หากใช้สัญลักษณ์ไฮไลต์โค้ดใน MFM ฯลฯ สัญลักษณ์เหล่านั้นจะไม่โหลดจนกว่าจะแตะ การไฮไลต์ไวยากรณ์(syntax)จำเป็นต้องดาวน์โหลดไฟล์คำจำกัดความของไฮไลต์สำหรับแต่ละภาษา ดังนั้นการปิดใช้งานการโหลดไฟล์เหล่านี้โดยอัตโนมัติจึงคาดว่าจะช่วยลดปริมาณข้อมูลการสื่อสารได้" description: "หากใช้สัญลักษณ์ไฮไลต์โค้ดใน MFM ฯลฯ สัญลักษณ์เหล่านั้นจะไม่โหลดจนกว่าจะแตะ การไฮไลต์ไวยากรณ์(syntax)จำเป็นต้องดาวน์โหลดไฟล์คำจำกัดความของไฮไลต์สำหรับแต่ละภาษา ดังนั้นการปิดใช้งานการโหลดไฟล์เหล่านี้โดยอัตโนมัติจึงคาดว่าจะช่วยลดปริมาณข้อมูลการสื่อสารได้"

View File

@ -224,7 +224,6 @@ noUsers: "Kullanıcı yok"
editProfile: "Profili düzenle" editProfile: "Profili düzenle"
noteDeleteConfirm: "Bu notu silmek istediğinizden emin misiniz?" noteDeleteConfirm: "Bu notu silmek istediğinizden emin misiniz?"
pinLimitExceeded: "Daha fazla not sabitlenemez" pinLimitExceeded: "Daha fazla not sabitlenemez"
intro: "Misskey yüklemesi tamamlandı! Lütfen yönetici hesabını oluşturun."
done: "Tamamlandı" done: "Tamamlandı"
preview: "Önizleme" preview: "Önizleme"
default: "Varsayılan" default: "Varsayılan"

View File

@ -208,7 +208,6 @@ noUsers: "Немає користувачів"
editProfile: "Редагувати обліковий запис" editProfile: "Редагувати обліковий запис"
noteDeleteConfirm: "Ви дійсно хочете видалити цей запис?" noteDeleteConfirm: "Ви дійсно хочете видалити цей запис?"
pinLimitExceeded: "Більше записів не можна закріпити" pinLimitExceeded: "Більше записів не можна закріпити"
intro: "Встановлення Misskey завершено! Будь ласка, створіть обліковий запис адміністратора."
done: "Готово" done: "Готово"
processing: "Обробка" processing: "Обробка"
preview: "Попередній перегляд" preview: "Попередній перегляд"
@ -681,7 +680,6 @@ experimentalFeatures: "Експериментальні функції"
developer: "Розробник" developer: "Розробник"
makeExplorable: "Зробіть обліковий запис видимим у розділі \"Огляд\"" makeExplorable: "Зробіть обліковий запис видимим у розділі \"Огляд\""
makeExplorableDescription: "Вимкніть, щоб обліковий запис не показувався у розділі \"Огляд\"." makeExplorableDescription: "Вимкніть, щоб обліковий запис не показувався у розділі \"Огляд\"."
showGapBetweenNotesInTimeline: "Показувати розрив між записами у стрічці новин"
duplicate: "Дублікат" duplicate: "Дублікат"
left: "Лівий" left: "Лівий"
center: "Центр" center: "Центр"
@ -1304,7 +1302,6 @@ _theme:
buttonBg: "Фон кнопки" buttonBg: "Фон кнопки"
buttonHoverBg: "Фон кнопки (при наведенні)" buttonHoverBg: "Фон кнопки (при наведенні)"
inputBorder: "Край поля вводу" inputBorder: "Край поля вводу"
driveFolderBg: "Фон папки на диску"
badge: "Значок" badge: "Значок"
messageBg: "Фон переписки" messageBg: "Фон переписки"
fgHighlighted: "Виділений текст" fgHighlighted: "Виділений текст"

View File

@ -219,7 +219,6 @@ noUsers: "Foydalanuvchilar yoq"
editProfile: "Profilni o'zgartirish" editProfile: "Profilni o'zgartirish"
noteDeleteConfirm: "Haqiqatan ham bu qaydni oʻchirib tashlamoqchimisiz?" noteDeleteConfirm: "Haqiqatan ham bu qaydni oʻchirib tashlamoqchimisiz?"
pinLimitExceeded: "Siz boshqa qaydlarni mahkamlay olmaysiz" pinLimitExceeded: "Siz boshqa qaydlarni mahkamlay olmaysiz"
intro: "Misskeyni o'rnatish tugallandi! Iltimos, administrator foydalanuvchi yarating."
done: "Bajarildi" done: "Bajarildi"
processing: "Amaliyotda" processing: "Amaliyotda"
preview: "Ko'rish" preview: "Ko'rish"

View File

@ -102,7 +102,7 @@ pageLoadErrorDescription: "Có thể là do bộ nhớ đệm của trình duy
serverIsDead: "Máy chủ không phản hồi. Vui lòng thử lại sau giây lát." serverIsDead: "Máy chủ không phản hồi. Vui lòng thử lại sau giây lát."
youShouldUpgradeClient: "Để xem trang này, hãy làm tươi để cập nhật ứng dụng." youShouldUpgradeClient: "Để xem trang này, hãy làm tươi để cập nhật ứng dụng."
enterListName: "Đặt tên cho danh sách" enterListName: "Đặt tên cho danh sách"
privacy: "Bảo mật" privacy: "Riêng tư"
makeFollowManuallyApprove: "Yêu cầu theo dõi cần được duyệt" makeFollowManuallyApprove: "Yêu cầu theo dõi cần được duyệt"
defaultNoteVisibility: "Kiểu tút mặc định" defaultNoteVisibility: "Kiểu tút mặc định"
follow: "Theo dõi" follow: "Theo dõi"
@ -250,7 +250,6 @@ noUsers: "Chưa có ai"
editProfile: "Sửa hồ sơ" editProfile: "Sửa hồ sơ"
noteDeleteConfirm: "Bạn có chắc muốn xóa tút này?" noteDeleteConfirm: "Bạn có chắc muốn xóa tút này?"
pinLimitExceeded: "Bạn không thể ghim bài viết nữa" pinLimitExceeded: "Bạn không thể ghim bài viết nữa"
intro: "Đã cài đặt Misskey! Xin hãy tạo tài khoản admin."
done: "Xong" done: "Xong"
processing: "Đang xử lý" processing: "Đang xử lý"
preview: "Xem trước" preview: "Xem trước"
@ -783,7 +782,6 @@ thisIsExperimentalFeature: "Tính năng này đang trong quá trình thử nghi
developer: "Nhà phát triển" developer: "Nhà phát triển"
makeExplorable: "Không hiện tôi trong \"Khám phá\"" makeExplorable: "Không hiện tôi trong \"Khám phá\""
makeExplorableDescription: "Nếu bạn tắt, tài khoản của bạn sẽ không hiện trong mục \"Khám phá\"." makeExplorableDescription: "Nếu bạn tắt, tài khoản của bạn sẽ không hiện trong mục \"Khám phá\"."
showGapBetweenNotesInTimeline: "Hiện dải phân cách giữa các tút trên bảng tin"
duplicate: "Tạo bản sao" duplicate: "Tạo bản sao"
left: "Bên trái" left: "Bên trái"
center: "Giữa" center: "Giữa"
@ -1669,7 +1667,6 @@ _theme:
buttonBg: "Nền nút" buttonBg: "Nền nút"
buttonHoverBg: "Nền nút (Chạm)" buttonHoverBg: "Nền nút (Chạm)"
inputBorder: "Đường viền khung soạn thảo" inputBorder: "Đường viền khung soạn thảo"
driveFolderBg: "Nền thư mục Ổ đĩa"
badge: "Huy hiệu" badge: "Huy hiệu"
messageBg: "Nền chat" messageBg: "Nền chat"
fgHighlighted: "Chữ nổi bật" fgHighlighted: "Chữ nổi bật"

View File

@ -220,6 +220,7 @@ silenceThisInstance: "静音此服务器"
mediaSilenceThisInstance: "隐藏此服务器的媒体文件" mediaSilenceThisInstance: "隐藏此服务器的媒体文件"
operations: "操作" operations: "操作"
software: "软件" software: "软件"
softwareName: "软件名"
version: "版本" version: "版本"
metadata: "元数据" metadata: "元数据"
withNFiles: "{n} 个文件" withNFiles: "{n} 个文件"
@ -238,9 +239,9 @@ clearCachedFilesConfirm: "确定要清除所有缓存的远程文件吗?"
blockedInstances: "被屏蔽的服务器" blockedInstances: "被屏蔽的服务器"
blockedInstancesDescription: "设定要屏蔽的服务器,以换行分隔。被屏蔽的服务器将无法与本服务器进行交换通讯。子域名也同样会被屏蔽。" blockedInstancesDescription: "设定要屏蔽的服务器,以换行分隔。被屏蔽的服务器将无法与本服务器进行交换通讯。子域名也同样会被屏蔽。"
silencedInstances: "被静音的服务器" silencedInstances: "被静音的服务器"
silencedInstancesDescription: "设置要静音的服务器,以换行分隔。被静音的服务器内所有的账户将默认处于「静音」状态,仅能发送关注请求,并且在未关注状态下无法提及本地账户。被阻止的实例不受影响。" silencedInstancesDescription: "设置要静音的服务器,以换行分隔。被静音的服务器内所有的账户都被视为「静音」状态,且关注操作均需要被批准。被阻止的实例不受影响。"
mediaSilencedInstances: "已隐藏媒体文件的服务器" mediaSilencedInstances: "已隐藏媒体文件的服务器"
mediaSilencedInstancesDescription: "设置要隐藏媒体文件的服务器,以换行分隔。被设置为隐藏媒体文件服务器内所有账号的文件均按照「敏感内容」处理,且将无法使用自定义表情符号。被阻止的实例不受影响。" mediaSilencedInstancesDescription: "设置要隐藏媒体文件的服务器,以换行分隔。被设置服务器内所有账号的文件均按照「敏感内容」处理,且将无法使用自定义表情符号。被阻止的实例不受影响。"
federationAllowedHosts: "允许联合的服务器" federationAllowedHosts: "允许联合的服务器"
federationAllowedHostsDescription: "设定允许联合的服务器,以换行分隔。" federationAllowedHostsDescription: "设定允许联合的服务器,以换行分隔。"
muteAndBlock: "隐藏和屏蔽" muteAndBlock: "隐藏和屏蔽"
@ -250,7 +251,6 @@ noUsers: "无用户"
editProfile: "编辑资料" editProfile: "编辑资料"
noteDeleteConfirm: "确定要删除该帖子吗?" noteDeleteConfirm: "确定要删除该帖子吗?"
pinLimitExceeded: "无法置顶更多了" pinLimitExceeded: "无法置顶更多了"
intro: "Misskey 的部署结束啦!创建管理员账号吧!"
done: "完成" done: "完成"
processing: "正在处理" processing: "正在处理"
preview: "预览" preview: "预览"
@ -298,6 +298,7 @@ uploadFromUrl: "从网址上传"
uploadFromUrlDescription: "输入文件的 URL" uploadFromUrlDescription: "输入文件的 URL"
uploadFromUrlRequested: "请求上传" uploadFromUrlRequested: "请求上传"
uploadFromUrlMayTakeTime: "上传可能需要一些时间完成。" uploadFromUrlMayTakeTime: "上传可能需要一些时间完成。"
uploadNFiles: "上传 {n} 个文件"
explore: "发现" explore: "发现"
messageRead: "已读" messageRead: "已读"
noMoreHistory: "没有更多的历史记录" noMoreHistory: "没有更多的历史记录"
@ -575,8 +576,10 @@ showFixedPostForm: "在时间线顶部显示发帖框"
showFixedPostFormInChannel: "在时间线顶部显示发帖对话框(频道)" showFixedPostFormInChannel: "在时间线顶部显示发帖对话框(频道)"
withRepliesByDefaultForNewlyFollowed: "在时间线中默认包含新关注用户的回复" withRepliesByDefaultForNewlyFollowed: "在时间线中默认包含新关注用户的回复"
newNoteRecived: "有新的帖子" newNoteRecived: "有新的帖子"
newNote: "新帖子"
sounds: "提示音" sounds: "提示音"
sound: "提示音" sound: "提示音"
notificationSoundSettings: "设置通知声音"
listen: "试听" listen: "试听"
none: "无" none: "无"
showInPage: "在页面中显示" showInPage: "在页面中显示"
@ -784,7 +787,6 @@ thisIsExperimentalFeature: "这是一项实验性功能。规范可能会变更
developer: "开发者" developer: "开发者"
makeExplorable: "使账号可见。" makeExplorable: "使账号可见。"
makeExplorableDescription: "关闭时,账号不会显示在\"发现\"中。" makeExplorableDescription: "关闭时,账号不会显示在\"发现\"中。"
showGapBetweenNotesInTimeline: "时间线上的帖子分开显示。"
duplicate: "复制" duplicate: "复制"
left: "左" left: "左"
center: "中央" center: "中央"
@ -792,6 +794,7 @@ wide: "宽"
narrow: "窄" narrow: "窄"
reloadToApplySetting: "页面刷新后设置才会生效。是否现在刷新页面?" reloadToApplySetting: "页面刷新后设置才会生效。是否现在刷新页面?"
needReloadToApply: "重新载入后应用才会生效。" needReloadToApply: "重新载入后应用才会生效。"
needToRestartServerToApply: "需要重启服务才能应用更改。"
showTitlebar: "显示标题栏" showTitlebar: "显示标题栏"
clearCache: "清除缓存" clearCache: "清除缓存"
onlineUsersCount: "{n} 人在线" onlineUsersCount: "{n} 人在线"
@ -1237,7 +1240,6 @@ showAvatarDecorations: "显示头像挂件"
releaseToRefresh: "松开以刷新" releaseToRefresh: "松开以刷新"
refreshing: "刷新中" refreshing: "刷新中"
pullDownToRefresh: "下拉以刷新" pullDownToRefresh: "下拉以刷新"
disableStreamingTimeline: "禁止实时更新时间线"
useGroupedNotifications: "分组显示通知" useGroupedNotifications: "分组显示通知"
signupPendingError: "确认电子邮件时出现错误。链接可能已过期。" signupPendingError: "确认电子邮件时出现错误。链接可能已过期。"
cwNotationRequired: "在启用「隐藏内容」时必须输入注释" cwNotationRequired: "在启用「隐藏内容」时必须输入注释"
@ -1347,6 +1349,16 @@ readonly: "只读"
goToDeck: "返回至 Deck" goToDeck: "返回至 Deck"
federationJobs: "联合作业" federationJobs: "联合作业"
driveAboutTip: "网盘可以显示以前上传的文件。<br>\n也可以在发布帖子时重复使用文件或在发布帖子前预先上传文件。<br>\n<b>删除文件时,其将从至今为止所有用到该文件的地方(如帖子、页面、头像、横幅)消失。</b><br>\n也可以新建文件夹来整理文件。" driveAboutTip: "网盘可以显示以前上传的文件。<br>\n也可以在发布帖子时重复使用文件或在发布帖子前预先上传文件。<br>\n<b>删除文件时,其将从至今为止所有用到该文件的地方(如帖子、页面、头像、横幅)消失。</b><br>\n也可以新建文件夹来整理文件。"
scrollToClose: "滑动并关闭"
advice: "建议"
realtimeMode: "实时模式"
turnItOn: "开启"
turnItOff: "关闭"
emojiMute: "隐藏表情符号"
emojiUnmute: "解除隐藏表情符号"
muteX: "隐藏{x}"
unmuteX: "解除隐藏{x}"
abort: "中止"
_chat: _chat:
noMessagesYet: "还没有消息" noMessagesYet: "还没有消息"
newMessage: "新消息" newMessage: "新消息"
@ -1380,6 +1392,8 @@ _chat:
chatNotAvailableInOtherAccount: "对方账户目前处于无法使用聊天的状态。" chatNotAvailableInOtherAccount: "对方账户目前处于无法使用聊天的状态。"
cannotChatWithTheUser: "无法与此用户聊天" cannotChatWithTheUser: "无法与此用户聊天"
cannotChatWithTheUser_description: "可能现在无法使用聊天,或者对方未开启聊天。" cannotChatWithTheUser_description: "可能现在无法使用聊天,或者对方未开启聊天。"
youAreNotAMemberOfThisRoomButInvited: "您还未加入此房间,但已收到邀请。如要加入,请接受邀请。"
doYouAcceptInvitation: "要接受邀请吗?"
chatWithThisUser: "聊天" chatWithThisUser: "聊天"
thisUserAllowsChatOnlyFromFollowers: "此用户仅接受关注者发起的聊天。" thisUserAllowsChatOnlyFromFollowers: "此用户仅接受关注者发起的聊天。"
thisUserAllowsChatOnlyFromFollowing: "此用户仅接受关注的人发起的聊天。" thisUserAllowsChatOnlyFromFollowing: "此用户仅接受关注的人发起的聊天。"
@ -1419,9 +1433,19 @@ _settings:
makeEveryTextElementsSelectable: "使所有的文字均可选择" makeEveryTextElementsSelectable: "使所有的文字均可选择"
makeEveryTextElementsSelectable_description: "若开启,在某些情况下可能降低用户体验。" makeEveryTextElementsSelectable_description: "若开启,在某些情况下可能降低用户体验。"
useStickyIcons: "使图标跟随滚动" useStickyIcons: "使图标跟随滚动"
enableHighQualityImagePlaceholders: "显示高质量图像的占位符"
uiAnimations: "UI 动画"
showNavbarSubButtons: "在导航栏中显示副按钮" showNavbarSubButtons: "在导航栏中显示副按钮"
ifOn: "启用时" ifOn: "启用时"
ifOff: "关闭时" ifOff: "关闭时"
enableSyncThemesBetweenDevices: "在设备间同步已安装的主题"
enablePullToRefresh: "开启下拉刷新"
enablePullToRefresh_description: "使用鼠标时按下滚轮来拖动"
realtimeMode_description: "与服务器建立连接并实时更新内容。将会增加流量和电池消耗。"
contentsUpdateFrequency: "内容获取频率"
contentsUpdateFrequency_description: "设置越高,内容更新越实时,但性能会降低,并且会消耗更多的流量和电池。"
contentsUpdateFrequency_description2: "当实时模式开启时,无论此设置如何,内容都会实时更新。"
showUrlPreview: "显示 URL 预览"
_chat: _chat:
showSenderName: "显示发送者的名字" showSenderName: "显示发送者的名字"
sendOnEnter: "回车键发送" sendOnEnter: "回车键发送"
@ -1429,6 +1453,7 @@ _preferencesProfile:
profileName: "配置名" profileName: "配置名"
profileNameDescription: "请指定用于识别此设备的名称" profileNameDescription: "请指定用于识别此设备的名称"
profileNameDescription2: "如「PC」、「手机」等" profileNameDescription2: "如「PC」、「手机」等"
manageProfiles: "管理配置文件"
_preferencesBackup: _preferencesBackup:
autoBackup: "自动备份" autoBackup: "自动备份"
restoreFromBackup: "从备份恢复" restoreFromBackup: "从备份恢复"
@ -1467,6 +1492,7 @@ _delivery:
manuallySuspended: "手动停止中" manuallySuspended: "手动停止中"
goneSuspended: "因服务器被删除而停止" goneSuspended: "因服务器被删除而停止"
autoSuspendedForNotResponding: "因服务器无应答而停止" autoSuspendedForNotResponding: "因服务器无应答而停止"
softwareSuspended: "因有停止投递的软件而停止"
_bubbleGame: _bubbleGame:
howToPlay: "游戏说明" howToPlay: "游戏说明"
hold: "抓住" hold: "抓住"
@ -1491,7 +1517,7 @@ _announcement:
tooManyActiveAnnouncementDescription: "若有大量活动公告,可能会造成用户体验下降。请考虑归档已完成的公告。" tooManyActiveAnnouncementDescription: "若有大量活动公告,可能会造成用户体验下降。请考虑归档已完成的公告。"
readConfirmTitle: "标记为已读?" readConfirmTitle: "标记为已读?"
readConfirmText: "阅读“{title}”的内容并将其标记为已读。" readConfirmText: "阅读“{title}”的内容并将其标记为已读。"
shouldNotBeUsedToPresentPermanentInfo: "我们建议使用公告来发布临时性的流动信息而不是固定的常规信息,因为这可能损害用户体验,尤其是对于新用户而言。" shouldNotBeUsedToPresentPermanentInfo: "因可能损坏新用户的 UX 体验,建议将通知用于发布具有时效性的信息,而不是用于长期展示的信息。"
dialogAnnouncementUxWarn: "同时存在 2 个或以上的对话框公告极有可能对用户体验产生负面的影响,建议谨慎使用。" dialogAnnouncementUxWarn: "同时存在 2 个或以上的对话框公告极有可能对用户体验产生负面的影响,建议谨慎使用。"
silence: "不发送通知" silence: "不发送通知"
silenceDescription: "开启后,此条公告将不会发送通知,也不强制用户阅读。" silenceDescription: "开启后,此条公告将不会发送通知,也不强制用户阅读。"
@ -1598,6 +1624,23 @@ _serverSettings:
openRegistration: "开放注册" openRegistration: "开放注册"
openRegistrationWarning: "开放注册有风险。建议仅当能够持续监控服务器并在出现问题时能够立即响应时才打开它。" openRegistrationWarning: "开放注册有风险。建议仅当能够持续监控服务器并在出现问题时能够立即响应时才打开它。"
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "若在一段时间内没有检测到管理活动,为防止垃圾信息,此设定将自动关闭。" thisSettingWillAutomaticallyOffWhenModeratorsInactive: "若在一段时间内没有检测到管理活动,为防止垃圾信息,此设定将自动关闭。"
deliverSuspendedSoftware: "停止投递的软件"
deliverSuspendedSoftwareDescription: "可因安全漏洞之类的原因,停止向指定的服务器及服务器版本送信。版本信息由服务器提供,不保证可靠性。可使用 semver 范围来指定版本,但指定 >= 2024.3.1 将不包括如 2024.3.1-custom.0 等自定义版本,因此建议像 >= 2024.3.1-0 这样指定 prerelease 版本。"
singleUserMode: "单用户模式"
singleUserMode_description: "若此服务器只有自己使用,开启此模式将最佳化性能。"
signToActivityPubGet: "对 GET 请求签名"
signToActivityPubGet_description: "通常情况下请保持启用。若遇到联合通信方面的问题,将其关闭可能会有所改善,但另一方面有可能会造成无法通信。"
proxyRemoteFiles: "代理远程文件"
proxyRemoteFiles_description: "如果启用,远程服务器的文件将由代理提供。可有效保护图像预览缩略图的生成与用户隐私。"
allowExternalApRedirect: "允许通过 ActivityPub 重定向查询"
allowExternalApRedirect_description: "启用时,将允许其它服务器通过此服务器查询第三方内容,但有可能导致内容欺骗。"
userGeneratedContentsVisibilityForVisitor: "用户生成内容对非用户的可见性"
userGeneratedContentsVisibilityForVisitor_description: "这对于防止诸如难以审核的不适当的远程内容通过您自己的服务器无意中在互联网上公开等问题很有用。"
userGeneratedContentsVisibilityForVisitor_description2: "包含服务器接收到的远程内容在内,无条件将服务器上的所有内容公开在互联网上存在风险。特别是对去中心化的特性不是很了解的访问者有可能将远程服务器上的内容误认为是在此服务器内生成的,需要特别留意。"
_userGeneratedContentsVisibilityForVisitor:
all: "全部公开"
localOnly: "仅公开本地内容,隐藏远程内容"
none: "全部隐藏"
_accountMigration: _accountMigration:
moveFrom: "从别的账号迁移到此账户" moveFrom: "从别的账号迁移到此账户"
moveFromSub: "为另一个账户建立别名" moveFromSub: "为另一个账户建立别名"
@ -2155,7 +2198,6 @@ _theme:
buttonBg: "按钮背景" buttonBg: "按钮背景"
buttonHoverBg: "按钮背景(悬停)" buttonHoverBg: "按钮背景(悬停)"
inputBorder: "输入框边框" inputBorder: "输入框边框"
driveFolderBg: "网盘的文件夹背景"
badge: "徽章" badge: "徽章"
messageBg: "聊天背景" messageBg: "聊天背景"
fgHighlighted: "高亮显示文本" fgHighlighted: "高亮显示文本"
@ -2791,9 +2833,12 @@ _dataSaver:
_avatar: _avatar:
title: "头像" title: "头像"
description: "停止播放头像的动画。 由于动画图片的文件大小可能比普通图像大,这可以进一步减少数据流量。" description: "停止播放头像的动画。 由于动画图片的文件大小可能比普通图像大,这可以进一步减少数据流量。"
_urlPreview: _urlPreviewThumbnail:
title: "URL预览缩略图\n" title: "不显示 URL预览缩略图"
description: "将不再加载 URL 预览缩略图。" description: "将不再加载 URL 预览缩略图。"
_disableUrlPreview:
title: "禁用 URL 预览"
description: "关闭 URL 预览功能。与预览缩略图不同,减少了链接信息的加载。"
_code: _code:
title: "代码高亮" title: "代码高亮"
description: "如果使用了代码高亮标记,例如在 MFM 中,则在点击之前不会加载。 代码高亮要求加载每种高亮语言的定义文件,由于这些文件不再自动加载,因此有望减少数据传输量。" description: "如果使用了代码高亮标记,例如在 MFM 中,则在点击之前不会加载。 代码高亮要求加载每种高亮语言的定义文件,由于这些文件不再自动加载,因此有望减少数据传输量。"
@ -2924,10 +2969,6 @@ _customEmojisManager:
uploadSettingDescription: "可以在此页面设置上传表情符号时的行为。" uploadSettingDescription: "可以在此页面设置上传表情符号时的行为。"
directoryToCategoryLabel: "将目录名设为「category」" directoryToCategoryLabel: "将目录名设为「category」"
directoryToCategoryCaption: "拖放目录时将目录名设置为「category」" directoryToCategoryCaption: "拖放目录时将目录名设置为「category」"
emojiInputAreaCaption: "请使用其中一种方法选择要注册的表情符号。"
emojiInputAreaList1: "在此区域内拖放图像文件或者目录"
emojiInputAreaList2: "单击此链接以从电脑中选择"
emojiInputAreaList3: "单击此链接以从网盘中选择"
confirmRegisterEmojisDescription: "要将列表内显示的表情符号替换为新的自定义表情符号吗?(为降低服务器负载,一次操作最多只能注册 {count} 个表情符号)" confirmRegisterEmojisDescription: "要将列表内显示的表情符号替换为新的自定义表情符号吗?(为降低服务器负载,一次操作最多只能注册 {count} 个表情符号)"
confirmClearEmojisDescription: "要放弃编辑并将列表内表示的表情符号清空吗?" confirmClearEmojisDescription: "要放弃编辑并将列表内表示的表情符号清空吗?"
confirmUploadEmojisDescription: "要将拖放的 {count} 个文件上传到网盘上吗?" confirmUploadEmojisDescription: "要将拖放的 {count} 个文件上传到网盘上吗?"
@ -3003,3 +3044,59 @@ _search:
pleaseEnterServerHost: "请填写服务器主机名" pleaseEnterServerHost: "请填写服务器主机名"
pleaseSelectUser: "请选择用户" pleaseSelectUser: "请选择用户"
serverHostPlaceholder: "如misskey.example.com" serverHostPlaceholder: "如misskey.example.com"
_serverSetupWizard:
installCompleted: "Misskey 安装完成!"
firstCreateAccount: "首先来创建管理员账号吧。"
accountCreated: "管理员账号已创建!"
serverSetting: "服务器设置"
youCanEasilyConfigureOptimalServerSettingsWithThisWizard: "用此向导来轻松地以最佳方式配置服务器。"
settingsYouMakeHereCanBeChangedLater: "这里的设置在之后也能更改。"
howWillYouUseMisskey: "打算怎样使用 Misskey"
_use:
single: "单用户服务器"
single_description: "仅供自己使用的单人服务器"
single_youCanCreateMultipleAccounts: "使用单用户服务器模式使用时,也可以根据需要创建多个账号。"
group: "小圈子服务器"
group_description: "邀请其他可信用户一起使用的多人服务器"
open: "开放服务器"
open_description: "以容纳不限定数量的用户的模式运行"
openServerAdvice: "容纳不限定数量的用户有风险。推荐建立能应对各种问题的强大的管理体制来运营。"
openServerAntiSpamAdvice: "为防止自己的服务器成为广告发信基地,请打开如 reCAPTCHA 等 Bot 防御功能,并谨慎关注安全性。"
howManyUsersDoYouExpect: "预计会有多少用户?"
_scale:
small: "100 人以下(小规模)"
medium: "100 人以上 1000 人以下(中规模)"
large: "1000 人以上(大规模)"
largeScaleServerAdvice: "运营大规模服务器可能需要高级基础设施知识,如负载均衡和数据库复制。"
doYouConnectToFediverse: "要加入 Fediverse 吗?"
doYouConnectToFediverse_description1: "若加入由分散性服务器所构成的网络Fediverse将能与其它服务器交换内容。"
doYouConnectToFediverse_description2: "加入 Fediverse 在这里被称为「联合」。"
youCanConfigureMoreFederationSettingsLater: "可在之后进行如哪些服务器可以进行联合等高级设置。"
adminInfo: "管理员信息"
adminInfo_description: "设置用于接受询问的管理员信息。"
adminInfo_mustBeFilled: "开放服务器或开启了联合的情况下必须输入。"
followingSettingsAreRecommended: "推荐以下设置"
applyTheseSettings: "使用此设置"
skipSettings: "跳过设置"
settingsCompleted: "设置完成!"
settingsCompleted_description: "辛苦了。设置已完成,可以立即开始使用服务器了。"
settingsCompleted_description2: "服务器的详细设置可在「控制面板」进行。"
donationRequest: "请求捐助"
_donationRequest:
text1: "Misskey 是由志愿者开发的免费软件。"
text2: "为了今后也能继续开发,如果可以的话,请考虑一下捐助。"
text3: "也有面向支援者的特典!"
_uploader:
compressedToX: "压缩 {x}"
savedXPercent: "节省了 {x}% 的空间"
abortConfirm: "还有未上传的文件,要中止吗?"
doneConfirm: "还有未上传的文件,要完成吗?"
maxFileSizeIsX: "可上传最大 {x} 的文件。"
_clientPerformanceIssueTip:
title: "如果觉得电池耗电过高"
makeSureDisabledAdBlocker: "请关闭广告拦截器"
makeSureDisabledAdBlocker_description: "广告拦截器会影响性能。请检查操作系统功能、浏览器功能或附加组件是否启用了广告拦截器。"
makeSureDisabledCustomCss: "请关闭自定义 CSS"
makeSureDisabledCustomCss_description: "覆盖样式可能会影响性能。请确保没有启用任何自定义 CSS 或覆盖样式的扩展。"
makeSureDisabledAddons: "请关闭扩展"
makeSureDisabledAddons_description: "某些扩展可能会干扰客户端的运行并影响性能。尝试禁用浏览器扩展并查看是否有改善。"

View File

@ -220,6 +220,7 @@ silenceThisInstance: "禁言此伺服器"
mediaSilenceThisInstance: "將這個伺服器的媒體設為禁言" mediaSilenceThisInstance: "將這個伺服器的媒體設為禁言"
operations: "操作" operations: "操作"
software: "軟體" software: "軟體"
softwareName: "軟體名稱"
version: "版本" version: "版本"
metadata: "詮釋資料" metadata: "詮釋資料"
withNFiles: "{n} 個檔案" withNFiles: "{n} 個檔案"
@ -250,7 +251,6 @@ noUsers: "沒有任何使用者"
editProfile: "編輯個人檔案" editProfile: "編輯個人檔案"
noteDeleteConfirm: "確定刪除此貼文嗎?" noteDeleteConfirm: "確定刪除此貼文嗎?"
pinLimitExceeded: "不能置頂更多貼文了" pinLimitExceeded: "不能置頂更多貼文了"
intro: "Misskey 部署完成!請建立管理員帳戶。"
done: "完成" done: "完成"
processing: "處理中" processing: "處理中"
preview: "預覽" preview: "預覽"
@ -298,6 +298,7 @@ uploadFromUrl: "從網址上傳"
uploadFromUrlDescription: "您要上傳的檔案網址" uploadFromUrlDescription: "您要上傳的檔案網址"
uploadFromUrlRequested: "已請求上傳" uploadFromUrlRequested: "已請求上傳"
uploadFromUrlMayTakeTime: "還需要一些時間才能完成上傳。" uploadFromUrlMayTakeTime: "還需要一些時間才能完成上傳。"
uploadNFiles: "上傳了 {n} 個檔案"
explore: "探索" explore: "探索"
messageRead: "已讀" messageRead: "已讀"
noMoreHistory: "沒有更多歷史紀錄" noMoreHistory: "沒有更多歷史紀錄"
@ -575,8 +576,10 @@ showFixedPostForm: "於時間軸頁頂顯示「發送貼文」方框"
showFixedPostFormInChannel: "於時間軸頁頂顯示「發送貼文」方框(頻道)" showFixedPostFormInChannel: "於時間軸頁頂顯示「發送貼文」方框(頻道)"
withRepliesByDefaultForNewlyFollowed: "在追隨其他人後,預設在時間軸納入回覆的貼文" withRepliesByDefaultForNewlyFollowed: "在追隨其他人後,預設在時間軸納入回覆的貼文"
newNoteRecived: "發現新貼文" newNoteRecived: "發現新貼文"
newNote: "新的貼文"
sounds: "音效" sounds: "音效"
sound: "音效" sound: "音效"
notificationSoundSettings: "設定通知音效"
listen: "聆聽" listen: "聆聽"
none: "無" none: "無"
showInPage: "在頁面中顯示" showInPage: "在頁面中顯示"
@ -784,7 +787,6 @@ thisIsExperimentalFeature: "這是一項實驗性功能,其行為會隨需要
developer: "開發者" developer: "開發者"
makeExplorable: "使自己的帳戶更容易被找到" makeExplorable: "使自己的帳戶更容易被找到"
makeExplorableDescription: "如果關閉,帳戶將不會被顯示在「探索」頁面中。" makeExplorableDescription: "如果關閉,帳戶將不會被顯示在「探索」頁面中。"
showGapBetweenNotesInTimeline: "分開顯示時間軸上的貼文"
duplicate: "複製" duplicate: "複製"
left: "左" left: "左"
center: "置中" center: "置中"
@ -792,6 +794,7 @@ wide: "寬"
narrow: "窄" narrow: "窄"
reloadToApplySetting: "設定將會在頁面重新載入之後生效。要現在就重載頁面嗎?" reloadToApplySetting: "設定將會在頁面重新載入之後生效。要現在就重載頁面嗎?"
needReloadToApply: "必須重新載入才會生效。" needReloadToApply: "必須重新載入才會生效。"
needToRestartServerToApply: "必須重新啟動伺服器才會使變更生效。"
showTitlebar: "顯示標題列" showTitlebar: "顯示標題列"
clearCache: "清除快取資料" clearCache: "清除快取資料"
onlineUsersCount: "{n} 人上線" onlineUsersCount: "{n} 人上線"
@ -1237,7 +1240,6 @@ showAvatarDecorations: "顯示頭像裝飾"
releaseToRefresh: "放開以更新內容" releaseToRefresh: "放開以更新內容"
refreshing: "載入更新中" refreshing: "載入更新中"
pullDownToRefresh: "往下拉來更新內容" pullDownToRefresh: "往下拉來更新內容"
disableStreamingTimeline: "停用時間軸的即時更新"
useGroupedNotifications: "分組顯示通知訊息" useGroupedNotifications: "分組顯示通知訊息"
signupPendingError: "驗證您的電子郵件地址時出現問題。連結可能已過期。" signupPendingError: "驗證您的電子郵件地址時出現問題。連結可能已過期。"
cwNotationRequired: "如果開啟「隱藏內容」,則需要註解說明。" cwNotationRequired: "如果開啟「隱藏內容」,則需要註解說明。"
@ -1347,6 +1349,16 @@ readonly: "唯讀"
goToDeck: "回去甲板" goToDeck: "回去甲板"
federationJobs: "聯邦通訊作業" federationJobs: "聯邦通訊作業"
driveAboutTip: "在「雲端硬碟」中,會顯示過去上傳的檔案列表。<br>\n可以在附加到貼文時重新利用或者事先上傳之後再用於發布。<br>\n<b>請注意,刪除檔案後,之前使用過該檔案的所有地方(貼文、頁面、大頭貼、橫幅等)也會一併無法顯示。</b><br>\n也可以建立資料夾來整理檔案。" driveAboutTip: "在「雲端硬碟」中,會顯示過去上傳的檔案列表。<br>\n可以在附加到貼文時重新利用或者事先上傳之後再用於發布。<br>\n<b>請注意,刪除檔案後,之前使用過該檔案的所有地方(貼文、頁面、大頭貼、橫幅等)也會一併無法顯示。</b><br>\n也可以建立資料夾來整理檔案。"
scrollToClose: "用滾輪關閉"
advice: "建議"
realtimeMode: "即時模式"
turnItOn: "開啟"
turnItOff: "關閉"
emojiMute: "表情符號靜音"
emojiUnmute: "表情符號解除靜音"
muteX: "將 {x} 靜音"
unmuteX: "將 {x} 解除靜音"
abort: "取消"
_chat: _chat:
noMessagesYet: "尚無訊息" noMessagesYet: "尚無訊息"
newMessage: "新訊息" newMessage: "新訊息"
@ -1380,6 +1392,8 @@ _chat:
chatNotAvailableInOtherAccount: "對方的帳號無法使用聊天功能。" chatNotAvailableInOtherAccount: "對方的帳號無法使用聊天功能。"
cannotChatWithTheUser: "無法與此使用者聊天" cannotChatWithTheUser: "無法與此使用者聊天"
cannotChatWithTheUser_description: "聊天功能目前無法使用,或對方尚未開放聊天功能。" cannotChatWithTheUser_description: "聊天功能目前無法使用,或對方尚未開放聊天功能。"
youAreNotAMemberOfThisRoomButInvited: "您不是此聊天室的參與者,但已收到邀請。若要加入,請先接受邀請。\n"
doYouAcceptInvitation: "您要接受這個邀請嗎?\n"
chatWithThisUser: "聊天" chatWithThisUser: "聊天"
thisUserAllowsChatOnlyFromFollowers: "此使用者僅接受來自追隨者的聊天訊息。" thisUserAllowsChatOnlyFromFollowers: "此使用者僅接受來自追隨者的聊天訊息。"
thisUserAllowsChatOnlyFromFollowing: "此使用者僅接受自己追隨的使用者傳送聊天訊息。" thisUserAllowsChatOnlyFromFollowing: "此使用者僅接受自己追隨的使用者傳送聊天訊息。"
@ -1419,10 +1433,19 @@ _settings:
makeEveryTextElementsSelectable: "允許選取所有文字" makeEveryTextElementsSelectable: "允許選取所有文字"
makeEveryTextElementsSelectable_description: "啟用此功能後,可能會在某些情境下降低可用性。" makeEveryTextElementsSelectable_description: "啟用此功能後,可能會在某些情境下降低可用性。"
useStickyIcons: "使大頭貼跟隨捲動" useStickyIcons: "使大頭貼跟隨捲動"
enableHighQualityImagePlaceholders: "顯示高品質的圖片預覽圖"
uiAnimations: "使用者介面的動畫效果\n"
showNavbarSubButtons: "在導覽列顯示輔助按鈕" showNavbarSubButtons: "在導覽列顯示輔助按鈕"
ifOn: "開啟時" ifOn: "開啟時"
ifOff: "關閉時" ifOff: "關閉時"
enableSyncThemesBetweenDevices: "在裝置之間同步已安裝的主題" enableSyncThemesBetweenDevices: "在裝置之間同步已安裝的主題"
enablePullToRefresh: "下拉更新"
enablePullToRefresh_description: "使用滑鼠,按下並拖曳滾輪。"
realtimeMode_description: "已與伺服器建立連線,將即時更新內容。這可能會增加資料傳輸量與電池消耗。\n"
contentsUpdateFrequency: "內容取得頻率"
contentsUpdateFrequency_description: "頻率越高,內容更新越即時,但可能會降低效能,並增加資料傳輸量與電池消耗。\n"
contentsUpdateFrequency_description2: "當即時模式開啟時,不論此設定為何,內容都會即時更新。"
showUrlPreview: "顯示網址預覽"
_chat: _chat:
showSenderName: "顯示發送者的名稱" showSenderName: "顯示發送者的名稱"
sendOnEnter: "按下 Enter 發送訊息" sendOnEnter: "按下 Enter 發送訊息"
@ -1430,6 +1453,7 @@ _preferencesProfile:
profileName: "設定檔案名稱" profileName: "設定檔案名稱"
profileNameDescription: "設定一個名稱來識別此裝置。" profileNameDescription: "設定一個名稱來識別此裝置。"
profileNameDescription2: "例如:「主要個人電腦」、「智慧型手機」等" profileNameDescription2: "例如:「主要個人電腦」、「智慧型手機」等"
manageProfiles: "管理個人檔案"
_preferencesBackup: _preferencesBackup:
autoBackup: "自動備份" autoBackup: "自動備份"
restoreFromBackup: "從備份還原" restoreFromBackup: "從備份還原"
@ -1468,6 +1492,7 @@ _delivery:
manuallySuspended: "手動暫停中" manuallySuspended: "手動暫停中"
goneSuspended: "因為伺服器刪除所以暫停中" goneSuspended: "因為伺服器刪除所以暫停中"
autoSuspendedForNotResponding: "因為伺服器沒有回應所以暫停中" autoSuspendedForNotResponding: "因為伺服器沒有回應所以暫停中"
softwareSuspended: "此軟體因已停止發佈,目前無法使用"
_bubbleGame: _bubbleGame:
howToPlay: "玩法說明" howToPlay: "玩法說明"
hold: "保留" hold: "保留"
@ -1599,6 +1624,23 @@ _serverSettings:
openRegistration: "允許建立帳戶" openRegistration: "允許建立帳戶"
openRegistrationWarning: "開放註冊伴隨著風險。 建議只有在伺服器受到持續監控,並準備好在出現問題時能立即處理的情況下才開放註冊。" openRegistrationWarning: "開放註冊伴隨著風險。 建議只有在伺服器受到持續監控,並準備好在出現問題時能立即處理的情況下才開放註冊。"
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "如果在一段期間內沒有偵測到任何審查員活動,此設定將自動關閉,以防止垃圾內容。" thisSettingWillAutomaticallyOffWhenModeratorsInactive: "如果在一段期間內沒有偵測到任何審查員活動,此設定將自動關閉,以防止垃圾內容。"
deliverSuspendedSoftware: "已停止發佈的軟體"
deliverSuspendedSoftwareDescription: "由於脆弱性等原因,可以指定伺服器軟體的名稱與版本範圍來停止其發佈。這些版本資訊是由伺服器所提供,其可靠性無法保證。版本的指定可以使用 semver語意化版本控制 的範圍語法,但如果指定為 >= 2024.3.1,則像 2024.3.1-custom.0 這樣的自訂版本將不會被包含在內,因此建議使用 >= 2024.3.1-0 的方式來同時包含預發佈版本。"
singleUserMode: "單人模式"
singleUserMode_description: "如果只有自己使用此伺服器的話,啟用此模式將使效能最佳化。"
signToActivityPubGet: "簽署 GET 請求"
signToActivityPubGet_description: "通常應該啟用此功能。停用可能會改善聯邦通訊的問題,但反過來也可能會使某些伺服器無法通訊。"
proxyRemoteFiles: "代理提供遠端檔案"
proxyRemoteFiles_description: "啟用時,它會代理並提供遠端檔案。 這有助於產生影像縮圖和保護使用者隱私。"
allowExternalApRedirect: "允許透過 ActivityPub 查詢時進行重新導向"
allowExternalApRedirect_description: "啟用後,其他伺服器可以透過此伺服器查詢第三方的內容,但也可能導致內容遭到冒充的風險。"
userGeneratedContentsVisibilityForVisitor: "使用者建立的內容對訪客的公開範圍"
userGeneratedContentsVisibilityForVisitor_description: "這有助於防止一些問題的發生,例如未經適當審核的不適當遠端內容無意中透過您自己的伺服器發佈到網際網路上。"
userGeneratedContentsVisibilityForVisitor_description2: "包括伺服器接收到的遠端內容在內,無條件地將伺服器內所有內容公開到網際網路上是具有風險的。特別是對於不了解分散式架構特性的瀏覽者來說,他們可能會誤以為這些遠端內容是由該伺服器所創建的,因此需要特別留意。"
_userGeneratedContentsVisibilityForVisitor:
all: "全部公開\n"
localOnly: "僅公開本地內容,遠端內容則不公開\n"
none: "全部不公開"
_accountMigration: _accountMigration:
moveFrom: "從其他帳戶遷移到這個帳戶" moveFrom: "從其他帳戶遷移到這個帳戶"
moveFromSub: "為另一個帳戶建立別名" moveFromSub: "為另一個帳戶建立別名"
@ -2156,7 +2198,6 @@ _theme:
buttonBg: "按鈕背景" buttonBg: "按鈕背景"
buttonHoverBg: "按鈕背景 (漂浮)" buttonHoverBg: "按鈕背景 (漂浮)"
inputBorder: "輸入框邊框" inputBorder: "輸入框邊框"
driveFolderBg: "雲端硬碟文件夾背景"
badge: "徽章" badge: "徽章"
messageBg: "私訊背景" messageBg: "私訊背景"
fgHighlighted: "突顯文字" fgHighlighted: "突顯文字"
@ -2792,9 +2833,12 @@ _dataSaver:
_avatar: _avatar:
title: "大頭貼" title: "大頭貼"
description: "停止顯示大頭貼的動畫。由於動畫圖片的檔案大小可能比普通圖片大,這可以進一步減少資料流量。" description: "停止顯示大頭貼的動畫。由於動畫圖片的檔案大小可能比普通圖片大,這可以進一步減少資料流量。"
_urlPreview: _urlPreviewThumbnail:
title: "網址預覽縮圖" title: "不顯示網址預覽縮圖"
description: "將不再自動載入網址預覽縮圖。" description: "將不再自動載入網址預覽縮圖。"
_disableUrlPreview:
title: "停用網址預覽"
description: "停用網址預覽功能。與單獨使用縮圖不同,這樣可以減少載入連結資訊本身。"
_code: _code:
title: "程式碼突出顯示" title: "程式碼突出顯示"
description: "如果使用了程式碼突顯語法(如 MFM則在點擊之前不會被載入。由於需要為對應的程式語言下載突顯定義檔案因此關閉自動載入有助於減少資料流量。" description: "如果使用了程式碼突顯語法(如 MFM則在點擊之前不會被載入。由於需要為對應的程式語言下載突顯定義檔案因此關閉自動載入有助於減少資料流量。"
@ -2925,10 +2969,6 @@ _customEmojisManager:
uploadSettingDescription: "您可以在此畫面設定表情符號上傳時的操作。" uploadSettingDescription: "您可以在此畫面設定表情符號上傳時的操作。"
directoryToCategoryLabel: "在「類別」欄位中輸入目錄名稱" directoryToCategoryLabel: "在「類別」欄位中輸入目錄名稱"
directoryToCategoryCaption: "拖放目錄時,請在「類別」欄位中輸入目錄名稱。" directoryToCategoryCaption: "拖放目錄時,請在「類別」欄位中輸入目錄名稱。"
emojiInputAreaCaption: "以下列其中一種方式選擇您想要註冊的表情符號"
emojiInputAreaList1: "將圖片檔案或目錄拖放到此框中"
emojiInputAreaList2: "點擊此連結從電腦中選擇"
emojiInputAreaList3: "點擊此連結從雲端硬碟中選擇"
confirmRegisterEmojisDescription: "將列表中顯示的表情符號登錄為新的自定表情符號。是否確定?(為避免過高負荷,每次操作最多可登錄{count}個表情符號)" confirmRegisterEmojisDescription: "將列表中顯示的表情符號登錄為新的自定表情符號。是否確定?(為避免過高負荷,每次操作最多可登錄{count}個表情符號)"
confirmClearEmojisDescription: "放棄編輯內容並清除列表中顯示的表情符號。是否確定?" confirmClearEmojisDescription: "放棄編輯內容並清除列表中顯示的表情符號。是否確定?"
confirmUploadEmojisDescription: "將拖放的{count}個檔案上傳到雲端硬碟。是否執行此操作?" confirmUploadEmojisDescription: "將拖放的{count}個檔案上傳到雲端硬碟。是否執行此操作?"
@ -3004,3 +3044,59 @@ _search:
pleaseEnterServerHost: "請輸入伺服器的主機名稱" pleaseEnterServerHost: "請輸入伺服器的主機名稱"
pleaseSelectUser: "請選擇使用者" pleaseSelectUser: "請選擇使用者"
serverHostPlaceholder: "例misskey.example.com" serverHostPlaceholder: "例misskey.example.com"
_serverSetupWizard:
installCompleted: "Misskey 的安裝已經完成了!"
firstCreateAccount: "首先,請建立管理者帳戶。"
accountCreated: "已建立管理者帳戶!"
serverSetting: "伺服器設定"
youCanEasilyConfigureOptimalServerSettingsWithThisWizard: "利用這個精靈,可以簡單地最佳化伺服器的設定。"
settingsYouMakeHereCanBeChangedLater: "這裡的設定之後也可以進行更改。\n"
howWillYouUseMisskey: "您打算如何使用 Misskey\n"
_use:
single: "單人伺服器"
single_description: "作為自己專用的伺服器,單獨使用。\n"
single_youCanCreateMultipleAccounts: "即使作為單人伺服器運行,根據需要也可以創建多個帳戶。\n"
group: "群組伺服器\n"
group_description: "邀請可信賴的其他使用者,共同使用伺服器。\n"
open: "開放式伺服器"
open_description: "運營時接納不特定多數的使用者。"
openServerAdvice: "接納不特定多數使用者會帶來風險。為了能夠有效處理問題,建議建立完善的審查機制來進行運營。\n"
openServerAntiSpamAdvice: "為了防止自家伺服器成為垃圾郵件的跳板,必須啟用如 reCAPTCHA 等反機器人功能,並對安全性保持高度警覺。\n"
howManyUsersDoYouExpect: "您預計有多少人使用呢?\n"
_scale:
small: "100人以下小規模\n"
medium: "100人以上1000人以下中規模\n"
large: "1000人以上大規模\n"
largeScaleServerAdvice: "在大規模伺服器中,可能需要具備高階基礎設施知識,如負載平衡和資料庫複寫等。\n"
doYouConnectToFediverse: "您要連接到聯邦宇宙Fediverse\n"
doYouConnectToFediverse_description1: "連接到由分散型伺服器構成的網絡(聯邦宇宙)後,您可以與其他伺服器進行內容的互相交流。\n"
doYouConnectToFediverse_description2: "連接到聯邦宇宙被稱為「聯邦」。\n"
youCanConfigureMoreFederationSettingsLater: "您可以在稍後進行更高級的設定,例如指定可以聯繫的伺服器等。\n"
adminInfo: "管理員資訊"
adminInfo_description: "設定用於接收查詢的管理者資訊。\n"
adminInfo_mustBeFilled: "當設置為開放伺服器或啟用聯邦時,必須填寫此資訊。\n"
followingSettingsAreRecommended: "建議使用下列設定"
applyTheseSettings: "套用此設定"
skipSettings: "跳過設定"
settingsCompleted: "設定完成!"
settingsCompleted_description: "辛苦了!準備已經完成,您可以立即開始使用伺服器了。\n"
settingsCompleted_description2: "詳細的伺服器設定可透過「控制臺」進行。"
donationRequest: "請求捐款"
_donationRequest:
text1: "Misskey 是由志願者開發的免費軟體。"
text2: "為了能夠繼續開發,若您願意的話,請考慮進行捐款。\n"
text3: "也有提供支援者專屬的特典!\n"
_uploader:
compressedToX: "壓縮為 {x}"
savedXPercent: "節省了 {x}%"
abortConfirm: "有些檔案尚未上傳,您要中止嗎?"
doneConfirm: "有些檔案尚未上傳,是否要完成上傳?"
maxFileSizeIsX: "可上傳的最大檔案大小為 {x}。"
_clientPerformanceIssueTip:
title: "如果覺得電池消耗過快的話"
makeSureDisabledAdBlocker: "請將廣告阻擋器停用"
makeSureDisabledAdBlocker_description: "廣告阻擋器可能會影響效能。請確認作業系統功能、瀏覽器設定或擴充功能中是否啟用了廣告阻擋器。\n"
makeSureDisabledCustomCss: "請停用自訂 CSS"
makeSureDisabledCustomCss_description: "覆蓋樣式可能會影響效能。請確認是否啟用了自訂 CSS 或其他會覆蓋樣式的擴充功能。\n"
makeSureDisabledAddons: "請停用擴充功能"
makeSureDisabledAddons_description: "部分擴充功能可能會干擾用戶端的運作並影響效能。請嘗試停用瀏覽器的擴充功能,以確認是否能改善情況"

View File

@ -1,16 +1,17 @@
{ {
"name": "misskey", "name": "misskey",
"version": "2025.4.1-beta.8", "version": "2025.5.1-beta.0",
"codename": "nasubi", "codename": "nasubi",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/misskey-dev/misskey.git" "url": "https://github.com/misskey-dev/misskey.git"
}, },
"packageManager": "pnpm@10.10.0", "packageManager": "pnpm@10.11.0",
"workspaces": [ "workspaces": [
"packages/frontend-shared", "packages/frontend-shared",
"packages/frontend", "packages/frontend",
"packages/frontend-embed", "packages/frontend-embed",
"packages/icons-subsetter",
"packages/backend", "packages/backend",
"packages/sw", "packages/sw",
"packages/misskey-js", "packages/misskey-js",
@ -34,7 +35,7 @@
"watch": "pnpm dev", "watch": "pnpm dev",
"dev": "node scripts/dev.mjs", "dev": "node scripts/dev.mjs",
"lint": "pnpm -r lint", "lint": "pnpm -r lint",
"cy:open": "pnpm cypress open --browser --e2e --config-file=cypress.config.ts", "cy:open": "pnpm cypress open --config-file=cypress.config.ts",
"cy:run": "pnpm cypress run", "cy:run": "pnpm cypress run",
"e2e": "pnpm start-server-and-test start:test http://localhost:61812 cy:run", "e2e": "pnpm start-server-and-test start:test http://localhost:61812 cy:run",
"e2e-dev-container": "ncp ./.config/cypress-devcontainer.yml ./.config/test.yml && pnpm start-server-and-test start:test http://localhost:61812 cy:run", "e2e-dev-container": "ncp ./.config/cypress-devcontainer.yml ./.config/test.yml && pnpm start-server-and-test start:test http://localhost:61812 cy:run",
@ -51,30 +52,30 @@
"lodash": "4.17.21" "lodash": "4.17.21"
}, },
"dependencies": { "dependencies": {
"cssnano": "7.0.6", "cssnano": "7.0.7",
"esbuild": "0.25.3", "esbuild": "0.25.4",
"execa": "9.5.2", "execa": "9.5.3",
"fast-glob": "3.3.3", "fast-glob": "3.3.3",
"glob": "11.0.2", "glob": "11.0.2",
"ignore-walk": "7.0.0", "ignore-walk": "7.0.0",
"js-yaml": "4.1.0", "js-yaml": "4.1.0",
"postcss": "8.5.3", "postcss": "8.5.3",
"tar": "7.4.3", "tar": "7.4.3",
"terser": "5.39.0", "terser": "5.39.2",
"typescript": "5.8.3" "typescript": "5.8.3"
}, },
"devDependencies": { "devDependencies": {
"@misskey-dev/eslint-plugin": "2.1.0", "@misskey-dev/eslint-plugin": "2.1.0",
"@types/node": "22.15.2", "@types/node": "22.15.21",
"@typescript-eslint/eslint-plugin": "8.31.0", "@typescript-eslint/eslint-plugin": "8.32.1",
"@typescript-eslint/parser": "8.31.0", "@typescript-eslint/parser": "8.32.1",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"cypress": "14.3.2", "cypress": "14.4.0",
"eslint": "9.25.1", "eslint": "9.27.0",
"globals": "16.0.0", "globals": "16.1.0",
"ncp": "2.0.0", "ncp": "2.0.0",
"pnpm": "10.10.0", "pnpm": "10.11.0",
"start-server-and-test": "2.0.11" "start-server-and-test": "2.0.12"
}, },
"optionalDependencies": { "optionalDependencies": {
"@tensorflow/tfjs-core": "4.22.0" "@tensorflow/tfjs-core": "4.22.0"

View File

@ -1,4 +1,5 @@
import tsParser from '@typescript-eslint/parser'; import tsParser from '@typescript-eslint/parser';
import globals from 'globals';
import sharedConfig from '../shared/eslint.config.js'; import sharedConfig from '../shared/eslint.config.js';
export default [ export default [
@ -6,6 +7,13 @@ export default [
{ {
ignores: ['**/node_modules', 'built', '@types/**/*', 'migration'], ignores: ['**/node_modules', 'built', '@types/**/*', 'migration'],
}, },
{
languageOptions: {
globals: {
...globals.node,
},
},
},
{ {
files: ['**/*.ts', '**/*.tsx'], files: ['**/*.ts', '**/*.tsx'],
languageOptions: { languageOptions: {

20
packages/backend/jest.js Normal file
View File

@ -0,0 +1,20 @@
#!/usr/bin/env node
import child_process from 'node:child_process';
import path from 'node:path';
import url from 'node:url';
import semver from 'semver';
const __filename = url.fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const args = [];
args.push(...[
...semver.satisfies(process.version, '^20.17.0 || ^22.0.0') ? ['--no-experimental-require-module'] : [],
'--experimental-vm-modules',
'--experimental-import-meta-resolve',
path.join(__dirname, 'node_modules/jest/bin/jest.js'),
...process.argv.slice(2),
]);
child_process.spawn(process.execPath, args, { stdio: 'inherit' });

View File

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class DeliverSuspendedSoftware1743403874305 {
name = 'DeliverSuspendedSoftware1743403874305'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "deliverSuspendedSoftware" jsonb NOT NULL DEFAULT '[]'`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "deliverSuspendedSoftware"`);
}
}

View File

@ -3,11 +3,25 @@
* SPDX-License-Identifier: AGPL-3.0-only * SPDX-License-Identifier: AGPL-3.0-only
*/ */
import { isConcurrentIndexMigrationEnabled } from "./js/migration-config.js";
export class CompositeNoteIndex1745378064470 { export class CompositeNoteIndex1745378064470 {
name = 'CompositeNoteIndex1745378064470'; name = 'CompositeNoteIndex1745378064470';
transaction = isConcurrentIndexMigrationEnabled() ? false : undefined;
async up(queryRunner) { async up(queryRunner) {
await queryRunner.query(`CREATE INDEX "IDX_724b311e6f883751f261ebe378" ON "note" ("userId", "id" DESC)`); const concurrently = isConcurrentIndexMigrationEnabled();
if (concurrently) {
const hasValidIndex = await queryRunner.query(`SELECT indisvalid FROM pg_index INNER JOIN pg_class ON pg_index.indexrelid = pg_class.oid WHERE pg_class.relname = 'IDX_724b311e6f883751f261ebe378'`);
if (hasValidIndex.length === 0 || hasValidIndex[0].indisvalid !== true) {
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_724b311e6f883751f261ebe378"`);
await queryRunner.query(`CREATE INDEX CONCURRENTLY "IDX_724b311e6f883751f261ebe378" ON "note" ("userId", "id" DESC)`);
}
} else {
await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_724b311e6f883751f261ebe378" ON "note" ("userId", "id" DESC)`);
}
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_5b87d9d19127bd5d92026017a7"`); await queryRunner.query(`DROP INDEX IF EXISTS "IDX_5b87d9d19127bd5d92026017a7"`);
// Flush all cached Linear Scan Plans and redo statistics for composite index // Flush all cached Linear Scan Plans and redo statistics for composite index
// this is important for Postgres to learn that even in highly complex queries, using this index first can reduce the result set significantly // this is important for Postgres to learn that even in highly complex queries, using this index first can reduce the result set significantly
@ -15,7 +29,8 @@ export class CompositeNoteIndex1745378064470 {
} }
async down(queryRunner) { async down(queryRunner) {
const mayConcurrently = isConcurrentIndexMigrationEnabled() ? 'CONCURRENTLY' : '';
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_724b311e6f883751f261ebe378"`); await queryRunner.query(`DROP INDEX IF EXISTS "IDX_724b311e6f883751f261ebe378"`);
await queryRunner.query(`CREATE INDEX "IDX_5b87d9d19127bd5d92026017a7" ON "note" ("userId")`); await queryRunner.query(`CREATE INDEX ${mayConcurrently} "IDX_5b87d9d19127bd5d92026017a7" ON "note" ("userId")`);
} }
} }

View File

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class VisibleUserGeneratedContentsForNonLoggedInVisitors1746330901644 {
name = 'VisibleUserGeneratedContentsForNonLoggedInVisitors1746330901644'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "ugcVisibilityForVisitor" character varying(128) NOT NULL DEFAULT 'local'`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "ugcVisibilityForVisitor"`);
}
}

View File

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class SingleUserMode1746422049376 {
name = 'SingleUserMode1746422049376'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "singleUserMode" boolean NOT NULL DEFAULT false`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "singleUserMode"`);
}
}

View File

@ -0,0 +1,24 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
import {loadConfig} from "./js/migration-config.js";
export class MigrateSomeConfigFileSettingsToMeta1746949539915 {
name = 'MigrateSomeConfigFileSettingsToMeta1746949539915'
async up(queryRunner) {
const config = loadConfig();
// $1 cannot be used in ALTER TABLE queries
await queryRunner.query(`ALTER TABLE "meta" ADD "proxyRemoteFiles" boolean NOT NULL DEFAULT ${config.proxyRemoteFiles}`);
await queryRunner.query(`ALTER TABLE "meta" ADD "signToActivityPubGet" boolean NOT NULL DEFAULT ${config.signToActivityPubGet}`);
await queryRunner.query(`ALTER TABLE "meta" ADD "allowExternalApRedirect" boolean NOT NULL DEFAULT ${!config.disallowExternalApRedirect}`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "allowExternalApRedirect"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "signToActivityPubGet"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "proxyRemoteFiles"`);
}
}

View File

@ -0,0 +1,31 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { path as configYamlPath } from '../../built/config.js';
import * as yaml from 'js-yaml';
import fs from "node:fs";
export function isConcurrentIndexMigrationEnabled() {
return process.env.MISSKEY_MIGRATION_CREATE_INDEX_CONCURRENTLY === '1';
}
let loadedConfigCache = undefined;
function loadConfigInternal() {
const config = yaml.load(fs.readFileSync(configYamlPath, 'utf-8'));
return {
disallowExternalApRedirect: Boolean(config.disallowExternalApRedirect ?? false),
proxyRemoteFiles: Boolean(config.proxyRemoteFiles ?? false),
signToActivityPubGet: Boolean(config.signToActivityPubGet ?? true),
}
}
export function loadConfig() {
if (loadedConfigCache === undefined) {
loadedConfigCache = loadConfigInternal();
}
return loadedConfigCache;
}

View File

@ -1,6 +1,7 @@
import { DataSource } from 'typeorm'; import { DataSource } from 'typeorm';
import { loadConfig } from './built/config.js'; import { loadConfig } from './built/config.js';
import { entities } from './built/postgres.js'; import { entities } from './built/postgres.js';
import { isConcurrentIndexMigrationEnabled } from "./migration/js/migration-config.js";
const config = loadConfig(); const config = loadConfig();
@ -14,4 +15,5 @@ export default new DataSource({
extra: config.db.extra, extra: config.db.extra,
entities: entities, entities: entities,
migrations: ['migration/*.js'], migrations: ['migration/*.js'],
migrationsTransactionMode: isConcurrentIndexMigrationEnabled() ? 'each' : 'all',
}); });

View File

@ -22,12 +22,12 @@
"typecheck": "tsc --noEmit && tsc -p test --noEmit && tsc -p test-federation --noEmit", "typecheck": "tsc --noEmit && tsc -p test --noEmit && tsc -p test-federation --noEmit",
"eslint": "eslint --quiet \"{src,test-federation}/**/*.ts\"", "eslint": "eslint --quiet \"{src,test-federation}/**/*.ts\"",
"lint": "pnpm typecheck && pnpm eslint", "lint": "pnpm typecheck && pnpm eslint",
"jest": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --forceExit --config jest.config.unit.cjs", "jest": "cross-env NODE_ENV=test node ./jest.js --forceExit --config jest.config.unit.cjs",
"jest:e2e": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --forceExit --config jest.config.e2e.cjs", "jest:e2e": "cross-env NODE_ENV=test node ./jest.js --forceExit --config jest.config.e2e.cjs",
"jest:fed": "node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --forceExit --config jest.config.fed.cjs", "jest:fed": "node ./jest.js --forceExit --config jest.config.fed.cjs",
"jest-and-coverage": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --coverage --forceExit --config jest.config.unit.cjs", "jest-and-coverage": "cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.unit.cjs",
"jest-and-coverage:e2e": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --coverage --forceExit --config jest.config.e2e.cjs", "jest-and-coverage:e2e": "cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.e2e.cjs",
"jest-clear": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --clearCache", "jest-clear": "cross-env NODE_ENV=test node ./jest.js --clearCache",
"test": "pnpm jest", "test": "pnpm jest",
"test:e2e": "pnpm build && pnpm build:test && pnpm jest:e2e", "test:e2e": "pnpm build && pnpm build:test && pnpm jest:e2e",
"test:fed": "pnpm jest:fed", "test:fed": "pnpm jest:fed",
@ -37,17 +37,17 @@
}, },
"optionalDependencies": { "optionalDependencies": {
"@swc/core-android-arm64": "1.3.11", "@swc/core-android-arm64": "1.3.11",
"@swc/core-darwin-arm64": "1.11.22", "@swc/core-darwin-arm64": "1.11.29",
"@swc/core-darwin-x64": "1.11.22", "@swc/core-darwin-x64": "1.11.29",
"@swc/core-freebsd-x64": "1.3.11", "@swc/core-freebsd-x64": "1.3.11",
"@swc/core-linux-arm-gnueabihf": "1.11.22", "@swc/core-linux-arm-gnueabihf": "1.11.29",
"@swc/core-linux-arm64-gnu": "1.11.22", "@swc/core-linux-arm64-gnu": "1.11.29",
"@swc/core-linux-arm64-musl": "1.11.22", "@swc/core-linux-arm64-musl": "1.11.29",
"@swc/core-linux-x64-gnu": "1.11.22", "@swc/core-linux-x64-gnu": "1.11.29",
"@swc/core-linux-x64-musl": "1.11.22", "@swc/core-linux-x64-musl": "1.11.29",
"@swc/core-win32-arm64-msvc": "1.11.22", "@swc/core-win32-arm64-msvc": "1.11.29",
"@swc/core-win32-ia32-msvc": "1.11.22", "@swc/core-win32-ia32-msvc": "1.11.29",
"@swc/core-win32-x64-msvc": "1.11.22", "@swc/core-win32-x64-msvc": "1.11.29",
"@tensorflow/tfjs": "4.22.0", "@tensorflow/tfjs": "4.22.0",
"@tensorflow/tfjs-node": "4.22.0", "@tensorflow/tfjs-node": "4.22.0",
"bufferutil": "4.0.9", "bufferutil": "4.0.9",
@ -67,8 +67,8 @@
"utf-8-validate": "6.0.5" "utf-8-validate": "6.0.5"
}, },
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "3.797.0", "@aws-sdk/client-s3": "3.815.0",
"@aws-sdk/lib-storage": "3.797.0", "@aws-sdk/lib-storage": "3.815.0",
"@discordapp/twemoji": "15.1.0", "@discordapp/twemoji": "15.1.0",
"@fastify/accepts": "5.0.2", "@fastify/accepts": "5.0.2",
"@fastify/cookie": "11.0.2", "@fastify/cookie": "11.0.2",
@ -76,22 +76,22 @@
"@fastify/express": "4.0.2", "@fastify/express": "4.0.2",
"@fastify/http-proxy": "10.0.2", "@fastify/http-proxy": "10.0.2",
"@fastify/multipart": "9.0.3", "@fastify/multipart": "9.0.3",
"@fastify/static": "8.1.1", "@fastify/static": "8.2.0",
"@fastify/view": "10.0.2", "@fastify/view": "10.0.2",
"@misskey-dev/sharp-read-bmp": "1.3.0", "@misskey-dev/sharp-read-bmp": "1.2.0",
"@misskey-dev/summaly": "5.2.1", "@misskey-dev/summaly": "5.2.1",
"@napi-rs/canvas": "0.1.69", "@napi-rs/canvas": "0.1.70",
"@nestjs/common": "11.1.0", "@nestjs/common": "11.1.1",
"@nestjs/core": "11.1.0", "@nestjs/core": "11.1.1",
"@nestjs/testing": "11.1.0", "@nestjs/testing": "11.1.1",
"@peertube/http-signature": "1.7.0", "@peertube/http-signature": "1.7.0",
"@sentry/node": "8.55.0", "@sentry/node": "8.55.0",
"@sentry/profiling-node": "8.55.0", "@sentry/profiling-node": "8.55.0",
"@simplewebauthn/server": "12.0.0", "@simplewebauthn/server": "12.0.0",
"@sinonjs/fake-timers": "11.3.1", "@sinonjs/fake-timers": "11.3.1",
"@smithy/node-http-handler": "2.5.0", "@smithy/node-http-handler": "2.5.0",
"@swc/cli": "0.7.3", "@swc/cli": "0.7.7",
"@swc/core": "1.11.22", "@swc/core": "1.11.29",
"@twemoji/parser": "15.1.1", "@twemoji/parser": "15.1.1",
"@types/redis-info": "3.0.3", "@types/redis-info": "3.0.3",
"accepts": "1.3.8", "accepts": "1.3.8",
@ -101,18 +101,18 @@
"bcryptjs": "2.4.3", "bcryptjs": "2.4.3",
"blurhash": "2.0.5", "blurhash": "2.0.5",
"body-parser": "1.20.3", "body-parser": "1.20.3",
"bullmq": "5.51.1", "bullmq": "5.53.0",
"cacheable-lookup": "7.0.0", "cacheable-lookup": "7.0.0",
"cbor": "9.0.2", "cbor": "9.0.2",
"chalk": "5.4.1", "chalk": "5.4.1",
"chalk-template": "1.1.0", "chalk-template": "1.1.0",
"chokidar": "3.6.0", "chokidar": "4.0.3",
"cli-highlight": "2.1.11", "cli-highlight": "2.1.11",
"color-convert": "2.0.1", "color-convert": "2.0.1",
"content-disposition": "0.5.4", "content-disposition": "0.5.4",
"date-fns": "2.30.0", "date-fns": "2.30.0",
"deep-email-validator": "0.1.21", "deep-email-validator": "0.1.21",
"fastify": "5.3.2", "fastify": "5.3.3",
"fastify-raw-body": "5.0.0", "fastify-raw-body": "5.0.0",
"feed": "4.2.2", "feed": "4.2.2",
"file-type": "19.6.0", "file-type": "19.6.0",
@ -151,7 +151,7 @@
"os-utils": "0.0.14", "os-utils": "0.0.14",
"otpauth": "9.4.0", "otpauth": "9.4.0",
"parse5": "7.3.0", "parse5": "7.3.0",
"pg": "8.15.6", "pg": "8.16.0",
"pkce-challenge": "4.1.0", "pkce-challenge": "4.1.0",
"probe-image-size": "7.2.3", "probe-image-size": "7.2.3",
"promise-limit": "2.7.0", "promise-limit": "2.7.0",
@ -159,36 +159,37 @@
"qrcode": "1.5.4", "qrcode": "1.5.4",
"random-seed": "0.3.0", "random-seed": "0.3.0",
"ratelimiter": "3.4.1", "ratelimiter": "3.4.1",
"re2": "1.21.4", "re2": "1.21.5",
"redis-info": "3.1.0", "redis-info": "3.1.0",
"redis-lock": "0.1.4", "redis-lock": "0.1.4",
"reflect-metadata": "0.2.2", "reflect-metadata": "0.2.2",
"rename": "1.0.4", "rename": "1.0.4",
"rss-parser": "3.13.0", "rss-parser": "3.13.0",
"rxjs": "7.8.2", "rxjs": "7.8.2",
"sanitize-html": "2.16.0", "sanitize-html": "2.17.0",
"secure-json-parse": "3.0.2", "secure-json-parse": "3.0.2",
"sharp": "0.34.1", "sharp": "0.33.5",
"semver": "7.7.2",
"slacc": "0.0.10", "slacc": "0.0.10",
"strict-event-emitter-types": "2.0.0", "strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0", "stringz": "2.1.0",
"systeminformation": "5.25.11", "systeminformation": "5.26.1",
"tinycolor2": "1.6.0", "tinycolor2": "1.6.0",
"tmp": "0.2.3", "tmp": "0.2.3",
"tsc-alias": "1.8.15", "tsc-alias": "1.8.16",
"tsconfig-paths": "4.2.0", "tsconfig-paths": "4.2.0",
"typeorm": "0.3.22", "typeorm": "0.3.24",
"typescript": "5.8.3", "typescript": "5.8.3",
"ulid": "2.4.0", "ulid": "2.4.0",
"vary": "1.1.2", "vary": "1.1.2",
"web-push": "3.6.7", "web-push": "3.6.7",
"ws": "8.18.1", "ws": "8.18.2",
"xev": "3.0.2" "xev": "3.0.2"
}, },
"devDependencies": { "devDependencies": {
"@jest/globals": "29.7.0", "@jest/globals": "29.7.0",
"@nestjs/platform-express": "10.4.17", "@nestjs/platform-express": "10.4.17",
"@sentry/vue": "9.14.0", "@sentry/vue": "9.22.0",
"@simplewebauthn/types": "12.0.0", "@simplewebauthn/types": "12.0.0",
"@swc/jest": "0.2.38", "@swc/jest": "0.2.38",
"@types/accepts": "1.3.7", "@types/accepts": "1.3.7",
@ -207,18 +208,18 @@
"@types/jsrsasign": "10.5.15", "@types/jsrsasign": "10.5.15",
"@types/mime-types": "2.1.4", "@types/mime-types": "2.1.4",
"@types/ms": "0.7.34", "@types/ms": "0.7.34",
"@types/node": "22.15.2", "@types/node": "22.15.21",
"@types/nodemailer": "6.4.17", "@types/nodemailer": "6.4.17",
"@types/oauth": "0.9.6", "@types/oauth": "0.9.6",
"@types/oauth2orize": "1.11.5", "@types/oauth2orize": "1.11.5",
"@types/oauth2orize-pkce": "0.1.2", "@types/oauth2orize-pkce": "0.1.2",
"@types/pg": "8.11.14", "@types/pg": "8.15.2",
"@types/pug": "2.0.10", "@types/pug": "2.0.10",
"@types/qrcode": "1.5.5", "@types/qrcode": "1.5.5",
"@types/random-seed": "0.3.5", "@types/random-seed": "0.3.5",
"@types/ratelimiter": "3.4.6", "@types/ratelimiter": "3.4.6",
"@types/rename": "1.0.7", "@types/rename": "1.0.7",
"@types/sanitize-html": "2.15.0", "@types/sanitize-html": "2.16.0",
"@types/semver": "7.7.0", "@types/semver": "7.7.0",
"@types/simple-oauth2": "5.0.7", "@types/simple-oauth2": "5.0.7",
"@types/sinonjs__fake-timers": "8.1.5", "@types/sinonjs__fake-timers": "8.1.5",
@ -228,8 +229,8 @@
"@types/vary": "1.1.3", "@types/vary": "1.1.3",
"@types/web-push": "3.6.4", "@types/web-push": "3.6.4",
"@types/ws": "8.18.1", "@types/ws": "8.18.1",
"@typescript-eslint/eslint-plugin": "8.31.0", "@typescript-eslint/eslint-plugin": "8.32.1",
"@typescript-eslint/parser": "8.31.0", "@typescript-eslint/parser": "8.32.1",
"aws-sdk-client-mock": "4.1.0", "aws-sdk-client-mock": "4.1.0",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"eslint-plugin-import": "2.31.0", "eslint-plugin-import": "2.31.0",
@ -240,6 +241,6 @@
"nodemon": "3.1.10", "nodemon": "3.1.10",
"pid-port": "1.0.2", "pid-port": "1.0.2",
"simple-oauth2": "5.1.0", "simple-oauth2": "5.1.0",
"supertest": "7.1.0" "supertest": "7.1.1"
} }
} }

View File

@ -24,8 +24,13 @@ const $config: Provider = {
const $db: Provider = { const $db: Provider = {
provide: DI.db, provide: DI.db,
useFactory: async (config) => { useFactory: async (config) => {
try {
const db = createPostgresDataSource(config); const db = createPostgresDataSource(config);
return await db.initialize(); return await db.initialize();
} catch (e) {
console.log(e);
throw e;
}
}, },
inject: [DI.config], inject: [DI.config],
}; };

View File

@ -79,7 +79,6 @@ type Source = {
proxyBypassHosts?: string[]; proxyBypassHosts?: string[];
allowedPrivateNetworks?: string[]; allowedPrivateNetworks?: string[];
disallowExternalApRedirect?: boolean;
maxFileSize?: number; maxFileSize?: number;
@ -100,11 +99,8 @@ type Source = {
inboxJobMaxAttempts?: number; inboxJobMaxAttempts?: number;
mediaProxy?: string; mediaProxy?: string;
proxyRemoteFiles?: boolean;
videoThumbnailGenerator?: string; videoThumbnailGenerator?: string;
signToActivityPubGet?: boolean;
perChannelMaxNoteCacheCount?: number; perChannelMaxNoteCacheCount?: number;
perUserNotificationsMaxCount?: number; perUserNotificationsMaxCount?: number;
deactivateAntennaThreshold?: number; deactivateAntennaThreshold?: number;
@ -156,7 +152,6 @@ export type Config = {
proxySmtp: string | undefined; proxySmtp: string | undefined;
proxyBypassHosts: string[] | undefined; proxyBypassHosts: string[] | undefined;
allowedPrivateNetworks: string[] | undefined; allowedPrivateNetworks: string[] | undefined;
disallowExternalApRedirect: boolean;
maxFileSize: number; maxFileSize: number;
clusterLimit: number | undefined; clusterLimit: number | undefined;
id: string; id: string;
@ -170,8 +165,6 @@ export type Config = {
relationshipJobPerSec: number | undefined; relationshipJobPerSec: number | undefined;
deliverJobMaxAttempts: number | undefined; deliverJobMaxAttempts: number | undefined;
inboxJobMaxAttempts: number | undefined; inboxJobMaxAttempts: number | undefined;
proxyRemoteFiles: boolean | undefined;
signToActivityPubGet: boolean | undefined;
logging?: { logging?: {
sql?: { sql?: {
disableQueryTruncation?: boolean, disableQueryTruncation?: boolean,
@ -229,7 +222,7 @@ const dir = `${_dirname}/../../../.config`;
/** /**
* Path of configuration file * Path of configuration file
*/ */
const path = process.env.MISSKEY_CONFIG_YML export const path = process.env.MISSKEY_CONFIG_YML
? resolve(dir, process.env.MISSKEY_CONFIG_YML) ? resolve(dir, process.env.MISSKEY_CONFIG_YML)
: process.env.NODE_ENV === 'test' : process.env.NODE_ENV === 'test'
? resolve(dir, 'test.yml') ? resolve(dir, 'test.yml')
@ -300,7 +293,6 @@ export function loadConfig(): Config {
proxySmtp: config.proxySmtp, proxySmtp: config.proxySmtp,
proxyBypassHosts: config.proxyBypassHosts, proxyBypassHosts: config.proxyBypassHosts,
allowedPrivateNetworks: config.allowedPrivateNetworks, allowedPrivateNetworks: config.allowedPrivateNetworks,
disallowExternalApRedirect: config.disallowExternalApRedirect ?? false,
maxFileSize: config.maxFileSize ?? 262144000, maxFileSize: config.maxFileSize ?? 262144000,
clusterLimit: config.clusterLimit, clusterLimit: config.clusterLimit,
outgoingAddress: config.outgoingAddress, outgoingAddress: config.outgoingAddress,
@ -313,8 +305,6 @@ export function loadConfig(): Config {
relationshipJobPerSec: config.relationshipJobPerSec, relationshipJobPerSec: config.relationshipJobPerSec,
deliverJobMaxAttempts: config.deliverJobMaxAttempts, deliverJobMaxAttempts: config.deliverJobMaxAttempts,
inboxJobMaxAttempts: config.inboxJobMaxAttempts, inboxJobMaxAttempts: config.inboxJobMaxAttempts,
proxyRemoteFiles: config.proxyRemoteFiles,
signToActivityPubGet: config.signToActivityPubGet ?? true,
mediaProxy: externalMediaProxy ?? internalMediaProxy, mediaProxy: externalMediaProxy ?? internalMediaProxy,
externalMediaProxyEnabled: externalMediaProxy !== null && externalMediaProxy !== internalMediaProxy, externalMediaProxyEnabled: externalMediaProxy !== null && externalMediaProxy !== internalMediaProxy,
videoThumbnailGenerator: config.videoThumbnailGenerator ? videoThumbnailGenerator: config.videoThumbnailGenerator ?

View File

@ -9,87 +9,7 @@ import type { MiUser } from '@/models/User.js';
import { DI } from '@/di-symbols.js'; import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js'; import { bindThis } from '@/decorators.js';
import { NotificationService } from '@/core/NotificationService.js'; import { NotificationService } from '@/core/NotificationService.js';
import { ACHIEVEMENT_TYPES } from '@/models/UserProfile.js';
export const ACHIEVEMENT_TYPES = [
'notes1',
'notes10',
'notes100',
'notes500',
'notes1000',
'notes5000',
'notes10000',
'notes20000',
'notes30000',
'notes40000',
'notes50000',
'notes60000',
'notes70000',
'notes80000',
'notes90000',
'notes100000',
'login3',
'login7',
'login15',
'login30',
'login60',
'login100',
'login200',
'login300',
'login400',
'login500',
'login600',
'login700',
'login800',
'login900',
'login1000',
'passedSinceAccountCreated1',
'passedSinceAccountCreated2',
'passedSinceAccountCreated3',
'loggedInOnBirthday',
'loggedInOnNewYearsDay',
'noteClipped1',
'noteFavorited1',
'myNoteFavorited1',
'profileFilled',
'markedAsCat',
'following1',
'following10',
'following50',
'following100',
'following300',
'followers1',
'followers10',
'followers50',
'followers100',
'followers300',
'followers500',
'followers1000',
'collectAchievements30',
'viewAchievements3min',
'iLoveMisskey',
'foundTreasure',
'client30min',
'client60min',
'noteDeletedWithin1min',
'postedAtLateNight',
'postedAt0min0sec',
'selfQuote',
'htl20npm',
'viewInstanceChart',
'outputHelloWorldOnScratchpad',
'open3windows',
'driveFolderCircularReference',
'reactWithoutRead',
'clickedClickHere',
'justPlainLucky',
'setNameToSyuilo',
'cookieClicked',
'brainDiver',
'smashTestNotificationButton',
'tutorialCompleted',
'bubbleGameExplodingHead',
'bubbleGameDoubleExplodingHead',
] as const;
@Injectable() @Injectable()
export class AchievementService { export class AchievementService {

View File

@ -29,7 +29,7 @@ import { emojiRegex } from '@/misc/emoji-regex.js';
import { NotificationService } from '@/core/NotificationService.js'; import { NotificationService } from '@/core/NotificationService.js';
import { ModerationLogService } from '@/core/ModerationLogService.js'; import { ModerationLogService } from '@/core/ModerationLogService.js';
const MAX_ROOM_MEMBERS = 30; const MAX_ROOM_MEMBERS = 50;
const MAX_REACTIONS_PER_MESSAGE = 100; const MAX_REACTIONS_PER_MESSAGE = 100;
const isCustomEmojiRegexp = /^:([\w+-]+)(?:@\.)?:$/; const isCustomEmojiRegexp = /^:([\w+-]+)(?:@\.)?:$/;
@ -578,6 +578,20 @@ export class ChatService {
@bindThis @bindThis
public async deleteRoom(room: MiChatRoom, deleter?: MiUser) { public async deleteRoom(room: MiChatRoom, deleter?: MiUser) {
const memberships = (await this.chatRoomMembershipsRepository.findBy({ roomId: room.id })).map(m => ({
userId: m.userId,
})).concat({ // ownerはmembershipレコードを作らないため
userId: room.ownerId,
});
// 未読フラグ削除
const redisPipeline = this.redisClient.pipeline();
for (const membership of memberships) {
redisPipeline.del(`newRoomChatMessageExists:${membership.userId}:${room.id}`);
redisPipeline.srem(`newChatMessagesExists:${membership.userId}`, `room:${room.id}`);
}
await redisPipeline.exec();
await this.chatRoomsRepository.delete(room.id); await this.chatRoomsRepository.delete(room.id);
if (deleter) { if (deleter) {
@ -709,6 +723,12 @@ export class ChatService {
public async leaveRoom(userId: MiUser['id'], roomId: MiChatRoom['id']) { public async leaveRoom(userId: MiUser['id'], roomId: MiChatRoom['id']) {
const membership = await this.chatRoomMembershipsRepository.findOneByOrFail({ roomId, userId }); const membership = await this.chatRoomMembershipsRepository.findOneByOrFail({ roomId, userId });
await this.chatRoomMembershipsRepository.delete(membership.id); await this.chatRoomMembershipsRepository.delete(membership.id);
// 未読フラグを消す (「既読にする」というわけでもないのでreadメソッドは使わないでおく)
const redisPipeline = this.redisClient.pipeline();
redisPipeline.del(`newRoomChatMessageExists:${userId}:${roomId}`);
redisPipeline.srem(`newChatMessagesExists:${userId}`, `room:${roomId}`);
await redisPipeline.exec();
} }
@bindThis @bindThis

View File

@ -8,7 +8,7 @@ import * as fs from 'node:fs';
import { Inject, Injectable } from '@nestjs/common'; import { Inject, Injectable } from '@nestjs/common';
import sharp from 'sharp'; import sharp from 'sharp';
import { sharpBmp } from '@misskey-dev/sharp-read-bmp'; import { sharpBmp } from '@misskey-dev/sharp-read-bmp';
import { IsNull } from 'typeorm'; import { In, IsNull } from 'typeorm';
import { DeleteObjectCommandInput, PutObjectCommandInput, NoSuchKey } from '@aws-sdk/client-s3'; import { DeleteObjectCommandInput, PutObjectCommandInput, NoSuchKey } from '@aws-sdk/client-s3';
import { DI } from '@/di-symbols.js'; import { DI } from '@/di-symbols.js';
import type { DriveFilesRepository, UsersRepository, DriveFoldersRepository, UserProfilesRepository, MiMeta } from '@/models/_.js'; import type { DriveFilesRepository, UsersRepository, DriveFoldersRepository, UserProfilesRepository, MiMeta } from '@/models/_.js';
@ -515,16 +515,23 @@ export class DriveService {
this.registerLogger.debug(`ADD DRIVE FILE: user ${user?.id ?? 'not set'}, name ${detectedName}, tmp ${path}`); this.registerLogger.debug(`ADD DRIVE FILE: user ${user?.id ?? 'not set'}, name ${detectedName}, tmp ${path}`);
//#region Check drive usage //#region Check drive usage and mime type
if (user && !isLink) { if (user && !isLink) {
const usage = await this.driveFileEntityService.calcDriveUsageOf(user);
const isLocalUser = this.userEntityService.isLocalUser(user); const isLocalUser = this.userEntityService.isLocalUser(user);
const policies = await this.roleService.getUserPolicies(user.id); const policies = await this.roleService.getUserPolicies(user.id);
const allowedMimeTypes = policies.uploadableFileTypes;
const isAllowed = allowedMimeTypes.some((mimeType) => {
if (mimeType === '*' || mimeType === '*/*') return true;
if (mimeType.endsWith('/*')) return info.type.mime.startsWith(mimeType.slice(0, -1));
return info.type.mime === mimeType;
});
if (!isAllowed) {
throw new IdentifiableError('bd71c601-f9b0-4808-9137-a330647ced9b', 'Unallowed file type.');
}
const driveCapacity = 1024 * 1024 * policies.driveCapacityMb; const driveCapacity = 1024 * 1024 * policies.driveCapacityMb;
const maxFileSize = 1024 * 1024 * policies.maxFileSizeMb; const maxFileSize = 1024 * 1024 * policies.maxFileSizeMb;
this.registerLogger.debug('drive capacity override applied');
this.registerLogger.debug(`overrideCap: ${driveCapacity}bytes, usage: ${usage}bytes, u+s: ${usage + info.size}bytes`);
if (maxFileSize < info.size) { if (maxFileSize < info.size) {
if (isLocalUser) { if (isLocalUser) {
@ -532,6 +539,11 @@ export class DriveService {
} }
} }
const usage = await this.driveFileEntityService.calcDriveUsageOf(user);
this.registerLogger.debug('drive capacity override applied');
this.registerLogger.debug(`overrideCap: ${driveCapacity}bytes, usage: ${usage}bytes, u+s: ${usage + info.size}bytes`);
// If usage limit exceeded // If usage limit exceeded
if (driveCapacity < usage + info.size) { if (driveCapacity < usage + info.size) {
if (isLocalUser) { if (isLocalUser) {
@ -720,6 +732,21 @@ export class DriveService {
return fileObj; return fileObj;
} }
@bindThis
public async moveFiles(fileIds: MiDriveFile['id'][], folderId: MiDriveFolder['id'] | null, userId: MiUser['id']) {
const folder = folderId ? await this.driveFoldersRepository.findOneByOrFail({
id: folderId,
userId: userId,
}) : null;
await this.driveFilesRepository.update({
id: In(fileIds),
userId: userId,
}, {
folderId: folder ? folder.id : null,
});
}
@bindThis @bindThis
public async deleteFile(file: MiDriveFile, isExpired = false, deleter?: MiUser) { public async deleteFile(file: MiDriveFile, isExpired = false, deleter?: MiUser) {
if (file.storedInternal) { if (file.storedInternal) {

View File

@ -36,6 +36,7 @@ type TimelineOptions = {
excludeNoFiles?: boolean; excludeNoFiles?: boolean;
excludeReplies?: boolean; excludeReplies?: boolean;
excludePureRenotes: boolean; excludePureRenotes: boolean;
ignoreAuthorFromUserSuspension?: boolean;
dbFallback: (untilId: string | null, sinceId: string | null, limit: number) => Promise<MiNote[]>, dbFallback: (untilId: string | null, sinceId: string | null, limit: number) => Promise<MiNote[]>,
}; };
@ -139,6 +140,23 @@ export class FanoutTimelineEndpointService {
}; };
} }
{
const parentFilter = filter;
filter = (note) => {
const noteJoined = note as MiNote & {
renoteUser: MiUser | null;
replyUser: MiUser | null;
};
if (!ps.ignoreAuthorFromUserSuspension) {
if (note.user!.isSuspended) return false;
}
if (note.userId !== note.renoteUserId && noteJoined.renoteUser?.isSuspended) return false;
if (note.userId !== note.replyUserId && noteJoined.replyUser?.isSuspended) return false;
return parentFilter(note);
};
}
const redisTimeline: MiNote[] = []; const redisTimeline: MiNote[] = [];
let readFromRedis = 0; let readFromRedis = 0;
let lastSuccessfulRate = 1; // rateをキャッシュする let lastSuccessfulRate = 1; // rateをキャッシュする

View File

@ -43,29 +43,36 @@ export class QueryService {
) { ) {
} }
public makePaginationQuery<T extends ObjectLiteral>(q: SelectQueryBuilder<T>, sinceId?: string | null, untilId?: string | null, sinceDate?: number | null, untilDate?: number | null): SelectQueryBuilder<T> { public makePaginationQuery<T extends ObjectLiteral>(
q: SelectQueryBuilder<T>,
sinceId?: string | null,
untilId?: string | null,
sinceDate?: number | null,
untilDate?: number | null,
targetColumn = 'id',
): SelectQueryBuilder<T> {
if (sinceId && untilId) { if (sinceId && untilId) {
q.andWhere(`${q.alias}.id > :sinceId`, { sinceId: sinceId }); q.andWhere(`${q.alias}.${targetColumn} > :sinceId`, { sinceId: sinceId });
q.andWhere(`${q.alias}.id < :untilId`, { untilId: untilId }); q.andWhere(`${q.alias}.${targetColumn} < :untilId`, { untilId: untilId });
q.orderBy(`${q.alias}.id`, 'DESC'); q.orderBy(`${q.alias}.${targetColumn}`, 'DESC');
} else if (sinceId) { } else if (sinceId) {
q.andWhere(`${q.alias}.id > :sinceId`, { sinceId: sinceId }); q.andWhere(`${q.alias}.${targetColumn} > :sinceId`, { sinceId: sinceId });
q.orderBy(`${q.alias}.id`, 'ASC'); q.orderBy(`${q.alias}.${targetColumn}`, 'ASC');
} else if (untilId) { } else if (untilId) {
q.andWhere(`${q.alias}.id < :untilId`, { untilId: untilId }); q.andWhere(`${q.alias}.${targetColumn} < :untilId`, { untilId: untilId });
q.orderBy(`${q.alias}.id`, 'DESC'); q.orderBy(`${q.alias}.${targetColumn}`, 'DESC');
} else if (sinceDate && untilDate) { } else if (sinceDate && untilDate) {
q.andWhere(`${q.alias}.id > :sinceId`, { sinceId: this.idService.gen(sinceDate) }); q.andWhere(`${q.alias}.${targetColumn} > :sinceId`, { sinceId: this.idService.gen(sinceDate) });
q.andWhere(`${q.alias}.id < :untilId`, { untilId: this.idService.gen(untilDate) }); q.andWhere(`${q.alias}.${targetColumn} < :untilId`, { untilId: this.idService.gen(untilDate) });
q.orderBy(`${q.alias}.id`, 'DESC'); q.orderBy(`${q.alias}.${targetColumn}`, 'DESC');
} else if (sinceDate) { } else if (sinceDate) {
q.andWhere(`${q.alias}.id > :sinceId`, { sinceId: this.idService.gen(sinceDate) }); q.andWhere(`${q.alias}.${targetColumn} > :sinceId`, { sinceId: this.idService.gen(sinceDate) });
q.orderBy(`${q.alias}.id`, 'ASC'); q.orderBy(`${q.alias}.${targetColumn}`, 'ASC');
} else if (untilDate) { } else if (untilDate) {
q.andWhere(`${q.alias}.id < :untilId`, { untilId: this.idService.gen(untilDate) }); q.andWhere(`${q.alias}.${targetColumn} < :untilId`, { untilId: this.idService.gen(untilDate) });
q.orderBy(`${q.alias}.id`, 'DESC'); q.orderBy(`${q.alias}.${targetColumn}`, 'DESC');
} else { } else {
q.orderBy(`${q.alias}.id`, 'DESC'); q.orderBy(`${q.alias}.${targetColumn}`, 'DESC');
} }
return q; return q;
} }
@ -287,4 +294,26 @@ export class QueryService {
.andWhere(instanceSuspension('renoteUser')); .andWhere(instanceSuspension('renoteUser'));
} }
} }
// Requirements: user replyUser renoteUser must be joined
@bindThis
public generateSuspendedUserQueryForNote(q: SelectQueryBuilder<any>, excludeAuthor?: boolean): void {
if (excludeAuthor) {
const brakets = (user: string) => new Brackets(qb => qb
.where(`note.${user}Id IS NULL`)
.orWhere(`user.id = ${user}.id`)
.orWhere(`${user}.isSuspended = FALSE`));
q
.andWhere(brakets('replyUser'))
.andWhere(brakets('renoteUser'));
} else {
const brakets = (user: string) => new Brackets(qb => qb
.where(`note.${user}Id IS NULL`)
.orWhere(`${user}.isSuspended = FALSE`));
q
.andWhere('user.isSuspended = FALSE')
.andWhere(brakets('replyUser'))
.andWhere(brakets('renoteUser'));
}
}
} }

View File

@ -39,6 +39,7 @@ import type {
} from './QueueModule.js'; } from './QueueModule.js';
import type httpSignature from '@peertube/http-signature'; import type httpSignature from '@peertube/http-signature';
import type * as Bull from 'bullmq'; import type * as Bull from 'bullmq';
import type { Packed } from '@/misc/json-schema.js';
export const QUEUE_TYPES = [ export const QUEUE_TYPES = [
'system', 'system',
@ -774,13 +775,13 @@ export class QueueService {
} }
@bindThis @bindThis
private packJobData(job: Bull.Job) { private packJobData(job: Bull.Job): Packed<'QueueJob'> {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
const stacktrace = job.stacktrace ? job.stacktrace.filter(Boolean) : []; const stacktrace = job.stacktrace ? job.stacktrace.filter(Boolean) : [];
stacktrace.reverse(); stacktrace.reverse();
return { return {
id: job.id, id: job.id!,
name: job.name, name: job.name,
data: job.data, data: job.data,
opts: job.opts, opts: job.opts,

View File

@ -65,6 +65,7 @@ export type RolePolicies = {
canImportMuting: boolean; canImportMuting: boolean;
canImportUserLists: boolean; canImportUserLists: boolean;
chatAvailability: 'available' | 'readonly' | 'unavailable'; chatAvailability: 'available' | 'readonly' | 'unavailable';
uploadableFileTypes: string[];
}; };
export const DEFAULT_POLICIES: RolePolicies = { export const DEFAULT_POLICIES: RolePolicies = {
@ -101,6 +102,13 @@ export const DEFAULT_POLICIES: RolePolicies = {
canImportMuting: true, canImportMuting: true,
canImportUserLists: true, canImportUserLists: true,
chatAvailability: 'available', chatAvailability: 'available',
uploadableFileTypes: [
'text/plain',
'application/json',
'image/*',
'video/*',
'audio/*',
],
}; };
@Injectable() @Injectable()
@ -412,6 +420,16 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
canImportMuting: calc('canImportMuting', vs => vs.some(v => v === true)), canImportMuting: calc('canImportMuting', vs => vs.some(v => v === true)),
canImportUserLists: calc('canImportUserLists', vs => vs.some(v => v === true)), canImportUserLists: calc('canImportUserLists', vs => vs.some(v => v === true)),
chatAvailability: calc('chatAvailability', aggregateChatAvailability), chatAvailability: calc('chatAvailability', aggregateChatAvailability),
uploadableFileTypes: calc('uploadableFileTypes', vs => {
const set = new Set<string>();
for (const v of vs) {
for (const type of v) {
if (type.trim() === '') continue;
set.add(type.trim());
}
}
return [...set];
}),
}; };
} }

View File

@ -235,6 +235,7 @@ export class SearchService {
this.queryService.generateVisibilityQuery(query, me); this.queryService.generateVisibilityQuery(query, me);
this.queryService.generateBlockedHostQueryForNote(query); this.queryService.generateBlockedHostQueryForNote(query);
this.queryService.generateSuspendedUserQueryForNote(query);
if (me) this.queryService.generateMutedUserQueryForNotes(query, me); if (me) this.queryService.generateMutedUserQueryForNotes(query, me);
if (me) this.queryService.generateBlockedUserQueryForNotes(query, me); if (me) this.queryService.generateBlockedUserQueryForNotes(query, me);
@ -297,11 +298,17 @@ export class SearchService {
]) ])
: [new Set<string>(), new Set<string>()]; : [new Set<string>(), new Set<string>()];
const query = this.notesRepository.createQueryBuilder('note'); const query = this.notesRepository.createQueryBuilder('note')
.innerJoinAndSelect('note.user', 'user')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
.leftJoinAndSelect('renote.user', 'renoteUser');
query.where('note.id IN (:...noteIds)', { noteIds: res.hits.map(x => x.id) }); query.where('note.id IN (:...noteIds)', { noteIds: res.hits.map(x => x.id) });
this.queryService.generateBlockedHostQueryForNote(query); this.queryService.generateBlockedHostQueryForNote(query);
this.queryService.generateSuspendedUserQueryForNote(query);
const notes = (await query.getMany()).filter(note => { const notes = (await query.getMany()).filter(note => {
if (me && isUserRelated(note, userIdsWhoBlockingMe)) return false; if (me && isUserRelated(note, userIdsWhoBlockingMe)) return false;

View File

@ -6,10 +6,12 @@
import { URL, domainToASCII } from 'node:url'; import { URL, domainToASCII } from 'node:url';
import { Inject, Injectable } from '@nestjs/common'; import { Inject, Injectable } from '@nestjs/common';
import RE2 from 're2'; import RE2 from 're2';
import semver from 'semver';
import { DI } from '@/di-symbols.js'; import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js'; import type { Config } from '@/config.js';
import { bindThis } from '@/decorators.js'; import { bindThis } from '@/decorators.js';
import { MiMeta } from '@/models/Meta.js'; import { MiMeta, SoftwareSuspension } from '@/models/Meta.js';
import { MiInstance } from '@/models/Instance.js';
@Injectable() @Injectable()
export class UtilityService { export class UtilityService {
@ -143,4 +145,20 @@ export class UtilityService {
const host = this.extractDbHost(uri); const host = this.extractDbHost(uri);
return this.isFederationAllowedHost(host); return this.isFederationAllowedHost(host);
} }
@bindThis
public isDeliverSuspendedSoftware(software: Pick<MiInstance, 'softwareName' | 'softwareVersion'>): SoftwareSuspension | undefined {
if (software.softwareName == null) return undefined;
if (software.softwareVersion == null) {
// software version is null; suspend iff versionRange is *
return this.meta.deliverSuspendedSoftware.find(x =>
x.software === software.softwareName
&& x.versionRange.trim() === '*');
} else {
const softwareVersion = software.softwareVersion;
return this.meta.deliverSuspendedSoftware.find(x =>
x.software === software.softwareName
&& semver.satisfies(softwareVersion, x.versionRange, { includePrerelease: true }));
}
}
} }

View File

@ -104,7 +104,7 @@ export class Resolver {
throw new IdentifiableError('09d79f9e-64f1-4316-9cfa-e75c4d091574', 'Instance is blocked'); throw new IdentifiableError('09d79f9e-64f1-4316-9cfa-e75c4d091574', 'Instance is blocked');
} }
if (this.config.signToActivityPubGet && !this.user) { if (this.meta.signToActivityPubGet && !this.user) {
this.user = await this.systemAccountService.fetch('actor'); this.user = await this.systemAccountService.fetch('actor');
} }

View File

@ -238,13 +238,15 @@ export class ChatEntityService {
options?: { options?: {
_hint_?: { _hint_?: {
packedOwners: Map<MiChatRoom['id'], Packed<'UserLite'>>; packedOwners: Map<MiChatRoom['id'], Packed<'UserLite'>>;
memberships?: Map<MiChatRoom['id'], MiChatRoomMembership | null | undefined>; myMemberships?: Map<MiChatRoom['id'], MiChatRoomMembership | null | undefined>;
myInvitations?: Map<MiChatRoom['id'], MiChatRoomInvitation | null | undefined>;
}; };
}, },
): Promise<Packed<'ChatRoom'>> { ): Promise<Packed<'ChatRoom'>> {
const room = typeof src === 'object' ? src : await this.chatRoomsRepository.findOneByOrFail({ id: src }); const room = typeof src === 'object' ? src : await this.chatRoomsRepository.findOneByOrFail({ id: src });
const membership = me && me.id !== room.ownerId ? (options?._hint_?.memberships?.get(room.id) ?? await this.chatRoomMembershipsRepository.findOneBy({ roomId: room.id, userId: me.id })) : null; const membership = me && me.id !== room.ownerId ? (options?._hint_?.myMemberships?.get(room.id) ?? await this.chatRoomMembershipsRepository.findOneBy({ roomId: room.id, userId: me.id })) : null;
const invitation = me && me.id !== room.ownerId ? (options?._hint_?.myInvitations?.get(room.id) ?? await this.chatRoomInvitationsRepository.findOneBy({ roomId: room.id, userId: me.id })) : null;
return { return {
id: room.id, id: room.id,
@ -254,6 +256,7 @@ export class ChatEntityService {
ownerId: room.ownerId, ownerId: room.ownerId,
owner: options?._hint_?.packedOwners.get(room.ownerId) ?? await this.userEntityService.pack(room.owner ?? room.ownerId, me), owner: options?._hint_?.packedOwners.get(room.ownerId) ?? await this.userEntityService.pack(room.owner ?? room.ownerId, me),
isMuted: membership != null ? membership.isMuted : false, isMuted: membership != null ? membership.isMuted : false,
invitationExists: invitation != null,
}; };
} }
@ -278,7 +281,7 @@ export class ChatEntityService {
const owners = _rooms.map(x => x.owner ?? x.ownerId); const owners = _rooms.map(x => x.owner ?? x.ownerId);
const [packedOwners, memberships] = await Promise.all([ const [packedOwners, myMemberships, myInvitations] = await Promise.all([
this.userEntityService.packMany(owners, me) this.userEntityService.packMany(owners, me)
.then(users => new Map(users.map(u => [u.id, u]))), .then(users => new Map(users.map(u => [u.id, u]))),
this.chatRoomMembershipsRepository.find({ this.chatRoomMembershipsRepository.find({
@ -287,9 +290,15 @@ export class ChatEntityService {
userId: me.id, userId: me.id,
}, },
}).then(memberships => new Map(_rooms.map(r => [r.id, memberships.find(m => m.roomId === r.id)]))), }).then(memberships => new Map(_rooms.map(r => [r.id, memberships.find(m => m.roomId === r.id)]))),
this.chatRoomInvitationsRepository.find({
where: {
roomId: In(_rooms.map(x => x.id)),
userId: me.id,
},
}).then(invitations => new Map(_rooms.map(r => [r.id, invitations.find(i => i.roomId === r.id)]))),
]); ]);
return Promise.all(_rooms.map(room => this.packRoom(room, me, { _hint_: { packedOwners, memberships } }))); return Promise.all(_rooms.map(room => this.packRoom(room, me, { _hint_: { packedOwners, myMemberships, myInvitations } })));
} }
@bindThis @bindThis

View File

@ -6,7 +6,7 @@
import { forwardRef, Inject, Injectable } from '@nestjs/common'; import { forwardRef, Inject, Injectable } from '@nestjs/common';
import { In } from 'typeorm'; import { In } from 'typeorm';
import { DI } from '@/di-symbols.js'; import { DI } from '@/di-symbols.js';
import type { DriveFilesRepository } from '@/models/_.js'; import type { DriveFilesRepository, MiMeta } from '@/models/_.js';
import type { Config } from '@/config.js'; import type { Config } from '@/config.js';
import type { Packed } from '@/misc/json-schema.js'; import type { Packed } from '@/misc/json-schema.js';
import { awaitAll } from '@/misc/prelude/await-all.js'; import { awaitAll } from '@/misc/prelude/await-all.js';
@ -34,6 +34,9 @@ export class DriveFileEntityService {
@Inject(DI.config) @Inject(DI.config)
private config: Config, private config: Config,
@Inject(DI.meta)
private meta: MiMeta,
@Inject(DI.driveFilesRepository) @Inject(DI.driveFilesRepository)
private driveFilesRepository: DriveFilesRepository, private driveFilesRepository: DriveFilesRepository,
@ -95,7 +98,7 @@ export class DriveFileEntityService {
return this.getProxiedUrl(file.uri, 'static'); return this.getProxiedUrl(file.uri, 'static');
} }
if (file.uri != null && file.isLink && this.config.proxyRemoteFiles) { if (file.uri != null && file.isLink && this.meta.proxyRemoteFiles) {
// リモートかつ期限切れはローカルプロキシを試みる // リモートかつ期限切れはローカルプロキシを試みる
// 従来は/files/${thumbnailAccessKey}にアクセスしていたが、 // 従来は/files/${thumbnailAccessKey}にアクセスしていたが、
// /filesはメディアプロキシにリダイレクトするようにしたため直接メディアプロキシを指定する // /filesはメディアプロキシにリダイレクトするようにしたため直接メディアプロキシを指定する
@ -115,7 +118,7 @@ export class DriveFileEntityService {
} }
// リモートかつ期限切れはローカルプロキシを試みる // リモートかつ期限切れはローカルプロキシを試みる
if (file.uri != null && file.isLink && this.config.proxyRemoteFiles) { if (file.uri != null && file.isLink && this.meta.proxyRemoteFiles) {
const key = file.webpublicAccessKey; const key = file.webpublicAccessKey;
if (key && !key.match('/')) { // 古いものはここにオブジェクトストレージキーが入ってるので除外 if (key && !key.match('/')) { // 古いものはここにオブジェクトストレージキーが入ってるので除外

View File

@ -31,6 +31,7 @@ export class InstanceEntityService {
me?: { id: MiUser['id']; } | null | undefined, me?: { id: MiUser['id']; } | null | undefined,
): Promise<Packed<'FederationInstance'>> { ): Promise<Packed<'FederationInstance'>> {
const iAmModerator = me ? await this.roleService.isModerator(me as MiUser) : false; const iAmModerator = me ? await this.roleService.isModerator(me as MiUser) : false;
const softwareSuspended = this.utilityService.isDeliverSuspendedSoftware(instance);
return { return {
id: instance.id, id: instance.id,
@ -41,8 +42,8 @@ export class InstanceEntityService {
followingCount: instance.followingCount, followingCount: instance.followingCount,
followersCount: instance.followersCount, followersCount: instance.followersCount,
isNotResponding: instance.isNotResponding, isNotResponding: instance.isNotResponding,
isSuspended: instance.suspensionState !== 'none', isSuspended: instance.suspensionState !== 'none' || Boolean(softwareSuspended),
suspensionState: instance.suspensionState, suspensionState: instance.suspensionState === 'none' && softwareSuspended ? 'softwareSuspended' : instance.suspensionState,
isBlocked: this.utilityService.isBlockedHost(this.meta.blockedHosts, instance.host), isBlocked: this.utilityService.isBlockedHost(this.meta.blockedHosts, instance.host),
softwareName: instance.softwareName, softwareName: instance.softwareName,
softwareVersion: instance.softwareVersion, softwareVersion: instance.softwareVersion,

View File

@ -429,6 +429,7 @@ export class NoteEntityService implements OnModuleInit {
userId: channel.userId, userId: channel.userId,
} : undefined, } : undefined,
mentions: note.mentions.length > 0 ? note.mentions : undefined, mentions: note.mentions.length > 0 ? note.mentions : undefined,
hasPoll: note.hasPoll || undefined,
uri: note.uri ?? undefined, uri: note.uri ?? undefined,
url: note.url ?? undefined, url: note.url ?? undefined,
@ -593,4 +594,42 @@ export class NoteEntityService implements OnModuleInit {
relations: ['user'], relations: ['user'],
}); });
} }
@bindThis
public async fetchDiffs(noteIds: MiNote['id'][]) {
if (noteIds.length === 0) return [];
const notes = await this.notesRepository.find({
where: {
id: In(noteIds),
},
select: {
id: true,
userHost: true,
reactions: true,
reactionAndUserPairCache: true,
},
});
const bufferedReactionsMap = this.meta.enableReactionsBuffering ? await this.reactionsBufferingService.getMany(noteIds) : null;
const packings = notes.map(note => {
const bufferedReactions = bufferedReactionsMap?.get(note.id);
//const reactionAndUserPairCache = note.reactionAndUserPairCache.concat(bufferedReactions.pairs.map(x => x.join('/')));
const reactions = this.reactionService.convertLegacyReactions(this.reactionsBufferingService.mergeReactions(note.reactions, bufferedReactions?.deltas ?? {}));
const reactionEmojiNames = Object.keys(reactions)
.filter(x => x.startsWith(':') && x.includes('@') && !x.includes('@.')) // リモートカスタム絵文字のみ
.map(x => this.reactionService.decodeReaction(x).reaction.replaceAll(':', ''));
return this.customEmojiService.populateEmojis(reactionEmojiNames, note.userHost).then(reactionEmojis => ({
id: note.id,
reactions,
reactionEmojis,
}));
});
return await Promise.all(packings);
}
} }

View File

@ -31,7 +31,11 @@ import { packedChannelSchema } from '@/models/json-schema/channel.js';
import { packedAntennaSchema } from '@/models/json-schema/antenna.js'; import { packedAntennaSchema } from '@/models/json-schema/antenna.js';
import { packedClipSchema } from '@/models/json-schema/clip.js'; import { packedClipSchema } from '@/models/json-schema/clip.js';
import { packedFederationInstanceSchema } from '@/models/json-schema/federation-instance.js'; import { packedFederationInstanceSchema } from '@/models/json-schema/federation-instance.js';
import { packedQueueCountSchema } from '@/models/json-schema/queue.js'; import {
packedQueueCountSchema,
packedQueueMetricsSchema,
packedQueueJobSchema,
} from '@/models/json-schema/queue.js';
import { packedGalleryPostSchema } from '@/models/json-schema/gallery-post.js'; import { packedGalleryPostSchema } from '@/models/json-schema/gallery-post.js';
import { import {
packedEmojiDetailedAdminSchema, packedEmojiDetailedAdminSchema,
@ -67,6 +71,7 @@ import { packedChatMessageSchema, packedChatMessageLiteSchema, packedChatMessage
import { packedChatRoomSchema } from '@/models/json-schema/chat-room.js'; import { packedChatRoomSchema } from '@/models/json-schema/chat-room.js';
import { packedChatRoomInvitationSchema } from '@/models/json-schema/chat-room-invitation.js'; import { packedChatRoomInvitationSchema } from '@/models/json-schema/chat-room-invitation.js';
import { packedChatRoomMembershipSchema } from '@/models/json-schema/chat-room-membership.js'; import { packedChatRoomMembershipSchema } from '@/models/json-schema/chat-room-membership.js';
import { packedAchievementNameSchema, packedAchievementSchema } from '@/models/json-schema/achievement.js';
export const refs = { export const refs = {
UserLite: packedUserLiteSchema, UserLite: packedUserLiteSchema,
@ -78,6 +83,8 @@ export const refs = {
User: packedUserSchema, User: packedUserSchema,
UserList: packedUserListSchema, UserList: packedUserListSchema,
Achievement: packedAchievementSchema,
AchievementName: packedAchievementNameSchema,
Ad: packedAdSchema, Ad: packedAdSchema,
Announcement: packedAnnouncementSchema, Announcement: packedAnnouncementSchema,
App: packedAppSchema, App: packedAppSchema,
@ -97,6 +104,8 @@ export const refs = {
PageBlock: packedPageBlockSchema, PageBlock: packedPageBlockSchema,
Channel: packedChannelSchema, Channel: packedChannelSchema,
QueueCount: packedQueueCountSchema, QueueCount: packedQueueCountSchema,
QueueMetrics: packedQueueMetricsSchema,
QueueJob: packedQueueJobSchema,
Antenna: packedAntennaSchema, Antenna: packedAntennaSchema,
Clip: packedClipSchema, Clip: packedClipSchema,
FederationInstance: packedFederationInstanceSchema, FederationInstance: packedFederationInstanceSchema,

View File

@ -106,3 +106,6 @@ export class MiAntenna {
}) })
public excludeNotesInSensitiveChannel: boolean; public excludeNotesInSensitiveChannel: boolean;
} }
// Note for future developers: When you added a new column,
// You should update ExportAntennaProcessorService and ImportAntennaProcessorService
// to export and import antennas correctly.

View File

@ -659,9 +659,45 @@ export class MiMeta {
}) })
public federationHosts: string[]; public federationHosts: string[];
@Column('varchar', {
length: 128,
default: 'local',
})
public ugcVisibilityForVisitor: 'all' | 'local' | 'none';
@Column('varchar', { @Column('varchar', {
length: 64, length: 64,
nullable: true, nullable: true,
}) })
public googleAnalyticsMeasurementId: string | null; public googleAnalyticsMeasurementId: string | null;
@Column('jsonb', {
default: [],
})
public deliverSuspendedSoftware: SoftwareSuspension[];
@Column('boolean', {
default: false,
})
public singleUserMode: boolean;
@Column('boolean', {
default: true,
})
public proxyRemoteFiles: boolean;
@Column('boolean', {
default: true,
})
public signToActivityPubGet: boolean;
@Column('boolean', {
default: true,
})
public allowExternalApRedirect: boolean;
} }
export type SoftwareSuspension = {
software: string,
versionRange: string,
};

View File

@ -10,6 +10,16 @@ import { MiUser } from './User.js';
import { MiChannel } from './Channel.js'; import { MiChannel } from './Channel.js';
import type { MiDriveFile } from './DriveFile.js'; import type { MiDriveFile } from './DriveFile.js';
// Note: When you create a new index for existing column of this table,
// it might be better to index concurrently under isConcurrentIndexMigrationEnabled flag
// by editing generated migration file since this table is very large,
// and it will make a long lock to create index in most cases.
// Please note that `CREATE INDEX CONCURRENTLY` is not supported in transaction,
// so you need to set `transaction = false` in migration if isConcurrentIndexMigrationEnabled() is true.
// Please refer 1745378064470-composite-note-index.js for example.
// You should not use `@Index({ concurrent: true })` decorator because database initialization for test will fail
// because it will always run CREATE INDEX in transaction based on decorators.
// Not appending `{ concurrent: true }` to `@Index` will not cause any problem in production,
@Index(['userId', 'id']) @Index(['userId', 'id'])
@Entity('note') @Entity('note')
export class MiNote { export class MiNote {
@ -229,7 +239,6 @@ export class MiNote {
comment: '[Denormalized]', comment: '[Denormalized]',
}) })
public renoteUserHost: string | null; public renoteUserHost: string | null;
//#endregion
constructor(data: Partial<MiNote>) { constructor(data: Partial<MiNote>) {
if (data == null) return; if (data == null) return;

View File

@ -274,7 +274,7 @@ export class MiUserProfile {
default: [], default: [],
}) })
public achievements: { public achievements: {
name: string; name: typeof ACHIEVEMENT_TYPES[number];
unlockedAt: number; unlockedAt: number;
}[]; }[];
@ -295,3 +295,84 @@ export class MiUserProfile {
} }
} }
} }
export const ACHIEVEMENT_TYPES = [
'notes1',
'notes10',
'notes100',
'notes500',
'notes1000',
'notes5000',
'notes10000',
'notes20000',
'notes30000',
'notes40000',
'notes50000',
'notes60000',
'notes70000',
'notes80000',
'notes90000',
'notes100000',
'login3',
'login7',
'login15',
'login30',
'login60',
'login100',
'login200',
'login300',
'login400',
'login500',
'login600',
'login700',
'login800',
'login900',
'login1000',
'passedSinceAccountCreated1',
'passedSinceAccountCreated2',
'passedSinceAccountCreated3',
'loggedInOnBirthday',
'loggedInOnNewYearsDay',
'noteClipped1',
'noteFavorited1',
'myNoteFavorited1',
'profileFilled',
'markedAsCat',
'following1',
'following10',
'following50',
'following100',
'following300',
'followers1',
'followers10',
'followers50',
'followers100',
'followers300',
'followers500',
'followers1000',
'collectAchievements30',
'viewAchievements3min',
'iLoveMisskey',
'foundTreasure',
'client30min',
'client60min',
'noteDeletedWithin1min',
'postedAtLateNight',
'postedAt0min0sec',
'selfQuote',
'htl20npm',
'viewInstanceChart',
'outputHelloWorldOnScratchpad',
'open3windows',
'driveFolderCircularReference',
'reactWithoutRead',
'clickedClickHere',
'justPlainLucky',
'setNameToSyuilo',
'cookieClicked',
'brainDiver',
'smashTestNotificationButton',
'tutorialCompleted',
'bubbleGameExplodingHead',
'bubbleGameDoubleExplodingHead',
] as const;

View File

@ -0,0 +1,25 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { ACHIEVEMENT_TYPES } from '@/models/UserProfile.js';
export const packedAchievementNameSchema = {
type: 'string',
enum: ACHIEVEMENT_TYPES,
optional: false,
} as const;
export const packedAchievementSchema = {
type: 'object',
properties: {
name: {
ref: 'AchievementName',
},
unlockedAt: {
type: 'number',
optional: false,
},
},
} as const;

View File

@ -36,5 +36,9 @@ export const packedChatRoomSchema = {
type: 'boolean', type: 'boolean',
optional: true, nullable: false, optional: true, nullable: false,
}, },
invitationExists: {
type: 'boolean',
optional: true, nullable: false,
},
}, },
} as const; } as const;

View File

@ -48,7 +48,7 @@ export const packedFederationInstanceSchema = {
suspensionState: { suspensionState: {
type: 'string', type: 'string',
nullable: false, optional: false, nullable: false, optional: false,
enum: ['none', 'manuallySuspended', 'goneSuspended', 'autoSuspendedForNotResponding'], enum: ['none', 'manuallySuspended', 'goneSuspended', 'autoSuspendedForNotResponding', 'softwareSuspended'],
}, },
isBlocked: { isBlocked: {
type: 'boolean', type: 'boolean',

View File

@ -256,6 +256,10 @@ export const packedNoteSchema = {
type: 'number', type: 'number',
optional: true, nullable: false, optional: true, nullable: false,
}, },
hasPoll: {
type: 'boolean',
optional: true, nullable: false,
},
myReaction: { myReaction: {
type: 'string', type: 'string',

View File

@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-only * SPDX-License-Identifier: AGPL-3.0-only
*/ */
import { ACHIEVEMENT_TYPES } from '@/core/AchievementService.js';
import { notificationTypes, userExportableEntities } from '@/types.js'; import { notificationTypes, userExportableEntities } from '@/types.js';
const baseSchema = { const baseSchema = {
@ -312,9 +311,7 @@ export const packedNotificationSchema = {
enum: ['achievementEarned'], enum: ['achievementEarned'],
}, },
achievement: { achievement: {
type: 'string', ref: 'AchievementName',
optional: false, nullable: false,
enum: ACHIEVEMENT_TYPES,
}, },
}, },
}, { }, {

View File

@ -28,3 +28,110 @@ export const packedQueueCountSchema = {
}, },
}, },
} as const; } as const;
// Bull.Metrics
export const packedQueueMetricsSchema = {
type: 'object',
properties: {
meta: {
type: 'object',
optional: false, nullable: false,
properties: {
count: {
type: 'number',
optional: false, nullable: false,
},
prevTS: {
type: 'number',
optional: false, nullable: false,
},
prevCount: {
type: 'number',
optional: false, nullable: false,
},
},
},
data: {
type: 'array',
optional: false, nullable: false,
items: {
type: 'number',
optional: false, nullable: false,
},
},
count: {
type: 'number',
optional: false, nullable: false,
},
},
} as const;
export const packedQueueJobSchema = {
type: 'object',
properties: {
id: {
type: 'string',
optional: false, nullable: false,
},
name: {
type: 'string',
optional: false, nullable: false,
},
data: {
type: 'object',
optional: false, nullable: false,
},
opts: {
type: 'object',
optional: false, nullable: false,
},
timestamp: {
type: 'number',
optional: false, nullable: false,
},
processedOn: {
type: 'number',
optional: true, nullable: false,
},
processedBy: {
type: 'string',
optional: true, nullable: false,
},
finishedOn: {
type: 'number',
optional: true, nullable: false,
},
progress: {
type: 'object',
optional: false, nullable: false,
},
attempts: {
type: 'number',
optional: false, nullable: false,
},
delay: {
type: 'number',
optional: false, nullable: false,
},
failedReason: {
type: 'string',
optional: false, nullable: false,
},
stacktrace: {
type: 'array',
optional: false, nullable: false,
items: {
type: 'string',
optional: false, nullable: false,
},
},
returnValue: {
type: 'object',
optional: false, nullable: false,
},
isFailed: {
type: 'boolean',
optional: false, nullable: false,
},
},
} as const;

View File

@ -228,6 +228,14 @@ export const packedRolePoliciesSchema = {
type: 'integer', type: 'integer',
optional: false, nullable: false, optional: false, nullable: false,
}, },
uploadableFileTypes: {
type: 'array',
optional: false, nullable: false,
items: {
type: 'string',
optional: false, nullable: false,
},
},
alwaysMarkNsfw: { alwaysMarkNsfw: {
type: 'boolean', type: 'boolean',
optional: false, nullable: false, optional: false, nullable: false,

View File

@ -630,18 +630,7 @@ export const packedMeDetailedOnlySchema = {
type: 'array', type: 'array',
nullable: false, optional: false, nullable: false, optional: false,
items: { items: {
type: 'object', ref: 'Achievement',
nullable: false, optional: false,
properties: {
name: {
type: 'string',
nullable: false, optional: false,
},
unlockedAt: {
type: 'number',
nullable: false, optional: false,
},
},
}, },
}, },
loggedInDays: { loggedInDays: {

View File

@ -71,6 +71,15 @@ export class DeliverProcessorService {
return 'skip (suspended)'; return 'skip (suspended)';
} }
const i = await (this.meta.enableStatsForFederatedInstances
? this.federatedInstanceService.fetchOrRegister(host)
: this.federatedInstanceService.fetch(host));
// suspend server by software
if (i != null && this.utilityService.isDeliverSuspendedSoftware(i)) {
return 'skip (software suspended)';
}
try { try {
await this.apRequestService.signedPost(job.data.user, job.data.to, job.data.content, job.data.digest); await this.apRequestService.signedPost(job.data.user, job.data.to, job.data.content, job.data.digest);
@ -79,10 +88,6 @@ export class DeliverProcessorService {
// Update instance stats // Update instance stats
process.nextTick(async () => { process.nextTick(async () => {
const i = await (this.meta.enableStatsForFederatedInstances
? this.federatedInstanceService.fetchOrRegister(host)
: this.federatedInstanceService.fetch(host));
if (i == null) return; if (i == null) return;
if (i.isNotResponding) { if (i.isNotResponding) {

View File

@ -15,6 +15,7 @@ import { bindThis } from '@/decorators.js';
import { createTemp } from '@/misc/create-temp.js'; import { createTemp } from '@/misc/create-temp.js';
import { UtilityService } from '@/core/UtilityService.js'; import { UtilityService } from '@/core/UtilityService.js';
import { NotificationService } from '@/core/NotificationService.js'; import { NotificationService } from '@/core/NotificationService.js';
import { ExportedAntenna } from '@/queue/processors/ImportAntennasProcessorService.js';
import { QueueLoggerService } from '../QueueLoggerService.js'; import { QueueLoggerService } from '../QueueLoggerService.js';
import type { DBExportAntennasData } from '../types.js'; import type { DBExportAntennasData } from '../types.js';
import type * as Bull from 'bullmq'; import type * as Bull from 'bullmq';
@ -86,7 +87,8 @@ export class ExportAntennasProcessorService {
excludeBots: antenna.excludeBots, excludeBots: antenna.excludeBots,
withReplies: antenna.withReplies, withReplies: antenna.withReplies,
withFile: antenna.withFile, withFile: antenna.withFile,
})); excludeNotesInSensitiveChannel: antenna.excludeNotesInSensitiveChannel,
} satisfies Required<ExportedAntenna>));
if (antennas.length - 1 !== index) { if (antennas.length - 1 !== index) {
write(', '); write(', ');
} }

View File

@ -11,17 +11,18 @@ import Logger from '@/logger.js';
import type { AntennasRepository } from '@/models/_.js'; import type { AntennasRepository } from '@/models/_.js';
import { DI } from '@/di-symbols.js'; import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js'; import { bindThis } from '@/decorators.js';
import { Schema, SchemaType } from '@/misc/json-schema.js';
import { QueueLoggerService } from '../QueueLoggerService.js'; import { QueueLoggerService } from '../QueueLoggerService.js';
import { DBAntennaImportJobData } from '../types.js'; import { DBAntennaImportJobData } from '../types.js';
import type * as Bull from 'bullmq'; import type * as Bull from 'bullmq';
const Ajv = _Ajv.default; const Ajv = _Ajv.default;
const validate = new Ajv().compile({ const exportedAntennaSchema = {
type: 'object', type: 'object',
properties: { properties: {
name: { type: 'string', minLength: 1, maxLength: 100 }, name: { type: 'string', minLength: 1, maxLength: 100 },
src: { type: 'string', enum: ['home', 'all', 'users', 'list'] }, src: { type: 'string', enum: ['home', 'all', 'users', 'list', 'users_blacklist'] },
userListAccts: { userListAccts: {
type: 'array', type: 'array',
items: { items: {
@ -47,9 +48,14 @@ const validate = new Ajv().compile({
excludeBots: { type: 'boolean' }, excludeBots: { type: 'boolean' },
withReplies: { type: 'boolean' }, withReplies: { type: 'boolean' },
withFile: { type: 'boolean' }, withFile: { type: 'boolean' },
excludeNotesInSensitiveChannel: { type: 'boolean' },
}, },
required: ['name', 'src', 'keywords', 'excludeKeywords', 'users', 'caseSensitive', 'withReplies', 'withFile'], required: ['name', 'src', 'keywords', 'excludeKeywords', 'users', 'caseSensitive', 'withReplies', 'withFile'],
}); } as const satisfies Schema;
export type ExportedAntenna = SchemaType<typeof exportedAntennaSchema>;
const validate = new Ajv().compile<ExportedAntenna>(exportedAntennaSchema);
@Injectable() @Injectable()
export class ImportAntennasProcessorService { export class ImportAntennasProcessorService {
@ -91,6 +97,7 @@ export class ImportAntennasProcessorService {
excludeBots: antenna.excludeBots, excludeBots: antenna.excludeBots,
withReplies: antenna.withReplies, withReplies: antenna.withReplies,
withFile: antenna.withFile, withFile: antenna.withFile,
excludeNotesInSensitiveChannel: antenna.excludeNotesInSensitiveChannel,
}); });
this.logger.succ('Antenna created: ' + result.id); this.logger.succ('Antenna created: ' + result.id);
this.globalEventService.publishInternalEvent('antennaCreated', result); this.globalEventService.publishInternalEvent('antennaCreated', result);

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