diff --git a/.config/cypress-devcontainer.yml b/.config/cypress-devcontainer.yml
new file mode 100644
index 0000000000..3907615f73
--- /dev/null
+++ b/.config/cypress-devcontainer.yml
@@ -0,0 +1,224 @@
+#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+# Misskey configuration
+#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+# ┌────────────────────────┐
+#───┘ Initial Setup Password └─────────────────────────────────────────────────────
+
+# Password to initiate setting up admin account.
+# It will not be used after the initial setup is complete.
+#
+# Be sure to change this when you set up Misskey via the Internet.
+#
+# The provider of the service who sets up Misskey on behalf of the customer should
+# set this value to something unique when generating the Misskey config file,
+# and provide it to the customer.
+setupPassword: example_password_please_change_this_or_you_will_get_hacked
+
+# ┌─────┐
+#───┘ URL └─────────────────────────────────────────────────────
+
+# Final accessible URL seen by a user.
+url: 'http://misskey.local'
+
+# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
+# URL SETTINGS AFTER THAT!
+
+# ┌───────────────────────┐
+#───┘ Port and TLS settings └───────────────────────────────────
+
+#
+# Misskey requires a reverse proxy to support HTTPS connections.
+#
+# +----- https://example.tld/ ------------+
+# +------+ |+-------------+ +----------------+|
+# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
+# +------+ |+-------------+ +----------------+|
+# +---------------------------------------+
+#
+# You need to set up a reverse proxy. (e.g. nginx)
+# An encrypted connection with HTTPS is highly recommended
+# because tokens may be transferred in GET requests.
+
+# The port that your Misskey server should listen on.
+port: 61812
+
+# ┌──────────────────────────┐
+#───┘ PostgreSQL configuration └────────────────────────────────
+
+db:
+ host: db
+ port: 5432
+
+ # Database name
+ db: misskey
+
+ # Auth
+ user: postgres
+ pass: postgres
+
+ # Whether disable Caching queries
+ #disableCache: true
+
+ # Extra Connection options
+ #extra:
+ # ssl: true
+
+dbReplications: false
+
+# You can configure any number of replicas here
+#dbSlaves:
+# -
+# host:
+# port:
+# db:
+# user:
+# pass:
+# -
+# host:
+# port:
+# db:
+# user:
+# pass:
+
+# ┌─────────────────────┐
+#───┘ Redis configuration └─────────────────────────────────────
+
+redis:
+ host: redis
+ port: 6379
+ #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+ #pass: example-pass
+ #prefix: example-prefix
+ #db: 1
+
+#redisForPubsub:
+# host: redis
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+
+#redisForJobQueue:
+# host: redis
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+
+#redisForTimelines:
+# host: redis
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+
+#redisForReactions:
+# host: redis
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+
+# ┌───────────────────────────┐
+#───┘ MeiliSearch configuration └─────────────────────────────
+
+#meilisearch:
+# host: meilisearch
+# port: 7700
+# apiKey: ''
+# ssl: true
+# index: ''
+
+# ┌───────────────┐
+#───┘ ID generation └───────────────────────────────────────────
+
+# You can select the ID generation method.
+# You don't usually need to change this setting, but you can
+# change it according to your preferences.
+
+# Available methods:
+# aid ... Short, Millisecond accuracy
+# aidx ... Millisecond accuracy
+# meid ... Similar to ObjectID, Millisecond accuracy
+# ulid ... Millisecond accuracy
+# objectid ... This is left for backward compatibility
+
+# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
+# ID SETTINGS AFTER THAT!
+
+id: 'aidx'
+
+# ┌────────────────┐
+#───┘ Error tracking └──────────────────────────────────────────
+
+# Sentry is available for error tracking.
+# See the Sentry documentation for more details on options.
+
+#sentryForBackend:
+# enableNodeProfiling: true
+# options:
+# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
+
+#sentryForFrontend:
+# options:
+# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
+
+# ┌─────────────────────┐
+#───┘ Other configuration └─────────────────────────────────────
+
+# Whether disable HSTS
+#disableHsts: true
+
+# Number of worker processes
+#clusterLimit: 1
+
+# Job concurrency per worker
+# deliverJobConcurrency: 128
+# inboxJobConcurrency: 16
+
+# Job rate limiter
+# deliverJobPerSec: 128
+# inboxJobPerSec: 32
+
+# Job attempts
+# deliverJobMaxAttempts: 12
+# inboxJobMaxAttempts: 8
+
+# IP address family used for outgoing request (ipv4, ipv6 or dual)
+#outgoingAddressFamily: ipv4
+
+# Proxy for HTTP/HTTPS
+#proxy: http://127.0.0.1:3128
+
+proxyBypassHosts:
+ - api.deepl.com
+ - api-free.deepl.com
+ - www.recaptcha.net
+ - hcaptcha.com
+ - challenges.cloudflare.com
+
+# Proxy for SMTP/SMTPS
+#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
+#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
+#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
+
+# Media Proxy
+#mediaProxy: https://example.com/proxy
+
+# Proxy remote files (default: true)
+proxyRemoteFiles: true
+
+# Sign to ActivityPub GET request (default: true)
+signToActivityPubGet: true
+
+allowedPrivateNetworks: [
+ '127.0.0.1/32'
+]
+
+# Upload or download file size limits (bytes)
+#maxFileSize: 262144000
diff --git a/.config/docker_example.env b/.config/docker_example.env
index 4fe8e76b78..c61248da2e 100644
--- a/.config/docker_example.env
+++ b/.config/docker_example.env
@@ -1,5 +1,11 @@
+# misskey settings
+# MISSKEY_URL=https://example.tld/
+
# db settings
POSTGRES_PASSWORD=example-misskey-pass
+# DATABASE_PASSWORD=${POSTGRES_PASSWORD}
POSTGRES_USER=example-misskey-user
+# DATABASE_USER=${POSTGRES_USER}
POSTGRES_DB=misskey
+# DATABASE_DB=${POSTGRES_DB}
DATABASE_URL="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}"
diff --git a/.config/docker_example.yml b/.config/docker_example.yml
index 42ac18de1b..3f8e5734ce 100644
--- a/.config/docker_example.yml
+++ b/.config/docker_example.yml
@@ -6,6 +6,7 @@
#───┘ URL └─────────────────────────────────────────────────────
# Final accessible URL seen by a user.
+# You can set url from an environment variable instead.
url: https://example.tld/
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
@@ -38,9 +39,11 @@ db:
port: 5432
# Database name
+ # You can set db from an environment variable instead.
db: misskey
# Auth
+ # You can set user and pass from environment variables instead.
user: example-misskey-user
pass: example-misskey-pass
@@ -103,6 +106,14 @@ redis:
# #prefix: example-prefix
# #db: 1
+#redisForReactions:
+# host: redis
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+
# ┌───────────────────────────┐
#───┘ MeiliSearch configuration └─────────────────────────────
diff --git a/.config/example.yml b/.config/example.yml
index b11cbd1373..60a6a0aa71 100644
--- a/.config/example.yml
+++ b/.config/example.yml
@@ -59,6 +59,20 @@
#
# publishTarballInsteadOfProvideRepositoryUrl: true
+# ┌────────────────────────┐
+#───┘ Initial Setup Password └─────────────────────────────────────────────────────
+
+# Password to initiate setting up admin account.
+# It will not be used after the initial setup is complete.
+#
+# Be sure to change this when you set up Misskey via the Internet.
+#
+# The provider of the service who sets up Misskey on behalf of the customer should
+# set this value to something unique when generating the Misskey config file,
+# and provide it to the customer.
+#
+# setupPassword: example_password_please_change_this_or_you_will_get_hacked
+
# ┌─────┐
#───┘ URL └─────────────────────────────────────────────────────
@@ -172,6 +186,16 @@ redis:
# # You can specify more ioredis options...
# #username: example-username
+#redisForReactions:
+# host: localhost
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+# # You can specify more ioredis options...
+# #username: example-username
+
# ┌───────────────────────────┐
#───┘ MeiliSearch configuration └─────────────────────────────
diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/compose.yml
similarity index 93%
rename from .devcontainer/docker-compose.yml
rename to .devcontainer/compose.yml
index 2809cd2ca4..d02d2a8f4a 100644
--- a/.devcontainer/docker-compose.yml
+++ b/.devcontainer/compose.yml
@@ -1,5 +1,3 @@
-version: '3.8'
-
services:
app:
build:
@@ -8,6 +6,7 @@ services:
volumes:
- ../:/workspace:cached
+ - node_modules:/workspace/node_modules
command: sleep infinity
@@ -46,6 +45,7 @@ services:
volumes:
postgres-data:
redis-data:
+ node_modules:
networks:
internal_network:
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 31b6212cb5..fbf959d449 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -1,16 +1,16 @@
{
"name": "Misskey",
- "dockerComposeFile": "docker-compose.yml",
+ "dockerComposeFile": "compose.yml",
"service": "app",
"workspaceFolder": "/workspace",
"features": {
"ghcr.io/devcontainers/features/node:1": {
- "version": "20.12.2"
+ "version": "20.16.0"
},
"ghcr.io/devcontainers-contrib/features/corepack:1": {}
},
"forwardPorts": [3000],
- "postCreateCommand": "sudo chmod 755 .devcontainer/init.sh && .devcontainer/init.sh",
+ "postCreateCommand": "/bin/bash .devcontainer/init.sh",
"customizations": {
"vscode": {
"extensions": [
diff --git a/.devcontainer/devcontainer.yml b/.devcontainer/devcontainer.yml
index beefcfd0a2..3eb4fc2879 100644
--- a/.devcontainer/devcontainer.yml
+++ b/.devcontainer/devcontainer.yml
@@ -103,6 +103,14 @@ redis:
# #prefix: example-prefix
# #db: 1
+#redisForReactions:
+# host: redis
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+
# ┌───────────────────────────┐
#───┘ MeiliSearch configuration └─────────────────────────────
diff --git a/.devcontainer/init.sh b/.devcontainer/init.sh
index 729e1a9d2d..e02a533c15 100755
--- a/.devcontainer/init.sh
+++ b/.devcontainer/init.sh
@@ -2,7 +2,10 @@
set -xe
-sudo chown -R node /workspace
+sudo chown node node_modules
+sudo apt-get update
+sudo apt-get -y install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libnss3 libxss1 libasound2 libxtst6 xauth xvfb
+git config --global --add safe.directory /workspace
git submodule update --init
corepack install
corepack enable
@@ -11,3 +14,4 @@ pnpm install --frozen-lockfile
cp .devcontainer/devcontainer.yml .config/default.yml
pnpm build
pnpm migrate
+pnpm exec cypress install
diff --git a/.dockerignore b/.dockerignore
index 1de0c7982b..f204349160 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -7,12 +7,11 @@ Dockerfile
build/
built/
db/
-docker-compose.yml
+.devcontainer/compose.yml
node_modules/
packages/*/node_modules
redis/
files/
-misskey-assets/
fluent-emojis/
.pnp.*
@@ -28,4 +27,4 @@ fluent-emojis/
.idea/
packages/*/.vscode/
-packages/backend/test/docker-compose.yml
+packages/backend/test/compose.yml
diff --git a/.github/ISSUE_TEMPLATE/01_bug-report.yml b/.github/ISSUE_TEMPLATE/01_bug-report.yml
index ac2b39cc12..315e712c30 100644
--- a/.github/ISSUE_TEMPLATE/01_bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/01_bug-report.yml
@@ -53,8 +53,8 @@ body:
Examples:
* Model and OS of the device(s): MacBook Pro (14inch, 2021), macOS Ventura 13.4
* Browser: Chrome 113.0.5672.126
- * Server URL: misskey.io
- * Misskey: 13.x.x
+ * Server URL: misskey.example.com
+ * Misskey: 2024.x.x
value: |
* Model and OS of the device(s):
* Browser:
@@ -74,11 +74,11 @@ body:
Examples:
* Installation Method or Hosting Service: docker compose, k8s/docker, systemd, "Misskey install shell script", development environment
- * Misskey: 13.x.x
+ * Misskey: 2024.x.x
* Node: 20.x.x
* PostgreSQL: 15.x.x
* Redis: 7.x.x
- * OS and Architecture: Ubuntu 22.04.2 LTS aarch64
+ * OS and Architecture: Ubuntu 24.04.2 LTS aarch64
value: |
* Installation Method or Hosting Service:
* Misskey:
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index e8b65dc3b9..5acad83336 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -2,3 +2,7 @@ contact_links:
- name: 💬 Misskey official Discord
url: https://discord.gg/Wp8gVStHW3
about: Chat freely about Misskey
+ # 仮
+ - name: 💬 Start discussion
+ url: https://github.com/misskey-dev/misskey/discussions
+ about: The official forum to join conversation and ask question
diff --git a/.github/labeler.yml b/.github/labeler.yml
index a77f73706b..b64d726d65 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -6,7 +6,7 @@
'packages/backend:test':
- any:
- changed-files:
- - any-glob-to-any-file: ['packages/backend/test/**/*']
+ - any-glob-to-any-file: ['packages/backend/test/**/*', 'packages/backend/test-federation/**/*']
'packages/frontend':
- any:
diff --git a/.github/misskey/test.yml b/.github/misskey/test.yml
index 7a4aa4ae6c..3c807e8b9e 100644
--- a/.github/misskey/test.yml
+++ b/.github/misskey/test.yml
@@ -1,5 +1,7 @@
url: 'http://misskey.local'
+setupPassword: example_password_please_change_this_or_you_will_get_hacked
+
# ローカルでテストするときにポートを被らないようにするためデフォルトのものとは変える(以下同じ)
port: 61812
diff --git a/.github/workflows/api-misskey-js.yml b/.github/workflows/api-misskey-js.yml
index 1b7b68b14f..8380a3bb23 100644
--- a/.github/workflows/api-misskey-js.yml
+++ b/.github/workflows/api-misskey-js.yml
@@ -4,10 +4,11 @@ on:
push:
paths:
- packages/misskey-js/**
+ - .github/workflows/api-misskey-js.yml
pull_request:
paths:
- packages/misskey-js/**
-
+ - .github/workflows/api-misskey-js.yml
jobs:
report:
@@ -20,7 +21,7 @@ jobs:
- run: corepack enable
- name: Setup Node.js
- uses: actions/setup-node@v4.0.2
+ uses: actions/setup-node@v4.0.4
with:
node-version-file: '.node-version'
cache: 'pnpm'
diff --git a/.github/workflows/changelog-check.yml b/.github/workflows/changelog-check.yml
index f254af0d1f..44cc1a04f2 100644
--- a/.github/workflows/changelog-check.yml
+++ b/.github/workflows/changelog-check.yml
@@ -14,7 +14,7 @@ jobs:
- name: Checkout head
uses: actions/checkout@v4.1.1
- name: Setup Node.js
- uses: actions/setup-node@v4.0.2
+ uses: actions/setup-node@v4.0.4
with:
node-version-file: '.node-version'
diff --git a/.github/workflows/check-misskey-js-autogen.yml b/.github/workflows/check-misskey-js-autogen.yml
index 39acad8bc3..f26c9a4d45 100644
--- a/.github/workflows/check-misskey-js-autogen.yml
+++ b/.github/workflows/check-misskey-js-autogen.yml
@@ -21,6 +21,7 @@ jobs:
uses: actions/checkout@v4.1.1
with:
submodules: true
+ persist-credentials: false
ref: refs/pull/${{ github.event.pull_request.number }}/merge
- name: setup pnpm
@@ -28,7 +29,7 @@ jobs:
- name: setup node
id: setup-node
- uses: actions/setup-node@v4.0.2
+ uses: actions/setup-node@v4.0.4
with:
node-version-file: '.node-version'
cache: pnpm
@@ -57,7 +58,7 @@ jobs:
name: generated-misskey-js
path: packages/misskey-js/generator/built/autogen
- # pull_request_target safety: permissions: read-all, and there are no secrets used in this job
+ # pull_request_target safety: permissions: read-all, and no user codes are executed
get-actual-misskey-js:
runs-on: ubuntu-latest
permissions:
@@ -68,6 +69,7 @@ jobs:
uses: actions/checkout@v4.1.1
with:
submodules: true
+ persist-credentials: false
ref: refs/pull/${{ github.event.pull_request.number }}/merge
- name: Upload From Merged
@@ -131,3 +133,7 @@ jobs:
mode: delete
message: "Thank you!"
create_if_not_exists: false
+
+ - name: Make failure if changes are detected
+ if: steps.check-changes.outputs.changes == 'true'
+ run: exit 1
diff --git a/.github/workflows/check-misskey-js-version.yml b/.github/workflows/check-misskey-js-version.yml
index 325a893605..99c29ac974 100644
--- a/.github/workflows/check-misskey-js-version.yml
+++ b/.github/workflows/check-misskey-js-version.yml
@@ -6,12 +6,13 @@ on:
paths:
- packages/misskey-js/package.json
- package.json
+ - .github/workflows/check-misskey-js-version.yml
pull_request:
branches: [ develop ]
paths:
- packages/misskey-js/package.json
- package.json
-
+ - .github/workflows/check-misskey-js-version.yml
jobs:
check-version:
# ルートの package.json と packages/misskey-js/package.json のバージョンが一致しているかを確認する
diff --git a/.github/workflows/check-spdx-license-id.yml b/.github/workflows/check-spdx-license-id.yml
index 6cd8bf60d5..05582008b5 100644
--- a/.github/workflows/check-spdx-license-id.yml
+++ b/.github/workflows/check-spdx-license-id.yml
@@ -48,12 +48,16 @@ jobs:
"packages/backend/migration"
"packages/backend/src"
"packages/backend/test"
+ "packages/frontend-shared/@types"
+ "packages/frontend-shared/js"
"packages/frontend/.storybook"
"packages/frontend/@types"
"packages/frontend/lib"
"packages/frontend/public"
"packages/frontend/src"
"packages/frontend/test"
+ "packages/frontend-embed/@types"
+ "packages/frontend-embed/src"
"packages/misskey-bubble-game/src"
"packages/misskey-reversi/src"
"packages/sw/src"
diff --git a/.github/workflows/docker-develop.yml b/.github/workflows/docker-develop.yml
index cb84849580..ac2b1b4d35 100644
--- a/.github/workflows/docker-develop.yml
+++ b/.github/workflows/docker-develop.yml
@@ -37,7 +37,7 @@ jobs:
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push by digest
id: build
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: .
push: true
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index 23c1bdbc16..db899ba386 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -48,7 +48,7 @@ jobs:
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push to Docker Hub
id: build
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: .
push: true
diff --git a/.github/workflows/dockle.yml b/.github/workflows/dockle.yml
index eee7a78fed..c3dba4213d 100644
--- a/.github/workflows/dockle.yml
+++ b/.github/workflows/dockle.yml
@@ -13,14 +13,16 @@ jobs:
runs-on: ubuntu-latest
env:
DOCKER_CONTENT_TRUST: 1
+ DOCKLE_VERSION: 0.4.14
steps:
- uses: actions/checkout@v4.1.1
- - run: |
- curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v0.4.10/dockle_0.4.10_Linux-64bit.deb"
+ - name: Download and install dockle v${{ env.DOCKLE_VERSION }}
+ run: |
+ curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v${DOCKLE_VERSION}/dockle_${DOCKLE_VERSION}_Linux-64bit.deb"
sudo dpkg -i dockle.deb
- run: |
cp .config/docker_example.env .config/docker.env
- cp ./docker-compose_example.yml ./docker-compose.yml
+ cp ./compose_example.yml ./compose.yml
- run: |
docker compose up -d web
docker tag "$(docker compose images web | awk 'OFS=":" {print $4}' | tail -n +2)" misskey-web:latest
diff --git a/.github/workflows/get-api-diff.yml b/.github/workflows/get-api-diff.yml
index 9b9c8f11c4..1bcaa0d9c4 100644
--- a/.github/workflows/get-api-diff.yml
+++ b/.github/workflows/get-api-diff.yml
@@ -9,7 +9,6 @@ on:
paths:
- packages/backend/**
- .github/workflows/get-api-diff.yml
-
jobs:
get-from-misskey:
runs-on: ubuntu-latest
@@ -18,7 +17,7 @@ jobs:
strategy:
matrix:
- node-version: [20.12.2]
+ node-version: [20.16.0]
api-json-name: [api-base.json, api-head.json]
include:
- api-json-name: api-base.json
@@ -34,7 +33,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4.0.2
+ uses: actions/setup-node@v4.0.4
with:
node-version: ${{ matrix.node-version }}
cache: 'pnpm'
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 76616ec5a7..90eb268dda 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -8,17 +8,26 @@ on:
paths:
- packages/backend/**
- packages/frontend/**
+ - packages/frontend-shared/**
+ - packages/frontend-embed/**
- packages/sw/**
- packages/misskey-js/**
- - packages/shared/.eslintrc.js
+ - packages/misskey-bubble-game/**
+ - packages/misskey-reversi/**
+ - packages/shared/eslint.config.js
+ - .github/workflows/lint.yml
pull_request:
paths:
- packages/backend/**
- packages/frontend/**
+ - packages/frontend-shared/**
+ - packages/frontend-embed/**
- packages/sw/**
- packages/misskey-js/**
- - packages/shared/.eslintrc.js
-
+ - packages/misskey-bubble-game/**
+ - packages/misskey-reversi/**
+ - packages/shared/eslint.config.js
+ - .github/workflows/lint.yml
jobs:
pnpm_install:
runs-on: ubuntu-latest
@@ -28,7 +37,7 @@ jobs:
fetch-depth: 0
submodules: true
- uses: pnpm/action-setup@v4
- - uses: actions/setup-node@v4.0.2
+ - uses: actions/setup-node@v4.0.4
with:
node-version-file: '.node-version'
cache: 'pnpm'
@@ -44,21 +53,34 @@ jobs:
workspace:
- backend
- frontend
+ - frontend-shared
+ - frontend-embed
- sw
- misskey-js
+ - misskey-bubble-game
+ - misskey-reversi
+ env:
+ eslint-cache-version: v1
+ eslint-cache-path: ${{ github.workspace }}/node_modules/.cache/eslint-${{ matrix.workspace }}
steps:
- uses: actions/checkout@v4.1.1
with:
fetch-depth: 0
submodules: true
- uses: pnpm/action-setup@v4
- - uses: actions/setup-node@v4.0.2
+ - uses: actions/setup-node@v4.0.4
with:
node-version-file: '.node-version'
cache: 'pnpm'
- run: corepack enable
- run: pnpm i --frozen-lockfile
- - run: pnpm --filter ${{ matrix.workspace }} run eslint
+ - name: Restore eslint cache
+ uses: actions/cache@v4.1.0
+ with:
+ path: ${{ env.eslint-cache-path }}
+ key: eslint-${{ env.eslint-cache-version }}-${{ matrix.workspace }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ github.ref_name }}-${{ github.sha }}
+ restore-keys: eslint-${{ env.eslint-cache-version }}-${{ matrix.workspace }}-${{ hashFiles('**/pnpm-lock.yaml') }}-
+ - run: pnpm --filter ${{ matrix.workspace }} run eslint --cache --cache-location ${{ env.eslint-cache-path }} --cache-strategy content
typecheck:
needs: [pnpm_install]
@@ -68,6 +90,7 @@ jobs:
matrix:
workspace:
- backend
+ - sw
- misskey-js
steps:
- uses: actions/checkout@v4.1.1
@@ -75,14 +98,14 @@ jobs:
fetch-depth: 0
submodules: true
- uses: pnpm/action-setup@v4
- - uses: actions/setup-node@v4.0.2
+ - uses: actions/setup-node@v4.0.4
with:
node-version-file: '.node-version'
cache: 'pnpm'
- run: corepack enable
- run: pnpm i --frozen-lockfile
- run: pnpm --filter misskey-js run build
- if: ${{ matrix.workspace == 'backend' }}
+ if: ${{ matrix.workspace == 'backend' || matrix.workspace == 'sw' }}
- run: pnpm --filter misskey-reversi run build
if: ${{ matrix.workspace == 'backend' }}
- run: pnpm --filter ${{ matrix.workspace }} run typecheck
diff --git a/.github/workflows/locale.yml b/.github/workflows/locale.yml
index de2247e772..6bc8860a11 100644
--- a/.github/workflows/locale.yml
+++ b/.github/workflows/locale.yml
@@ -4,10 +4,11 @@ on:
push:
paths:
- locales/**
+ - .github/workflows/locale.yml
pull_request:
paths:
- locales/**
-
+ - .github/workflows/locale.yml
jobs:
locale_verify:
runs-on: ubuntu-latest
@@ -18,7 +19,7 @@ jobs:
fetch-depth: 0
submodules: true
- uses: pnpm/action-setup@v4
- - uses: actions/setup-node@v4.0.2
+ - uses: actions/setup-node@v4.0.4
with:
node-version-file: '.node-version'
cache: 'pnpm'
diff --git a/.github/workflows/on-release-created.yml b/.github/workflows/on-release-created.yml
index edfdab99e9..ffaf7bc038 100644
--- a/.github/workflows/on-release-created.yml
+++ b/.github/workflows/on-release-created.yml
@@ -17,7 +17,7 @@ jobs:
strategy:
matrix:
- node-version: [20.12.2]
+ node-version: [20.16.0]
steps:
- uses: actions/checkout@v4.1.1
@@ -26,7 +26,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4.0.2
+ uses: actions/setup-node@v4.0.4
with:
node-version: ${{ matrix.node-version }}
cache: 'pnpm'
diff --git a/.github/workflows/release-edit-with-push.yml b/.github/workflows/release-edit-with-push.yml
index 86ee0b3fb5..57657a4ba7 100644
--- a/.github/workflows/release-edit-with-push.yml
+++ b/.github/workflows/release-edit-with-push.yml
@@ -3,7 +3,7 @@ name: "Release Manager: sync changelog with PR"
on:
push:
branches:
- - release/**
+ - develop
paths:
- 'CHANGELOG.md'
@@ -20,24 +20,29 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- # headがrelease/かつopenのPRを1つ取得
+ # headが$GITHUB_REF_NAME, baseが$STABLE_BRANCHかつopenのPRを1つ取得
- name: Get PR
run: |
- echo "pr_number=$(gh pr list --limit 1 --head "$GITHUB_REF_NAME" --json number --jq '.[] | .number')" >> $GITHUB_OUTPUT
+ echo "pr_number=$(gh pr list --limit 1 --search "head:$GITHUB_REF_NAME base:$STABLE_BRANCH is:open" --json number --jq '.[] | .number')" >> $GITHUB_OUTPUT
id: get_pr
+ env:
+ STABLE_BRANCH: ${{ vars.STABLE_BRANCH }}
- name: Get target version
- uses: misskey-dev/release-manager-actions/.github/actions/get-target-version@v1
+ if: steps.get_pr.outputs.pr_number != ''
+ uses: misskey-dev/release-manager-actions/.github/actions/get-target-version@v2
id: v
# CHANGELOG.mdの内容を取得
- name: Get changelog
- uses: misskey-dev/release-manager-actions/.github/actions/get-changelog@v1
+ if: steps.get_pr.outputs.pr_number != ''
+ uses: misskey-dev/release-manager-actions/.github/actions/get-changelog@v2
with:
version: ${{ steps.v.outputs.target_version }}
id: changelog
# PRのnotesを更新
- name: Update PR
+ if: steps.get_pr.outputs.pr_number != ''
run: |
gh pr edit "$PR_NUMBER" --body "$CHANGELOG"
env:
- CHANGELOG: ${{ steps.changelog.outputs.changelog }}
PR_NUMBER: ${{ steps.get_pr.outputs.pr_number }}
+ CHANGELOG: ${{ steps.changelog.outputs.changelog }}
diff --git a/.github/workflows/release-with-dispatch.yml b/.github/workflows/release-with-dispatch.yml
index bc6448cb37..ed2f822269 100644
--- a/.github/workflows/release-with-dispatch.yml
+++ b/.github/workflows/release-with-dispatch.yml
@@ -17,6 +17,10 @@ on:
type: boolean
description: 'MERGE RELEASE BRANCH TO MAIN'
default: false
+ start-rc:
+ type: boolean
+ description: 'Start Release Candidate'
+ default: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -33,18 +37,21 @@ jobs:
pr_number: ${{ steps.get_pr.outputs.pr_number }}
steps:
- uses: actions/checkout@v4
- # headがrelease/かつopenのPRを1つ取得
+ # headが$GITHUB_REF_NAME, baseが$STABLE_BRANCHかつopenのPRを1つ取得
- name: Get PRs
run: |
- echo "pr_number=$(gh pr list --limit 1 --search "head:release/ is:open" --json number --jq '.[] | .number')" >> $GITHUB_OUTPUT
+ echo "pr_number=$(gh pr list --limit 1 --search "head:$GITHUB_REF_NAME base:$STABLE_BRANCH is:open" --json number --jq '.[] | .number')" >> $GITHUB_OUTPUT
id: get_pr
+ env:
+ STABLE_BRANCH: ${{ vars.STABLE_BRANCH }}
merge:
- uses: misskey-dev/release-manager-actions/.github/workflows/merge.yml@v1
+ uses: misskey-dev/release-manager-actions/.github/workflows/merge.yml@v2
needs: get-pr
if: ${{ needs.get-pr.outputs.pr_number != '' && inputs.merge == true }}
with:
pr_number: ${{ needs.get-pr.outputs.pr_number }}
+ user: 'github-actions[bot]'
package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
# Text to prepend to the changelog
# The first line must be `## Unreleased`
@@ -53,39 +60,42 @@ jobs:
### General
-
-
+
### Client
-
-
+
### Server
-
-
+
use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
indent: ${{ vars.INDENT }}
secrets:
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
- RULESET_EDIT_APP_ID: ${{ secrets.RULESET_EDIT_APP_ID }}
- RULESET_EDIT_APP_PRIVATE_KEY: ${{ secrets.RULESET_EDIT_APP_PRIVATE_KEY }}
create-prerelease:
- uses: misskey-dev/release-manager-actions/.github/workflows/create-prerelease.yml@v1
+ uses: misskey-dev/release-manager-actions/.github/workflows/create-prerelease.yml@v2
needs: get-pr
if: ${{ needs.get-pr.outputs.pr_number != '' && inputs.merge != true }}
with:
pr_number: ${{ needs.get-pr.outputs.pr_number }}
+ user: 'github-actions[bot]'
package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
indent: ${{ vars.INDENT }}
+ draft_prerelease_channel: alpha
+ ready_start_prerelease_channel: beta
+ prerelease_channel: ${{ inputs.start-rc && 'rc' || '' }}
secrets:
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
create-target:
- uses: misskey-dev/release-manager-actions/.github/workflows/create-target.yml@v1
+ uses: misskey-dev/release-manager-actions/.github/workflows/create-target.yml@v2
needs: get-pr
if: ${{ needs.get-pr.outputs.pr_number == '' }}
with:
+ user: 'github-actions[bot]'
# The script for version increment.
# process.env.CURRENT_VERSION: The current version.
#
@@ -118,8 +128,8 @@ jobs:
package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
indent: ${{ vars.INDENT }}
+ stable_branch: ${{ vars.STABLE_BRANCH }}
+ draft_prerelease_channel: alpha
secrets:
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
- RULESET_EDIT_APP_ID: ${{ secrets.RULESET_EDIT_APP_ID }}
- RULESET_EDIT_APP_PRIVATE_KEY: ${{ secrets.RULESET_EDIT_APP_PRIVATE_KEY }}
diff --git a/.github/workflows/release-with-ready.yml b/.github/workflows/release-with-ready.yml
index a0fad0e336..e863b5e2e8 100644
--- a/.github/workflows/release-with-ready.yml
+++ b/.github/workflows/release-with-ready.yml
@@ -16,26 +16,31 @@ jobs:
check:
runs-on: ubuntu-latest
outputs:
- ref: ${{ steps.get_pr.outputs.ref }}
+ head: ${{ steps.get_pr.outputs.head }}
+ base: ${{ steps.get_pr.outputs.base }}
steps:
- uses: actions/checkout@v4
# PR情報を取得
- name: Get PR
run: |
- pr_json=$(gh pr view "$PR_NUMBER" --json isDraft,headRefName)
- echo "ref=$(echo $pr_json | jq -r '.headRefName')" >> $GITHUB_OUTPUT
+ pr_json=$(gh pr view "$PR_NUMBER" --json isDraft,headRefName,baseRefName)
+ echo "head=$(echo $pr_json | jq -r '.headRefName')" >> $GITHUB_OUTPUT
+ echo "base=$(echo $pr_json | jq -r '.baseRefName')" >> $GITHUB_OUTPUT
id: get_pr
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
release:
- uses: misskey-dev/release-manager-actions/.github/workflows/create-prerelease.yml@v1
+ uses: misskey-dev/release-manager-actions/.github/workflows/create-prerelease.yml@v2
needs: check
- if: startsWith(needs.check.outputs.ref, 'release/')
+ if: needs.check.outputs.head == github.event.repository.default_branch && needs.check.outputs.base == vars.STABLE_BRANCH
with:
pr_number: ${{ github.event.pull_request.number }}
+ user: 'github-actions[bot]'
package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
indent: ${{ vars.INDENT }}
+ draft_prerelease_channel: alpha
+ ready_start_prerelease_channel: beta
secrets:
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
diff --git a/.github/workflows/report-api-diff.yml b/.github/workflows/report-api-diff.yml
index df9cc279e8..1170f898ce 100644
--- a/.github/workflows/report-api-diff.yml
+++ b/.github/workflows/report-api-diff.yml
@@ -70,18 +70,25 @@ jobs:
- id: out-diff
name: Build diff Comment
run: |
- cat <<- EOF > ./output.md
- このPRによるapi.jsonの差分
-
- 差分はこちら
-
- \`\`\`diff
- $(cat ./api.json.diff)
- \`\`\`
-
-
- [Get diff files from Workflow Page](https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID})
- EOF
+ HEADER="このPRによるapi.jsonの差分"
+ FOOTER="[Get diff files from Workflow Page](https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID})"
+ DIFF_BYTES="$(stat ./api.json.diff -c '%s' | tr -d '\n')"
+
+ echo "$HEADER" > ./output.md
+
+ if (( "$DIFF_BYTES" <= 1 )); then
+ echo '差分はありません。' >> ./output.md
+ else
+ echo '' >> ./output.md
+ echo '差分はこちら
' >> ./output.md
+ echo >> ./output.md
+ echo '```diff' >> ./output.md
+ cat ./api.json.diff >> ./output.md
+ echo '```' >> ./output.md
+ echo ' ' >> .output.md
+ fi
+
+ echo "$FOOTER" >> ./output.md
- uses: thollander/actions-comment-pull-request@v2
with:
pr_number: ${{ steps.load-pr-num.outputs.pr-number }}
diff --git a/.github/workflows/storybook.yml b/.github/workflows/storybook.yml
index c52883ffdd..c02f38ee0b 100644
--- a/.github/workflows/storybook.yml
+++ b/.github/workflows/storybook.yml
@@ -7,6 +7,11 @@ on:
- develop
- dev/storybook8 # for testing
pull_request_target:
+ branches-ignore:
+ # Since pull requests targets master mostly is the "develop" branch.
+ # Storybook CI is checked on the "push" event of "develop" branch so it would cause a duplicate build.
+ # This is a waste of chromatic build quota, so we don't run storybook CI on pull requests targets master.
+ - master
jobs:
build:
@@ -36,7 +41,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Use Node.js 20.x
- uses: actions/setup-node@v4.0.2
+ uses: actions/setup-node@v4.0.4
with:
node-version-file: '.node-version'
cache: 'pnpm'
@@ -88,7 +93,7 @@ jobs:
if [ "$BRANCH" = "misskey-dev:$HEAD_REF" ]; then
BRANCH="$HEAD_REF"
fi
- pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static --branch-name $BRANCH $(echo "$CHROMATIC_PARAMETER")
+ pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static --branch-name "$BRANCH" $(echo "$CHROMATIC_PARAMETER")
env:
HEAD_REF: ${{ github.event.pull_request.head.ref }}
CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
diff --git a/.github/workflows/test-backend.yml b/.github/workflows/test-backend.yml
index b1c54bb3e7..d95d6676f9 100644
--- a/.github/workflows/test-backend.yml
+++ b/.github/workflows/test-backend.yml
@@ -9,19 +9,20 @@ on:
- packages/backend/**
# for permissions
- packages/misskey-js/**
+ - .github/workflows/test-backend.yml
pull_request:
paths:
- packages/backend/**
# for permissions
- packages/misskey-js/**
-
+ - .github/workflows/test-backend.yml
jobs:
unit:
runs-on: ubuntu-latest
strategy:
matrix:
- node-version: [20.12.2]
+ node-version: [20.16.0]
services:
postgres:
@@ -45,7 +46,7 @@ jobs:
- name: Install FFmpeg
uses: FedericoCarboni/setup-ffmpeg@v3
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4.0.2
+ uses: actions/setup-node@v4.0.4
with:
node-version: ${{ matrix.node-version }}
cache: 'pnpm'
@@ -70,7 +71,7 @@ jobs:
strategy:
matrix:
- node-version: [20.12.2]
+ node-version: [20.16.0]
services:
postgres:
@@ -92,7 +93,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4.0.2
+ uses: actions/setup-node@v4.0.4
with:
node-version: ${{ matrix.node-version }}
cache: 'pnpm'
diff --git a/.github/workflows/test-federation.yml b/.github/workflows/test-federation.yml
new file mode 100644
index 0000000000..183ddb6f34
--- /dev/null
+++ b/.github/workflows/test-federation.yml
@@ -0,0 +1,59 @@
+name: Test (federation)
+
+on:
+ push:
+ branches:
+ - master
+ - develop
+ paths:
+ - packages/backend/**
+ - packages/misskey-js/**
+ - .github/workflows/test-federation.yml
+ pull_request:
+ paths:
+ - packages/backend/**
+ - packages/misskey-js/**
+ - .github/workflows/test-federation.yml
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ node-version: [20.16.0]
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: true
+ - name: Install pnpm
+ uses: pnpm/action-setup@v4
+ - name: Install FFmpeg
+ uses: FedericoCarboni/setup-ffmpeg@v3
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v4.0.3
+ with:
+ node-version: ${{ matrix.node-version }}
+ cache: 'pnpm'
+ - name: Build Misskey
+ run: |
+ corepack enable && corepack prepare
+ pnpm i --frozen-lockfile
+ pnpm build
+ - name: Setup
+ run: |
+ cd packages/backend/test-federation
+ bash ./setup.sh
+ sudo chmod 644 ./certificates/*.test.key
+ - name: Start servers
+ # https://github.com/docker/compose/issues/1294#issuecomment-374847206
+ run: |
+ cd packages/backend/test-federation
+ docker compose up -d --scale tester=0
+ - name: Test
+ run: |
+ cd packages/backend/test-federation
+ docker compose run --no-deps tester
+ - name: Stop servers
+ run: |
+ cd packages/backend/test-federation
+ docker compose down
diff --git a/.github/workflows/test-frontend.yml b/.github/workflows/test-frontend.yml
index 9d5053b82a..c68e1a8ef1 100644
--- a/.github/workflows/test-frontend.yml
+++ b/.github/workflows/test-frontend.yml
@@ -11,7 +11,7 @@ on:
- packages/misskey-js/**
# for e2e
- packages/backend/**
-
+ - .github/workflows/test-frontend.yml
pull_request:
paths:
- packages/frontend/**
@@ -19,14 +19,14 @@ on:
- packages/misskey-js/**
# for e2e
- packages/backend/**
-
+ - .github/workflows/test-frontend.yml
jobs:
vitest:
runs-on: ubuntu-latest
strategy:
matrix:
- node-version: [20.12.2]
+ node-version: [20.16.0]
steps:
- uses: actions/checkout@v4.1.1
@@ -35,7 +35,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4.0.2
+ uses: actions/setup-node@v4.0.4
with:
node-version: ${{ matrix.node-version }}
cache: 'pnpm'
@@ -61,7 +61,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- node-version: [20.12.2]
+ node-version: [20.16.0]
browser: [chrome]
services:
@@ -90,7 +90,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4.0.2
+ uses: actions/setup-node@v4.0.4
with:
node-version: ${{ matrix.node-version }}
cache: 'pnpm'
diff --git a/.github/workflows/test-misskey-js.yml b/.github/workflows/test-misskey-js.yml
index 2589d908b8..63e81f8c92 100644
--- a/.github/workflows/test-misskey-js.yml
+++ b/.github/workflows/test-misskey-js.yml
@@ -8,11 +8,12 @@ on:
branches: [ develop ]
paths:
- packages/misskey-js/**
+ - .github/workflows/test-misskey-js.yml
pull_request:
branches: [ develop ]
paths:
- packages/misskey-js/**
-
+ - .github/workflows/test-misskey-js.yml
jobs:
test:
@@ -20,7 +21,7 @@ jobs:
strategy:
matrix:
- node-version: [20.12.2]
+ node-version: [20.16.0]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
@@ -30,7 +31,7 @@ jobs:
- run: corepack enable
- name: Setup Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4.0.2
+ uses: actions/setup-node@v4.0.4
with:
node-version: ${{ matrix.node-version }}
cache: 'pnpm'
diff --git a/.github/workflows/test-production.yml b/.github/workflows/test-production.yml
index 7f8db65293..0abc09c5a6 100644
--- a/.github/workflows/test-production.yml
+++ b/.github/workflows/test-production.yml
@@ -16,7 +16,7 @@ jobs:
strategy:
matrix:
- node-version: [20.12.2]
+ node-version: [20.16.0]
steps:
- uses: actions/checkout@v4.1.1
@@ -25,7 +25,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4.0.2
+ uses: actions/setup-node@v4.0.4
with:
node-version: ${{ matrix.node-version }}
cache: 'pnpm'
diff --git a/.github/workflows/validate-api-json.yml b/.github/workflows/validate-api-json.yml
index 24340e7d81..f809af1063 100644
--- a/.github/workflows/validate-api-json.yml
+++ b/.github/workflows/validate-api-json.yml
@@ -7,17 +7,18 @@ on:
- develop
paths:
- packages/backend/**
+ - .github/workflows/validate-api-json.yml
pull_request:
paths:
- packages/backend/**
-
+ - .github/workflows/validate-api-json.yml
jobs:
validate-api-json:
runs-on: ubuntu-latest
strategy:
matrix:
- node-version: [20.12.2]
+ node-version: [20.16.0]
steps:
- uses: actions/checkout@v4.1.1
@@ -26,7 +27,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4.0.2
+ uses: actions/setup-node@v4.0.4
with:
node-version: ${{ matrix.node-version }}
cache: 'pnpm'
diff --git a/.gitignore b/.gitignore
index bdc14fea0a..5b8a798ba6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,13 +35,17 @@ coverage
!/.config/example.yml
!/.config/docker_example.yml
!/.config/docker_example.env
+!/.config/cypress-devcontainer.yml
docker-compose.yml
-!/.devcontainer/docker-compose.yml
+./compose.yml
+.devcontainer/compose.yml
+!/.devcontainer/compose.yml
# misskey
/build
built
built-test
+js-built
/data
/.cache-loader
/db
@@ -59,6 +63,11 @@ ormconfig.json
temp
/packages/frontend/src/**/*.stories.ts
tsdoc-metadata.json
+misskey-assets
+
+# Vite temporary files
+vite.config.js.timestamp-*
+vite.config.ts.timestamp-*
# blender backups
*.blend1
diff --git a/.gitmodules b/.gitmodules
index 225a69a652..3218575273 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,6 +1,3 @@
-[submodule "misskey-assets"]
- path = misskey-assets
- url = https://github.com/misskey-dev/assets.git
[submodule "fluent-emojis"]
path = fluent-emojis
url = https://github.com/misskey-dev/emojis.git
diff --git a/.node-version b/.node-version
index 87834047a6..8ce7030825 100644
--- a/.node-version
+++ b/.node-version
@@ -1 +1 @@
-20.12.2
+20.16.0
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f68336698d..d34fcfdd15 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,14 +1,313 @@
-## Unreleased
+## 2024.10.2
### General
--
+- Feat: コンテンツの表示にログインを必須にできるように
+- Feat: 過去のノートを非公開化/フォロワーのみ表示可能にできるように
### Client
+- Enhance: Bull DashboardでRelationship Queueの状態も確認できるように
+ (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/751)
+- Enhance: ドライブでソートができるように
+- Enhance: アイコンデコレーション管理画面の改善
+- Enhance: 「単なるラッキー」の取得条件を変更
+- Enhance: 投稿フォームでEscキーを押したときIME入力中ならフォームを閉じないように( #10866 )
+- Enhance: MiAuth, OAuthの認可画面の改善
+ - どのアカウントで認証しようとしているのかがわかるように
+ - 認証するアカウントを切り替えられるように
+- Enhance: Self-XSS防止用の警告を追加
+- Enhance: カタルーニャ語 (ca-ES) に対応
+- Fix: 通知の範囲指定の設定項目が必要ない通知設定でも範囲指定の設定がでている問題を修正
+- Fix: Turnstileが失敗・期限切れした際にも成功扱いとなってしまう問題を修正
+ (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/768)
+- Fix: デッキのタイムラインカラムで「センシティブなファイルを含むノートを表示」設定が使用できなかった問題を修正
+- Fix: Encode RSS urls with escape sequences before fetching allowing query parameters to be used
+- Fix: リンク切れを修正
- Fix: 別アカウントを指定してノートを投稿した場合でも自分のアカウントの実績が解除されてしまう問題を修正
### Server
--
+- Enhance: 起動前の疎通チェックで、DBとメイン以外のRedisの疎通確認も行うように
+ (Based on https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/588)
+ (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/715)
+- Fix: Nested proxy requestsを検出した際にブロックするように
+ [ghsa-gq5q-c77c-v236](https://github.com/misskey-dev/misskey/security/advisories/ghsa-gq5q-c77c-v236)
+- Fix: 招待コードの発行可能な残り数算出に使用すべきロールポリシーの値が違う問題を修正
+ (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/706)
+- Fix: 連合への配信時に、acctの大小文字が区別されてしまい正しくメンションが処理されないことがある問題を修正
+ (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/711)
+### Misskey.js
+- Fix: Stream初期化時、別途WebSocketを指定する場合の型定義を修正
+
+## 2024.10.1
+
+### Note
+- スパム対策として、モデレータ権限を持つユーザのアクティビティが7日以上確認できない場合は自動的に招待制へと切り替え(コントロールパネル -> モデレーション -> "誰でも新規登録できるようにする"をオフに変更)るようになりました。 ( #13437 )
+ - 切り替わった際はモデレーターへお知らせとして通知されます。登録をオープンな状態で継続したい場合は、コントロールパネルから再度設定を行ってください。
+
+### General
+- Feat: ユーザーの名前に禁止ワードを設定できるように
+
+### Client
+- Enhance: タイムライン表示時のパフォーマンスを向上
+- Enhance: アーカイブした個人宛のお知らせを表示・編集できるように
+- Enhance: l10nの更新
+- Fix: メールアドレス不要でCaptchaが有効な場合にアカウント登録完了後自動でのログインに失敗する問題を修正
+
+### Server
+- Feat: モデレータ権限を持つユーザが全員7日間活動しなかった場合は自動的に招待制へと切り替えるように ( #13437 )
+- Enhance: 個人宛のお知らせは「わかった」を押すと自動的にアーカイブされるように
+- Fix: `admin/emoji/update`エンドポイントのidのみ指定した時不正なエラーが発生するバグを修正
+- Fix: RBT有効時、リノートのリアクションが反映されない問題を修正
+- Fix: キューのエラーログを簡略化するように
+ (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/649)
+
+## 2024.10.0
+
+### Note
+- セキュリティ向上のため、サーバー初期設定時に使用する初期パスワードを設定できるようになりました。今後Misskeyサーバーを新たに設置する際には、初回の起動前にコンフィグファイルの`setupPassword`をコメントアウトし、初期パスワードを設定することをおすすめします。(すでに初期設定を完了しているサーバーについては、この変更に伴い対応する必要はありません)
+ - ホスティングサービスを運営している場合は、コンフィグファイルを構築する際に`setupPassword`をランダムな値に設定し、ユーザーに通知するようにシステムを更新することをおすすめします。
+ - なお、初期パスワードが設定されていない場合でも初期設定を行うことが可能です(UI上で初期パスワードの入力欄を空欄にすると続行できます)。
+- ユーザーデータを読み込む際の型が一部変更されました。
+ - `twoFactorEnabled`, `usePasswordLessLogin`, `securityKeys`: 自分とモデレーター以外のユーザーからは取得できなくなりました
+
+### General
+- Feat: サーバー初期設定時に初期パスワードを設定できるように
+- Feat: 通報にモデレーションノートを残せるように
+- Feat: 通報の解決種別を設定できるように
+- Enhance: 通報の解決と転送を個別に行えるように
+- Enhance: セキュリティ向上のため、サインイン時もCAPTCHAを求めるようになりました
+- Enhance: 依存関係の更新
+- Enhance: l10nの更新
+- Enhance: Playの「人気」タブで10件以上表示可能に #14399
+- Fix: 連合のホワイトリストが正常に登録されない問題を修正
+
+### Client
+- Enhance: デザインの調整
+- Enhance: ログイン画面の認証フローを改善
+- Fix: クライアント上での時間ベースの実績獲得動作が実績獲得後も発動していた問題を修正
+ (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/657)
+
+### Server
+- Enhance: セキュリティ向上のため、ログイン時にメール通知を行うように
+- Enhance: 自分とモデレーター以外のユーザーから二要素認証関連のデータが取得できないように
+- Enhance: 通報および通報解決時に送出されるSystemWebhookにユーザ情報を含めるように ( #14697 )
+- Fix: `admin/abuse-user-reports`エンドポイントのスキーマが間違っていた問題を修正
+
+## 2024.9.0
+
+### General
+- Feat: ノート単体・ユーザーのノート・クリップのノートの埋め込み機能
+ - 埋め込みコードやウェブサイトへの実装方法の詳細は https://misskey-hub.net/docs/for-users/features/embed/ をご覧ください
+- Feat: パスキーでログインボタンを実装 (#14574)
+- Feat: フォローされた際のメッセージを設定できるように
+- Feat: 連合をホワイトリスト制にできるように
+- Feat: UserWebhookとSystemWebhookのテスト送信機能を追加 (#14445)
+- Feat: モデレーターはユーザーにかかわらずファイルが添付されているノートを検索できるように
+ (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/680)
+- Feat: データエクスポートが完了した際に通知を発行するように
+- Enhance: ユーザーによるコンテンツインポートの可否をロールポリシーで制御できるように
+- Enhance: 依存関係の更新
+- Enhance: l10nの更新
+
+### Client
+- Enhance: サイズ制限を超過するファイルをアップロードしようとした際にエラーを出すように
+- Enhance: アイコンデコレーション管理画面にプレビューを追加
+- Enhance: コントロールパネル内のファイル一覧でセンシティブなファイルを区別しやすく
+- Enhance: ScratchpadにUIインスペクターを追加
+- Enhance: Play編集画面の項目の並びを少しリデザイン
+- Enhance: 各種メニューをドロワー表示するかどうか設定可能に
+- Enhance: AiScriptのMk:C:containerのオプションに`borderStyle`と`borderRadius`を追加
+- Enhance: CWでも絵文字をクリックしてメニューを表示できるように
+- Fix: サーバーメトリクスが2つ以上あるとリロード直後の表示がおかしくなる問題を修正
+- Fix: コントロールパネル内のAp requests内のチャートの表示がおかしかった問題を修正
+- Fix: 月の違う同じ日はセパレータが表示されないのを修正
+- Fix: タッチ画面でレンジスライダーを操作するとツールチップが複数表示される問題を修正
+ (Cherry-picked from https://github.com/taiyme/misskey/pull/265)
+- Fix: 縦横比が極端なカスタム絵文字を表示する際にレイアウトが崩れる箇所があるのを修正
+ (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/725)
+- Fix: 設定変更時のリロード確認ダイアログが複数個表示されることがある問題を修正
+- Fix: ファイルの詳細ページのファイルの説明で改行が正しく表示されない問題を修正
+ (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/commit/bde6bb0bd2e8b0d027e724d2acdb8ae0585a8110)
+- Fix: 一部画面のページネーションが動作しにくくなっていたのを修正 ( #12766 , #11449 )
+
+### Server
+- Feat: Misskey® Reactions Boost Technology™ (RBT)により、リアクションの作成負荷を低減することが可能に
+- Fix: アンテナの書き込み時にキーワードが与えられなかった場合のエラーをApiErrorとして投げるように
+ - この変更により、公式フロントエンドでは入力の不備が内部エラーとして報告される代わりに一般的なエラーダイアログで報告されます
+- Fix: ファイルがサイズの制限を超えてアップロードされた際にエラーを返さなかった問題を修正
+- Fix: 外部ページを解析する際に、ページに紐づけられた関連リソースも読み込まれてしまう問題を修正
+ (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/commit/26e0412fbb91447c37e8fb06ffb0487346063bb8)
+- Fix: Continue importing from file if single emoji import fails
+- Fix: `Retry-After`ヘッダーが送信されなかった問題を修正
+ (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/commit/8a982c61c01909e7540ff1be9f019df07c3f0624)
+- Fix: サーバーサイドのDOM解析完了時にリソースを開放するように
+ (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/634)
+- Fix: ``を追って照会するのはOKレスポンスが返却された場合のみに
+ (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/633)
+- Fix: メールにスタイルが適用されていなかった問題を修正
+
+## 2024.8.0
+
+### General
+- Enhance: モデレーターはすべてのユーザーのフォロー・フォロワーの一覧を見られるように
+- Enhance: アカウントの削除のモデレーションログを残すように
+- Enhance: 不適切なページ、ギャラリー、Playを管理者権限で削除できるように
+- Fix: リモートユーザのフォロー・フォロワーの一覧が非公開設定の場合も表示できてしまう問題を修正
+
+### Client
+- Enhance: 「自分のPlay」ページにおいてPlayが非公開かどうかが一目でわかるように
+- Enhance: 不適切なページ、ギャラリー、Playを通報できるように
+- Fix: Play編集時に公開範囲が「パブリック」にリセットされる問題を修正
+- Fix: ページ遷移に失敗することがある問題を修正
+- Fix: iOSでユーザー名などがリンクとして誤検知される現象を抑制
+- Fix: mCaptchaを使用していてもbotプロテクションに関する警告が消えないのを修正
+- Fix: ユーザーのモデレーションページにおいてユーザー名にドットが入っているとシステムアカウントとして表示されてしまう問題を修正
+- Fix: 特定の条件下でノートの削除ボタンが出ないのを修正
+
+### Server
+- Enhance: 照会時にURLがhtmlかつheadタグ内に`rel="alternate"`, `type="application/activity+json"`の`link`タグがある場合に追ってリンク先を照会できるように
+- Enhance: 凍結されたアカウントのフォローリクエストを表示しないように
+- Fix: WSの`readAllNotifications` メッセージが `body` を持たない場合に動作しない問題 #14374
+ - 通知ページや通知カラム(デッキ)を開いている状態において、新たに発生した通知が既読されない問題が修正されます。
+ - これにより、プッシュ通知が有効な同条件下の環境において、プッシュ通知が常に発生してしまう問題も修正されます。
+- Fix: Play各種エンドポイントの返り値に`visibility`が含まれていない問題を修正
+- Fix: サーバー情報取得の際にモデレーター限定の情報が取得できないことがあるのを修正
+ (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/582)
+- Fix: 公開範囲がダイレクトのノートをユーザーアクティビティのチャート生成に使用しないように
+ (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/679)
+- Fix: ActivityPubのエンティティタイプ判定で不明なタイプを受け取った場合でも処理を継続するように
+ - キュー処理のつまりが改善される可能性があります
+- Fix: リバーシの対局設定の変更が反映されないのを修正
+- Fix: 無制限にストリーミングのチャンネルに接続できる問題を修正
+- Fix: ベースロールのポリシーを変更した際にモデログに記録されないのを修正
+ (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/700)
+- Fix: Prevent memory leak from memory caches (#14310)
+- Fix: More reliable memory cache eviction (#14311)
+
+## 2024.7.0
+
+### Note
+- デッキUIの新着ノートをサウンドで通知する機能の追加(v2024.5.0)に伴い、以前から動作しなくなっていたクライアント設定内の「アンテナ受信」「チャンネル通知」サウンドを削除しました。
+- Streaming APIにて入力が不正な場合にはそのメッセージを無視するようになりました。 #14251
+
+### General
+- Feat: 通報を受けた際、または解決した際に、予め登録した宛先に通知を飛ばせるように(mail or webhook) #13705
+- Feat: ユーザーのアイコン/バナーの変更可否をロールで設定可能に
+ - 変更不可となっていても、設定済みのものを解除してデフォルト画像に戻すことは出来ます
+- Feat: ユーザ作成時にSystemWebhookを送信可能に #14281
+- Feat: メディアサイレンスを実装 #13842
+ - メディアサイレンスされたサーバーに所属するアカウントによるファイルはすべてセンシティブとして扱われ、カスタム絵文字が使用できないようになります。
+- Enhance: 管理画面でアーカイブにしたお知らせを表示・編集できるように
+- Fix: 配信停止したインスタンス一覧が見れなくなる問題を修正
+- Fix: Dockerコンテナの立ち上げ時に`pnpm`のインストールで固まることがある問題
+- Fix: デフォルトテーマに無効なテーマコードを入力するとUIが使用できなくなる問題を修正
+- 翻訳の更新
+- 依存関係の更新
+
+### Client
+- Feat: ユーザーページから「このユーザーのノートを検索」できるように (#14128)
+- Feat: 検索ページはクエリを受け付けるようになりました (#14128)
+- Enhance: 検索ページのUI改善 (#14128)
+- Enhance: 内蔵APIドキュメントのデザイン・パフォーマンスを改善
+- Enhance: 非ログイン時に他サーバーに遷移するアクションを追加
+- Enhance: 非ログイン時のハイライトTLのデザインを改善
+- Enhance: フロントエンドのアクセシビリティ改善
+ (Based on https://github.com/taiyme/misskey/pull/226)
+- Enhance: サーバー情報ページ・お問い合わせページを改善
+ (Cherry-picked from https://github.com/taiyme/misskey/pull/238)
+- Enhance: AiScriptを0.19.0にアップデート
+- Enhance: Allow negative delay for MFM animation elements (`tada`, `jelly`, `twitch`, `shake`, `spin`, `jump`, `bounce`, `rainbow`)
+- Enhance: センシティブなメディアを開く際に確認ダイアログを出せるように
+- Enhance: 検索(ノート/ユーザー)で `#` から始まる文字列を入力すると、そのハッシュタグのノート/ユーザー一覧ページが表示できるように
+- Enhance: 検索(ノート/ユーザー)において、入力に空白が含まれている場合は照会を行わないように
+- Enhance: 検索(ノート/ユーザー)において、照会を行うかどうか、ハッシュタグのノート/ユーザー一覧ページを表示するかどうかの確認ダイアログを出すように
+- Enhance: 検索(ノート/ユーザー)で `@` から始まる文字列(`@user@host`など)を入力すると、そのユーザーを照会できるように
+- Enhance: ドライブのファイル・フォルダをドラッグしなくても移動できるように
+ (Cherry-picked from https://github.com/nafu-at/misskey/commit/b89c2af6945c6a9f9f10e83f54d2bcf0f240b0b4, https://github.com/nafu-at/misskey/commit/8a7d710c6acb83f50c83f050bd1423c764d60a99)
+- Enhance: デッキのアンテナ・リスト選択画面からそれぞれを新規作成できるように
+- Enhance: ブラウザのコンテキストメニューを使用できるように
+- Enhance: 連合の「連合中」,「購読中」,「配信中」に対してブロックしているサーバー、配信停止しているサーバーを含めないように
+- Fix: `/about#federation` ページなどで各インスタンスのチャートが表示されなくなっていた問題を修正
+- Fix: ユーザーページの追加情報のラベルを投稿者のサーバーの絵文字で表示する (#13968)
+- Fix: リバーシの対局を正しく共有できないことがある問題を修正
+- Fix: コントロールパネルでベースロールのポリシーを編集してもUI上では変更が反映されない問題を修正
+- Fix: アンテナの編集画面のボタンに隙間を追加
+- Fix: テーマプレビューが見れない問題を修正
+- Fix: ショートカットキーが連打できる問題を修正
+ (Cherry-picked from https://github.com/taiyme/misskey/pull/234)
+- Fix: MkSignin.vueのcredentialRequestからReactivityを削除(ProxyがPasskey認証処理に渡ることを避けるため)
+- Fix: 「アニメーション画像を再生しない」がオンのときでもサーバーのバナー画像・背景画像がアニメーションしてしまう問題を修正
+ (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/574)
+- Fix: Twitchの埋め込みが開けない問題を修正
+- Fix: 子メニューの高さがウィンドウからはみ出ることがある問題を修正
+- Fix: 個人宛てのダイアログ形式のお知らせが即時表示されない問題を修正
+- Fix: 一部の画像がセンシティブ指定されているときに画面に何も表示されないことがあるのを修正
+- Fix: リアクションしたユーザー一覧のユーザー名がはみ出る問題を修正
+ (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/672)
+- Fix: `/share`ページにおいて絵文字ピッカーを開くことができない問題を修正
+- Fix: deck uiの通知音が重なる問題 (#14029)
+- Fix: ダイレクト投稿の"削除して編集"において、宛先が保持されていなかった問題を修正
+- Fix: 投稿フォームへのURL貼り付けによる引用が下書きに保存されていなかった問題を修正
+- Fix: "削除して編集"や下書きにおいて、リアクションの受け入れ設定が保持/保存されていなかった問題を修正
+- Fix: 照会に `#` から始まる文字列を入力してそのハッシュタグのページを表示する際、入力が `#` のみの場合に「指定されたURLに該当するページはありませんでした。」が表示されてしまう問題を修正
+- Fix: 照会に `@` から始まる文字列を入力してユーザーを照会する際、入力が `@` のみの場合に「問題が発生しました」が表示されてしまう問題を修正
+- Fix: 投稿フォームにノートのURLを貼り付けて"引用として添付"した場合、投稿文を空にすることによるRenote化が出来なかった問題を修正
+- Fix: フォロー中のユーザーに関する"TLに他の人への返信を含める"の設定が分かりづらい問題を修正
+- Fix: タイムラインページを開いた時、`TLに他の人への返信を含める`がオフのときに`ファイル付きのみ`をオンにできない問題を修正
+- Fix: deck uiでタイムラインを切り替えた際にTLの設定項目が更新されず、`TLに他の人への返信を含める`のトグルが表示されない問題を修正
+- Fix: ウィジェットのタイムライン選択欄に無効化されたタイムラインが表示される問題を修正
+- Fix: サウンドにドライブの音声を使用している際にドライブの音声が再生できなくなると設定が変更できなくなる問題を修正
+
+### Server
+- Feat: レートリミット制限に引っかかったときに`Retry-After`ヘッダーを返すように (#13949)
+- Enhance: エンドポイント`clips/update`の必須項目を`clipId`のみに
+- Enhance: エンドポイント`admin/roles/update`の必須項目を`roleId`のみに
+- Enhance: エンドポイント`pages/update`の必須項目を`pageId`のみに
+- Enhance: エンドポイント`gallery/posts/update`の必須項目を`postId`のみに
+- Enhance: エンドポイント`i/webhook/update`の必須項目を`webhookId`のみに
+- Enhance: エンドポイント`admin/ad/update`の必須項目を`id`のみに
+- Enhance: `default.yml`内の`url`, `db.db`, `db.user`, `db.pass`を環境変数から読み込めるように
+- Enhance: エンドポイント`api/meta`にプロパティ`noteSearchableScope`が増え、`string`値`local`または`global`を返却します
+- Fix: チャート生成時にinstance.suspensionStateに置き換えられたinstance.isSuspendedが参照されてしまう問題を修正
+- Fix: ユーザーのフィードページのMFMをHTMLに展開するように (#14006)
+- Fix: アンテナ・クリップ・リスト・ウェブフックがロールポリシーの上限より一つ多く作れてしまうのを修正 (#14036)
+- Fix: notRespondingSinceが実装される前に不通になったインスタンスが自動的に配信停止にならない (#14059)
+- Fix: FTT有効時、タイムライン用エンドポイントで`sinceId`にキャッシュ内最古のものより古いものを指定した場合に正しく結果が返ってこない問題を修正
+- Fix: 自分以外のクリップ内のノート個数が見えることがあるのを修正
+- Fix: 空文字列のリアクションはフォールバックされるように
+- Fix: リノートにリアクションできないように
+- Fix: ユーザー名の前後に空白文字列がある場合は省略するように
+- Fix: プロフィール編集時に名前を空白文字列のみにできる問題を修正
+- Fix: ユーザ名のサジェスト時に表示される内容と順番を調整(以下の順番になります) #14149
+ 1. フォロー中かつアクティブなユーザ
+ 2. フォロー中かつ非アクティブなユーザ
+ 3. フォローしていないアクティブなユーザ
+ 4. フォローしていない非アクティブなユーザ
+
+ また、自分自身のアカウントもサジェストされるようになりました。
+- Fix: 一般ユーザーから見たユーザーのバッジの一覧に公開されていないものが含まれることがある問題を修正
+ (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/652)
+- Fix: ユーザーのリアクション一覧でミュート/ブロックが機能していなかった問題を修正
+- Fix: FTT有効時にリモートユーザーのノートがHTLにキャッシュされる問題を修正
+- Fix: 一部の通知がローカル上のリモートユーザーに対して行われていた問題を修正
+- Fix: エラーメッセージの誤字を修正 (#14213)
+- Fix: ソーシャルタイムラインにローカルタイムラインに表示される自分へのリプライが表示されない問題を修正
+- Fix: リノートのミュートが適用されるまでに時間がかかることがある問題を修正
+ (Cherry-picked from https://github.com/Type4ny-Project/Type4ny/commit/e9601029b52e0ad43d9131b555b614e56c84ebc1)
+- Fix: Steaming APIが不正なデータを受けた場合の動作が不安定である問題 #14251
+- Fix: `users/search`において `@` から始まる文字列が与えられた際の処理が正しくなかった問題を修正
+ - 名前や自己紹介に `@` から始まる文言が含まれるユーザーも検索できるようになります
+- Fix: 一部のMisskey以外のソフトウェアからファイルを受け取れない問題
+ (Cherry-picked from https://github.com/Secineralyr/misskey.dream/pull/73/commits/652eaff1e8aa00b890d71d2e1e52c263c1e67c76)
+ - NOTE: `drive_file`の`url`, `uri`, `src`の上限が512から1024に変更されます
+ Migrationではカラム定義の変更のみが行われます。
+ サーバー管理者は各サーバーの必要に応じ`drive_file` `("uri")`に対するインデックスを張りなおすことでより安定しDBの探索が行われる可能性があります。詳細 は [GitHub](https://github.com/misskey-dev/misskey/pull/14323#issuecomment-2257562228)で確認可能です
+- Fix: 自分のフォロワー限定投稿に対するリプライがホームタイムラインで見えないことが有る問題を修正
+- Fix: フォローしていないユーザによるフォロワー限定投稿に対するリプライがソーシャルタイムラインで表示されることがある問題を修正
+
+### Misskey.js
+- Feat: `/drive/files/create` のリクエストに対応(`multipart/form-data`に対応)
+- Feat: `/admin/role/create` のロールポリシーの型を修正
## 2024.5.0
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index dcb625626d..4bcf7e1642 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,7 +1,7 @@
# Contribution guide
We're glad you're interested in contributing Misskey! In this document you will find the information you need to contribute to the project.
-> **Note**
+> [!NOTE]
> This project uses Japanese as its major language, **but you do not need to translate and write the Issues/PRs in Japanese.**
> Also, you might receive comments on your Issue/PR in Japanese, but you do not need to reply to them in Japanese as well.\
> The accuracy of machine translation into Japanese is not high, so it will be easier for us to understand if you write it in the original language.
@@ -17,16 +17,31 @@ Before creating an issue, please check the following:
- Issues should only be used to feature requests, suggestions, and bug tracking.
- Please ask questions or troubleshooting in [GitHub Discussions](https://github.com/misskey-dev/misskey/discussions) or [Discord](https://discord.gg/Wp8gVStHW3).
-> **Warning**
+> [!WARNING]
> Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
-## Before implementation
+### Recommended discussing before implementation
+We welcome your proposal.
+
When you want to add a feature or fix a bug, **first have the design and policy reviewed in an Issue** (if it is not there, please make one). Without this step, there is a high possibility that the PR will not be merged even if it is implemented.
At this point, you also need to clarify the goals of the PR you will create, and make sure that the other members of the team are aware of them.
PRs that do not have a clear set of do's and don'ts tend to be bloated and difficult to review.
-Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask another member to assign you). By expressing your intention to work the Issue, you can prevent conflicts in the work.
+Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask Committer to assign you).
+By expressing your intention to work on the Issue, you can prevent conflicts in the work.
+
+To the Committers: you should not assign someone on it before the Final Decision.
+
+### How issues are triaged
+
+The Committers may:
+* close an issue that is not reproducible on latest stable release,
+* merge an issue into another issue,
+* split an issue into multiple issues,
+* or re-open that has been closed for some reason which is not applicable anymore.
+
+@syuilo reserves the Final Decision rights including whether the project will implement feature and how to implement, these rights are not always exercised.
## Well-known branches
- **`master`** branch is tracking the latest release and used for production purposes.
@@ -37,25 +52,41 @@ Also, when you start implementation, assign yourself to the Issue (if you cannot
## Creating a PR
Thank you for your PR! Before creating a PR, please check the following:
- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below.
- - `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc
- - Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
+ - `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc
+ - Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text.
- Please add the summary of the changes to [`CHANGELOG.md`](/CHANGELOG.md). However, this is not necessary for changes that do not affect the users, such as refactoring.
- Check if there are any documents that need to be created or updated due to this change.
- If you have added a feature or fixed a bug, please add a test case if possible.
- Please make sure that tests and Lint are passed in advance.
- - You can run it with `pnpm test` and `pnpm lint`. [See more info](#testing)
+ - You can run it with `pnpm test` and `pnpm lint`. [See more info](#testing)
- If this PR includes UI changes, please attach a screenshot in the text.
Thanks for your cooperation 🤗
+### Additional things for ActivityPub payload changes
+*This section is specific to misskey-dev implementation. Other fork or implementation may take different way. A significant difference is that non-"misskey-dev" extension is not described in the misskey-hub's document.*
+
+If PR includes changes to ActivityPub payload, please reflect it in [misskey-hub's document](https://github.com/misskey-dev/misskey-hub-next/blob/master/content/ns.md) by sending PR.
+
+The name of purporsed extension property (referred as "extended property" in later) to ActivityPub shall be prefixed by `_misskey_`. (i.e. `_misskey_quote`)
+
+The extended property in `packages/backend/src/core/activitypub/type.ts` **must** be declared as optional because ActivityPub payloads that comes from older Misskey or other implementation may not contain it.
+
+The extended property must be included in the context definition. Context is defined in `packages/backend/src/core/activitypub/misc/contexts.ts`.
+The key shall be same as the name of extended property, and the value shall be same as "short IRI".
+
+"Short IRI" is defined in misskey-hub's document, but usually takes form of `misskey:`. (i.e. `misskey:_misskey_quote`)
+
+One should not add property that has defined before by other implementation, or add custom variant value to "well-known" property.
+
## Reviewers guide
Be willing to comment on the good points and not just the things you want fixed 💯
### Review perspective
- Scope
- - Are the goals of the PR clear?
- - Is the granularity of the PR appropriate?
+ - Are the goals of the PR clear?
+ - Is the granularity of the PR appropriate?
- Security
- Does merging this PR create a vulnerability?
- Performance
@@ -77,7 +108,7 @@ An actual domain will be assigned so you can test the federation.
## Release
### Release Instructions
-1. Commit version changes in the `develop` branch ([package.json](https://github.com/misskey-dev/misskey/blob/develop/package.json))
+1. Commit version changes in the `develop` branch ([package.json](package.json))
2. Create a release PR.
- Into `master` from `develop` branch.
- The title must be in the format `Release: x.y.z`.
@@ -88,7 +119,7 @@ An actual domain will be assigned so you can test the federation.
- The target branch must be `master`
- The tag name must be the version
-> **Note**
+> [!NOTE]
> Why this instruction is necessary:
> - To perform final QA checks
> - To distribute responsibility
@@ -101,17 +132,48 @@ You can improve our translations with your Crowdin account.
Your changes in Crowdin are automatically submitted as a PR (with the title "New Crowdin translations") to the repository.
The owner [@syuilo](https://github.com/syuilo) merges the PR into the develop branch before the next release.
-If your language is not listed in Crowdin, please open an issue.
+If your language is not listed in Crowdin, please open an issue. We will add it to Crowdin.
+For newly added languages, once the translation progress per language exceeds 70%, it will be officially introduced into Misskey and made available to users.
![Crowdin](https://d322cqt584bo4o.cloudfront.net/misskey/localized.svg)
## Development
-During development, it is useful to use the
+### Setup
+Before developing, you have to set up environment. Misskey requires Redis, PostgreSQL, and FFmpeg.
+You would want to install Meilisearch to experiment related features. Technically, meilisearch is not strict requirement, but some features and tests require it.
+
+There are a few ways to proceed.
+
+#### Use system-wide software
+You could install them in system-wide (such as from package manager).
+
+#### Use `docker compose`
+You could obtain middleware container by typing `docker compose -f $PROJECT_ROOT/compose.local-db.yml up -d`.
+
+#### Use Devcontainer
+Devcontainer also has necessary setting. This method can be done by connecting from VSCode.
+
+Instead of running `pnpm` locally, you can use Dev Container to set up your development environment.
+To use Dev Container, open the project directory on VSCode with Dev Containers installed.
+**Note:** If you are using Windows, please clone the repository with WSL. Using Git for Windows will result in broken files due to the difference in how newlines are handled.
+
+It will run the following command automatically inside the container.
+``` bash
+git submodule update --init
+pnpm install --frozen-lockfile
+cp .devcontainer/devcontainer.yml .config/default.yml
+pnpm build
+pnpm migrate
+```
+
+After finishing the migration, you can proceed.
+
+### Start developing
+During development, it is useful to use the
```
pnpm dev
```
-
command.
- Server-side source files and automatically builds them if they are modified. Automatically start the server process(es).
@@ -135,52 +197,46 @@ MK_DEV_PREFER=backend pnpm dev
- To change the port of Vite, specify with `VITE_PORT` environment variable.
- HMR may not work in some environments such as Windows.
-### Dev Container
-Instead of running `pnpm` locally, you can use Dev Container to set up your development environment.
-To use Dev Container, open the project directory on VSCode with Dev Containers installed.
-**Note:** If you are using Windows, please clone the repository with WSL. Using Git for Windows will result in broken files due to the difference in how newlines are handled.
-
-It will run the following command automatically inside the container.
-``` bash
-git submodule update --init
-pnpm install --frozen-lockfile
-cp .devcontainer/devcontainer.yml .config/default.yml
-pnpm build
-pnpm migrate
-```
-
-After finishing the migration, run the `pnpm dev` command to start the development server.
-
-``` bash
-pnpm dev
-```
-
## Testing
-- Test codes are located in [`/packages/backend/test`](/packages/backend/test).
-
-### Run test
-Create a config file.
+You can run non-backend tests by executing following commands:
+```sh
+pnpm --filter frontend test
+pnpm --filter misskey-js test
```
+
+Backend tests require manual preparation of servers. See the next section for more on this.
+
+### Backend
+There are three types of test codes for the backend:
+- Unit tests: [`/packages/backend/test/unit`](/packages/backend/test/unit)
+- Single-server E2E tests: [`/packages/backend/test/e2e`](/packages/backend/test/e2e)
+- Multiple-server E2E tests: [`/packages/backend/test-federation`](/packages/backend/test-federation)
+
+#### Running Unit Tests or Single-server E2E Tests
+1. Create a config file:
+```sh
cp .github/misskey/test.yml .config/
```
-Prepare DB/Redis for testing.
-```
-docker compose -f packages/backend/test/docker-compose.yml up
-```
-Alternatively, prepare an empty (data can be erased) DB and edit `.config/test.yml`.
-Run all test.
+2. Start DB and Redis servers for testing:
+```sh
+docker compose -f packages/backend/test/compose.yml up
```
-pnpm test
+Instead, you can prepare an empty (data can be erased) DB and edit `.config/test.yml` appropriately.
+
+3. Run all tests:
+```sh
+pnpm --filter backend test # unit tests
+pnpm --filter backend test:e2e # single-server E2E tests
+```
+If you want to run a specific test, run as a following command:
+```sh
+pnpm --filter backend test -- packages/backend/test/unit/activitypub.ts
+pnpm --filter backend test:e2e -- packages/backend/test/e2e/nodeinfo.ts
```
-#### Run specify test
-```
-pnpm jest -- foo.ts
-```
-
-### e2e tests
-TODO
+#### Running Multiple-server E2E Tests
+See [`/packages/backend/test-federation/README.md`](/packages/backend/test-federation/README.md).
## Environment Variable
@@ -204,7 +260,7 @@ niraxは、Misskeyで使用しているオリジナルのフロントエンド
### ルート定義
ルート定義は、以下の形式のオブジェクトの配列です。
-``` ts
+```ts
{
name?: string;
path: string;
@@ -217,7 +273,7 @@ niraxは、Misskeyで使用しているオリジナルのフロントエンド
}
```
-> **Warning**
+> [!WARNING]
> 現状、ルートは定義された順に評価されます。
> たとえば、`/foo/:id`ルート定義の次に`/foo/bar`ルート定義がされていた場合、後者がマッチすることはありません。
@@ -279,7 +335,7 @@ export const Default = {
parameters: {
layout: 'centered',
},
-} satisfies StoryObj;
+} satisfies StoryObj;
```
If you want to opt-out from the automatic generation, create a `MyComponent.stories.impl.ts` file and add the following line to the file.
@@ -390,7 +446,7 @@ describe('test', () => {
})
.useMocker(...
.compile();
-
+
fooService = app.get(FooService);
barService = app.get(BarService) as jest.Mocked;
@@ -511,13 +567,13 @@ pnpm dlx typeorm migration:generate -d ormconfig.js -o
- 作成されたスクリプトは不必要な変更を含むため除去してください
### JSON SchemaのobjectでanyOfを使うとき
-JSON Schemaで、objectに対してanyOfを使う場合、anyOfの中でpropertiesを定義しないこと。
-バリデーションが効かないため。(SchemaTypeもそのように作られており、objectのanyOf内のpropertiesは捨てられます)
+JSON Schemaで、objectに対してanyOfを使う場合、anyOfの中でpropertiesを定義しないこと。
+バリデーションが効かないため。(SchemaTypeもそのように作られており、objectのanyOf内のpropertiesは捨てられます)
https://github.com/misskey-dev/misskey/pull/10082
テキストhogeおよびfugaについて、片方を必須としつつ両方の指定もありうる場合:
-```
+```ts
export const paramDef = {
type: 'object',
properties: {
@@ -547,3 +603,24 @@ marginはそのコンポーネントを使う側が設定する
### indexというファイル名を使うな
ESMではディレクトリインポートは廃止されているのと、ディレクトリインポートせずともファイル名が index だと何故か一部のライブラリ?でディレクトリインポートだと見做されてエラーになる
+
+## CSS Recipe
+
+### Lighten CSS vars
+
+``` css
+color: hsl(from var(--MI_THEME-accent) h s calc(l + 10));
+```
+
+### Darken CSS vars
+
+``` css
+color: hsl(from var(--MI_THEME-accent) h s calc(l - 10));
+```
+
+### Add alpha to CSS vars
+
+``` css
+color: color(from var(--MI_THEME-accent) srgb r g b / 0.5);
+```
+
diff --git a/Dockerfile b/Dockerfile
index 9fc2d611cd..e21b2a31fc 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,6 +1,6 @@
# syntax = docker/dockerfile:1.4
-ARG NODE_VERSION=20.12.2-bullseye
+ARG NODE_VERSION=20.16.0-bullseye
# build assets & compile TypeScript
@@ -21,7 +21,9 @@ WORKDIR /misskey
COPY --link ["pnpm-lock.yaml", "pnpm-workspace.yaml", "package.json", "./"]
COPY --link ["scripts", "./scripts"]
COPY --link ["packages/backend/package.json", "./packages/backend/"]
+COPY --link ["packages/frontend-shared/package.json", "./packages/frontend-shared/"]
COPY --link ["packages/frontend/package.json", "./packages/frontend/"]
+COPY --link ["packages/frontend-embed/package.json", "./packages/frontend-embed/"]
COPY --link ["packages/sw/package.json", "./packages/sw/"]
COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
COPY --link ["packages/misskey-reversi/package.json", "./packages/misskey-reversi/"]
@@ -82,6 +84,10 @@ RUN apt-get update \
USER misskey
WORKDIR /misskey
+# add package.json to add pnpm
+COPY --chown=misskey:misskey ./package.json ./package.json
+RUN corepack install
+
COPY --chown=misskey:misskey --from=target-builder /misskey/node_modules ./node_modules
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/backend/node_modules ./packages/backend/node_modules
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-js/node_modules ./packages/misskey-js/node_modules
diff --git a/chart/files/default.yml b/chart/files/default.yml
index f98b8ebfee..4d17131c25 100644
--- a/chart/files/default.yml
+++ b/chart/files/default.yml
@@ -124,6 +124,14 @@ redis:
# #prefix: example-prefix
# #db: 1
+#redisForReactions:
+# host: redis
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+
# ┌───────────────────────────┐
#───┘ MeiliSearch configuration └─────────────────────────────
diff --git a/docker-compose.local-db.yml b/compose.local-db.yml
similarity index 98%
rename from docker-compose.local-db.yml
rename to compose.local-db.yml
index 16ba4b49e1..3835cb23db 100644
--- a/docker-compose.local-db.yml
+++ b/compose.local-db.yml
@@ -1,5 +1,3 @@
-version: "3"
-
# このconfigは、 dockerでMisskey本体を起動せず、 redisとpostgresql などだけを起動します
services:
diff --git a/docker-compose_example.yml b/compose_example.yml
similarity index 97%
rename from docker-compose_example.yml
rename to compose_example.yml
index 5cebbe4164..336bd814a7 100644
--- a/docker-compose_example.yml
+++ b/compose_example.yml
@@ -1,5 +1,3 @@
-version: "3"
-
services:
web:
build: .
@@ -19,6 +17,8 @@ services:
networks:
- internal_network
- external_network
+ # env_file:
+ # - .config/docker.env
volumes:
- ./files:/misskey/files
- ./.config:/misskey/.config:ro
diff --git a/cypress/e2e/basic.cy.ts b/cypress/e2e/basic.cy.ts
index d2525e0a7d..d2efbf709c 100644
--- a/cypress/e2e/basic.cy.ts
+++ b/cypress/e2e/basic.cy.ts
@@ -23,6 +23,7 @@ describe('Before setup instance', () => {
cy.intercept('POST', '/api/admin/accounts/create').as('signup');
+ cy.get('[data-cy-admin-initial-password] input').type('example_password_please_change_this_or_you_will_get_hacked');
cy.get('[data-cy-admin-username] input').type('admin');
cy.get('[data-cy-admin-password] input').type('admin1234');
cy.get('[data-cy-admin-ok]').click();
@@ -119,11 +120,16 @@ describe('After user signup', () => {
it('signin', () => {
cy.visitHome();
- cy.intercept('POST', '/api/signin').as('signin');
+ cy.intercept('POST', '/api/signin-flow').as('signin');
cy.get('[data-cy-signin]').click();
- cy.get('[data-cy-signin-username] input').type('alice');
- // Enterキーでサインインできるかの確認も兼ねる
+
+ cy.get('[data-cy-signin-page-input]').should('be.visible', { timeout: 1000 });
+ // Enterキーで続行できるかの確認も兼ねる
+ cy.get('[data-cy-signin-username] input').type('alice{enter}');
+
+ cy.get('[data-cy-signin-page-password]').should('be.visible', { timeout: 10000 });
+ // Enterキーで続行できるかの確認も兼ねる
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
cy.wait('@signin');
@@ -138,8 +144,9 @@ describe('After user signup', () => {
cy.visitHome();
cy.get('[data-cy-signin]').click();
- cy.get('[data-cy-signin-username] input').type('alice');
- cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
+
+ cy.get('[data-cy-signin-page-input]').should('be.visible', { timeout: 1000 });
+ cy.get('[data-cy-signin-username] input').type('alice{enter}');
// TODO: cypressにブラウザの言語指定できる機能が実装され次第英語のみテストするようにする
cy.contains(/アカウントが凍結されています|This account has been suspended due to/gi);
diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts
index 281f2e6ccd..197ff963ac 100644
--- a/cypress/support/commands.ts
+++ b/cypress/support/commands.ts
@@ -48,16 +48,19 @@ Cypress.Commands.add('registerUser', (username, password, isAdmin = false) => {
cy.request('POST', route, {
username: username,
password: password,
+ ...(isAdmin ? { setupPassword: 'example_password_please_change_this_or_you_will_get_hacked' } : {}),
}).its('body').as(username);
});
Cypress.Commands.add('login', (username, password) => {
cy.visitHome();
- cy.intercept('POST', '/api/signin').as('signin');
+ cy.intercept('POST', '/api/signin-flow').as('signin');
cy.get('[data-cy-signin]').click();
- cy.get('[data-cy-signin-username] input').type(username);
+ cy.get('[data-cy-signin-page-input]').should('be.visible', { timeout: 1000 });
+ cy.get('[data-cy-signin-username] input').type(`${username}{enter}`);
+ cy.get('[data-cy-signin-page-password]').should('be.visible', { timeout: 10000 });
cy.get('[data-cy-signin-password] input').type(`${password}{enter}`);
cy.wait('@signin').as('signedIn');
diff --git a/packages/frontend/src/components/MkAbuseReport.stories.impl.ts b/idea/MkAbuseReport.stories.impl.ts
similarity index 88%
rename from packages/frontend/src/components/MkAbuseReport.stories.impl.ts
rename to idea/MkAbuseReport.stories.impl.ts
index cf09c96fd4..717bceb23d 100644
--- a/packages/frontend/src/components/MkAbuseReport.stories.impl.ts
+++ b/idea/MkAbuseReport.stories.impl.ts
@@ -7,8 +7,8 @@
import { action } from '@storybook/addon-actions';
import { StoryObj } from '@storybook/vue3';
import { HttpResponse, http } from 'msw';
-import { abuseUserReport } from '../../.storybook/fakes.js';
-import { commonHandlers } from '../../.storybook/mocks.js';
+import { abuseUserReport } from '../packages/frontend/.storybook/fakes.js';
+import { commonHandlers } from '../packages/frontend/.storybook/mocks.js';
import MkAbuseReport from './MkAbuseReport.vue';
export const Default = {
render(args) {
diff --git a/idea/MkDisableSection.vue b/idea/MkDisableSection.vue
new file mode 100644
index 0000000000..360705071b
--- /dev/null
+++ b/idea/MkDisableSection.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
diff --git a/idea/README.md b/idea/README.md
new file mode 100644
index 0000000000..f64d16800a
--- /dev/null
+++ b/idea/README.md
@@ -0,0 +1 @@
+使われなくなったけど消すのは勿体ない(将来使えるかもしれない)コードを入れておくとこ
diff --git a/locales/ar-SA.yml b/locales/ar-SA.yml
index 955d672c1d..de24ad4bb9 100644
--- a/locales/ar-SA.yml
+++ b/locales/ar-SA.yml
@@ -626,10 +626,7 @@ abuseReported: "أُرسل البلاغ، شكرًا لك"
reporter: "المُبلّغ"
reporteeOrigin: "أصل البلاغ"
reporterOrigin: "أصل المُبلّغ"
-forwardReport: "وجّه البلاغ إلى المثيل البعيد"
-forwardReportIsAnonymous: "في المثيل البعيد سيظهر المبلّغ كحساب مجهول."
send: "أرسل"
-abuseMarkAsResolved: "علّم البلاغ كمحلول"
openInNewTab: "افتح في لسان جديد"
defaultNavigationBehaviour: "سلوك الملاحة الافتراضي"
editTheseSettingsMayBreakAccount: "تعديل هذه الإعدادات قد يسبب عطبًا لحسابك"
@@ -1255,15 +1252,12 @@ _theme:
buttonBg: "خلفية الأزرار"
buttonHoverBg: "خلفية الأزرار (عند التمرير فوقها)"
inputBorder: "حواف حقل الإدخال"
- listItemHoverBg: "خلفية عناصر القائمة (عند التمرير فوقها)"
driveFolderBg: "خلفية مجلد قرص التخزين"
messageBg: "خلفية المحادثة"
_sfx:
note: "الملاحظات"
noteMy: "ملاحظتي"
notification: "الإشعارات"
- antenna: "الهوائيات"
- channel: "إشعارات القنات"
_ago:
future: "المستقبَل"
justNow: "اللحظة"
@@ -1535,6 +1529,7 @@ _notification:
reaction: "التفاعل"
receiveFollowRequest: "طلبات المتابعة"
followRequestAccepted: "طلبات المتابعة المقبولة"
+ login: "لِج"
app: "إشعارات التطبيقات المرتبطة"
_actions:
followBack: "تابعك بالمثل"
@@ -1566,6 +1561,10 @@ _webhookSettings:
active: "مُفعّل"
_events:
reaction: "عند التفاعل"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "البريد الإلكتروني "
_moderationLogTypes:
suspend: "علِق"
deleteDriveFile: "حُذف الملف"
diff --git a/locales/bn-BD.yml b/locales/bn-BD.yml
index abcf07da83..0e761b0743 100644
--- a/locales/bn-BD.yml
+++ b/locales/bn-BD.yml
@@ -451,7 +451,6 @@ or: "অথবা"
language: "ভাষা"
uiLanguage: "UI এর ভাষা"
aboutX: "{x} সম্পর্কে"
-disableDrawer: "ড্রয়ার মেনু প্রদর্শন করবেন না"
noHistory: "কোনো ইতিহাস নেই"
signinHistory: "প্রবেশ করার ইতিহাস"
doing: "প্রক্রিয়া করছে..."
@@ -625,10 +624,7 @@ abuseReported: "আপনার অভিযোগটি দাখিল কর
reporter: "অভিযোগকারী"
reporteeOrigin: "অভিযোগটির উৎস"
reporterOrigin: "অভিযোগকারীর উৎস"
-forwardReport: "রিমোট ইন্সত্যান্সে অভিযোগটি পাঠান"
-forwardReportIsAnonymous: "আপনার তথ্য রিমোট ইন্সত্যান্সে পাঠানো হবে না এবং একটি বেনামী সিস্টেম অ্যাকাউন্ট হিসাবে প্রদর্শিত হবে।"
send: "পাঠান"
-abuseMarkAsResolved: "অভিযোগটিকে সমাধাকৃত হিসাবে চিহ্নিত করুন"
openInNewTab: "নতুন ট্যাবে খুলুন"
openInSideView: "সাইড ভিউতে খুলুন"
defaultNavigationBehaviour: "ডিফল্ট নেভিগেশন"
@@ -1021,7 +1017,6 @@ _theme:
buttonBg: "বাটনের পটভূমি"
buttonHoverBg: "বাটনের পটভূমি (হভার)"
inputBorder: "ইনপুট ফিল্ডের বর্ডার"
- listItemHoverBg: "লিস্ট আইটেমের পটভূমি (হোভার)"
driveFolderBg: "ড্রাইভ ফোল্ডারের পটভূমি"
wallpaperOverlay: "ওয়ালপেপার ওভারলে"
badge: "ব্যাজ"
@@ -1033,8 +1028,6 @@ _sfx:
note: "নোটগুলি"
noteMy: "নোট (আপনার)"
notification: "বিজ্ঞপ্তি"
- antenna: "অ্যান্টেনাগুলি"
- channel: "চ্যানেলের বিজ্ঞপ্তি"
_ago:
future: "ভবিষ্যৎ"
justNow: "এইমাত্র"
@@ -1316,6 +1309,7 @@ _notification:
pollEnded: "পোল শেষ"
receiveFollowRequest: "প্রাপ্ত অনুসরণের অনুরোধসমূহ"
followRequestAccepted: "গৃহীত অনুসরণের অনুরোধসমূহ"
+ login: "প্রবেশ করুন"
app: "লিঙ্ক করা অ্যাপ থেকে বিজ্ঞপ্তি"
_actions:
followBack: "ফলো ব্যাক করেছে"
@@ -1346,6 +1340,10 @@ _deck:
_webhookSettings:
name: "নাম"
active: "চালু"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "ইমেইল"
_moderationLogTypes:
suspend: "স্থগিত করা"
resetPassword: "পাসওয়ার্ড রিসেট করুন"
diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml
index 0345ee0326..748f6f03c0 100644
--- a/locales/ca-ES.yml
+++ b/locales/ca-ES.yml
@@ -2,12 +2,15 @@
_lang_: "Català"
headlineMisskey: "Una xarxa connectada per notes"
introMisskey: "Benvingut! Misskey és un servei de microblogging descentralitzat de codi obert.\nCrea \"notes\" per compartir els teus pensaments amb tots els que t'envolten. 📡\nAmb \"reaccions\", també pots expressar ràpidament els teus sentiments sobre les notes de tothom. 👍\nExplorem un món nou! 🚀"
-poweredByMisskeyDescription: "{name} És un del serveis (anomenats instàncies de Misskey) que utilitzen la plataforma de codi obert Misskey."
+poweredByMisskeyDescription: "{name} És un dels serveis (anomenats instàncies de Misskey) que utilitzen la plataforma de codi obert Misskey."
monthAndDay: "{day}/{month}"
search: "Cercar"
notifications: "Notificacions"
username: "Nom d'usuari"
password: "Contrasenya"
+initialPasswordForSetup: "Contrasenya inicial per la configuració inicial"
+initialPasswordIsIncorrect: "La contrasenya no és correcta."
+initialPasswordForSetupDescription: "Fes servir la contrasenya que has fet servir al fitxer de configuració, si tu mateix has instal·lat Misskey.\nSi fas servir una empresa d'allotjament de Misskey, fes servir la contrasenya que t'han donat.\nSi no has posat cap contrasenya deixar l'espai en blanc."
forgotPassword: "Contrasenya oblidada"
fetchingAsApObject: "Cercant en el Fediverse..."
ok: "OK"
@@ -15,7 +18,7 @@ gotIt: "Ho he entès!"
cancel: "Cancel·lar"
noThankYou: "No, gràcies"
enterUsername: "Introdueix el teu nom d'usuari"
-renotedBy: "Impulsat per {usuari}"
+renotedBy: "Impulsat per {user}"
noNotes: "Cap nota"
noNotifications: "Cap notificació"
instance: "Servidor"
@@ -60,6 +63,7 @@ copyFileId: "Copiar ID d'arxiu"
copyFolderId: "Copiar ID de carpeta"
copyProfileUrl: "Copiar URL del perfil"
searchUser: "Cercar un usuari"
+searchThisUsersNotes: "Cerca les publicacions de l'usuari"
reply: "Respondre"
loadMore: "Carregar més"
showMore: "Veure més"
@@ -108,11 +112,14 @@ enterEmoji: "Introduir un emoji"
renote: "Impulsa"
unrenote: "Anul·la l'impuls"
renoted: "S'ha impulsat"
+renotedToX: "Impulsat per {name}."
cantRenote: "No es pot impulsar aquesta publicació"
cantReRenote: "No es pot impulsar l'impuls."
quote: "Cita"
inChannelRenote: "Renotar només al Canal"
inChannelQuote: "Citar només al Canal"
+renoteToChannel: "Impulsa a un canal"
+renoteToOtherChannel: "Impulsa a un altre canal"
pinnedNote: "Nota fixada"
pinned: "Fixar al perfil"
you: "Tu"
@@ -151,6 +158,7 @@ editList: "Editar llista"
selectChannel: "Selecciona un canal"
selectAntenna: "Tria una antena"
editAntenna: "Modificar antena"
+createAntenna: "Crea una antena"
selectWidget: "Triar un giny"
editWidgets: "Editar ginys"
editWidgetsExit: "Fet"
@@ -177,6 +185,10 @@ addAccount: "Afegeix un compte"
reloadAccountsList: "Recarregar la llista de contactes"
loginFailed: "S'ha produït un error al accedir."
showOnRemote: "Navega més en el perfil original"
+continueOnRemote: "Veure perfil original"
+chooseServerOnMisskeyHub: "Escull un servidor des del Hub de Misskey"
+specifyServerHost: "Especifica un servidor directament"
+inputHostName: "Introdueix el domini"
general: "General"
wallpaper: "Fons de Pantalla"
setWallpaper: "Defineix el fons de pantalla"
@@ -187,6 +199,7 @@ followConfirm: "Estàs segur que vols deixar de seguir {name}?"
proxyAccount: "Compte de proxy"
proxyAccountDescription: "Un compte proxy és un compte que actua com a seguidor remot per als usuaris en determinades condicions. Per exemple, quan un usuari afegeix un usuari remot a la llista, l'activitat de l'usuari remot no es lliurarà al servidor si cap usuari local segueix aquest usuari, de manera que el compte proxy el seguirà."
host: "Amfitrió"
+selectSelf: "Escollir manualment"
selectUser: "Selecciona usuari/a"
recipient: "Destinatari"
annotation: "Comentaris"
@@ -202,6 +215,7 @@ perDay: "Per dia"
stopActivityDelivery: "Deixa d'enviar activitats"
blockThisInstance: "Deixa d'enviar activitats"
silenceThisInstance: "Silencia aquesta instància "
+mediaSilenceThisInstance: "Silenciar els arxius d'aquesta instància "
operations: "Accions"
software: "Programari"
version: "Versió"
@@ -223,6 +237,10 @@ blockedInstances: "Instàncies bloquejades"
blockedInstancesDescription: "Llista els enllaços d'amfitrió de les instàncies que vols bloquejar separades per un salt de pàgina. Les instàncies llistades no podran comunicar-se amb aquesta instància."
silencedInstances: "Instàncies silenciades"
silencedInstancesDescription: "Llista els enllaços d'amfitrió de les instàncies que vols silenciar. Tots els comptes de les instàncies llistades s'establiran com silenciades i només podran fer sol·licitacions de seguiment, i no podran mencionar als comptes locals si no els segueixen. Això no afectarà les instàncies bloquejades."
+mediaSilencedInstances: "Instàncies amb els arxius silenciats"
+mediaSilencedInstancesDescription: "Llista els noms dels servidors que vulguis silenciar els arxius, un servidor per línia. Tots els comptes que pertanyin als servidors llistats seran tractats com sensibles i no podran fer servir emojis personalitzats. Això no tindrà efecte sobre els servidors blocats."
+federationAllowedHosts: "Llista de servidors federats"
+federationAllowedHostsDescription: "Llista dels servidors amb els quals es federa."
muteAndBlock: "Silencia i bloca"
mutedUsers: "Usuaris silenciats"
blockedUsers: "Usuaris bloquejats"
@@ -313,6 +331,7 @@ selectFile: "Selecciona fitxers"
selectFiles: "Selecciona fitxers"
selectFolder: "Selecció de carpeta"
selectFolders: "Selecció de carpeta"
+fileNotSelected: "Cap fitxer seleccionat"
renameFile: "Canvia el nom del fitxer"
folderName: "Nom de la carpeta"
createFolder: "Crea una carpeta"
@@ -320,6 +339,7 @@ renameFolder: "Canvia el nom de la carpeta"
deleteFolder: "Elimina la carpeta"
folder: "Carpeta "
addFile: "Afegeix un fitxer"
+showFile: "Mostrar fitxer"
emptyDrive: "La teva unitat és buida"
emptyFolder: "La carpeta està buida"
unableToDelete: "No es pot eliminar"
@@ -434,6 +454,7 @@ totpDescription: "Escriu una contrasenya d'un sol us fent servir l'aplicació d'
moderator: "Moderador/a"
moderation: "Moderació"
moderationNote: "Nota de moderació "
+moderationNoteDescription: "Pots escriure notes que es compartiran entre els moderadors."
addModerationNote: "Afegir una nota de moderació "
moderationLogs: "Registre de moderació "
nUsersMentioned: "{n} usuaris mencionats"
@@ -468,10 +489,12 @@ retype: "Torneu a introduir-la"
noteOf: "Publicació de: {user}"
quoteAttached: "Frase adjunta"
quoteQuestion: "Vols annexar-la com a cita?"
+attachAsFileQuestion: "El text copiat és massa llarg. Vols adjuntar-lo com un fitxer de text?"
noMessagesYet: "Encara no hi ha missatges"
newMessageExists: "Has rebut un nou missatge"
onlyOneFileCanBeAttached: "Només pots adjuntar un fitxer a un missatge"
signinRequired: "Si us plau, Registra't o inicia la sessió abans de continuar"
+signinOrContinueOnRemote: "Per continuar necessites moure el teu servidor o registrar-te / iniciar sessió en aquest servidor."
invitations: "Convida"
invitationCode: "Codi d'invitació"
checking: "Comprovació en curs..."
@@ -493,7 +516,10 @@ uiLanguage: "Idioma de l'interfície"
aboutX: "Respecte a {x}"
emojiStyle: "Estil d'emoji"
native: "Nadiu"
-disableDrawer: "No mostrar els menús en calaixos"
+menuStyle: "Estil de menú"
+style: "Estil"
+drawer: "Calaix"
+popup: "Emergent"
showNoteActionsOnlyHover: "Només mostra accions de la nota en passar amb el cursor"
showReactionsCount: "Mostra el nombre de reaccions a les publicacions"
noHistory: "No hi ha un registre previ"
@@ -543,7 +569,7 @@ objectStorageUseSSLDesc: "Desactiva'l si no tens pensat fer servir HTTPS per les
objectStorageUseProxy: "Connectar-se mitjançant un Proxy"
objectStorageUseProxyDesc: "Desactiva'l si no faràs servir un Proxy per les connexions de l'API"
objectStorageSetPublicRead: "Configurar les pujades com públiques "
-s3ForcePathStyleDesc: "Si s3ForcePathStyle es troba activat el nom del dipòsit s'ha d'incloure a l'adreça URL en comtes del nom del host. Potser que necessitis activar-ho quan facis servir, per exemple, Minio a un servidor propi."
+s3ForcePathStyleDesc: "Si s3ForcePathStyle es troba activat el nom del cubell s'haurà d'especificar com a part de l'adreça URL en comptes del nom del servidor. Podria ser que necessitis activar aquesta opció quan facis servir serveis com ara l'allotjament a un servidor propi."
serverLogs: "Registres del servidor"
deleteAll: "Elimina-ho tot"
showFixedPostForm: "Mostrar el formulari per escriure a l'inici de la línia de temps"
@@ -576,6 +602,8 @@ ascendingOrder: "Ascendent"
descendingOrder: "Descendent"
scratchpad: "Bloc de proves"
scratchpadDescription: "El bloc de proves proporciona un entorn experimental per AiScript. Pot escriure i verificar els resultats que interactuen amb Misskey."
+uiInspector: "Inspector de la interfície"
+uiInspectorDescription: "Podeu visualitzar una llista d'elements UI presents en la memòria. Els components de la interfície d'usuari són generats per les funcions Ui:C:."
output: "Sortida"
script: "Script"
disablePagesScript: "Desactivar AiScript a les pàgines "
@@ -692,10 +720,7 @@ abuseReported: "La teva denúncia s'ha enviat. Moltes gràcies."
reporter: "Denunciant "
reporteeOrigin: "Origen de la denúncia "
reporterOrigin: "Origen del denunciant"
-forwardReport: "Transferir la denúncia a una instància remota"
-forwardReportIsAnonymous: "En lloc del teu compte, es farà servir un compte anònim com a denunciant al servidor remot."
send: "Envia"
-abuseMarkAsResolved: "Marca la denúncia com a resolta"
openInNewTab: "Obre a una pestanya nova"
openInSideView: "Obre a una vista lateral"
defaultNavigationBehaviour: "Navegació per defecte"
@@ -832,6 +857,7 @@ administration: "Administració"
accounts: "Comptes"
switch: "Canvia"
noMaintainerInformationWarning: "La informació de l'administrador no s'ha configurat"
+noInquiryUrlWarning: "No s'ha desat l'URL de consulta."
noBotProtectionWarning: "La protecció contra bots no s'ha configurat."
configure: "Configurar"
postToGallery: "Crear una nova publicació a la galeria"
@@ -896,6 +922,7 @@ followersVisibility: "Visibilitat dels seguidors"
continueThread: "Veure la continuació del fil"
deleteAccountConfirm: "Això eliminarà el teu compte irreversiblement. Procedir?"
incorrectPassword: "Contrasenya incorrecta."
+incorrectTotp: "La contrasenya no és correcta, o ha caducat."
voteConfirm: "Confirma el teu vot \"{choice}\""
hide: "Amagar"
useDrawerReactionPickerForMobile: "Mostrar el selector de reaccions com un calaix al mòbil "
@@ -920,6 +947,9 @@ oneHour: "1 hora"
oneDay: "Un dia"
oneWeek: "Una setmana"
oneMonth: "Un mes"
+threeMonths: "3 mesos"
+oneYear: "1 any"
+threeDays: "3 dies"
reflectMayTakeTime: "Això pot trigar una estona a tenir efecte"
failedToFetchAccountInformation: "No es pot obtenir la informació del compte"
rateLimitExceeded: "S'ha arribat al màxim de peticions"
@@ -1021,6 +1051,7 @@ thisPostMayBeAnnoyingHome: "Publicar a la línia de temps d'Inici"
thisPostMayBeAnnoyingCancel: "Cancel·lar "
thisPostMayBeAnnoyingIgnore: "Publicar de totes maneres"
collapseRenotes: "Col·lapsar les renotes que ja has vist"
+collapseRenotesDescription: "Col·lapse les notes a les quals ja has reaccionat o que ja has renotat"
internalServerError: "Error intern del servidor"
internalServerErrorDescription: "El servidor ha fallat de manera inexplicable."
copyErrorInfo: "Copiar la informació de l'error "
@@ -1059,6 +1090,7 @@ retryAllQueuesConfirmTitle: "Tornar a intentar-ho tot?"
retryAllQueuesConfirmText: "Això farà que la càrrega del servidor augmenti temporalment."
enableChartsForRemoteUser: "Generar gràfiques d'usuaris remots"
enableChartsForFederatedInstances: "Generar gràfiques d'instàncies remotes"
+enableStatsForFederatedInstances: "Activa les estadístiques de les instàncies remotes federades"
showClipButtonInNoteFooter: "Afegir \"Retall\" al menú d'acció de la nota"
reactionsDisplaySize: "Mida de les reaccions"
limitWidthOfReaction: "Limitar l'amplada màxima de la reacció i mostrar-les en una mida reduïda "
@@ -1094,6 +1126,8 @@ preservedUsernames: "Noms d'usuaris reservats"
preservedUsernamesDescription: "Llistat de noms d'usuaris que no es poden fer servir separats per salts de linia. Aquests noms d'usuaris no estaran disponibles quan es creï un compte d'usuari normal, però els administradors els poden fer servir per crear comptes manualment. Per altre banda els comptes ja creats amb aquests noms d'usuari no es veure'n afectats."
createNoteFromTheFile: "Compon una nota des d'aquest fitxer"
archive: "Arxiu"
+archived: "Arxivat"
+unarchive: "Desarxivar"
channelArchiveConfirmTitle: "Vols arxivar {name}?"
channelArchiveConfirmDescription: "Un Canal arxivat no apareixerà a la llista de canals o als resultats de cerca. Tampoc es poden afegir noves entrades."
thisChannelArchived: "Aquest Canal ha sigut arxivat."
@@ -1104,6 +1138,9 @@ preventAiLearning: "Descartar l'ús d'aprenentatge automàtic (IA Generativa)"
preventAiLearningDescription: "Demanar els indexadors no fer servir els texts, imatges, etc. en cap conjunt de dades per alimentar l'aprenentatge automàtic (IA Predictiva/ Generativa). Això s'aconsegueix afegint la etiqueta \"noai\" com a resposta HTML al contingut corresponent. Prevenir aquest ús totalment pot ser que no sigui aconseguit, ja que molts indexadors poden obviar aquesta etiqueta."
options: "Opcions"
specifyUser: "Especificar usuari"
+lookupConfirm: "Vols fer una cerca?"
+openTagPageConfirm: "Vols obrir una pàgina d'etiquetes?"
+specifyHost: "Especifica un servidor"
failedToPreviewUrl: "Vista prèvia no disponible"
update: "Actualitzar"
rolesThatCanBeUsedThisEmojiAsReaction: "Rols que poden fer servir aquest emoji com a reacció "
@@ -1172,7 +1209,10 @@ confirmShowRepliesAll: "Aquesta opció no té marxa enrere. Vols mostrar les tev
confirmHideRepliesAll: "Aquesta opció no té marxa enrere. Vols ocultar les teves respostes a tots els usuaris que segueixes a la línia de temps?"
externalServices: "Serveis externs"
sourceCode: "Codi font"
+sourceCodeIsNotYetProvided: "El codi font encara no es troba disponible. Contacta amb l'administrador per solucionar aquest problema."
repositoryUrl: "URL del repositori"
+repositoryUrlDescription: "Si estàs fent servir Misskey tal com és (sense cap canvi al codi font), introdueix https://github.com/misskey-dev/misskey"
+repositoryUrlOrTarballRequired: "Si no ofereixes cap repositori, publica un fitxer tarball. Dona una ullada a .config/example.yml per a més informació."
feedback: "Opinió"
feedbackUrl: "URL per a opinar"
impressum: "Impressum"
@@ -1211,6 +1251,7 @@ showReplay: "Veure reproducció"
replay: "Reproduir"
replaying: "Reproduint"
endReplay: "Tanca la redifusió"
+copyReplayData: "Copia les dades de la resposta"
ranking: "Classificació"
lastNDays: "Últims {n} dies"
backToTitle: "Torna al títol"
@@ -1224,12 +1265,79 @@ gameRetry: "Torna a provar"
notUsePleaseLeaveBlank: "Si no voleu usar-ho, deixeu-ho en blanc"
useTotp: "Usa una contrasenya d'un sol ús"
useBackupCode: "Usa un codi de recuperació"
+launchApp: "Inicia l'aplicació "
+useNativeUIForVideoAudioPlayer: "Fes servir la UI del navegador quan reprodueixis vídeo i àudio "
+keepOriginalFilename: "Desa el nom del fitxer original"
+keepOriginalFilenameDescription: "Si desactives aquesta opció els noms dels fitxers se substituiran per una cadena aleatòria quan carreguis nous fitxers de forma automàtica."
+noDescription: "No hi ha una descripció "
+alwaysConfirmFollow: "Confirma sempre els seguiments"
+inquiry: "Contacte"
+tryAgain: "Intenta-ho més tard."
+confirmWhenRevealingSensitiveMedia: "Confirmació quan revelis contingut sensible "
+sensitiveMediaRevealConfirm: "Aquest contingut potser sensible. Segur que ho vols revelar?"
+createdLists: "Llistes creades "
+createdAntennas: "Antenes creades"
+fromX: "De {x}"
+genEmbedCode: "Obtenir el codi per incrustar"
+noteOfThisUser: "Notes d'aquest usuari"
+clipNoteLimitExceeded: "No es poden afegir més notes a aquest clip."
+performance: "Rendiment"
+modified: "Modificat"
+discard: "Descarta"
+thereAreNChanges: "Hi ha(n) {n} canvi(s)"
+signinWithPasskey: "Inicia sessió amb Passkey"
+unknownWebAuthnKey: "Passkey desconeguda"
+passkeyVerificationFailed: "La verificació a fallat"
+passkeyVerificationSucceededButPasswordlessLoginDisabled: "La verificació de la passkey a estat correcta, però s'ha deshabilitat l'inici de sessió sense contrasenya."
+messageToFollower: "Missatge als meus seguidors"
+target: "Assumpte "
+testCaptchaWarning: "És una característica dissenyada per a la prova de CAPTCHA. No l'utilitzes en l'entorn real."
+prohibitedWordsForNameOfUser: "Noms prohibits per escollir noms d'usuari "
+prohibitedWordsForNameOfUserDescription: "Si qualsevol d'aquestes paraules es troben a un nom d'usuari la creació de l'usuari no es durà a terme. Als moderadors no els afecta aquesta restricció."
+yourNameContainsProhibitedWords: "El nom conté paraules prohibides "
+yourNameContainsProhibitedWordsDescription: "Si de veritat vols fer servir aquest nom posat en contacte amb l'administrador."
+thisContentsAreMarkedAsSigninRequiredByAuthor: "L'autor requereix l'inici de sessió per poder veure"
+lockdown: "Bloquejat"
+pleaseSelectAccount: "Seleccionar un compte"
+_accountSettings:
+ requireSigninToViewContents: "És obligatori l'inici de sessió per poder veure el contingut"
+ requireSigninToViewContentsDescription1: "Es requereix l'inici de sessió per poder veure totes les notes i el contingut que has creat. Amb això esperem evitar que els rastrejadors recopilin informació."
+ requireSigninToViewContentsDescription2: "També es desactivaran les vistes prèvies d'URLS (OGP), la incrustació a pàgines web i la visualització des de servidors que no admetin la citació de notes."
+ requireSigninToViewContentsDescription3: "Aquestes restriccions pot ser que no s'apliquin als continguts federats en servidors remots."
+ makeNotesFollowersOnlyBefore: "Permetre que les notes antigues només es mostrin als seguidors."
+ makeNotesFollowersOnlyBeforeDescription: "Mentre aquesta funció estigui activada, les notes que hagin passat la data i hora fixada o hagi passat els temps establert seran visibles només per als teus seguidors. Quan es desactivi, també es restableix l'estat públic de la nota."
+ makeNotesHiddenBefore: "Fes que les notes antigues siguin privades"
+ makeNotesHiddenBeforeDescription: "Mentres aquesta funció estigui activada les notes que hagin superat una data i hora fixada o hagi passat el temps establert només seran visibles per a tu. Si la desactives es restablirà també l'estat públic de les notes."
+ mayNotEffectForFederatedNotes: "Això pot ser que no afecti les notes federades."
+ notesHavePassedSpecifiedPeriod: "Notes publicades durant un període de temps especificat."
+ notesOlderThanSpecifiedDateAndTime: "Notes més antigues de la data i temps especificat "
+_abuseUserReport:
+ forward: "Reenviar "
+ forwardDescription: "Reenvia l'informe a una altra instància com un compte del sistema anònima."
+ resolve: "Solució "
+ accept: "Acceptar "
+ reject: "Rebutjar"
+ resolveTutorial: "Si l'informe és legítim selecciona \"Acceptar\" per resoldre'l positivament. Però si l'informe no és legítim selecciona \"Rebutjar\" per resoldre'l negativament."
_delivery:
+ status: "Estat d'entrega "
stop: "Suspés"
+ resume: "Torna a enviar"
_type:
none: "S'està publicant"
+ manuallySuspended: "Suspendre manualment"
+ goneSuspended: "Servidor suspès perquè el servidor s'ha esborrat"
+ autoSuspendedForNotResponding: "Servidor suspès perquè el servidor no respon"
_bubbleGame:
howToPlay: "Com es juga"
+ hold: "Mantenir"
+ _score:
+ score: "Puntuació "
+ scoreYen: "Diners guanyats"
+ highScore: "Millor puntuació "
+ maxChain: "Nombre màxim de combos"
+ yen: "{yen}Ien"
+ estimatedQty: "{qty}peces"
+ scoreSweets: "{onigiriQtyWithUnit}ongiris"
_howToPlay:
section1: "Ajusta la posició i deixa caure l'objecte dintre la caixa."
section2: "Quan dos objectes del mateix tipus es toquen, canviaran en un objecte diferent i guanyares punts."
@@ -1344,6 +1452,10 @@ _serverSettings:
fanoutTimelineDescription: "Quan es troba activat millora bastant el rendiment quan es recuperen les línies de temps i redueix la carrega de la base de dades. Com a contrapunt, l'ús de memòria de Redis es veurà incrementada. Considera d'estabilitat aquesta opció en cas de tenir un servidor amb poca memòria o si tens problemes de inestabilitat."
fanoutTimelineDbFallback: "Carregar de la base de dades"
fanoutTimelineDbFallbackDescription: "Quan s'activa, la línia de temps fa servir la base de dades per consultes adicionals si la línia de temps no es troba a la memòria cau. Si és desactiva la càrrega del servidor és veure reduïda, però també és reduirà el nombre de línies de temps que és poden obtenir."
+ reactionsBufferingDescription: "Quan s'activa aquesta opció millora bastant el rendiment en recuperar les línies de temps reduint la càrrega de la base. Com a contrapunt, augmentarà l'ús de memòria de Redís. Desactiva aquesta opció en cas de tenir un servidor amb poca memòria o si tens problemes d'inestabilitat."
+ inquiryUrl: "URL de consulta "
+ inquiryUrlDescription: "Escriu adreça URL per al formulari de consulta per al mantenidor del servidor o una pàgina web amb el contacte d'informació."
+ 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."
_accountMigration:
moveFrom: "Migrar un altre compte a aquest"
moveFromSub: "Crear un àlies per un altre compte"
@@ -1651,6 +1763,7 @@ _role:
gtlAvailable: "Pot veure la línia de temps global"
ltlAvailable: "Pot veure la línia de temps local"
canPublicNote: "Pot enviar notes públiques"
+ mentionMax: "Nombre màxim de mencions a una nota"
canInvite: "Pot crear invitacions a la instància "
inviteLimit: "Límit d'invitacions "
inviteLimitCycle: "Temps de refresc de les invitacions"
@@ -1659,6 +1772,7 @@ _role:
canManageAvatarDecorations: "Gestiona les decoracions dels avatars "
driveCapacity: "Capacitat del disc"
alwaysMarkNsfw: "Marca sempre els fitxers com a sensibles"
+ canUpdateBioMedia: "Permet l'edició d'una icona o un bàner"
pinMax: "Nombre màxim de notes fixades"
antennaMax: "Nombre màxim d'antenes"
wordMuteMax: "Nombre màxim de caràcters permesos a les paraules silenciades"
@@ -1673,9 +1787,20 @@ _role:
canSearchNotes: "Pot cercar notes"
canUseTranslator: "Pot fer servir el traductor"
avatarDecorationLimit: "Nombre màxim de decoracions que es poden aplicar els avatars"
+ canImportAntennas: "Autoritza la importació d'antenes "
+ canImportBlocking: "Autoritza la importació de bloquejats"
+ canImportFollowing: "Autoritza la importació de seguidors"
+ canImportMuting: "Autoritza la importació de silenciats"
+ canImportUserLists: "Autoritza la importació de llistes d'usuaris "
_condition:
+ roleAssignedTo: "Assignat a rols manuals"
isLocal: "Usuari local"
isRemote: "Usuari remot"
+ isCat: "Usuaris gats"
+ isBot: "Usuaris bots"
+ isSuspended: "Usuari suspès"
+ isLocked: "Comptes privats"
+ isExplorable: "Fes que el compte aparegui a les cerques"
createdLessThan: "Han passat menys de X a passat des de la creació del compte"
createdMoreThan: "Han passat més de X des de la creació del compte"
followersLessThanOrEq: "Té menys de X seguidors"
@@ -1745,6 +1870,7 @@ _plugin:
installWarn: "Si us plau, no instal·lis afegits que no siguin de confiança."
manage: "Gestionar els afegits"
viewSource: "Veure l'origen "
+ viewLog: "Mostra el registre"
_preferencesBackups:
list: "Llista de còpies de seguretat"
saveNew: "Fer una còpia de seguretat nova"
@@ -1774,6 +1900,8 @@ _aboutMisskey:
contributors: "Col·laboradors principals"
allContributors: "Tots els col·laboradors "
source: "Codi font"
+ original: "Original"
+ thisIsModifiedVersion: "En {name} fa servir una versió modificada de Misskey."
translation: "Tradueix Misskey"
donate: "Fes un donatiu a Misskey"
morePatrons: "També agraïm el suport d'altres col·laboradors que no surten en aquesta llista. Gràcies! 🥰"
@@ -1881,7 +2009,6 @@ _theme:
buttonBg: "Fons botó "
buttonHoverBg: "Fons botó (en passar-hi per sobre)"
inputBorder: "Contorn del cap d'introducció "
- listItemHoverBg: "Fons dels elements d'una llista"
driveFolderBg: "Fons de la carpeta Disc"
wallpaperOverlay: "Superposició del fons de pantalla "
badge: "Insígnia "
@@ -1893,8 +2020,6 @@ _sfx:
note: "Notes"
noteMy: "Nota (per mi)"
notification: "Notificacions"
- antenna: "Antenes"
- channel: "Notificacions dels canals"
reaction: "Quan se selecciona una reacció "
_soundSettings:
driveFile: "Fer servir un fitxer d'àudio del disc"
@@ -1903,6 +2028,7 @@ _soundSettings:
driveFileTypeWarnDescription: "Seleccionar un fitxer d'àudio "
driveFileDurationWarn: "L'àudio és massa llarg"
driveFileDurationWarnDescription: "Els àudios molt llargs pot interrompre l'ús de Misskey. Vols continuar?"
+ driveFileError: "El so no es pot carregar. Canvia la configuració"
_ago:
future: "Futur "
justNow: "Ara mateix"
@@ -1955,6 +2081,7 @@ _2fa:
backupCodesDescription: "Si l'aplicació d'autenticació no es pot utilitzar, es pot accedir al compte utilitzant els següents codis de còpia de seguretat. Assegura't de mantenir aquests codis en un lloc segur. Cada codi es pot utilitzar només una vegada."
backupCodeUsedWarning: "Es va utilitzar un codi de còpia de seguretat. Si l'aplicació de certificació està disponible, reconfigura l'aplicació d'autenticació tan aviat com sigui possible."
backupCodesExhaustedWarning: "Es van utilitzar tots els codis de còpia de seguretat. Si no es pot utilitzar l'aplicació d'autenticació, ja no es pot accedir al compte. Torna a registrar l'aplicació d'autenticació."
+ moreDetailedGuideHere: "Aquí tens una guia al detall"
_permissions:
"read:account": "Veure la informació del compte."
"write:account": "Editar la informació del compte."
@@ -2028,22 +2155,76 @@ _permissions:
"read:admin:emoji": "Veure emojis"
"write:admin:queue": "Gestionar la cua de feines"
"read:admin:queue": "Veure la cua de feines"
+ "write:admin:promo": "Gestiona les notes promocionals"
+ "write:admin:drive": "Gestiona el disc de l'usuari"
+ "read:admin:drive": "Veure la informació del disc de l'usuari"
+ "read:admin:stream": "Fes servir l'API sobre Websocket per l'administració"
+ "write:admin:ad": "Gestiona la publicitat"
+ "read:admin:ad": "Veure anuncis"
+ "write:invite-codes": "Crear codis d'invitació"
+ "read:invite-codes": "Obtenir codis d'invitació"
+ "write:clip-favorite": "Gestionar els clips favorits"
+ "read:clip-favorite": "Veure clips favorits"
+ "read:federation": "Veure dades de federació"
+ "write:report-abuse": "Informar d'un abús"
+_auth:
+ shareAccessTitle: "Concedeix permisos a l'aplicació"
+ shareAccess: "Vols que {name} pugui accedir al vostre compte?"
+ shareAccessAsk: "Segur que vols que aquesta aplicació pugui accedir al vostre compte?"
+ permission: "{name} demana els següents permisos"
+ permissionAsk: "Aquesta aplicació demana els següents permisos"
+ pleaseGoBack: "Si us plau, torna a l'aplicació"
+ callback: "Tornant a l'aplicació"
+ accepted: "Accés garantit"
+ denied: "Accés denegat"
+ scopeUser: "Opera com si fossis aquest usuari"
+ pleaseLogin: "Si us plau, identificat per autoritzar l'aplicació."
+ byClickingYouWillBeRedirectedToThisUrl: "Si es garanteix l'accés, seràs redirigit automàticament a la següent adreça URL"
_antennaSources:
all: "Totes les publicacions"
homeTimeline: "Publicacions dels usuaris seguits"
users: "Publicacions d'usuaris específics"
userList: "Publicacions d'una llista d'usuaris"
+ userBlacklist: "Totes les notes excepte les d'un o alguns usuaris especificats"
+_weekday:
+ sunday: "Diumenge"
+ monday: "Dilluns"
+ tuesday: "Dimarts"
+ wednesday: "Dimecres"
+ thursday: "Dijous"
+ friday: "Divendres"
+ saturday: "Dissabte"
_widgets:
profile: "Perfil"
instanceInfo: "Informació del fitxer d'instal·lació"
+ memo: "Notes adhesives"
notifications: "Notificacions"
timeline: "Línia de temps"
+ calendar: "Calendari"
+ trends: "Tendència"
+ clock: "Rellotge"
+ rss: "Lector RSS"
+ rssTicker: "RSS ticker"
activity: "Activitat"
+ photos: "Fotografies"
+ digitalClock: "Rellotge digital"
+ unixClock: "Rellotge UNIX"
federation: "Federació"
+ instanceCloud: "Núvol d'instàncies"
+ postForm: "Formulari de publicació"
+ slideshow: "Presentació"
button: "Botó "
+ onlineUsers: "Usuaris actius"
jobQueue: "Cua de tasques"
+ serverMetric: "Mètriques del servidor"
+ aiscript: "Consola AiScript"
+ aiscriptApp: "Aplicació AiScript"
+ aichan: "Ai"
+ userList: "Llistat d'usuaris"
_userList:
chooseList: "Tria una llista"
+ clicker: "Clicker"
+ birthdayFollowings: "Usuaris que fan l'aniversari avui"
_cw:
hide: "Amagar"
show: "Carregar més"
@@ -2107,27 +2288,79 @@ _profile:
changeBanner: "Canviar el bàner "
verifiedLinkDescription: "Escrivint una adreça URL que enllaci a aquest perfil, una icona de propietat verificada es mostrarà al costat del camp."
avatarDecorationMax: "Pot afegir un màxim de {max} decoracions."
+ followedMessage: "Missatge als nous seguidors"
+ followedMessageDescription: "Es pot configurar un missatge curt que es mostra a l'altra persona quan comença a seguir-te."
+ followedMessageDescriptionForLockedAccount: "Si comencen a seguir-te es mostra un missatge de quan es permet aquesta sol·licitud. "
_exportOrImport:
allNotes: "Totes les publicacions"
+ favoritedNotes: "Notes preferides"
clips: "Retalls"
followingList: "Seguint"
muteList: "Silencia"
blockingList: "Bloqueja"
userLists: "Llistes"
+ excludeMutingUsers: "Exclou usuaris silenciats"
+ excludeInactiveUsers: "Exclou usuaris inactius"
+ withReplies: "Inclou a la línia de temps les respostes d'usuaris importats"
_charts:
federation: "Federació"
+ apRequest: "Peticions"
+ usersIncDec: "Diferència entre el nombre d'usuaris"
+ usersTotal: "Nombre total d'usuaris"
+ activeUsers: "Usuaris actius"
+ notesIncDec: "Diferència entre el nombre de notes"
+ localNotesIncDec: "Diferencia en el nombre de notes locals"
+ remoteNotesIncDec: "Diferencia en el nombre de notes remotes"
+ notesTotal: "Nombre total de notes"
+ filesIncDec: "Diferencia en el nombre de fitxers"
+ filesTotal: "Nombre total de fitxers"
+ storageUsageIncDec: "Diferencia en l'emmagatzematge usat"
+ storageUsageTotal: "Emmagatzematge usat"
+_instanceCharts:
+ requests: "Peticions"
+ users: "Diferència entre el nombre d'usuaris"
+ usersTotal: "Usuaris totals acumulats"
+ notes: "Diferència entre el nombre de notes"
+ notesTotal: "Notes totals acumulades"
+ ff: "Diferència en nombre d'usuaris seguits / seguidors"
+ ffTotal: "Nombre total acumulat d'usuaris seguits / seguidors"
+ cacheSize: "Diferència a la mida de la memòria cau"
+ cacheSizeTotal: "Total acumulat de la mida de la memòria cau"
+ files: "Diferència al nombre d'arxius"
+ filesTotal: "Nombre acumulatiu de fitxers"
_timelines:
home: "Inici"
local: "Local"
social: "Social"
global: "Global"
_play:
+ new: "Crear un guió"
+ edit: "Editar guió"
+ created: "Guió creat"
+ updated: "Guió editat"
+ deleted: "Guió esborrat"
+ pageSetting: "Configuració del guió"
+ editThisPage: "Edita aquest guió"
viewSource: "Veure l'origen "
+ my: "Els meus guions"
+ liked: "Guions que m'han agradat"
featured: "Popular"
title: "Títol "
script: "Script"
summary: "Descripció"
+ visibilityDescription: ""
_pages:
+ newPage: "pa"
+ editPage: "Editar la pàgina"
+ readPage: "Veure el codi font d'aquesta pàgina"
+ created: "La pàgina ha sigut creada correctament"
+ updated: "La pàgina s'ha editat correctament"
+ deleted: "La pàgina s'ha esborrat sense problemes"
+ pageSetting: "Configuració de la pàgina"
+ nameAlreadyExists: "L'adreça URL de la pàgina ja existeix"
+ invalidNameTitle: "L'adreça URL de la pàgina no és vàlida"
+ invalidNameText: "Assegurat que el títol de la pàgina no és buit"
+ editThisPage: "Editar la pàgina"
viewSource: "Veure l'origen "
viewPage: "Veure les teves pàgines "
like: "M'agrada "
@@ -2150,6 +2383,7 @@ _pages:
eyeCatchingImageSet: "Escull una miniatura"
eyeCatchingImageRemove: "Esborrar la miniatura"
chooseBlock: "Afegeix un bloc"
+ enterSectionTitle: "Escriu el títol de la secció"
selectType: "Seleccionar tipus"
contentBlocks: "Contingut"
inputBlocks: "Entrada "
@@ -2160,6 +2394,8 @@ _pages:
section: "Secció "
image: "Imatges"
button: "Botó "
+ dynamic: "Blocs dinàmics"
+ dynamicDescription: "Aquest bloc és antic. Ara en endavant fes servir {play}"
note: "Incorporar una Nota"
_note:
id: "ID de la publicació"
@@ -2189,29 +2425,55 @@ _notification:
sendTestNotification: "Enviar notificació de prova"
notificationWillBeDisplayedLikeThis: "Les notificacions és veure'n així "
reactedBySomeUsers: "Han reaccionat {n} usuaris"
+ likedBySomeUsers: "A {n} usuaris els hi agrada la teva nota"
renotedBySomeUsers: "L'han impulsat {n} usuaris"
+ followedBySomeUsers: "Et segueixen {n} usuaris"
+ flushNotification: "Netejar notificacions"
+ exportOfXCompleted: "Completada l'exportació de {x}"
+ login: "Algú ha iniciat sessió "
_types:
all: "Tots"
+ note: "Notes noves"
follow: "Seguint"
mention: "Menció"
+ reply: "Respostes"
renote: "Renotar"
quote: "Citar"
reaction: "Reaccions"
+ pollEnded: "Enquesta terminada"
+ receiveFollowRequest: "Rebuda una petició de seguiment"
+ followRequestAccepted: "Petició de seguiment acceptada"
+ roleAssigned: "Rol donat"
+ achievementEarned: "Assoliment desbloquejat"
+ exportCompleted: "Exportació completada"
+ login: "Iniciar sessió"
+ test: "Prova la notificació"
+ app: "Notificacions d'aplicacions"
_actions:
followBack: "t'ha seguit també"
reply: "Respondre"
renote: "Renotar"
_deck:
+ alwaysShowMainColumn: "Mostrar sempre la columna principal"
columnAlign: "Alinea les columnes"
addColumn: "Afig una columna"
+ newNoteNotificationSettings: "Configuració de notificacions per a notes noves"
+ configureColumn: "Configuració de columnes"
swapLeft: "Mou a l’esquerra"
swapRight: "Mou a la dreta"
swapUp: "Mou cap amunt"
swapDown: "Mou cap avall"
+ stackLeft: "Pila a la columna esquerra"
popRight: "Col·loca a la dreta"
profile: "Perfil"
newProfile: "Perfil nou"
deleteProfile: "Elimina el perfil"
+ introduction: "Crea la interfície perfecta posant les columnes allà on vulguis!"
+ introduction2: "Fes clic al botó + de la dreta per afegir noves columnes sempre que vulguis."
+ widgetsIntroduction: "Selecciona \"Editar ginys\" a la columna del menú i afegeix un."
+ useSimpleUiForNonRootPages: "Usa una interfície senzilla per a les pàgines navegades"
+ usedAsMinWidthWhenFlexible: "L'amplada mínima es farà servir quan \"Ajust automàtic de l'amplada\" estigui activat"
+ flexible: "Ajust automàtic de l'amplada"
_columns:
main: "Principal"
widgets: "Ginys"
@@ -2222,17 +2484,84 @@ _deck:
channel: "Canals"
mentions: "Mencions"
direct: "Publicacions directes"
+ roleTimeline: "Línia de temps dels rols"
+_dialog:
+ charactersExceeded: "Has arribat al màxim de caràcters! Actualment és {current} de {max}"
+ charactersBelow: "Ets per sota del mínim de caràcters! Actualment és {current} de {min}"
+_disabledTimeline:
+ title: "Línia de tems desactivada"
+ description: "No pots fer servir aquesta línia de temps amb els teus rols actuals."
+_drivecleaner:
+ orderBySizeDesc: "Mida del fitxer descendent"
+ orderByCreatedAtAsc: "Data ascendent"
_webhookSettings:
+ createWebhook: "Crear un Webhook"
+ modifyWebhook: "Modificar un Webhook"
name: "Nom"
+ secret: "Secret"
+ trigger: "Activador"
active: "Activat"
+ _events:
+ follow: "Quan se segueix a un usuari"
+ followed: "Quan et segueixen"
+ note: "Quan es publica una nota"
+ reply: "Quan es rep una resposta"
+ renote: "Quan es renoti"
+ reaction: "Quan es rep una reacció "
+ mention: "Quan et mencionen"
+ _systemEvents:
+ abuseReport: "Quan reps un nou informe de moderació "
+ abuseReportResolved: "Quan resols un informe de moderació "
+ userCreated: "Quan es crea un usuari"
+ inactiveModeratorsWarning: "Quan el compte d'un moderador no té activitat durant un temps"
+ inactiveModeratorsInvitationOnlyChanged: "Quan el compte d'un moderador no té activitat durant un temps, i el servidor es canvia a registre per invitacions"
+ deleteConfirm: "Segur que vols esborrar el webhook?"
+ testRemarks: "Si feu clic al botó a la dreta de l'interruptor, podeu enviar un webhook de prova amb dades dummy."
+_abuseReport:
+ _notificationRecipient:
+ createRecipient: "Afegeix un destinatari a l'informe de moderació "
+ modifyRecipient: "Editar un destinatari en l'informe de moderació "
+ recipientType: "Tipus de notificació "
+ _recipientType:
+ mail: "Correu electrònic"
+ webhook: "Webhook"
+ _captions:
+ mail: "Enviar un correu electrònic a tots els moderadors quan es rep un informe de moderació "
+ webhook: "Enviar una notificació al SystemWebhook quan es rebi o es resolgui un informe de moderació "
+ keywords: "Paraules clau"
+ notifiedUser: "Usuaris que s'han de notificar "
+ notifiedWebhook: "Webhook que s'ha de fer servir"
+ deleteConfirm: "Segur que vols esborrar el destinatari de l'informe de moderació?"
_moderationLogTypes:
+ createRole: "Rol creat"
+ deleteRole: "Rol esborrat"
+ updateRole: "Rol actualitzat"
+ assignRole: "Assignat al rol"
+ unassignRole: "Esborrat del rol"
suspend: "Suspèn"
+ unsuspend: "Suspensió treta"
+ addCustomEmoji: "Afegit emoji personalitzat"
+ updateCustomEmoji: "Actualitzat emoji personalitzat"
+ deleteCustomEmoji: "Esborrat emoji personalitzat"
+ updateServerSettings: "Configuració del servidor actualitzada"
+ updateUserNote: "Nota de moderació actualitzada"
+ deleteDriveFile: "Fitxer esborrat"
+ deleteNote: "Nota esborrada"
+ createGlobalAnnouncement: "Anunci global creat"
+ createUserAnnouncement: "Anunci individual creat"
+ updateGlobalAnnouncement: "Anunci global actualitzat"
+ updateUserAnnouncement: "Anunci individual actualitzat "
+ deleteGlobalAnnouncement: "Anunci global esborrat"
+ deleteUserAnnouncement: "Anunci individual esborrat "
resetPassword: "Restableix la contrasenya"
suspendRemoteInstance: "Servidor remot suspès "
unsuspendRemoteInstance: "S'ha tret la suspensió del servidor remot"
+ updateRemoteInstanceNote: "Nota de moderació de la instància remota actualitzada"
markSensitiveDriveFile: "Fitxer marcat com a sensible"
unmarkSensitiveDriveFile: "S'ha tret la marca de sensible del fitxer"
resolveAbuseReport: "Informe resolt"
+ forwardAbuseReport: "Informe reenviat"
+ updateAbuseReportNote: "Nota de moderació d'un informe actualitzat"
createInvitation: "Crear codi d'invitació "
createAd: "Anunci creat"
deleteAd: "Anunci esborrat"
@@ -2242,6 +2571,16 @@ _moderationLogTypes:
deleteAvatarDecoration: "S'ha esborrat la decoració de l'avatar "
unsetUserAvatar: "Esborrar l'avatar d'aquest usuari"
unsetUserBanner: "Esborrar el bàner d'aquest usuari"
+ createSystemWebhook: "Crear un SystemWebhook"
+ updateSystemWebhook: "Actualitzar SystemWebhook"
+ deleteSystemWebhook: "Esborrar SystemWebhook"
+ createAbuseReportNotificationRecipient: "Crear un destinatari per l'informe de moderació "
+ updateAbuseReportNotificationRecipient: "Actualitzar destinatari per l'informe de moderació "
+ deleteAbuseReportNotificationRecipient: "Esborrar destinatari de l'informe de moderació "
+ deleteAccount: "Esborrar el compte "
+ deletePage: "Esborrar la pàgina"
+ deleteFlash: "Esborrar el guió"
+ deleteGalleryPost: "Esborrar la publicació de la galeria"
_fileViewer:
title: "Detall del fitxer"
type: "Tipus de fitxer"
@@ -2268,5 +2607,133 @@ _externalResourceInstaller:
_errors:
_invalidParams:
title: "Paràmetres no vàlids "
+ description: "No hi ha suficient informació per carregar les dades del lloc extern. Confirma l'URL que hi ha escrita."
+ _resourceTypeNotSupported:
+ title: "El recurs extern no està suportat."
+ description: "Aquesta mena de recurs no està suportat. Contacta amb l'administrador."
+ _failedToFetch:
+ title: "Ha fallat l'obtenció de dades"
+ fetchErrorDescription: "Ha aparegut un error comunicant-se amb el lloc extern. Si després d'intentar-ho un altre cop no es resol, contacta amb l'administrador."
+ parseErrorDescription: "Ha aparegut un error processant les dades carregades del lloc extern. Contacta amb l'administrador."
+ _hashUnmatched:
+ title: "Ha fallat la verificació de les dades"
+ description: "Ha aparegut un error verificant les dades obtingudes. Com a mesura de seguretat la instal·lació no pot continuar. Contacta amb l'administrador."
+ _pluginParseFailed:
+ title: "Error d'AiScript"
+ description: "Les dades sol·licitades s'han obtingut correctament, però hem trobat un error durant el processament d'AiScript. Contacta amb l'autor de l'afegit. Detalls de l'error es pot veure a la consola JavaScript."
+ _pluginInstallFailed:
+ title: "La instal·lació de l'afegit a fallat"
+ description: "Ha aparegut un error durant la instal·lació de l'afegit. Intenta-ho una altra vegada. El detall de l'error es pot veure a la consola JavaScript."
+ _themeParseFailed:
+ title: "Ha fallat el processament del tema"
+ description: "Les dades sol·licitades s'han obtingut correctament, però hem trobat un error durant el processament del tema. Contacta amb l'autor de l'afegit. Detalls de l'error es pot veure a la consola JavaScript."
+ _themeInstallFailed:
+ title: "La instal·lació del tema a fallat"
+ description: "Ha aparegut un error durant la instal·lació del tema. Intenta-ho una altra vegada. El detall de l'error es pot veure a la consola JavaScript."
+_dataSaver:
+ _media:
+ title: "Carregant multimèdia "
+ description: "Desactiva la càrrega automàtica d'imatges i vídeos. Les imatges i els vídeos amagats es carregaran quan es faci clic a sobre."
+ _avatar:
+ 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."
+ _urlPreview:
+ title: "Miniatures vista prèvia de l'URL"
+ description: "Les imatges en miniatura que serveixen com a vista prèvia de les URLs no es tornaran a carregar."
+ _code:
+ 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ó."
+_hemisphere:
+ N: "Hemisferi Nord "
+ S: "Hemisferi Sud"
+ caption: "El fan servir alguns clients per determinar l'estació de l'any."
_reversi:
+ reversi: "Reversi"
+ gameSettings: "Opcions del joc"
+ chooseBoard: "Escull un taulell"
+ blackOrWhite: "Negres/Blanques"
+ blackIs: "{name} juga amb negres "
+ rules: "Regles"
+ thisGameIsStartedSoon: "El joc començarà en breu"
+ waitingForOther: "Esperant la tirada de l'oponent "
+ waitingForMe: "Esperant el teu torn"
+ waitingBoth: "Prepara't "
+ ready: "Preparat "
+ cancelReady: " No preparat "
+ opponentTurn: "Torn de l'oponent "
+ myTurn: "El teu torn"
+ turnOf: "Li toca a {name}"
+ pastTurnOf: "Torn de {name}"
+ surrender: "Rendeix-te"
+ surrendered: "T'has rendit"
+ timeout: "Temps esgotat"
+ drawn: "Empat"
+ won: "{name} ha guanyat"
+ black: "Negres"
+ white: "Blanques"
total: "Total"
+ turnCount: "Torn {count}"
+ myGames: "Jugades"
+ allGames: "Totes les jugades"
+ ended: "Acabat"
+ playing: "Jugant"
+ isLlotheo: "Qui tingui menys pedres guanya (Llotheo)"
+ loopedMap: "Mapa de recursiu"
+ canPutEverywhere: "Les fitxes es poden posar a qualsevol lloc"
+ timeLimitForEachTurn: "Temps límit per jugada"
+ freeMatch: "Partida lliure"
+ lookingForPlayer: "Buscant contrincant..."
+ gameCanceled: "La partida s'ha cancel·lat "
+ shareToTlTheGameWhenStart: "Compartir la partida a la línia de temps quan comenci"
+ iStartedAGame: "La partida ha començat! #MisskeyReversi"
+ opponentHasSettingsChanged: "L'oponent h canviat la seva configuració "
+ allowIrregularRules: "Regles irregulars (totalment lliure)"
+ disallowIrregularRules: "Sense regles irregulars"
+ showBoardLabels: "Mostrar el número de línia i columna al tauler de joc"
+ useAvatarAsStone: "Fer servir els avatars dels usuaris com a fitxes"
+_offlineScreen:
+ title: "Fora de línia - No es pot connectar amb el servidor"
+ header: "Impossible connectar amb el servidor"
+_urlPreviewSetting:
+ title: "Configuració per a la previsualització de l'URL"
+ enable: "Activa la previsualització de l'URL"
+ timeout: "Temps màxim per carregar la previsualització de l'URL (ms)"
+ timeoutDescription: "Si l'obtenció de la previsualització triga més que el temps establert, no es generarà la vista prèvia."
+ maximumContentLength: "Longitud màxima del contingut (bytes)"
+ maximumContentLengthDescription: "Si la màxima longitud és més gran que aquest valor, la previsualització no es generarà."
+ requireContentLength: "Generar la previsualització només si es pot obtenir la longitud màxima "
+ requireContentLengthDescription: "Si l'altre servidor no proporciona la longitud màxima, la previsualització no es generarà."
+ userAgent: "User-Agent"
+ userAgentDescription: "Estableix l'User-Agent que és farà servir per a la recuperació de la vista prèvia. Si és deixa en blanc es farà servir l'User-Agent per defecte."
+ summaryProxy: "Proxy endpoints per generar vistes prèvies"
+ summaryProxyDescription: "La vista prèvia es genera fent servir Summaly proxy, no la genera el mateix Misskey."
+ summaryProxyDescription2: "Els següents paràmetres són passats al proxy com cadenes de consulta. Si el proxy no els admet, s'ignoren els valors configurats."
+_mediaControls:
+ pip: "Imatge sobre impressionada "
+ playbackRate: "Velocitat de reproducció "
+ loop: "Reproducció en bucle"
+_contextMenu:
+ title: "Menú contextual"
+ app: "Aplicació "
+ appWithShift: "Aplicació amb la tecla shift"
+ native: "Interfície del navegador"
+_embedCodeGen:
+ title: "Personalitza el codi per incrustar"
+ header: "Mostrar la capçalera"
+ autoload: "Carregar automàticament (no recomanat)"
+ maxHeight: "Alçada màxima"
+ maxHeightDescription: "0 anul·la la configuració màxima. Per evitar que continuï creixent verticalment, especifiqui qualsevol valor."
+ maxHeightWarn: "El límit màxim d'alçada és nul (0). Si això no és un canvi previst, estableix el màxim d'alçada a un cert valor."
+ previewIsNotActual: "La visualització és diferent de la que es mostra quan s'implanta."
+ rounded: "Angle recte"
+ border: "Afegeix un marc al contenidor"
+ applyToPreview: "Aplica a la vista prèvia"
+ generateCode: "Crea el codi per incrustar"
+ codeGenerated: "Codi generat"
+ codeGeneratedDescription: "Si us plau, enganxeu el codi generat al lloc web."
+_selfXssPrevention:
+ warning: "Advertència "
+ title: "\"Enganxa qualsevol cosa en aquesta finestra\" És tot un engany."
+ description1: "Si posa alguna cosa al seu compte, un usuari malintencionat podria segrestar-la o robar-li les dades."
+ description2: "Si no entens que estàs fent %cpara ara mateix i tanca la finestra."
+ description3: "Per obtenir més informació. {link}"
diff --git a/locales/cs-CZ.yml b/locales/cs-CZ.yml
index c8a0b0cb28..caf6d6e163 100644
--- a/locales/cs-CZ.yml
+++ b/locales/cs-CZ.yml
@@ -471,7 +471,6 @@ uiLanguage: "Jazyk uživatelského rozhraní"
aboutX: "O {x}"
emojiStyle: "Styl emoji"
native: "Výchozí"
-disableDrawer: "Nepoužívat šuplíkové menu"
showNoteActionsOnlyHover: "Zobrazit akce poznámky jenom při naběhnutí myši"
noHistory: "Žádná historie"
signinHistory: "Historie přihlášení"
@@ -658,10 +657,7 @@ abuseReported: "Nahlášení bylo odesláno. Děkujeme převelice."
reporter: "Nahlásil"
reporteeOrigin: "Původ nahlášení"
reporterOrigin: "Původ nahlasovače"
-forwardReport: "Přeposlat nahlášení do vzdálené instance"
-forwardReportIsAnonymous: "Místo vašeho účtu se ve vzdálené instanci zobrazí anonymní systémový účet jako nahlašovač."
send: "Odeslat"
-abuseMarkAsResolved: "Označit nahlášení jako vyřešené"
openInNewTab: "Otevřít v nové kartě"
openInSideView: "Otevřít v bočním panelu"
defaultNavigationBehaviour: "Výchozí chování navigace"
@@ -1633,7 +1629,6 @@ _theme:
buttonBg: "Pozadí tlačítka"
buttonHoverBg: "Pozadí tlačítka (Hover)"
inputBorder: "Ohraničení vstupního pole"
- listItemHoverBg: "Pozadí položky seznamu (Hover)"
driveFolderBg: "Pozadí složky disku"
wallpaperOverlay: "Překrytí tapety"
badge: "Odznak"
@@ -1645,8 +1640,6 @@ _sfx:
note: "Poznámky"
noteMy: "Moje poznámka"
notification: "Oznámení"
- antenna: "Antény"
- channel: "Oznámení kanálu"
_ago:
future: "Budoucí"
justNow: "Teď"
@@ -1965,6 +1958,7 @@ _notification:
receiveFollowRequest: "Obdržené žádosti o sledování"
followRequestAccepted: "Přijaté žádosti o sledování"
achievementEarned: "Úspěch odemčen"
+ login: "Přihlásit se"
app: "Oznámení z propojených aplikací"
_actions:
followBack: "vás začal sledovat zpět"
@@ -2012,7 +2006,6 @@ _webhookSettings:
createWebhook: "Vytvořit Webhook"
name: "Jméno"
secret: "Tajné"
- events: "Události Webhook"
active: "Zapnuto"
_events:
follow: "Při sledování uživatele"
@@ -2022,6 +2015,10 @@ _webhookSettings:
renote: "Při renotaci poznámky"
reaction: "Při obdržení reakce"
mention: "Při zmínce"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "Email"
_moderationLogTypes:
suspend: "Zmrazit"
resetPassword: "Resetovat heslo"
diff --git a/locales/de-DE.yml b/locales/de-DE.yml
index 9e42e01252..4e2bd06934 100644
--- a/locales/de-DE.yml
+++ b/locales/de-DE.yml
@@ -491,7 +491,6 @@ uiLanguage: "Sprache der Benutzeroberfläche"
aboutX: "Über {x}"
emojiStyle: "Emoji-Stil"
native: "Nativ"
-disableDrawer: "Keine ausfahrbaren Menüs verwenden"
showNoteActionsOnlyHover: "Notizmenü nur bei Mouseover anzeigen"
noHistory: "Kein Verlauf gefunden"
signinHistory: "Anmeldungsverlauf"
@@ -687,10 +686,7 @@ abuseReported: "Deine Meldung wurde versendet. Vielen Dank."
reporter: "Melder"
reporteeOrigin: "Herkunft des Gemeldeten"
reporterOrigin: "Herkunft des Meldenden"
-forwardReport: "Meldung an fremde Instanz weiterleiten"
-forwardReportIsAnonymous: "Anstatt deines Benutzerkontos wird bei der fremden Instanz ein anonymes Systemkonto als Melder angezeigt."
send: "Senden"
-abuseMarkAsResolved: "Meldung als gelöst markieren"
openInNewTab: "In neuem Tab öffnen"
openInSideView: "In Seitenansicht öffnen"
defaultNavigationBehaviour: "Standardnavigationsverhalten"
@@ -1788,7 +1784,6 @@ _theme:
buttonBg: "Hintergrund von Schaltflächen"
buttonHoverBg: "Hintergrund von Schaltflächen (Mouseover)"
inputBorder: "Rahmen von Eingabefeldern"
- listItemHoverBg: "Hintergrund von Listeneinträgen (Mouseover)"
driveFolderBg: "Hintergrund von Drive-Ordnern"
wallpaperOverlay: "Hintergrundbild-Overlay"
badge: "Wappen"
@@ -1800,8 +1795,6 @@ _sfx:
note: "Notizen"
noteMy: "Meine Notizen"
notification: "Benachrichtigungen"
- antenna: "Antennen"
- channel: "Kanalbenachrichtigung"
_ago:
future: "Zukunft"
justNow: "Gerade eben"
@@ -2144,6 +2137,7 @@ _notification:
receiveFollowRequest: "Erhaltene Follow-Anfragen"
followRequestAccepted: "Akzeptierte Follow-Anfragen"
achievementEarned: "Errungenschaft freigeschaltet"
+ login: "Anmelden"
app: "Benachrichtigungen von Apps"
_actions:
followBack: "folgt dir nun auch"
@@ -2193,7 +2187,6 @@ _webhookSettings:
createWebhook: "Webhook erstellen"
name: "Name"
secret: "Secret"
- events: "Webhook-Ereignisse"
active: "Aktiviert"
_events:
follow: "Wenn du jemandem folgst"
@@ -2203,6 +2196,10 @@ _webhookSettings:
renote: "Wenn du ein Renote erhältst"
reaction: "Wenn du eine Reaktion erhältst"
mention: "Wenn du erwähnt wirst"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "Email"
_moderationLogTypes:
createRole: "Rolle erstellt"
deleteRole: "Rolle gelöscht"
diff --git a/locales/el-GR.yml b/locales/el-GR.yml
index 2098c7ef50..4657842ca5 100644
--- a/locales/el-GR.yml
+++ b/locales/el-GR.yml
@@ -301,8 +301,6 @@ _theme:
_sfx:
note: "Σημειώματα"
notification: "Ειδοποιήσεις"
- antenna: "Αντένες"
- channel: "Ειδοποιήσεις καναλιών"
_ago:
future: "Μελλοντικό"
justNow: "Μόλις τώρα"
@@ -380,6 +378,7 @@ _notification:
renote: "Κοινοποίηση σημειώματος"
quote: "Παράθεση"
reaction: "Αντιδράσεις"
+ login: "Σύνδεση"
_actions:
reply: "Απάντηση"
renote: "Κοινοποίηση σημειώματος"
diff --git a/locales/en-US.yml b/locales/en-US.yml
index c20a1ac7d8..8570addfa2 100644
--- a/locales/en-US.yml
+++ b/locales/en-US.yml
@@ -8,6 +8,9 @@ search: "Search"
notifications: "Notifications"
username: "Username"
password: "Password"
+initialPasswordForSetup: "Initial password for setup"
+initialPasswordIsIncorrect: "Initial password for setup is incorrect"
+initialPasswordForSetupDescription: "Use the password you entered in the configuration file if you installed Misskey yourself.\n If you are using a Misskey hosting service, use the password provided.\n If you have not set a password, leave it blank to continue."
forgotPassword: "Forgot password"
fetchingAsApObject: "Fetching from the Fediverse..."
ok: "OK"
@@ -60,6 +63,7 @@ copyFileId: "Copy file ID"
copyFolderId: "Copy folder ID"
copyProfileUrl: "Copy profile URL"
searchUser: "Search for a user"
+searchThisUsersNotes: "Search this user’s notes"
reply: "Reply"
loadMore: "Load more"
showMore: "Show more"
@@ -108,7 +112,7 @@ enterEmoji: "Enter an emoji"
renote: "Renote"
unrenote: "Remove renote"
renoted: "Renoted."
-renotedToX: "Renote from {name} users。"
+renotedToX: "Renoted to {name}."
cantRenote: "This post can't be renoted."
cantReRenote: "A renote can't be renoted."
quote: "Quote"
@@ -125,8 +129,8 @@ add: "Add"
reaction: "Reactions"
reactions: "Reactions"
emojiPicker: "Emoji picker"
-pinnedEmojisForReactionSettingDescription: "Set the emojis which should be pinned and displayed immediately when reacting."
-pinnedEmojisSettingDescription: "Set the emojis to be pinned and displayed when viewing emoji picker"
+pinnedEmojisForReactionSettingDescription: "Set the emojis to be pinned and displayed when reacting."
+pinnedEmojisSettingDescription: "Set the emojis to be pinned and displayed when viewing emoji picker."
emojiPickerDisplay: "Emoji picker display"
overwriteFromPinnedEmojisForReaction: "Override from reaction settings"
overwriteFromPinnedEmojis: "Override from general settings"
@@ -154,6 +158,7 @@ editList: "Edit list"
selectChannel: "Select a channel"
selectAntenna: "Select an antenna"
editAntenna: "Edit antenna"
+createAntenna: "Create an antenna"
selectWidget: "Select a widget"
editWidgets: "Edit widgets"
editWidgetsExit: "Done"
@@ -165,7 +170,7 @@ emojiUrl: "Emoji URL"
addEmoji: "Add an emoji"
settingGuide: "Recommended settings"
cacheRemoteFiles: "Cache remote files"
-cacheRemoteFilesDescription: "When this setting is disabled, remote files are loaded directly from the remote instance. Disabling this will decrease storage usage, but increase traffic, as thumbnails will not be generated."
+cacheRemoteFilesDescription: "When this setting is disabled, remote files are loaded directly from the remote servers. Disabling this will decrease storage usage, but increase traffic, as thumbnails will not be generated."
youCanCleanRemoteFilesCache: "You can clear the cache by clicking the 🗑️ button in the file management view."
cacheRemoteSensitiveFiles: "Cache sensitive remote files"
cacheRemoteSensitiveFilesDescription: "When this setting is disabled, sensitive remote files are loaded directly from the remote instance without caching."
@@ -180,6 +185,10 @@ addAccount: "Add account"
reloadAccountsList: "Reload account list"
loginFailed: "Failed to sign in"
showOnRemote: "View on remote instance"
+continueOnRemote: "Continue on a remote server"
+chooseServerOnMisskeyHub: "Choose a server from the Misskey Hub"
+specifyServerHost: "Specify a server host directly"
+inputHostName: "Enter the domain"
general: "General"
wallpaper: "Wallpaper"
setWallpaper: "Set wallpaper"
@@ -190,6 +199,7 @@ followConfirm: "Are you sure that you want to follow {name}?"
proxyAccount: "Proxy account"
proxyAccountDescription: "A proxy account is an account that acts as a remote follower for users under certain conditions. For example, when a user adds a remote user to the list, the remote user's activity will not be delivered to the instance if no local user is following that user, so the proxy account will follow instead."
host: "Host"
+selectSelf: "Select myself"
selectUser: "Select a user"
recipient: "Recipient"
annotation: "Comments"
@@ -205,6 +215,7 @@ perDay: "Per Day"
stopActivityDelivery: "Stop sending activities"
blockThisInstance: "Block this instance"
silenceThisInstance: "Silence this instance"
+mediaSilenceThisInstance: "Media-silence this server"
operations: "Operations"
software: "Software"
version: "Version"
@@ -225,7 +236,11 @@ clearCachedFilesConfirm: "Are you sure that you want to delete all cached remote
blockedInstances: "Blocked Instances"
blockedInstancesDescription: "List the hostnames of the instances you want to block separated by linebreaks. Listed instances will no longer be able to communicate with this instance."
silencedInstances: "Silenced instances"
-silencedInstancesDescription: "List the hostnames of the instances that you want to silence. All accounts of the listed instances will be treated as silenced, can only make follow requests, and cannot mention local accounts if not followed. This will not affect blocked instances."
+silencedInstancesDescription: "List the host names of the servers that you want to silence, separated by a new line. All accounts belonging to the listed servers will be treated as silenced, and can only make follow requests, and cannot mention local accounts if not followed. This will not affect the blocked servers."
+mediaSilencedInstances: "Media-silenced servers"
+mediaSilencedInstancesDescription: "List the host names of the servers that you want to media-silence, separated by a new line. All accounts belonging to the listed servers will be treated as sensitive, and can't use custom emojis. This will not affect the blocked servers."
+federationAllowedHosts: "Federation allowed servers"
+federationAllowedHostsDescription: "Specify the hostnames of the servers you want to allow federation separated by line breaks."
muteAndBlock: "Mutes and Blocks"
mutedUsers: "Muted users"
blockedUsers: "Blocked users"
@@ -323,6 +338,7 @@ renameFolder: "Rename this folder"
deleteFolder: "Delete this folder"
folder: "Folder"
addFile: "Add a file"
+showFile: "Show files"
emptyDrive: "Your Drive is empty"
emptyFolder: "This folder is empty"
unableToDelete: "Unable to delete"
@@ -387,7 +403,7 @@ mcaptcha: "mCaptcha"
enableMcaptcha: "Enable mCaptcha"
mcaptchaSiteKey: "Site key"
mcaptchaSecretKey: "Secret key"
-mcaptchaInstanceUrl: "mCaptcha instance URL"
+mcaptchaInstanceUrl: "mCaptcha server URL"
recaptcha: "reCAPTCHA"
enableRecaptcha: "Enable reCAPTCHA"
recaptchaSiteKey: "Site key"
@@ -437,6 +453,7 @@ totpDescription: "Use an authenticator app to enter one-time passwords"
moderator: "Moderator"
moderation: "Moderation"
moderationNote: "Moderation note"
+moderationNoteDescription: "You can fill in notes that will be shared only among moderators."
addModerationNote: "Add moderation note"
moderationLogs: "Moderation logs"
nUsersMentioned: "Mentioned by {n} users"
@@ -476,6 +493,7 @@ noMessagesYet: "No messages yet"
newMessageExists: "There are new messages"
onlyOneFileCanBeAttached: "You can only attach one file to a message"
signinRequired: "Please register or sign in before continuing"
+signinOrContinueOnRemote: "To continue, you need to move your server or sign up / log in to this server."
invitations: "Invites"
invitationCode: "Invitation code"
checking: "Checking..."
@@ -497,7 +515,10 @@ uiLanguage: "User interface language"
aboutX: "About {x}"
emojiStyle: "Emoji style"
native: "Native"
-disableDrawer: "Don't use drawer-style menus"
+menuStyle: "Menu style"
+style: "Style"
+drawer: "Drawer"
+popup: "Pop up"
showNoteActionsOnlyHover: "Only show note actions on hover"
showReactionsCount: "See the number of reactions in notes"
noHistory: "No history available"
@@ -580,6 +601,8 @@ ascendingOrder: "Ascending"
descendingOrder: "Descending"
scratchpad: "Scratchpad"
scratchpadDescription: "The Scratchpad provides an environment for AiScript experiments. You can write, execute, and check the results of it interacting with Misskey in it."
+uiInspector: "UI inspector"
+uiInspectorDescription: "You can see the UI component server list on memory. UI component will be generated by Ui:C: function."
output: "Output"
script: "Script"
disablePagesScript: "Disable AiScript on Pages"
@@ -696,10 +719,7 @@ abuseReported: "Your report has been sent. Thank you very much."
reporter: "Reporter"
reporteeOrigin: "Reportee Origin"
reporterOrigin: "Reporter Origin"
-forwardReport: "Forward report to remote instance"
-forwardReportIsAnonymous: "Instead of your account, an anonymous system account will be displayed as reporter at the remote instance."
send: "Send"
-abuseMarkAsResolved: "Mark report as resolved"
openInNewTab: "Open in new tab"
openInSideView: "Open in side view"
defaultNavigationBehaviour: "Default navigation behavior"
@@ -836,6 +856,7 @@ administration: "Management"
accounts: "Accounts"
switch: "Switch"
noMaintainerInformationWarning: "Maintainer information is not configured."
+noInquiryUrlWarning: "Inquiry URL isn’t set"
noBotProtectionWarning: "Bot protection is not configured."
configure: "Configure"
postToGallery: "Create new gallery post"
@@ -900,6 +921,7 @@ followersVisibility: "Visibility of followers"
continueThread: "View thread continuation"
deleteAccountConfirm: "This will irreversibly delete your account. Proceed?"
incorrectPassword: "Incorrect password."
+incorrectTotp: "The one-time password is incorrect or has expired."
voteConfirm: "Confirm your vote for \"{choice}\"?"
hide: "Hide"
useDrawerReactionPickerForMobile: "Display reaction picker as drawer on mobile"
@@ -924,6 +946,9 @@ oneHour: "One hour"
oneDay: "One day"
oneWeek: "One week"
oneMonth: "One month"
+threeMonths: "3 months"
+oneYear: "1 year"
+threeDays: "3 days"
reflectMayTakeTime: "It may take some time for this to be reflected."
failedToFetchAccountInformation: "Could not fetch account information"
rateLimitExceeded: "Rate limit exceeded"
@@ -1025,6 +1050,7 @@ thisPostMayBeAnnoyingHome: "Post to home timeline"
thisPostMayBeAnnoyingCancel: "Cancel"
thisPostMayBeAnnoyingIgnore: "Post anyway"
collapseRenotes: "Collapse renotes you've already seen"
+collapseRenotesDescription: "Collapse notes that you've reacted to or renoted before."
internalServerError: "Internal Server Error"
internalServerErrorDescription: "The server has run into an unexpected error."
copyErrorInfo: "Copy error details"
@@ -1063,9 +1089,10 @@ retryAllQueuesConfirmTitle: "Really retry all?"
retryAllQueuesConfirmText: "This will temporarily increase the server load."
enableChartsForRemoteUser: "Generate remote user data charts"
enableChartsForFederatedInstances: "Generate remote instance data charts"
+enableStatsForFederatedInstances: "Receive remote server stats"
showClipButtonInNoteFooter: "Add \"Clip\" to note action menu"
reactionsDisplaySize: "Reaction display size"
-limitWidthOfReaction: "Limits the maximum width of reactions and display them in reduced size."
+limitWidthOfReaction: "Limit the maximum width of reactions and display them in reduced size."
noteIdOrUrl: "Note ID or URL"
video: "Video"
videos: "Videos"
@@ -1098,6 +1125,8 @@ preservedUsernames: "Reserved usernames"
preservedUsernamesDescription: "List usernames to reserve separated by linebreaks. These will become unable during normal account creation, but can be used by administrators to manually create accounts. Already existing accounts using these usernames will not be affected."
createNoteFromTheFile: "Compose note from this file"
archive: "Archive"
+archived: "Archived"
+unarchive: "Unarchive"
channelArchiveConfirmTitle: "Really archive {name}?"
channelArchiveConfirmDescription: "An archived channel won't appear in the channel list or search results anymore. New posts can also not be added to it anymore."
thisChannelArchived: "This channel has been archived."
@@ -1108,6 +1137,9 @@ preventAiLearning: "Reject usage in Machine Learning (Generative AI)"
preventAiLearningDescription: "Requests crawlers to not use posted text or image material etc. in machine learning (Predictive / Generative AI) data sets. This is achieved by adding a \"noai\" HTML-Response flag to the respective content. A complete prevention can however not be achieved through this flag, as it may simply be ignored."
options: "Options"
specifyUser: "Specific user"
+lookupConfirm: "Do you want to look up?"
+openTagPageConfirm: "Do you want to open a hashtag page?"
+specifyHost: "Specific host"
failedToPreviewUrl: "Could not preview"
update: "Update"
rolesThatCanBeUsedThisEmojiAsReaction: "Roles that can use this emoji as reaction"
@@ -1236,9 +1268,55 @@ launchApp: "Launch the app"
useNativeUIForVideoAudioPlayer: "Use UI of browser when play video and audio"
keepOriginalFilename: "Keep original file name"
keepOriginalFilenameDescription: "If you turn off this setting, files names will be replaced with random string automatically when you upload files."
-noDescription: "There is not the explanation"
+noDescription: "There is no explanation"
alwaysConfirmFollow: "Always confirm when following"
inquiry: "Contact"
+tryAgain: "Please try again later"
+confirmWhenRevealingSensitiveMedia: "Confirm when revealing sensitive media"
+sensitiveMediaRevealConfirm: "This might be a sensitive media. Are you sure to reveal?"
+createdLists: "Created lists"
+createdAntennas: "Created antennas"
+fromX: "From {x}"
+genEmbedCode: "Generate embed code"
+noteOfThisUser: "Notes by this user"
+clipNoteLimitExceeded: "No more notes can be added to this clip."
+performance: "Performance"
+modified: "Modified"
+discard: "Discard"
+thereAreNChanges: "There are {n} change(s)"
+signinWithPasskey: "Sign in with Passkey"
+unknownWebAuthnKey: "Unknown Passkey"
+passkeyVerificationFailed: "Passkey verification has failed."
+passkeyVerificationSucceededButPasswordlessLoginDisabled: "Passkey verification has succeeded but password-less login is disabled."
+messageToFollower: "Message to followers"
+target: "Target"
+testCaptchaWarning: "This function is intended for CAPTCHA testing purposes.\nDo not use in a production environment."
+prohibitedWordsForNameOfUser: "Prohibited words for user names"
+prohibitedWordsForNameOfUserDescription: "If any of the strings in this list are included in the user's name, the name will be denied. Users with moderator privileges are not affected by this restriction."
+yourNameContainsProhibitedWords: "Your name contains prohibited words"
+yourNameContainsProhibitedWordsDescription: "If you wish to use this name, please contact your server administrator."
+thisContentsAreMarkedAsSigninRequiredByAuthor: "Set by the author to require login to view"
+lockdown: "Lockdown"
+pleaseSelectAccount: "Select an account"
+_accountSettings:
+ requireSigninToViewContents: "Require sign-in to view contents"
+ requireSigninToViewContentsDescription1: "Require login to view all notes and other content you have created. This will have the effect of preventing crawlers from collecting your information."
+ requireSigninToViewContentsDescription2: "Content will not be displayed in URL previews (OGP), embedded in web pages, or on servers that don't support note quotes."
+ requireSigninToViewContentsDescription3: "These restrictions may not apply to federated content from other remote servers."
+ makeNotesFollowersOnlyBefore: "Make past notes to be displayed only to followers"
+ makeNotesFollowersOnlyBeforeDescription: "While this feature is enabled, only followers can see notes past the set date and time or have been visible for a set time. When it is deactivated, the note publication status will also be restored."
+ makeNotesHiddenBefore: "Make past notes private"
+ makeNotesHiddenBeforeDescription: "While this feature is enabled, notes that are past the set date and time or have been visible only to you. When it is deactivated, the note publication status will also be restored."
+ mayNotEffectForFederatedNotes: "Notes federated to a remote server may not be effective."
+ notesHavePassedSpecifiedPeriod: "Note that the specified time has passed"
+ notesOlderThanSpecifiedDateAndTime: "Notes before the specified date and time"
+_abuseUserReport:
+ forward: "Forward"
+ forwardDescription: "Forward the report to a remote server as an anonymous system account."
+ resolve: "Resolve"
+ accept: "Accept"
+ reject: "Reject"
+ resolveTutorial: "If the report is legitimate in content, select \"Accept\" to mark the case as resolved in the affirmative.\nIf the content of the report is not legitimate, select \"Reject\" to mark the case as resolved in the negative."
_delivery:
status: "Delivery status"
stop: "Suspended"
@@ -1341,7 +1419,7 @@ _initialTutorial:
_exampleNote:
cw: "This will surely make you hungry!"
note: "Just had a chocolate-glazed donut 🍩😋"
- useCases: "This is used when following the server guidelines for necessary notes or for self-restriction of spoiler or sensitive text."
+ useCases: "This is used when following the server guidelines, for necessary notes, or for self-restriction of spoiler or sensitive text."
_howToMakeAttachmentsSensitive:
title: "How to Mark Attachments as Sensitive?"
description: "For attachments that are required by server guidelines or that should not be left intact, add a \"sensitive\" flag."
@@ -1373,6 +1451,10 @@ _serverSettings:
fanoutTimelineDescription: "Greatly increases performance of timeline retrieval and reduces load on the database when enabled. In exchange, memory usage of Redis will increase. Consider disabling this in case of low server memory or server instability."
fanoutTimelineDbFallback: "Fallback to database"
fanoutTimelineDbFallbackDescription: "When enabled, the timeline will fall back to the database for additional queries if the timeline is not cached. Disabling it further reduces the server load by eliminating the fallback process, but limits the range of timelines that can be retrieved."
+ reactionsBufferingDescription: "When enabled, performance during reaction creation will be greatly improved, reducing the load on the database. However, Redis memory usage will increase."
+ inquiryUrl: "Inquiry URL"
+ inquiryUrlDescription: "Specify a URL for the inquiry form to the server maintainer or a web page for the contact information."
+ thisSettingWillAutomaticallyOffWhenModeratorsInactive: "If no moderator activity is detected for a while, this setting will be automatically turned off to prevent spam."
_accountMigration:
moveFrom: "Migrate another account to this one"
moveFromSub: "Create alias to another account"
@@ -1689,6 +1771,7 @@ _role:
canManageAvatarDecorations: "Manage avatar decorations"
driveCapacity: "Drive capacity"
alwaysMarkNsfw: "Always mark files as NSFW"
+ canUpdateBioMedia: "Can edit an icon or a banner image"
pinMax: "Maximum number of pinned notes"
antennaMax: "Maximum number of antennas"
wordMuteMax: "Maximum number of characters allowed in word mutes"
@@ -1703,6 +1786,11 @@ _role:
canSearchNotes: "Usage of note search"
canUseTranslator: "Translator usage"
avatarDecorationLimit: "Maximum number of avatar decorations that can be applied"
+ canImportAntennas: "Allow importing antennas"
+ canImportBlocking: "Allow importing blocking"
+ canImportFollowing: "Allow importing following"
+ canImportMuting: "Allow importing muting"
+ canImportUserLists: "Allow importing lists"
_condition:
roleAssignedTo: "Assigned to manual roles"
isLocal: "Local user"
@@ -1920,7 +2008,6 @@ _theme:
buttonBg: "Button background"
buttonHoverBg: "Button background (Hover)"
inputBorder: "Input field border"
- listItemHoverBg: "List item background (Hover)"
driveFolderBg: "Drive folder background"
wallpaperOverlay: "Wallpaper overlay"
badge: "Badge"
@@ -1932,8 +2019,6 @@ _sfx:
note: "New note"
noteMy: "Own note"
notification: "Notifications"
- antenna: "Antennas"
- channel: "Channel notifications"
reaction: "On choosing a reaction"
_soundSettings:
driveFile: "Use an audio file in Drive."
@@ -1942,6 +2027,7 @@ _soundSettings:
driveFileTypeWarnDescription: "Select an audio file"
driveFileDurationWarn: "The audio is too long."
driveFileDurationWarnDescription: "Long audio may disrupt using Misskey. Still continue?"
+ driveFileError: "It couldn't load the sound. Please change the setting."
_ago:
future: "Future"
justNow: "Just now"
@@ -2059,7 +2145,7 @@ _permissions:
"read:admin:invite-codes": "View invite codes"
"write:admin:announcements": "Manage announcements"
"read:admin:announcements": "View announcements"
- "write:admin:avatar-decorations": "Manage avatar decorations"
+ "write:admin:avatar-decorations": "Can manage avatar decorations"
"read:admin:avatar-decorations": "View avatar decorations"
"write:admin:federation": "Manage federation data"
"write:admin:account": "Manage user account"
@@ -2088,8 +2174,11 @@ _auth:
permissionAsk: "This application requests the following permissions"
pleaseGoBack: "Please go back to the application"
callback: "Returning to the application"
+ accepted: "Access granted"
denied: "Access denied"
+ scopeUser: "Operate as the following user"
pleaseLogin: "Please log in to authorize applications."
+ byClickingYouWillBeRedirectedToThisUrl: "When access is granted, you will automatically be redirected to the following URL"
_antennaSources:
all: "All notes"
homeTimeline: "Notes from followed users"
@@ -2198,6 +2287,9 @@ _profile:
changeBanner: "Change banner"
verifiedLinkDescription: "By entering an URL that contains a link to your profile here, an ownership verification icon can be displayed next to the field."
avatarDecorationMax: "You can add up to {max} decorations."
+ followedMessage: "Message when you are followed"
+ followedMessageDescription: "You can set a short message to be displayed to the recipient when they follow you."
+ followedMessageDescriptionForLockedAccount: "If you have set up that follow requests require approval, this will be displayed when you grant a follow request."
_exportOrImport:
allNotes: "All notes"
favoritedNotes: "Favorite notes"
@@ -2290,6 +2382,7 @@ _pages:
eyeCatchingImageSet: "Set thumbnail"
eyeCatchingImageRemove: "Delete thumbnail"
chooseBlock: "Add a block"
+ enterSectionTitle: "Enter a section title"
selectType: "Select a type"
contentBlocks: "Content"
inputBlocks: "Input"
@@ -2335,6 +2428,8 @@ _notification:
renotedBySomeUsers: "Renote from {n} users"
followedBySomeUsers: "Followed by {n} users"
flushNotification: "Clear notifications"
+ exportOfXCompleted: "Export of {x} has been completed"
+ login: "Someone logged in"
_types:
all: "All"
note: "New notes"
@@ -2349,6 +2444,9 @@ _notification:
followRequestAccepted: "Accepted follow requests"
roleAssigned: "Role given"
achievementEarned: "Achievement unlocked"
+ exportCompleted: "The export has been completed"
+ login: "Sign In"
+ test: "Notification test"
app: "Notifications from linked apps"
_actions:
followBack: "followed you back"
@@ -2358,6 +2456,7 @@ _deck:
alwaysShowMainColumn: "Always show main column"
columnAlign: "Align columns"
addColumn: "Add column"
+ newNoteNotificationSettings: "Notification setting for new notes"
configureColumn: "Column settings"
swapLeft: "Swap with the left column"
swapRight: "Swap with the right column"
@@ -2396,9 +2495,10 @@ _drivecleaner:
orderByCreatedAtAsc: "Ascending Dates"
_webhookSettings:
createWebhook: "Create Webhook"
+ modifyWebhook: "Modify Webhook"
name: "Name"
secret: "Secret"
- events: "Webhook Events"
+ trigger: "Trigger"
active: "Enabled"
_events:
follow: "When following a user"
@@ -2408,6 +2508,29 @@ _webhookSettings:
renote: "When renoted"
reaction: "When receiving a reaction"
mention: "When being mentioned"
+ _systemEvents:
+ abuseReport: "When received a new report"
+ abuseReportResolved: "When resolved report"
+ userCreated: "When user is created"
+ inactiveModeratorsWarning: "When moderators have been inactive for a while"
+ inactiveModeratorsInvitationOnlyChanged: "When a moderator has been inactive for a while, and the server is changed to invitation-only"
+ deleteConfirm: "Are you sure you want to delete the Webhook?"
+ testRemarks: "Click the button to the right of the switch to send a test Webhook with dummy data."
+_abuseReport:
+ _notificationRecipient:
+ createRecipient: "Add a recipient for reports"
+ modifyRecipient: "Edit a recipient for reports"
+ recipientType: "Notification type"
+ _recipientType:
+ mail: "Email"
+ webhook: "Webhook"
+ _captions:
+ mail: "Send the email to moderators' email addresses when you receive reports."
+ webhook: "Send a notification to System Webhook when you receive or resolve reports."
+ keywords: "Keywords"
+ notifiedUser: "Users to notify"
+ notifiedWebhook: "Webhook to use"
+ deleteConfirm: "Are you sure that you want to delete the notification recipient?"
_moderationLogTypes:
createRole: "Role created"
deleteRole: "Role deleted"
@@ -2436,6 +2559,8 @@ _moderationLogTypes:
markSensitiveDriveFile: "File marked as sensitive"
unmarkSensitiveDriveFile: "File unmarked as sensitive"
resolveAbuseReport: "Report resolved"
+ forwardAbuseReport: "Report forwarded"
+ updateAbuseReportNote: "Moderation note of a report updated"
createInvitation: "Invite generated"
createAd: "Ad created"
deleteAd: "Ad deleted"
@@ -2443,8 +2568,18 @@ _moderationLogTypes:
createAvatarDecoration: "Avatar decoration created"
updateAvatarDecoration: "Avatar decoration updated"
deleteAvatarDecoration: "Avatar decoration deleted"
- unsetUserAvatar: "Unset this user's avatar"
- unsetUserBanner: "Unset this user's banner"
+ unsetUserAvatar: "User avatar unset"
+ unsetUserBanner: "User banner unset"
+ createSystemWebhook: "System Webhook created"
+ updateSystemWebhook: "System Webhook updated"
+ deleteSystemWebhook: "System Webhook deleted"
+ createAbuseReportNotificationRecipient: "Recipient for reports created"
+ updateAbuseReportNotificationRecipient: "Recipient for reports updated"
+ deleteAbuseReportNotificationRecipient: "Recipient for reports deleted"
+ deleteAccount: "Account deleted"
+ deletePage: "Page deleted"
+ deleteFlash: "Play deleted"
+ deleteGalleryPost: "Gallery post deleted"
_fileViewer:
title: "File details"
type: "File type"
@@ -2576,3 +2711,22 @@ _mediaControls:
pip: "Picture in Picture"
playbackRate: "Playback Speed"
loop: "Loop playback"
+_contextMenu:
+ title: "Context menu"
+ app: "Application"
+ appWithShift: "Application with shift key"
+ native: "Native"
+_embedCodeGen:
+ title: "Customize embed code"
+ header: "Show header"
+ autoload: "Automatically load more (deprecated)"
+ maxHeight: "Max height"
+ maxHeightDescription: "Setting it to 0 disables the max height setting. Specify some value to prevent the widget from continuing to expand vertically."
+ maxHeightWarn: "The max height limit is disabled (0). If this was not intended, set the max height to some value."
+ previewIsNotActual: "The display differs from the actual embedding because it exceeds the range displayed on the preview screen."
+ rounded: "Make it rounded"
+ border: "Add a border to the outer frame"
+ applyToPreview: "Apply to the preview"
+ generateCode: "Generate embed code"
+ codeGenerated: "The code has been generated"
+ codeGeneratedDescription: "Paste the generated code into your website to embed the content."
diff --git a/locales/es-ES.yml b/locales/es-ES.yml
index 5c8249ded5..7731598152 100644
--- a/locales/es-ES.yml
+++ b/locales/es-ES.yml
@@ -8,6 +8,8 @@ search: "Buscar"
notifications: "Notificaciones"
username: "Nombre de usuario"
password: "Contraseña"
+initialPasswordForSetup: "Contraseña para iniciar la inicialización"
+initialPasswordIsIncorrect: "La contraseña para iniciar la configuración inicial es incorrecta."
forgotPassword: "Olvidé mi contraseña"
fetchingAsApObject: "Buscando en el fediverso"
ok: "OK"
@@ -60,6 +62,7 @@ copyFileId: "Copiar ID del archivo"
copyFolderId: "Copiar ID de carpeta"
copyProfileUrl: "Copiar la URL del perfil"
searchUser: "Buscar un usuario"
+searchThisUsersNotes: ""
reply: "Responder"
loadMore: "Ver más"
showMore: "Ver más"
@@ -108,11 +111,14 @@ enterEmoji: "Ingresar emojis"
renote: "Renotar"
unrenote: "Quitar renota"
renoted: "Renotado"
+renotedToX: "{name} usuarios han renotado。"
cantRenote: "No se puede renotar este post"
cantReRenote: "No se puede renotar una renota"
quote: "Citar"
inChannelRenote: "Renota sólo del canal"
inChannelQuote: "Cita sólo del canal"
+renoteToChannel: "Renotar a otro canal"
+renoteToOtherChannel: "Renotar a otro canal"
pinnedNote: "Nota fijada"
pinned: "Fijar al perfil"
you: "Tú"
@@ -151,6 +157,7 @@ editList: "Editar lista"
selectChannel: "Seleccionar canal"
selectAntenna: "Seleccionar antena"
editAntenna: "Editar antena"
+createAntenna: "Crear una antena"
selectWidget: "Seleccionar widget"
editWidgets: "Editar widgets"
editWidgetsExit: "Terminar edición"
@@ -177,6 +184,10 @@ addAccount: "Agregar Cuenta"
reloadAccountsList: "Recargar lista de cuentas"
loginFailed: "Error al iniciar sesión."
showOnRemote: "Ver en una instancia remota"
+continueOnRemote: "Ver en una instancia remota"
+chooseServerOnMisskeyHub: "Elegir un servidor en Misskey Hub"
+specifyServerHost: "Especifica una instancia directamente"
+inputHostName: "Introduzca el dominio"
general: "General"
wallpaper: "Fondo de pantalla"
setWallpaper: "Establecer fondo de pantalla"
@@ -302,7 +313,7 @@ location: "Lugar"
theme: "Tema"
themeForLightMode: "Tema para usar en Modo Linterna"
themeForDarkMode: "Tema para usar en Modo Oscuro"
-light: "Linterna"
+light: "Claro"
dark: "Oscuro"
lightThemes: "Tema claro"
darkThemes: "Tema oscuro"
@@ -493,7 +504,8 @@ uiLanguage: "Idioma de visualización de la interfaz"
aboutX: "Acerca de {x}"
emojiStyle: "Estilo de emoji"
native: "Nativo"
-disableDrawer: "No mostrar los menús en cajones"
+menuStyle: "Diseño del menú"
+style: "Diseño"
showNoteActionsOnlyHover: "Mostrar acciones de la nota sólo al pasar el cursor"
showReactionsCount: "Mostrar el número de reacciones en las notas"
noHistory: "No hay datos en el historial"
@@ -692,10 +704,7 @@ abuseReported: "Se ha enviado el reporte. Muchas gracias."
reporter: "Reportador"
reporteeOrigin: "Reportar a"
reporterOrigin: "Origen del reporte"
-forwardReport: "Transferir un informe a una instancia remota"
-forwardReportIsAnonymous: "No puede ver su información de la instancia remota y aparecerá como una cuenta anónima del sistema"
send: "Enviar"
-abuseMarkAsResolved: "Marcar reporte como resuelto"
openInNewTab: "Abrir en una Nueva Pestaña"
openInSideView: "Abrir en una vista al costado"
defaultNavigationBehaviour: "Navegación por defecto"
@@ -920,6 +929,9 @@ oneHour: "1 hora"
oneDay: "1 día"
oneWeek: "1 semana"
oneMonth: "1 mes"
+threeMonths: "Tres meses"
+oneYear: "Un año"
+threeDays: "Tres días"
reflectMayTakeTime: "Puede pasar un tiempo hasta que se reflejen los cambios"
failedToFetchAccountInformation: "No se pudo obtener información de la cuenta"
rateLimitExceeded: "Se excedió el límite de peticiones"
@@ -1094,6 +1106,8 @@ preservedUsernames: "Nombre de usuario reservado"
preservedUsernamesDescription: "La lista de nombres de usuario para reservar tienen que separarse con saltos de línea.\nEstos estarán indisponibles durante la creación de cuentas, pero pueden ser usados para que los administradores puedan crear esas cuentas manualmente. Las cuentas existentes con esos nombres de usuario no se verán afectadas."
createNoteFromTheFile: "Componer una nota desde éste archivo"
archive: "Archivo"
+archived: "Archivado"
+unarchive: "Desarchivar"
channelArchiveConfirmTitle: "¿Seguro de archivar {name}?"
channelArchiveConfirmDescription: "Un canal archivado no aparecerá en la lista de canales ni en los resultados. Las nuevas publicaciones tampoco serán añadidas."
thisChannelArchived: "El canal ha sido archivado."
@@ -1233,6 +1247,14 @@ useNativeUIForVideoAudioPlayer: "Usar la interfaz del navegador cuando se reprod
keepOriginalFilename: "Mantener el nombre original del archivo"
noDescription: "No hay descripción"
alwaysConfirmFollow: "Confirmar siempre cuando se sigue a alguien"
+inquiry: "Contacto"
+tryAgain: "Por favor , inténtalo de nuevo"
+performance: "Rendimiento"
+unknownWebAuthnKey: "Esto no se ha registrado llave maestra."
+messageToFollower: "Mensaje a seguidores"
+_abuseUserReport:
+ accept: "Acepte"
+ reject: "repudio"
_delivery:
stop: "Suspendido"
_type:
@@ -1908,7 +1930,6 @@ _theme:
buttonBg: "Fondo de botón"
buttonHoverBg: "Fondo de botón (hover)"
inputBorder: "Borde de los campos de entrada"
- listItemHoverBg: "Fondo de elemento de listas (hover)"
driveFolderBg: "Fondo de capeta del drive"
wallpaperOverlay: "Transparencia del fondo de pantalla"
badge: "Medalla"
@@ -1920,8 +1941,6 @@ _sfx:
note: "Notas"
noteMy: "Nota (a mí mismo)"
notification: "Notificaciones"
- antenna: "Antena receptora"
- channel: "Notificaciones del canal"
reaction: "Al seleccionar una reacción"
_soundSettings:
driveFile: "Usar un archivo de audio en Drive"
@@ -2335,6 +2354,8 @@ _notification:
followRequestAccepted: "El seguimiento fue aceptado"
roleAssigned: "Rol asignado"
achievementEarned: "Logro desbloqueado"
+ login: "Iniciar sesión"
+ test: "Pruebas de nofiticaciones"
app: "Notificaciones desde aplicaciones"
_actions:
followBack: "Te sigue de vuelta"
@@ -2384,7 +2405,6 @@ _webhookSettings:
createWebhook: "Crear Webhook"
name: "Nombre"
secret: "Secreto"
- events: "Eventos de webhook"
active: "Activado"
_events:
follow: "Cuando se sigue a alguien"
@@ -2394,6 +2414,14 @@ _webhookSettings:
renote: "Cuando reciba un \"re-note\""
reaction: "Cuando se recibe una reacción"
mention: "Cuando hay una mención"
+ _systemEvents:
+ userCreated: "Cuando se crea el usuario."
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "Correo"
+ webhook: "Webhook"
+ keywords: "Palabras Clave"
_moderationLogTypes:
createRole: "Rol creado"
deleteRole: "Rol eliminado"
@@ -2497,6 +2525,7 @@ _hemisphere:
S: "Hemisferio sur"
_reversi:
reversi: "Reversi"
+ rules: "Reglas"
won: "{name} ha ganado"
total: "Total"
_urlPreviewSetting:
diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml
index 8d66c3d375..a7060c06fc 100644
--- a/locales/fr-FR.yml
+++ b/locales/fr-FR.yml
@@ -493,7 +493,6 @@ uiLanguage: "Langue d’affichage de l’interface"
aboutX: "À propos de {x}"
emojiStyle: "Style des émojis"
native: "Natif"
-disableDrawer: "Les menus ne s'affichent pas dans le tiroir"
showNoteActionsOnlyHover: "Afficher les actions de note uniquement au survol"
showReactionsCount: "Afficher le nombre de réactions des notes"
noHistory: "Pas d'historique"
@@ -692,10 +691,7 @@ abuseReported: "Le rapport est envoyé. Merci."
reporter: "Signalé par"
reporteeOrigin: "Origine du signalement"
reporterOrigin: "Signalé par"
-forwardReport: "Transférer le signalement à l’instance distante"
-forwardReportIsAnonymous: "L'instance distante ne sera pas en mesure de voir vos informations et apparaîtra comme un compte anonyme du système."
send: "Envoyer"
-abuseMarkAsResolved: "Marquer le signalement comme résolu"
openInNewTab: "Ouvrir dans un nouvel onglet"
openInSideView: "Ouvrir en vue latérale"
defaultNavigationBehaviour: "Navigation par défaut"
@@ -1094,6 +1090,8 @@ preservedUsernames: "Noms d'utilisateur·rice réservés"
preservedUsernamesDescription: "Énumérez les noms d'utilisateur à réserver, séparés par des nouvelles lignes. Les noms d'utilisateur spécifiés ici ne seront plus utilisables lors de la création d'un compte, sauf la création manuelle par un administrateur. De plus, les comptes existants ne seront pas affectés."
createNoteFromTheFile: "Rédiger une note de ce fichier"
archive: "Archive"
+archived: "Archivé"
+unarchive: "Annuler l'archivage"
channelArchiveConfirmTitle: "Voulez-vous vraiment archiver {name} ?"
channelArchiveConfirmDescription: "Une fois archivé, le canal n'apparaîtra plus dans la liste des canaux ni dans les résultats de recherche, et la publication des nouvelles notes sera impossible."
thisChannelArchived: "Ce canal a été archivé."
@@ -1224,7 +1222,10 @@ enableHorizontalSwipe: "Glisser pour changer d'onglet"
loading: "Chargement en cours"
surrender: "Annuler"
gameRetry: "Réessayer"
+launchApp: "Lancer l'app"
+inquiry: "Contact"
_delivery:
+ status: "Statut de la diffusion"
stop: "Suspendu·e"
_type:
none: "Publié"
@@ -1700,7 +1701,6 @@ _theme:
buttonBg: "Arrière-plan du bouton"
buttonHoverBg: "Arrière-plan du bouton (survolé)"
inputBorder: "Cadre de la zone de texte"
- listItemHoverBg: "Arrière-plan d'item de liste (survolé)"
driveFolderBg: "Arrière-plan du dossier de disque"
wallpaperOverlay: "Superposition de fond d'écran"
badge: "Badge"
@@ -1712,8 +1712,6 @@ _sfx:
note: "Nouvelle note"
noteMy: "Ma note"
notification: "Notifications"
- antenna: "Réception de l’antenne"
- channel: "Notifications de canal"
reaction: "Lors de la sélection de la réaction"
_soundSettings:
driveFile: "Utiliser un effet sonore sur le Disque"
@@ -2035,6 +2033,7 @@ _notification:
followRequestAccepted: "Demande d'abonnement acceptée"
roleAssigned: "Rôle reçu"
achievementEarned: "Déverrouillage d'accomplissement"
+ login: "Se connecter"
app: "Notifications provenant des apps"
_actions:
followBack: "Suivre"
@@ -2073,6 +2072,10 @@ _drivecleaner:
_webhookSettings:
name: "Nom"
active: "Activé"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "E-mail "
_moderationLogTypes:
createRole: "Rôle créé"
deleteRole: "Rôle supprimé"
diff --git a/locales/hu-HU.yml b/locales/hu-HU.yml
index 023a91494d..d0fdc027e9 100644
--- a/locales/hu-HU.yml
+++ b/locales/hu-HU.yml
@@ -1,5 +1,5 @@
---
-_lang_: "Japán"
+_lang_: "Magyar"
monthAndDay: "{month}.{day}."
search: "Keresés"
notifications: "Értesítések"
@@ -96,6 +96,7 @@ _notification:
renote: "Renote"
quote: "Idézet"
reaction: "Reakciók"
+ login: "Bejelentkezés"
_actions:
renote: "Renote"
_deck:
diff --git a/locales/id-ID.yml b/locales/id-ID.yml
index 7f509afa50..5d51d2dc78 100644
--- a/locales/id-ID.yml
+++ b/locales/id-ID.yml
@@ -60,6 +60,7 @@ copyFileId: "Salin Berkas"
copyFolderId: "Salin Folder"
copyProfileUrl: "Salin Alamat Web Profil"
searchUser: "Cari pengguna"
+searchThisUsersNotes: "Mencari catatan pengguna"
reply: "Balas"
loadMore: "Selebihnya"
showMore: "Selebihnya"
@@ -154,6 +155,7 @@ editList: "Sunting daftar"
selectChannel: "Pilih kanal"
selectAntenna: "Pilih Antena"
editAntenna: "Sunting antena"
+createAntenna: "Membuat antena."
selectWidget: "Pilih gawit"
editWidgets: "Sunting gawit"
editWidgetsExit: "Selesai"
@@ -180,6 +182,10 @@ addAccount: "Tambahkan akun"
reloadAccountsList: "Muat ulang daftar akun"
loginFailed: "Gagal untuk masuk"
showOnRemote: "Lihat profil asli"
+continueOnRemote: "Lihat di peladen asal"
+chooseServerOnMisskeyHub: "Pilih peladen dari Misskey Hub"
+specifyServerHost: "Tentukan domain peladen"
+inputHostName: "Masukkan nama domain"
general: "Umum"
wallpaper: "Wallpaper"
setWallpaper: "Atur wallpaper"
@@ -190,6 +196,7 @@ followConfirm: "Apakah kamu yakin ingin mengikuti {name}?"
proxyAccount: "Akun proksi"
proxyAccountDescription: "Akun proksi merupakan sebuah akun yang bertindak sebagai pengikut instansi luar untuk pengguna dalam kondisi tertentu. Sebagai contoh, ketika pengguna menambahkan seorang pengguna instansi luar ke dalam daftar, aktivitas dari pengguna instansi luar tidak akan disampaikan ke instansi apabila tidak ada pengguna lokal yang mengikuti pengguna tersebut, dengan begitu akun proksilah yang akan mengikutinya."
host: "Host"
+selectSelf: "Pilih diri sendiri"
selectUser: "Pilih pengguna"
recipient: "Penerima"
annotation: "Keterangan konten"
@@ -226,6 +233,7 @@ blockedInstances: "Instansi terblokir"
blockedInstancesDescription: "Daftar nama host dari instansi yang diperlukan untuk diblokir. Instansi yang didaftarkan tidak akan dapat berkomunikasi dengan instansi ini."
silencedInstances: "Instansi yang disenyapkan"
silencedInstancesDescription: "Daftar nama host dari instansi yang ingin kamu senyapkan. Semua akun dari instansi yang terdaftar akan diperlakukan sebagai disenyapkan. Hal ini membuat akun hanya dapat membuat permintaan mengikuti, dan tidak dapat menyebutkan akun lokal apabila tidak mengikuti. Hal ini tidak akan mempengaruhi instansi yang diblokir."
+federationAllowedHosts: "Server yang membolehkan federasi"
muteAndBlock: "Bisukan / Blokir"
mutedUsers: "Pengguna yang dibisukan"
blockedUsers: "Pengguna yang diblokir"
@@ -316,6 +324,7 @@ selectFile: "Pilih berkas"
selectFiles: "Pilih berkas"
selectFolder: "Pilih folder"
selectFolders: "Pilih folder"
+fileNotSelected: "Tidak ada file yang dipilih"
renameFile: "Ubah nama berkas"
folderName: "Nama folder"
createFolder: "Buat folder"
@@ -323,6 +332,7 @@ renameFolder: "Ubah nama folder"
deleteFolder: "Hapus folder"
folder: "Folder"
addFile: "Tambahkan berkas"
+showFile: "Tampilkan berkas"
emptyDrive: "Drive kosong"
emptyFolder: "Folder kosong"
unableToDelete: "Tidak dapat menghapus"
@@ -497,7 +507,8 @@ uiLanguage: "Bahasa antarmuka pengguna"
aboutX: "Tentang {x}"
emojiStyle: "Gaya emoji"
native: "Native"
-disableDrawer: "Jangan gunakan menu bergaya laci"
+menuStyle: "Gaya menu"
+style: "Gaya"
showNoteActionsOnlyHover: "Hanya tampilkan aksi catatan saat ditunjuk"
showReactionsCount: "Lihat jumlah reaksi dalam catatan"
noHistory: "Tidak ada riwayat"
@@ -696,10 +707,7 @@ abuseReported: "Laporan kamu telah dikirimkan. Terima kasih."
reporter: "Pelapor"
reporteeOrigin: "Yang dilaporkan"
reporterOrigin: "Pelapor"
-forwardReport: "Teruskan laporan ke instansi luar"
-forwardReportIsAnonymous: "Untuk melindungi privasi akun kamu, akun anonim dari sistem akan digunakan sebagai pelapor pada instansi luar."
send: "Kirim"
-abuseMarkAsResolved: "Tandai laporan sebagai selesai"
openInNewTab: "Buka di tab baru"
openInSideView: "Buka di tampilan samping"
defaultNavigationBehaviour: "Navigasi bawaan"
@@ -924,6 +932,9 @@ oneHour: "1 Jam"
oneDay: "1 Hari"
oneWeek: "1 Bulan"
oneMonth: "satu bulan"
+threeMonths: "3 bulan"
+oneYear: "1 tahun"
+threeDays: "3 hari"
reflectMayTakeTime: "Mungkin perlu beberapa saat untuk dicerminkan."
failedToFetchAccountInformation: "Gagal untuk mendapatkan informasi akun"
rateLimitExceeded: "Batas sudah terlampaui"
@@ -1098,6 +1109,7 @@ preservedUsernames: "Nama pengguna tercadangkan"
preservedUsernamesDescription: "Daftar nama pengguna yang dicadangkan dipisah dengan baris baru. Nama pengguna berikut akan tidak dapat dipakai pada pembuatan akun normal, namun dapat digunakan oleh admin untuk membuat akun baru. Akun yang sudah ada dengan menggunakan nama pengguna ini tidak akan terpengaruh."
createNoteFromTheFile: "Buat catatan dari berkas ini"
archive: "Arsipkan"
+archived: "Diarsipkan"
channelArchiveConfirmTitle: "Yakin untuk mengarsipkan {name}?"
channelArchiveConfirmDescription: "Kanal yang diarsipkan tidak akan muncul pada daftar kanal atau hasil pencarian. Postingan baru juga tidak dapat ditambahkan lagi."
thisChannelArchived: "Kanal ini telah diarsipkan."
@@ -1108,6 +1120,7 @@ preventAiLearning: "Tolak penggunaan Pembelajaran Mesin (AI Generatif)"
preventAiLearningDescription: "Minta perayap web untuk tidak menggunakan materi teks atau gambar yang telah diposting ke dalam set data Pembelajaran Mesin (Prediktif / Generatif). Hal ini dicapai dengan menambahkan flag HTML-Response \"noai\" ke masing-masing konten. Pencegahan penuh mungkin tidak dapat dicapai dengan flag ini, karena juga dapat diabaikan begitu saja."
options: "Opsi peran"
specifyUser: "Pengguna spesifik"
+openTagPageConfirm: "Apakah ingin membuka laman tagar?"
failedToPreviewUrl: "Tidak dapat dipratinjau"
update: "Perbarui"
rolesThatCanBeUsedThisEmojiAsReaction: "Peran yang dapat menggunakan emoji ini sebagai reaksi"
@@ -1239,6 +1252,19 @@ keepOriginalFilenameDescription: "Apabila pengaturan ini dimatikan, nama berkas
noDescription: "Tidak ada deskripsi"
alwaysConfirmFollow: "Selalu konfirmasi ketika mengikuti"
inquiry: "Hubungi kami"
+tryAgain: "Silahkan coba lagi."
+createdLists: "Senarai yang dibuat"
+createdAntennas: "Antena yang dibuat"
+fromX: "Dari {x}"
+noteOfThisUser: "Catatan oleh pengguna ini"
+clipNoteLimitExceeded: "Klip ini tak bisa ditambahi lagi catatan."
+performance: "Kinerja"
+modified: "Diubah"
+thereAreNChanges: "Ada {n} perubahan"
+prohibitedWordsForNameOfUser: "Kata yang dilarang untuk nama pengguna"
+_abuseUserReport:
+ accept: "Setuju"
+ reject: "Tolak"
_delivery:
status: "Status pengiriman"
stop: "Ditangguhkan"
@@ -1703,6 +1729,8 @@ _role:
canSearchNotes: "Penggunaan pencarian catatan"
canUseTranslator: "Penggunaan penerjemah"
avatarDecorationLimit: "Jumlah maksimum dekorasi avatar yang dapat diterapkan"
+ canImportAntennas: "Izinkan mengimpor antena"
+ canImportUserLists: "Izinkan mengimpor senarai"
_condition:
roleAssignedTo: "Ditugaskan ke peran manual"
isLocal: "Pengguna lokal"
@@ -1739,7 +1767,7 @@ _emailUnavailable:
smtp: "Peladen alamat surel ini tidak merespon"
banned: "Kamu tidak dapat mendaftar dengan alamat surel ini"
_ffVisibility:
- public: "Terbitkan"
+ public: "Publik"
followers: "Tampil untuk pengikut saja"
private: "Tersembunyi"
_signup:
@@ -1920,7 +1948,6 @@ _theme:
buttonBg: "Latar belakang tombol"
buttonHoverBg: "Latar belakang tombol (Mengambang)"
inputBorder: "Batas bidang masukan"
- listItemHoverBg: "Latar belakang daftar item (Mengambang)"
driveFolderBg: "Latar belakang folder drive"
wallpaperOverlay: "Lapisan wallpaper"
badge: "Lencana"
@@ -1932,8 +1959,6 @@ _sfx:
note: "Catatan"
noteMy: "Catatan (Saya)"
notification: "Notifikasi"
- antenna: "Penerimaan Antenna"
- channel: "Notifikasi Kanal"
reaction: "Ketika memilih reaksi"
_soundSettings:
driveFile: "Menggunakan berkas audio dalam Drive"
@@ -1942,6 +1967,7 @@ _soundSettings:
driveFileTypeWarnDescription: "Pilih berkas audio"
driveFileDurationWarn: "Audio ini terlalu panjang"
driveFileDurationWarnDescription: "Audio panjang dapat mengganggu penggunaan Misskey. Masih ingin melanjutkan?"
+ driveFileError: "Tak bisa memuat audio. Mohon ubah pengaturan"
_ago:
future: "Masa depan"
justNow: "Baru saja"
@@ -2349,6 +2375,7 @@ _notification:
followRequestAccepted: "Permintaan mengikuti disetujui"
roleAssigned: "Peran Diberikan"
achievementEarned: "Pencapaian didapatkan"
+ login: "Masuk"
app: "Notifikasi dari aplikasi tertaut"
_actions:
followBack: "Ikuti Kembali"
@@ -2396,9 +2423,9 @@ _drivecleaner:
orderByCreatedAtAsc: "Tanggal (Naik)"
_webhookSettings:
createWebhook: "Buat Webhook"
+ modifyWebhook: "Sunting Webhook"
name: "Nama"
secret: "Secret"
- events: "Webhook Events"
active: "Aktif"
_events:
follow: "Ketika mengikuti pengguna"
@@ -2408,6 +2435,13 @@ _webhookSettings:
renote: "Ketika direnote"
reaction: "Ketika menerima reaksi"
mention: "Ketika sedang disebut"
+ deleteConfirm: "Apakah kamu yakin ingin menghapus Webhook?"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "Surel"
+ webhook: "Webhook"
+ keywords: "Kata kunci"
_moderationLogTypes:
createRole: "Peran telah dibuat"
deleteRole: "Peran telah dihapus"
@@ -2445,6 +2479,7 @@ _moderationLogTypes:
deleteAvatarDecoration: "Hapus dekorasi avatar"
unsetUserAvatar: "Hapus avatar pengguna"
unsetUserBanner: "Hapus banner pengguna"
+ deleteAccount: "Akun dihapus"
_fileViewer:
title: "Rincian berkas"
type: "Jenis berkas"
diff --git a/locales/index.d.ts b/locales/index.d.ts
index 0b1b86d373..440f24ac84 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -48,6 +48,20 @@ export interface Locale extends ILocale {
* パスワード
*/
"password": string;
+ /**
+ * 初期設定開始用パスワード
+ */
+ "initialPasswordForSetup": string;
+ /**
+ * 初期設定開始用のパスワードが違います。
+ */
+ "initialPasswordIsIncorrect": string;
+ /**
+ * Misskeyを自分でインストールした場合は、設定ファイルに入力したパスワードを使用してください。
+ * Misskeyのホスティングサービスなどを使用している場合は、提供されたパスワードを使用してください。
+ * パスワードを設定していない場合は、空欄にしたまま続行してください。
+ */
+ "initialPasswordForSetupDescription": string;
/**
* パスワードを忘れた
*/
@@ -256,6 +270,10 @@ export interface Locale extends ILocale {
* ユーザーを検索
*/
"searchUser": string;
+ /**
+ * ユーザーのノートを検索
+ */
+ "searchThisUsersNotes": string;
/**
* 返信
*/
@@ -632,6 +650,10 @@ export interface Locale extends ILocale {
* アンテナを編集
*/
"editAntenna": string;
+ /**
+ * アンテナを作成
+ */
+ "createAntenna": string;
/**
* ウィジェットを選択
*/
@@ -736,6 +758,22 @@ export interface Locale extends ILocale {
* リモートで表示
*/
"showOnRemote": string;
+ /**
+ * リモートで続行
+ */
+ "continueOnRemote": string;
+ /**
+ * Misskey Hubからサーバーを選択
+ */
+ "chooseServerOnMisskeyHub": string;
+ /**
+ * サーバーのドメインを直接指定
+ */
+ "specifyServerHost": string;
+ /**
+ * ドメインを入力してください
+ */
+ "inputHostName": string;
/**
* 全般
*/
@@ -776,6 +814,10 @@ export interface Locale extends ILocale {
* ホスト
*/
"host": string;
+ /**
+ * 自分を選択
+ */
+ "selectSelf": string;
/**
* ユーザーを選択
*/
@@ -836,6 +878,10 @@ export interface Locale extends ILocale {
* サーバーをサイレンス
*/
"silenceThisInstance": string;
+ /**
+ * サーバーをメディアサイレンス
+ */
+ "mediaSilenceThisInstance": string;
/**
* 操作
*/
@@ -920,6 +966,22 @@ export interface Locale extends ILocale {
* サイレンスしたいサーバーのホストを改行で区切って設定します。サイレンスされたサーバーに所属するアカウントはすべて「サイレンス」として扱われ、フォローがすべてリクエストになります。ブロックしたインスタンスには影響しません。
*/
"silencedInstancesDescription": string;
+ /**
+ * メディアサイレンスしたサーバー
+ */
+ "mediaSilencedInstances": string;
+ /**
+ * メディアサイレンスしたいサーバーのホストを改行で区切って設定します。メディアサイレンスされたサーバーに所属するアカウントによるファイルはすべてセンシティブとして扱われ、カスタム絵文字が使用できないようになります。ブロックしたインスタンスには影響しません。
+ */
+ "mediaSilencedInstancesDescription": string;
+ /**
+ * 連合を許可するサーバー
+ */
+ "federationAllowedHosts": string;
+ /**
+ * 連合を許可するサーバーのホストを改行で区切って設定します。
+ */
+ "federationAllowedHostsDescription": string;
/**
* ミュートとブロック
*/
@@ -1312,6 +1374,10 @@ export interface Locale extends ILocale {
* ファイルを追加
*/
"addFile": string;
+ /**
+ * ファイルを表示
+ */
+ "showFile": string;
/**
* ドライブは空です
*/
@@ -1768,6 +1834,10 @@ export interface Locale extends ILocale {
* モデレーションノート
*/
"moderationNote": string;
+ /**
+ * モデレーター間でだけ共有されるメモを記入することができます。
+ */
+ "moderationNoteDescription": string;
/**
* モデレーションノートを追加する
*/
@@ -1921,9 +1991,13 @@ export interface Locale extends ILocale {
*/
"onlyOneFileCanBeAttached": string;
/**
- * 続行する前に、サインアップまたはサインインが必要です
+ * 続行する前に、登録またはログインが必要です
*/
"signinRequired": string;
+ /**
+ * 続行するには、お使いのサーバーに移動するか、このサーバーに登録・ログインする必要があります
+ */
+ "signinOrContinueOnRemote": string;
/**
* 招待
*/
@@ -2009,9 +2083,21 @@ export interface Locale extends ILocale {
*/
"native": string;
/**
- * メニューをドロワーで表示しない
+ * メニューのスタイル
*/
- "disableDrawer": string;
+ "menuStyle": string;
+ /**
+ * スタイル
+ */
+ "style": string;
+ /**
+ * ドロワー
+ */
+ "drawer": string;
+ /**
+ * ポップアップ
+ */
+ "popup": string;
/**
* ノートのアクションをホバー時のみ表示する
*/
@@ -2340,6 +2426,14 @@ export interface Locale extends ILocale {
* スクラッチパッドは、AiScriptの実験環境を提供します。Misskeyと対話するコードの記述、実行、結果の確認ができます。
*/
"scratchpadDescription": string;
+ /**
+ * UIインスペクター
+ */
+ "uiInspector": string;
+ /**
+ * メモリ上に存在しているUIコンポーネントのインスタンスの一覧を見ることができます。UIコンポーネントはUi:C:系関数により生成されます。
+ */
+ "uiInspectorDescription": string;
/**
* 出力
*/
@@ -2785,7 +2879,7 @@ export interface Locale extends ILocale {
*/
"reportAbuseOf": ParameterizedString<"name">;
/**
- * 通報理由の詳細を記入してください。対象のノートがある場合はそのURLも記入してください。
+ * 通報理由の詳細を記入してください。対象のノートやページなどがある場合はそのURLも記入してください。
*/
"fillAbuseReportDescription": string;
/**
@@ -2804,22 +2898,10 @@ export interface Locale extends ILocale {
* 通報元
*/
"reporterOrigin": string;
- /**
- * リモートサーバーに通報を転送する
- */
- "forwardReport": string;
- /**
- * リモートサーバーからはあなたの情報は見れず、匿名のシステムアカウントとして表示されます。
- */
- "forwardReportIsAnonymous": string;
/**
* 送信
*/
"send": string;
- /**
- * 対応済みにする
- */
- "abuseMarkAsResolved": string;
/**
* 新しいタブで開く
*/
@@ -3077,7 +3159,7 @@ export interface Locale extends ILocale {
*/
"narrow": string;
/**
- * 設定はページリロード後に反映されます。今すぐリロードしますか?
+ * 設定はページリロード後に反映されます。
*/
"reloadToApplySetting": string;
/**
@@ -3624,6 +3706,10 @@ export interface Locale extends ILocale {
* パスワードが間違っています。
*/
"incorrectPassword": string;
+ /**
+ * ワンタイムパスワードが間違っているか、期限切れになっています。
+ */
+ "incorrectTotp": string;
/**
* 「{choice}」に投票しますか?
*/
@@ -3720,6 +3806,18 @@ export interface Locale extends ILocale {
* 1ヶ月
*/
"oneMonth": string;
+ /**
+ * 3ヶ月
+ */
+ "threeMonths": string;
+ /**
+ * 1年
+ */
+ "oneYear": string;
+ /**
+ * 3日
+ */
+ "threeDays": string;
/**
* 反映されるまで時間がかかる場合があります。
*/
@@ -4280,6 +4378,10 @@ export interface Locale extends ILocale {
* リモートサーバーのチャートを生成
*/
"enableChartsForFederatedInstances": string;
+ /**
+ * リモートサーバーの情報を取得
+ */
+ "enableStatsForFederatedInstances": string;
/**
* ノートのアクションにクリップを追加
*/
@@ -4420,6 +4522,14 @@ export interface Locale extends ILocale {
* アーカイブ
*/
"archive": string;
+ /**
+ * アーカイブ済み
+ */
+ "archived": string;
+ /**
+ * アーカイブ解除
+ */
+ "unarchive": string;
/**
* {name}をアーカイブしますか?
*/
@@ -4460,6 +4570,18 @@ export interface Locale extends ILocale {
* ユーザー指定
*/
"specifyUser": string;
+ /**
+ * 照会しますか?
+ */
+ "lookupConfirm": string;
+ /**
+ * ハッシュタグのページを開きますか?
+ */
+ "openTagPageConfirm": string;
+ /**
+ * ホスト指定
+ */
+ "specifyHost": string;
/**
* プレビューできません
*/
@@ -4984,6 +5106,191 @@ export interface Locale extends ILocale {
* お問い合わせ
*/
"inquiry": string;
+ /**
+ * もう一度お試しください。
+ */
+ "tryAgain": string;
+ /**
+ * センシティブなメディアを表示するとき確認する
+ */
+ "confirmWhenRevealingSensitiveMedia": string;
+ /**
+ * センシティブなメディアです。表示しますか?
+ */
+ "sensitiveMediaRevealConfirm": string;
+ /**
+ * 作成したリスト
+ */
+ "createdLists": string;
+ /**
+ * 作成したアンテナ
+ */
+ "createdAntennas": string;
+ /**
+ * {x}から
+ */
+ "fromX": ParameterizedString<"x">;
+ /**
+ * 埋め込みコードを生成
+ */
+ "genEmbedCode": string;
+ /**
+ * このユーザーのノート一覧
+ */
+ "noteOfThisUser": string;
+ /**
+ * これ以上このクリップにノートを追加できません。
+ */
+ "clipNoteLimitExceeded": string;
+ /**
+ * パフォーマンス
+ */
+ "performance": string;
+ /**
+ * 変更あり
+ */
+ "modified": string;
+ /**
+ * 破棄
+ */
+ "discard": string;
+ /**
+ * {n}件の変更があります
+ */
+ "thereAreNChanges": ParameterizedString<"n">;
+ /**
+ * パスキーでログイン
+ */
+ "signinWithPasskey": string;
+ /**
+ * 登録されていないパスキーです。
+ */
+ "unknownWebAuthnKey": string;
+ /**
+ * パスキーの検証に失敗しました。
+ */
+ "passkeyVerificationFailed": string;
+ /**
+ * パスキーの検証に成功しましたが、パスワードレスログインが無効になっています。
+ */
+ "passkeyVerificationSucceededButPasswordlessLoginDisabled": string;
+ /**
+ * フォロワーへのメッセージ
+ */
+ "messageToFollower": string;
+ /**
+ * 対象
+ */
+ "target": string;
+ /**
+ * CAPTCHAのテストを目的とした機能です。本番環境で使用しないでください。
+ */
+ "testCaptchaWarning": string;
+ /**
+ * 禁止ワード(ユーザーの名前)
+ */
+ "prohibitedWordsForNameOfUser": string;
+ /**
+ * このリストに含まれる文字列がユーザーの名前に含まれる場合、ユーザーの名前の変更を拒否します。モデレーター権限を持つユーザーはこの制限の影響を受けません。
+ */
+ "prohibitedWordsForNameOfUserDescription": string;
+ /**
+ * 変更しようとした名前に禁止された文字列が含まれています
+ */
+ "yourNameContainsProhibitedWords": string;
+ /**
+ * 名前に禁止されている文字列が含まれています。この名前を使用したい場合は、サーバー管理者にお問い合わせください。
+ */
+ "yourNameContainsProhibitedWordsDescription": string;
+ /**
+ * 投稿者により、表示にはログインが必要と設定されています
+ */
+ "thisContentsAreMarkedAsSigninRequiredByAuthor": string;
+ /**
+ * ロックダウン
+ */
+ "lockdown": string;
+ /**
+ * アカウントを選択してください
+ */
+ "pleaseSelectAccount": string;
+ /**
+ * 利用可能なロール
+ */
+ "availableRoles": string;
+ "_accountSettings": {
+ /**
+ * コンテンツの表示にログインを必須にする
+ */
+ "requireSigninToViewContents": string;
+ /**
+ * あなたが作成した全てのノートなどのコンテンツを表示するのにログインを必須にします。クローラーに情報が収集されるのを防ぐ効果が期待できます。
+ */
+ "requireSigninToViewContentsDescription1": string;
+ /**
+ * URLプレビュー(OGP)、Webページへの埋め込み、ノートの引用に対応していないサーバーからの表示も不可になります。
+ */
+ "requireSigninToViewContentsDescription2": string;
+ /**
+ * リモートサーバーに連合されたコンテンツでは、これらの制限が適用されない場合があります。
+ */
+ "requireSigninToViewContentsDescription3": string;
+ /**
+ * 過去のノートをフォロワーのみ表示可能にする
+ */
+ "makeNotesFollowersOnlyBefore": string;
+ /**
+ * この機能が有効になっている間、設定された日時より過去、または設定された時間を経過しているノートがフォロワーのみ表示可能になります。無効に戻すと、ノートの公開状態も元に戻ります。
+ */
+ "makeNotesFollowersOnlyBeforeDescription": string;
+ /**
+ * 過去のノートを非公開化する
+ */
+ "makeNotesHiddenBefore": string;
+ /**
+ * この機能が有効になっている間、設定された日時より過去、または設定された時間を経過しているノートが自分のみ表示可能(非公開化)になります。無効に戻すと、ノートの公開状態も元に戻ります。
+ */
+ "makeNotesHiddenBeforeDescription": string;
+ /**
+ * リモートサーバーに連合されたノートには効果が及ばない場合があります。
+ */
+ "mayNotEffectForFederatedNotes": string;
+ /**
+ * 指定した時間を経過しているノート
+ */
+ "notesHavePassedSpecifiedPeriod": string;
+ /**
+ * 指定した日時より前のノート
+ */
+ "notesOlderThanSpecifiedDateAndTime": string;
+ };
+ "_abuseUserReport": {
+ /**
+ * 転送
+ */
+ "forward": string;
+ /**
+ * 匿名のシステムアカウントとして、リモートサーバーに通報を転送します。
+ */
+ "forwardDescription": string;
+ /**
+ * 解決
+ */
+ "resolve": string;
+ /**
+ * 是認
+ */
+ "accept": string;
+ /**
+ * 否認
+ */
+ "reject": string;
+ /**
+ * 内容が正当である通報に対応した場合は「是認」を選択し、肯定的にケースが解決されたことをマークします。
+ * 内容が正当でない通報の場合は「否認」を選択し、否定的にケースが解決されたことをマークします。
+ */
+ "resolveTutorial": string;
+ };
"_delivery": {
/**
* 配信状態
@@ -5475,6 +5782,10 @@ export interface Locale extends ILocale {
* 有効にすると、タイムラインがキャッシュされていない場合にDBへ追加で問い合わせを行うフォールバック処理を行います。無効にすると、フォールバック処理を行わないことでさらにサーバーの負荷を軽減することができますが、タイムラインが取得できる範囲に制限が生じます。
*/
"fanoutTimelineDbFallbackDescription": string;
+ /**
+ * 有効にすると、リアクション作成時のパフォーマンスが大幅に向上し、データベースへの負荷を軽減することが可能です。ただし、Redisのメモリ使用量は増加します。
+ */
+ "reactionsBufferingDescription": string;
/**
* 問い合わせ先URL
*/
@@ -5483,6 +5794,10 @@ export interface Locale extends ILocale {
* サーバー運営者へのお問い合わせフォームのURLや、運営者の連絡先等が記載されたWebページのURLを指定します。
*/
"inquiryUrlDescription": string;
+ /**
+ * 一定期間モデレーターのアクティビティが検出されなかった場合、スパム防止のためこの設定は自動でオフになります。
+ */
+ "thisSettingWillAutomaticallyOffWhenModeratorsInactive": string;
};
"_accountMigration": {
/**
@@ -6594,6 +6909,10 @@ export interface Locale extends ILocale {
* ファイルにNSFWを常に付与
*/
"alwaysMarkNsfw": string;
+ /**
+ * アイコンとバナーの更新を許可
+ */
+ "canUpdateBioMedia": string;
/**
* ノートのピン留めの最大数
*/
@@ -6650,6 +6969,26 @@ export interface Locale extends ILocale {
* アイコンデコレーションの最大取付個数
*/
"avatarDecorationLimit": string;
+ /**
+ * アンテナのインポートを許可
+ */
+ "canImportAntennas": string;
+ /**
+ * ブロックのインポートを許可
+ */
+ "canImportBlocking": string;
+ /**
+ * フォローのインポートを許可
+ */
+ "canImportFollowing": string;
+ /**
+ * ミュートのインポートを許可
+ */
+ "canImportMuting": string;
+ /**
+ * リストのインポートを許可
+ */
+ "canImportUserLists": string;
};
"_condition": {
/**
@@ -7468,10 +7807,6 @@ export interface Locale extends ILocale {
* 入力ボックスの縁取り
*/
"inputBorder": string;
- /**
- * リスト項目の背景 (ホバー)
- */
- "listItemHoverBg": string;
/**
* ドライブフォルダーの背景
*/
@@ -7515,14 +7850,6 @@ export interface Locale extends ILocale {
* 通知
*/
"notification": string;
- /**
- * アンテナ受信
- */
- "antenna": string;
- /**
- * チャンネル通知
- */
- "channel": string;
/**
* リアクション選択時
*/
@@ -7553,6 +7880,10 @@ export interface Locale extends ILocale {
* 長い音声を使用するとMisskeyの使用に支障をきたす可能性があります。それでも続行しますか?
*/
"driveFileDurationWarnDescription": string;
+ /**
+ * 音声が読み込めませんでした。設定を変更してください
+ */
+ "driveFileError": string;
};
"_ago": {
/**
@@ -8125,14 +8456,26 @@ export interface Locale extends ILocale {
* アプリケーションに戻っています
*/
"callback": string;
+ /**
+ * アクセスを許可しました
+ */
+ "accepted": string;
/**
* アクセスを拒否しました
*/
"denied": string;
+ /**
+ * 以下のユーザーとして操作しています
+ */
+ "scopeUser": string;
/**
* アプリケーションにアクセス許可を与えるには、ログインが必要です。
*/
"pleaseLogin": string;
+ /**
+ * アクセスを許可すると、自動で以下のURLに遷移します
+ */
+ "byClickingYouWillBeRedirectedToThisUrl": string;
};
"_antennaSources": {
/**
@@ -8545,6 +8888,18 @@ export interface Locale extends ILocale {
* 最大{max}つまでデコレーションを付けられます。
*/
"avatarDecorationMax": ParameterizedString<"max">;
+ /**
+ * フォローされた時のメッセージ
+ */
+ "followedMessage": string;
+ /**
+ * フォローされた時に相手に表示する短いメッセージを設定できます。
+ */
+ "followedMessageDescription": string;
+ /**
+ * フォローを承認制にしている場合、フォローリクエストを許可した時に表示されます。
+ */
+ "followedMessageDescriptionForLockedAccount": string;
};
"_exportOrImport": {
/**
@@ -8901,6 +9256,10 @@ export interface Locale extends ILocale {
* ブロックを追加
*/
"chooseBlock": string;
+ /**
+ * セクションタイトルを入力
+ */
+ "enterSectionTitle": string;
/**
* 種類を選択
*/
@@ -8998,7 +9357,7 @@ export interface Locale extends ILocale {
*/
"youGotQuote": ParameterizedString<"name">;
/**
- * {name}がRenoteしました
+ * {name}がリノートしました
*/
"youRenoted": ParameterizedString<"name">;
/**
@@ -9073,6 +9432,14 @@ export interface Locale extends ILocale {
* 通知の履歴をリセットする
*/
"flushNotification": string;
+ /**
+ * {x}のエクスポートが完了しました
+ */
+ "exportOfXCompleted": ParameterizedString<"x">;
+ /**
+ * ログインがありました
+ */
+ "login": string;
"_types": {
/**
* すべて
@@ -9095,7 +9462,7 @@ export interface Locale extends ILocale {
*/
"reply": string;
/**
- * Renote
+ * リノート
*/
"renote": string;
/**
@@ -9126,6 +9493,18 @@ export interface Locale extends ILocale {
* 実績の獲得
*/
"achievementEarned": string;
+ /**
+ * エクスポートが完了した
+ */
+ "exportCompleted": string;
+ /**
+ * ログイン
+ */
+ "login": string;
+ /**
+ * 通知のテスト
+ */
+ "test": string;
/**
* 連携アプリからの通知
*/
@@ -9141,7 +9520,7 @@ export interface Locale extends ILocale {
*/
"reply": string;
/**
- * Renote
+ * リノート
*/
"renote": string;
};
@@ -9305,6 +9684,10 @@ export interface Locale extends ILocale {
* Webhookを作成
*/
"createWebhook": string;
+ /**
+ * Webhookを編集
+ */
+ "modifyWebhook": string;
/**
* 名前
*/
@@ -9314,9 +9697,9 @@ export interface Locale extends ILocale {
*/
"secret": string;
/**
- * Webhookを実行するタイミング
+ * トリガー
*/
- "events": string;
+ "trigger": string;
/**
* 有効
*/
@@ -9351,6 +9734,88 @@ export interface Locale extends ILocale {
*/
"mention": string;
};
+ "_systemEvents": {
+ /**
+ * ユーザーから通報があったとき
+ */
+ "abuseReport": string;
+ /**
+ * ユーザーからの通報を処理したとき
+ */
+ "abuseReportResolved": string;
+ /**
+ * ユーザーが作成されたとき
+ */
+ "userCreated": string;
+ /**
+ * モデレーターが一定期間非アクティブになったとき
+ */
+ "inactiveModeratorsWarning": string;
+ /**
+ * モデレーターが一定期間非アクティブだったため、システムにより招待制へと変更されたとき
+ */
+ "inactiveModeratorsInvitationOnlyChanged": string;
+ };
+ /**
+ * Webhookを削除しますか?
+ */
+ "deleteConfirm": string;
+ /**
+ * スイッチの右にあるボタンをクリックするとダミーのデータを使用したテスト用Webhookを送信できます。
+ */
+ "testRemarks": string;
+ };
+ "_abuseReport": {
+ "_notificationRecipient": {
+ /**
+ * 通報の通知先を追加
+ */
+ "createRecipient": string;
+ /**
+ * 通報の通知先を編集
+ */
+ "modifyRecipient": string;
+ /**
+ * 通知先の種類
+ */
+ "recipientType": string;
+ "_recipientType": {
+ /**
+ * メール
+ */
+ "mail": string;
+ /**
+ * Webhook
+ */
+ "webhook": string;
+ "_captions": {
+ /**
+ * モデレーター権限を持つユーザーのメールアドレスに通知を送ります(通報を受けた時のみ)
+ */
+ "mail": string;
+ /**
+ * 指定したSystemWebhookに通知を送ります(通報を受けた時と通報を解決した時にそれぞれ発信)
+ */
+ "webhook": string;
+ };
+ };
+ /**
+ * キーワード
+ */
+ "keywords": string;
+ /**
+ * 通知先ユーザー
+ */
+ "notifiedUser": string;
+ /**
+ * 使用するWebhook
+ */
+ "notifiedWebhook": string;
+ /**
+ * 通知先を削除しますか?
+ */
+ "deleteConfirm": string;
+ };
};
"_moderationLogTypes": {
/**
@@ -9461,6 +9926,14 @@ export interface Locale extends ILocale {
* 通報を解決
*/
"resolveAbuseReport": string;
+ /**
+ * 通報を転送
+ */
+ "forwardAbuseReport": string;
+ /**
+ * 通報のモデレーションノート更新
+ */
+ "updateAbuseReportNote": string;
/**
* 招待コードを作成
*/
@@ -9497,6 +9970,46 @@ export interface Locale extends ILocale {
* ユーザーのバナーを解除
*/
"unsetUserBanner": string;
+ /**
+ * SystemWebhookを作成
+ */
+ "createSystemWebhook": string;
+ /**
+ * SystemWebhookを更新
+ */
+ "updateSystemWebhook": string;
+ /**
+ * SystemWebhookを削除
+ */
+ "deleteSystemWebhook": string;
+ /**
+ * 通報の通知先を作成
+ */
+ "createAbuseReportNotificationRecipient": string;
+ /**
+ * 通報の通知先を更新
+ */
+ "updateAbuseReportNotificationRecipient": string;
+ /**
+ * 通報の通知先を削除
+ */
+ "deleteAbuseReportNotificationRecipient": string;
+ /**
+ * アカウントを削除
+ */
+ "deleteAccount": string;
+ /**
+ * ページを削除
+ */
+ "deletePage": string;
+ /**
+ * Playを削除
+ */
+ "deleteFlash": string;
+ /**
+ * ギャラリーの投稿を削除
+ */
+ "deleteGalleryPost": string;
};
"_fileViewer": {
/**
@@ -9667,7 +10180,7 @@ export interface Locale extends ILocale {
"_dataSaver": {
"_media": {
/**
- * メディアの読み込み
+ * メディアの読み込みを無効化
*/
"title": string;
/**
@@ -9677,7 +10190,7 @@ export interface Locale extends ILocale {
};
"_avatar": {
/**
- * アイコン画像
+ * アイコン画像のアニメーションを無効化
*/
"title": string;
/**
@@ -9687,7 +10200,7 @@ export interface Locale extends ILocale {
};
"_urlPreview": {
/**
- * URLプレビューのサムネイル
+ * URLプレビューのサムネイルを非表示
*/
"title": string;
/**
@@ -9697,7 +10210,7 @@ export interface Locale extends ILocale {
};
"_code": {
/**
- * コードハイライト
+ * コードハイライトを非表示
*/
"title": string;
/**
@@ -9972,6 +10485,100 @@ export interface Locale extends ILocale {
*/
"loop": string;
};
+ "_contextMenu": {
+ /**
+ * コンテキストメニュー
+ */
+ "title": string;
+ /**
+ * アプリケーション
+ */
+ "app": string;
+ /**
+ * Shiftキーでアプリケーション
+ */
+ "appWithShift": string;
+ /**
+ * ブラウザのUI
+ */
+ "native": string;
+ };
+ "_embedCodeGen": {
+ /**
+ * 埋め込みコードをカスタマイズ
+ */
+ "title": string;
+ /**
+ * ヘッダーを表示
+ */
+ "header": string;
+ /**
+ * 自動で続きを読み込む(非推奨)
+ */
+ "autoload": string;
+ /**
+ * 高さの最大値
+ */
+ "maxHeight": string;
+ /**
+ * 0で最大値の設定が無効になります。ウィジェットが縦に伸び続けるのを防ぐために、何らかの値に指定してください。
+ */
+ "maxHeightDescription": string;
+ /**
+ * 高さの最大値制限が無効(0)になっています。これが意図した変更ではない場合は、高さの最大値を何らかの値に設定してください。
+ */
+ "maxHeightWarn": string;
+ /**
+ * プレビュー画面で表示可能な範囲を超えたため、実際に埋め込んだ際とは表示が異なります。
+ */
+ "previewIsNotActual": string;
+ /**
+ * 角丸にする
+ */
+ "rounded": string;
+ /**
+ * 外枠に枠線をつける
+ */
+ "border": string;
+ /**
+ * プレビューに反映
+ */
+ "applyToPreview": string;
+ /**
+ * 埋め込みコードを作成
+ */
+ "generateCode": string;
+ /**
+ * コードが生成されました
+ */
+ "codeGenerated": string;
+ /**
+ * 生成されたコードをウェブサイトに貼り付けてご利用ください。
+ */
+ "codeGeneratedDescription": string;
+ };
+ "_selfXssPrevention": {
+ /**
+ * 警告
+ */
+ "warning": string;
+ /**
+ * 「この画面に何か貼り付けろ」はすべて詐欺です。
+ */
+ "title": string;
+ /**
+ * ここに何かを貼り付けると、悪意のあるユーザーにアカウントを乗っ取られたり、個人情報を盗まれたりする可能性があります。
+ */
+ "description1": string;
+ /**
+ * 貼り付けようとしているものが何なのかを正確に理解していない場合は、%c今すぐ作業を中止してこのウィンドウを閉じてください。
+ */
+ "description2": string;
+ /**
+ * 詳しくはこちらをご確認ください。 {link}
+ */
+ "description3": ParameterizedString<"link">;
+ };
}
declare const locales: {
[lang: string]: Locale;
diff --git a/locales/index.js b/locales/index.js
index 650e552337..091d216dee 100644
--- a/locales/index.js
+++ b/locales/index.js
@@ -15,6 +15,7 @@ const merge = (...args) => args.reduce((a, c) => ({
const languages = [
'ar-SA',
+ 'ca-ES',
'cs-CZ',
'da-DK',
'de-DE',
@@ -52,7 +53,11 @@ const primaries = {
const clean = (text) => text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), '');
export function build() {
- const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(new URL(`${c}.yml`, import.meta.url), 'utf-8'))) || {}, a), {});
+ // vitestの挙動を調整するため、一度ローカル変数化する必要がある
+ // https://github.com/vitest-dev/vitest/issues/3988#issuecomment-1686599577
+ // https://github.com/misskey-dev/misskey/pull/14057#issuecomment-2192833785
+ const metaUrl = import.meta.url;
+ const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(new URL(`${c}.yml`, metaUrl), 'utf-8'))) || {}, a), {});
// 空文字列が入ることがあり、フォールバックが動作しなくなるのでプロパティごと消す
const removeEmpty = (obj) => {
diff --git a/locales/it-IT.yml b/locales/it-IT.yml
index 1d12a62cca..8fb6dcd6f2 100644
--- a/locales/it-IT.yml
+++ b/locales/it-IT.yml
@@ -1,6 +1,6 @@
---
_lang_: "Italiano"
-headlineMisskey: "Rete collegata tramite note"
+headlineMisskey: "Rete collegata tramite Note"
introMisskey: "Eccoci! Misskey è un servizio di microblogging decentralizzato, libero e aperto. \n\n📡 Puoi pubblicare «Note» per condividere ciò che sta succedendo o per dire a tutti qualcosa su di te. \n\n👍 Puoi reagire inviando emoji rapidi alle «Note» provenienti da altri profili nel Fediverso.\n\n🚀 Esplora un nuovo mondo insieme a noi!"
poweredByMisskeyDescription: "{name} è uno dei servizi (chiamati istanze) che utilizzano la piattaforma open source Misskey."
monthAndDay: "{day}/{month}"
@@ -8,6 +8,9 @@ search: "Cerca"
notifications: "Notifiche"
username: "Nome utente"
password: "Password"
+initialPasswordForSetup: "Password iniziale, per avviare le impostazioni"
+initialPasswordIsIncorrect: "Password iniziale, sbagliata."
+initialPasswordForSetupDescription: "Se hai installato Misskey di persona, usa la password che hai indicato nel file di configurazione.\nSe stai utilizzando un servizio di hosting Misskey, usa la password fornita dal gestore.\nSe non hai una password preimpostata, lascia il campo vuoto e continua."
forgotPassword: "Hai dimenticato la password?"
fetchingAsApObject: "Recuperando dal Fediverso..."
ok: "OK"
@@ -60,11 +63,12 @@ copyFileId: "Copia ID del file"
copyFolderId: "Copia ID della cartella"
copyProfileUrl: "Copia URL del profilo"
searchUser: "Cerca profilo"
+searchThisUsersNotes: "Cerca le sue Note"
reply: "Rispondi"
loadMore: "Mostra di più"
showMore: "Espandi"
showLess: "Comprimi"
-youGotNewFollower: "Adesso ti segue"
+youGotNewFollower: "Hai un nuovo Follower"
receiveFollowRequest: "Hai ricevuto una richiesta di follow"
followRequestAccepted: "Ha accettato la tua richiesta di follow"
mention: "Menzioni"
@@ -76,14 +80,14 @@ export: "Esporta"
files: "Allegati"
download: "Scarica"
driveFileDeleteConfirm: "Vuoi davvero eliminare il file \"{name}\", e le Note a cui è stato allegato?"
-unfollowConfirm: "Vuoi davvero smettere di seguire {name}?"
+unfollowConfirm: "Vuoi davvero togliere il Following a {name}?"
exportRequested: "Hai richiesto un'esportazione, e potrebbe volerci tempo. Quando sarà compiuta, il file verrà aggiunto direttamente al Drive."
importRequested: "Hai richiesto un'importazione. Potrebbe richiedere un po' di tempo."
lists: "Liste"
noLists: "Nessuna lista"
note: "Nota"
notes: "Note"
-following: "Follow"
+following: "Following"
followers: "Follower"
followsYou: "Follower"
createList: "Aggiungi una nuova lista"
@@ -102,17 +106,20 @@ defaultNoteVisibility: "Privacy predefinita delle note"
follow: "Segui"
followRequest: "Richiesta di follow"
followRequests: "Richieste di follow"
-unfollow: "Smetti di seguire"
+unfollow: "Togli Following"
followRequestPending: "Richiesta in approvazione"
enterEmoji: "Inserisci emoji"
renote: "Rinota"
unrenote: "Elimina la Rinota"
renoted: "Rinotata!"
+renotedToX: "Rinota da {name}."
cantRenote: "È impossibile rinotare questa nota."
cantReRenote: "È impossibile rinotare una Rinota."
quote: "Citazione"
inChannelRenote: "Rinota nel canale"
inChannelQuote: "Cita nel canale"
+renoteToChannel: "Rinota al canale"
+renoteToOtherChannel: "Rinota a un altro canale"
pinnedNote: "Nota in primo piano"
pinned: "Fissa sul profilo"
you: "Tu"
@@ -151,6 +158,7 @@ editList: "Modifica Lista"
selectChannel: "Seleziona canale"
selectAntenna: "Scegli un'antenna"
editAntenna: "Modifica Antenna"
+createAntenna: "Crea Antenna"
selectWidget: "Seleziona il riquadro"
editWidgets: "Modifica i riquadri"
editWidgetsExit: "Conferma le modifiche"
@@ -177,16 +185,21 @@ addAccount: "Aggiungi profilo"
reloadAccountsList: "Ricarica l'elenco dei profili"
loginFailed: "Accesso non riuscito"
showOnRemote: "Leggi sull'istanza remota"
+continueOnRemote: "Continua da remoto"
+chooseServerOnMisskeyHub: "Scegli l'istanza sul sito Misskey Hub"
+specifyServerHost: "Indica l'indirizzo dell'istanza"
+inputHostName: "Digita il nome del dominio "
general: "Generali"
wallpaper: "Sfondo"
setWallpaper: "Imposta sfondo"
removeWallpaper: "Elimina lo sfondo"
searchWith: "Cerca: {q}"
youHaveNoLists: "Non hai ancora creato nessuna lista"
-followConfirm: "Vuoi seguire {name}?"
+followConfirm: "Confermi il Following a {name}?"
proxyAccount: "Profilo proxy"
proxyAccountDescription: "Un profilo proxy funziona come follower per i profili remoti, sotto certe condizioni. Ad esempio, quando un profilo locale ne inserisce uno remoto in una lista (senza seguirlo), se nessun altro segue quel profilo remoto, le attività non possono essere distribuite. Dunque, il profilo proxy le seguirà per tutti."
host: "Host"
+selectSelf: "Segli me"
selectUser: "Seleziona profilo"
recipient: "Destinatario"
annotation: "Annotazione preventiva"
@@ -202,6 +215,7 @@ perDay: "giornaliero"
stopActivityDelivery: "Interrompi la distribuzione di attività"
blockThisInstance: "Bloccare l'istanza"
silenceThisInstance: "Silenziare l'istanza"
+mediaSilenceThisInstance: "Silenzia i media dell'istanza"
operations: "Operazioni"
software: "Software"
version: "Versione"
@@ -223,6 +237,10 @@ blockedInstances: "Istanze bloccate"
blockedInstancesDescription: "Elenca le istanze che vuoi bloccare, una per riga. Esse non potranno più interagire con la tua istanza."
silencedInstances: "Istanze silenziate"
silencedInstancesDescription: "Elenca i nomi host delle istanze che vuoi silenziare. Tutti i profili nelle istanze silenziate vengono trattati come tali. Possono solo inviare richieste di follow e menzionare soltanto i profili locali che seguono. Le istanze bloccate non sono interessate."
+mediaSilencedInstances: "Istanze coi media silenziati"
+mediaSilencedInstancesDescription: "Elenca i nomi host delle istanze di cui vuoi silenziare i media, uno per riga. Tutti gli allegati dei profili nelle istanze silenziate per via degli allegati espliciti, verranno impostati come tali, le emoji personalizzate non saranno disponibili. Le istanze bloccate sono escluse."
+federationAllowedHosts: "Server a cui consentire la federazione"
+federationAllowedHostsDescription: "Indica gli host dei server a cui è consentita la federazione, uno per ogni linea."
muteAndBlock: "Silenziare e bloccare"
mutedUsers: "Profili silenziati"
blockedUsers: "Profili bloccati"
@@ -245,7 +263,7 @@ all: "Tutte"
subscribing: "Iscrizione"
publishing: "Pubblicazione"
notResponding: "Nessuna risposta"
-instanceFollowing: "Seguiti dall'istanza"
+instanceFollowing: "Istanza Following"
instanceFollowers: "Follower dell'istanza"
instanceUsers: "Profili nell'istanza"
changePassword: "Aggiorna Password"
@@ -313,6 +331,7 @@ selectFile: "Scelta allegato"
selectFiles: "Scelta allegato"
selectFolder: "Seleziona cartella"
selectFolders: "Seleziona cartella"
+fileNotSelected: "Nessun file selezionato"
renameFile: "Rinomina file"
folderName: "Nome della cartella"
createFolder: "Nuova cartella"
@@ -320,6 +339,7 @@ renameFolder: "Rinomina cartella"
deleteFolder: "Elimina cartella"
folder: "Cartella"
addFile: "Allega"
+showFile: "Visualizza file"
emptyDrive: "Il Drive è vuoto"
emptyFolder: "La cartella è vuota"
unableToDelete: "Eliminazione impossibile"
@@ -434,6 +454,7 @@ totpDescription: "Puoi autenticarti inserendo un codice OTP tramite la tua App d
moderator: "Moderatore"
moderation: "moderazione"
moderationNote: "Promemoria di moderazione"
+moderationNoteDescription: "Puoi scrivere promemoria condivisi solo tra moderatori."
addModerationNote: "Aggiungi promemoria di moderazione"
moderationLogs: "Cronologia di moderazione"
nUsersMentioned: "{n} profili ne parlano"
@@ -441,7 +462,7 @@ securityKeyAndPasskey: "Chiave di sicurezza e accesso"
securityKey: "Chiave di sicurezza"
lastUsed: "Ultima attività"
lastUsedAt: "Uso più recente: {t}"
-unregister: "Annulla l'iscrizione"
+unregister: "Rimuovi autenticazione a due fattori (2FA/MFA)"
passwordLessLogin: "Accedi senza password"
passwordLessLoginDescription: "Accedi senza password, usando la chiave di sicurezza"
resetPassword: "Ripristina la password"
@@ -468,10 +489,12 @@ retype: "Conferma"
noteOf: "Note di {user}"
quoteAttached: "Citazione allegata"
quoteQuestion: "Vuoi aggiungere una citazione?"
+attachAsFileQuestion: "Il testo copiato eccede le dimensioni, vuoi allegarlo?"
noMessagesYet: "Ancora nessuna chat"
newMessageExists: "Hai ricevuto un nuovo messaggio"
onlyOneFileCanBeAttached: "È possibile allegare al messaggio soltanto uno file"
signinRequired: "Occorre avere un profilo registrato su questa istanza"
+signinOrContinueOnRemote: "Per continuare, devi accedere alla tua istanza o registrarti su questa e poi accedere"
invitations: "Invita"
invitationCode: "Codice di invito"
checking: "Confermando"
@@ -493,7 +516,10 @@ uiLanguage: "Lingua di visualizzazione dell'interfaccia"
aboutX: "Informazioni su {x}"
emojiStyle: "Stile emoji"
native: "Nativo"
-disableDrawer: "Non mostrare il menù sul drawer"
+menuStyle: "Stile menu"
+style: "Stile"
+drawer: "Drawer"
+popup: "Popup"
showNoteActionsOnlyHover: "Mostra le azioni delle Note solo al passaggio del mouse"
showReactionsCount: "Visualizza il numero di reazioni su una nota"
noHistory: "Nessuna cronologia"
@@ -549,7 +575,7 @@ deleteAll: "Cancella cronologia"
showFixedPostForm: "Visualizzare la finestra di pubblicazione in cima alla timeline"
showFixedPostFormInChannel: "Per i canali, mostra il modulo di pubblicazione in cima alla timeline"
withRepliesByDefaultForNewlyFollowed: "Quando segui nuovi profili, includi le risposte in TL come impostazione predefinita"
-newNoteRecived: "Nuove note da leggere"
+newNoteRecived: "Nuove Note da leggere"
sounds: "Impostazioni suoni"
sound: "Suono"
listen: "Ascolta"
@@ -576,6 +602,8 @@ ascendingOrder: "Aumenta"
descendingOrder: "Diminuisce"
scratchpad: "ScratchPad"
scratchpadDescription: "Lo Scratchpad offre un ambiente per esperimenti di AiScript. È possibile scrivere, eseguire e confermare i risultati dell'interazione del codice con Misskey."
+uiInspector: "UI Inspector"
+uiInspectorDescription: "Puoi visualizzare un elenco di elementi UI presenti in memoria. I componenti dell'interfaccia utente vengono generati dalle funzioni Ui:C:."
output: "Uscita"
script: "Script"
disablePagesScript: "Disabilita AiScript nelle pagine"
@@ -587,7 +615,7 @@ unsetUserBannerConfirm: "Vuoi davvero rimuovere l'intestazione dal profilo?"
deleteAllFiles: "Elimina tutti i file"
deleteAllFilesConfirm: "Vuoi davvero eliminare tutti i file?"
removeAllFollowing: "Annulla tutti i follow"
-removeAllFollowingDescription: "Cancella tutti i follows del server {host}. Per favore, esegui se, ad esempio, l'istanza non esiste più."
+removeAllFollowingDescription: "Togli il Following a tutti i profili su {host}. Utile, ad esempio, quando l'istanza non esiste più."
userSuspended: "L'utente è in sospensione"
userSilenced: "Profilo silenziato"
yourAccountSuspendedTitle: "Questo profilo è sospeso"
@@ -660,7 +688,7 @@ hardWordMute: "Filtro parole forte"
regexpError: "errore regex"
regexpErrorDescription: "Si è verificato un errore nell'espressione regolare alla riga {line} della parola muta {tab}:"
instanceMute: "Silenziare l'istanza"
-userSaysSomething: "{name} ha parlato"
+userSaysSomething: "{name} ha detto qualcosa"
makeActive: "Attiva"
display: "Visualizza"
copy: "Copia"
@@ -675,7 +703,7 @@ notificationSetting: "Impostazioni notifiche"
notificationSettingDesc: "Seleziona il tipo di notifiche da visualizzare."
useGlobalSetting: "Usa impostazioni generali"
useGlobalSettingDesc: "Quando attiva, verranno utilizzate le impostazioni notifiche del profilo. Altrimenti si possono segliere impostazioni personalizzate."
-other: "Ulteriori"
+other: "Eccetera"
regenerateLoginToken: "Genera di nuovo un token di connessione"
regenerateLoginTokenDescription: "Genera un nuovo token di autenticazione. Solitamente questa operazione non è necessaria: quando si genera un nuovo token, tutti i dispositivi vanno disconnessi."
theKeywordWhenSearchingForCustomEmoji: "Questa sarà la parola chiave durante la ricerca di emoji personalizzate"
@@ -692,10 +720,7 @@ abuseReported: "La segnalazione è stata inviata. Grazie."
reporter: "il corrispondente"
reporteeOrigin: "Segnalazione a"
reporterOrigin: "Segnalazione da"
-forwardReport: "Inoltro di un report a un'istanza remota."
-forwardReportIsAnonymous: "L'istanza remota non vedrà le tue informazioni, apparirai come profilo di sistema, anonimo."
send: "Inviare"
-abuseMarkAsResolved: "Contrassegna la segnalazione come risolta"
openInNewTab: "Apri in una nuova scheda"
openInSideView: "Apri in vista laterale"
defaultNavigationBehaviour: "Navigazione preimpostata"
@@ -722,7 +747,7 @@ repliesCount: "Numero di risposte inviate"
renotesCount: "Numero di note che hai ricondiviso"
repliedCount: "Numero di risposte ricevute"
renotedCount: "Numero delle tue note ricondivise"
-followingCount: "Numero di profili seguiti"
+followingCount: "Numero di Following"
followersCount: "Numero di profili che ti seguono"
sentReactionsCount: "Numero di reazioni inviate"
receivedReactionsCount: "Numero di reazioni ricevute"
@@ -817,7 +842,7 @@ onlineStatus: "Stato di connessione"
hideOnlineStatus: "Modalità invisibile"
hideOnlineStatusDescription: "Attivando questa opzione potresti ridurre l'usabilità di alcune funzioni, come la ricerca."
online: "Online"
-active: "Attività"
+active: "Attivo"
offline: "Offline"
notRecommended: "Sconsigliato"
botProtection: "Protezione contro i bot"
@@ -832,6 +857,7 @@ administration: "Gestione"
accounts: "Profilo"
switch: "Cambia"
noMaintainerInformationWarning: "Mancano le informazioni sull'amministratore."
+noInquiryUrlWarning: "Non è stata impostata la URL di contatto"
noBotProtectionWarning: "Non è stata impostata alcuna protezione dai Bot"
configure: "Imposta"
postToGallery: "Pubblicare nella galleria"
@@ -875,8 +901,8 @@ pubSub: "Publish/Subscribe del profilo"
lastCommunication: "La comunicazione più recente"
resolved: "Risolto"
unresolved: "Non risolto"
-breakFollow: "Impedire di seguirmi"
-breakFollowConfirm: "Vuoi davvero che questo profilo smetta di seguirti?"
+breakFollow: "Rimuovi Follower"
+breakFollowConfirm: "Vuoi davvero togliere questo Follower?"
itsOn: "Abilitato"
itsOff: "Disabilitato"
on: "Acceso"
@@ -891,11 +917,12 @@ makeReactionsPublicDescription: "La lista delle reazioni che avete fatto è a di
classic: "Classico"
muteThread: "Silenziare conversazione"
unmuteThread: "Riattiva la conversazione"
-followingVisibility: "Visibilità dei profili seguiti"
+followingVisibility: "Visibilità dei Following"
followersVisibility: "Visibilità dei profili che ti seguono"
continueThread: "Altre conversazioni"
deleteAccountConfirm: "Così verrà eliminato il profilo. Vuoi procedere?"
incorrectPassword: "La password è errata."
+incorrectTotp: "Il codice OTP è sbagliato, oppure scaduto."
voteConfirm: "Votare per「{choice}」?"
hide: "Nascondere"
useDrawerReactionPickerForMobile: "Mostra sul drawer da dispositivo mobile"
@@ -920,6 +947,9 @@ oneHour: "1 ora"
oneDay: "1 giorno"
oneWeek: "1 settimana"
oneMonth: "Un mese"
+threeMonths: "3 mesi"
+oneYear: "1 anno"
+threeDays: "3 giorni"
reflectMayTakeTime: "Potrebbe essere necessario un po' di tempo perché ciò abbia effetto."
failedToFetchAccountInformation: "Impossibile recuperare le informazioni sul profilo"
rateLimitExceeded: "Superato il limite di richieste."
@@ -938,7 +968,7 @@ driveCapOverrideLabel: "Modificare la capienza del Drive per questo profilo"
driveCapOverrideCaption: "Se viene specificato meno di 0, viene annullato."
requireAdminForView: "Per visualizzarli, è necessario aver effettuato l'accesso con un profilo amministratore."
isSystemAccount: "Questi profili vengono creati e gestiti automaticamente dal sistema"
-typeToConfirm: "Per eseguire questa operazione, digitare {x}"
+typeToConfirm: "Digita {x} per continuare"
deleteAccount: "Eliminazione profilo"
document: "Documento"
numberOfPageCache: "Numero di pagine cache"
@@ -993,7 +1023,7 @@ neverShow: "Non mostrare più"
remindMeLater: "Rimanda"
didYouLikeMisskey: "Ti piace Misskey?"
pleaseDonate: "Misskey è il software libero utilizzato su {host}. Offrendo una donazione è più facile continuare a svilupparlo!"
-correspondingSourceIsAvailable: ""
+correspondingSourceIsAvailable: "Il codice sorgente corrispondente è disponibile su {anchor}."
roles: "Ruoli"
role: "Ruolo"
noRole: "Ruolo non trovato"
@@ -1021,6 +1051,7 @@ thisPostMayBeAnnoyingHome: "Pubblica sulla timeline principale"
thisPostMayBeAnnoyingCancel: "Annulla"
thisPostMayBeAnnoyingIgnore: "Pubblica lo stesso"
collapseRenotes: "Comprimi le Rinota già viste"
+collapseRenotesDescription: "Comprimi le Note con cui hai già interagito."
internalServerError: "Errore interno del server"
internalServerErrorDescription: "Si è verificato un errore imprevisto all'interno del server"
copyErrorInfo: "Copia le informazioni sull'errore"
@@ -1059,6 +1090,7 @@ retryAllQueuesConfirmTitle: "Vuoi ritentare adesso?"
retryAllQueuesConfirmText: "Potrebbe sovraccaricare il server temporaneamente."
enableChartsForRemoteUser: "Abilita i grafici per i profili remoti"
enableChartsForFederatedInstances: "Abilita i grafici per le istanze federate"
+enableStatsForFederatedInstances: "Informazioni statistiche sui server federati"
showClipButtonInNoteFooter: "Aggiungi il bottone Clip tra le azioni delle Note"
reactionsDisplaySize: "Grandezza delle reazioni"
limitWidthOfReaction: "Limita la larghezza delle reazioni e ridimensionale"
@@ -1094,16 +1126,21 @@ preservedUsernames: "Nomi utente riservati"
preservedUsernamesDescription: "Elenca, uno per linea, i nomi utente che non possono essere registrati durante la creazione del profilo. La restrizione non si applica agli amministratori. Inoltre, i profili già registrati sono esenti."
createNoteFromTheFile: "Crea Nota da questo file"
archive: "Archivio"
+archived: "Archiviato"
+unarchive: "Annulla archiviazione"
channelArchiveConfirmTitle: "Vuoi davvero archiviare {name}?"
channelArchiveConfirmDescription: "Un canale archiviato non compare nell'elenco canali, nemmeno nei risultati di ricerca. Non può ricevere nemmeno nuove Note."
thisChannelArchived: "Questo canale è stato archiviato."
displayOfNote: "Visualizzazione delle Note"
initialAccountSetting: "Impostazioni iniziali del profilo"
-youFollowing: "Seguiti"
+youFollowing: "Following"
preventAiLearning: "Impedisci l'apprendimento della IA"
preventAiLearningDescription: "Aggiungendo il campo \"noai\" alla risposta HTML, si indica ai Robot esterni di non usare testi e allegati per addestrare sistemi di Machine Learning (IA predittiva/generativa). Anche se è impossibile sapere se la richiesta venga onorata o semplicemente ignorata."
options: "Opzioni del ruolo"
specifyUser: "Profilo specifico"
+lookupConfirm: "Vuoi davvero richiedere informazioni?"
+openTagPageConfirm: "Vuoi davvero aprire la pagina dell'hashtag?"
+specifyHost: "Specifica l'host"
failedToPreviewUrl: "Anteprima non disponibile"
update: "Aggiorna"
rolesThatCanBeUsedThisEmojiAsReaction: "Ruoli che possono usare questa emoji come reazione"
@@ -1233,10 +1270,63 @@ useNativeUIForVideoAudioPlayer: "Riprodurre audio/video usando le funzionalità
keepOriginalFilename: "Mantieni il nome file originale"
keepOriginalFilenameDescription: "Disattivandola, i file verranno caricati usando nomi casuali."
noDescription: "Manca la descrizione"
+alwaysConfirmFollow: "Richiedi conferma per i Follow"
+inquiry: "Contattaci"
+tryAgain: "Per favore riprova"
+confirmWhenRevealingSensitiveMedia: "Richiedi conferma prima di mostrare gli allegati espliciti"
+sensitiveMediaRevealConfirm: "Questo allegato è esplicito, vuoi vederlo?"
+createdLists: "Liste create"
+createdAntennas: "Antenne create"
+fromX: "Da {x}"
+genEmbedCode: "Ottieni il codice di incorporamento"
+noteOfThisUser: "Elenco di Note di questo profilo"
+clipNoteLimitExceeded: "Non è possibile aggiungere ulteriori Note a questa Clip."
+performance: "Prestazioni"
+modified: "Modificato"
+discard: "Scarta"
+thereAreNChanges: "Ci sono {n} cambiamenti"
+signinWithPasskey: "Accedi con passkey"
+unknownWebAuthnKey: "Questa è una passkey sconosciuta."
+passkeyVerificationFailed: "La verifica della passkey non è riuscita."
+passkeyVerificationSucceededButPasswordlessLoginDisabled: "La verifica della passkey è riuscita, ma l'accesso senza password è disabilitato."
+messageToFollower: "Messaggio ai follower"
+target: "Riferimento"
+testCaptchaWarning: "Questa funzione è destinata al test CAPTCHA. Da non utilizzare in ambiente di produzione."
+prohibitedWordsForNameOfUser: "Parole proibite (nome utente)"
+prohibitedWordsForNameOfUserDescription: "Il sistema rifiuta di rinominare un utente, se il nome contiene qualsiasi parola nell'elenco. Sono esenti i profili con privilegi di moderazione."
+yourNameContainsProhibitedWords: "Il nome che hai scelto contiene una o più parole vietate"
+yourNameContainsProhibitedWordsDescription: "Se desideri comunque utilizzare questo nome, contatta l''amministrazione."
+thisContentsAreMarkedAsSigninRequiredByAuthor: "L'autore richiede di iscriversi per vedere il contenuto"
+lockdown: "Isolamento"
+pleaseSelectAccount: "Per favore, seleziona un profilo"
+_accountSettings:
+ requireSigninToViewContents: "Per vedere il contenuto, è necessaria l'iscrizione"
+ requireSigninToViewContentsDescription1: "Richiedere l'iscrizione per visualizzare tutte le Note e gli altri contenuti che hai creato. Probabilmente l'effetto è impedire la raccolta di informazioni da parte dei bot crawler."
+ requireSigninToViewContentsDescription2: "La visualizzazione verrà disabilitata a server che non supportano l'anteprima URL (OGP), all'incorporamento nelle pagine Web e alla citazione delle Note."
+ requireSigninToViewContentsDescription3: "Queste restrizioni potrebbero non applicarsi al contenuto federato su server remoti."
+ makeNotesFollowersOnlyBefore: "Rendi visibili solo ai Follower le Note pubblicate in precedenza"
+ makeNotesFollowersOnlyBeforeDescription: "Mentre questa funzione è abilitata, le Note antecedenti al momento impostato, saranno visibili solo ai profili Follower. Disabilitandola nuovamente, verrà ripristinata anche la visibilità pubblica della Nota."
+ makeNotesHiddenBefore: "Nascondi le Note pubblicate in precedenza"
+ makeNotesHiddenBeforeDescription: "Mentre questa funzione è abilitata, le Note antecedenti al momento impostato, saranno visibili soltanto a te (private). Disabilitandola nuovamente, verrà ripristinata anche la visibilità pubblica della Nota."
+ mayNotEffectForFederatedNotes: "Le Note già federate su server remoti potrebbero non essere modificate."
+ notesHavePassedSpecifiedPeriod: "Note antecedenti al periodo specificato"
+ notesOlderThanSpecifiedDateAndTime: "Note antecedenti al momento specificato"
+_abuseUserReport:
+ forward: "Inoltra"
+ forwardDescription: "Inoltra il report al server remoto, per mezzo di account di sistema, anonimo."
+ resolve: "Risolvi"
+ accept: "Approva"
+ reject: "Rifiuta"
+ resolveTutorial: "Se moderi una segnalazione legittima, scegli \"Approva\" per risolvere positivamente.\nSe la segnalazione non è legittima, seleziona \"Rifiuta\" per risolvere negativamente."
_delivery:
+ status: "Stato della consegna"
stop: "Sospensione"
+ resume: "Riprendi la consegna"
_type:
none: "Pubblicazione"
+ manuallySuspended: "Sospesa manualmente"
+ goneSuspended: "Sospensione server a causa dell'eliminazione"
+ autoSuspendedForNotResponding: "Sospensione del server a causa di mancata risposta"
_bubbleGame:
howToPlay: "Come giocare"
hold: "Tieni"
@@ -1255,16 +1345,16 @@ _bubbleGame:
_announcement:
forExistingUsers: "Solo ai profili attuali"
forExistingUsersDescription: "L'annuncio sarà visibile solo ai profili esistenti in questo momento. Se disabilitato, sarà visibile anche ai profili che verranno creati dopo la pubblicazione di questo annuncio."
- needConfirmationToRead: "Richiede la conferma di lettura"
- needConfirmationToReadDescription: "Sarà visualizzata una finestra di dialogo che richiede la conferma di lettura. Inoltre, non è soggetto a conferme di lettura massicce."
+ needConfirmationToRead: "Conferma di lettura obbligatoria"
+ needConfirmationToReadDescription: "I profili riceveranno una finestra di dialogo che richiede di accettare obbligatoriamente per procedere. Tale richiesta è esente da \"conferma tutte\"."
end: "Archivia l'annuncio"
tooManyActiveAnnouncementDescription: "L'esperienza delle persone può peggiorare se ci sono troppi annunci attivi. Considera anche l'archiviazione degli annunci conclusi."
readConfirmTitle: "Segnare come già letto?"
readConfirmText: "Hai già letto \"{title}˝?"
shouldNotBeUsedToPresentPermanentInfo: "Ti consigliamo di utilizzare gli annunci per pubblicare informazioni tempestive e limitate nel tempo, anziché informazioni importanti a lungo andare nel tempo, poiché potrebbero risultare difficili da ritrovare e peggiorare la fruibilità del servizio, specialmente alle nuove persone iscritte."
dialogAnnouncementUxWarn: "Ti consigliamo di usarli con cautela, poiché è molto probabile che avere più di un annuncio in stile \"finestra di dialogo\" peggiori sensibilmente la fruibilità del servizio, specialmente alle nuove persone iscritte."
- silence: "Silenziare gli annunci"
- silenceDescription: "Se attivi questa opzione, non riceverai notifiche sugli annunci, evitando di contrassegnarle come già lette."
+ silence: "Annuncio silenzioso"
+ silenceDescription: "Attivando questa opzione, non invierai la notifica, evitando che debba essere contrassegnata come già letta."
_initialAccountSetting:
accountCreated: "Il tuo profilo è stato creato!"
letsStartAccountSetup: "Per iniziare, impostiamo il tuo profilo."
@@ -1282,7 +1372,7 @@ _initialAccountSetting:
skipAreYouSure: "Vuoi davvero saltare la configurazione iniziale?"
laterAreYouSure: "Vuoi davvero rimandare la configurazione iniziale?"
_initialTutorial:
- launchTutorial: "Guarda il tutorial"
+ launchTutorial: "Inizia il tutorial"
title: "Tutorial"
wellDone: "Ottimo lavoro!"
skipAreYouSure: "Vuoi davvero interrompere il tutorial?"
@@ -1292,13 +1382,13 @@ _initialTutorial:
_note:
title: "Cosa sono le Note?"
description: "Gli status su Misskey sono chiamati \"Note\". Le Note sono elencate in ordine cronologico nelle timeline e vengono aggiornate in tempo reale."
- reply: "Puoi rispondere alle Note. Puoi anche rispondere alle risposte e continuare i dialoghi come un conversazioni."
- renote: "Puoi ri-condividere le Note, facendole rifluire sulla Timeline. Puoi anche aggiungere testo e citare altri profili."
- reaction: "Puoi aggiungere una reazione. Nella pagina successiva spiegheremo i dettagli."
- menu: "Puoi svolgere varie attività, come visualizzare i dettagli delle Note o copiare i collegamenti."
+ reply: "Puoi rispondere alle Note, alle altre risposte e dialogare in conversazioni."
+ renote: "Puoi ri-condividere le Note, ritorneranno sulla Timeline. Aggiungendo del testo, scriverai una Citazione."
+ reaction: "Puoi aggiungere una reazione. Nella pagina successiva ti spiego come."
+ menu: "Per altre attività, ad esempio, vedere i dettagli delle Note o copiare i collegamenti."
_reaction:
title: "Cosa sono le Reazioni?"
- description: "Puoi reagire alle Note. Le sensazioni che non si riescono a trasmettere con i \"Mi piace\" si possono esprimere facilmente inviando una reazione."
+ description: "Reazioni alle Note. Le sensazioni che non si possono descrivere con \"Mi piace\" si esprimono facilmente con le reazioni."
letsTryReacting: "Puoi aggiungere una Reazione cliccando il bottone \"+\" (più) della relativa Nota. Prova ad aggiungerne una a questa Nota di esempio!"
reactToContinue: "Aggiungere la Reazione ti consentirà di procedere col tutorial."
reactNotification: "Quando qualcuno reagisce alle tue Note, ricevi una notifica in tempo reale."
@@ -1306,12 +1396,12 @@ _initialTutorial:
_timeline:
title: "Come funziona la Timeline"
description1: "Misskey fornisce alcune Timeline (sequenze cronologiche di Note). Una di queste potrebbe essere stata disattivata dagli amministratori."
- home: "le Note provenienti dai profili che segui (follow)."
+ home: "le Note provenienti dai profili che segui (Following)."
local: "tutte le Note pubblicate dai profili di questa istanza."
social: "sia le Note della Timeline Home che quelle della Timeline Locale, insieme!"
global: "le Note da pubblicate da tutte le altre istanze federate con la nostra."
description2: "Nella parte superiore dello schermo, puoi scegliere una Timeline o l'altra in qualsiasi momento."
- description3: "Ci sono anche sequenze temporali di elenchi, sequenze temporali di canali, ecc. Per ulteriori dettagli, consultare il {link}.\nPuoi vedere anche Timeline delle liste di profili (se ne hai create), canali, ecc... Per i dettagli, visita {link}."
+ description3: "Ci sono anche sequenze temporali di elenchi, sequenze temporali di canali, ecc. Per ulteriori dettagli, consultare la {link}.\nPuoi vedere anche Timeline delle liste di profili (se ne hai create), canali, ecc... Per i dettagli, c'è la {link}."
_postNote:
title: "La Nota e le sue impostazioni"
description1: "Quando scrivi una Nota su Misskey, hai a disposizione varie opzioni. Il modulo di invio è simile a questo."
@@ -1344,7 +1434,7 @@ _initialTutorial:
title: "Il tutorial è finito! 🎉"
description: "Queste sono solamente alcune delle funzionalità principali di Misskey. Per ulteriori informazioni, {link}."
_timelineDescription:
- home: "Nella Timeline Home, la tua cronologia principale, puoi vedere le Note provenienti dai profili che segui (follow)."
+ home: "Nella Timeline Home, la tua cronologia principale, puoi vedere le Note provenienti dai profili che segui (Following)."
local: "La Timeline Locale, è una cronologia di Note pubblicate da tutti i profili iscritti su questo server."
social: "La Timeline Sociale, unisce in ordine cronologico l'elenco di Note presenti nella Timeline Home e quella Locale."
global: "La Timeline Federata ti consente di vedere le Note pubblicate dai profili di tutti gli altri server federati a questo."
@@ -1362,11 +1452,15 @@ _serverSettings:
fanoutTimelineDescription: "Attivando questa funzionalità migliori notevolmente la capacità delle Timeline di collezionare Note, riducendo il carico sul database. Tuttavia, aumenterà l'impiego di memoria RAM per Redis. Disattiva se il tuo server ha poca RAM o la funzionalità è irregolare."
fanoutTimelineDbFallback: "Elaborazione dati alternativa"
fanoutTimelineDbFallbackDescription: "Attivando l'elaborazione alternativa, verrà interrogato ulteriormente il database se la timeline non è nella cache. \nDisattivando, si può ridurre ulteriormente il carico del server, evitando l'elaborazione alternativa, ma limitando l'intervallo recuperabile delle timeline."
+ reactionsBufferingDescription: "Attivando questa opzione, puoi migliorare significativamente le prestazioni durante la creazione delle reazioni e ridurre il carico sul database. Tuttavia, aumenterà l'impiego di memoria Redis."
+ inquiryUrl: "URL di contatto"
+ inquiryUrlDescription: "Specificare l'URL al modulo di contatto, oppure le informazioni con i dati di contatto dell'amministrazione."
+ thisSettingWillAutomaticallyOffWhenModeratorsInactive: "Per prevenire SPAM, questa impostazione verrà disattivata automaticamente, se non si rileva alcuna attività di moderazione durante un certo periodo di tempo."
_accountMigration:
moveFrom: "Migra un altro profilo dentro a questo"
moveFromSub: "Crea un alias verso un altro profilo remoto"
moveFromLabel: "Profilo da cui migrare #{n}"
- moveFromDescription: "Se desideri spostare i profili follower da un altro profilo a questo, devi prima creare un alias qui. Assicurati averlo creato PRIMA di eseguire l'attività! Inserisci l'indirizzo del profilo mittente in questo modo: @persona@istanza.it"
+ moveFromDescription: "Se desideri spostare i Follower da un altro profilo a questo, devi prima creare un alias qui. Assicurati averlo creato PRIMA di eseguire l'attività! Inserisci l'indirizzo del profilo mittente in questo modo: @persona@istanza.it"
moveTo: "Migrare questo profilo verso un un altro"
moveToLabel: "Profilo verso cui migrare"
moveCannotBeUndone: "La migrazione è irreversibile, non può essere interrotta o annullata."
@@ -1375,7 +1469,7 @@ _accountMigration:
startMigration: "Avvia la migrazione"
migrationConfirm: "Vuoi davvero migrare questo profilo su {account}? L'azione è irreversibile e non potrai più utilizzare questo profilo nel suo stato originale.\nInoltre, assicurati di aver già creato un alias sull'account a cui ti stai trasferendo."
movedAndCannotBeUndone: "Il tuo profilo è stato migrato.\nLa migrazione non può essere annullata."
- postMigrationNote: "Questo profilo smetterà di seguire gli altri profili remoti a 24 ore dal termine della migrazione.\nSia i Follow che i Follower scenderanno a zero. I tuoi follower saranno comunque in grado di vedere le Note per soli follower, poiché non smetteranno di seguirti."
+ postMigrationNote: "Questo profilo smetterà di seguire gli altri profili remoti a 24 ore dal termine della migrazione.\nSia i Following che i Follower scenderanno a zero. I tuoi Follower saranno comunque in grado di vedere le Note per soli Follower, poiché non smetteranno di seguirti."
movedTo: "Profilo verso cui migrare"
_achievements:
earnedAt: "Data di conseguimento"
@@ -1678,6 +1772,7 @@ _role:
canManageAvatarDecorations: "Gestisce le decorazioni di immagini del profilo"
driveCapacity: "Capienza del Drive"
alwaysMarkNsfw: "Impostare sempre come esplicito (NSFW)"
+ canUpdateBioMedia: "Può aggiornare foto profilo e di testata"
pinMax: "Quantità massima di Note in primo piano"
antennaMax: "Quantità massima di Antenne"
wordMuteMax: "Lunghezza massima del filtro parole"
@@ -1692,10 +1787,20 @@ _role:
canSearchNotes: "Ricercare nelle Note"
canUseTranslator: "Tradurre le Note"
avatarDecorationLimit: "Numero massimo di decorazioni foto profilo installabili"
+ canImportAntennas: "Può importare Antenne"
+ canImportBlocking: "Può importare Blocchi"
+ canImportFollowing: "Può importare Following"
+ canImportMuting: "Può importare Silenziati"
+ canImportUserLists: "Può importare liste di Profili"
_condition:
roleAssignedTo: "Assegnato a ruoli manualmente"
isLocal: "Profilo locale"
isRemote: "Profilo remoto"
+ isCat: "È un gattino"
+ isBot: "È un bot"
+ isSuspended: "È sospeso"
+ isLocked: "È in stato privato"
+ isExplorable: "Autorizza la pubblicazione nei cataloghi"
createdLessThan: "Profilo creato da meno di N"
createdMoreThan: "Profilo creato da più di N"
followersLessThanOrEq: "Profilo con N follower o meno"
@@ -1757,7 +1862,7 @@ _gallery:
unlike: "Non mi piace più"
_email:
_follow:
- title: "Adesso ti segue"
+ title: "Follower aggiuntivo"
_receiveFollowRequest:
title: "Hai ricevuto una richiesta di follow"
_plugin:
@@ -1821,7 +1926,7 @@ _channel:
removeBanner: "Rimuovi intestazione"
featured: "Di tendenza"
owned: "I miei canali"
- following: "Seguiti"
+ following: "Following"
usersCount: "{n} partecipanti"
notesCount: "{n} note"
nameAndDescription: "Nome e descrizione"
@@ -1904,7 +2009,6 @@ _theme:
buttonBg: "Sfondo del pulsante"
buttonHoverBg: "Sfondo del pulsante (sorvolato)"
inputBorder: "Inquadra casella di testo"
- listItemHoverBg: "Sfondo della voce di elenco (sorvolato)"
driveFolderBg: "Sfondo della cartella di disco"
wallpaperOverlay: "Sovrapposizione dello sfondo"
badge: "Distintivo"
@@ -1916,8 +2020,6 @@ _sfx:
note: "Nota"
noteMy: "Mia nota"
notification: "Notifiche"
- antenna: "Ricezione dell'antenna"
- channel: "Notifiche di canale"
reaction: "Quando seleziono una reazione"
_soundSettings:
driveFile: "Suoni del Drive"
@@ -1926,6 +2028,7 @@ _soundSettings:
driveFileTypeWarnDescription: "Per favore, scegli un file di tipo audio"
driveFileDurationWarn: "La durata dell'audio è troppo lunga"
driveFileDurationWarnDescription: "Scegliere un audio lungo potrebbe interferire con l'uso di Misskey. Vuoi continuare lo stesso?"
+ driveFileError: "Impossibile caricare l'audio. Si prega di modificare le impostazioni"
_ago:
future: "Futuro"
justNow: "Adesso"
@@ -1989,7 +2092,7 @@ _permissions:
"read:favorites": "Visualizza i tuoi preferiti"
"write:favorites": "Gestisci i tuoi preferiti"
"read:following": "Vedi le informazioni di follow"
- "write:following": "Following di altri profili"
+ "write:following": "Aggiungere e togliere Following"
"read:messaging": "Visualizzare la chat"
"write:messaging": "Gestire la chat"
"read:mutes": "Vedi i profili silenziati"
@@ -2072,11 +2175,14 @@ _auth:
permissionAsk: "Questa app richiede le seguenti autorizzazioni:"
pleaseGoBack: "Si prega di ritornare sulla app"
callback: "Ritornando sulla app"
+ accepted: "Accesso concesso"
denied: "Accesso negato"
+ scopeUser: "Sto funzionando per il seguente profilo"
pleaseLogin: "Per favore accedi al tuo account per cambiare i permessi dell'applicazione"
+ byClickingYouWillBeRedirectedToThisUrl: "Consentendo l'accesso, si verrà reindirizzati presso questo indirizzo URL"
_antennaSources:
all: "Tutte le note"
- homeTimeline: "Note dagli utenti che segui"
+ homeTimeline: "Note dai tuoi Following"
users: "Note dagli utenti selezionati"
userList: "Note dagli utenti della lista selezionata"
userBlacklist: "Tutte le Note tranne quelle di uno o più profili specificati"
@@ -2118,7 +2224,7 @@ _widgets:
_userList:
chooseList: "Seleziona una lista"
clicker: "Cliccaggio"
- birthdayFollowings: "Chi nacque oggi"
+ birthdayFollowings: "Compleanni del giorno"
_cw:
hide: "Nascondere"
show: "Continua la lettura..."
@@ -2182,11 +2288,14 @@ _profile:
changeBanner: "Cambia intestazione"
verifiedLinkDescription: "Puoi verificare il tuo profilo mostrando una icona. Devi inserire la URL alla pagina che contiene un link al tuo profilo."
avatarDecorationMax: "Puoi aggiungere fino a {max} decorazioni."
+ followedMessage: "Messaggio, quando qualcuno ti segue"
+ followedMessageDescription: "Puoi impostare un breve messaggio da mostrare agli altri profili quando ti seguono."
+ followedMessageDescriptionForLockedAccount: "Quando approvi una richiesta di follow, verrà visualizzato questo testo."
_exportOrImport:
allNotes: "Tutte le note"
favoritedNotes: "Note preferite"
clips: "Clip"
- followingList: "Follow"
+ followingList: "Following"
muteList: "Elenco profili silenziati"
blockingList: "Elenco profili bloccati"
userLists: "Liste"
@@ -2274,6 +2383,7 @@ _pages:
eyeCatchingImageSet: "Imposta un'immagine attraente"
eyeCatchingImageRemove: "Elimina immagine attraente"
chooseBlock: "Aggiungi blocco"
+ enterSectionTitle: "Inserisci il titolo della sezione"
selectType: "Seleziona tipo"
contentBlocks: "Contenuto"
inputBlocks: "Blocchi di input"
@@ -2301,7 +2411,7 @@ _notification:
youGotReply: "{name} ti ha risposto"
youGotQuote: "{name} ha citato la tua Nota e ha detto"
youRenoted: "{name} ha rinotato"
- youWereFollowed: "Adesso ti segue"
+ youWereFollowed: "Follower aggiuntivo"
youReceivedFollowRequest: "Hai ricevuto una richiesta di follow"
yourFollowRequestAccepted: "La tua richiesta di follow è stata accettata"
pollEnded: "Risultati del sondaggio."
@@ -2319,10 +2429,12 @@ _notification:
renotedBySomeUsers: "{n} Rinota"
followedBySomeUsers: "{n} follower"
flushNotification: "Azzera le notifiche"
+ exportOfXCompleted: "Abbiamo completato l'esportazione di {x}"
+ login: "Autenticazione avvenuta"
_types:
all: "Tutto"
note: "Nuove Note"
- follow: "Nuovi profili follower"
+ follow: "Follower"
mention: "Menzioni"
reply: "Risposte"
renote: "Rinota"
@@ -2333,15 +2445,19 @@ _notification:
followRequestAccepted: "Richiesta di follow accettata"
roleAssigned: "Ruolo concesso"
achievementEarned: "Risultato raggiunto"
+ exportCompleted: "Esportazione completata"
+ login: "Accedi"
+ test: "Prova la notifica"
app: "Notifiche da applicazioni"
_actions:
- followBack: "Segui"
+ followBack: "Following ricambiato"
reply: "Rispondi"
renote: "Rinota"
_deck:
alwaysShowMainColumn: "Mostra sempre la colonna principale"
columnAlign: "Allineare colonne"
addColumn: "Aggiungi colonna"
+ newNoteNotificationSettings: "Preferenze per le notifiche di nuove Note"
configureColumn: "Impostazioni colonna"
swapLeft: "Sposta a sinistra"
swapRight: "Sposta a destra"
@@ -2380,18 +2496,42 @@ _drivecleaner:
orderByCreatedAtAsc: "Dal più vecchio al più recente"
_webhookSettings:
createWebhook: "Creazione Webhook"
+ modifyWebhook: "Modifica Webhook"
name: "Nome"
secret: "Segreto"
- events: "Quando eseguire il Webhook"
+ trigger: "Trigger"
active: "Attivo"
_events:
- follow: "Quando segui un profilo"
+ follow: "Quando aggiungi Following"
followed: "Quando ti segue un profilo"
note: "Quando pubblichi una Nota"
reply: "Quando rispondono ad una Nota"
renote: "Quando la Nota è Rinotata"
reaction: "Quando ricevo una reazione"
mention: "Quando mi menzionano"
+ _systemEvents:
+ abuseReport: "Quando arriva una segnalazione"
+ abuseReportResolved: "Quando una segnalazione è risolta"
+ userCreated: "Quando viene creato un profilo"
+ inactiveModeratorsWarning: "Quando un profilo moderatore rimane inattivo per un determinato periodo"
+ inactiveModeratorsInvitationOnlyChanged: "Quando la moderazione è rimasta inattiva per un determinato periodo e il sistema è cambiato in modalità \"solo inviti\""
+ deleteConfirm: "Vuoi davvero eliminare il Webhook?"
+ testRemarks: "Clicca il bottone a destra dell'interruttore, per provare l'invio di un webhook con dati fittizi."
+_abuseReport:
+ _notificationRecipient:
+ createRecipient: "Aggiungi destinatario della segnalazione"
+ modifyRecipient: "Modifica destinatario della segnalazione"
+ recipientType: "Tipo di notifica"
+ _recipientType:
+ mail: "Email"
+ webhook: "Webhook"
+ _captions:
+ mail: "Quando ricevi un abuso, notifica l'amministrazione via email"
+ webhook: "Spedire una notifica al SystemWebhook specificato (sia quando si riceve una segnalazione, che quando viene risolta)"
+ keywords: "Parole chiave"
+ notifiedUser: "Profili da notificare"
+ notifiedWebhook: "Webhook da usare"
+ deleteConfirm: "Vuoi davvero rimuovere il destinatario della notifica?"
_moderationLogTypes:
createRole: "Ruolo creato"
deleteRole: "Ruolo eliminato"
@@ -2420,6 +2560,8 @@ _moderationLogTypes:
markSensitiveDriveFile: "File nel Drive segnato come esplicito"
unmarkSensitiveDriveFile: "File nel Drive segnato come non esplicito"
resolveAbuseReport: "Segnalazione risolta"
+ forwardAbuseReport: "Segnalazione inoltrata"
+ updateAbuseReportNote: "Ha aggiornato la segnalazione"
createInvitation: "Genera codice di invito"
createAd: "Banner creato"
deleteAd: "Banner eliminato"
@@ -2429,6 +2571,16 @@ _moderationLogTypes:
deleteAvatarDecoration: "Eliminazione decorazione della foto profilo"
unsetUserAvatar: "Rimossa foto profilo"
unsetUserBanner: "Rimossa intestazione profilo"
+ createSystemWebhook: "Crea un SystemWebhook"
+ updateSystemWebhook: "Modifica SystemWebhook"
+ deleteSystemWebhook: "Elimina SystemWebhook"
+ createAbuseReportNotificationRecipient: "Crea destinatario per le notifiche di segnalazioni"
+ updateAbuseReportNotificationRecipient: "Aggiorna destinatario notifiche di segnalazioni"
+ deleteAbuseReportNotificationRecipient: "Elimina destinatario notifiche di segnalazioni"
+ deleteAccount: "Quando viene eliminato un profilo"
+ deletePage: "Pagina eliminata"
+ deleteFlash: "Play eliminato"
+ deleteGalleryPost: "Eliminazione pubblicazione nella Galleria"
_fileViewer:
title: "Dettagli del file"
type: "Tipo di file"
@@ -2554,7 +2706,34 @@ _urlPreviewSetting:
userAgent: "User-Agent"
userAgentDescription: "Definire con quale User-Agent si intende identificarsi durante l'acquisizione di un'anteprima. Se è vuoto, useremo il valore predefinito."
summaryProxy: "Endpoint proxy che genera l'anteprima"
+ summaryProxyDescription: "Genera anteprime utilizzando un proxy Summaly anziché Misskey."
+ summaryProxyDescription2: "I parametri sono collegano al proxy come stringa query. Se il proxy non li supporta, verranno ignorati."
_mediaControls:
pip: "Sovraimpressione"
playbackRate: "Velocità di riproduzione"
loop: "Ripetizione infinita"
+_contextMenu:
+ title: "Menu contestuale"
+ app: "Applicazione"
+ appWithShift: "Applicazione Shift+Tasto"
+ native: "Interfaccia utente del browser"
+_embedCodeGen:
+ title: "Personalizza il codice di incorporamento"
+ header: "Mostra la testata"
+ autoload: "Carica automaticamente di più (sconsigliato)"
+ maxHeight: "Altezza massima"
+ maxHeightDescription: "Specifica un valore per evitare che continui a crescere verticalmente. Il valore 0 disabilita il limite d'altezza."
+ maxHeightWarn: "L'altezza massima è disabilitata (0). Se l'effetto è indesiderato, prova a impostare l'altezza massima a un valore specifico."
+ previewIsNotActual: "Poiché supera l'intervallo che può essere visualizzato in anteprima, la visualizzazione vera e propria sarà diversa quando effettivamente incorporata."
+ rounded: "Bordo arrotondato"
+ border: "Aggiungi un bordo al contenitore"
+ applyToPreview: "Applica all'anteprima"
+ generateCode: "Crea il codice di incorporamento"
+ codeGenerated: "Codice generato"
+ codeGeneratedDescription: "Incolla il codice appena generato sul tuo sito web."
+_selfXssPrevention:
+ warning: "Avviso"
+ title: "\"Incolla qualcosa su questa schermata\" è tutta una truffa."
+ description1: "Incollando qualcosa qui, malintenzionati potrebbero prendere il controllo del tuo profilo o rubare i tuoi dati personali."
+ description2: "Se non sai esattamente cosa stai facendo, %c smetti subito e chiudi questa finestra."
+ description3: "Per favore, controlla questo collegamento per avere maggiori dettagli. {link}"
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index a89cfbd843..5d8e1a5e72 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -8,6 +8,9 @@ search: "検索"
notifications: "通知"
username: "ユーザー名"
password: "パスワード"
+initialPasswordForSetup: "初期設定開始用パスワード"
+initialPasswordIsIncorrect: "初期設定開始用のパスワードが違います。"
+initialPasswordForSetupDescription: "Misskeyを自分でインストールした場合は、設定ファイルに入力したパスワードを使用してください。\nMisskeyのホスティングサービスなどを使用している場合は、提供されたパスワードを使用してください。\nパスワードを設定していない場合は、空欄にしたまま続行してください。"
forgotPassword: "パスワードを忘れた"
fetchingAsApObject: "連合に照会中"
ok: "OK"
@@ -60,6 +63,7 @@ copyFileId: "ファイルIDをコピー"
copyFolderId: "フォルダーIDをコピー"
copyProfileUrl: "プロフィールURLをコピー"
searchUser: "ユーザーを検索"
+searchThisUsersNotes: "ユーザーのノートを検索"
reply: "返信"
loadMore: "もっと見る"
showMore: "もっと見る"
@@ -154,6 +158,7 @@ editList: "リストを編集"
selectChannel: "チャンネルを選択"
selectAntenna: "アンテナを選択"
editAntenna: "アンテナを編集"
+createAntenna: "アンテナを作成"
selectWidget: "ウィジェットを選択"
editWidgets: "ウィジェットを編集"
editWidgetsExit: "編集を終了"
@@ -180,6 +185,10 @@ addAccount: "アカウントを追加"
reloadAccountsList: "アカウントリストの情報を更新"
loginFailed: "ログインに失敗しました"
showOnRemote: "リモートで表示"
+continueOnRemote: "リモートで続行"
+chooseServerOnMisskeyHub: "Misskey Hubからサーバーを選択"
+specifyServerHost: "サーバーのドメインを直接指定"
+inputHostName: "ドメインを入力してください"
general: "全般"
wallpaper: "壁紙"
setWallpaper: "壁紙を設定"
@@ -190,6 +199,7 @@ followConfirm: "{name}をフォローしますか?"
proxyAccount: "プロキシアカウント"
proxyAccountDescription: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
host: "ホスト"
+selectSelf: "自分を選択"
selectUser: "ユーザーを選択"
recipient: "宛先"
annotation: "注釈"
@@ -205,6 +215,7 @@ perDay: "1日ごと"
stopActivityDelivery: "アクティビティの配送を停止"
blockThisInstance: "このサーバーをブロック"
silenceThisInstance: "サーバーをサイレンス"
+mediaSilenceThisInstance: "サーバーをメディアサイレンス"
operations: "操作"
software: "ソフトウェア"
version: "バージョン"
@@ -226,6 +237,10 @@ blockedInstances: "ブロックしたサーバー"
blockedInstancesDescription: "ブロックしたいサーバーのホストを改行で区切って設定します。ブロックされたサーバーは、このインスタンスとやり取りできなくなります。"
silencedInstances: "サイレンスしたサーバー"
silencedInstancesDescription: "サイレンスしたいサーバーのホストを改行で区切って設定します。サイレンスされたサーバーに所属するアカウントはすべて「サイレンス」として扱われ、フォローがすべてリクエストになります。ブロックしたインスタンスには影響しません。"
+mediaSilencedInstances: "メディアサイレンスしたサーバー"
+mediaSilencedInstancesDescription: "メディアサイレンスしたいサーバーのホストを改行で区切って設定します。メディアサイレンスされたサーバーに所属するアカウントによるファイルはすべてセンシティブとして扱われ、カスタム絵文字が使用できないようになります。ブロックしたインスタンスには影響しません。"
+federationAllowedHosts: "連合を許可するサーバー"
+federationAllowedHostsDescription: "連合を許可するサーバーのホストを改行で区切って設定します。"
muteAndBlock: "ミュートとブロック"
mutedUsers: "ミュートしたユーザー"
blockedUsers: "ブロックしたユーザー"
@@ -324,6 +339,7 @@ renameFolder: "フォルダー名を変更"
deleteFolder: "フォルダーを削除"
folder: "フォルダー"
addFile: "ファイルを追加"
+showFile: "ファイルを表示"
emptyDrive: "ドライブは空です"
emptyFolder: "フォルダーは空です"
unableToDelete: "削除できません"
@@ -438,6 +454,7 @@ totpDescription: "認証アプリを使ってワンタイムパスワードを
moderator: "モデレーター"
moderation: "モデレーション"
moderationNote: "モデレーションノート"
+moderationNoteDescription: "モデレーター間でだけ共有されるメモを記入することができます。"
addModerationNote: "モデレーションノートを追加する"
moderationLogs: "モデログ"
nUsersMentioned: "{n}人が投稿"
@@ -476,7 +493,8 @@ attachAsFileQuestion: "クリップボードのテキストが長いです。テ
noMessagesYet: "まだチャットはありません"
newMessageExists: "新しいメッセージがあります"
onlyOneFileCanBeAttached: "メッセージに添付できるファイルはひとつです"
-signinRequired: "続行する前に、サインアップまたはサインインが必要です"
+signinRequired: "続行する前に、登録またはログインが必要です"
+signinOrContinueOnRemote: "続行するには、お使いのサーバーに移動するか、このサーバーに登録・ログインする必要があります"
invitations: "招待"
invitationCode: "招待コード"
checking: "確認しています"
@@ -498,7 +516,10 @@ uiLanguage: "UIの表示言語"
aboutX: "{x}について"
emojiStyle: "絵文字のスタイル"
native: "ネイティブ"
-disableDrawer: "メニューをドロワーで表示しない"
+menuStyle: "メニューのスタイル"
+style: "スタイル"
+drawer: "ドロワー"
+popup: "ポップアップ"
showNoteActionsOnlyHover: "ノートのアクションをホバー時のみ表示する"
showReactionsCount: "ノートのリアクション数を表示する"
noHistory: "履歴はありません"
@@ -581,6 +602,8 @@ ascendingOrder: "昇順"
descendingOrder: "降順"
scratchpad: "スクラッチパッド"
scratchpadDescription: "スクラッチパッドは、AiScriptの実験環境を提供します。Misskeyと対話するコードの記述、実行、結果の確認ができます。"
+uiInspector: "UIインスペクター"
+uiInspectorDescription: "メモリ上に存在しているUIコンポーネントのインスタンスの一覧を見ることができます。UIコンポーネントはUi:C:系関数により生成されます。"
output: "出力"
script: "スクリプト"
disablePagesScript: "Pagesのスクリプトを無効にする"
@@ -692,15 +715,12 @@ abuseReports: "通報"
reportAbuse: "通報"
reportAbuseRenote: "リノートを通報"
reportAbuseOf: "{name}を通報する"
-fillAbuseReportDescription: "通報理由の詳細を記入してください。対象のノートがある場合はそのURLも記入してください。"
+fillAbuseReportDescription: "通報理由の詳細を記入してください。対象のノートやページなどがある場合はそのURLも記入してください。"
abuseReported: "内容が送信されました。ご報告ありがとうございました。"
reporter: "通報者"
reporteeOrigin: "通報先"
reporterOrigin: "通報元"
-forwardReport: "リモートサーバーに通報を転送する"
-forwardReportIsAnonymous: "リモートサーバーからはあなたの情報は見れず、匿名のシステムアカウントとして表示されます。"
send: "送信"
-abuseMarkAsResolved: "対応済みにする"
openInNewTab: "新しいタブで開く"
openInSideView: "サイドビューで開く"
defaultNavigationBehaviour: "デフォルトのナビゲーション"
@@ -765,7 +785,7 @@ left: "左"
center: "中央"
wide: "広い"
narrow: "狭い"
-reloadToApplySetting: "設定はページリロード後に反映されます。今すぐリロードしますか?"
+reloadToApplySetting: "設定はページリロード後に反映されます。"
needReloadToApply: "反映には再起動が必要です。"
showTitlebar: "タイトルバーを表示する"
clearCache: "キャッシュをクリア"
@@ -902,6 +922,7 @@ followersVisibility: "フォロワーの公開範囲"
continueThread: "さらにスレッドを見る"
deleteAccountConfirm: "アカウントが削除されます。よろしいですか?"
incorrectPassword: "パスワードが間違っています。"
+incorrectTotp: "ワンタイムパスワードが間違っているか、期限切れになっています。"
voteConfirm: "「{choice}」に投票しますか?"
hide: "隠す"
useDrawerReactionPickerForMobile: "モバイルデバイスのときドロワーで表示"
@@ -926,6 +947,9 @@ oneHour: "1時間"
oneDay: "1日"
oneWeek: "1週間"
oneMonth: "1ヶ月"
+threeMonths: "3ヶ月"
+oneYear: "1年"
+threeDays: "3日"
reflectMayTakeTime: "反映されるまで時間がかかる場合があります。"
failedToFetchAccountInformation: "アカウント情報の取得に失敗しました"
rateLimitExceeded: "レート制限を超えました"
@@ -1066,6 +1090,7 @@ retryAllQueuesConfirmTitle: "今すぐ再試行しますか?"
retryAllQueuesConfirmText: "一時的にサーバーの負荷が増大することがあります。"
enableChartsForRemoteUser: "リモートユーザーのチャートを生成"
enableChartsForFederatedInstances: "リモートサーバーのチャートを生成"
+enableStatsForFederatedInstances: "リモートサーバーの情報を取得"
showClipButtonInNoteFooter: "ノートのアクションにクリップを追加"
reactionsDisplaySize: "リアクションの表示サイズ"
limitWidthOfReaction: "リアクションの最大横幅を制限し、縮小して表示する"
@@ -1101,6 +1126,8 @@ preservedUsernames: "予約ユーザー名"
preservedUsernamesDescription: "予約するユーザー名を改行で列挙します。ここで指定されたユーザー名はアカウント作成時に使えなくなりますが、管理者によるアカウント作成時はこの制限を受けません。また、既に存在するアカウントも影響を受けません。"
createNoteFromTheFile: "このファイルからノートを作成"
archive: "アーカイブ"
+archived: "アーカイブ済み"
+unarchive: "アーカイブ解除"
channelArchiveConfirmTitle: "{name}をアーカイブしますか?"
channelArchiveConfirmDescription: "アーカイブすると、チャンネル一覧や検索結果に表示されなくなり、新たな書き込みもできなくなります。"
thisChannelArchived: "このチャンネルはアーカイブされています。"
@@ -1111,6 +1138,9 @@ preventAiLearning: "生成AIによる学習を拒否"
preventAiLearningDescription: "外部の文章生成AIや画像生成AIに対して、投稿したノートや画像などのコンテンツを学習の対象にしないように要求します。これはnoaiフラグをHTMLレスポンスに含めることによって実現されますが、この要求に従うかはそのAI次第であるため、学習を完全に防止するものではありません。"
options: "オプション"
specifyUser: "ユーザー指定"
+lookupConfirm: "照会しますか?"
+openTagPageConfirm: "ハッシュタグのページを開きますか?"
+specifyHost: "ホスト指定"
failedToPreviewUrl: "プレビューできません"
update: "更新"
rolesThatCanBeUsedThisEmojiAsReaction: "リアクションとして使えるロール"
@@ -1242,6 +1272,55 @@ keepOriginalFilenameDescription: "この設定をオフにすると、アップ
noDescription: "説明文はありません"
alwaysConfirmFollow: "フォローの際常に確認する"
inquiry: "お問い合わせ"
+tryAgain: "もう一度お試しください。"
+confirmWhenRevealingSensitiveMedia: "センシティブなメディアを表示するとき確認する"
+sensitiveMediaRevealConfirm: "センシティブなメディアです。表示しますか?"
+createdLists: "作成したリスト"
+createdAntennas: "作成したアンテナ"
+fromX: "{x}から"
+genEmbedCode: "埋め込みコードを生成"
+noteOfThisUser: "このユーザーのノート一覧"
+clipNoteLimitExceeded: "これ以上このクリップにノートを追加できません。"
+performance: "パフォーマンス"
+modified: "変更あり"
+discard: "破棄"
+thereAreNChanges: "{n}件の変更があります"
+signinWithPasskey: "パスキーでログイン"
+unknownWebAuthnKey: "登録されていないパスキーです。"
+passkeyVerificationFailed: "パスキーの検証に失敗しました。"
+passkeyVerificationSucceededButPasswordlessLoginDisabled: "パスキーの検証に成功しましたが、パスワードレスログインが無効になっています。"
+messageToFollower: "フォロワーへのメッセージ"
+target: "対象"
+testCaptchaWarning: "CAPTCHAのテストを目的とした機能です。本番環境で使用しないでください。"
+prohibitedWordsForNameOfUser: "禁止ワード(ユーザーの名前)"
+prohibitedWordsForNameOfUserDescription: "このリストに含まれる文字列がユーザーの名前に含まれる場合、ユーザーの名前の変更を拒否します。モデレーター権限を持つユーザーはこの制限の影響を受けません。"
+yourNameContainsProhibitedWords: "変更しようとした名前に禁止された文字列が含まれています"
+yourNameContainsProhibitedWordsDescription: "名前に禁止されている文字列が含まれています。この名前を使用したい場合は、サーバー管理者にお問い合わせください。"
+thisContentsAreMarkedAsSigninRequiredByAuthor: "投稿者により、表示にはログインが必要と設定されています"
+lockdown: "ロックダウン"
+pleaseSelectAccount: "アカウントを選択してください"
+availableRoles: "利用可能なロール"
+
+_accountSettings:
+ requireSigninToViewContents: "コンテンツの表示にログインを必須にする"
+ requireSigninToViewContentsDescription1: "あなたが作成した全てのノートなどのコンテンツを表示するのにログインを必須にします。クローラーに情報が収集されるのを防ぐ効果が期待できます。"
+ requireSigninToViewContentsDescription2: "URLプレビュー(OGP)、Webページへの埋め込み、ノートの引用に対応していないサーバーからの表示も不可になります。"
+ requireSigninToViewContentsDescription3: "リモートサーバーに連合されたコンテンツでは、これらの制限が適用されない場合があります。"
+ makeNotesFollowersOnlyBefore: "過去のノートをフォロワーのみ表示可能にする"
+ makeNotesFollowersOnlyBeforeDescription: "この機能が有効になっている間、設定された日時より過去、または設定された時間を経過しているノートがフォロワーのみ表示可能になります。無効に戻すと、ノートの公開状態も元に戻ります。"
+ makeNotesHiddenBefore: "過去のノートを非公開化する"
+ makeNotesHiddenBeforeDescription: "この機能が有効になっている間、設定された日時より過去、または設定された時間を経過しているノートが自分のみ表示可能(非公開化)になります。無効に戻すと、ノートの公開状態も元に戻ります。"
+ mayNotEffectForFederatedNotes: "リモートサーバーに連合されたノートには効果が及ばない場合があります。"
+ notesHavePassedSpecifiedPeriod: "指定した時間を経過しているノート"
+ notesOlderThanSpecifiedDateAndTime: "指定した日時より前のノート"
+
+_abuseUserReport:
+ forward: "転送"
+ forwardDescription: "匿名のシステムアカウントとして、リモートサーバーに通報を転送します。"
+ resolve: "解決"
+ accept: "是認"
+ reject: "否認"
+ resolveTutorial: "内容が正当である通報に対応した場合は「是認」を選択し、肯定的にケースが解決されたことをマークします。\n内容が正当でない通報の場合は「否認」を選択し、否定的にケースが解決されたことをマークします。"
_delivery:
status: "配信状態"
@@ -1384,8 +1463,10 @@ _serverSettings:
fanoutTimelineDescription: "有効にすると、各種タイムラインを取得する際のパフォーマンスが大幅に向上し、データベースへの負荷を軽減することが可能です。ただし、Redisのメモリ使用量は増加します。サーバーのメモリ容量が少ない場合、または動作が不安定な場合は無効にすることができます。"
fanoutTimelineDbFallback: "データベースへのフォールバック"
fanoutTimelineDbFallbackDescription: "有効にすると、タイムラインがキャッシュされていない場合にDBへ追加で問い合わせを行うフォールバック処理を行います。無効にすると、フォールバック処理を行わないことでさらにサーバーの負荷を軽減することができますが、タイムラインが取得できる範囲に制限が生じます。"
+ reactionsBufferingDescription: "有効にすると、リアクション作成時のパフォーマンスが大幅に向上し、データベースへの負荷を軽減することが可能です。ただし、Redisのメモリ使用量は増加します。"
inquiryUrl: "問い合わせ先URL"
inquiryUrlDescription: "サーバー運営者へのお問い合わせフォームのURLや、運営者の連絡先等が記載されたWebページのURLを指定します。"
+ thisSettingWillAutomaticallyOffWhenModeratorsInactive: "一定期間モデレーターのアクティビティが検出されなかった場合、スパム防止のためこの設定は自動でオフになります。"
_accountMigration:
moveFrom: "別のアカウントからこのアカウントに移行"
@@ -1705,6 +1786,7 @@ _role:
canManageAvatarDecorations: "アバターデコレーションの管理"
driveCapacity: "ドライブ容量"
alwaysMarkNsfw: "ファイルにNSFWを常に付与"
+ canUpdateBioMedia: "アイコンとバナーの更新を許可"
pinMax: "ノートのピン留めの最大数"
antennaMax: "アンテナの作成可能数"
wordMuteMax: "ワードミュートの最大文字数"
@@ -1719,6 +1801,11 @@ _role:
canSearchNotes: "ノート検索の利用"
canUseTranslator: "翻訳機能の利用"
avatarDecorationLimit: "アイコンデコレーションの最大取付個数"
+ canImportAntennas: "アンテナのインポートを許可"
+ canImportBlocking: "ブロックのインポートを許可"
+ canImportFollowing: "フォローのインポートを許可"
+ canImportMuting: "ミュートのインポートを許可"
+ canImportUserLists: "リストのインポートを許可"
_condition:
roleAssignedTo: "マニュアルロールにアサイン済み"
isLocal: "ローカルユーザー"
@@ -1958,7 +2045,6 @@ _theme:
buttonBg: "ボタンの背景"
buttonHoverBg: "ボタンの背景 (ホバー)"
inputBorder: "入力ボックスの縁取り"
- listItemHoverBg: "リスト項目の背景 (ホバー)"
driveFolderBg: "ドライブフォルダーの背景"
wallpaperOverlay: "壁紙のオーバーレイ"
badge: "バッジ"
@@ -1971,8 +2057,6 @@ _sfx:
note: "ノート"
noteMy: "ノート(自分)"
notification: "通知"
- antenna: "アンテナ受信"
- channel: "チャンネル通知"
reaction: "リアクション選択時"
_soundSettings:
@@ -1982,6 +2066,7 @@ _soundSettings:
driveFileTypeWarnDescription: "音声ファイルを選択してください"
driveFileDurationWarn: "音声が長すぎます"
driveFileDurationWarnDescription: "長い音声を使用するとMisskeyの使用に支障をきたす可能性があります。それでも続行しますか?"
+ driveFileError: "音声が読み込めませんでした。設定を変更してください"
_ago:
future: "未来"
@@ -2134,8 +2219,11 @@ _auth:
permissionAsk: "このアプリは次の権限を要求しています"
pleaseGoBack: "アプリケーションに戻ってやっていってください"
callback: "アプリケーションに戻っています"
+ accepted: "アクセスを許可しました"
denied: "アクセスを拒否しました"
+ scopeUser: "以下のユーザーとして操作しています"
pleaseLogin: "アプリケーションにアクセス許可を与えるには、ログインが必要です。"
+ byClickingYouWillBeRedirectedToThisUrl: "アクセスを許可すると、自動で以下のURLに遷移します"
_antennaSources:
all: "全てのノート"
@@ -2252,6 +2340,9 @@ _profile:
changeBanner: "バナー画像を変更"
verifiedLinkDescription: "内容にURLを設定すると、リンク先のWebサイトに自分のプロフィールへのリンクが含まれている場合に所有者確認済みアイコンを表示させることができます。"
avatarDecorationMax: "最大{max}つまでデコレーションを付けられます。"
+ followedMessage: "フォローされた時のメッセージ"
+ followedMessageDescription: "フォローされた時に相手に表示する短いメッセージを設定できます。"
+ followedMessageDescriptionForLockedAccount: "フォローを承認制にしている場合、フォローリクエストを許可した時に表示されます。"
_exportOrImport:
allNotes: "全てのノート"
@@ -2350,6 +2441,7 @@ _pages:
eyeCatchingImageSet: "アイキャッチ画像を設定"
eyeCatchingImageRemove: "アイキャッチ画像を削除"
chooseBlock: "ブロックを追加"
+ enterSectionTitle: "セクションタイトルを入力"
selectType: "種類を選択"
contentBlocks: "コンテンツ"
inputBlocks: "入力"
@@ -2379,7 +2471,7 @@ _notification:
youGotMention: "{name}からのメンション"
youGotReply: "{name}からのリプライ"
youGotQuote: "{name}による引用"
- youRenoted: "{name}がRenoteしました"
+ youRenoted: "{name}がリノートしました"
youWereFollowed: "フォローされました"
youReceivedFollowRequest: "フォローリクエストが来ました"
yourFollowRequestAccepted: "フォローリクエストが承認されました"
@@ -2398,6 +2490,8 @@ _notification:
renotedBySomeUsers: "{n}人がリノートしました"
followedBySomeUsers: "{n}人にフォローされました"
flushNotification: "通知の履歴をリセットする"
+ exportOfXCompleted: "{x}のエクスポートが完了しました"
+ login: "ログインがありました"
_types:
all: "すべて"
@@ -2405,7 +2499,7 @@ _notification:
follow: "フォロー"
mention: "メンション"
reply: "リプライ"
- renote: "Renote"
+ renote: "リノート"
quote: "引用"
reaction: "リアクション"
pollEnded: "アンケートが終了"
@@ -2413,12 +2507,15 @@ _notification:
followRequestAccepted: "フォローが受理された"
roleAssigned: "ロールが付与された"
achievementEarned: "実績の獲得"
+ exportCompleted: "エクスポートが完了した"
+ login: "ログイン"
+ test: "通知のテスト"
app: "連携アプリからの通知"
_actions:
followBack: "フォローバック"
reply: "返信"
- renote: "Renote"
+ renote: "リノート"
_deck:
alwaysShowMainColumn: "常にメインカラムを表示"
@@ -2468,9 +2565,10 @@ _drivecleaner:
_webhookSettings:
createWebhook: "Webhookを作成"
+ modifyWebhook: "Webhookを編集"
name: "名前"
secret: "シークレット"
- events: "Webhookを実行するタイミング"
+ trigger: "トリガー"
active: "有効"
_events:
follow: "フォローしたとき"
@@ -2480,6 +2578,30 @@ _webhookSettings:
renote: "Renoteされたとき"
reaction: "リアクションがあったとき"
mention: "メンションされたとき"
+ _systemEvents:
+ abuseReport: "ユーザーから通報があったとき"
+ abuseReportResolved: "ユーザーからの通報を処理したとき"
+ userCreated: "ユーザーが作成されたとき"
+ inactiveModeratorsWarning: "モデレーターが一定期間非アクティブになったとき"
+ inactiveModeratorsInvitationOnlyChanged: "モデレーターが一定期間非アクティブだったため、システムにより招待制へと変更されたとき"
+ deleteConfirm: "Webhookを削除しますか?"
+ testRemarks: "スイッチの右にあるボタンをクリックするとダミーのデータを使用したテスト用Webhookを送信できます。"
+
+_abuseReport:
+ _notificationRecipient:
+ createRecipient: "通報の通知先を追加"
+ modifyRecipient: "通報の通知先を編集"
+ recipientType: "通知先の種類"
+ _recipientType:
+ mail: "メール"
+ webhook: "Webhook"
+ _captions:
+ mail: "モデレーター権限を持つユーザーのメールアドレスに通知を送ります(通報を受けた時のみ)"
+ webhook: "指定したSystemWebhookに通知を送ります(通報を受けた時と通報を解決した時にそれぞれ発信)"
+ keywords: "キーワード"
+ notifiedUser: "通知先ユーザー"
+ notifiedWebhook: "使用するWebhook"
+ deleteConfirm: "通知先を削除しますか?"
_moderationLogTypes:
createRole: "ロールを作成"
@@ -2509,6 +2631,8 @@ _moderationLogTypes:
markSensitiveDriveFile: "ファイルをセンシティブ付与"
unmarkSensitiveDriveFile: "ファイルをセンシティブ解除"
resolveAbuseReport: "通報を解決"
+ forwardAbuseReport: "通報を転送"
+ updateAbuseReportNote: "通報のモデレーションノート更新"
createInvitation: "招待コードを作成"
createAd: "広告を作成"
deleteAd: "広告を削除"
@@ -2518,6 +2642,16 @@ _moderationLogTypes:
deleteAvatarDecoration: "アイコンデコレーションを削除"
unsetUserAvatar: "ユーザーのアイコンを解除"
unsetUserBanner: "ユーザーのバナーを解除"
+ createSystemWebhook: "SystemWebhookを作成"
+ updateSystemWebhook: "SystemWebhookを更新"
+ deleteSystemWebhook: "SystemWebhookを削除"
+ createAbuseReportNotificationRecipient: "通報の通知先を作成"
+ updateAbuseReportNotificationRecipient: "通報の通知先を更新"
+ deleteAbuseReportNotificationRecipient: "通報の通知先を削除"
+ deleteAccount: "アカウントを削除"
+ deletePage: "ページを削除"
+ deleteFlash: "Playを削除"
+ deleteGalleryPost: "ギャラリーの投稿を削除"
_fileViewer:
title: "ファイルの詳細"
@@ -2572,16 +2706,16 @@ _externalResourceInstaller:
_dataSaver:
_media:
- title: "メディアの読み込み"
+ title: "メディアの読み込みを無効化"
description: "画像・動画が自動で読み込まれるのを防止します。隠れている画像・動画はタップすると読み込まれます。"
_avatar:
- title: "アイコン画像"
+ title: "アイコン画像のアニメーションを無効化"
description: "アイコン画像のアニメーションが停止します。アニメーション画像は通常の画像よりファイルサイズが大きいことがあるので、データ通信量をさらに削減できます。"
_urlPreview:
- title: "URLプレビューのサムネイル"
+ title: "URLプレビューのサムネイルを非表示"
description: "URLプレビューのサムネイル画像が読み込まれなくなります。"
_code:
- title: "コードハイライト"
+ title: "コードハイライトを非表示"
description: "MFMなどでコードハイライト記法が使われている場合、タップするまで読み込まれなくなります。コードハイライトではハイライトする言語ごとにその定義ファイルを読み込む必要がありますが、それらが自動で読み込まれなくなるため、通信量の削減が見込めます。"
_hemisphere:
@@ -2657,3 +2791,31 @@ _mediaControls:
pip: "ピクチャインピクチャ"
playbackRate: "再生速度"
loop: "ループ再生"
+
+_contextMenu:
+ title: "コンテキストメニュー"
+ app: "アプリケーション"
+ appWithShift: "Shiftキーでアプリケーション"
+ native: "ブラウザのUI"
+
+_embedCodeGen:
+ title: "埋め込みコードをカスタマイズ"
+ header: "ヘッダーを表示"
+ autoload: "自動で続きを読み込む(非推奨)"
+ maxHeight: "高さの最大値"
+ maxHeightDescription: "0で最大値の設定が無効になります。ウィジェットが縦に伸び続けるのを防ぐために、何らかの値に指定してください。"
+ maxHeightWarn: "高さの最大値制限が無効(0)になっています。これが意図した変更ではない場合は、高さの最大値を何らかの値に設定してください。"
+ previewIsNotActual: "プレビュー画面で表示可能な範囲を超えたため、実際に埋め込んだ際とは表示が異なります。"
+ rounded: "角丸にする"
+ border: "外枠に枠線をつける"
+ applyToPreview: "プレビューに反映"
+ generateCode: "埋め込みコードを作成"
+ codeGenerated: "コードが生成されました"
+ codeGeneratedDescription: "生成されたコードをウェブサイトに貼り付けてご利用ください。"
+
+_selfXssPrevention:
+ warning: "警告"
+ title: "「この画面に何か貼り付けろ」はすべて詐欺です。"
+ description1: "ここに何かを貼り付けると、悪意のあるユーザーにアカウントを乗っ取られたり、個人情報を盗まれたりする可能性があります。"
+ description2: "貼り付けようとしているものが何なのかを正確に理解していない場合は、%c今すぐ作業を中止してこのウィンドウを閉じてください。"
+ description3: "詳しくはこちらをご確認ください。 {link}"
diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml
index 7a33968e9e..50132c0645 100644
--- a/locales/ja-KS.yml
+++ b/locales/ja-KS.yml
@@ -8,6 +8,9 @@ search: "探す"
notifications: "通知"
username: "ユーザー名"
password: "パスワード"
+initialPasswordForSetup: "初期設定開始用パスワード"
+initialPasswordIsIncorrect: "初期設定開始用のパスワードがちゃうで。"
+initialPasswordForSetupDescription: "Miskkeyを自分でインストールしたんやったら、設定ファイルに入れたパスワードを使ってや。\nホスティングサービスを使っとるんやったら、サービスから言われたやつを使うんやで。\n別に何も設定しとらんのやったら、何も入れずに空けといてな。"
forgotPassword: "パスワード忘れたん?"
fetchingAsApObject: "今ちと連合に照会しとるで"
ok: "ええで"
@@ -60,6 +63,7 @@ copyFileId: "ファイルIDをコピー"
copyFolderId: "フォルダーIDをコピー"
copyProfileUrl: "プロフィールURLをコピー"
searchUser: "ユーザーを探す"
+searchThisUsersNotes: "ユーザーのノートを検索"
reply: "返事"
loadMore: "まだまだあるで!"
showMore: "まだまだあるで!"
@@ -108,11 +112,14 @@ enterEmoji: "絵文字を入れてや"
renote: "リノート"
unrenote: "リノートやめる"
renoted: "リノートしたで。"
+renotedToX: "{name}にリノートしたで"
cantRenote: "この投稿はリノートできへんっぽい。"
cantReRenote: "リノート自体はリノートできへんで。"
quote: "引用"
inChannelRenote: "チャンネルの中でリノート"
inChannelQuote: "チャンネル内引用"
+renoteToChannel: "チャンネルにリノート"
+renoteToOtherChannel: "他のチャンネルにリノート"
pinnedNote: "ピン留めされとるノート"
pinned: "ピン留めしとく"
you: "あんた"
@@ -151,6 +158,7 @@ editList: "リストいじる"
selectChannel: "チャンネルを選ぶ"
selectAntenna: "アンテナを選ぶ"
editAntenna: "アンテナいじる"
+createAntenna: "アンテナを作成"
selectWidget: "ウィジェットを選ぶ"
editWidgets: "ウィジェットをいじる"
editWidgetsExit: "いじるのをやめる"
@@ -177,6 +185,10 @@ addAccount: "アカウントを追加"
reloadAccountsList: "アカウントリストの情報を更新"
loginFailed: "ログインに失敗してもうた…"
showOnRemote: "リモートで見る"
+continueOnRemote: "リモートで続行"
+chooseServerOnMisskeyHub: "Misskey Hubからサーバーを選択"
+specifyServerHost: "サーバーのドメインを直接指定"
+inputHostName: "ドメインを入力せえや"
general: "全般"
wallpaper: "壁紙"
setWallpaper: "壁紙を設定"
@@ -187,6 +199,7 @@ followConfirm: "{name}をフォローしてええか?"
proxyAccount: "プロキシアカウント"
proxyAccountDescription: "プロキシアカウントは、代わりにフォローしてくれるアカウントや。例えば、551に豚まんが無いときやったり、ユーザーがリモートユーザーをアカウントに入れたとき、リストに入れられたユーザーが誰からもフォローされてないと寂しいやん。寂しいし、アクティビティも配達されへんから、プロキシアカウントがフォローしてくれるで。ええやつやん…"
host: "ホスト"
+selectSelf: "自分を選択"
selectUser: "ユーザーを選ぶ"
recipient: "宛先"
annotation: "注釈"
@@ -202,6 +215,7 @@ perDay: "1日ごと"
stopActivityDelivery: "アクティビティの配送をやめる"
blockThisInstance: "このサーバーをブロックすんで"
silenceThisInstance: "サーバーサイレンスすんで?"
+mediaSilenceThisInstance: "サーバーをメディアサイレンス"
operations: "操作"
software: "ソフトウェア"
version: "バージョン"
@@ -223,6 +237,10 @@ blockedInstances: "ブロックしたサーバー"
blockedInstancesDescription: "ブロックしたいサーバーのホストを改行で区切って設定してな。ブロックされてもうたサーバーとはもう金輪際やり取りできひんくなるで。"
silencedInstances: "サーバーサイレンスされてんねん"
silencedInstancesDescription: "サイレンスしたいサーバーのホストを改行で区切って設定すんで。サイレンスされたサーバーに所属するアカウントはすべて「サイレンス」として扱われ、フォローがすべてリクエストになり、フォロワーでないローカルアカウントにはメンションできなくなんねん。ブロックしたインスタンスには影響せーへんで。"
+mediaSilencedInstances: "メディアサイレンスしたサーバー"
+mediaSilencedInstancesDescription: "メディアサイレンスしたいサーバーのホストを改行で区切って設定するで。メディアサイレンスされたサーバーに所属するアカウントによるファイルはすべてセンシティブとして扱われてな、カスタム絵文字が使えへんようになるで。ブロックしたインスタンスには影響せえへんで。"
+federationAllowedHosts: "連合を許すサーバー"
+federationAllowedHostsDescription: "連合してもいいサーバーのホストを行ごとに区切って設定してや。"
muteAndBlock: "ミュートとブロック"
mutedUsers: "ミュートしとるユーザー"
blockedUsers: "ブロックしとるユーザー"
@@ -313,6 +331,7 @@ selectFile: "ファイル選んでや"
selectFiles: "ファイル選んでや"
selectFolder: "フォルダ選んでや"
selectFolders: "フォルダ選んでや"
+fileNotSelected: "ファイルが選択されてへんで"
renameFile: "ファイル名をいらう"
folderName: "フォルダー名"
createFolder: "フォルダー作る"
@@ -320,6 +339,7 @@ renameFolder: "フォルダー名を変える"
deleteFolder: "フォルダーをほかす"
folder: "フォルダー"
addFile: "ファイルを追加"
+showFile: "ファイル出す"
emptyDrive: "ドライブは空っぽや"
emptyFolder: "このフォルダーは空や"
unableToDelete: "消せんかったわ"
@@ -434,6 +454,7 @@ totpDescription: "認証アプリ使うてワンタイムパスワードを入
moderator: "モデレーター"
moderation: "モデレーション"
moderationNote: "モデレーションノート"
+moderationNoteDescription: "モデレーターの中だけで共有するメモを入れれるで。"
addModerationNote: "モデレーションノートを追加するで"
moderationLogs: "モデログ"
nUsersMentioned: "{n}人が投稿"
@@ -468,10 +489,12 @@ retype: "もっかい入力"
noteOf: "{user}はんのノート"
quoteAttached: "引用付いとるで"
quoteQuestion: "引用として添付してもええか?"
+attachAsFileQuestion: "クリップボードのテキストが長すぎるからテキストファイルとして添付してもええか?"
noMessagesYet: "まだチャットはあらへんで"
newMessageExists: "新しいメッセージがきたで"
onlyOneFileCanBeAttached: "ごめんな、メッセージに添付できるファイルはひとつだけなんよ。"
signinRequired: "ログインしてくれへん?"
+signinOrContinueOnRemote: "続行するには、お使いのサーバーに移動するか、このサーバーに登録・ログインする必要があるで"
invitations: "来てや"
invitationCode: "招待コード"
checking: "確認しとるで"
@@ -493,7 +516,10 @@ uiLanguage: "UIの表示言語"
aboutX: "{x}について"
emojiStyle: "絵文字のスタイル"
native: "ネイティブ"
-disableDrawer: "メニューをドロワーで表示せえへん"
+menuStyle: "メニューのスタイル"
+style: "スタイル"
+drawer: "ドロワー"
+popup: "ポップアップ"
showNoteActionsOnlyHover: "ノートの操作部をホバー時のみ表示するで"
showReactionsCount: "ノートのリアクション数を表示する"
noHistory: "履歴はないわ。"
@@ -576,6 +602,8 @@ ascendingOrder: "小さい順"
descendingOrder: "大きい順"
scratchpad: "スクラッチパッド"
scratchpadDescription: "スクラッチパッドではAiScriptを色々試すことができるんや。Misskeyに対して色々できるコードを書いて動かしてみたり、結果を見たりできるで。"
+uiInspector: "UIインスペクター"
+uiInspectorDescription: "メモリ上にあるUIコンポーネントのインスタンス一覧を見れるで。UIコンポーネントはUi:C:系関数で生成されるで。"
output: "出力"
script: "スクリプト"
disablePagesScript: "Pagesのスクリプトを無効にしてや"
@@ -692,10 +720,7 @@ abuseReported: "無事内容が送信されたみたいやで。おおきに〜
reporter: "通報者"
reporteeOrigin: "通報先"
reporterOrigin: "通報元"
-forwardReport: "リモートサーバーに通報を転送するで"
-forwardReportIsAnonymous: "リモートサーバーからはあんたの情報は見えんなって、匿名のシステムアカウントとして表示されるで。"
send: "送信"
-abuseMarkAsResolved: "対応したで"
openInNewTab: "新しいタブで開く"
openInSideView: "サイドビューで開く"
defaultNavigationBehaviour: "デフォルトのナビゲーション"
@@ -832,6 +857,7 @@ administration: "管理"
accounts: "アカウント"
switch: "切り替え"
noMaintainerInformationWarning: "管理者情報が設定されてへんで"
+noInquiryUrlWarning: "問い合わせ先URLが設定されてへんで。"
noBotProtectionWarning: "Botプロテクションが設定されてへんで。"
configure: "設定する"
postToGallery: "ギャラリーへ投稿"
@@ -896,6 +922,7 @@ followersVisibility: "フォロワーの公開範囲"
continueThread: "さらにスレッドを見るで"
deleteAccountConfirm: "アカウントを消すで?ええんか?"
incorrectPassword: "パスワードがちゃうわ。"
+incorrectTotp: "ワンタイムパスワードが間違っとるか、期限が切れとるみたいやな。"
voteConfirm: "「{choice}」に投票するんか?"
hide: "隠す"
useDrawerReactionPickerForMobile: "ケータイとかのときドロワーで表示するで"
@@ -1021,6 +1048,7 @@ thisPostMayBeAnnoyingHome: "ホームに投稿"
thisPostMayBeAnnoyingCancel: "やめとく"
thisPostMayBeAnnoyingIgnore: "このまま投稿"
collapseRenotes: "見たことあるリノートは飛ばして表示するで"
+collapseRenotesDescription: "リアクションやリノートをしたことがあるノートをたたんで表示するで。"
internalServerError: "サーバー内部エラー"
internalServerErrorDescription: "サーバーでなんか変なこと起こっとるわ。"
copyErrorInfo: "エラー情報をコピるで"
@@ -1059,6 +1087,7 @@ retryAllQueuesConfirmTitle: "もっかいやってみるか?"
retryAllQueuesConfirmText: "一時的にサーバー重なるかもしれへんで。"
enableChartsForRemoteUser: "リモートユーザーのチャートを作る"
enableChartsForFederatedInstances: "リモートサーバーのチャートを作る"
+enableStatsForFederatedInstances: "リモートサーバの情報を取得"
showClipButtonInNoteFooter: "ノートのアクションにクリップを追加"
reactionsDisplaySize: "ツッコミの表示のでかさ"
limitWidthOfReaction: "ツッコミの最大横幅を制限して、ちっさく表示するで"
@@ -1094,6 +1123,8 @@ preservedUsernames: "予約ユーザー名"
preservedUsernamesDescription: "予約しとくユーザー名を行ごとに挙げるで。ここで指定されたユーザー名はアカウント作るときに使えへんくなるけど、管理者は例外や。あと、もうあるアカウントも例外やな。"
createNoteFromTheFile: "このファイル使うてノート作るで"
archive: "アーカイブ"
+archived: "アーカイブ済み"
+unarchive: "アーカイブ解除"
channelArchiveConfirmTitle: "{name}をアーカイブしてええか?"
channelArchiveConfirmDescription: "アーカイブしたら、チャンネル一覧とか検索結果からなくなるし、新しく書き込みもできへんなるで。"
thisChannelArchived: "このチャンネル、アーカイブされとるで。"
@@ -1104,6 +1135,9 @@ preventAiLearning: "生成AIの学習に使わんといて"
preventAiLearningDescription: "他の文章生成AIとか画像生成AIに、投稿したノートとか画像なんかを勝手に使わんように頼むで。具体的にはnoaiフラグをHTMLレスポンスに含めるんやけど、これ聞いてくれるんはAIの気分次第やから、使われる可能性もちょっとはあるな。"
options: "オプション"
specifyUser: "ユーザー指定"
+lookupConfirm: "照会するけどええか?"
+openTagPageConfirm: "ハッシュタグのページを開くんか?"
+specifyHost: "ホスト指定"
failedToPreviewUrl: "プレビューできへん"
update: "更新"
rolesThatCanBeUsedThisEmojiAsReaction: "ツッコミとして使えるロール"
@@ -1235,10 +1269,46 @@ keepOriginalFilenameDescription: "この設定をオフにすると、アップ
noDescription: "説明文はあらへんで"
alwaysConfirmFollow: "フォローの際常に確認する"
inquiry: "問い合わせ"
+tryAgain: "もう一度試しいや。"
+confirmWhenRevealingSensitiveMedia: "センシティブなメディアを表示するとき確認する"
+sensitiveMediaRevealConfirm: "センシティブなメディアやで。表示するんか?"
+createdLists: "作成したリスト"
+createdAntennas: "作成したアンテナ"
+fromX: "{x}から"
+genEmbedCode: "埋め込みコードを作る"
+noteOfThisUser: "このユーザーのノート全部"
+clipNoteLimitExceeded: "これ以上このクリップにノート追加でけへんわ。"
+performance: "パフォーマンス"
+modified: "変更あり"
+discard: "やめる"
+thereAreNChanges: "{n}個の変更があるみたいや"
+signinWithPasskey: "パスキーでログイン"
+unknownWebAuthnKey: "登録されてへんパスキーやな。"
+passkeyVerificationFailed: "パスキーの検証に失敗したで。"
+passkeyVerificationSucceededButPasswordlessLoginDisabled: "パスキーの検証は成功したんやけど、パスワードレスログインが無効になっとるわ。"
+messageToFollower: "フォロワーへのメッセージ"
+target: "対象"
+testCaptchaWarning: "CAPTCHAのテストを目的としてるで。絶対に本番環境で使わんといてな。絶対やで。"
+prohibitedWordsForNameOfUser: "禁止ワード(ユーザー名)"
+prohibitedWordsForNameOfUserDescription: "このリストの中にある文字列がユーザー名に入っとったら、その名前に変更できひんようになるで。モデレーター権限があるユーザーは除外や。"
+yourNameContainsProhibitedWords: "その名前は禁止した文字列が含まれとるで"
+yourNameContainsProhibitedWordsDescription: "その名前は禁止した文字列が含まれとるわ。どうしてもって言うなら、サーバー管理者に言うしかないで。"
+_abuseUserReport:
+ forward: "転送"
+ forwardDescription: "匿名のシステムアカウントってことにして、リモートサーバーに通報を転送するで。"
+ resolve: "解決"
+ accept: "ええよ"
+ reject: "あかんよ"
+ resolveTutorial: "内容がええなら「ええよ」を選ぶんや。肯定的に解決されたことにして記録するで。\n逆に、内容がだめなら「あかんよ」を選びいや。否定的に解決されたって記録しとくで。"
_delivery:
+ status: "配信状態"
stop: "配信せぇへん"
+ resume: "配信再開"
_type:
none: "配信しとる"
+ manuallySuspended: "手動停止中"
+ goneSuspended: "サーバー削除のため停止中"
+ autoSuspendedForNotResponding: "サーバー応答せえへんから停止中"
_bubbleGame:
howToPlay: "遊び方"
hold: "ホールド"
@@ -1364,6 +1434,10 @@ _serverSettings:
fanoutTimelineDescription: "入れると、おのおのタイムラインを取得するときにめちゃめちゃ動きが良うなって、データベースが軽くなるわ。でも、Redisのメモリ使う量が増えるから注意な。サーバーのメモリが足りんときとか、動きが変なときは切れるで。"
fanoutTimelineDbFallback: "データベースにフォールバックする"
fanoutTimelineDbFallbackDescription: "有効にしたら、タイムラインがキャッシュん中に入ってないときにDBにもっかい問い合わせるフォールバック処理ってのをやっとくで。切ったらフォールバック処理をやらんからサーバーはもっと軽くなんねんけど、タイムラインの取得範囲がちょっと減るで。"
+ reactionsBufferingDescription: "有効にしたら、リアクション作るときのパフォーマンスがすっごい上がって、データベースへの負荷が減るで。代わりに、Redisのメモリ使用は増えるで。"
+ inquiryUrl: "問い合わせ先URL"
+ inquiryUrlDescription: "サーバー運営者へのお問い合わせフォームのURLや、運営者の連絡先等が記載されたWebページのURLを指定するで。"
+ thisSettingWillAutomaticallyOffWhenModeratorsInactive: "一定期間モデレーターがおらんかったら、スパムを防ぐためにこの設定は勝手に切られるで。"
_accountMigration:
moveFrom: "別のアカウントからこのアカウントに引っ越す"
moveFromSub: "別のアカウントへエイリアスを作る"
@@ -1680,6 +1754,7 @@ _role:
canManageAvatarDecorations: "アバターを飾るモンの管理"
driveCapacity: "ドライブ容量"
alwaysMarkNsfw: "勝手にファイルにNSFWをくっつける"
+ canUpdateBioMedia: "アイコンとバナーの更新を許可"
pinMax: "ノートピン留めできる数"
antennaMax: "アンテナ作れる数"
wordMuteMax: "ワードミュートの最大文字数"
@@ -1694,6 +1769,11 @@ _role:
canSearchNotes: "ノート探せるかどうか"
canUseTranslator: "翻訳使えるかどうか"
avatarDecorationLimit: "アイコンデコのいっちばんつけれる数"
+ canImportAntennas: "アンテナのインポートを許す"
+ canImportBlocking: "ブロックのインポートを許す"
+ canImportFollowing: "フォローのインポートを許す"
+ canImportMuting: "ミュートのインポートを許す"
+ canImportUserLists: "リストのインポートを許す"
_condition:
roleAssignedTo: "マニュアルロールにアサイン済み"
isLocal: "ローカルユーザー"
@@ -1911,7 +1991,6 @@ _theme:
buttonBg: "ボタンの背景"
buttonHoverBg: "ボタンの背景 (ホバー)"
inputBorder: "入力ボックスの縁取り"
- listItemHoverBg: "リスト項目の背景 (ホバー)"
driveFolderBg: "ドライブフォルダーの背景"
wallpaperOverlay: "壁紙のオーバーレイ"
badge: "バッジ"
@@ -1923,8 +2002,6 @@ _sfx:
note: "ノート"
noteMy: "ノート(自分)"
notification: "通知"
- antenna: "アンテナ受信"
- channel: "チャンネル通知"
reaction: "ツッコミ選んどるとき"
_soundSettings:
driveFile: "ドライブん中の音使う"
@@ -1933,6 +2010,7 @@ _soundSettings:
driveFileTypeWarnDescription: "音声ファイルを選びや"
driveFileDurationWarn: "音が長すぎるわ"
driveFileDurationWarnDescription: "長い音使うたらMisskey使うのに良うないかもしれへんで。それでもええか?"
+ driveFileError: "音声が読み込めへんかったで。設定を変更せえや"
_ago:
future: "未来"
justNow: "ついさっき"
@@ -2189,6 +2267,9 @@ _profile:
changeBanner: "バナー画像を変更するで"
verifiedLinkDescription: "内容をURLに設定すると、リンク先のwebサイトに自分のプロフのリンクが含まれてる場合に所有者確認済みアイコンを表示させることができるで。"
avatarDecorationMax: "最大{max}つまでデコつけれんで"
+ followedMessage: "フォローされたら返すメッセージ"
+ followedMessageDescription: "フォローされたときに相手に返す短めのメッセージを決めれるで。"
+ followedMessageDescriptionForLockedAccount: "フォローが承認制なら、フォローリクエストをOKしたときに見せるで。"
_exportOrImport:
allNotes: "全てのノート"
favoritedNotes: "お気に入りにしたノート"
@@ -2281,6 +2362,7 @@ _pages:
eyeCatchingImageSet: "アイキャッチ画像を設定"
eyeCatchingImageRemove: "アイキャッチ画像を削除"
chooseBlock: "ブロックを追加"
+ enterSectionTitle: "セクションタイトルを入れる"
selectType: "種類を選択"
contentBlocks: "コンテンツ"
inputBlocks: "入力"
@@ -2326,13 +2408,15 @@ _notification:
renotedBySomeUsers: "{n}人がリノートしたで"
followedBySomeUsers: "{n}人にフォローされたで"
flushNotification: "通知の履歴をリセットする"
+ exportOfXCompleted: "{x}のエクスポートが終わったわ"
+ login: "ログインしとったで"
_types:
all: "すべて"
note: "あんたらの新規投稿"
follow: "フォロー"
mention: "メンション"
reply: "リプライ"
- renote: "Renote"
+ renote: "リノート"
quote: "引用"
reaction: "ツッコミ"
pollEnded: "アンケートが終了したで"
@@ -2340,15 +2424,19 @@ _notification:
followRequestAccepted: "フォローが受理されたで"
roleAssigned: "ロールが付与された"
achievementEarned: "実績の獲得"
+ exportCompleted: "エクスポート終わった"
+ login: "ログイン"
+ test: "通知テスト"
app: "連携アプリからの通知や"
_actions:
followBack: "フォローバック"
reply: "返事"
- renote: "Renote"
+ renote: "リノート"
_deck:
alwaysShowMainColumn: "いつもメインカラムを表示"
columnAlign: "カラムの寄せ"
addColumn: "カラムを追加"
+ newNoteNotificationSettings: "新着ノート通知の設定"
configureColumn: "カラムの設定"
swapLeft: "左に移動"
swapRight: "右に移動"
@@ -2387,9 +2475,10 @@ _drivecleaner:
orderByCreatedAtAsc: "追加日の古い順"
_webhookSettings:
createWebhook: "Webhookをつくる"
+ modifyWebhook: "Webhookを編集"
name: "名前"
secret: "シークレット"
- events: "Webhookを投げるタイミング"
+ trigger: "トリガー"
active: "有効"
_events:
follow: "フォローしたとき~!"
@@ -2399,6 +2488,29 @@ _webhookSettings:
renote: "リノートされるとき~!"
reaction: "ツッコまれたとき~!"
mention: "メンションがあるとき~!"
+ _systemEvents:
+ abuseReport: "ユーザーから通報があったとき"
+ abuseReportResolved: "ユーザーからの通報を処理したとき"
+ userCreated: "ユーザーが作成されたとき"
+ inactiveModeratorsWarning: "モデレーターがしばらくおらんかったとき"
+ inactiveModeratorsInvitationOnlyChanged: "モデレーターがしばらくおらんかったから、システムが招待制に変えたとき"
+ deleteConfirm: "ほんまにWebhookをほかしてもええんか?"
+ testRemarks: "スイッチ右のボタンを押すとダミーデータを使ったテスト用Webhookを送れるで。"
+_abuseReport:
+ _notificationRecipient:
+ createRecipient: "通報の通知先を追加"
+ modifyRecipient: "通報の通知先を編集"
+ recipientType: "通知先の種類"
+ _recipientType:
+ mail: "メール"
+ webhook: "Webhook"
+ _captions:
+ mail: "モデレーター権限を持つユーザーのメアドに通知を送るで(通報を受けた時のみ)"
+ webhook: "指定したSystemWebhookに通知を送るで(通報を受けた時と通報を解決した時にそれぞれ発信)"
+ keywords: "キーワード"
+ notifiedUser: "通知先ユーザー"
+ notifiedWebhook: "使用するWebhook"
+ deleteConfirm: "通知先を削除してもええか?"
_moderationLogTypes:
createRole: "ロールを追加すんで"
deleteRole: "ロールほかす"
@@ -2427,6 +2539,8 @@ _moderationLogTypes:
markSensitiveDriveFile: "ファイルをセンシティブ付与"
unmarkSensitiveDriveFile: "ファイルをセンシティブ解除"
resolveAbuseReport: "苦情を解決"
+ forwardAbuseReport: "通報を転送"
+ updateAbuseReportNote: "通報のモデレーションノート更新"
createInvitation: "招待コード作る"
createAd: "広告を作んで"
deleteAd: "広告ほかす"
@@ -2436,6 +2550,16 @@ _moderationLogTypes:
deleteAvatarDecoration: "アイコンデコレーションを削除"
unsetUserAvatar: "この子のアイコン元に戻す"
unsetUserBanner: "この子のバナー元に戻す"
+ createSystemWebhook: "SystemWebhookを作成"
+ updateSystemWebhook: "SystemWebhookを更新"
+ deleteSystemWebhook: "SystemWebhookを削除"
+ createAbuseReportNotificationRecipient: "通報の通知先作る"
+ updateAbuseReportNotificationRecipient: "通報の通知先更新"
+ deleteAbuseReportNotificationRecipient: "通報の通知先消す"
+ deleteAccount: "アカウント消す"
+ deletePage: "ページ消す"
+ deleteFlash: "Playをほかす"
+ deleteGalleryPost: "ギャラリーの投稿をほかす"
_fileViewer:
title: "ファイルの詳しい情報"
type: "ファイルの種類"
@@ -2567,3 +2691,22 @@ _mediaControls:
pip: "ピクチャインピクチャ"
playbackRate: "再生速度"
loop: "ループ再生"
+_contextMenu:
+ title: "コンテキストメニュー"
+ app: "アプリ"
+ appWithShift: "Shiftキーでアプリ"
+ native: "ブラウザのUI"
+_embedCodeGen:
+ title: "埋め込みコードをカスタム"
+ header: "ヘッダー出す"
+ autoload: "勝手に続きを読み込む(非推奨)"
+ maxHeight: "高さの最大値"
+ maxHeightDescription: "0は最大値を指定せえへんけど、ウィジェットが伸び続けるから絶対1以上にしといてや。"
+ maxHeightWarn: "高さの最大値が無効になっとるで。意図してへん変更なら、普通の値に戻してや。"
+ previewIsNotActual: "プレビュー画面で出せる範囲をはみ出したから、ホンマの表示とはちゃうとおもうで。"
+ rounded: "角丸める"
+ border: "外枠に枠線つける"
+ applyToPreview: "プレビューに反映"
+ generateCode: "埋め込みコード作る"
+ codeGenerated: "コード作ったで"
+ codeGeneratedDescription: "作ったコードはウェブサイトに貼っつけて使ってや。"
diff --git a/locales/kab-KAB.yml b/locales/kab-KAB.yml
index 22e24d3baa..d4aa36fa70 100644
--- a/locales/kab-KAB.yml
+++ b/locales/kab-KAB.yml
@@ -104,3 +104,7 @@ _deck:
_columns:
notifications: "Ilɣuyen"
list: "Tibdarin"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "Imayl"
diff --git a/locales/kn-IN.yml b/locales/kn-IN.yml
index b3ad46f2b1..222599572a 100644
--- a/locales/kn-IN.yml
+++ b/locales/kn-IN.yml
@@ -77,6 +77,8 @@ _profile:
username: "ಬಳಕೆಹೆಸರು"
_notification:
youWereFollowed: "ಹಿಂಬಾಲಿಸಿದರು"
+ _types:
+ login: "ಪ್ರವೇಶ"
_actions:
reply: "ಉತ್ತರಿಸು"
_deck:
diff --git a/locales/ko-GS.yml b/locales/ko-GS.yml
index 9466aff01f..1f7faba23a 100644
--- a/locales/ko-GS.yml
+++ b/locales/ko-GS.yml
@@ -468,7 +468,7 @@ tooShort: "억수로 짜립니다"
tooLong: "억수로 집니다"
passwordMatched: "맞십니다"
passwordNotMatched: "안 맞십니다"
-signinWith: "{n}서 로그인"
+signinWith: "{x} 서 로그인"
signinFailed: "로그인 몬 했십니다. 고 이름이랑 비밀번호 제대로 썼는가 확인해 주이소."
or: "아니면"
language: "언어"
@@ -476,7 +476,6 @@ uiLanguage: "UI 표시 언어"
aboutX: "{x}에 대해서"
emojiStyle: "이모지 모양"
native: "기본"
-disableDrawer: "드로어 메뉴 쓰지 않기"
showNoteActionsOnlyHover: "마우스 올맀을 때만 노트 액션 버턴 보이기"
noHistory: "기록이 없십니다"
signinHistory: "로그인 기록"
@@ -583,6 +582,9 @@ describeFile: "캡션 옇기"
enterFileDescription: "캡션 서기"
author: "맨던 사람"
manage: "간리"
+large: "커게"
+medium: "엔갆게"
+small: "쪼맪게"
emailServer: "전자우펜 서버"
email: "전자우펜"
emailAddress: "전자우펜 주소"
@@ -599,7 +601,6 @@ reportAbuseOf: "{name}님얼 신고하기"
reporter: "신고한 사람"
reporteeOrigin: "신고덴 사람"
reporterOrigin: "신고한 곳"
-forwardReport: "웬겍 서버에 신고 보내기"
waitingFor: "{x}(얼)럴 지달리고 잇십니다"
random: "무작이"
system: "시스템"
@@ -613,12 +614,14 @@ followersCount: "팔로워 수"
noteFavoritesCount: "질겨찾기한 노트 수"
clips: "클립 맨걸기"
clearCache: "캐시 비우기"
+nUsers: "{n} 사용자"
typingUsers: "{users} 님이 서고 잇어예"
unlikeConfirm: "좋네예럴 무룹니꺼?"
info: "정보"
selectAccount: "계정 개리기"
user: "사용자"
administration: "간리"
+middle: "엔갆게"
translatedFrom: "{x}서 번옉"
on: "킴"
off: "껌"
@@ -633,6 +636,7 @@ oneMonth: "한 달"
file: "파일"
typeToConfirm: "게속할라먼 {x}럴 누질라 주이소"
pleaseSelect: "개리 주이소"
+remoteOnly: "웬겍만"
tools: "도구"
like: "좋네예!"
unlike: "좋네예 무루기"
@@ -643,7 +647,10 @@ role: "옉할"
noRole: "옉할이 어ᇝ십니다"
thisPostMayBeAnnoyingCancel: "아이예"
likeOnly: "좋네예마"
+hiddenTags: "수ᇚ훈 해시태그"
myClips: "내 클립"
+preservedUsernames: "예약 사용자 이럼"
+specifyUser: "사용자 지정"
icon: "아바타"
replies: "답하기"
renotes: "리노트"
@@ -709,6 +716,16 @@ _achievements:
description: "0분 0초에 노트를 섰어예"
_tutorialCompleted:
description: "길라잡이럴 껕냇십니다"
+_role:
+ displayOrder: "보기 순서"
+ _priority:
+ middle: "엔갆게"
+ _options:
+ canHideAds: "강고 수ᇚ후기"
+ _condition:
+ isRemote: "웬겍 사용자"
+ isCat: "갱이 사용자"
+ isBot: "자동 사용자"
_gallery:
my: "내 걸"
liked: "좋네예한 걸"
@@ -792,10 +809,13 @@ _notification:
_types:
follow: "팔로잉"
mention: "멘션"
+ renote: "리노트"
quote: "따오기"
reaction: "반엉"
+ login: "로그인"
_actions:
reply: "답하기"
+ renote: "리노트"
_deck:
_columns:
notifications: "알림"
@@ -805,6 +825,10 @@ _deck:
mentions: "받언 멘션"
_webhookSettings:
name: "이럼"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "전자우펜"
_moderationLogTypes:
suspend: "얼우기"
deleteNote: "노트 뭉캐기"
diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml
index 294a5a1520..414202adab 100644
--- a/locales/ko-KR.yml
+++ b/locales/ko-KR.yml
@@ -8,6 +8,9 @@ search: "검색"
notifications: "알림"
username: "유저명"
password: "비밀번호"
+initialPasswordForSetup: "초기 설정용 비밀번호"
+initialPasswordIsIncorrect: "초기 설정용 비밀번호가 올바르지 않습니다."
+initialPasswordForSetupDescription: "Misskey를 직접 설치하는 경우, 설정 파일에 입력해둔 비밀번호를 사용하세요.\nMisskey 설치를 도와주는 호스팅 서비스 등을 사용하는 경우, 서비스 제공자로부터 받은 비밀번호를 사용하세요.\n비밀번호를 따로 설정하지 않은 경우, 아무것도 입력하지 않아도 됩니다."
forgotPassword: "비밀번호 재설정"
fetchingAsApObject: "연합에서 찾아보는 중"
ok: "확인"
@@ -53,13 +56,14 @@ addToList: "리스트에 추가"
addToAntenna: "안테나에 추가"
sendMessage: "메시지 보내기"
copyRSS: "RSS 복사"
-copyUsername: "사용자 이름 복사"
-copyUserId: "사용자 ID 복사"
+copyUsername: "유저명 복사"
+copyUserId: "유저 ID 복사"
copyNoteId: "노트 ID 복사"
copyFileId: "파일 ID 복사"
copyFolderId: "폴더 ID 복사"
copyProfileUrl: "프로필 URL 복사"
searchUser: "사용자 검색"
+searchThisUsersNotes: "사용자의 노트 검색"
reply: "답글"
loadMore: "더 보기"
showMore: "더 보기"
@@ -108,22 +112,25 @@ enterEmoji: "이모지 입력"
renote: "리노트"
unrenote: "리노트 취소"
renoted: "리노트했습니다"
+renotedToX: "{name}명이 리노트했습니다."
cantRenote: "이 게시물은 리노트 할 수 없습니다."
-cantReRenote: "리노트를 리노트할 수 없습니다."
+cantReRenote: "리노트를 리노트 할 수 없습니다."
quote: "인용"
inChannelRenote: "채널 내 리노트"
inChannelQuote: "채널 내 인용"
+renoteToChannel: "채널에 리노트"
+renoteToOtherChannel: "다른 채널에 리노트"
pinnedNote: "고정된 노트"
pinned: "고정하기"
you: "나"
clickToShow: "클릭하여 보기"
sensitive: "열람 주의"
add: "추가"
-reaction: "반응"
-reactions: "반응"
+reaction: "리액션"
+reactions: "리액션"
emojiPicker: "이모지 선택기"
-pinnedEmojisForReactionSettingDescription: "리액션을 할 때 프로필에 고정하여 표시할 이모지를 설정할 수 있습니다"
-pinnedEmojisSettingDescription: "이모지를 입력할 때 프로필에 고정하여 표시할 이모지를 설정할 수 있습니다"
+pinnedEmojisForReactionSettingDescription: "리액션을 할 때 이모지 선택기 상단에 표시할 이모지를 설정할 수 있습니다."
+pinnedEmojisSettingDescription: "이모지를 입력할 때 이모지 선택기 상단에 표시할 이모지를 설정할 수 있습니다."
emojiPickerDisplay: "선택기 표시"
overwriteFromPinnedEmojisForReaction: "리액션 설정을 덮어쓰기"
overwriteFromPinnedEmojis: "일반 설정을 덮어쓰기"
@@ -136,7 +143,7 @@ unmarkAsSensitive: "열람주의 해제"
enterFileName: "파일명을 입력"
mute: "뮤트"
unmute: "뮤트 해제"
-renoteMute: "리노트 뮤트하기"
+renoteMute: "리노트 뮤트"
renoteUnmute: "리노트 뮤트 해제"
block: "차단"
unblock: "차단 해제"
@@ -151,6 +158,7 @@ editList: "리스트 편집"
selectChannel: "채널 선택"
selectAntenna: "안테나 선택"
editAntenna: "안테나 편집"
+createAntenna: "안테나 만들기"
selectWidget: "위젯 선택"
editWidgets: "위젯 편집"
editWidgetsExit: "편집 종료"
@@ -174,12 +182,16 @@ flagShowTimelineReplies: "타임라인에 노트의 답글을 표시하기"
flagShowTimelineRepliesDescription: "이 설정을 활성화하면 타임라인에 다른 유저 간의 답글을 표시합니다."
autoAcceptFollowed: "팔로우 중인 유저로부터의 팔로우 요청을 자동 수락"
addAccount: "계정 추가"
-reloadAccountsList: "계정 리스트 정보 갱신"
+reloadAccountsList: "계정 목록 새로고침"
loginFailed: "로그인에 실패했습니다"
showOnRemote: "리모트에서 보기"
+continueOnRemote: "리모트에서 계속"
+chooseServerOnMisskeyHub: "Misskey Hub에서 서버 찾아보기"
+specifyServerHost: "서버 도메인 직접 지정"
+inputHostName: "도메인을 입력하세요"
general: "일반"
wallpaper: "배경"
-setWallpaper: "배경화면 설정"
+setWallpaper: "배경 설정"
removeWallpaper: "배경 제거"
searchWith: "검색: {q}"
youHaveNoLists: "리스트가 없습니다"
@@ -187,7 +199,8 @@ followConfirm: "{name}님을 팔로우 하시겠습니까?"
proxyAccount: "프록시 계정"
proxyAccountDescription: "프록시 계정은 특정 조건 하에서 유저의 리모트 팔로우를 대행하는 계정입니다. 예를 들면, 유저가 리모트 유저를 리스트에 넣었을 때, 리스트에 들어간 유저를 아무도 팔로우한 적이 없다면 액티비티가 서버로 배달되지 않기 때문에, 대신 프록시 계정이 해당 유저를 팔로우하도록 합니다."
host: "호스트"
-selectUser: "사용자 선택"
+selectSelf: "본인을 선택"
+selectUser: "유저 선택"
recipient: "수신인"
annotation: "내용에 대한 주석"
federation: "연합"
@@ -202,6 +215,7 @@ perDay: "1일마다"
stopActivityDelivery: "액티비티 보내지 않기"
blockThisInstance: "이 서버를 차단"
silenceThisInstance: "서버를 사일런스"
+mediaSilenceThisInstance: "서버의 미디어를 사일런스"
operations: "작업"
software: "소프트웨어"
version: "버전"
@@ -223,6 +237,10 @@ blockedInstances: "차단된 서버"
blockedInstancesDescription: "차단하려는 서버의 호스트 이름을 줄바꿈으로 구분하여 설정합니다. 차단된 인스턴스는 이 인스턴스와 통신할 수 없게 됩니다."
silencedInstances: "사일런스한 서버"
silencedInstancesDescription: "사일런스하려는 서버의 호스트명을 한 줄에 하나씩 입력합니다. 사일런스된 서버에 소속된 유저는 모두 '사일런스'된 상태로 취급되며, 이 서버로부터의 팔로우가 프로필 설정과 무관하게 승인제로 변경되고, 팔로워가 아닌 로컬 유저에게는 멘션할 수 없게 됩니다. 정지된 서버에는 적용되지 않습니다."
+mediaSilencedInstances: "미디어를 사일런스한 서버"
+mediaSilencedInstancesDescription: "미디어를 사일런스 하려는 서버의 호스트를 한 줄에 하나씩 입력합니다. 미디어가 사일런스된 서버의 유저가 업로드한 파일은 모두 민감한 미디어로 처리되며, 커스텀 이모지를 사용할 수 없게 됩니다. 또한, 차단한 인스턴스에는 적용되지 않습니다."
+federationAllowedHosts: "연합을 허가하는 서버"
+federationAllowedHostsDescription: "연합을 허가하는 서버의 호스트를 엔터로 구분해서 설정합니다."
muteAndBlock: "뮤트 및 차단"
mutedUsers: "뮤트한 유저"
blockedUsers: "차단한 유저"
@@ -230,7 +248,7 @@ noUsers: "아무도 없습니다"
editProfile: "프로필 수정"
noteDeleteConfirm: "이 노트를 삭제하시겠습니까?"
pinLimitExceeded: "더 이상 고정할 수 없습니다."
-intro: "Misskey의 설치를 완료했습니다! 관리자 계정을 만들어 주세요."
+intro: "Misskey의 설치가 완료되었습니다! 관리자 계정을 생성해주세요."
done: "완료"
processing: "처리중"
preview: "미리보기"
@@ -247,7 +265,7 @@ publishing: "배포 중"
notResponding: "응답 없음"
instanceFollowing: "서버의 팔로잉"
instanceFollowers: "서버의 팔로워"
-instanceUsers: "서버의 유저"
+instanceUsers: "서버의 사용자"
changePassword: "비밀번호 변경"
security: "보안"
retypedNotMatch: "입력이 일치하지 않습니다."
@@ -263,12 +281,12 @@ lookup: "찾아보기"
announcements: "공지사항"
imageUrl: "이미지 URL"
remove: "삭제"
-removed: "삭제하였습니다"
+removed: "삭제했습니다"
removeAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
deleteAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
resetAreYouSure: "초기화 하시겠습니까?"
areYouSure: "계속 진행하시겠습니까?"
-saved: "저장하였습니다"
+saved: "저장했습니다"
messaging: "대화"
upload: "업로드"
keepOriginalUploading: "원본 이미지를 유지"
@@ -296,7 +314,7 @@ activity: "활동"
images: "이미지"
image: "이미지"
birthday: "생일"
-yearsOld: "만 {age} 세"
+yearsOld: "{age}세"
registeredDate: "등록일"
location: "장소"
theme: "테마"
@@ -313,6 +331,7 @@ selectFile: "파일 선택"
selectFiles: "파일 선택"
selectFolder: "폴더 선택"
selectFolders: "폴더 선택"
+fileNotSelected: "파일을 선택하지 않았습니다"
renameFile: "파일 이름 변경"
folderName: "폴더 이름"
createFolder: "폴더 만들기"
@@ -320,6 +339,7 @@ renameFolder: "폴더 이름 바꾸기"
deleteFolder: "폴더 삭제"
folder: "폴더"
addFile: "파일 추가"
+showFile: "파일 표시하기"
emptyDrive: "드라이브가 비어 있습니다"
emptyFolder: "폴더가 비어 있습니다"
unableToDelete: "삭제할 수 없습니다"
@@ -365,12 +385,12 @@ registration: "등록"
enableRegistration: "신규 회원가입을 활성화"
invite: "초대"
driveCapacityPerLocalAccount: "로컬 유저 한 명당 드라이브 용량"
-driveCapacityPerRemoteAccount: "리모트 유저 한 명당 드라이브 용량"
+driveCapacityPerRemoteAccount: "원격 사용자별 드라이브 용량"
inMb: "메가바이트 단위"
bannerUrl: "배너 이미지 URL"
backgroundImageUrl: "배경 이미지 URL"
basicInfo: "기본 정보"
-pinnedUsers: "고정된 유저"
+pinnedUsers: "고정한 사용자"
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다."
pinnedPages: "고정한 페이지"
pinnedPagesDescription: "서버의 대문에 고정하고 싶은 페이지의 경로를 한 줄에 하나씩 적습니다."
@@ -434,16 +454,17 @@ totpDescription: "인증 앱을 사용하여 일회성 비밀번호 입력"
moderator: "모더레이터"
moderation: "조정"
moderationNote: "조정 기록"
+moderationNoteDescription: "모더레이터 역할을 가진 유저만 보이는 메모를 적을 수 있습니다."
addModerationNote: "조정 기록 추가하기"
moderationLogs: "모더레이션 로그"
nUsersMentioned: "{n}명이 언급함"
-securityKeyAndPasskey: "보안 키 또는 패스 키"
+securityKeyAndPasskey: "보안 키 또는 패스키"
securityKey: "보안 키"
lastUsed: "마지막 사용"
lastUsedAt: "마지막 사용: {t}"
unregister: "등록 해제"
passwordLessLogin: "비밀번호 없이 로그인"
-passwordLessLoginDescription: "비밀번호를 사용하지 않고 보안 키 또는 패스 키 등으로만 로그인합니다."
+passwordLessLoginDescription: "비밀번호 없이 보안 키 또는 패스키만 사용해서 로그인합니다."
resetPassword: "비밀번호 재설정"
newPasswordIs: "새로운 비밀번호는 \"{password}\" 입니다"
reduceUiAnimation: "UI의 애니메이션을 줄이기"
@@ -468,10 +489,12 @@ retype: "다시 입력"
noteOf: "{user}의 노트"
quoteAttached: "인용함"
quoteQuestion: "인용해서 작성하시겠습니까?"
+attachAsFileQuestion: "붙여넣으려는 글이 너무 깁니다. 텍스트 파일로 첨부하시겠습니까?"
noMessagesYet: "아직 대화가 없습니다"
newMessageExists: "새 메시지가 있습니다"
onlyOneFileCanBeAttached: "메시지에 첨부할 수 있는 파일은 하나까지입니다"
signinRequired: "진행하기 전에 로그인을 해 주세요"
+signinOrContinueOnRemote: "계속하려면 사용하는 서버로 이동하거나 이 서버에 로그인해야 합니다."
invitations: "초대"
invitationCode: "초대 코드"
checking: "확인하는 중입니다"
@@ -486,15 +509,18 @@ strongPassword: "강한 비밀번호"
passwordMatched: "일치합니다"
passwordNotMatched: "일치하지 않습니다"
signinWith: "{x}로 로그인"
-signinFailed: "로그인할 수 없습니다. 사용자명과 비밀번호를 확인하여 주십시오."
+signinFailed: "로그인할 수 없습니다. 사용자 이름과 비밀번호를 확인해 주십시오."
or: "혹은"
language: "언어"
uiLanguage: "UI 표시 언어"
aboutX: "{x}에 대하여"
emojiStyle: "이모지 스타일"
native: "기본"
-disableDrawer: "드로어 메뉴를 사용하지 않기"
-showNoteActionsOnlyHover: "노트 액션 버튼을 마우스를 올렸을 때에만 표시"
+menuStyle: "메뉴 스타일"
+style: "스타일"
+drawer: "서랍"
+popup: "팝업"
+showNoteActionsOnlyHover: "마우스가 올라간 때에만 노트 동작 버튼을 표시하기"
showReactionsCount: "노트의 반응 수를 표시하기"
noHistory: "기록이 없습니다"
signinHistory: "로그인 기록"
@@ -559,7 +585,7 @@ popout: "새 창으로 열기"
volume: "음량"
masterVolume: "마스터 볼륨"
notUseSound: "음소거 하기"
-useSoundOnlyWhenActive: "Misskey가 활성화 되어져 있을 때만 소리 출력하기"
+useSoundOnlyWhenActive: "Misskey를 활성화한 때에만 소리를 출력하기"
details: "자세히"
chooseEmoji: "이모지 선택"
unableToProcess: "작업을 완료할 수 없습니다"
@@ -576,6 +602,8 @@ ascendingOrder: "오름차순"
descendingOrder: "내림차순"
scratchpad: "스크래치 패드"
scratchpadDescription: "스크래치 패드는 AiScript 의 테스트 환경을 제공합니다. Misskey 와 상호 작용하는 코드를 작성, 실행 및 결과를 확인할 수 있습니다."
+uiInspector: "UI 인스펙터"
+uiInspectorDescription: "메모리에 있는 UI 컴포넌트의 인스턴트 목록을 볼 수 있습니다. UI 컴포넌트는 Ui:C: 계열 함수로 만들어집니다."
output: "출력"
script: "스크립트"
disablePagesScript: "Pages 에서 AiScript 를 사용하지 않음"
@@ -588,7 +616,7 @@ deleteAllFiles: "모든 파일 삭제"
deleteAllFilesConfirm: "모든 파일을 삭제하시겠습니까?"
removeAllFollowing: "모든 팔로잉 해제"
removeAllFollowingDescription: "{host} 서버의 모든 팔로잉을 해제합니다. 해당 서버가 더 이상 존재하지 않는 경우 등에 실행해 주세요."
-userSuspended: "이 계정은 정지된 상태입니다."
+userSuspended: "이 사용자는 정지되었습니다."
userSilenced: "이 계정은 사일런스된 상태입니다."
yourAccountSuspendedTitle: "계정이 정지되었습니다"
yourAccountSuspendedDescription: "이 계정은 서버의 이용 약관을 위반하거나, 기타 다른 이유로 인해 정지되었습니다. 자세한 사항은 관리자에게 문의해 주십시오. 계정을 새로 생성하지 마십시오."
@@ -692,10 +720,7 @@ abuseReported: "신고를 보냈습니다. 신고해 주셔서 감사합니다."
reporter: "신고자"
reporteeOrigin: "피신고자"
reporterOrigin: "신고자"
-forwardReport: "리모트 서버에도 신고 내용 보내기"
-forwardReportIsAnonymous: "리모트 서버에서는 나의 정보를 볼 수 없으며, 익명의 시스템 계정으로 표시됩니다."
send: "전송"
-abuseMarkAsResolved: "해결됨으로 표시"
openInNewTab: "새 탭에서 열기"
openInSideView: "사이드뷰로 열기"
defaultNavigationBehaviour: "기본 탐색 동작"
@@ -752,7 +777,7 @@ experimentalFeatures: "실험실"
experimental: "실험실"
thisIsExperimentalFeature: "이 기능은 실험적인 기능입니다. 사양이 변경되거나 정상적으로 동작하지 않을 가능성이 있습니다."
developer: "개발자"
-makeExplorable: "\"발견하기\"에 내 계정 보이기"
+makeExplorable: "계정을 쉽게 발견하도록 하기"
makeExplorableDescription: "비활성화하면 \"발견하기\"에 나의 계정을 표시하지 않습니다."
showGapBetweenNotesInTimeline: "타임라인의 노트 사이를 띄워서 표시"
duplicate: "복제"
@@ -798,7 +823,7 @@ emailNotification: "메일 알림"
publish: "게시"
inChannelSearch: "채널에서 검색"
useReactionPickerForContextMenu: "우클릭하여 리액션 선택기 열기"
-typingUsers: "{users} 님이 입력하고 있어요.."
+typingUsers: "{users}님이 입력 중"
jumpToSpecifiedDate: "특정 날짜로 이동"
showingPastTimeline: "과거의 타임라인을 표시하고 있어요"
clear: "지우기"
@@ -832,6 +857,7 @@ administration: "관리"
accounts: "계정"
switch: "전환"
noMaintainerInformationWarning: "관리자 정보가 설정되어 있지 않습니다."
+noInquiryUrlWarning: "문의처 주소를 설정하지 않았습니다."
noBotProtectionWarning: "Bot 방어가 설정되어 있지 않습니다."
configure: "설정하기"
postToGallery: "갤러리에 업로드"
@@ -896,6 +922,7 @@ followersVisibility: "팔로워의 공개 범위"
continueThread: "글타래 더 보기"
deleteAccountConfirm: "계정이 삭제되고 되돌릴 수 없게 됩니다. 계속하시겠습니까? "
incorrectPassword: "비밀번호가 올바르지 않습니다."
+incorrectTotp: "OTP 번호가 틀렸거나 유효기간이 만료되어 있을 수 있습니다."
voteConfirm: "\"{choice}\"에 투표하시겠습니까?"
hide: "숨기기"
useDrawerReactionPickerForMobile: "모바일에서 드로어 메뉴로 표시"
@@ -1021,6 +1048,7 @@ thisPostMayBeAnnoyingHome: "홈에 게시"
thisPostMayBeAnnoyingCancel: "그만두기"
thisPostMayBeAnnoyingIgnore: "이대로 게시"
collapseRenotes: "이미 본 리노트를 간략화하기"
+collapseRenotesDescription: "반응이나 리노트를 한 노트를 접어서 표시합니다."
internalServerError: "내부 서버 오류"
internalServerErrorDescription: "내부 서버에서 예기치 않은 오류가 발생했습니다."
copyErrorInfo: "오류 정보 복사"
@@ -1059,6 +1087,7 @@ retryAllQueuesConfirmTitle: "지금 다시 시도하시겠습니까?"
retryAllQueuesConfirmText: "일시적으로 서버의 부하가 증가할 수 있습니다."
enableChartsForRemoteUser: "리모트 유저의 차트를 생성"
enableChartsForFederatedInstances: "리모트 서버의 차트를 생성"
+enableStatsForFederatedInstances: "리모트 서버 정보 받아오기"
showClipButtonInNoteFooter: "노트 동작에 클립을 추가"
reactionsDisplaySize: "리액션 표시 크기"
limitWidthOfReaction: "리액션의 최대 폭을 제한하고 작게 표시하기"
@@ -1090,10 +1119,12 @@ serverRules: "서버 규칙"
pleaseConfirmBelowBeforeSignup: "이 서버에 가입하기 전에 아래 사항을 확인하여 주십시오."
pleaseAgreeAllToContinue: "계속하시려면 모든 항목에 동의하십시오."
continue: "계속"
-preservedUsernames: "예약된 사용자명"
+preservedUsernames: "예약한 사용자 이름"
preservedUsernamesDescription: "예약할 사용자명을 한 줄에 하나씩 입력합니다. 여기에서 지정한 사용자명으로는 계정을 생성할 수 없게 됩니다. 단, 관리자 권한으로 계정을 생성할 때에는 해당되지 않으며, 이미 존재하는 계정도 영향을 받지 않습니다."
createNoteFromTheFile: "이 파일로 노트를 작성"
archive: "아카이브"
+archived: "아카이브 됨"
+unarchive: "보관 취소"
channelArchiveConfirmTitle: "{name} 채널을 보존하시겠습니까?"
channelArchiveConfirmDescription: "보존한 채널은 채널 목록과 검색 결과에 표시되지 않으며 새로운 노트도 작성할 수 없습니다."
thisChannelArchived: "이 채널은 보존되었습니다."
@@ -1104,6 +1135,9 @@ preventAiLearning: "기계학습(생성형 AI)으로의 사용을 거부"
preventAiLearningDescription: "외부의 문장 생성 AI나 이미지 생성 AI에 대해 제출한 노트나 이미지 등의 콘텐츠를 학습의 대상으로 사용하지 않도록 요구합니다. 다만, 이 요구사항을 지킬 의무는 없기 때문에 학습을 완전히 방지하는 것은 아닙니다."
options: "옵션"
specifyUser: "사용자 지정"
+lookupConfirm: "조회 할까요?"
+openTagPageConfirm: "해시태그의 페이지를 열까요?"
+specifyHost: "호스트 지정"
failedToPreviewUrl: "미리 볼 수 없음"
update: "업데이트"
rolesThatCanBeUsedThisEmojiAsReaction: "이 이모지를 리액션으로 사용할 수 있는 역할"
@@ -1230,10 +1264,51 @@ useTotp: "일회용 비밀번호 사용"
useBackupCode: "백업 코드 사용"
launchApp: "앱 실행"
useNativeUIForVideoAudioPlayer: "브라우저 UI에서 미디어 재생"
+keepOriginalFilename: "원본 파일 이름을 유지"
+keepOriginalFilenameDescription: "이 설정을 끄면 업로드를 할 때 파일 이름이 자동으로 무작위 문자열로 바뀝니다."
+noDescription: "설명문이 없습니다"
+alwaysConfirmFollow: "팔로우일 때 항상 확인하기"
+inquiry: "문의하기"
+tryAgain: "다시 시도해 주세요."
+confirmWhenRevealingSensitiveMedia: "민감한 미디어를 열 때 두 번 확인"
+sensitiveMediaRevealConfirm: "민감한 미디어입니다. 표시할까요?"
+createdLists: "만든 리스트"
+createdAntennas: "만든 안테나"
+fromX: "{x}부터"
+genEmbedCode: "임베디드 코드 만들기"
+noteOfThisUser: "이 유저의 노트 목록"
+clipNoteLimitExceeded: "더 이상 이 클립에 노트를 추가 할 수 없습니다."
+performance: "퍼포먼스"
+modified: "변경 있음"
+discard: "파기"
+thereAreNChanges: "{n}건 변경이 있습니다."
+signinWithPasskey: "패스키로 로그인"
+unknownWebAuthnKey: "등록되지 않은 패스키입니다."
+passkeyVerificationFailed: "패스키 검증을 실패했습니다."
+passkeyVerificationSucceededButPasswordlessLoginDisabled: "패스키를 검증했으나, 비밀번호 없이 로그인하기가 꺼져 있습니다."
+messageToFollower: "팔로워에 보낼 메시지"
+target: "대상"
+testCaptchaWarning: "CAPTCHA를 테스트하기 위한 기능입니다. 실제 환경에서는 사용하지 마세요."
+prohibitedWordsForNameOfUser: "금지 단어 (사용자 이름)"
+prohibitedWordsForNameOfUserDescription: "이 목록에 포함되는 키워드가 사용자 이름에 있는 경우, 일반 사용자는 이름을 바꿀 수 없습니다. 모더레이터 권한을 가진 사용자는 제한 대상에서 제외됩니다."
+yourNameContainsProhibitedWords: "바꾸려는 이름에 금지된 키워드가 포함되어 있습니다."
+yourNameContainsProhibitedWordsDescription: "이름에 금지된 키워드가 있습니다. 이름을 사용해야 하는 경우, 서버 관리자에 문의하세요."
+_abuseUserReport:
+ forward: "전달"
+ forwardDescription: "익명 시스템 계정을 사용하여 리모트 서버에 신고 내용을 전달할 수 있습니다."
+ resolve: "해결됨"
+ accept: "인용"
+ reject: "기각"
+ resolveTutorial: "적절한 신고 내용에 대응한 경우, \"인용\"을 선택하여 \"해결됨\"으로 기록합니다.\n적절하지 않은 신고를 받은 경우, \"기각\"을 선택하여 \"기각\"으로 기록합니다."
_delivery:
+ status: "전송 상태"
stop: "정지됨"
+ resume: "전송 다시 시작"
_type:
none: "배포 중"
+ manuallySuspended: "수동 정지 중"
+ goneSuspended: "서버 삭제를 이유로 정지 중"
+ autoSuspendedForNotResponding: "서버 응답 없음을 이유로 정지 중"
_bubbleGame:
howToPlay: "설명"
hold: "홀드"
@@ -1359,6 +1434,10 @@ _serverSettings:
fanoutTimelineDescription: "활성화하면 각종 타임라인을 가져올 때의 성능을 대폭 향상하며, 데이터베이스의 부하를 줄일 수 있습니다. 단, Redis의 메모리 사용량이 증가합니다. 서버의 메모리 용량이 작거나, 서비스가 불안정해지는 경우 비활성화할 수 있습니다."
fanoutTimelineDbFallback: "데이터베이스를 예비로 사용하기"
fanoutTimelineDbFallbackDescription: "활성화하면 타임라인의 캐시되어 있지 않은 부분에 대해 DB에 질의하여 정보를 가져옵니다. 비활성화하면 이를 실행하지 않음으로써 서버의 부하를 줄일 수 있지만, 타임라인에서 가져올 수 있는 게시물 범위가 한정됩니다."
+ reactionsBufferingDescription: "활성화 한 경우, 리액션 작성 퍼포먼스가 대폭 향상되어 DB의 부하를 줄일 수 있으나, Redis의 메모리 사용량이 많아집니다."
+ inquiryUrl: "문의처 URL"
+ inquiryUrlDescription: "서버 운영자에게 보내는 문의 양식의 URL이나 운영자의 연락처 등이 적힌 웹 페이지의 URL을 설정합니다."
+ thisSettingWillAutomaticallyOffWhenModeratorsInactive: "일정 기간동안 모더레이터의 활동이 감지되지 않는 경우, 스팸 방지를 위해 이 설정은 자동으로 꺼집니다."
_accountMigration:
moveFrom: "다른 계정에서 이 계정으로 이사"
moveFromSub: "다른 계정에 대한 별칭을 생성"
@@ -1675,10 +1754,11 @@ _role:
canManageAvatarDecorations: "아바타 꾸미기 관리"
driveCapacity: "드라이브 용량"
alwaysMarkNsfw: "파일을 항상 NSFW로 지정"
+ canUpdateBioMedia: "아바타 및 배너 이미지 변경 허용"
pinMax: "고정할 수 있는 노트 수"
antennaMax: "만들 수 있는 안테나 수"
wordMuteMax: "단어 뮤트할 수 있는 문자 수"
- webhookMax: "만들 수 있는 웹후크 수"
+ webhookMax: "만들 수 있는 Webhook 수"
clipMax: "만들 수 있는 클립 수"
noteEachClipsMax: "클립에 넣을 수 있는 노트 수"
userListMax: "만들 수 있는 사용자 리스트 수"
@@ -1689,10 +1769,20 @@ _role:
canSearchNotes: "노트 검색 이용 가능 여부"
canUseTranslator: "번역 기능의 사용"
avatarDecorationLimit: "아바타 장식의 최대 붙임 개수"
+ canImportAntennas: "안테나 가져오기 허용"
+ canImportBlocking: "차단 목록 가져오기 허용"
+ canImportFollowing: "팔로우 가져오기 허용"
+ canImportMuting: "뮤트 목록 가져오기 허용"
+ canImportUserLists: "리스트 목록 가져오기 허용"
_condition:
roleAssignedTo: "수동 역할에 이미 할당됨"
isLocal: "로컬 사용자"
- isRemote: "리모트 사용자"
+ isRemote: "원격 사용자"
+ isCat: "고양이 사용자"
+ isBot: "봇 사용자"
+ isSuspended: "정지된 사용자"
+ isLocked: "잠금 계정 사용자"
+ isExplorable: "‘계정을 쉽게 발견하도록 하기’를 활성화한 사용자"
createdLessThan: "가입한 지 다음 일수 이내인 유저"
createdMoreThan: "가입한 지 다음 일수 이상인 유저"
followersLessThanOrEq: "팔로워 수가 다음 이하인 유저"
@@ -1901,7 +1991,6 @@ _theme:
buttonBg: "버튼 배경"
buttonHoverBg: "버튼 배경 (호버)"
inputBorder: "입력 필드 테두리"
- listItemHoverBg: "리스트 항목 배경 (호버)"
driveFolderBg: "드라이브 폴더 배경"
wallpaperOverlay: "배경화면 오버레이"
badge: "배지"
@@ -1913,16 +2002,15 @@ _sfx:
note: "새 노트"
noteMy: "내 노트"
notification: "알림"
- antenna: "안테나 수신"
- channel: "채널 알림"
reaction: "리액션 선택"
_soundSettings:
driveFile: "드라이브에 있는 오디오를 사용"
driveFileWarn: "드라이브에 있는 파일을 선택하세요."
- driveFileTypeWarn: "이 파일은 지원되지 않습니다."
+ driveFileTypeWarn: "이 파이"
driveFileTypeWarnDescription: "오디오 파일을 선택하세요."
driveFileDurationWarn: "오디오가 너무 깁니다"
driveFileDurationWarnDescription: "긴 오디오로 설정할 경우 미스키 사용에 지장이 갈 수도 있습니다. 그래도 괜찮습니까?"
+ driveFileError: "오디오를 불러올 수 없습니다. 설정을 바꿔주세요."
_ago:
future: "미래"
justNow: "방금 전"
@@ -1975,6 +2063,7 @@ _2fa:
backupCodesDescription: "인증 앱을 사용할 수 없게 된 경우 아래 백업 코드를 사용하여 계정에 액세스 할 수 있습니다.이 코드들은 반드시 안전한 장소에 보관하십시오.각 코드는 한 번만 사용할 수 있습니다."
backupCodeUsedWarning: "백업 코드가 사용되었습니다.인증 앱을 사용할 수 없게 된 경우, 조속히 인증 앱을 다시 설정해 주십시오."
backupCodesExhaustedWarning: "백업 코드가 모두 사용되었습니다.인증 앱을 사용할 수 없는 경우 더 이상 계정에 액세스하는 것이 불가능합니다.인증 앱을 다시 등록해 주세요."
+ moreDetailedGuideHere: "여기에 자세한 설명이 있습니다"
_permissions:
"read:account": "계정의 정보를 봅니다"
"write:account": "계정의 정보를 변경합니다"
@@ -2163,7 +2252,7 @@ _postForm:
c: "무엇을 생각하고 있나요?"
d: "말하고 싶은 게 있나요?"
e: "여기에 적어 주세요"
- f: "글 쓰기를 기다려요…"
+ f: "작성해주시길 기다리고 있어요..."
_profile:
name: "이름"
username: "사용자 이름"
@@ -2178,6 +2267,9 @@ _profile:
changeBanner: "배너 이미지 변경"
verifiedLinkDescription: "내용에 자신의 프로필로 향하는 링크가 포함된 페이지의 URL을 삽입하면 소유자 인증 마크가 표시됩니다."
avatarDecorationMax: "최대 {max}개까지 장식을 할 수 있습니다."
+ followedMessage: "팔로우 받았을 때 메시지"
+ followedMessageDescription: "팔로우 받았을 때 상대방에게 보여줄 단문 메시지를 설정할 수 있습니다."
+ followedMessageDescriptionForLockedAccount: "팔로우를 승인제로 한 경우, 팔로우 요청을 수락했을 때 보여줍니다."
_exportOrImport:
allNotes: "모든 노트"
favoritedNotes: "즐겨찾기한 노트"
@@ -2270,6 +2362,7 @@ _pages:
eyeCatchingImageSet: "아이캐치 이미지를 설정"
eyeCatchingImageRemove: "아이캐치 이미지를 삭제"
chooseBlock: "블록 추가"
+ enterSectionTitle: "섹션 타이틀을 입력하기"
selectType: "종류 선택"
contentBlocks: "콘텐츠"
inputBlocks: "입력"
@@ -2315,6 +2408,8 @@ _notification:
renotedBySomeUsers: "{n}명이 리노트했습니다"
followedBySomeUsers: "{n}명에게 팔로우됨"
flushNotification: "알림 이력을 초기화"
+ exportOfXCompleted: "{x} 추출에 성공했습니다."
+ login: "로그인 알림이 있습니다"
_types:
all: "전부"
note: "사용자의 새 글"
@@ -2329,6 +2424,9 @@ _notification:
followRequestAccepted: "팔로우 요청이 승인되었을 때"
roleAssigned: "역할이 부여 됨"
achievementEarned: "도전 과제 획득"
+ exportCompleted: "추출을 성공함"
+ login: "로그인"
+ test: "알림 테스트"
app: "연동된 앱을 통한 알림"
_actions:
followBack: "팔로우"
@@ -2338,6 +2436,7 @@ _deck:
alwaysShowMainColumn: "메인 칼럼 항상 표시"
columnAlign: "칼럼 정렬"
addColumn: "칼럼 추가"
+ newNoteNotificationSettings: "새 노트 알림 설정"
configureColumn: "칼럼 설정"
swapLeft: "왼쪽으로 이동"
swapRight: "오른쪽으로 이동"
@@ -2376,9 +2475,10 @@ _drivecleaner:
orderByCreatedAtAsc: "등록일이 오래된 순"
_webhookSettings:
createWebhook: "Webhook 생성"
+ modifyWebhook: "Webhook 수정"
name: "이름"
secret: "시크릿"
- events: "Webhook을 실행할 타이밍"
+ trigger: "트리거"
active: "활성화"
_events:
follow: "누군가를 팔로우했을 때"
@@ -2388,6 +2488,29 @@ _webhookSettings:
renote: "누군가 내 글을 리노트했을 때"
reaction: "누군가 내 노트에 리액션했을 때"
mention: "누군가 나를 멘션했을 때"
+ _systemEvents:
+ abuseReport: "유저롭"
+ abuseReportResolved: "받은 신고를 처리했을 때"
+ userCreated: "유저가 생성되었을 때"
+ inactiveModeratorsWarning: "모더레이터가 일정 기간동안 활동하지 않은 경우"
+ inactiveModeratorsInvitationOnlyChanged: "모더레이터가 일정 기간 활동하지 않아 시스템에 의해 초대제로 바뀐 경우"
+ deleteConfirm: "Webhook을 삭제할까요?"
+ testRemarks: "스위치 오른쪽에 있는 버튼을 클릭하여 더미 데이터를 사용한 테스트용 웹 훅을 보낼 수 있습니다."
+_abuseReport:
+ _notificationRecipient:
+ createRecipient: "신고 수신자 추가"
+ modifyRecipient: "신고 수신자 편집"
+ recipientType: "알림 종류"
+ _recipientType:
+ mail: "이메일"
+ webhook: "Webhook"
+ _captions:
+ mail: "모더레이터 권한을 가진 사용자의 이메일 주소에 알림을 보냅니다 (신고를 받은 때에만)"
+ webhook: "지정한 SystemWebhook에 알림을 보냅니다 (신고를 받은 때와 해결했을 때에 송신)"
+ keywords: "키워드"
+ notifiedUser: "알릴 사용자"
+ notifiedWebhook: "사용할 Webhook"
+ deleteConfirm: "수신자를 삭제하시겠습니까?"
_moderationLogTypes:
createRole: "역할 생성"
deleteRole: "역할 삭제"
@@ -2403,7 +2526,7 @@ _moderationLogTypes:
updateUserNote: "조정 기록 갱신"
deleteDriveFile: "파일 삭제"
deleteNote: "노트 삭제"
- createGlobalAnnouncement: "모든 공지사항 만들기"
+ createGlobalAnnouncement: "전역 공지사항 생성"
createUserAnnouncement: "사용자 공지사항 만들기"
updateGlobalAnnouncement: "모든 공지사항 수정"
updateUserAnnouncement: "사용자 공지사항 수정"
@@ -2416,6 +2539,8 @@ _moderationLogTypes:
markSensitiveDriveFile: "파일에 열람주의를 설정"
unmarkSensitiveDriveFile: "파일에 열람주의를 해제"
resolveAbuseReport: "신고 처리"
+ forwardAbuseReport: "신고 전달"
+ updateAbuseReportNote: "신고 조정 노트 갱신"
createInvitation: "초대 코드 생성"
createAd: "광고 생성"
deleteAd: "광고 삭제"
@@ -2425,6 +2550,16 @@ _moderationLogTypes:
deleteAvatarDecoration: "아바타 장식 삭제"
unsetUserAvatar: "유저 아바타 제거"
unsetUserBanner: "유저 배너 제거"
+ createSystemWebhook: "SystemWebhook을 생성"
+ updateSystemWebhook: "SystemWebhook을 수정"
+ deleteSystemWebhook: "SystemWebhook을 삭제"
+ createAbuseReportNotificationRecipient: "신고 알림 수신자 생성"
+ updateAbuseReportNotificationRecipient: "신고 알림 수신자 편집"
+ deleteAbuseReportNotificationRecipient: "신고 알림 수신자 삭제"
+ deleteAccount: "계정을 삭제"
+ deletePage: "페이지를 삭제"
+ deleteFlash: "Play를 삭제"
+ deleteGalleryPost: "갤러리 포스트를 삭제"
_fileViewer:
title: "파일 상세"
type: "파일 유형"
@@ -2545,7 +2680,7 @@ _urlPreviewSetting:
timeoutDescription: "미리보기를 로딩하는데 걸리는 시간이 정한 시간보다 오래 걸리는 경우, 미리보기를 생성하지 않습니다."
maximumContentLength: "Content-Length의 최대치 (byte)"
maximumContentLengthDescription: "Content-Length가 이 값을 넘어서면 미리보기를 생성하지 않습니다."
- requireContentLength: "Content-Length를 얻었을 때만 미리보기 만들기"
+ requireContentLength: "Content-Length를 받아온 경우에만 "
requireContentLengthDescription: "상대 서버가 Content-Length를 되돌려주지 않는다면 미리보기를 만들지 않습니다."
userAgent: "User-Agent"
userAgentDescription: "미리보기를 얻을 때 사용한 User-Agent를 설정합니다. 비어 있다면 기본값의 User-Agent를 사용합니다."
@@ -2556,3 +2691,22 @@ _mediaControls:
pip: "화면 속 화면"
playbackRate: "재생 속도"
loop: "반복 재생"
+_contextMenu:
+ title: "컨텍스트 메뉴"
+ app: "애플리케이션"
+ appWithShift: "Shift 키로 애플리케이션"
+ native: "브라우저의 UI"
+_embedCodeGen:
+ title: "임베디드 코드를 커스터마이즈"
+ header: "해더를 표시"
+ autoload: "자동으로 다음 코드를 실행 (비권장)"
+ maxHeight: "최대 높이"
+ maxHeightDescription: "최대 값을 무시하려면 0을 입력하세요. 위젯이 상하로 길어지는 것을 방지하려면, 임의의 값을 입력해 주세요."
+ maxHeightWarn: "높이 최대 값이 설정되어져 있지 않습니다(0). 의도적으로 설정 하지 않았다면 임의의 값을 설정해주세요."
+ previewIsNotActual: "미리보기로 표시할 수 있는 크기보다 큽니다. 실제로 넣은 코드의 표시가 다른 경우가 있습니다."
+ rounded: "외곽선을 둥글게 하기"
+ border: "외곽선에 테두리를 씌우기"
+ applyToPreview: "미리보기에 반영"
+ generateCode: "임베디드 코드를 만들기"
+ codeGenerated: "코드를 만들었습니다."
+ codeGeneratedDescription: "만들어진 코드를 웹 사이트에 붙여서 사용하세요."
diff --git a/locales/lo-LA.yml b/locales/lo-LA.yml
index 087bac3745..b100d0300f 100644
--- a/locales/lo-LA.yml
+++ b/locales/lo-LA.yml
@@ -18,15 +18,15 @@ enterUsername: "ປ້ອນຊື່ຜູ້ໃຊ້"
renotedBy: "Renoted ໂດຍ {user}"
noNotes: "ບໍ່ມີ note"
noNotifications: "ບໍ່ມີການແຈ້ງເຕືອນ"
-instance: "ອີນສະແຕນ"
-settings: "ກຳນົດຄ່າ"
+instance: "ເຊີຟເວີຣ໌"
+settings: "ຕັ້ງຄ່າ"
notificationSettings: "ຕັ້ງຄ່າການແຈ້ງເຕືອນ"
basicSettings: "ການຕັ້ງຄ່າພື້ນຖານ"
otherSettings: "ການຕັ້ງຄ່າອື່ນໆ"
-openInWindow: "ເປີດໃນປ່ອງຢ້ຽມ"
-profile: "ໂພຼຟາຍ"
+openInWindow: "ເປີດໃນ window"
+profile: "ໂປຣໄຟລ໌"
timeline: "ໄທມ໌ໄລນ໌"
-noAccountDescription: "ຜູ້ໃຊ້ນີ້ຍັງບໍ່ໄດ້ຂຽນໃນຊີວະປະຫວັດຂອງເຂົາເຈົ້າເທື່ອ"
+noAccountDescription: "ຜູ້ໃຊ້ຄົນນີ້ຍັງບໍ່ໄດ້ຂຽນຄຳແນະນຳໂຕ"
login: "ເຂົ້າສູ່ລະບົບ"
loggingIn: "ກຳລັງເຂົ້າສູ່ລະບົບ..."
logout: "ອອກຈາກລະບົບ"
@@ -37,7 +37,7 @@ users: "ຜູ້ໃຊ້"
addUser: "ເພີ່ມຜູ້ໃຊ້"
favorite: "ເພີ່ມໃສ່ລາຍການທີ່ມັກ"
favorites: "ລາຍການທີ່ມັກ"
-unfavorite: "ລຶບອອກຈາກລາຍການທີ່ມັກ"
+unfavorite: "ເອົາອອກຈາກລາຍການທີ່ມັກ"
favorited: "ເພີ່ມໃສ່ລາຍການທີ່ມັກແລ້ວ"
alreadyFavorited: "ເພີ່ມເຂົ້າໃນລາຍການທີ່ມັກແລ້ວ."
cantFavorite: "ບໍ່ສາມາດເພີ່ມໃສ່ລາຍການທີ່ມັກໄດ້."
@@ -48,41 +48,41 @@ copyLink: "ຄັດລອກລິ້ງ"
copyLinkRenote: "ຄັດລອກລິ້ງຂອງ renote"
delete: "ລຶບ"
deleteAndEdit: "ລຶບແລະແກ້ໄຂ"
-deleteAndEditConfirm: "ເຈົ້າແນ່ໃຈບໍ່? ທີ່ທ່ານຕ້ອງການທີ່ຈະລຶບ note ນີ້ ແລະແກ້ໄຂມັນ ທ່ານອາດຈະສູນເສຍ reaction, renote, ແລະການຕອບກັບທັງໝົດ"
+deleteAndEditConfirm: "ຕ້ອງການລຶບ note ນີ້ແລະແກ້ໄຂໃໝ່ແມ່ນບໍ່? reaction, renote ແລະການຕອບກັບຕໍ່ note ນີ້ ທັງເບິດຈະຖືກລຶບອອກ"
addToList: "ເພີ່ມໃສ່ລາຍຊື່"
addToAntenna: "ເພີ່ມໃສ່ເສົາອາກາດ"
sendMessage: "ສົ່ງຂໍ້ຄວາມ"
-copyRSS: "ສຳເນົາ RSS"
-copyUsername: "ສຳເນົາຊື່ຜູ້ໃຊ້"
-copyUserId: "ສຳເນົາ ID ຜູ້ໃຊ້"
-copyNoteId: "ສຳເນົາ ID ບັນທຶກ"
-copyFileId: "ສຳເນົາ ID ໄຟລ໌"
-copyFolderId: "ສຳເນົາ ID ໂຟນເດີ"
-copyProfileUrl: "ສຳເນົາ URL ໂປຣໄຟລ໌"
+copyRSS: "ຄັດລອກ RSS"
+copyUsername: "ຄັດລອກຊື່ຜູ້ໃຊ້"
+copyUserId: "ຄັດລອກ ID ຜູ້ໃຊ້"
+copyNoteId: "ຄັດລອກ ID ຂອງ note"
+copyFileId: "ຄັດລອກ ID ໄຟລ໌"
+copyFolderId: "ຄັດລອກ ID ໂຟລ໌ເດີຣ໌"
+copyProfileUrl: "ຄັດລອກ URL ໂປຣໄຟລ໌"
searchUser: "ຄົ້ນຫາຜູ້ໃຊ້"
-reply: "ຕອບໄປທີ"
+reply: "ຕອບກັບ"
loadMore: "ໂຫຼດເພີ່ມເຕີມ"
showMore: "ໂຫຼດເພີ່ມເຕີມ"
showLess: "ປິດ"
-youGotNewFollower: "ໄດ້ຕິດຕາມທ່ານ"
-receiveFollowRequest: "ປະຕິບັດຕາມຄໍາຮ້ອງຂໍທີ່ໄດ້ຮັບ"
-followRequestAccepted: "ຜູ້ຕິດຕາມໄດ້ຍອມຮັບຄໍາຮ້ອງຂໍຂອງທ່ານ"
-mention: "ກ່າວຖືງ"
-mentions: "ກ່າວເຖິງ"
+youGotNewFollower: "ໄດ້ຕິດຕາມເຈົ້າ"
+receiveFollowRequest: "ມີຄຳຂໍຕິດຕາມສົ່ງມາ"
+followRequestAccepted: "ການຕິດຕາມໄດ້ຮັບອນຸຍາດແລ້ວ"
+mention: "ເວົ້າເຖີງ"
+mentions: "ເວົ້າເຖີງເຈົ້າ"
directNotes: "ໂພສ Direct note"
importAndExport: "ນໍາເຂົ້າ / ສົ່ງອອກ"
import: "ນຳເຂົ້າ"
export: "ສົ່ງອອກ"
files: "ໄຟລ໌"
download: "ດາວໂຫລດ"
-driveFileDeleteConfirm: "ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການລຶບໄຟລ໌ \"{name}\"? note ທີ່ມີໄຟລ໌ແນບນີ້ຈະຖືກລຶບຖິ້ມ"
-unfollowConfirm: "ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການເຊົາຕິດຕາມ {name}?"
-exportRequested: "ໃນເວລາທີ່ທ່ານໄດ້ຮ້ອງຂໍການສົ່ງອອກ ມັນອາດຈະໃຊ້ເວລາບາງເວລາ ແລະມັນຈະຖືກເພີ່ມໃສ່ drive ຂອງທ່ານເມື່ອມັນສຳເລັດແລ້ວ"
-importRequested: "ໃນເວລາທີ່ທ່ານໄດ້ຮ້ອງຂໍການນໍາເຂົ້າ ມັນອາດຈະໃຊ້ເວລາບາງເວລາ"
+driveFileDeleteConfirm: "ຕ້ອງການລຶບໄຟລ໌ “{name}” ແມ່ນບໍ່? Note ທີ່ແນບມາກັບໄຟລ໌ນີ້ຈະຖືກລຶບອອກ"
+unfollowConfirm: "ຕ້ອງການເລີກຕິດຕາມ {name} ແມ່ນບໍ່?"
+exportRequested: "ເຈົ້າໄດ້ຮ້ອງຂໍການສົ່ງອອກ ອາດໃຊ້ເວລາຈັກໜ່ອຍ ເມື່ອແລ້ວຈະຖືກເພີ່ມໃສ່ drive"
+importRequested: "ເຈົ້າໄດ້ຮ້ອງຂໍການນຳເຂົ້າ ການດຳເນິນການນີ້ອາດໃຊ້ເວລາຈັກໜ່ອຍ"
lists: "ລາຍການ"
-noLists: "ທ່ານບໍ່ມີລາຍການໃດໆ"
-note: "ບັນທຶກ"
-notes: "ບັນທຶກ"
+noLists: "ບໍ່ມີລາຍການໃດໆ"
+note: "Note"
+notes: "Note"
following: "ກຳລັງຕິດຕາມ"
followers: "ຜູ້ຕິດຕາມ"
followsYou: "ຕິດຕາມເຈົ້າ"
@@ -124,11 +124,11 @@ reactions: "reaction"
attachCancel: "ເອົາໄຟລ໌ແນບ"
mute: "ປີດສຽງ"
unmute: "ເປີດສຽງ"
-block: "ບ໋ອກ"
-unblock: "ຍົກເລີກກາຮົບລັອກ"
+block: "ບລັອກ"
+unblock: "ເລີກບລັອກ"
suspend: "ລະງັບ"
unsuspend: "ເຊົາລະງັບ"
-selectList: "ເລືອກບັນຊີລາຍການ"
+selectList: "ເລືອກລາຍຊື່"
editList: "ແກ້ໄຂລາຍຊື່"
selectChannel: "ເລືອກຊ່ອງ"
selectAntenna: "ເລືອກເສົາອາກາດ"
@@ -151,30 +151,30 @@ flagShowTimelineRepliesDescription: "ສະແດງການຕອບກັບ
autoAcceptFollowed: "ອະນຸມັດອັດຕະໂນມັດຕາມຄຳຮ້ອງຂໍຈາກຜູ້ໃຊ້ທີ່ທ່ານກຳລັງຕິດຕາມຢູ່"
addAccount: "ເພີ່ມບັນຊີ"
loginFailed: "ການເຂົ້າສູ່ລະບົບບໍ່ສຳເລັດ"
-showOnRemote: "ເບິ່ງຢູ່ໃນຕົວຢ່າງໄລຍະໄກ"
+showOnRemote: "ເບິ່ງໃນເຊີຟເວີຣ໌ໄລຍະໄກ"
general: "ທົ່ວໄປ"
wallpaper: "ພາບພື້ນຫລັງ"
setWallpaper: "ຕັ້ງເປັນພາບພື້ນຫຼັງ"
removeWallpaper: "ລຶບຮູບວໍເປເປີອອກ"
searchWith: "ຊອກຫາ: {q}"
-youHaveNoLists: "ທ່ານບໍ່ມີລາຍການໃດໆ"
+youHaveNoLists: "ເຈົ້າບໍ່ມີລາຍຊື່ໃດໆ"
proxyAccount: "ບັນຊີພຣັອກຊີ"
-host: "ໂຮດສ"
+host: "ໂຮສຕ໌"
selectUser: "ເລືອກຜູ້ໃຊ້"
recipient: "ເຖິງ"
annotation: "ຄຳເຫັນ"
federation: "ສະຫະພັນ"
-instances: "ອີນສະແຕນ"
+instances: "ເຊີຟເວີຣ໌"
registeredAt: "ລົງທະບຽນຢູ່"
storageUsage: "ບ່ອນຈັດເກັບຂໍ້ມູນທີ່ໃຊ້"
-charts: "ອັນດັບເພງ"
+charts: "ແຜນພູມ"
perHour: "ຕໍ່ຊົ່ວໂມງ"
perDay: "ຕໍ່ມື້"
stopActivityDelivery: "ຢຸດເຊົາການສົ່ງກິດຈະກໍາ"
blockThisInstance: "ຂັດຂວາງຕົວຢ່າງນີ້"
operations: "ການດຳເນີນງານ"
software: "ຊອບແວ"
-version: "ສະບັບ"
+version: "ເວີຣ໌ຊັນ"
metadata: "Metadata"
withNFiles: "{n} ໄຟລ໌(s)"
monitor: "ຈໍພາບ"
@@ -199,15 +199,15 @@ federating: "ສະຫະພັນ"
blocked: "ບລັອກແລ້ວ "
suspended: "ໂຈະ"
all: "ທັງໝົດ"
-subscribing: "ສະໝັກສະມາຊິກແລັວ"
-publishing: "ການພິມເຜີຍແຜ່"
+subscribing: "ກຳລັງສະມັກສະມາຊິກ"
+publishing: "ກຳລັງເຜີຍແພ່"
notResponding: "ບໍ່ຕອບສະໜອງ"
-instanceFollowing: "ກຳລັງຕິດຕາມສຸດຕົວຢ່າງ"
-instanceFollowers: "ຜູ້ຕິດຕາມຕົວຢ່າງ"
-instanceUsers: "ຜູ້ຊົມໃຊ້ຂອງຕົວຢ່າງນີ້"
+instanceFollowing: "ກຳລັງຕິດຕາມບົນເຊີຟເວີຣ໌"
+instanceFollowers: "ຜູ້ຕິດຕາມຂອງເຊີຟເວີຣ໌"
+instanceUsers: "ຜູ້ໃຊ້ຂອງເຊີຟເວີຣ໌ນີ້"
changePassword: "ປ່ຽນລະຫັດຜ່ານ"
security: "ຄວາມປອດໄພ"
-retypedNotMatch: "ວັດສະດຸປ້ອນບໍ່ກົງກັນ"
+retypedNotMatch: "ປ້ອນຂໍ້ມູນບໍ່ກົງກັນ"
currentPassword: "ລະຫັດຜ່ານປະຈຸບັນ"
newPassword: "ລະຫັດຜ່ານໃໝ່"
newPasswordRetype: "ໃສ່ລະຫັດຜ່ານໃໝ່ອີກເທື່ອໜຶ່ງ"
@@ -223,14 +223,14 @@ remove: "ລຶບ"
removed: "ລຶບແລ້ວ"
resetAreYouSure: "ຣີເຊັດບໍ?"
saved: "ບັນທຶກແລ້ວ"
-messaging: "ແຊ໋ດ"
+messaging: "ແຊັຕ"
upload: "ອັບໂຫຼດ"
keepOriginalUploading: "ຮັກສາຮູບພາບຕົ້ນສະບັບ"
fromDrive: "ຈາກ Drive"
fromUrl: "ຈາກ URL"
uploadFromUrl: "ອັບໂຫຼດຈາກ URL"
uploadFromUrlDescription: "URL ຂອງໄຟລ໌ທີ່ທ່ານຕ້ອງການອັບໂຫລດ"
-uploadFromUrlRequested: "ຮ້ອງຂໍການອັບໂຫລດ"
+uploadFromUrlRequested: "ຮ້ອງຂໍການອັບໂຫລດແລ້ວ"
explore: "ສຳຫຼວດ"
messageRead: "ອ່ານແລ້ວ"
startMessaging: "ເລີ່ມການສົນທະນາໃໝ່"
@@ -244,47 +244,47 @@ images: "ຮູບພາບ"
image: "ຮູບພາບ"
birthday: "ວັນເກີດ"
yearsOld: "{age} ປີ"
-registeredDate: "ວັນທີ່ເປັນສະມາຊິກ"
+registeredDate: "ວັນທີ່ລົງທະບຽນ"
location: "ທີ່ຕັ້ງ"
-theme: "ແທ໋ມ"
-themeForLightMode: "ຮູບແບບສີສັນເພື່ອໃຊ້ໃນໂໝດແສງ"
-themeForDarkMode: "ຮູບແບບສີສັນທີ່ຈະໃຊ້ຢູ່ໃນໂໝດມືດ"
+theme: "Theme"
+themeForLightMode: "Theme ໃຊ້ໃນໂໝດສະຫວ່າງ"
+themeForDarkMode: "Theme ໃຊ້ໃນໂໝດມືດ"
light: "ສະຫວ່າງ"
dark: "ມືດ"
lightThemes: "ຊຸດຮູບແບບສະຫວ່າງ"
darkThemes: "ຮູບແບບສີສັນມືດ"
syncDeviceDarkMode: "ຊິງຄ໌ໂໝດມືດກັບການຕັ້ງຄ່າທົ່ວອຸປະກອນ"
-drive: "ຂັບ"
+drive: "Drive"
fileName: "ຊື່ໄຟລ໌"
selectFile: "ເລືອກໄຟລ໌"
selectFiles: "ເລືອກໄຟລ໌"
selectFolder: "ເລືອກໂຟລເດີ"
selectFolders: "ເລືອກໂຟລເດີ"
renameFile: "ປ່ຽນຊື່ໄຟລ໌"
-folderName: "ຊື່ໂຟນເດີ"
+folderName: "ຊື່ໂຟລເດີຣ໌"
createFolder: "ສ້າງໂຟລເດີ"
renameFolder: "ປ່ຽນຊື່ໂຟນເດີນີ້"
deleteFolder: "ລົບໂຟລເດີ"
addFile: "ເພີ່ມໄຟລ໌"
emptyDrive: "Drive ຂອງທ່ານຫວ່າງເປົ່າ"
-emptyFolder: "ໂຟນເດີນີ້ເປົ່າຫວ່າງ"
+emptyFolder: "ໂຟລເດີຣ໌ນີ້ວ່າງເປົ່າ"
unableToDelete: "ບໍ່ສາມາດລົບໄດ້"
inputNewFileName: "ໃສ່ຊື່ໄຟລ໌ໃໝ່"
inputNewDescription: "ໃສ່ຄຳບັນຍາຍໃໝ່"
inputNewFolderName: "ໃສ່ຊື່ໂຟນເດີໃໝ່"
circularReferenceFolder: "ໂຟນເດີປາຍທາງແມ່ນໂຟນເດີຍ່ອຍຂອງໂຟນເດີທີ່ທ່ານຕ້ອງການຍ້າຍ"
rename: "ປ່ຽນຊື່"
-doNothing: "ບໍ່ສົນໃຈ"
-watch: "ເບິ່ງ"
-unwatch: "ຢຸດເບິ່ງ"
+doNothing: "ຢ່າມັນ"
+watch: "ເພັ່ງເລັງ"
+unwatch: "ຢຸດເພັ່ງເລັງ"
accept: "ອະນຸຍາດ"
reject: "ປະຕິເສດ"
normal: "ປົກກະຕິ"
instanceName: "ຊື່ເຊີເວີ້"
-instanceDescription: "ຄໍາອະທິບາຍຕົວຢ່າງ"
+instanceDescription: "ຄຳອະທິບາຍແນະນຳເຊີຟເວີຣ໌"
maintainerName: "ຜູ້ດູແລ"
-maintainerEmail: "ອີເມວ admin"
-tosUrl: "ເງື່ອນໄຂການໃຫ້ບໍລິການ URL"
+maintainerEmail: "ອີເມລຜູ້ດູແລ"
+tosUrl: " URL ເງື່ອນໄຂການໃຫ້ບໍລິການ"
thisYear: "ປີນີ້"
thisMonth: "ເດືອນນີ້"
today: "ມື້ນີ້"
@@ -292,34 +292,34 @@ dayX: "ວັນ {day}"
monthX: "ເດືອນ {month}"
yearX: "ປີ {year}"
pages: "ໜ້າ"
-integration: "ຄວາມສຳພັນຂອງ"
+integration: "ເຊື່ອມໂຍງ"
connectService: "ເຊື່ອມຕໍ່"
disconnectService: "ຕັດການເຊື່ອມຕໍ່"
enableLocalTimeline: "ເປີດໃຊ້ທາມລາຍທ້ອງຖິ່ນ"
enableGlobalTimeline: "ເປີດໃຊ້ທາມລາຍທົ່ວໂລກ"
-disablingTimelinesInfo: "ຜູ້ເບິ່ງແຍງລະບົບ ແລະຜູ້ຄວບຄຸມຈະມີການເຂົ້າເຖິງທຸກກຳນົດເວລາ, ເຖິງແມ່ນວ່າຈະບໍ່ໄດ້ເປີດໃຊ້ງານກໍຕາມ"
+disablingTimelinesInfo: "ຜູ້ດູແລລະບບແລະຜູ້ຄວບຄຸມຈະສາມາດເຂົ້າເຖີງໄທມ໌ໄລນ໌ທັ້ງເບີດ ເຖີງວ່າຈະບໍ່ໄດ້ເປີດໃຊ້ງານກໍ່ຕາມ"
registration: "ລົງທະບຽນ"
enableRegistration: "ເປີດໃຊ້ການລົງທະບຽນຜູ້ໃຊ້ໃໝ່"
invite: "ເຊີນ"
-driveCapacityPerLocalAccount: "ຄວາມອາດສາມາດຂັບຕໍ່ຜູ້ໃຊ້ທ້ອງຖິ່ນ"
-driveCapacityPerRemoteAccount: "ໄດຣຟ໌ຄວາມອາດສາມາດຕໍ່ຜູ້ໃຊ້ທາງໄກ"
+driveCapacityPerLocalAccount: "ຄວາມຈຸຂອງ drive ຕໍ່ຜູ້ໃຊ້ທ້ອງຖິ່ນ"
+driveCapacityPerRemoteAccount: "ຄວາມຈຸຂອງ drive ຕໍ່ຜູ້ໃຊ້ໄລຍະໄກ"
basicInfo: "ຂໍ້ມຸນເບື້ອງຕົ້ນ"
-pinnedNotes: "ບັນທຶກທີ່ປັກໝຸດໄວ້"
-hcaptchaSiteKey: "ກະແຈໄຊທ໌"
-hcaptchaSecretKey: "ກະແຈລັບ"
-mcaptchaSiteKey: "ກະແຈໄຊທ໌"
-mcaptchaSecretKey: "ກະແຈລັບ"
+pinnedNotes: "Note ທີ່ປັກໝຸດໄວ້"
+hcaptchaSiteKey: "Site key"
+hcaptchaSecretKey: "Secret key"
+mcaptchaSiteKey: "Site key"
+mcaptchaSecretKey: "Secret Key"
recaptcha: "reCAPTCHA"
-enableRecaptcha: "ເປີດໃຊ້ງານລີແຄ໋ບຈາ"
-recaptchaSiteKey: "ກະແຈໄຊທ໌"
-recaptchaSecretKey: "ກະແຈລັບ"
-turnstileSiteKey: "ກະແຈໄຊທ໌"
-turnstileSecretKey: "ກະແຈລັບ"
+enableRecaptcha: "ເປີດໃຊ້ງານ reCAPTCHA"
+recaptchaSiteKey: "Site key"
+recaptchaSecretKey: "Secret key"
+turnstileSiteKey: "Site key"
+turnstileSecretKey: "Secret key"
name: "ຊື່"
userList: "ລາຍການ"
about: "ກ່ຽວກັບ"
aboutMisskey: "ກ່ຽວກັບ Misskey"
-administrator: "ຜູ້ບໍລິຫານ"
+administrator: "ຜູ້ດູແລ"
token: "ໂທເຄັນ"
share: "ແບ່ງປັນ"
notFound: "ບໍ່ພົບ"
@@ -332,27 +332,27 @@ title: "ຫົວຂໍ້"
text: "ຂໍ້ຄວາມ"
enable: "ເປີດໃຊ້"
next: "ຕໍ່ໄປ"
-retype: "ເຂົ້າໄປອີກຄັ້ງ"
-quoteAttached: "ວົງຢືມ"
+retype: "ລອງພິມລະຫັດອີກເທື່ອໜຶ່ງ"
+quoteAttached: "ອ້າງອິງ"
invitations: "ເຊີນ"
unavailable: "ບໍ່ສາມາດໃຊ້ໄດ້"
language: "ພາສາ"
aboutX: "ກ່ຽວກັບ {x}"
emojiStyle: "ຮູບແບບອີໂມຈິ"
native: "ພາສາແມ່"
-noHistory: "ບໍ່ມີລາຍການຢູ່ບ່ອນນີ້"
+noHistory: "ບໍ່ມີປະຫວັດ"
doing: "ກຳລັງປະມວນຜົນ..."
category: "ຫມວດຫມູ່"
-tags: "ແທ໋ກ"
+tags: "Aliases"
createAccount: "ສ້າງບັນຊີ"
-existingAccount: "ທີ່ມີຢູ່"
-dashboard: "ໜ້າປັດ"
+existingAccount: "ບັນຊີທີ່ມີຢູ່ແລ້ວ"
+dashboard: "Dashboard"
local: "ທ້ອງຖິ່ນ"
numberOfDays: "ຈຳນວນມື້"
objectStorageBucket: "Bucket"
objectStoragePrefix: "Prefix"
objectStorageEndpoint: "Endpoint"
-objectStorageRegion: "ພາກພື້ນ"
+objectStorageRegion: "ພູມິພາກ"
deleteAll: "ລຶບທັງໝົດ"
sounds: "ສຽງ"
sound: "ສຽງ"
@@ -365,11 +365,11 @@ state: "ສະຖານະ"
sort: "ຈັດຮຽງໂດຍ"
ascendingOrder: "ນ້ອຍໄປຫາໃຫຍ່"
descendingOrder: "ໃຫຍ່ຫານ້ອຍ"
-output: "ຜົນຜະລິດ"
-script: "ບົດຄວາມ"
+output: "Output"
+script: "Script"
menu: "ເມນູ"
-rearrange: "ຈັດລຽງຄືນ"
-poll: "ການພູນ"
+rearrange: "ຈັດລຽງໃໝ່"
+poll: "Poll"
description: "ລາຍລະອຽດ"
author: "ຜູ້ຂຽນ"
manage: "ການຈັດການ"
@@ -383,7 +383,7 @@ permission: "ການອະນຸຍາດ"
notificationType: "ປະເພດການແຈ້ງເຕືອນ"
edit: "ແກ້ໄຂ"
email: "ອີເມວ"
-smtpHost: "ໂຮດສ"
+smtpHost: "ໂຮສຕ໌"
smtpUser: "ຊື່ຜູ້ໃຊ້"
smtpPass: "ລະຫັດຜ່ານ"
clearCache: "ລຶບລ້າງແຄສ"
@@ -393,12 +393,12 @@ administration: "ການຈັດການ"
middle: "ປານກາງ"
searchByGoogle: "ຄົ້ນຫາ"
file: "ໄຟລ໌"
-replies: "ຕອບໄປທີ"
+replies: "ຕອບກັບ"
renotes: "Renote"
_delivery:
stop: "ໂຈະ"
_type:
- none: "ການພິມເຜີຍແຜ່"
+ none: "ກຳລັງເຜີຍແພ່"
_role:
_priority:
middle: "ປານກາງ"
@@ -416,8 +416,8 @@ _sfx:
_2fa:
renewTOTPCancel: "ບໍ່ແມ່ນຕອນນີ້"
_widgets:
- profile: "ໂພຼຟາຍ"
- instanceInfo: "ອີນສະແຕນ"
+ profile: "ໂປຣໄຟລ໌"
+ instanceInfo: "ຂໍ້ມູລເຊີຟເວີຣ໌"
notifications: "ການແຈ້ງເຕືອນ"
timeline: "ເສັ້ນກຳນົດເວລາ"
activity: "ກິດຈະກຳ"
@@ -436,28 +436,29 @@ _profile:
_exportOrImport:
followingList: "ກຳລັງຕິດຕາມ"
muteList: "ປີດສຽງ"
- blockingList: "ບ໋ອກ"
+ blockingList: "ບລັອກ"
userLists: "ລາຍການ"
_charts:
federation: "ສະຫະພັນ"
_timelines:
home: "ໜ້າຫຼັກ"
_play:
- script: "ບົດຄວາມ"
+ script: "Script"
summary: "ລາຍລະອຽດ"
_pages:
blocks:
image: "ຮູບພາບ"
_notification:
- youWereFollowed: "ໄດ້ຕິດຕາມທ່ານ"
+ youWereFollowed: "ໄດ້ຕິດຕາມເຈົ້າ"
_types:
follow: "ກຳລັງຕິດຕາມ"
- mention: "ໄດ້ກ່າວມາ"
+ mention: "ໄດ້ກ່າວເຖິງ"
renote: "Renote"
- quote: "ລວມຂໍ້ຄວາມອ້າງອີງ"
- reaction: "ປະຕິກິລິຍາ"
+ quote: "ອ້າງອີງ"
+ reaction: "Reaction"
+ login: "ເຂົ້າສູ່ລະບົບ"
_actions:
- reply: "ຕອບໄປທີ"
+ reply: "ຕອບກັບ"
renote: "Renote"
_deck:
_columns:
@@ -465,8 +466,12 @@ _deck:
tl: "ເສັ້ນກຳນົດເວລາ"
list: "ລາຍການ"
channel: "ຊ່ອງ"
- mentions: "ກ່າວເຖິງ"
+ mentions: "ກ່າວເຖິງເຈົ້າ"
_webhookSettings:
name: "ຊື່"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "ອີເມວ"
_moderationLogTypes:
suspend: "ລະງັບ"
diff --git a/locales/nl-NL.yml b/locales/nl-NL.yml
index eb48cf72da..dde3035357 100644
--- a/locales/nl-NL.yml
+++ b/locales/nl-NL.yml
@@ -486,6 +486,7 @@ _notification:
renote: "Herdelen"
quote: "Quote"
reaction: "Reacties"
+ login: "Inloggen"
_actions:
reply: "Antwoord"
renote: "Herdelen"
diff --git a/locales/no-NO.yml b/locales/no-NO.yml
index 2b4c9b7776..c5f61db745 100644
--- a/locales/no-NO.yml
+++ b/locales/no-NO.yml
@@ -701,6 +701,7 @@ _notification:
renote: "Renotes"
quote: "Sitater"
reaction: "Reaksjoner"
+ login: "Logg inn"
_actions:
reply: "Svar"
renote: "Renote"
@@ -721,5 +722,9 @@ _deck:
direct: "Direkte"
_webhookSettings:
name: "Navn"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "E-post"
_moderationLogTypes:
suspend: "Suspender"
diff --git a/locales/pl-PL.yml b/locales/pl-PL.yml
index 9d75f7a9d7..d7afd57760 100644
--- a/locales/pl-PL.yml
+++ b/locales/pl-PL.yml
@@ -492,7 +492,6 @@ uiLanguage: "Język wyświetlania UI"
aboutX: "O {x}"
emojiStyle: "Styl emoji"
native: "Natywny"
-disableDrawer: "Nie używaj menu w stylu szuflady"
showNoteActionsOnlyHover: "Pokazuj akcje notatek tylko po najechaniu myszką"
showReactionsCount: "Wyświetl liczbę reakcji na notatkę"
noHistory: "Brak historii"
@@ -690,10 +689,7 @@ abuseReported: "Twoje zgłoszenie zostało wysłane. Dziękujemy."
reporter: "Zgłaszający"
reporteeOrigin: "Pochodzenie zgłoszonego"
reporterOrigin: "Pochodzenie zgłaszającego"
-forwardReport: "Przekaż zgłoszenie do innej instancji"
-forwardReportIsAnonymous: "Zamiast twojego konta, anonimowe konto systemowe będzie wyświetlone jako zgłaszający na instancji zdalnej."
send: "Wyślij"
-abuseMarkAsResolved: "Oznacz zgłoszenie jako rozwiązane"
openInNewTab: "Otwórz w nowej karcie"
openInSideView: "Otwórz w bocznym widoku"
defaultNavigationBehaviour: "Domyślne zachowanie nawigacji"
@@ -1209,7 +1205,6 @@ _theme:
buttonBg: "Tło przycisku"
buttonHoverBg: "Tło przycisku (po najechaniu)"
inputBorder: "Obramowanie pola wejścia"
- listItemHoverBg: "Tło elementu listy (po najechaniu)"
driveFolderBg: "Tło folderu na dysku"
wallpaperOverlay: "Nakładka tapety"
badge: "Odznaka"
@@ -1221,8 +1216,6 @@ _sfx:
note: "Wpisy"
noteMy: "Mój wpis"
notification: "Powiadomienia"
- antenna: "Anteny"
- channel: "Powiadomienia kanału"
_ago:
future: "W przyszłości"
justNow: "Przed chwilą"
@@ -1512,6 +1505,7 @@ _notification:
reaction: "Reakcja"
receiveFollowRequest: "Otrzymano prośbę o możliwość obserwacji"
followRequestAccepted: "Przyjęto prośbę o możliwość obserwacji"
+ login: "Zaloguj się"
app: "Powiadomienia z aplikacji"
_actions:
followBack: "zaobserwował cię z powrotem"
@@ -1546,7 +1540,6 @@ _webhookSettings:
createWebhook: "Stwórz Webhook"
name: "Nazwa"
secret: "Sekret"
- events: "Uruchomienie Webhooka"
active: "Właczono"
_events:
follow: "Po zaobserwowaniu użytkownika"
@@ -1556,6 +1549,10 @@ _webhookSettings:
renote: "Po udostępnieniu wpisu"
reaction: "Po otrzymaniu reakcji"
mention: "Po zostaniu wspomnianym"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "Adres e-mail"
_moderationLogTypes:
suspend: "Zawieś"
resetPassword: "Zresetuj hasło"
diff --git a/locales/pt-PT.yml b/locales/pt-PT.yml
index cfc576b6e1..9039fd2141 100644
--- a/locales/pt-PT.yml
+++ b/locales/pt-PT.yml
@@ -2,14 +2,14 @@
_lang_: "Português"
headlineMisskey: "Uma rede ligada por notas"
introMisskey: "Bem-vindo! O Misskey é um serviço de microblog descentralizado de código aberto.\nCrie \"notas\" para compartilhar o que está acontecendo agora ou para se expressar com todos à sua volta 📡\nVocê também pode adicionar rapidamente reações às notas de outras pessoas usando a função \"Reações\" 👍\nVamos explorar um novo mundo 🚀"
-poweredByMisskeyDescription: "{name} é um dos servidores da plataforma de código aberto Misskey."
+poweredByMisskeyDescription: "{name} é uma instância da plataforma de código aberto Misskey."
monthAndDay: "{day}/{month}"
search: "Pesquisar"
notifications: "Notificações"
username: "Nome de usuário"
password: "Senha"
forgotPassword: "Esqueci-me da senha"
-fetchingAsApObject: "Buscando no Fediverso"
+fetchingAsApObject: "Buscando no Fediverso..."
ok: "OK"
gotIt: "Entendi"
cancel: "Cancelar"
@@ -60,6 +60,7 @@ copyFileId: "Copiar o ID do arquivo"
copyFolderId: "Copiar o ID da pasta"
copyProfileUrl: "Copiar a URL do perfil"
searchUser: "Pesquisar usuário"
+searchThisUsersNotes: "Pesquisar as notas desse usuário"
reply: "Responder"
loadMore: "Carregar mais"
showMore: "Ver mais"
@@ -81,7 +82,7 @@ exportRequested: "A sua solicitação de exportação foi enviada. Isso pode lev
importRequested: "A sua solicitação de importação foi enviada. Isso pode levar algum tempo."
lists: "Listas"
noLists: "Não possui nenhuma lista"
-note: "Post"
+note: "Publicar"
notes: "Posts"
following: "Seguindo"
followers: "Seguidores"
@@ -99,7 +100,7 @@ enterListName: "Insira um nome para a lista"
privacy: "Privacidade"
makeFollowManuallyApprove: "Pedidos de seguidores precisam ser aprovados"
defaultNoteVisibility: "Visibilidade padrão"
-follow: "Seguindo"
+follow: "Seguir"
followRequest: "Enviar pedido de seguidor"
followRequests: "Pedidos de seguidor"
unfollow: "Deixar de seguir"
@@ -108,11 +109,14 @@ enterEmoji: "Inserir emoji"
renote: "Repostar"
unrenote: "Remover repostagem"
renoted: "Repostado"
+renotedToX: "Repostar em {name}."
cantRenote: "Não é possível repostar esta postagem"
cantReRenote: "Não pode repostar este repost"
quote: "Citar"
inChannelRenote: "Repostar no canal"
inChannelQuote: "Citar no canal"
+renoteToChannel: "Repostar em canal"
+renoteToOtherChannel: "Repostar em outro canal"
pinnedNote: "Nota fixada"
pinned: "Fixar no perfil"
you: "Você"
@@ -121,9 +125,16 @@ sensitive: "Conteúdo sensível"
add: "Adicionar"
reaction: "Reações"
reactions: "Reações"
+emojiPicker: "Seleção de emoji"
+pinnedEmojisForReactionSettingDescription: "Selecionar os emojis que serão fixados e exibidos ao reagir."
+pinnedEmojisSettingDescription: "Selecionar os emojis que serão fixos e exibidos na seleção de emoji."
+emojiPickerDisplay: "Janela de seleção de emoji"
+overwriteFromPinnedEmojisForReaction: "Sobrescrever as opções de reação"
+overwriteFromPinnedEmojis: "Sobrescrever as opções gerais"
reactionSettingDescription2: "Arraste para reordenar, clique para excluir, pressione + para adicionar."
rememberNoteVisibility: "Lembrar das configurações de visibilidade de notas"
attachCancel: "Remover anexo"
+deleteFile: "Excluir arquivo"
markAsSensitive: "Marcar como sensível"
unmarkAsSensitive: "Desmarcar como sensível"
enterFileName: "Digite o nome do arquivo"
@@ -144,6 +155,7 @@ editList: "Editar lista"
selectChannel: "Selecionar canal"
selectAntenna: "Selecione uma antena"
editAntenna: "Editar antena"
+createAntenna: "Criar uma antena"
selectWidget: "Selecione um widget"
editWidgets: "Editar widgets"
editWidgetsExit: "Pronto"
@@ -170,16 +182,21 @@ addAccount: "Adicionar Conta"
reloadAccountsList: "Recarregar lista de contas"
loginFailed: "Falha ao logar"
showOnRemote: "Exibir remotamente"
+continueOnRemote: ""
+chooseServerOnMisskeyHub: "Escolher um servidor da Misskey Hub"
+specifyServerHost: "Especificar uma instância diretamente"
+inputHostName: "Insira o domínio"
general: "Geral"
wallpaper: "Papel de parede"
setWallpaper: "Definir papel de parede"
removeWallpaper: "Remover papel de parede"
searchWith: "Buscar: {q}"
youHaveNoLists: "Não tem nenhuma lista"
-followConfirm: "Tem certeza que quer deixar de seguir {name}?"
+followConfirm: "Tem certeza que quer seguir {name}?"
proxyAccount: "Conta proxy"
proxyAccountDescription: "Uma conta de proxy é uma conta que assume o acompanhamento remoto de um usuário sob certas condições específicas. Por exemplo, quando um usuário inclui um usuário remoto em uma lista, mas ninguém na lista está seguindo o usuário remoto, a atividade não é entregue ao servidor. Nesse caso, a conta de proxy entra em ação para seguir o usuário remoto em vez disso."
host: "Host"
+selectSelf: "Escolher manualmente"
selectUser: "Selecionar usuário"
recipient: "Destinatário"
annotation: "Anotação"
@@ -194,6 +211,8 @@ perHour: "Por Hora"
perDay: "Por dia"
stopActivityDelivery: "Parar a entrega de atividades"
blockThisInstance: "Bloquear esta instância"
+silenceThisInstance: "Silenciar essa instância"
+mediaSilenceThisInstance: "Silenciar a mídia dessa instância"
operations: "Operações"
software: "Software"
version: "Versão"
@@ -213,6 +232,10 @@ clearCachedFiles: "Limpar o cache"
clearCachedFilesConfirm: "Deseja excluir todos os arquivos remotos em cache?"
blockedInstances: "Instância bloqueada"
blockedInstancesDescription: "Configure os hosts dos servidores que deseja bloquear, separando-os por quebras de linha. Os servidores bloqueados não poderão interagir com este servidor, incluindo os subdomínios."
+silencedInstances: "Instâncias silenciadas"
+silencedInstancesDescription: "Liste o nome de hospedagem dos servidores que você deseja silenciar, separados por linha. Todas as contas desses servidores serão silenciada e poderão enviar solicitações para seguir, mas não poderão mencionar usuários locais sem segui-los. Isso não afetará servidores bloqueados."
+mediaSilencedInstances: "Instâncias com mídia silenciadas"
+mediaSilencedInstancesDescription: "Liste o nome de hospedagem dos servidores cuja mídia você deseja silenciar, separados por linha. Todas as contas desses servidores serão consideradas sensíveis e não poderão utilizar emojis personalizados. Isso não afetará servidores bloqueados."
muteAndBlock: "Silenciar e bloquear"
mutedUsers: "Usuários silenciados"
blockedUsers: "Usuários bloqueados"
@@ -249,7 +272,7 @@ more: "Mais!"
featured: "Destaques"
usernameOrUserId: "Nome de usuário ou ID do usuário"
noSuchUser: "Usuário não encontrado"
-lookup: "Buscando"
+lookup: "Consultar"
announcements: "Avisos"
imageUrl: "URL da imagem"
remove: "Remover"
@@ -257,6 +280,7 @@ removed: "Removido"
removeAreYouSure: "Deseja excluir \"{x}\"?"
deleteAreYouSure: "Deseja excluir \"{x}\"?"
resetAreYouSure: "Deseja reiniciar?"
+areYouSure: "Tem certeza?"
saved: "Salvo"
messaging: "Chat"
upload: "Fazer upload"
@@ -272,7 +296,7 @@ explore: "Explorar"
messageRead: "Lida"
noMoreHistory: "Não existe histórico anterior"
startMessaging: "Iniciar conversação"
-nUsersRead: "{n} Pessoas leem"
+nUsersRead: "{n} pessoas leram"
agreeTo: "Eu concordo com {0}"
agree: "Concordar"
agreeBelow: "Eu concordo com o seguinte"
@@ -288,7 +312,7 @@ birthday: "Aniversário"
yearsOld: "{age} anos"
registeredDate: "Data de registro"
location: "Localização"
-theme: "tema"
+theme: "Tema"
themeForLightMode: "Temas usados no modo de luz"
themeForDarkMode: "Temas usados no modo escuro"
light: "Claro"
@@ -302,11 +326,13 @@ selectFile: "Selecione os arquivos"
selectFiles: "Selecione os arquivos"
selectFolder: "Selecionar uma pasta"
selectFolders: "Selecionar uma pasta"
+fileNotSelected: "Nenhuma pasta selecionada"
renameFile: "Renomear ficheiro"
folderName: "Nome da pasta"
createFolder: "Criar pasta"
renameFolder: "Renomear Pasta"
deleteFolder: "Excluir pasta"
+folder: "Pasta"
addFile: "Adicionar arquivo"
emptyDrive: "O drive está vazio"
emptyFolder: "A pasta está vazia"
@@ -368,8 +394,11 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Ativar hCaptcha"
hcaptchaSiteKey: "Chave do sítio ‘web’"
hcaptchaSecretKey: "Chave secreta"
+mcaptcha: "mCaptcha"
+enableMcaptcha: "Habilitar mCaptcha"
mcaptchaSiteKey: "Chave do sítio ‘web’"
mcaptchaSecretKey: "Chave secreta"
+mcaptchaInstanceUrl: "URL do servidor mCaptcha"
recaptcha: "reCAPTCHA"
enableRecaptcha: "Habilitar reCAPTCHA"
recaptchaSiteKey: "Chave do sítio ‘web’"
@@ -385,6 +414,7 @@ name: "Nome"
antennaSource: "Origem de entrada"
antennaKeywords: "Palavras-chave recebidas"
antennaExcludeKeywords: "Palavras-chave negativas"
+antennaExcludeBots: "Ignorar contas de bot"
antennaKeywordsDescription: "Se você separá-lo com um espaço, será uma especificação AND, e se você separá-lo com uma quebra de linha, será uma especificação OR."
notifyAntenna: "Notificar novas notas"
withFileAntenna: "Apenas notas com arquivos anexados"
@@ -417,6 +447,9 @@ totp: "Aplicativo Autenticador"
totpDescription: "Digite a senha de uso único informado pelo aplicativo autenticador"
moderator: "Moderador"
moderation: "Moderação"
+moderationNote: "Nota de moderação"
+addModerationNote: "Adicionar nota de moderação"
+moderationLogs: "Logs de moderação"
nUsersMentioned: "Postado por {n} pessoas"
securityKeyAndPasskey: "Chave de segurança / Chave de acesso"
securityKey: "Chave de segurança"
@@ -449,10 +482,12 @@ retype: "Digite novamente"
noteOf: "Publicação de {user}"
quoteAttached: "Com citação"
quoteQuestion: "Anexar como citação?"
+attachAsFileQuestion: "O texto na área de transferência é muito longo. Você gostaria de anexá-lo como um arquivo de texto?"
noMessagesYet: "Sem conversas até o momento"
newMessageExists: "Há uma nova mensagem"
onlyOneFileCanBeAttached: "Apenas um arquivo pode ser anexado a uma mensagem"
signinRequired: "É necessário se inscrever ou fazer login antes de continuar"
+signinOrContinueOnRemote: "Para continuar, você precisa mover o seu servidor ou entrar/cadastrar-se nesse servidor."
invitations: "Convidar"
invitationCode: "Código de convite"
checking: "Verificando..."
@@ -474,8 +509,8 @@ uiLanguage: "Idioma de exibição da interface "
aboutX: "Sobre {x}"
emojiStyle: "Estilo de emojis"
native: "Nativo"
-disableDrawer: "Não mostrar o menu em formato de gaveta"
showNoteActionsOnlyHover: "Exibir as ações da nota somente ao passar o cursor sobre ela"
+showReactionsCount: "Ver o número de reações nas notas"
noHistory: "Ainda não há histórico"
signinHistory: "Histórico de acesso"
enableAdvancedMfm: "Habilitar MFM avançado"
@@ -524,10 +559,11 @@ objectStorageUseProxy: "Usar proxy"
objectStorageUseProxyDesc: "Se você não usa proxy para conexão de API, desative-o."
objectStorageSetPublicRead: "Definir 'public-read' ao fazer o upload"
s3ForcePathStyleDesc: "Ao habilitar s3ForcePathStyle, o nome do bucket é especificado como parte do caminho em vez de ser o nome do host na URL. Isso pode ser necessário ao usar serviços auto-hospedados como o Minio."
-serverLogs: "Registro do servidor"
+serverLogs: "Logs do servidor"
deleteAll: "Excluir tudo"
showFixedPostForm: "Exibir o formulário de postagem na parte superior da linha do tempo"
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"
newNoteRecived: "Nova nota recebida"
sounds: "Sons"
sound: "Sons"
@@ -537,6 +573,8 @@ showInPage: "Ver na página"
popout: "Sair"
volume: "Volume"
masterVolume: "volume principal"
+notUseSound: "Desabilitar som"
+useSoundOnlyWhenActive: "Apenas reproduzir sons quando Misskey estiver aberto."
details: "Detalhes"
chooseEmoji: "Selecione um emoji"
unableToProcess: "Não é possível concluir a operação"
@@ -557,6 +595,10 @@ output: "Resultado"
script: "Script"
disablePagesScript: "Desabilitar scripts nas páginas"
updateRemoteUser: "Atualizar informações do usuário remoto"
+unsetUserAvatar: "Remover avatar"
+unsetUserAvatarConfirm: "Você tem certeza de que deseja remover o avatar?"
+unsetUserBanner: "Remover banner"
+unsetUserBannerConfirm: "Você tem certeza de que deseja remover o banner?"
deleteAllFiles: "Excluir todos os arquivos"
deleteAllFilesConfirm: "Deseja excluir todos os arquivos?"
removeAllFollowing: "Deseja remover todos os seguidores?"
@@ -607,6 +649,7 @@ medium: "Médio"
small: "Pequeno"
generateAccessToken: "Gerar token de acesso"
permission: "Permissões"
+adminPermission: "Permissões de administrador"
enableAll: "Habilitar tudo"
disableAll: "Desabilitar tudo"
tokenRequested: "Autorização de acesso à conta"
@@ -628,6 +671,7 @@ smtpSecure: "Use SSL/TLS implícito para conexões SMTP"
smtpSecureInfo: "Desative esta opção ao utilizar STARTTLS."
testEmail: "Testar envio de e-mail"
wordMute: "Silenciar palavras"
+hardWordMute: "SIlenciamento pesado de palavra"
regexpError: "Erro na expressão regular"
regexpErrorDescription: "Ocorreu um erro na expressão regular na linha {line} da palavra mutada {tab}:"
instanceMute: "Instâncias silenciadas"
@@ -649,12 +693,13 @@ useGlobalSettingDesc: "Ao ativar, serão utilizadas as configurações de notifi
other: "Outros"
regenerateLoginToken: "Gerar novo token de login"
regenerateLoginTokenDescription: "Gera novamente o token interno usado para o login. Normalmente, isso não é necessário. Ao regenerar, você será desconectado de todos os dispositivos."
+theKeywordWhenSearchingForCustomEmoji: "Essa é a palavra-chave ao pesquisar por emojis personalizados"
setMultipleBySeparatingWithSpace: "Você pode configurar vários itens separando-os por espaço."
fileIdOrUrl: "ID do arquivo ou URL"
behavior: "Comportamento"
sample: "Exemplo"
abuseReports: "Denúncias"
-reportAbuse: "Denúncias"
+reportAbuse: "Denunciar"
reportAbuseRenote: "Reportar repostagem"
reportAbuseOf: "Denunciar {name}"
fillAbuseReportDescription: "Por favor, forneça detalhes sobre o motivo da denúncia. Se houver uma nota específica envolvida, inclua também a URL dela."
@@ -662,10 +707,7 @@ abuseReported: "Denúncia enviada. Obrigado por sua ajuda."
reporter: "Denunciante"
reporteeOrigin: "Origem da denúncia"
reporterOrigin: "Origem do denunciante"
-forwardReport: "Encaminhar a denúncia para o servidor remoto"
-forwardReportIsAnonymous: "No servidor remoto, suas informações não serão visíveis, e você será apresentado como uma conta do sistema anônima."
send: "Enviar"
-abuseMarkAsResolved: "Marcar denúncia como resolvida"
openInNewTab: "Abrir em nova aba"
openInSideView: "Abrir em visão lateral"
defaultNavigationBehaviour: "Navegação padrão"
@@ -708,6 +750,7 @@ lockedAccountInfo: "Mesmo que você defina a aprovação para seguir, a menos qu
alwaysMarkSensitive: "Marcar como sensível por padrão"
loadRawImages: "Exibir as imagens originais ao invés de miniaturas"
disableShowingAnimatedImages: "Não reproduzir imagens animadas"
+highlightSensitiveMedia: "Destacar mídia sensível"
verificationEmailSent: "Um e-mail de confirmação foi enviado. Siga o link no e-mail para concluir a verificação."
notSet: "Não definido"
emailVerified: "O endereço de e-mail foi confirmado"
@@ -721,7 +764,7 @@ experimentalFeatures: "Funcionalidades Experimentais"
experimental: "Experimental"
thisIsExperimentalFeature: "Este é um recurso experimental. As funções podem mudar ou pode não funcionar corretamente."
developer: "Programador"
-makeExplorable: "Deixe a sua conta mais fácil de encontrar."
+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."
showGapBetweenNotesInTimeline: "Mostrar um espaço entre as notas na linha de tempo"
duplicate: "Duplicar"
@@ -796,11 +839,12 @@ switchAccount: "Trocar conta"
enabled: "Ativado"
disabled: "Desativado"
quickAction: "Ações rápidas"
-user: "Usuários"
+user: "Usuário"
administration: "Administrar"
accounts: "Contas"
switch: "Trocar"
noMaintainerInformationWarning: "A informação de administrador não foi configurada."
+noInquiryUrlWarning: "URL de consulta não está definida"
noBotProtectionWarning: "A proteção contra bots não foi configurada."
configure: "Configurar"
postToGallery: "Criar publicação em galeria"
@@ -860,6 +904,8 @@ makeReactionsPublicDescription: "Isto vai deixar o histórico de todas as suas r
classic: "Clássico"
muteThread: "Silenciar esta conversa"
unmuteThread: "Desativar silêncio desta conversa"
+followingVisibility: "Visibilidade dos usuários seguidos"
+followersVisibility: "Visibilidade dos seguidores"
continueThread: "Ver mais desta conversa"
deleteAccountConfirm: "Deseja realmente excluir a conta?"
incorrectPassword: "Senha inválida."
@@ -925,21 +971,33 @@ fast: "Rápido"
sensitiveMediaDetection: "Detecção de conteúdo sensível"
localOnly: "Apenas local"
remoteOnly: "Apenas remoto"
+failedToUpload: "Falha ao enviar"
+cannotUploadBecauseInappropriate: "Esse arquivo não pôde ser enviado porque partes dele foram detectadas como potencialmente inapropriadas."
+cannotUploadBecauseNoFreeSpace: "Envio falhou devido à falta de capacidade no Drive."
cannotUploadBecauseExceedsFileSizeLimit: "Não é possível realizar o upload deste arquivo porque ele excede o tamanho máximo permitido."
beta: "Beta"
enableAutoSensitive: "Marcar automaticamente como conteúdo sensível"
enableAutoSensitiveDescription: "Quando disponível, a marcação de mídia sensível será automaticamente atribuído ao conteúdo de mídia usando aprendizado de máquina. Mesmo que você desative essa função, em alguns servidores, isso pode ser configurado automaticamente."
activeEmailValidationDescription: "A validação do endereço de e-mail do usuário será realizada de forma mais rigorosa, considerando se é um endereço descartável ou se é possível realizar comunicação efetiva. Se desativado, apenas a validade do formato do endereço será verificada como uma sequência de caracteres."
+navbar: "Barra de navegação"
shuffle: "Aleatório"
account: "Contas"
move: "Mover"
pushNotification: "Notificações Push"
subscribePushNotification: "Ativar notificações push"
unsubscribePushNotification: "Desativar notificações push"
+pushNotificationAlreadySubscribed: "Notificações push já estão habilitadas"
+pushNotificationNotSupported: "Seu navegador ou instância não tem suporte às notificações push"
+sendPushNotificationReadMessage: "Apagar notificações push quando elas foram lidas"
+sendPushNotificationReadMessageCaption: "Pode aumentar o consumo de energia do dispositivo."
+windowMaximize: "Maximizar"
windowMinimize: "Minimizar"
windowRestore: "Restaurar"
caption: "legenda"
+loggedInAsBot: "Atualmente conectado como bot"
tools: "Ferramentas"
+cannotLoad: "Não foi possível carregar"
+numberOfProfileView: "Visualizações do perfil"
like: "Curtir"
unlike: "Remover curtida"
numberOfLikes: "Número de curtidas"
@@ -948,6 +1006,7 @@ neverShow: "Não exibir novamente"
remindMeLater: "Lembrar mais tarde"
didYouLikeMisskey: "Você gostou do Misskey?"
pleaseDonate: "O Misskey é um software gratuito utilizado por {host}. Para que possamos continuar o desenvolvimento, pedimos que considerem fazer doações. A sua contribuição é muito importante!"
+correspondingSourceIsAvailable: "O código-fonte correspondente está disponível em {anchor}"
roles: "Cargos"
role: "Cargo"
noRole: "Nenhum cargo"
@@ -957,6 +1016,7 @@ assign: "Atribuir"
unassign: "Remover"
color: "Cor"
manageCustomEmojis: "Gerenciar Emojis customizados"
+manageAvatarDecorations: "Gerenciar decorações de avatar"
youCannotCreateAnymore: "Você atingiu o limite de criação."
cannotPerformTemporary: "Ação temporariamente indisponível"
cannotPerformTemporaryDescription: "Esta ação não pôde ser concluída devido ao excesso de pedidos em sucessão. Tente novamente em alguns momentos."
@@ -974,218 +1034,635 @@ thisPostMayBeAnnoyingHome: "Postar na linha do tempo inicial"
thisPostMayBeAnnoyingCancel: "Cancelar"
thisPostMayBeAnnoyingIgnore: "Postar mesmo assim"
collapseRenotes: "Ocultar repostagens já visualizadas"
+collapseRenotesDescription: "Colapsar notas em que você reagiu ou repostou."
internalServerError: "Erro interno de servidor"
+internalServerErrorDescription: "Houve um erro inesperado no servidor."
+copyErrorInfo: "Copiar detalhes de erro"
+joinThisServer: "Cadastrar-se na instância"
+exploreOtherServers: "Buscar outra instância"
+letsLookAtTimeline: "Dar uma olhada na linha do tempo"
+disableFederationConfirm: "Realmente desabilitar a federação?"
+disableFederationConfirmWarn: "Mesmo se defederado, publicações continuarão sendo públicas, a menos que seja definido o contrário. Você geralmente não precisa disso."
+disableFederationOk: "Desabilitar"
+invitationRequiredToRegister: "Essa instância é apenas para convidados. Você precisa inserir um código válido para se cadastrar."
emailNotSupported: "O envio de e-mails não é suportado nesta instância"
+postToTheChannel: "Publicar ao canal"
+cannotBeChangedLater: "Isso não pode ser alterado."
+reactionAcceptance: "Aceitação de Reações"
likeOnly: "Apenas curtidas"
likeOnlyForRemote: "Tudo (somente curtidas remotas)"
+nonSensitiveOnly: "Apenas não-sensível"
nonSensitiveOnlyForLocalLikeOnlyForRemote: "Apenas não sensíveis (somente curtidas remotas)"
rolesAssignedToMe: "Cargos atribuídos a mim"
+resetPasswordConfirm: "Deseja realmente mudar a sua senha?"
+sensitiveWords: "Palavras sensíveis"
+sensitiveWordsDescription: "A visibilidade de todas as notas contendo as palavras configuradas será colocadas como \"Início\" automaticamente. Você pode listar várias delas separando-as por linha."
+sensitiveWordsDescription2: "Utilizar espaços irá criar expressões aditivas (AND) e cercar palavras-chave com barras irá transformá-las em expressões regulares (RegEx)"
+prohibitedWords: "Palavras proibidas"
+prohibitedWordsDescription: "Habilita um erro ao tentar publicar uma nota contendo as palavras escolhidas. Várias palavras podem ser escolhidas, separando-as por linha."
+prohibitedWordsDescription2: "Utilizar espaços irá criar expressões aditivas (AND) e cercar palavras-chave com barras irá transformá-las em expressões regulares (RegEx)"
+hiddenTags: "Hashtags escondidas"
+hiddenTagsDescription: "Selecione tags que não serão exibidas na lista de destaques. Várias tags podem ser escolhidas, separadas por linha."
+notesSearchNotAvailable: "A pesquisa de notas está indisponível."
+license: "Licença"
unfavoriteConfirm: "Deseja realmente remover dos favoritos?"
+myClips: "Meus clipes"
drivecleaner: "Limpeza do drive"
+retryAllQueuesNow: "Tentar novamente todas as pendências"
retryAllQueuesConfirmTitle: "Gostaria de tentar novamente agora?"
+retryAllQueuesConfirmText: "Isso irá temporariamente aumentar a carga do servidor."
+enableChartsForRemoteUser: "Gerar gráficos estatísticos de usuários remotos"
+enableChartsForFederatedInstances: "Gerar gráficos estatísticos de instâncias remotas"
+showClipButtonInNoteFooter: "Adicionar \"Clip\" ao menu de ação de notas"
reactionsDisplaySize: "Tamanho de exibição das reações"
+limitWidthOfReaction: "Limita o comprimento máximo de reações e as exibe em tamanho reduzido"
+noteIdOrUrl: "ID ou URL de nota"
+video: "Vídeo"
+videos: "Vídeos"
+audio: "Áudio"
+audioFiles: "Áudio"
+dataSaver: "Economia de Dados"
+accountMigration: "Migração da Conta"
+accountMoved: "Esse usuário moveu-se para uma nova conta:"
+accountMovedShort: "Essa conta foi migrada."
+operationForbidden: "Operação proibída"
+forceShowAds: "Sempre mostrar propagandas"
+addMemo: "Adicionar memorando"
+editMemo: "Editar memorando"
reactionsList: "Reações"
renotesList: "Repostagens"
+notificationDisplay: "Notificações"
leftTop: "Superior esquerdo"
rightTop: "Superior direito"
leftBottom: "Inferior esquerdo"
rightBottom: "Inferior direito"
+stackAxis: "Eixo de empilhamento"
vertical: "Vertical"
horizontal: "Exibir painel lateral inteiro"
position: "Posição"
serverRules: "Regras do servidor"
+pleaseConfirmBelowBeforeSignup: "Para cadastrar-se no servidor, você precisa ler e concordar como seguinte:"
+pleaseAgreeAllToContinue: "Você precisa concordar com todos os campos acima para continuar."
continue: "Continuar"
+preservedUsernames: "Nomes de usuário reservados"
preservedUsernamesDescription: "Liste os nomes de usuário que deseja reservar, separando-os por quebras de linha. Os nomes de usuário especificados aqui não poderão ser utilizados durante a criação de contas. No entanto, esta restrição não se aplica quando a conta é criada por um administrador. Além disso, as contas que já existem não serão afetadas."
+createNoteFromTheFile: "Compor nota a partir desse arquivo"
archive: "Arquivo"
+archived: "Arquivado"
+unarchive: "Desarquivar"
channelArchiveConfirmTitle: "Deseja realmente arquivar {name}?"
+channelArchiveConfirmDescription: "Um canal arquivado não irá aparecer na lista de canais e nem resultados de pesquisa. Novas publicações não poderão mais ser adicionadas."
+thisChannelArchived: "Esse canal foi arquivado."
+displayOfNote: "Exibição de nota"
+initialAccountSetting: "Configuração inicial do perfil"
youFollowing: "Seguindo"
+preventAiLearning: "Rejeitar uso de Aprendizado de Máquina (IA Generativa)"
preventAiLearningDescription: "Solicita-se que o conteúdo de notas e imagens enviadas não seja usado como objeto de aprendizado por sistemas externos de geração de texto ou imagens. Isso é alcançado incluindo a flag 'noai' na resposta HTML. No entanto, o cumprimento dessa solicitação depende do próprio sistema de IA, portanto, não é garantia total de prevenção de aprendizado."
options: "Opções"
+specifyUser: "Usuário específico"
+lookupConfirm: "Deseja buscar?"
+openTagPageConfirm: "Deseja abrir a uma página de hashtag?"
+specifyHost: "Especificar um hospedeiro"
+failedToPreviewUrl: "Não foi possível carregar prévia"
+update: "Atualizar"
rolesThatCanBeUsedThisEmojiAsReaction: "Cargos que podem utilizar este emoji como reação"
rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "Se nenhum cargo for especificado, qualquer pessoa pode usar este emoji como reação."
rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "Estes cargos devem ser públicos."
+cancelReactionConfirm: "Realmente excluir a sua reação?"
+changeReactionConfirm: "Realmente mudar a sua reação?"
+later: "Talvez mais tarde"
+goToMisskey: "Ao Misskey"
+additionalEmojiDictionary: "Dicionários adicionais de emoji"
+installed: "Instalado"
+branding: "Marca"
+enableServerMachineStats: "Publicar estatísticas do hardware do servidor"
+enableIdenticonGeneration: "Habilitar geração de identicon de usuário"
+turnOffToImprovePerformance: "Desligar isso pode melhorar o desempenho."
+createInviteCode: "Gerar convite"
+createWithOptions: "Criar com opções"
+createCount: "Número de convites"
+inviteCodeCreated: "Convite gerado"
+inviteLimitExceeded: "Você excedeu o limite de convites que podem ser gerados."
+createLimitRemaining: "Limite de convites: {limit}"
+inviteLimitResetCycle: "Esse limite irá tornar-se {limit} em {time}."
+expirationDate: "Data de expiração"
+noExpirationDate: "Sem expiração"
+inviteCodeUsedAt: "Código de convite usado em"
+registeredUserUsingInviteCode: "Convite usado por"
waitingForMailAuth: "Verificação de e-mail pendente "
+inviteCodeCreator: "Convite criado por"
+usedAt: "Usado em"
+unused: "Não foi usado"
+used: "Usado"
+expired: "Expirado"
+doYouAgree: "Concorda?"
+beSureToReadThisAsItIsImportant: "Por favor, leia essa informação importante."
+iHaveReadXCarefullyAndAgree: "Eu li o texto \"{x}\" e concordo."
+dialog: "Diálogo"
icon: "Avatar"
+forYou: "Para você"
+currentAnnouncements: "Anúncios atuais"
+pastAnnouncements: "Anúncios passados"
+youHaveUnreadAnnouncements: "Há anúncios não lidos."
+useSecurityKey: "Por favor, siga as instruções do seu navegador ou dispositivo para utilizar uma chave de acesso."
replies: "Responder"
renotes: "Repostar"
+loadReplies: "Mostrar respostas"
+loadConversation: "Mostrar conversa"
+pinnedList: "Lista fixada"
keepScreenOn: "Manter a tela do dispositivo sempre ligada"
+verifiedLink: "A autoria do link foi verificada"
+notifyNotes: "Notificar sobre novas notas"
+unnotifyNotes: "Deixar de notificar sobre novas notas"
+authentication: "Autenticação"
+authenticationRequiredToContinue: "Por favor, autentique-se para continuar"
+dateAndTime: "Data e Hora"
+showRenotes: "Exibir reposts"
+edited: "Editado"
+notificationRecieveConfig: "Configurações de Notificação"
+mutualFollow: "Seguidor mútuo"
+followingOrFollower: "Seguidor ou usuário seguido"
+fileAttachedOnly: "Apenas notas com arquivos"
+showRepliesToOthersInTimeline: "Mostrar respostas aos outros na linha do tempo"
+hideRepliesToOthersInTimeline: "Esconder respostas dos outros na linha do tempo"
+showRepliesToOthersInTimelineAll: "Mostrar respostas aos outros, mas apenas de quem você segue, na linha do tempo"
+hideRepliesToOthersInTimelineAll: "Esconder respostas de todos que você segue na linha do tempo"
+confirmShowRepliesAll: "Essa operação é irreversível. Você gostaria de mostrar respostas a todos que você segue na sua linha do tempo?"
+confirmHideRepliesAll: "Essa operação é irreversível. Você gostaria de esconder respostas a todos que você segue na sua linha do tempo?"
+externalServices: "Serviços Externos"
+sourceCode: "Código-fonte"
+sourceCodeIsNotYetProvided: "Código-fonte está indisponível. Contate o administrador para resolver esse problema."
+repositoryUrl: "URL do repositório"
+repositoryUrlDescription: "Se você estiver utilizando Misskey como está (sem mudanças no código-fonte), insira https://github.com/misskey-dev/misskey"
+repositoryUrlOrTarballRequired: "Se você não publicou um repositório, você precisa providenciar uma tarball em seu lugar. Veja .config/example.yml para mais informações."
+feedback: "Feedback"
+feedbackUrl: "Link para Feedback"
+impressum: "Impressum"
+impressumUrl: "URL de 'Impressum'"
+impressumDescription: "Em alguns países, como a Alemanha, a inclusão de informação de contato do operador de um serviço é legalmente exigida para websites comerciais."
+privacyPolicy: "Política de Privacidade"
+privacyPolicyUrl: "URL da Política de Privacidade"
+tosAndPrivacyPolicy: "Termos de Serviço e Política de Privacidade"
+avatarDecorations: "Decorações de avatar"
+attach: "Anexar"
+detach: "Remover"
+detachAll: "Remover Tudo"
+angle: "Ângulo"
flip: "Inversão"
+showAvatarDecorations: "Exibir decorações de avatar"
+releaseToRefresh: "Solte para atualizar"
+refreshing: "Atualizando..."
+pullDownToRefresh: "Puxe para baixo para atualizar"
+disableStreamingTimeline: "Desabilitar atualizações em tempo real da linha do tempo"
+useGroupedNotifications: "Agrupar notificações"
+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."
+doReaction: "Adicionar reação"
+code: "Código"
+reloadRequiredToApplySettings: "É necessário reiniciar para aplicar as configurações."
+remainingN: "Restante: {n}"
+overwriteContentConfirm: "Você tem certeza de que deseja sobrescrever o conteúdo atual?"
+seasonalScreenEffect: "Efeito de Tela Sazonal"
+decorate: "Decorar"
+addMfmFunction: "Adicionar MFM"
+enableQuickAddMfmFunction: "Exibir seleção avançada de MFM"
+bubbleGame: "Bubble Game"
+sfx: "Efeitos Sonoros"
+soundWillBePlayed: "Sons serão reproduzidos"
+showReplay: "Ver Replay"
+replay: "Replay"
+replaying: "Mostrando Replay"
+endReplay: "Sair do Replay"
+copyReplayData: "Copiar dados de Replay"
+ranking: "Ranking"
lastNDays: "Últimos {n} dias"
+backToTitle: "Voltar à página inicial"
+hemisphere: "Onde você se localiza"
+withSensitive: "Incluir notas com arquivos sensíveis"
+userSaysSomethingSensitive: "Publicação de {name} contém conteúdo sensível"
+enableHorizontalSwipe: "Arraste para mudar de aba"
+loading: "Carregando"
surrender: "Cancelar"
+gameRetry: "Tentar Novamente"
+notUsePleaseLeaveBlank: "Deixe em branco caso inutilizado"
+useTotp: "Digite a senha de uso único"
+useBackupCode: "Usar códigos de “backup”"
+launchApp: "Iniciar aplicação"
+useNativeUIForVideoAudioPlayer: "Utilizar UI do navegador ao reproduzir vídeo e áudio"
+keepOriginalFilename: "Manter nome original do arquivo"
+keepOriginalFilenameDescription: "Se você desabilitar essa opção, os nomes de arquivos serão substituídos por uma sequência aleatória ao enviar arquivos."
+noDescription: "Não há descrição"
+alwaysConfirmFollow: "Sempre confirmar ao seguir"
+inquiry: "Contato"
+tryAgain: "Por favor, tente novamente mais tarde"
+confirmWhenRevealingSensitiveMedia: "Confirmar ao revelar mídia sensível"
+sensitiveMediaRevealConfirm: "Essa mídia pode ser sensível. Deseja revelá-la?"
+createdLists: "Listas criadas"
+createdAntennas: "Antenas criadas"
+clipNoteLimitExceeded: "Não é possível adicionar mais notas ao clipe."
_delivery:
+ status: "Estado de entrega"
stop: "Suspenso"
+ resume: "Continuar entrega"
_type:
none: "Publicando"
+ manuallySuspended: "Suspenso manualmente"
+ goneSuspended: "Servidor foi suspenso devido ao seu apagamento"
+ autoSuspendedForNotResponding: "Servidor foi suspenso por não responder"
+_bubbleGame:
+ howToPlay: "Como jogar"
+ hold: "Próximos"
+ _score:
+ score: "Pontuação"
+ scoreYen: "Dinheiro recebido"
+ highScore: "Melhor pontuação"
+ maxChain: "Número máximo de encadeamentos"
+ yen: "{yen} Yen"
+ estimatedQty: "{qty} Peças"
+ scoreSweets: "{onigiriQtyWithUnit} Onigiri"
+ _howToPlay:
+ section1: "Ajuste a posição e solte o objeto na caixa."
+ section2: "Quando dois objetos do mesmo tipo tocam-se, eles tornam-se outro objeto e você ganha pontos."
+ section3: "O jogo acaba quando objetos transbordam da caixa. Busque uma pontuação alta ao fundir objetos enquanto evita transbordar a caixa."
+_announcement:
+ forExistingUsers: "Apenas aos usuários existente"
+ forExistingUsersDescription: "Se habilitado, esse anúncio será exibido apenas para usuários existentes no tempo de publicação. Se desabilitado, novos usuários também o receberão. "
+ needConfirmationToRead: "Exigir confirmação de leitura"
+ needConfirmationToReadDescription: "Um lembrete adicional será exibido para confirmar a leitura do anúncio. Esse anúncio também será excluído de qualquer forma de \"Marcar tudo como lido\"."
+ end: "Arquivar anúncio"
+ tooManyActiveAnnouncementDescription: "O excesso de anúncios pode atrapalhar a experiência do usuário. Considere arquivar anúncios obsoletos."
+ readConfirmTitle: "Marcar como lido?"
+ readConfirmText: "Isso marcará o conteúdo de \"{title}\" como lido."
+ shouldNotBeUsedToPresentPermanentInfo: "É preferível utilizar anúncios para publicar informações atuais e de curto prazo, e não informações que serão relevantes por muito tempo."
+ dialogAnnouncementUxWarn: "O uso de duas ou mais notificações de diálogo simultaneamente pode impactar significativamente a experiência de usuário. Portanto, utilize-as cuidadosamente."
+ silence: "Sem notificação"
+ silenceDescription: "Habilitar isso irá pular a notificação desse anúncio e o usuário não precisará lê-lo."
_initialAccountSetting:
+ accountCreated: "A sua conta foi criada com sucesso!"
+ letsStartAccountSetup: "Em primeiro lugar, vamos configurar o seu perfil."
+ letsFillYourProfile: "Primeiramente, vamos configurar o seu perfil."
+ profileSetting: "Configurações do perfil"
+ privacySetting: "Configurações de privacidade"
+ theseSettingsCanEditLater: "Você pode alterar estas configurações mais tarde."
+ youCanEditMoreSettingsInSettingsPageLater: "Há mais configurações na página \"Configurações\". Não se esqueça de visitá-la mais tarde."
followUsers: "Siga usuários que lhe interessam para criar a sua linha do tempo."
+ pushNotificationDescription: "Habilitar notificações push o possibilitará receber notificações de {name} diretamente no seu dispositivo."
+ initialAccountSettingCompleted: "Configuração de perfil completa!"
+ haveFun: "Aproveite {name}!"
+ youCanContinueTutorial: "Você pode iniciar um tutorial de como utilizar {name} (Misskey) ou pode sair da configuração e começar o uso imediatamente."
+ startTutorial: "Iniciar Tutorial"
+ skipAreYouSure: "Deseja pular a configuração de perfil?"
+ laterAreYouSure: "Deseja adiar a configuração de perfil?"
+_initialTutorial:
+ launchTutorial: "Iniciar Tutorial"
+ title: "Tutorial"
+ wellDone: "Ótimo!"
+ skipAreYouSure: "Sair do Tutorial?"
+ _landing:
+ title: "Bem-vindo ao Tutorial!"
+ description: "Aqui, você pode aprender o básico de como usar o Misskey e as suas funções."
+ _note:
+ title: "O que é uma Nota?"
+ description: "Publicações no Misskey chamam-se 'Notas'. Notas são organizadas cronologicamente na linha do tempo e atualizam em tempo real."
+ reply: "Clique nesse botão para responder a uma mensagem. Também é possível responder respostas, continuando a conversa como uma \"thread\"."
+ renote: "Você pode compartilhar essa nota na sua linha do tempo. Você também pode citá-la com os seus comentários."
+ reaction: "Você pode adicionar reações à nota. Mais detalhes serão explicados na próxima página."
+ menu: "Você pode ver detalhes da nota, copiar links e realizar outras ações."
+ _reaction:
+ title: "O que são Reações?"
+ description: "É possível reagir às notas com diversos emojis. Reações permitem que você expresse sutilezas que não são possíveis apenas com uma curtida."
+ letsTryReacting: "Reações podem ser adicionadas clicando no botão \"+\". Tente reagir à nota de exemplo."
+ reactToContinue: "Adicione uma reação para continuar."
+ reactNotification: "Você receberá notificações em tempo real quando alguém reagir à sua nota."
+ reactDone: "Você pode desfazer uma reação ao selecionar o botão \"-\"."
+ _timeline:
+ title: "O Conceito das Linhas do Tempo"
+ description1: "Misskey providencia diversas linhas do tempo baseadas na sua utilidade (algumas podem não estar disponíveis a partir das configurações da instância)."
+ home: "Você pode ver as notas das contas seguidas. "
+ local: "Você pode ver notas de todos os usuários dessa instância."
+ social: "Notas da linha do tempo Início e Local serão exibidas."
+ global: "Você pode ver notas de todos os servidores conectados."
+ description2: "Você pode alterar dentre as linhas do tempo no todo da tela a qualquer momento."
+ description3: "Adicionalmente, há \"listas\" e \"canais\". Para mais informações, acesse {link}."
+ _postNote:
+ title: "Opções de Postagem de Nota"
+ description1: "Ao postar uma nota no Misskey, diversas opções estão disponíveis. A ficha de publicação parece com isto: "
+ _visibility:
+ description: "Você pode limitar quem vê a sua nota."
+ public: "Sua nota será visível a todos os usuários."
+ home: "Publicar apenas na linha do tempo Início. Pessoas visitando seu perfil, seja seguindo ou por um repost poderão vê-los."
+ followers: "Visível apenas para seguidores. Apenas seguidores podem vê-la e mais ninguém, e ela não pode ser repostada pelos demais."
+ direct: "Visível apenas para usuários específicos, e o destinatário será notificado. Pode ser usado como uma alternativa às mensagens diretas."
+ doNotSendConfidencialOnDirect1: "Tenha cuidado ao enviar informações sensíveis!"
+ doNotSendConfidencialOnDirect2: "Administradores do servidor podem ver o que foi escrito. Cuidado, também, ao enviar notas diretas a usuários de servidores não confiáveis."
+ localOnly: "Publicar com essa opção não federará a nota com outros servidores. Usuários desses servidores não poderão ver essas notas diretamente, independente das opções de visibilidade acima. "
+ _cw:
+ title: "Aviso de Conteúdo"
+ description: "Ao invés do corpo do texto, o conteúdo escrito na caixa \"anotação\" será exibido. Apertar \"Carregar mais\" irá revelar o corpo."
+ _exampleNote:
+ cw: "Isso irá te esfomear!"
+ note: "Acabei de comer um donut coberto de chocolate! 🍩😋"
+ useCases: "Isso pode ser usado caso seja exigido, pelas diretrizes do servidor, o cuidado com algum tópico ou ao publicar conteúdo sensível ou spoilers."
+ _howToMakeAttachmentsSensitive:
+ title: "Como Marcar Anexos como Sensíveis?"
+ description: "Para anexos cujo conteúdo é considerado sensível pelas diretrizes do servidor ou quando pretende-se esconder o seu conteúdo, adicione o sinal \"sensível\"."
+ tryThisFile: "Tente marcar a imagem anexada como sensível!"
+ _exampleNote:
+ note: "Opa, me atrapalhei abrindo a tampa do natô..."
+ method: "Para marcar um anexo como sensível, clique na sua miniatura, abra o menu e clique \"Marcar como sensível\"."
+ sensitiveSucceeded: "Ao anexar arquivos, por favor atribua uma sensibilidade coerente com as diretrizes da instância."
+ doItToContinue: "Marque o anexo como sensível para prosseguir."
+ _done:
+ title: "Você completou o tutorial! 🎉"
+ description: "As funções apresentadas aqui são apenas uma pequena parte. Para um conhecimento mais detalhado do uso do Misskey, acesse {link}."
+_timelineDescription:
+ home: "Na linha do tempo Início, você verá notas dos usuários que você segue."
+ local: "Na linha do tempo Local, você verá notas de todos os usuários da instância."
+ social: "Na linha do tempo Social, você verá notas do Início e Local."
+ global: "Na linha do tempo Global, você verá notas de todas as instâncias conectadas."
+_serverRules:
+ description: "Um grupo de regras a ser exibido antes de um cadastro. É recomendado que se faça um resumo dos Termos de Serviço."
_serverSettings:
iconUrl: "URL do ícone"
+ appIconDescription: "Especifica o ícone utilizado quando {host} é exibido como um app."
+ appIconUsageExample: "Exemplo: Como PWA, ou quando exibido num marcador de páginas ou na tela inicial de um celular"
+ appIconStyleRecommendation: "Como o ícone pode ser cortado para um quadrado ou círculo, é recomendado adicionar um fundo colorido na imagem."
+ appIconResolutionMustBe: "A resolução mínima é {resolution}."
+ manifestJsonOverride: "Sobrescrever manifest.json"
+ shortName: "Abreviação"
+ shortNameDescription: "Uma abreviação do nome da instância que pode ser exibido caso o nome oficial completo seja muito longo."
+ fanoutTimelineDescription: "Melhora significativamente a performance do retorno da linha do tempo e reduz o impacto no banco de dados quando habilitado. Em contrapartida, o uso de memória do Redis aumentará. Considere desabilitar em casos de baixa disponibilidade de memória ou instabilidade do servidor."
+ fanoutTimelineDbFallback: "\"Fallback\" ao banco de dados"
+ fanoutTimelineDbFallbackDescription: "Quando habilitado, a linha do tempo irá recuar ao banco de dados caso consultas adicionais sejam feitas e ela não estiver em cache. Quando desabilitado, o impacto no servidor será reduzido ao eliminar o recuo, mas limita a quantidade de linhas do tempo que podem ser recebidas."
+ inquiryUrl: "URL de inquérito"
+ inquiryUrlDescription: "Especifique um URL para um formulário de inquérito para a administração ou uma página web com informações de contato."
_accountMigration:
+ moveFrom: "Migrar outra conta para essa"
+ moveFromSub: "Criar um 'alias' a outra conta"
+ moveFromLabel: "Conta original #{n}"
moveFromDescription: "Se você deseja migrar de outra conta para esta, é necessário criar um alias aqui. Por favor, insira a conta de origem da migração no seguinte formato: @username@server.example.com. Para excluir o alias, deixe o campo em branco e clique em salvar (não recomendado)."
+ moveTo: "Migrar dessa conta para outra"
+ moveToLabel: "Conta para a qual se mover:"
+ moveCannotBeUndone: "A migração de conta não pode ser desfeita."
moveAccountDescription: "Você está migrando para uma nova conta.\n ・Seus seguidores irão automaticamente seguir a nova conta.\n ・Todas as suas conexões de seguidores nesta conta serão removidas.\n ・Você não poderá mais criar novas notas nesta conta.\n\nA migração dos seguidores é automática, mas a migração das pessoas que você segue deve ser feita manualmente. Antes de migrar, exporte quem você está seguindo nesta conta e, assim que migrar, importe essa lista na nova conta.\nO mesmo se aplica para listas, silenciamentos e bloqueios, que também devem ser migrados manualmente.\n\n(Esta descrição se refere ao comportamento do servidor Misskey v13.12.0 ou posterior. Outros softwares ActivityPub, como Mastodon, podem ter comportamentos diferentes.)"
moveAccountHowTo: "Para realizar a migração da conta, primeiro crie um alias para esta conta no destino da migração. Após criar o alias, insira a conta de destino da migração no seguinte formato: @username@server.example.com."
+ startMigration: "Migrar"
migrationConfirm: "Tem certeza de que deseja migrar esta conta para '{account}'? Uma vez migrada, não poderá ser desfeita e não será possível usar esta conta novamente em seu estado original."
+ movedAndCannotBeUndone: "Essa conta foi migrada. A migração não pode ser desfeita."
postMigrationNote: "A remoção dos seguidores desta conta será realizada 24 horas após a operação de migração. O número de seguidores e seguidos desta conta se tornará zero. Os seguidores não serão removidos, portanto, eles continuarão a ver as postagens destinadas aos seguidores desta conta."
+ movedTo: "Conta para a qual se mover:"
_achievements:
earnedAt: "Data de aquisição"
_types:
_notes1:
title: "Configurando o meu misskey"
- description: "Postou uma nota pela primeira vez"
+ description: "Poste uma nota pela primeira vez"
flavor: "Divirta-se com o Misskey!"
_notes10:
title: "Algumas notas"
- description: "Postou 10 notas"
+ description: "Poste 10 notas"
_notes100:
title: "Um monte de notas"
- description: "Postou 100 notas"
+ description: "Poste 100 notas"
_notes500:
title: "Coberto por notas"
- description: "Postou 500 notas"
+ description: "Poste 500 notas"
_notes1000:
title: "Uma montanha de notas"
- description: "Postou 1000 notas"
+ description: "Poste 1 000 notas"
_notes5000:
title: "Enxurrada de notas"
- description: "Postou 5000 notas"
+ description: "Poste 5000 notas"
_notes10000:
- title: "Super nota"
- description: "Postou 10000 notas"
+ title: "Supernota"
+ description: "Poste 10 000 notas"
_notes20000:
title: "Preciso... de mais... notas..."
- description: "Postou 20000 notas"
+ description: "Poste 20 000 notas"
_notes30000:
title: "Notas, Notas, NOTAS!"
- description: "Postou 30000 notas"
+ description: "Poste 30 000 notas"
_notes40000:
title: "Fábrica de notas"
- description: "Postou 40000 notas"
+ description: "Poste 40 000 notas"
_notes50000:
title: "Planeta de notas"
- description: "Postou 50000 notas"
+ description: "Poste 50 000 notas"
_notes60000:
title: "Quasar de notas"
- description: "Postou 60000 notas"
+ description: "Poste 60 000 notas"
_notes70000:
title: "Buraco negro de notas"
- description: "Postou 70000 notas"
+ description: "Poste 70 000 notas"
_notes80000:
title: "Galáxia de notas"
- description: "Postou 80000 notas"
+ description: "Poste 80 000 notas"
_notes90000:
title: "Universo de notas"
- description: "Postou 90000 notas"
+ description: "Poste 90 000 notas"
_notes100000:
title: "ALL YOUR NOTE ARE BELONG TO US"
- description: "Postou 100000 notas"
+ description: "Poste 100 000 notas"
flavor: "Você realmente tem muita coisa para escrever"
_login3:
title: "Iniciante I"
- description: "Fez login por um total de 3 dias"
+ description: "Faça login por um total de 3 dias"
flavor: "De hoje em diante, me chame apenas de Misskist"
_login7:
title: "Iniciante II"
- description: "Fez login por um total de 7 dias"
+ description: "Faça login por um total de 7 dias"
flavor: "Pegando o jeito da coisa?"
_login15:
title: "Iniciante III"
- description: "Fez login por um total de 15 dias"
+ description: "Faça login por um total de 15 dias"
_login30:
title: "Misskist I"
- description: "Fez login por um total de 30 dias"
+ description: "Faça login por um total de 30 dias"
_login60:
title: "Misskist II"
- description: "Fez login por um total de 60 dias"
+ description: "Faça login por um total de 60 dias"
_login100:
title: "Misskist III"
- description: "Fez login por um total de 100 dias"
+ description: "Faça login por um total de 100 dias"
flavor: "Misskist violento"
_login200:
title: "Freguês I"
- description: "Fez login por um total de 200 dias"
+ description: "Faça login por um total de 200 dias"
_login300:
title: "Freguês II"
- description: "Fez login por um total de 300 dias"
+ description: "Faça login por um total de 300 dias"
_login400:
title: "Freguês III"
- description: "Fez login por um total de 400 dias"
+ description: "Faça login por um total de 400 dias"
_login500:
title: "Veterano I"
- description: "Fez login por um total de 500 dias"
+ description: "Faça login por um total de 500 dias"
flavor: "Cavalheiros, tudo o que peço são notas"
_login600:
title: "Veterano II"
- description: "Fez login por um total de 600 dias"
+ description: "Faça login por um total de 600 dias"
_login700:
title: "Veterano III"
- description: "Fez login por um total de 700 dias"
+ description: "Faça login por um total de 700 dias"
_login800:
- title: "Mestre das notas I"
- description: "Fez login por um total de 800 dias"
+ title: "Mestre das Notas I"
+ description: "Faça login por um total de 800 dias"
_login900:
- title: "Mestre das notas II"
- description: "Fez login por um total de 900 dias"
+ title: "Mestre das Notas II"
+ description: "Faça login por um total de 900 dias"
_login1000:
- title: "Mestre das notas III"
- description: "Fez login por um total de 1000 dias"
+ title: "Mestre das Notas III"
+ description: "Faça login por um total de 1 000 dias"
flavor: "Obrigado por utilizar o Misskey!"
_noteClipped1:
- title: "Não posso deixar de adicionar ao clipe"
- description: "Adicionou a um clipe a sua primeira nota"
+ title: "Preciso... clipar..."
+ description: "Adicione a um clipe a sua primeira nota"
_noteFavorited1:
- title: "Astrônomo amador"
- description: "Adicionou uma nota aos favoritos pela primeira vez"
+ title: "Astrônomo Amador"
+ description: "Adicione uma nota aos favoritos pela primeira vez"
_myNoteFavorited1:
title: "Cabeça nas estrelas"
- description: "Teve uma das suas notas adicionada aos favoritos de alguém"
+ description: "Tenha uma das suas notas adicionada aos favoritos de alguém"
_profileFilled:
- title: "Tudo pronto"
- description: "Configurou o seu perfil"
+ title: "Tudo Pronto"
+ description: "Configure o seu perfil"
_markedAsCat:
title: "Eu Sou Um Gato"
- description: "Marcou a sua conta como um gato"
+ description: "Marque a sua conta como um gato"
flavor: "Ainda não tenho um nome."
_following1:
title: "Primeira vez seguindo alguém"
- description: "Seguiu um usuário pela primeira vez"
+ description: "Siga um usuário pela primeira vez"
_following10:
title: "Circulando, circulando"
- description: "Seguiu 10 usuários"
+ description: "Siga 10 usuários"
_following50:
title: "Muitos amigos"
- description: "Seguiu 50 usuários"
+ description: "Siga 50 usuários"
_following100:
- title: "100 amigos"
- description: "Seguiu 100 usuários"
+ title: "100 Amigos"
+ description: "Siga 100 usuários"
_following300:
title: "Sobrecarga de amigos"
- description: "Seguiu 300 usuários"
+ description: "Siga 300 usuários"
_followers1:
title: "Primeiro seguidor"
- description: "Ganhou o seu primeiro seguidor"
+ description: "Ganhe o seu primeiro seguidor"
_followers10:
title: "Sigam-me os bons!"
- description: "Ganhou 10 seguidores"
+ description: "Ganhe 10 seguidores"
_followers50:
title: "Aos montes"
- description: "Ganhou 50 seguidores"
+ description: "Ganhe 50 seguidores"
_followers100:
title: "Popular"
- description: "Ganhou 100 seguidores"
+ description: "Ganhe 100 seguidores"
_followers300:
title: "Em fila única, por favor"
- description: "Ganhou 300 seguidores"
+ description: "Ganhe 300 seguidores"
_followers500:
title: "Torre de celular"
- description: "Ganhou 500 seguidores"
+ description: "Ganhe 500 seguidores"
_followers1000:
title: "Influencer"
- description: "Ganhou 1000 seguidores"
+ description: "Ganhe 1 000 seguidores"
+ _collectAchievements30:
+ title: "Coletor de Conquistas"
+ description: "Ganhe 30 conquistas"
+ _viewAchievements3min:
+ title: "Curte Conquistas"
+ description: "Olhe para a sua lista de conquistas por pelo menos 3 minutos"
+ _iLoveMisskey:
+ title: "Eu Amo Misskey"
+ description: "Poste \"I ❤ #Misskey\""
+ flavor: "A equipe de desenvolvimento do Misskey aprecia profundamente o seu apoio!"
+ _foundTreasure:
+ title: "Caça ao Tesouro"
+ description: "Você achou o tesouro escondido"
+ _client30min:
+ title: "Pausinha"
+ description: "Deixe o Misskey aberto por pelo menos 30 minutos"
+ _client60min:
+ title: "Sem falta"
+ description: "Deixe o Misskey aberto por pelo menos 60 minutos"
_noteDeletedWithin1min:
title: "Deixa pra lá"
- description: "Excluí a postagem dentro de 1 minuto após ter publicado"
+ description: "Exclua a postagem dentro de 1 minuto após a ter publicado"
+ _postedAtLateNight:
+ title: "Noturno"
+ description: "Poste uma nota tarde da noite"
+ flavor: "Tá na hora de ir dormir."
+ _postedAt0min0sec:
+ title: "Relógio Falante"
+ description: "Poste uma nota à meia-noite em ponto"
+ flavor: "Tic-Tac-Tic-Tac"
+ _selfQuote:
+ title: "Autorreferência"
+ description: "Cite sua própria nota"
+ _htl20npm:
+ title: "Linha do Tempo Fluida"
+ description: "Faça a velocidade da linha do tempo exceder 20 npm (notas por minuto)"
+ _viewInstanceChart:
+ title: "Analista"
+ description: "Veja os infográficos da instância"
+ _outputHelloWorldOnScratchpad:
+ title: "Olá, Mundo!"
+ description: "Produza \"hello world\" no Scratchpad"
+ _open3windows:
+ title: "Múlti-Janelas"
+ description: "Tenha ao mínimo 3 janelas abertas simultaneamente."
_driveFolderCircularReference:
title: "Referência circular"
+ description: "Tente criar uma pasta recursiva no Drive."
+ _reactWithoutRead:
+ title: "Você leu tudo isso?"
+ description: "Reaja a uma nota com mais de 100 caracteres dentro de 3 segundos após a sua publicação."
+ _clickedClickHere:
+ title: "Clique aqui"
+ description: "Você clicou aqui"
+ _justPlainLucky:
+ title: "Pura Sorte"
+ description: "Tem uma chance de ser obtido com uma probabilidade de 0.005% a cada 10 segundos."
+ _setNameToSyuilo:
+ title: "Complexo de Deus"
+ description: "Colocar seu nome como \"syuilo\""
+ _passedSinceAccountCreated1:
+ title: "Aniversário de Um Ano"
+ description: "Um ano passou-se desde a criação da conta"
+ _passedSinceAccountCreated2:
+ title: "Aniversário de Dois Anos"
+ description: "Dois anos passaram-se desde a criação da conta"
+ _passedSinceAccountCreated3:
+ title: "Aniversário de Três Anos"
+ description: "Três anos passaram-se desde a criação da conta"
+ _loggedInOnBirthday:
+ title: "Feliz Aniversário"
+ description: "Entre no dia do seu aniversário"
+ _loggedInOnNewYearsDay:
+ title: "Feliz Ano Novo!"
+ description: "Entre no primeiro dia do ano"
+ flavor: "Para outro ótimo ano nessa instância"
+ _cookieClicked:
+ title: "Um jogo onde você clica em cookies"
+ description: "Clicou o cookie"
+ flavor: "Pera, você tá no website correto?"
+ _brainDiver:
+ title: "Brain Diver"
+ description: "Poste o link do Brain Diver"
+ flavor: "Misskey-Misskey La-Tu-Ma"
+ _smashTestNotificationButton:
+ title: "Teste de Transbordamento"
+ description: "Ative o teste de notificações repetidamente dentro de um curto período de tempo"
+ _tutorialCompleted:
+ title: "Diploma de Ensino Fundamental Misskey"
+ description: "Complete o tutorial"
+ _bubbleGameExplodingHead:
+ title: "🤯"
+ description: "O maior objeto no Bubble Game"
+ _bubbleGameDoubleExplodingHead:
+ title: "🤯 Duplo"
+ description: "Dois dos maiores objetos do Bubble Game ao mesmo tempo."
+ flavor: "Dá para encher uma lancheira com esses 🤯🤯."
_role:
new: "Novo cargo"
edit: "Editar cargo"
@@ -1195,8 +1672,10 @@ _role:
descriptionOfPermission: "Moderador permite que você execute operações básicas relacionadas à moderação.\nAdministradores podem alterar todas as configurações do servidor."
assignTarget: "Atribuir"
descriptionOfAssignTarget: "Manual para gerenciar manualmente quem está incluído neste cargo.\nCondicional define uma condição e os usuários que corresponderem a ela serão incluídos automaticamente."
- manual: "Documentação"
+ manual: "Manual"
+ manualRoles: "Cargos manuais"
conditional: "Condicional"
+ conditionalRoles: "Cargos condicionais"
condition: "Condição"
isConditionalRole: "Este é um cargo condicional."
isPublic: "Cargo público"
@@ -1224,13 +1703,16 @@ _role:
gtlAvailable: "Visualizar Linha do Tempo Global"
ltlAvailable: "Visualizar Linha do Tempo Local"
canPublicNote: "Permitir postagem pública"
+ mentionMax: "Número máximo de menções em uma nota"
canInvite: "Permitir a criação de códigos de convites para a instância"
inviteLimit: "Limite de códigos de convite"
inviteLimitCycle: "Intervalo de emissão do código de convite"
inviteExpirationTime: "Prazo de validade do código de convite"
canManageCustomEmojis: "Permitir gerenciar emojis personalizados"
+ canManageAvatarDecorations: "Gerenciar decorações de avatar"
driveCapacity: "Capacidade do drive"
alwaysMarkNsfw: "Sempre marcar arquivos como NSFW"
+ canUpdateBioMedia: "Permitir a edição de ícone ou imagem do banner."
pinMax: "Número máximo de notas fixadas"
antennaMax: "Número máximo de antenas"
wordMuteMax: "Número máximo de caracteres nas palavras silenciadas"
@@ -1243,9 +1725,17 @@ _role:
descriptionOfRateLimitFactor: "Valores menores são menos restritivos, valores maiores são mais restritivos."
canHideAds: "Permitir ocultar anúncios"
canSearchNotes: "Permitir a busca de notas"
+ canUseTranslator: "Uso do tradutor"
+ avatarDecorationLimit: "Número máximo de decorações de avatar que podem ser aplicadas"
_condition:
+ roleAssignedTo: "Atribuído a cargos manuais"
isLocal: "Usuário local"
isRemote: "Usuário remoto"
+ isCat: "Usuários Gatinho"
+ isBot: "Usuários Bot"
+ isSuspended: "Usuário suspenso"
+ isLocked: "Contas privadas"
+ isExplorable: "Encontrável em \"Explorar\""
createdLessThan: "Menos de X passados desde a criação da conta"
createdMoreThan: "Mais de X passados desde a criação da conta"
followersLessThanOrEq: "Possui X ou menos seguidores"
@@ -1259,13 +1749,19 @@ _role:
not: "Não ~ (Condicional)"
_sensitiveMediaDetection:
description: "Use o aprendizado de máquina para detectar automaticamente mídias sensíveis para moderação. Isso pode aumentar ligeiramente a carga no servidor."
+ sensitivity: "Detecção de sensibilidade"
sensitivityDescription: "Ao reduzir a sensibilidade, as detecções incorretas (falsos positivos) diminuem. Ao aumentar a sensibilidade, as falhas de detecção (falsos negativos) diminuem."
+ setSensitiveFlagAutomatically: "Marcar como sensível"
+ setSensitiveFlagAutomaticallyDescription: "Os resultados da detecção interna serão mantidos mesmo se essa opção estiver desligada."
+ analyzeVideos: "Habilitar análise de vídeos"
+ analyzeVideosDescription: "Analisa vídeos em adição a imagens. Isso irá aumentar levemente a carga do servidor."
_emailUnavailable:
used: "O endereço de e-mail informado já está sendo utilizado"
format: "Formado de e-mail inválido"
disposable: "Endereços de e-mail descartáveis não devem ser utilizados"
mx: "O servidor de informado é inválido"
smtp: "O servidor de e-mail não está respondendo"
+ banned: "Você não pode se cadastrar com esse endereço de email"
_ffVisibility:
public: "Público"
followers: "Visível apenas para seguidores"
@@ -1285,10 +1781,17 @@ _ad:
back: "Voltar"
reduceFrequencyOfThisAd: "Diminuir frequência deste anúncio"
hide: "Não exibir anúncios"
+ timezoneinfo: "O dia da semana é determinado pelo fuso horário do servidor."
+ adsSettings: "Configurações de propaganda"
+ notesPerOneAd: "Intervalo de notas entre o anúncio nas atualizações em tempo real."
+ setZeroToDisable: "Selecione o valor 0 para desabilitar anúncios nas atualizações em tempo real."
+ adsTooClose: "O intervalo atual de anúncio pode impactar negativamente a experiência de usuário por ser muito baixo."
_forgotPassword:
enterEmail: "Por favor, insira o endereço de e-mail usado no cadastro de sua conta. Um link para redefinição de senha será enviado para esse endereço."
ifNoEmail: "Caso você não tenha registrado um endereço de e-mail, por favor, entre em contato com o administrador."
+ contactAdmin: "Essa instância não possui suporte ao uso de endereços de email, contate seu administrador para mudar a sua senha."
_gallery:
+ my: "Minha Galeria"
liked: "Postagens curtidas"
like: "Curtir"
unlike: "Remover curtida"
@@ -1297,40 +1800,223 @@ _email:
title: "Você tem um novo seguidor"
_receiveFollowRequest:
title: "Você recebeu um pedido de seguidor"
+_plugin:
+ install: "Instalar plugins"
+ installWarn: "Por favor, não instale plugins duvidosos."
+ manage: "Gerenciar plugins"
+ viewSource: "Ver código-fonte"
+ viewLog: "Mostrar registo"
_preferencesBackups:
+ list: "Backups criados"
+ saveNew: "Salvar novo backup"
+ loadFile: "Carregar de arquivo"
+ apply: "Aplicar a este dispositivo"
+ save: "Salvar mudanças"
+ inputName: "Insira um nome para esse backup"
cannotSave: "Não foi possível salvar"
+ nameAlreadyExists: "Um backup chamado \"{name}\" já existe. Por favor, insira outro nome."
applyConfirm: "Deseja aplicar o backup '{name}' ao dispositivo atual? As configurações atuais do dispositivo serão perdidas."
+ saveConfirm: "Salvar backup como \"{name}\"?"
deleteConfirm: "Deseja excluir {name}?"
+ renameConfirm: "Renomear esse backup de \"{old}\" para \"{new}\"?"
+ noBackups: "Não há backups. Você pode configurar suas configurações de cliente nesse servidor ao selecionar \"Criar novo backup\"."
+ createdAt: "Criado em: {date} {time}"
+ updatedAt: "Atualizado em: {date} {time}"
cannotLoad: "Não foi possível carregar"
+ invalidFile: "Formato de arquivo inválido"
+_registry:
+ scope: "Escopo"
+ key: "Chave"
+ keys: "Chave"
+ domain: "Domínio"
+ createKey: "Criar chave"
+_aboutMisskey:
+ about: "Misskey é um software de código aberto desenvolvido por syulio desde 2014."
+ contributors: "Contribuidores principais"
+ allContributors: "Todos os contribuidores"
+ source: "Código-fonte"
+ original: "Original"
+ thisIsModifiedVersion: "{name} utiliza uma versão modificada do Misskey original."
+ translation: "Traduza o Misskey"
+ donate: "Doe para o Misskey"
+ morePatrons: "Nós apreciamos o apoio de vários outros apoiadores não listados aqui. Obrigado! 🥰"
+ patrons: "Apoiadores"
+ projectMembers: "Membros do projeto"
+_displayOfSensitiveMedia:
+ respect: "Esconder mídia marcada como sensível"
+ ignore: "Exibir mídia marcada como sensível"
+ force: "Esconder toda mídia"
+_instanceTicker:
+ none: "Nunca mostrar"
+ remote: "Mostrar para usuários remotos"
+ always: "Sempre mostrar"
+_serverDisconnectedBehavior:
+ reload: "Recarregar automaticamente"
+ dialog: "Exibir diálogo de aviso de conteúdo"
+ quiet: "Exibir aviso de conteúdo discreto"
_channel:
+ create: "Criar canal"
+ edit: "Editar canal"
+ setBanner: "Definir banner"
+ removeBanner: "Remover banner"
featured: "Destaques"
+ owned: "Autoral"
following: "Seguindo"
usersCount: "{n} usuários ativos"
notesCount: "{n} notas"
nameAndDescription: "Nome e descrição"
+ nameOnly: "Apenas o nome"
+ allowRenoteToExternal: "Permitir repostagens e citações de fora do canal"
_menuDisplay:
sideFull: "Exibir painel lateral inteiro"
+ sideIcon: "Lateral (Ícones)"
top: "Exibir barra superior"
hide: "Ocultar"
+_wordMute:
+ muteWords: "Palavras silenciadas"
+ muteWordsDescription: "Separe com espaços para uma condicional AND (&&) ou por linha para uma condicional OR (||)."
+ muteWordsDescription2: "Cercar palavras-chave com barras para usar expressões regulares (RegEx)."
_instanceMute:
instanceMuteDescription: "Todas as notas e repostagens do servidor configurado serão silenciados, incluindo respostas aos usuários do servidor mutado."
+ instanceMuteDescription2: "Separar por linha"
+ title: "Esconder notas das instâncias listadas. "
+ heading: "Lista de instâncias a serem silenciadas"
_theme:
+ explore: "Explorar Temas"
+ install: "Instalar um tema"
+ manage: "Gerenciar temas"
+ code: "Código do tema"
description: "Descrição"
+ installed: "{name} foi instalado"
+ installedThemes: "Temas instalados"
+ builtinThemes: "Temas nativos"
+ alreadyInstalled: "Esse tema já foi instalado"
+ invalid: "O formato desse tema é invalido"
+ make: "Fazer um tema"
+ base: "Base"
+ addConstant: "Adicionar constante"
+ constant: "Constante"
+ defaultValue: "Valor padrão"
+ color: "Cor"
+ refProp: "Referenciar uma propriedade"
+ refConst: "Referenciar uma constante"
+ key: "Chave"
+ func: "Funções"
+ funcKind: "Tipo de função"
+ argument: "Argumento"
+ basedProp: "Propriedade referenciada"
alpha: "Opacidade"
+ darken: "Escurecer"
+ lighten: "Esclarecer"
+ inputConstantName: "Insira um nome para essa constante"
+ importInfo: "Se você inserir o código do tema aqui, você pode importá-lo no editor de temas"
deleteConstantConfirm: "Confirma a exclusão da constante {const}?"
keys:
+ accent: "Cor de destaque"
+ bg: "Plano de fundo"
+ fg: "Texto"
+ focus: "Foco"
+ indicator: "Indicador"
+ panel: "Painel"
+ shadow: "Sombra"
+ header: "Cabeçalho"
+ navBg: "Plano de fundo da barra lateral"
+ navFg: "Texto da barra lateral"
+ navHoverFg: "Texto da coluna lateral (Selecionado)"
+ navActive: "Texto da coluna lateral (Ativa)"
+ navIndicator: "Indicador da coluna lateral"
+ link: "Link"
+ hashtag: "Hashtag"
mention: "Menção"
+ mentionMe: "Menciona (a mim)"
renote: "Repostar"
+ modalBg: "Plano de fundo modal"
divider: "Separador"
+ scrollbarHandle: "Alça da barra de rolagem (Selecionada)"
+ scrollbarHandleHover: "Alça da barra de rolagem (Selecionada)"
+ dateLabelFg: "Texto do rótulo de data"
+ infoBg: "Plano de fundo de informações"
+ infoFg: "Texto de informações"
+ infoWarnBg: "Plano de fundo de avisos"
+ infoWarnFg: "Texto de avisos"
+ toastBg: "Plano de fundo de notificações"
+ toastFg: "Texto da notificação"
+ buttonBg: "Plano de fundo de botão"
+ buttonHoverBg: "Plano de fundo de botão (Selecionado)"
+ inputBorder: "Borda de campo digitável"
+ driveFolderBg: "Plano de fundo da pasta no Drive"
+ wallpaperOverlay: "Sobreposição do papel de parede."
+ badge: "Emblema"
+ messageBg: "Plano de fundo do chat"
+ accentDarken: "Cor de destaque (Escurecida)"
+ accentLighten: "Cor de destaque (Esclarecida)"
+ fgHighlighted: "Texto Destacado"
_sfx:
note: "Posts"
+ noteMy: "Própria nota"
notification: "Notificações"
+ reaction: "Ao selecionar uma reação"
+_soundSettings:
+ driveFile: "Usar um arquivo de áudio do Drive."
+ driveFileWarn: "Selecione um arquivo de áudio do Drive."
+ driveFileTypeWarn: "Esse arquivo não é compatível"
+ driveFileTypeWarnDescription: "Selecione um arquivo de áudio"
+ driveFileDurationWarn: "O áudio é muito longo."
+ driveFileDurationWarnDescription: "Áudios longos podem atrapalhar o funcionamento do Misskey. Deseja continuar?"
+ driveFileError: "Não foi possível carregar o som. Por favor, altere a configuração."
_ago:
+ future: "Futuro"
+ justNow: "Agora mesmo"
+ secondsAgo: "{n}s atrás"
+ minutesAgo: "{n}m atrás"
+ hoursAgo: "{n}h atrás"
+ daysAgo: "{n}d atrás"
+ weeksAgo: "{n} semanas atrás"
+ monthsAgo: "{n} meses atrás"
+ yearsAgo: "{n} anos atrás"
invalid: "Não há nada aqui"
+_timeIn:
+ seconds: "Em {n}s"
+ minutes: "Em {n}m"
+ hours: "Em {n}h"
+ days: "Em {n}d"
+ weeks: "Em {n} semanas"
+ months: "Em {n} meses"
+ years: "Em {n} anos"
+_time:
+ second: "Segundo(s)"
+ minute: "Minuto(s)"
+ hour: "Hora(s)"
+ day: "Dia(s)"
_2fa:
+ alreadyRegistered: "Você já cadastrou um dispositivo de autenticação de dois fatores."
+ registerTOTP: "Cadastrar aplicativo autenticador"
+ step1: "Inicialmente, instale um aplicativo autenticador (como {a} ou {b}) em seu dispositivo."
+ step2: "Então, escaneie o código QR exibido na tela."
+ step2Uri: "Acesse o seguinte URI se você estiver utilizando um aplicativo no computador"
+ step3Title: "Insira o código de autenticação"
+ step3: "Insira o código de autenticação (token) providenciado pelo seu aplicativo para terminar a configuração."
+ setupCompleted: "Configuração completa"
+ step4: "De agora em diante, quaisquer solicitações de entrada pedirão pelo código."
+ securityKeyNotSupported: "O seu navegador não é compatível com chaves de segurança."
+ registerTOTPBeforeKey: "Por favor, configure um aplicativo autenticador para registrar uma chave de segurança."
securityKeyInfo: "Além da autenticação por impressão digital ou PIN, você também pode configurar a autenticação por chaves de segurança de hardware compatível com FIDO2 para proteger ainda mais a sua conta."
+ registerSecurityKey: "Registre um código de segurança"
+ securityKeyName: "Insira um nome para a chave"
+ tapSecurityKey: "Por favor, siga as instruções do navegador para registrar o código de segurança"
+ removeKey: "Remover código de segurança"
removeKeyConfirm: "Deseja excluir {name}?"
+ whyTOTPOnlyRenew: "O autenticador não pode ser removido enquanto há códigos de segurança registrados."
+ renewTOTP: "Reconfigurar autenticador"
+ renewTOTPConfirm: "Isso interromperá o funcionamento dos códigos de aplicativos anteriores "
+ renewTOTPOk: "Reconfigurar"
renewTOTPCancel: "Não, obrigado"
+ checkBackupCodesBeforeCloseThisWizard: "Antes de fechar essa janela, anote os códigos de backup a seguir."
+ backupCodes: "Códigos de backup"
+ backupCodesDescription: "Você pode utilizar esses códigos para ganhar acesso à conta caso sua autenticação de dois fatores esteja indisponível. Cada código pode ser utilizado apenas uma vez. Por favor, guarde-os em um local seguro."
+ backupCodeUsedWarning: "Um código de backup foi utilizado. Por favor, reconfigure a autenticação de dois fatores o quanto antes, caso não consiga utilizá-la."
+ backupCodesExhaustedWarning: "Todos os códigos de backup foram utilizados. Caso perca acesso à autenticação de dois fatores, você perderá o acesso à conta. Por favor, reconfigure a autenticação de dois fatores."
+ moreDetailedGuideHere: "Aqui está um guia detalhado"
_permissions:
"read:account": "Visualizar informações da conta"
"write:account": "Editar informações da conta"
@@ -1364,6 +2050,82 @@ _permissions:
"write:gallery": "Editar sua galeria"
"read:gallery-likes": "Visualizar a sua lista de curtidas da galeria"
"write:gallery-likes": "Editar a sua lista de curtidas da galeria"
+ "read:flash": "Ver Play"
+ "write:flash": "Editar Plays"
+ "read:flash-likes": "Ver lista de Plays curtidas"
+ "write:flash-likes": "Editar lista de Plays curtidas"
+ "read:admin:abuse-user-reports": "Ver relatórios de usuário"
+ "write:admin:delete-account": "Excluir conta de usuário"
+ "write:admin:delete-all-files-of-a-user": "Excluir todos os arquivos de um usuário"
+ "read:admin:index-stats": "Ver estatísticas do índice do banco de dados"
+ "read:admin:table-stats": "Ver estatísticas da tabela do banco de dados"
+ "read:admin:user-ips": "Ver endereços IP do usuário"
+ "read:admin:meta": "Ver metadados da instância"
+ "write:admin:reset-password": "Mudar a senha do usuário"
+ "write:admin:resolve-abuse-user-report": "Resolver relatório de usuário"
+ "write:admin:send-email": "Enviar email"
+ "read:admin:server-info": "Ver informações do servidor"
+ "read:admin:show-moderation-log": "Ver log de moderação"
+ "read:admin:show-user": "Ver informações privadas do usuário"
+ "write:admin:suspend-user": "Suspender usuário"
+ "write:admin:unset-user-avatar": "Remover avatar do usuário"
+ "write:admin:unset-user-banner": "Remover banner do usuário"
+ "write:admin:unsuspend-user": "Cancelar a suspensão do usuário"
+ "write:admin:meta": "Gerenciar os metadados da instância"
+ "write:admin:user-note": "Gerenciar a nota de moderação"
+ "write:admin:roles": "Gerenciar cargos"
+ "read:admin:roles": "Ver cargos"
+ "write:admin:relays": "Gerenciar relays"
+ "read:admin:relays": "Ver relays"
+ "write:admin:invite-codes": "Gerenciar códigos de convite"
+ "read:admin:invite-codes": "Ver códigos de convite"
+ "write:admin:announcements": "Gerenciar anúncios"
+ "read:admin:announcements": "Ver anúncios"
+ "write:admin:avatar-decorations": "Gerenciar decorações de avatar"
+ "read:admin:avatar-decorations": "Ver decorações de avatar"
+ "write:admin:federation": "Gerenciar dados de federação"
+ "write:admin:account": "Gerenciar conta de usuário"
+ "read:admin:account": "Ver conta de usuário"
+ "write:admin:emoji": "Gerenciar emoji"
+ "read:admin:emoji": "Ver emoji"
+ "write:admin:queue": "Gerenciar trabalhos pendentes"
+ "read:admin:queue": "Ver informações de trabalhos pendentes"
+ "write:admin:promo": "Gerenciar notas de promoção"
+ "write:admin:drive": "Gerenciar Drive de usuário"
+ "read:admin:drive": "Ver informações de Drive de usuário"
+ "read:admin:stream": "Utilizar WebSocket API para Admin"
+ "write:admin:ad": "Gerenciar propagandas"
+ "read:admin:ad": "Ver propagandas"
+ "write:invite-codes": "Criar códigos de convite"
+ "read:invite-codes": "Obter códigos de convite"
+ "write:clip-favorite": "Gerenciar clipes favoritados"
+ "read:clip-favorite": "Ver Clipes favoritados"
+ "read:federation": "Ver dados de federação"
+ "write:report-abuse": "Reportar violação"
+_auth:
+ shareAccessTitle: "Conceder permissões do aplicativo"
+ shareAccess: "Você gostaria de autorizar \"{name}\" para acessar essa conta?"
+ shareAccessAsk: "Você tem certeza de que gostaria de conceder ao aplicativo o acesso à conta?"
+ permission: "{name} solicita as seguintes permissões"
+ permissionAsk: "O aplicativo solicita as seguintes permissões"
+ pleaseGoBack: "Por favor, volte ao aplicativo"
+ callback: "Retornando ao aplicativo"
+ denied: "Acesso negado"
+ pleaseLogin: "Por favor, entre para autorizar aplicativos."
+_antennaSources:
+ all: "Todas as notas"
+ homeTimeline: "Notas de usuários seguidos"
+ users: "Notas de usuários específicos"
+ userList: "Notas de uma lista específica de usuários"
+ userBlacklist: "Todas as notas, exceto as de um ou mais usuários específicos"
+_weekday:
+ sunday: "Domingo"
+ monday: "Segunda-feira"
+ tuesday: "Terça-feira"
+ wednesday: "Quarta-feira"
+ thursday: "Quinta-feira"
+ friday: "Sexta-feira"
+ saturday: "Sábado"
_widgets:
profile: "Perfil"
instanceInfo: "Informações da instância"
@@ -1394,29 +2156,112 @@ _widgets:
_userList:
chooseList: "Selecione uma lista"
clicker: "Clicker"
+ birthdayFollowings: "Usuários de aniversário hoje"
_cw:
+ hide: "Esconder"
show: "Carregar mais"
+ chars: "{count} caracteres"
+ files: "{count} arquivo(s)"
_poll:
+ noOnlyOneChoice: "São necessárias, no mínimo, duas escolhas"
+ choiceN: "Escolha {n}"
+ noMore: "Você não pode adicionar mais escolhas"
canMultipleVote: "Permitir múltipla seleção"
+ expiration: "Encerrar enquete"
+ infinite: "Nunca"
+ at: "Terminar em..."
+ after: "Terminar após..."
+ deadlineDate: "Data de término"
+ deadlineTime: "Tempo"
+ duration: "Duração"
+ votesCount: "{n} votos"
+ totalVotes: "{n} votos totais"
vote: "Votar em enquetes"
+ showResult: "Ver resultados"
+ voted: "Votada"
+ closed: "Encerrada"
+ remainingDays: "{d} dia(s) {h} hora(s) restantes"
+ remainingHours: "{h} hora(s) {m} minuto(s) restantes"
+ remainingMinutes: "{m} minuto(s) {s} segundo(s) restantes"
+ remainingSeconds: "{s} segundo(s) restantes"
_visibility:
+ public: "Público"
+ publicDescription: "Sua nota será visível para todos os usuários"
home: "Início"
+ homeDescription: "Publicar apenas na linha do tempo Início"
followers: "Seguidores"
followersDescription: "Tornar visível apenas para os meus seguidores"
+ specified: "Mensagem Direta"
+ specifiedDescription: "Tornar visível apenas para usuários específicos"
+ disableFederation: "Defederar"
+ disableFederationDescription: "Não transmitir às outras instâncias"
+_postForm:
+ replyPlaceholder: "Responder a essa nota..."
+ quotePlaceholder: "Citar essa nota..."
+ channelPlaceholder: "Postar em canal..."
+ _placeholders:
+ a: "Como vão as coisas?"
+ b: "O que está rolando por aí?"
+ c: "No que está pensando?"
+ d: "Do que você quer falar?"
+ e: "Comece a digitar..."
+ f: "Esperando você digitar..."
_profile:
name: "Nome"
username: "Nome de usuário"
+ description: "Bio"
+ youCanIncludeHashtags: "Você pode incluir hashtags em sua bio."
+ metadata: "Informações Adicionais"
+ metadataEdit: "Editar informações adicionais"
+ metadataDescription: "Aqui, você pode exibir campos adicionais de informação no seu perfil."
+ metadataLabel: "Rótulo"
+ metadataContent: "Conteúdo"
+ changeAvatar: "Mudar avatar"
+ changeBanner: "Mudar banner"
+ verifiedLinkDescription: "Ao inserir um URL que contém um link para essa conta, um ícone de verificação será exibido ao lado do campo"
+ avatarDecorationMax: "Você pode adicionar até {max} decorações."
_exportOrImport:
+ allNotes: "Todas as notas"
favoritedNotes: "Notas nos favoritos"
clips: "Clipe"
followingList: "Seguindo"
muteList: "Silenciar"
blockingList: "Bloquear"
userLists: "Listas"
+ excludeMutingUsers: "Excluir usuários silenciados"
+ excludeInactiveUsers: "Excluir usuários inativos"
+ withReplies: "Incluir respostas de usuários importados na linha do tempo"
_charts:
federation: "União"
+ apRequest: "Solicitações"
+ usersIncDec: "Diferença no número de usuários"
+ usersTotal: "Número total de usuários"
+ activeUsers: "Usuários ativos"
+ notesIncDec: "Diferença no número de notas"
+ localNotesIncDec: "Diferença no número de notas locais"
+ remoteNotesIncDec: "Diferença no número de notas remotas"
+ notesTotal: "Número total de notas"
+ filesIncDec: "Diferença no número de arquivos"
+ filesTotal: "Número total de arquivos"
+ storageUsageIncDec: "Diferença no uso de armazenamento"
+ storageUsageTotal: "Uso total de armazenamento"
+_instanceCharts:
+ requests: "Solicitações"
+ users: "Diferença no número de usuários"
+ usersTotal: "Número cumulativo de usuários"
+ notes: "Diferença no número de notas"
+ notesTotal: "Número cumulativo de notas"
+ ff: "Diferença entre número de usuários seguidos/seguidores"
+ ffTotal: "Número cumulativo de usuários seguidos/seguidores"
+ cacheSize: "Diferença do tamanho do cache"
+ cacheSizeTotal: "Tamanho cumulativo do cache"
+ files: "Diferença no número de arquivos"
+ filesTotal: "Número cumulativo de arquivos"
_timelines:
home: "Início"
+ local: "Local"
+ social: "Social"
+ global: "Global"
_play:
new: "Criar Play"
edit: "Editar Play"
@@ -1425,18 +2270,66 @@ _play:
deleted: "Play foi excluído"
pageSetting: "Configurações do Play"
editThisPage: "Editar este Play"
+ viewSource: "Ver fonte"
my: "Meus Plays"
liked: "Plays curtidos"
+ featured: "Popular"
+ title: "Título"
script: "Script"
summary: "Descrição"
+ visibilityDescription: "Pôr em privado significa que ele não será visível no perfil, mas qualquer um com o URL poderá acessar"
_pages:
+ newPage: "Criar uma Página"
+ editPage: "Editar essa Página"
+ readPage: "Ver a fonte dessa Página"
+ created: "Página criada com sucesso"
+ updated: "Página atualizada com sucesso"
deleted: "Página excluída com sucesso"
+ pageSetting: "Configurações da página"
+ nameAlreadyExists: "O URL de Página especificado já existe"
+ invalidNameTitle: "O URL de Página especificado é inválido"
+ invalidNameText: "Confira se o título da Página não está vazio"
+ editThisPage: "Editar essa Página"
+ viewSource: "Ver código-fonte"
viewPage: "Visualizar as suas páginas"
like: "Curtir"
unlike: "Remover curtida"
+ my: "Minhas Páginas"
liked: "Páginas curtidas"
+ featured: "Populares"
+ inspector: "Inspetor"
+ contents: "Conteúdo"
+ content: "Bloco da Página"
+ variables: "Variáveis"
+ title: "Título"
+ url: "URL da Página"
+ summary: "Resumo da página"
+ alignCenter: "Centralizar elementos"
+ hideTitleWhenPinned: "Esconder título da Página quando fixado em perfil"
+ font: "Fonte"
+ fontSerif: "Serif"
+ fontSansSerif: "Sans Serif"
+ eyeCatchingImageSet: "Escolher miniatura"
+ eyeCatchingImageRemove: "Excluir miniatura"
+ chooseBlock: "Adicionar bloco"
+ enterSectionTitle: "Insira um título à seção"
+ selectType: "Selecionar um tipo"
+ contentBlocks: "Conteúdo"
+ inputBlocks: "Inserir"
+ specialBlocks: "Especial"
blocks:
+ text: "Texto"
+ textarea: "Área do texto"
+ section: "Seção"
image: "imagem"
+ button: "Botão"
+ dynamic: "Blocos Dinâmicos"
+ dynamicDescription: "Esse bloco foi abolido. Por favor, use {play} de agora em diante."
+ note: "Nota embutida"
+ _note:
+ id: "ID da nota"
+ idDescription: "Você também pode colar o URL da nota aqui."
+ detailed: "Visão detalhada"
_relayStatus:
requesting: "Pendente"
accepted: "Aprovado"
@@ -1451,18 +2344,35 @@ _notification:
youReceivedFollowRequest: "Você recebeu um pedido de seguidor"
yourFollowRequestAccepted: "Seu pedido de seguidor foi aceito"
pollEnded: "Os resultados da enquete agora estão disponíveis"
+ newNote: "Nova nota"
+ unreadAntennaNote: "Antena {name}"
+ roleAssigned: "Cargo dado"
emptyPushNotificationMessage: "As notificações de alerta foram atualizadas"
+ achievementEarned: "Conquista desbloqueada"
+ testNotification: "Notificação teste"
+ checkNotificationBehavior: "Verificar aparência da notificação"
+ sendTestNotification: "Enviar notificação de teste"
+ notificationWillBeDisplayedLikeThis: "Notificações se parecem com isso"
+ reactedBySomeUsers: "{n} usuários reagiram"
+ likedBySomeUsers: "{n} usuários gostaram da nota"
+ renotedBySomeUsers: "{n} usuários repostaram a nota"
+ followedBySomeUsers: "{n} usuários te seguiram"
+ flushNotification: "Limpar notificações"
_types:
all: "Todas"
+ note: "Novas notas"
follow: "Seguindo"
mention: "Menção"
reply: "Respostas"
renote: "Repostar"
- quote: "Citar"
+ quote: "Citações"
reaction: "Reações"
pollEnded: "Enquetes terminando"
receiveFollowRequest: "Recebeu pedidos de seguidor"
followRequestAccepted: "Aceitou pedidos de seguidor"
+ roleAssigned: "Cargo dado"
+ achievementEarned: "Conquista desbloqueada"
+ login: "Iniciar sessão"
app: "Notificações de aplicativos conectados"
_actions:
followBack: "te seguiu de volta"
@@ -1472,13 +2382,23 @@ _deck:
alwaysShowMainColumn: "Sempre mostrar a coluna principal"
columnAlign: "Alinhar colunas"
addColumn: "Adicionar coluna"
+ newNoteNotificationSettings: "Opções de notificação para novas notas"
+ configureColumn: "Configurar coluna"
swapLeft: "Trocar de posição com a coluna à esquerda"
swapRight: "Trocar de posição com a coluna à direita"
swapUp: "Trocar de posição com a coluna acima"
swapDown: "Trocar de posição com a coluna abaixo"
+ stackLeft: "Empilhar na coluna à esquerda"
popRight: "Acoplar coluna à direita"
profile: "Perfil"
+ newProfile: "Novo perfil"
deleteProfile: "Remover perfil"
+ introduction: "Crie a interface perfeita para você arranjando as colunas livremente!"
+ introduction2: "Clique no + à direita da tela para adicionar novas colunas quando quiser."
+ widgetsIntroduction: "Por favor, selecione \"Editar widgets\" no menu em coluna e adicione um widget."
+ useSimpleUiForNonRootPages: "Usar UI simples para páginas navegadas"
+ usedAsMinWidthWhenFlexible: "A largura mínima será usada para isso quando o \"Ajuste automático da largura\" estiver ativado"
+ flexible: "Ajuste automático da largura"
_columns:
main: "Principal"
widgets: "Widgets"
@@ -1490,18 +2410,230 @@ _deck:
mentions: "Menções"
direct: "Notas diretas"
roleTimeline: "Linha do tempo do cargo"
+_dialog:
+ charactersExceeded: "Você excedeu o limite de caracteres! Atualmente em {current} de {max}."
+ charactersBelow: "Você está abaixo do limite mínimo de caracteres! Atualmente em {current} of {min}."
+_disabledTimeline:
+ title: "Linha do tempo desabilitada"
+ description: "Você não pode acessar essa linha do tempo sob o seu cargo atual."
_drivecleaner:
orderBySizeDesc: "Tamanho descendente"
orderByCreatedAtAsc: "Data ascendente"
_webhookSettings:
+ createWebhook: "Criar Webhook"
+ modifyWebhook: "Modificar Webhook"
name: "Nome"
+ secret: "Segredo"
+ trigger: "Gatilho"
active: "Ativado"
_events:
follow: "Quando seguindo um usuário"
followed: "Quando sendo seguido"
+ note: "Ao postar uma nota"
+ reply: "Quando receber uma resposta"
renote: "Quando repostado"
+ reaction: "Quando receber uma reação"
+ mention: "Quando for mencionado"
+ _systemEvents:
+ abuseReport: "Quando receber um relatório de abuso"
+ abuseReportResolved: "Quando relatórios de abuso forem resolvidos "
+ userCreated: "Quando um usuário é criado"
+ deleteConfirm: "Você tem certeza de que deseja excluir o Webhook?"
+_abuseReport:
+ _notificationRecipient:
+ createRecipient: "Adicionar destinatário para relatórios de abuso"
+ modifyRecipient: "Editar destinatários para relatórios de abuso"
+ recipientType: "TIpo de notificação"
+ _recipientType:
+ mail: "E-mail"
+ webhook: "Webhook"
+ _captions:
+ mail: "Enviar o email aos endereços dos moderadores ao receber relatório de abuso."
+ webhook: "Enviar uma notificação ao SystemWebhook quando você receber um resolver um relatório de abuso."
+ keywords: "Palavras-chave"
+ notifiedUser: "Usuários para notificar"
+ notifiedWebhook: "Webhook usado"
+ deleteConfirm: "Você tem certeza de que quer excluir o destinatário da notificação?"
_moderationLogTypes:
+ createRole: "Cargo criado"
+ deleteRole: "Cargo excluído"
+ updateRole: "Cargo atualizado"
+ assignRole: "Cargo atribuído"
+ unassignRole: "Cargo removido"
suspend: "Suspender"
+ unsuspend: "Suspensão cancelada"
+ addCustomEmoji: "Emoji personalizado adicionado"
+ updateCustomEmoji: "Emoji personalizado atualizado"
+ deleteCustomEmoji: "Emoji personalizado removido"
+ updateServerSettings: "Configurações de servidor atualizadas"
+ updateUserNote: "Nota de moderação atualizada"
+ deleteDriveFile: "Arquivo excluído"
+ deleteNote: "Nota excluída"
+ createGlobalAnnouncement: "Anúncio global criado"
+ createUserAnnouncement: "Anúncio de usuário criado"
+ updateGlobalAnnouncement: "Anúncio global atualizado"
+ updateUserAnnouncement: "Anúncio de usuário atualizado"
+ deleteGlobalAnnouncement: "Anúncio global excluído"
+ deleteUserAnnouncement: "Anúncio de usuário excluído"
resetPassword: "Redefinir senha"
+ suspendRemoteInstance: "Instância remota suspensa"
+ unsuspendRemoteInstance: "Suspensão de instância remota removida"
+ updateRemoteInstanceNote: "Nota de moderação atualizada para instância remota."
+ markSensitiveDriveFile: "Arquivo marcado como sensível"
+ unmarkSensitiveDriveFile: "Arquivo desmarcado como sensível"
+ resolveAbuseReport: "Relatório resolvido"
+ createInvitation: "Convite gerado"
+ createAd: "Propaganda criada"
+ deleteAd: "Propaganda excluída"
+ updateAd: "Propaganda atualizada"
+ createAvatarDecoration: "Decoração de avatar criada"
+ updateAvatarDecoration: "Decoração de avatar atualizada"
+ deleteAvatarDecoration: "Decoração de avatar removida"
+ unsetUserAvatar: "Remover avatar de usuário"
+ unsetUserBanner: "Remover banner de usuário"
+ createSystemWebhook: "Criar SystemWebhook"
+ updateSystemWebhook: "Atualizar SystemWebhook"
+ deleteSystemWebhook: "Remover SystemWebhook"
+ createAbuseReportNotificationRecipient: "Criar um destinatário para relatórios de abuso"
+ updateAbuseReportNotificationRecipient: "Atualizar destinatários para relatórios de abuso"
+ deleteAbuseReportNotificationRecipient: "Remover um destinatário para relatórios de abuso"
+ deleteAccount: "Remover conta"
+ deletePage: "Remover página"
+ deleteFlash: "Remover Play"
+ deleteGalleryPost: "Remover a publicação da galeria"
+_fileViewer:
+ title: "Detalhes do arquivo"
+ type: "Tipo de arquivo"
+ size: "Tamanho do arquivo"
+ url: "URL"
+ uploadedAt: "Adicionado em"
+ attachedNotes: "Notas anexadas"
+ thisPageCanBeSeenFromTheAuthor: "Essa página só pode ser vista pelo usuário que enviou esse arquivo."
+_externalResourceInstaller:
+ title: "Instalar de site externo"
+ checkVendorBeforeInstall: "Tenha certeza de que o distribuidor desse recurso é confiável antes da instalação."
+ _plugin:
+ title: "Deseja instalar esse plugin?"
+ metaTitle: "Informações do plugin"
+ _theme:
+ title: "Deseja instalar esse tema?"
+ metaTitle: "Informações do tema"
+ _meta:
+ base: "Paleta de cores base"
+ _vendorInfo:
+ title: "Informações do distribuidor"
+ endpoint: "Endpoint referenciado"
+ hashVerify: "Verificação de hashes"
+ _errors:
+ _invalidParams:
+ title: "Parâmetros inválidos"
+ description: "Não há informações suficientes para carregar dados do site externo. Por favor, confirme o URL inserido."
+ _resourceTypeNotSupported:
+ title: "Esse recurso externo é incompatível"
+ description: "Esse tipo de recuso externo é incompatível. Por favor, comunique o administrador do site."
+ _failedToFetch:
+ title: "Não foi possível obter dados"
+ fetchErrorDescription: "Houve um erro ao comunicar com o site externo. Se tentar novamente não resolver o problema, contate o administrador do site."
+ parseErrorDescription: "Houve um erro processando os dados do site externo. Por favor, contate o administrador do site."
+ _hashUnmatched:
+ title: "Verificação de dados falhou"
+ description: "Houve um erro verificando a integridade do conteúdo obtido. Como medida de segurança, a instalação foi interrompida. Por favor, contate o administrador do site."
+ _pluginParseFailed:
+ title: "Erro AiScript"
+ description: "Os dados solicitados foram obtidos com sucesso, mas houve um erro na leitura do AiScript. Por favor, contate o autor do plugin. Detalhes de erro podem ser vistos no console Javascript."
+ _pluginInstallFailed:
+ title: "A instalação do plugin falhou."
+ description: "Houve um problema na instalação do plugin. Por favor, tente novamente. Detalhes de erro podem ser vistos no console Javascript."
+ _themeParseFailed:
+ title: "Erro na leitura do tema"
+ description: "Os dados solicitados foram obtidos com sucesso, mas houve um erro na leitura do tema. Por favor, contate o autor do tema. Detalhes de erro podem ser vistos no console Javascript."
+ _themeInstallFailed:
+ title: "Falha ao instalar tema"
+ description: "Houve um problema na instalação do tema. Por favor, tente novamente. Detalhes do erro podem ser vistos no console Javascript."
+_dataSaver:
+ _media:
+ title: "Carregando mídia"
+ description: "Previne que mídia seja carregada automaticamente. Mídias escondidas serão carregadas quando selecionadas."
+ _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."
+ _urlPreview:
+ title: "Miniaturas na prévia de URLs"
+ description: "Miniaturas na prévia de URLs não serão mais carregadas."
+ _code:
+ 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."
+_hemisphere:
+ N: "Hemisfério Norte"
+ S: "Hemisfério Sul"
+ caption: "Utilizado em algumas configurações de aplicativo para determinar a estação do ano."
_reversi:
+ reversi: "Reversi"
+ gameSettings: "Configurações de jogo"
+ chooseBoard: "Escolha um tabuleiro"
+ blackOrWhite: "Preto/Branco"
+ blackIs: "{name} é as peças Pretas"
+ rules: "Regras"
+ thisGameIsStartedSoon: "O jogo começará em breve"
+ waitingForOther: "Esperando o turno do oponente"
+ waitingForMe: "Esperando o seu turno"
+ waitingBoth: "Prepare-se"
+ ready: "Pronto"
+ cancelReady: "Não pronto"
+ opponentTurn: "Turno do oponente"
+ myTurn: "Seu turno"
+ turnOf: "É o turno de {name}"
+ pastTurnOf: "Turno de {name}"
+ surrender: "Desistir"
+ surrendered: "Desistiu"
+ timeout: "Fim do tempo"
+ drawn: "Empate"
+ won: "{name} venceu"
+ black: "Preto"
+ white: "Branco"
total: "Total"
+ turnCount: "Turno {count}"
+ myGames: "Meus jogos"
+ allGames: "Todos os jogos"
+ ended: "Terminado"
+ playing: "Atualmente jogando"
+ isLlotheo: "Aquele com menos pedras vence (Llotheo)"
+ loopedMap: "Mapa em ‘loop’"
+ canPutEverywhere: "É possível pôr em qualquer lugar"
+ timeLimitForEachTurn: "Tempo limite por turno"
+ freeMatch: "Partida Livre"
+ lookingForPlayer: "À procura de adversários..."
+ gameCanceled: "A partida foi cancelada."
+ shareToTlTheGameWhenStart: "Compartilhar jogo na linha do tempo ao iniciar"
+ iStartedAGame: "O jogo começou! #MisskeyReversi"
+ opponentHasSettingsChanged: "O oponente alterou as configurações dele"
+ allowIrregularRules: "Regras irregulares (completamente livre)"
+ disallowIrregularRules: "Sem regras irregulares"
+ showBoardLabels: "Exibir numeração de linha e coluna no tabuleiro"
+ useAvatarAsStone: "Utilizar avatares de usuário como as pedras"
+_offlineScreen:
+ title: "Offline - não foi possível conectar ao servidor"
+ header: "Não foi possível conectar ao servidor"
+_urlPreviewSetting:
+ title: "Configurações da prévia de URL"
+ enable: "Habilitar prévia de URL"
+ timeout: "Tempo máximo para obter a prévia (ms)"
+ timeoutDescription: "Se demorar mais que esse valor para obter uma prévia, ela não será gerada."
+ maximumContentLength: "Content-Length máximo (em bytes)"
+ maximumContentLengthDescription: "Se o Content-Length for maior que esse valor, a prévia não será gerada."
+ requireContentLength: "Gerar previu apenas se houver cabeçalho Content-Length disponível na solicitação"
+ requireContentLengthDescription: "Se o outro servidor não retornar um cabeçalho Content-Length, a prévia não será gerada."
+ userAgent: "User-Agent"
+ userAgentDescription: "Define o User-Agent a ser usado ao gerar prévias. Se for deixado em branco, será usado o User-Agent padrão."
+ summaryProxy: "Endpoints do Proxy que geram prévias"
+ summaryProxyDescription: "Fora do Misskey, gerar prévias usando o Sumally Proxy."
+ summaryProxyDescription2: "Os parâmetros a seguir são vinculados ao proxy como um 'query string'. Se o proxy não os suportar, os valores serão ignorados."
+_mediaControls:
+ pip: "Picture-in-Picture"
+ playbackRate: "Velocidade de Reprodução"
+ loop: "Reprodução em Loop"
+_contextMenu:
+ title: "Menu de contexto"
+ app: "Aplicativo"
+ appWithShift: "Aplicativo com a tecla shift"
+ native: "Nativo"
diff --git a/locales/ro-RO.yml b/locales/ro-RO.yml
index 328d34405e..3cc09aa5c2 100644
--- a/locales/ro-RO.yml
+++ b/locales/ro-RO.yml
@@ -453,7 +453,6 @@ or: "Sau"
language: "Limbă"
uiLanguage: "Limba interfeței"
aboutX: "Despre {x}"
-disableDrawer: "Nu folosi meniuri în stil sertar"
noHistory: "Nu există istoric"
signinHistory: "Istoric autentificări"
doing: "Se procesează..."
@@ -626,10 +625,7 @@ abuseReported: "Raportul tău a fost trimis. Mulțumim."
reporter: "Raportorul"
reporteeOrigin: "Originea raportatului"
reporterOrigin: "Originea raportorului"
-forwardReport: "Redirecționează raportul către instanța externă"
-forwardReportIsAnonymous: "În locul contului tău, va fi afișat un cont anonim, de sistem, ca raportor către instanța externă."
send: "Trimite"
-abuseMarkAsResolved: "Marchează raportul ca rezolvat"
openInNewTab: "Deschide în tab nou"
openInSideView: "Deschide în vedere laterală"
defaultNavigationBehaviour: "Comportament de navigare implicit"
@@ -715,6 +711,7 @@ _notification:
renote: "Re-notează"
quote: "Citează"
reaction: "Reacție"
+ login: "Autentifică-te"
_actions:
reply: "Răspunde"
renote: "Re-notează"
@@ -728,6 +725,10 @@ _deck:
mentions: "Mențiuni"
_webhookSettings:
name: "Nume"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "Email"
_moderationLogTypes:
suspend: "Suspendă"
resetPassword: "Resetează parola"
diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml
index 71f5cad601..8174675880 100644
--- a/locales/ru-RU.yml
+++ b/locales/ru-RU.yml
@@ -2,23 +2,26 @@
_lang_: "Русский"
headlineMisskey: "Сеть, сплетённая из заметок"
introMisskey: "Добро пожаловать! Misskey — это децентрализованный сервис микроблогов с открытым исходным кодом.\nПишите «заметки» — делитесь со всеми происходящим вокруг или рассказывайте о себе 📡\nСтавьте «реакции» — выражайте свои чувства и эмоции от заметок других 👍\nОткройте для себя новый мир 🚀"
-poweredByMisskeyDescription: "{name} – сервис на платформе с открытым исходным кодом Misskey, называемый инстансом Misskey."
+poweredByMisskeyDescription: "{name} – сервис на платформе с открытым исходным кодом Misskey, называемый экземпляром Misskey."
monthAndDay: "{day}.{month}"
search: "Поиск"
notifications: "Уведомления"
username: "Имя пользователя"
password: "Пароль"
+initialPasswordForSetup: "Пароль для начала настройки"
+initialPasswordIsIncorrect: "Пароль для запуска настройки неверен"
+initialPasswordForSetupDescription: "Если вы установили Misskey самостоятельно, используйте пароль, который вы указали в файле конфигурации.\nЕсли вы используете что-то вроде хостинга Misskey, используйте предоставленный пароль.\nЕсли вы не установили пароль, оставьте его пустым и продолжайте."
forgotPassword: "Забыли пароль?"
fetchingAsApObject: "Приём с других сайтов"
-ok: "Окей"
+ok: "Подтвердить"
gotIt: "Ясно!"
cancel: "Отмена"
noThankYou: "Нет, спасибо"
enterUsername: "Введите имя пользователя"
-renotedBy: "{user} делится"
+renotedBy: "{user} репостнул(а)"
noNotes: "Нет ни одной заметки"
noNotifications: "Нет уведомлений"
-instance: "Инстанс"
+instance: "Экземпляр"
settings: "Настройки"
notificationSettings: "Настройки уведомлений"
basicSettings: "Основные настройки"
@@ -45,22 +48,24 @@ pin: "Закрепить в профиле"
unpin: "Открепить от профиля"
copyContent: "Скопировать содержимое"
copyLink: "Скопировать ссылку"
+copyLinkRenote: "Скопировать ссылку на репост"
delete: "Удалить"
deleteAndEdit: "Удалить и отредактировать"
-deleteAndEditConfirm: "Удалить эту заметку и создать отредактированную? Все реакции, ссылки и ответы на существующую будут будут потеряны."
+deleteAndEditConfirm: "Удалить этот пост и отредактировать заново? Все реакции, репосты и ответы на него также будут удалены."
addToList: "Добавить в список"
addToAntenna: "Добавить к антенне"
sendMessage: "Отправить сообщение"
copyRSS: "Скопировать RSS"
copyUsername: "Скопировать имя пользователя"
-copyUserId: "Скопировать идентификатор пользователя"
-copyNoteId: "Скопировать идентификатор заметки"
+copyUserId: "Скопировать ID пользователя"
+copyNoteId: "Скопировать ID поста"
copyFileId: "Скопировать ID файла"
copyFolderId: "Скопировать ID папки"
-copyProfileUrl: "Скопировать URL профиля "
+copyProfileUrl: "Скопировать ссылку на профиль"
searchUser: "Поиск людей"
+searchThisUsersNotes: "Искать по заметкам пользователя"
reply: "Ответ"
-loadMore: "Показать еще"
+loadMore: "Загрузить ещё"
showMore: "Показать ещё"
showLess: "Закрыть"
youGotNewFollower: "Новый подписчик"
@@ -107,11 +112,14 @@ enterEmoji: "Введите эмодзи"
renote: "Репост"
unrenote: "Отмена репоста"
renoted: "Репост совершён."
+renotedToX: "Репостнуть в {name}."
cantRenote: "Это нельзя репостить."
cantReRenote: "Невозможно репостить репост."
quote: "Цитата"
inChannelRenote: "В канале"
inChannelQuote: "Заметки в канале"
+renoteToChannel: "Репостнуть в канал"
+renoteToOtherChannel: "Репостнуть в другой канал"
pinnedNote: "Закреплённая заметка"
pinned: "Закрепить в профиле"
you: "Вы"
@@ -150,6 +158,7 @@ editList: "Редактировать список"
selectChannel: "Выберите канал"
selectAntenna: "Выберите антенну"
editAntenna: "Редактировать антенну"
+createAntenna: "Создать антенну"
selectWidget: "Выберите виджет"
editWidgets: "Редактировать виджеты"
editWidgetsExit: "Готово"
@@ -157,11 +166,12 @@ customEmojis: "Собственные эмодзи"
emoji: "Эмодзи"
emojis: "Эмодзи"
emojiName: "Название эмодзи"
-emojiUrl: "URL эмодзи"
+emojiUrl: "Ссылка на эмодзи"
addEmoji: "Добавить эмодзи"
settingGuide: "Рекомендуемые настройки"
cacheRemoteFiles: "Кешировать внешние файлы"
cacheRemoteFilesDescription: "Когда эта настройка отключена, файлы с других сайтов будут загружаться прямо оттуда. Это сэкономит место на сервере, но увеличит трафик, так как не будут создаваться эскизы."
+youCanCleanRemoteFilesCache: "Вы можете очистить кэш, нажав на кнопку 🗑️ в меню управления файлами."
cacheRemoteSensitiveFiles: "Кэшировать внешние файлы «не для всех»"
cacheRemoteSensitiveFilesDescription: "Если отключено, файлы «не для всех» загружаются непосредственно с удалённых серверов, не кэшируясь."
flagAsBot: "Аккаунт бота"
@@ -175,6 +185,10 @@ addAccount: "Добавить учётную запись"
reloadAccountsList: "Обновить список учётных записей"
loginFailed: "Неудачная попытка входа"
showOnRemote: "Перейти к оригиналу на сайт"
+continueOnRemote: "Продолжить на удалённом сервере"
+chooseServerOnMisskeyHub: "Выбрать сервер с Misskey Hub"
+specifyServerHost: "Укажите сервер напрямую"
+inputHostName: "Введите домен"
general: "Общее"
wallpaper: "Обои"
setWallpaper: "Установить обои"
@@ -185,6 +199,7 @@ followConfirm: "Подписаться на {name}?"
proxyAccount: "Учётная запись прокси"
proxyAccountDescription: "Учетная запись прокси предназначена служить подписчиком на пользователей с других сайтов. Например, если пользователь добавит кого-то с другого сайта а список, деятельность того не отобразится, пока никто с этого же сайта не подписан на него. Чтобы это стало возможным, на него подписывается прокси."
host: "Хост"
+selectSelf: "Выбрать себя"
selectUser: "Выберите пользователя"
recipient: "Кому"
annotation: "Описание"
@@ -199,6 +214,7 @@ perHour: "По часам"
perDay: "По дням"
stopActivityDelivery: "Остановить отправку обновлений активности"
blockThisInstance: "Блокировать этот инстанс"
+silenceThisInstance: "Заглушить этот инстанс"
operations: "Операции"
software: "Программы"
version: "Версия"
@@ -218,6 +234,8 @@ clearCachedFiles: "Очистить кэш"
clearCachedFilesConfirm: "Удалить все закэшированные файлы с других сайтов?"
blockedInstances: "Заблокированные инстансы"
blockedInstancesDescription: "Введите список инстансов, которые хотите заблокировать. Они больше не смогут обмениваться с вашим инстансом."
+silencedInstances: "Заглушённые инстансы"
+federationAllowedHosts: "Серверы, поддерживающие федерацию"
muteAndBlock: "Скрытие и блокировка"
mutedUsers: "Скрытые пользователи"
blockedUsers: "Заблокированные пользователи"
@@ -236,7 +254,7 @@ noJobs: "Нет заданий"
federating: "Федерируется"
blocked: "Заблокировано"
suspended: "Заморожено"
-all: "Всё"
+all: "Все"
subscribing: "Подписка"
publishing: "Публикация"
notResponding: "Нет ответа"
@@ -268,7 +286,7 @@ messaging: "Сообщения"
upload: "Загрузить"
keepOriginalUploading: "Сохранить исходное изображение"
keepOriginalUploadingDescription: "Сохраняет исходную версию при загрузке изображений. Если выключить, то при загрузке браузер генерирует изображение для публикации."
-fromDrive: "С «диска»"
+fromDrive: "С Диска"
fromUrl: "По ссылке"
uploadFromUrl: "Загрузить по ссылке"
uploadFromUrlDescription: "Ссылка на файл, который хотите загрузить"
@@ -308,6 +326,7 @@ selectFile: "Выберите файл"
selectFiles: "Выберите файлы"
selectFolder: "Выберите папку"
selectFolders: "Выберите папки"
+fileNotSelected: "Файл не выбран"
renameFile: "Переименовать файл"
folderName: "Имя папки"
createFolder: "Создать папку"
@@ -315,6 +334,7 @@ renameFolder: "Переименовать папку"
deleteFolder: "Удалить папку"
folder: "Папка"
addFile: "Добавить файл"
+showFile: "Посмотреть файл"
emptyDrive: "Диск пуст"
emptyFolder: "Папка пуста"
unableToDelete: "Удаление невозможно"
@@ -359,8 +379,8 @@ disablingTimelinesInfo: "У администраторов и модератор
registration: "Регистрация"
enableRegistration: "Разрешить регистрацию"
invite: "Пригласить"
-driveCapacityPerLocalAccount: "Объём диска на одного локального пользователя"
-driveCapacityPerRemoteAccount: "Объём диска на одного пользователя с другого сайта"
+driveCapacityPerLocalAccount: "Объём Диска на одного локального пользователя"
+driveCapacityPerRemoteAccount: "Объём Диска на одного пользователя с другого экземпляра"
inMb: "В мегабайтах"
bannerUrl: "Ссылка на изображение в шапке"
backgroundImageUrl: "Ссылка на фоновое изображение"
@@ -379,6 +399,7 @@ mcaptcha: "mCaptcha"
enableMcaptcha: "Включить mCaptcha"
mcaptchaSiteKey: "Ключ сайта"
mcaptchaSecretKey: "Секретный ключ"
+mcaptchaInstanceUrl: "Ссылка на сервер mCaptcha"
recaptcha: "reCAPTCHA"
enableRecaptcha: "Включить reCAPTCHA"
recaptchaSiteKey: "Ключ сайта"
@@ -393,7 +414,8 @@ manageAntennas: "Настройки антенн"
name: "Название"
antennaSource: "Источник антенны"
antennaKeywords: "Ключевые слова"
-antennaExcludeKeywords: "Исключения"
+antennaExcludeKeywords: "Чёрный список слов"
+antennaExcludeBots: "Исключать ботов"
antennaKeywordsDescription: "Пишите слова через пробел в одной строке, чтобы ловить их появление вместе; на отдельных строках располагайте слова, или группы слов, чтобы ловить любые из них."
notifyAntenna: "Уведомлять о новых заметках"
withFileAntenna: "Только заметки с вложениями"
@@ -426,6 +448,8 @@ totp: "Приложение-аутентификатор"
totpDescription: "Описание приложения-аутентификатора"
moderator: "Модератор"
moderation: "Модерация"
+moderationNote: "Примечания модератора"
+moderationLogs: "Журнал модерации"
nUsersMentioned: "Упомянуло пользователей: {n}"
securityKeyAndPasskey: "Ключ безопасности и парольная фраза"
securityKey: "Ключ безопасности"
@@ -458,10 +482,12 @@ retype: "Введите ещё раз"
noteOf: "Что пишет {user}"
quoteAttached: "Цитата"
quoteQuestion: "Хотите добавить цитату?"
+attachAsFileQuestion: "Текста в буфере обмена слишком много. Прикрепить как текстовый файл?"
noMessagesYet: "Пока ни одного сообщения"
newMessageExists: "Новое сообщение"
onlyOneFileCanBeAttached: "К сообщению можно прикрепить только один файл"
signinRequired: "Пожалуйста, войдите"
+signinOrContinueOnRemote: "Чтобы продолжить, вам необходимо войти в аккаунт на своём сервере или зарегистрироваться / войти в аккаунт на этом."
invitations: "Приглашения"
invitationCode: "Код приглашения"
checking: "Проверка"
@@ -471,7 +497,7 @@ usernameInvalidFormat: "Можно использовать только лат
tooShort: "Слишком короткий"
tooLong: "Слишком длинный"
weakPassword: "Слабый пароль"
-normalPassword: "Годный пароль"
+normalPassword: "Хороший пароль"
strongPassword: "Надёжный пароль"
passwordMatched: "Совпали"
passwordNotMatched: "Не совпадают"
@@ -483,8 +509,10 @@ uiLanguage: "Язык интерфейса"
aboutX: "Описание {x}"
emojiStyle: "Стиль эмодзи"
native: "Системные"
-disableDrawer: "Не использовать выдвижные меню"
+menuStyle: "Стиль меню"
+style: "Стиль"
showNoteActionsOnlyHover: "Показывать кнопки у заметок только при наведении"
+showReactionsCount: "Видеть количество реакций на заметках"
noHistory: "История пока пуста"
signinHistory: "Журнал посещений"
enableAdvancedMfm: "Включить расширенный MFM"
@@ -547,7 +575,7 @@ popout: "Развернуть"
volume: "Громкость"
masterVolume: "Основная регулировка громкости"
notUseSound: "Выключить звук"
-useSoundOnlyWhenActive: "Использовать звук, когда Misskey активен."
+useSoundOnlyWhenActive: "Воспроизводить звук только когда Misskey активен."
details: "Подробнее"
chooseEmoji: "Выберите эмодзи"
unableToProcess: "Не удаётся завершить операцию"
@@ -601,7 +629,7 @@ poll: "Опрос"
useCw: "Скрывать содержимое под предупреждением"
enablePlayer: "Включить проигрыватель"
disablePlayer: "Выключить проигрыватель"
-expandTweet: "Развернуть твит"
+expandTweet: "Развернуть заметку"
themeEditor: "Редактор темы оформления"
description: "Описание"
describeFile: "Добавить подпись"
@@ -613,7 +641,7 @@ plugins: "Расширения"
preferencesBackups: "Резервная копия"
deck: "Пульт"
undeck: "Покинуть пульт"
-useBlurEffectForModal: "Размывка под формой поверх всего"
+useBlurEffectForModal: "Размытие за формой ввода заметки"
useFullReactionPicker: "Полнофункциональный выбор реакций"
width: "Ширина"
height: "Высота"
@@ -644,7 +672,7 @@ smtpSecure: "Использовать SSL/TLS для SMTP-соединений"
smtpSecureInfo: "Выключите при использовании STARTTLS."
testEmail: "Проверка доставки электронной почты"
wordMute: "Скрытие слов"
-hardWordMute: ""
+hardWordMute: "Строгое скрытие слов"
regexpError: "Ошибка в регулярном выражении"
regexpErrorDescription: "В списке {tab} скрытых слов, в строке {line} обнаружена синтаксическая ошибка:"
instanceMute: "Глушение инстансов"
@@ -680,10 +708,7 @@ abuseReported: "Жалоба отправлена. Большое спасибо
reporter: "Сообщивший"
reporteeOrigin: "О ком сообщено"
reporterOrigin: "Кто сообщил"
-forwardReport: "Отправить жалобу на инстанс автора."
-forwardReportIsAnonymous: "Жалоба на удалённый инстанс будет отправлена анонимно. Вместо ваших данных у получателя будет отображена системная учётная запись."
send: "Отправить"
-abuseMarkAsResolved: "Отметить жалобу как решённую"
openInNewTab: "Открыть в новой вкладке"
openInSideView: "Открывать в боковой колонке"
defaultNavigationBehaviour: "Поведение навигации по умолчанию"
@@ -726,6 +751,7 @@ lockedAccountInfo: "Даже если вы вручную подтверждае
alwaysMarkSensitive: "Отмечать файлы как «содержимое не для всех» по умолчанию"
loadRawImages: "Сразу показывать изображения в полном размере"
disableShowingAnimatedImages: "Не проигрывать анимацию"
+highlightSensitiveMedia: "Выделять содержимое не для всех"
verificationEmailSent: "Вам отправлено письмо для подтверждения. Пройдите, пожалуйста, по ссылке из письма, чтобы завершить проверку."
notSet: "Не настроено"
emailVerified: "Адрес электронной почты подтверждён."
@@ -743,7 +769,7 @@ makeExplorable: "Опубликовать профиль в «Обзоре»."
makeExplorableDescription: "Если выключить, ваш профиль не будет показан в разделе «Обзор»."
showGapBetweenNotesInTimeline: "Показывать разделитель между заметками в ленте"
duplicate: "Дубликат"
-left: "Влево"
+left: "Слева"
center: "По центру"
wide: "Толстый"
narrow: "Тонкий"
@@ -822,7 +848,7 @@ noMaintainerInformationWarning: "Не заполнены сведения об
noBotProtectionWarning: "Ботозащита не настроена"
configure: "Настроить"
postToGallery: "Опубликовать в галерею"
-postToHashtag: "Написать заметку с этим хэштегом"
+postToHashtag: "Написать заметку с этим хештегом"
gallery: "Галерея"
recentPosts: "Недавние публикации"
popularPosts: "Популярные публикации"
@@ -839,13 +865,13 @@ emailNotConfiguredWarning: "Не указан адрес электронной
ratio: "Соотношение"
previewNoteText: "Предварительный просмотр"
customCss: "Индивидуальный CSS"
-customCssWarn: "Используйте эту настройку только если знаете, что делаете. Ошибки здесь чреваты тем, что сайт перестанет нормально работать у вас."
+customCssWarn: "Используйте эту настройку только если знаете, что делаете. Ошибки здесь чреваты тем, что у вас перестанет нормально работать сайт."
global: "Всеобщая"
squareAvatars: "Квадратные аватарки"
sent: "Отправить"
received: "Получено"
searchResult: "Результаты поиска"
-hashtags: "Хэштег"
+hashtags: "Хештеги"
troubleshooting: "Разрешение проблем"
useBlurEffect: "Размытие в интерфейсе"
learnMore: "Подробнее"
@@ -857,7 +883,7 @@ accountDeletionInProgress: "В настоящее время выполняет
usernameInfo: "Имя, которое отличает вашу учетную запись от других на этом сервере. Вы можете использовать алфавит (a~z, A~Z), цифры (0~9) или символы подчеркивания (_). Имена пользователей не могут быть изменены позже."
aiChanMode: "Режим Ай"
devMode: "Режим разработчика"
-keepCw: "Сохраняйте Предупреждения о содержимом"
+keepCw: "Сохраняйте предупреждения о содержимом"
pubSub: "Учётные записи Pub/Sub"
lastCommunication: "Последнее сообщение"
resolved: "Решено"
@@ -878,6 +904,8 @@ makeReactionsPublicDescription: "Список сделанных вами реа
classic: "Классика"
muteThread: "Скрыть цепочку"
unmuteThread: "Отменить сокрытие цепочки"
+followingVisibility: "Видимость подписок"
+followersVisibility: "Видимость подписчиков"
continueThread: "Показать следующие ответы"
deleteAccountConfirm: "Учётная запись будет безвозвратно удалена. Подтверждаете?"
incorrectPassword: "Пароль неверен."
@@ -987,6 +1015,7 @@ assign: "Назначить"
unassign: "Отменить назначение"
color: "Цвет"
manageCustomEmojis: "Управлять пользовательскими эмодзи"
+manageAvatarDecorations: "Управление украшениями аватара"
youCannotCreateAnymore: "Вы достигли лимита создания."
cannotPerformTemporary: "Временно недоступен"
cannotPerformTemporaryDescription: "Это действие временно невозможно выполнить из-за превышения лимита выполнения."
@@ -1003,7 +1032,8 @@ thisPostMayBeAnnoying: "Это сообщение может быть непри
thisPostMayBeAnnoyingHome: "Этот пост может быть отправлен на главную"
thisPostMayBeAnnoyingCancel: "Этот пост не может быть отменен."
thisPostMayBeAnnoyingIgnore: "Этот пост может быть проигнорирован "
-collapseRenotes: "Свернуть репосты"
+collapseRenotes: "Сворачивать увиденные репосты"
+collapseRenotesDescription: "Сворачивать посты с которыми вы взаимодействовали."
internalServerError: "Внутренняя ошибка сервера"
internalServerErrorDescription: "Внутри сервера произошла непредвиденная ошибка."
copyErrorInfo: "Скопировать код ошибки"
@@ -1027,7 +1057,10 @@ resetPasswordConfirm: "Сбросить пароль?"
sensitiveWords: "Чувствительные слова"
sensitiveWordsDescription: "Установите общедоступный диапазон заметки, содержащей заданное слово, на домашний. Можно сделать несколько настроек, разделив их переносами строк."
sensitiveWordsDescription2: "Разделение пробелом создаёт спецификацию AND, а разделение косой чертой создаёт регулярное выражение."
+prohibitedWords: "Запрещённые слова"
+prohibitedWordsDescription: "Включает вывод ошибки при попытке опубликовать пост, содержащий указанное слово/набор слов.\nМножество слов может быть указано, разделяемые новой строкой."
prohibitedWordsDescription2: "Разделение пробелом создаёт спецификацию AND, а разделение косой чертой создаёт регулярное выражение."
+hiddenTags: "Скрытые хештеги"
notesSearchNotAvailable: "Поиск заметок недоступен"
license: "Лицензия"
unfavoriteConfirm: "Удалить избранное?"
@@ -1038,9 +1071,14 @@ retryAllQueuesConfirmTitle: "Хотите попробовать ещё раз?"
retryAllQueuesConfirmText: "Нагрузка на сервер может увеличиться"
enableChartsForRemoteUser: "Создание диаграмм для удалённых пользователей"
enableChartsForFederatedInstances: "Создание диаграмм для удалённых серверов"
+showClipButtonInNoteFooter: "Показать кнопку добавления в подборку в меню действий с заметкой"
+reactionsDisplaySize: "Размер реакций"
+limitWidthOfReaction: "Ограничить максимальную ширину реакций и отображать их в уменьшенном размере."
noteIdOrUrl: "ID или ссылка на заметку"
video: "Видео"
videos: "Видео"
+audio: "Звук"
+audioFiles: "Звуковые файлы"
dataSaver: "Экономия трафика"
accountMigration: "Перенос учётной записи"
accountMoved: "Учётная запись перенесена"
@@ -1052,12 +1090,13 @@ editMemo: "Изменить памятку"
reactionsList: "Список реакций"
renotesList: "Репосты"
notificationDisplay: "Отображение уведомлений"
-leftTop: "Влево вверх"
-rightTop: "Вправо вверх"
-leftBottom: "Влево вниз"
-rightBottom: "Вправо вниз"
-vertical: "Вертикальная"
-horizontal: "Сбоку"
+leftTop: "Слева вверху"
+rightTop: "Справа сверху"
+leftBottom: "Слева внизу"
+rightBottom: "Справа внизу"
+stackAxis: "Положение уведомлений"
+vertical: "Вертикально"
+horizontal: "Горизонтально"
position: "Позиция"
serverRules: "Правила сервера"
pleaseConfirmBelowBeforeSignup: "Для регистрации на данном сервере, необходимо согласится с нижеследующими положениями."
@@ -1069,57 +1108,114 @@ createNoteFromTheFile: "Создать заметку из этого файла
archive: "Архив"
channelArchiveConfirmTitle: "Переместить {name} в архив?"
channelArchiveConfirmDescription: "Архивированные каналы перестанут отображаться в списке каналов или результатах поиска. В них также нельзя будет добавлять новые записи."
+thisChannelArchived: "Этот канал находится в архиве."
displayOfNote: "Отображение заметок"
initialAccountSetting: "Настройка профиля"
youFollowing: "Подписки"
preventAiLearning: "Отказаться от использования в машинном обучении (Генеративный ИИ)"
+preventAiLearningDescription: "Запросить краулеров не использовать опубликованный текст или изображения и т.д. для машинного обучения (Прогнозирующий / Генеративный ИИ) датасетов. Это достигается путём добавления \"noai\" HTTP-заголовка в ответ на соответствующий контент. Полного предотвращения через этот заголовок не избежать, так как он может быть просто проигнорирован."
options: "Настройки ролей"
specifyUser: "Указанный пользователь"
+openTagPageConfirm: "Открыть страницу этого хештега?"
+specifyHost: "Указать сайт"
failedToPreviewUrl: "Предварительный просмотр недоступен"
update: "Обновить"
rolesThatCanBeUsedThisEmojiAsReaction: "Роли тех, кому можно использовать эти эмодзи как реакцию"
rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "Если здесь ничего не указать, в качестве реакции эту эмодзи сможет использовать каждый."
+rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "Эти роли должны быть общедоступными."
+cancelReactionConfirm: "Вы действительно хотите удалить свою реакцию?"
later: "Позже"
goToMisskey: "К Misskey"
additionalEmojiDictionary: "Дополнительные словари эмодзи"
installed: "Установлено"
branding: "Бренд"
+enableServerMachineStats: "Опубликовать характеристики сервера"
enableIdenticonGeneration: "Включить генерацию иконки пользователя"
turnOffToImprovePerformance: "Отключение этого параметра может повысить производительность."
+createInviteCode: "Создать код приглашения"
+createCount: "Количество приглашений"
expirationDate: "Дата истечения"
-unused: "Неиспользуемый"
+noExpirationDate: "Бессрочно"
+unused: "Неиспользованное"
+used: "Использован"
expired: "Срок действия приглашения истёк"
doYouAgree: "Согласны?"
icon: "Аватар"
replies: "Ответы"
renotes: "Репост"
loadReplies: "Показать ответы"
+pinnedList: "Закреплённый список"
+keepScreenOn: "Держать экран включённым"
+showRenotes: "Показывать репосты"
+mutualFollow: "Взаимные подписки"
+followingOrFollower: "Подписки или подписчики"
+fileAttachedOnly: "Только заметки с файлами"
+showRepliesToOthersInTimeline: "Показывать ответы в ленте"
+showRepliesToOthersInTimelineAll: "Показывать в ленте ответы пользователей, на которых вы подписаны"
+hideRepliesToOthersInTimelineAll: "Скрывать в ленте ответы пользователей, на которых вы подписаны"
sourceCode: "Исходный код"
+sourceCodeIsNotYetProvided: "Исходный код пока не доступен. Свяжитесь с администратором, чтобы исправить эту проблему."
+repositoryUrl: "Ссылка на репозиторий"
+repositoryUrlDescription: "Если вы используете Misskey как есть (без изменений в исходном коде), введите https://github.com/misskey-dev/misskey"
+privacyPolicy: "Политика Конфиденциальности"
+privacyPolicyUrl: "Ссылка на Политику Конфиденциальности"
+attach: "Прикрепить"
+angle: "Угол"
flip: "Переворот"
+disableStreamingTimeline: "Отключить обновление ленты в режиме реального времени"
+useGroupedNotifications: "Отображать уведомления сгруппировано"
+doReaction: "Добавить реакцию"
code: "Код"
+remainingN: "Остаётся: {n}"
+seasonalScreenEffect: "Эффект времени года на экране"
+decorate: "Украсить"
+addMfmFunction: "Добавить MFM"
lastNDays: "Последние {n} сут"
+hemisphere: "Место проживания"
+enableHorizontalSwipe: "Смахните в сторону, чтобы сменить вкладки"
surrender: "Этот пост не может быть отменен."
+useNativeUIForVideoAudioPlayer: "Использовать интерфейс браузера при проигрывании видео и звука"
+keepOriginalFilename: "Сохранять исходное имя файла"
+keepOriginalFilenameDescription: "Если вы выключите данную настройку, имена файлов будут автоматически заменены случайной строкой при загрузке."
+alwaysConfirmFollow: "Всегда подтверждать подписку"
+inquiry: "Связаться"
_delivery:
stop: "Заморожено"
_type:
none: "Публикация"
+_announcement:
+ tooManyActiveAnnouncementDescription: "Большое количество оповещений может ухудшить пользовательский опыт. Рассмотрите архивирование неактуальных оповещений. "
_initialAccountSetting:
accountCreated: "Аккаунт успешно создан!"
letsStartAccountSetup: "Давайте настроим вашу учётную запись."
profileSetting: "Настройки профиля"
privacySetting: "Настройки конфиденциальности"
initialAccountSettingCompleted: "Первоначальная настройка успешно завершена!"
+ startTutorial: "Пройти Обучение"
skipAreYouSure: "Пропустить настройку?"
_initialTutorial:
+ launchTutorial: "Пройти обучение"
_note:
description: "Посты в Misskey называются 'Заметками.' Заметки отсортированы в хронологическом порядке в ленте и обновляются в режиме реального времени."
+ _reaction:
+ reactToContinue: "Добавьте реакцию, чтобы продолжить."
+ _postNote:
+ _visibility:
+ public: "Твоя заметка будет видна всем."
+ doNotSendConfidencialOnDirect2: "Администратор целевого сервера может видеть что вы отправляете. Будьте осторожны с конфиденциальной информацией, когда отправляете личные заметки пользователям с ненадёжных серверов."
_timelineDescription:
home: "В персональной ленте располагаются заметки тех, на которых вы подписаны."
- local: "Местная лента показывает заметки всех пользователей этого сайта."
+ local: "Местная лента показывает заметки всех пользователей этого экземпляра."
social: "В социальной ленте собирается всё, что есть в персональной и местной лентах."
- global: "В глобальную ленту попадает вообще всё со связанных инстансов."
+ global: "В глобальную ленту попадает вообще всё со связанных экземпляров."
_serverSettings:
iconUrl: "Адрес на иконку роли"
+_accountMigration:
+ moveFrom: "Перенести другую учётную запись сюда"
+ moveTo: "Перенести учётную запись на другой сервер"
+ moveAccountDescription: "Это действие перенесёт ваш аккаунт на другой сервер.\n ・Подписчики с этого аккаунта автоматически подпишутся на новый\n ・Этот аккаунт отпишется от всех пользователей, на которых подписан сейчас\n ・Вы не сможете создавать новые заметки и т.д. на этом аккаунте\n\nТогда как перенос подписчиков происходит автоматически, вы должны будете подготовиться, сделав некоторые шаги, чтобы перенести список пользователей, на которых вы подписаны. Чтобы сделать это, экспортируйте список подписчиков в файл, который затем импортируете на новом аккаунте в меню настроек. То же самое необходимо будет сделать со списками, также как и со скрытыми и заблокированными пользователями.\n\n(Это объяснение применяется к Misskey v13.12.0 и выше. Другое ActivityPub программное обеспечение, такое, как Mastodon, может работать по-другому."
+ startMigration: "Перенести"
+ movedAndCannotBeUndone: "Аккаунт был перемещён. Это действие необратимо."
_achievements:
earnedAt: "Разблокировано в"
_types:
@@ -1395,6 +1491,7 @@ _role:
canPublicNote: "Может публиковать общедоступные заметки"
canInvite: "Может создавать пригласительные коды"
canManageCustomEmojis: "Управлять пользовательскими эмодзи"
+ canManageAvatarDecorations: "Управление украшениями аватара"
driveCapacity: "Доступное пространство на «диске»"
alwaysMarkNsfw: "Всегда отмечать файлы как «не для всех»"
pinMax: "Доступное количество закреплённых заметок"
@@ -1505,6 +1602,11 @@ _aboutMisskey:
donate: "Пожертвование на Misskey"
morePatrons: "Большое спасибо и многим другим, кто принял участие в этом проекте! 🥰"
patrons: "Материальная поддержка"
+ projectMembers: "Участники проекта"
+_displayOfSensitiveMedia:
+ respect: "Скрывать содержимое не для всех"
+ ignore: "Показывать содержимое не для всех"
+ force: "Скрывать всё содержимое"
_instanceTicker:
none: "Не показывать"
remote: "Только для других сайтов"
@@ -1533,7 +1635,7 @@ _wordMute:
muteWordsDescription: "Пишите слова через пробел в одной строке, чтобы фильтровать их появление вместе; а если хотите фильтровать любое из них, пишите в отдельных строках."
muteWordsDescription2: "Здесь можно использовать регулярные выражения — просто заключите их между двумя дробными чертами (/)."
_instanceMute:
- instanceMuteDescription: "Заметки и репосты с указанных здесь инстансов, а также ответы пользователям оттуда же не будут отображаться."
+ instanceMuteDescription: "Любые активности, затрагивающие инстансы из данного списка, будут скрыты."
instanceMuteDescription2: "Пишите каждый инстанс на отдельной строке"
title: "Скрывает заметки с заданных инстансов."
heading: "Список скрытых инстансов"
@@ -1582,7 +1684,7 @@ _theme:
navActive: "Текст на боковой панели (активирован)"
navIndicator: "Индикатор на боковой панели"
link: "Ссылка"
- hashtag: "Хэштег"
+ hashtag: "Хештег"
mention: "Упоминание"
mentionMe: "Упоминания вас"
renote: "Репост"
@@ -1600,7 +1702,6 @@ _theme:
buttonBg: "Фон кнопки"
buttonHoverBg: "Текст кнопки"
inputBorder: "Рамка поля ввода"
- listItemHoverBg: "Фон пункта списка (под указателем)"
driveFolderBg: "Фон папки «Диска»"
wallpaperOverlay: "Слой обоев"
badge: "Значок"
@@ -1612,8 +1713,10 @@ _sfx:
note: "Заметки"
noteMy: "Собственные заметки"
notification: "Уведомления"
- antenna: "Антенна"
- channel: "Канал"
+ reaction: "При выборе реакции"
+_soundSettings:
+ driveFile: "Использовать аудиофайл с Диска."
+ driveFileWarn: "Выбрать аудиофайл с Диска."
_ago:
future: "Из будущего"
justNow: "Только что"
@@ -1692,6 +1795,7 @@ _permissions:
"write:gallery": "Редактирование галереи"
"read:gallery-likes": "Просмотр списка понравившегося в галерее"
"write:gallery-likes": "Изменение списка понравившегося в галерее"
+ "write:admin:reset-password": "Сбросить пароль пользователю"
_auth:
shareAccessTitle: "Разрешения для приложений"
shareAccess: "Дать доступ для «{name}» к вашей учётной записи?"
@@ -1745,6 +1849,7 @@ _widgets:
_userList:
chooseList: "Выберите список"
clicker: "Счётчик щелчков"
+ birthdayFollowings: "Пользователи, у которых сегодня день рождения"
_cw:
hide: "Спрятать"
show: "Показать"
@@ -1798,7 +1903,7 @@ _profile:
name: "Имя"
username: "Имя пользователя"
description: "О себе"
- youCanIncludeHashtags: "Можете использовать здесь хэштеги"
+ youCanIncludeHashtags: "Можете использовать здесь хештеги."
metadata: "Дополнительные сведения"
metadataEdit: "Редактировать дополнительные сведения"
metadataDescription: "Можно добавить до четырёх дополнительных граф в профиль."
@@ -1806,6 +1911,8 @@ _profile:
metadataContent: "Содержимое"
changeAvatar: "Поменять аватар"
changeBanner: "Поменять изображение в шапке"
+ verifiedLinkDescription: "Указывая здесь URL, содержащий ссылку на профиль, иконка владения ресурсом может быть отображена рядом с полем"
+ avatarDecorationMax: "Вы можете добавить до {max} украшений."
_exportOrImport:
allNotes: "Все заметки\n"
favoritedNotes: "Избранное"
@@ -1928,6 +2035,9 @@ _notification:
unreadAntennaNote: "Антенна {name}"
emptyPushNotificationMessage: "Обновлены push-уведомления"
achievementEarned: "Получено достижение"
+ checkNotificationBehavior: "Проверить внешний вид уведомления"
+ sendTestNotification: "Отправить тестовое уведомление"
+ flushNotification: "Очистить уведомления"
_types:
all: "Все"
follow: "Подписки"
@@ -1940,6 +2050,7 @@ _notification:
receiveFollowRequest: "Получен запрос на подписку"
followRequestAccepted: "Запрос на подписку одобрен"
achievementEarned: "Получение достижений"
+ login: "Войти"
app: "Уведомления из приложений"
_actions:
followBack: "отвечает взаимной подпиской"
@@ -1979,15 +2090,57 @@ _dialog:
_disabledTimeline:
title: "Лента отключена"
description: "Ваша текущая роль не позволяет пользоваться этой лентой."
+_drivecleaner:
+ orderBySizeDesc: "Размеры файлов по убыванию"
+ orderByCreatedAtAsc: "По увеличению даты"
_webhookSettings:
createWebhook: "Создать вебхук"
+ modifyWebhook: "Изменить Вебхук"
name: "Название"
+ secret: "Секрет"
+ trigger: "Условие срабатывания"
active: "Вкл."
+ _events:
+ follow: "Когда подписались на пользователя"
+ followed: "Когда на вас подписались"
+ note: "Когда создали заметку"
+ reply: "Когда получили ответ на заметку"
+ renote: "Когда вас репостнули"
+ reaction: "Когда получили реакцию"
+ mention: "Когда вас упоминают"
+ _systemEvents:
+ abuseReport: "Когда приходит жалоба"
+ abuseReportResolved: "Когда разрешается жалоба"
+ userCreated: "Когда создан пользователь"
+ deleteConfirm: "Вы уверены, что хотите удалить этот Вебхук?"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "Электронная почта"
+ webhook: "Вебхук"
+ _captions:
+ webhook: "Отправить уведомление Системному Вебхуку при получении или разрешении жалоб."
+ notifiedWebhook: "Используемый Вебхук"
_moderationLogTypes:
suspend: "Заморозить"
addCustomEmoji: "Добавлено эмодзи"
updateCustomEmoji: "Изменено эмодзи"
deleteCustomEmoji: "Удалено эмодзи"
+ deleteDriveFile: "Файл удалён"
resetPassword: "Сброс пароля:"
+ createInvitation: "Создать код приглашения"
+ createSystemWebhook: "Создать Системный Вебхук"
+ updateSystemWebhook: "Обновить Системый Вебхук"
+ deleteSystemWebhook: "Удалить Системный Вебхук"
+_fileViewer:
+ url: "Ссылка"
+ attachedNotes: "Закреплённые заметки"
+_dataSaver:
+ _code:
+ title: "Подсветка кода"
+_hemisphere:
+ N: "Северное полушарие"
+ S: "Южное полушарие"
+ caption: "Используется для некоторых настроек клиента для определения сезона."
_reversi:
total: "Всего"
diff --git a/locales/si-LK.yml b/locales/si-LK.yml
index e130d68ed8..c43f3d860d 100644
--- a/locales/si-LK.yml
+++ b/locales/si-LK.yml
@@ -17,3 +17,6 @@ _sfx:
note: "නෝට්"
_profile:
username: "පරිශීලක නාමය"
+_notification:
+ _types:
+ login: "පිවිසෙන්න"
diff --git a/locales/sk-SK.yml b/locales/sk-SK.yml
index 52f6bf142c..60ce45a6b9 100644
--- a/locales/sk-SK.yml
+++ b/locales/sk-SK.yml
@@ -454,7 +454,6 @@ uiLanguage: "Jazyk používateľského prostredia"
aboutX: "O {x}"
emojiStyle: "Štýl emoji"
native: "Natívne"
-disableDrawer: "Nepoužívať šuflíkové menu"
showNoteActionsOnlyHover: "Ovládacie prvky poznámky sa zobrazujú len po nabehnutí myši"
noHistory: "Žiadna história"
signinHistory: "História prihlásení"
@@ -632,10 +631,7 @@ abuseReported: "Vaše nahlásenie je odoslané. Veľmi pekne ďakujeme."
reporter: "Nahlásil"
reporteeOrigin: "Pôvod nahláseného"
reporterOrigin: "Pôvod nahlasovača"
-forwardReport: "Preposlať nahlásenie na server"
-forwardReportIsAnonymous: "Namiesto vášho účtu bude zobrazený anonymný systémový účet na vzdialenom serveri ako autor nahlásenia."
send: "Poslať"
-abuseMarkAsResolved: "Označiť nahlásenia ako vyriešené"
openInNewTab: "Otvoriť v novom tabe"
openInSideView: "Otvoriť v bočnom paneli"
defaultNavigationBehaviour: "Predvolené správanie navigácie"
@@ -1112,7 +1108,6 @@ _theme:
buttonBg: "Pozadie tlačidla"
buttonHoverBg: "Pozadie tlačidla (pod kurzorom)"
inputBorder: "Okraj vstupného poľa"
- listItemHoverBg: "Pozadie položky zoznamu (pod kurzorom)"
driveFolderBg: "Pozadie priečinu disku"
wallpaperOverlay: "Vrstvenie pozadia"
badge: "Odznak"
@@ -1124,8 +1119,6 @@ _sfx:
note: "Poznámky"
noteMy: "Vlastná poznámka"
notification: "Oznámenia"
- antenna: "Antény"
- channel: "Upozornenia kanála"
_ago:
future: "Budúcnosť"
justNow: "Teraz"
@@ -1412,6 +1405,7 @@ _notification:
pollEnded: "Hlasovanie skončilo"
receiveFollowRequest: "Doručené žiadosti o sledovanie"
followRequestAccepted: "Schválené žiadosti o sledovanie"
+ login: "Prihlásiť sa"
app: "Oznámenia z prepojených aplikácií"
_actions:
followBack: "Sledovať späť\n"
@@ -1447,6 +1441,10 @@ _deck:
_webhookSettings:
name: "Názov"
active: "Zapnuté"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "Email"
_moderationLogTypes:
suspend: "Zmraziť"
resetPassword: "Resetovať heslo"
diff --git a/locales/sv-SE.yml b/locales/sv-SE.yml
index 089dc3949f..5a0de660e8 100644
--- a/locales/sv-SE.yml
+++ b/locales/sv-SE.yml
@@ -512,7 +512,6 @@ _theme:
_sfx:
note: "Noter"
notification: "Notifikationer"
- antenna: "Antenner"
_2fa:
renewTOTPCancel: "Nej tack"
_antennaSources:
@@ -563,6 +562,7 @@ _notification:
renote: "Omnotera"
quote: "Citat"
reaction: "Reaktioner"
+ login: "Logga in"
_actions:
reply: "Svara"
renote: "Omnotera"
@@ -577,6 +577,10 @@ _deck:
_webhookSettings:
name: "Namn"
active: "Aktiverad"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "E-post"
_moderationLogTypes:
suspend: "Suspendera"
resetPassword: "Återställ Lösenord"
diff --git a/locales/th-TH.yml b/locales/th-TH.yml
index ab09ac4d5a..58cf8f068c 100644
--- a/locales/th-TH.yml
+++ b/locales/th-TH.yml
@@ -2,12 +2,15 @@
_lang_: "ภาษาไทย"
headlineMisskey: "เชื่อมต่อเครือข่ายโดยโน้ต"
introMisskey: "ยินดีต้อนรับทุกคนจ้า! Misskey คือ ซอฟต์แวร์โอเพนซอร์สสำหรับบริการไมโครบล็อกกิ้ง (MicroBlogging) แบบกระจายศูนย์อำนาจ (Decentralized) \n\nเขียน “โน้ต (Note)” เพื่อส่งต่อเรื่องราวของคุณให้ทั้งโลกได้รับรู้📡\nและอย่าลืมที่จะ “รีแอคชั่น” กับเรื่องราวของคนอื่น ๆ ด้วยนะ! 👍\n\nท่องสำรวจโลกใบใหม่กันเถอะ🚀"
-poweredByMisskeyDescription: "{name} เป็นส่วนหนึ่งในบริการที่ถูกขับเคลื่อนโดยแพลตฟอร์มโอเพ่นซอร์ส Misskey (เรียกว่า \"อินสแตนซ์ Misskey\")"
+poweredByMisskeyDescription: "{name} เป็นหนึ่งในเซิร์ฟเวอร์ของแพลตฟอร์มโอเพ่นซอร์ส Misskey"
monthAndDay: "{month}/{day}"
search: "ค้นหา"
-notifications: "การเเจ้งเตือน"
+notifications: "เเจ้งเตือน"
username: "ชื่อผู้ใช้"
password: "รหัสผ่าน"
+initialPasswordForSetup: "รหัสผ่านเริ่มต้นสำหรับการตั้งค่า"
+initialPasswordIsIncorrect: "รหัสผ่านเริ่มต้นสำหรับตั้งค่านั้นไม่ถูกต้องค่ะ"
+initialPasswordForSetupDescription: "ถ้าหากคุณติดตั้ง Misskey เอง ให้ใช้รหัสผ่านที่คุณป้อนในไฟล์กำหนดค่า \nถ้าหากคุณกำลังใช้บริการโฮสต์ Misskey ให้ใช้รหัสผ่านที่ได้รับมา\nถ้ายังไม่มีรหัสผ่าน ให้ข้ามช่องรหัสผ่านไป แล้วกดต่อไป"
forgotPassword: "ลืมรหัสผ่าน"
fetchingAsApObject: "กำลังดึงข้อมูลจากสหพันธ์..."
ok: "ตกลง"
@@ -18,7 +21,7 @@ enterUsername: "กรอกชื่อผู้ใช้"
renotedBy: "รีโน้ตโดย {user}"
noNotes: "ไม่มีโน้ต"
noNotifications: "ไม่มีการแจ้งเตือน"
-instance: "อินสแตนซ์"
+instance: "เซิร์ฟเวอร์"
settings: "การตั้งค่า"
notificationSettings: "ตั้งค่าการแจ้งเตือน"
basicSettings: "การตั้งค่าพื้นฐาน"
@@ -48,7 +51,7 @@ copyLink: "คัดลอกลิงก์"
copyLinkRenote: "คัดลอกลิงก์รีโน้ต"
delete: "ลบ"
deleteAndEdit: "ลบและแก้ไข"
-deleteAndEditConfirm: "คุณต้องการลบโน้ตนี้และแก้ไขใหม่ใช่ไหม? รีแอคชั่น รีโน้ต และการตอบกลับต่อโน้ตนี้ทั้งหมดจะถูกลบออกด้วย"
+deleteAndEditConfirm: "ต้องการลบโน้ตนี้และแก้ไขใหม่ใช่ไหม? รีแอคชั่น รีโน้ต และการตอบกลับต่อโน้ตนี้ทั้งหมดจะถูกลบออกด้วย"
addToList: "เพิ่มลงรายชื่อ"
addToAntenna: "เพิ่มไปยังเสาอากาศ"
sendMessage: "ส่งข้อความ"
@@ -60,6 +63,7 @@ copyFileId: "คัดลอกไฟล์ ID"
copyFolderId: "คัดลอกโฟลเดอร์ ID"
copyProfileUrl: "คัดลอกโปรไฟล์ URL"
searchUser: "ค้นหาผู้ใช้"
+searchThisUsersNotes: "ค้นหาโน้ตของผู้ใช้"
reply: "ตอบกลับ"
loadMore: "แสดงเพิ่มเติม"
showMore: "แสดงเพิ่มเติม"
@@ -68,7 +72,7 @@ youGotNewFollower: "ได้ติดตามคุณ"
receiveFollowRequest: "มีคำขอติดตามส่งมาหา"
followRequestAccepted: "การติดตามได้รับการอนุมัติแล้ว"
mention: "กล่าวถึง"
-mentions: "พูดถึง"
+mentions: "กล่าวถึงคุณ"
directNotes: "โพสต์แบบไดเร็กต์"
importAndExport: "นำเข้า / ส่งออก"
import: "นำเข้า"
@@ -92,7 +96,7 @@ error: "ผิดพลาด!"
somethingHappened: "อุ๊ย ! มีอะไรบางอย่างผิดพลาด"
retry: "ลองใหม่อีกครั้ง"
pageLoadError: "เกิดข้อผิดพลาดในการโหลดหน้านี้"
-pageLoadErrorDescription: "โดยปกติแล้วมักจะเกิดจากข้อผิดพลาดของเครือข่ายหรือแคชของเบราว์เซอร์ ลองล้างแคชแล้วลองใหม่อีกครั้งหลังจากรอสักครู่ "
+pageLoadErrorDescription: "ปัญหานี้มักเกิดจากแคชของเครือข่ายหรือเบราว์เซอร์ ควรล้างแคช, รอสักครู่ แล้วลองใหม่อีกครั้ง"
serverIsDead: "เซิร์ฟเวอร์นี้ไม่มีการตอบสนอง โปรดกรุณารอสักครู่แล้วลองใหม่อีกครั้ง"
youShouldUpgradeClient: "หากต้องการดูหน้านี้ กรุณาโหลดหน้าใหม่เพื่ออัปเดตไคลเอ็นต์ของคุณ"
enterListName: "ป้อนนามเรียกของรายชื่อชุดนี้"
@@ -108,11 +112,14 @@ enterEmoji: "พิมพ์เอโมจิ"
renote: "รีโน้ต"
unrenote: "เลิกรีโน้ต"
renoted: "รีโน้ตแล้ว"
+renotedToX: "รีโน้ตให้ {name} แล้ว"
cantRenote: "โพสต์นี้ไม่สามารถรีโน้ตใหม่ได้"
cantReRenote: "รีโน้ตไม่สามารถรีโน้ตซ้ำได้"
quote: "อ้างอิง"
inChannelRenote: "รีโน้ตในช่องเท่านั้น"
inChannelQuote: "อ้างอิงในช่องเท่านั้น"
+renoteToChannel: "รีโน้ตไปที่ช่อง"
+renoteToOtherChannel: "รีโน้ตไปยังช่องอื่น"
pinnedNote: "โน้ตที่ปักหมุดไว้"
pinned: "ปักหมุด"
you: "คุณ"
@@ -151,6 +158,7 @@ editList: "แก้ไขรายชื่อ"
selectChannel: "เลือกช่อง"
selectAntenna: "เลือกเสาอากาศ"
editAntenna: "แก้ไขเสาอากาศ"
+createAntenna: "สร้างเสาอากาศ"
selectWidget: "เลือกวิดเจ็ต"
editWidgets: "แก้ไขวิดเจ็ต"
editWidgetsExit: "เรียบร้อย"
@@ -163,20 +171,24 @@ addEmoji: "แทรกเอโมจิ"
settingGuide: "การตั้งค่าที่แนะนำ"
cacheRemoteFiles: "แคชไฟล์ระยะไกล"
cacheRemoteFilesDescription: "หากเปิดใช้งาน ไฟล์ระยะไกลจะถูกแคชไว้ ทำให้แสดงภาพเร็วขึ้น แต่ก็ใช้พื้นที่เก็บข้อมูลของเซิร์ฟเวอร์มากขึ้นเช่นกัน สำหรับขีดจำกัดที่ผู้ใช้ระยะไกลถูกแคชไว้จะขึ้นอยู่กับความจุไดรฟ์ตามบทบาทของเขา เมื่อเกินแล้วไฟล์เก่าจะถูกลบออกและเก็บเป็นลิงก์แทน หากปิดใช้งาน ไฟล์ระยะไกลจะถูกเก็บเป็นลิงก์ตั้งแต่ต้น เราแนะนำให้ตั้งค่า proxyRemoteFiles ใน default.yml เป็น true เพื่อสร้างธัมบ์เนลและปกป้องความเป็นส่วนตัวของผู้ใช้"
-youCanCleanRemoteFilesCache: "คุณสามารถล้างแคชได้โดยคลิกที่ปุ่ม 🗑️ ในมุมมองการจัดการไฟล์"
+youCanCleanRemoteFilesCache: "สามารถลบแคชทั้งหมดได้โดยใช้ปุ่ม 🗑️ ในหน้าการจัดการไฟล์"
cacheRemoteSensitiveFiles: "แคชไฟล์ระยะไกลที่มีเนื้อหาละเอียดอ่อน"
-cacheRemoteSensitiveFilesDescription: "เมื่อปิดการใช้งานการตั้งค่านี้ ไฟล์ระยะไกลที่มีเครื่องหมายว่ามีเนื้อหาละเอียดอ่อนนั้นจะถูกโหลดโดยตรงจากอินสแตนซ์ระยะไกลโดยที่ไม่มีการแคช"
+cacheRemoteSensitiveFilesDescription: "เมื่อปิดการใช้งานการตั้งค่านี้ ไฟล์ระยะไกลที่มีเนื้อหาละเอียดอ่อนจะถูกโหลดโดยตรงจากเซิร์ฟเวอร์ระยะไกลโดยไม่มีการแคช"
flagAsBot: "ทำเครื่องหมายบอกว่าบัญชีนี้เป็นบอต"
-flagAsBotDescription: "การเปิดใช้งานตัวเลือกนี้หากบัญชีนี้ถูกควบคุมโดยนักเขียนโปรแกรม หรือ ถ้าหากเปิดใช้งาน มันจะทำหน้าที่เป็นแฟล็กสำหรับนักพัฒนารายอื่นๆ และเพื่อป้องกันการโต้ตอบแบบไม่มีที่สิ้นสุดกับบอทตัวอื่นๆ และยังสามารถปรับเปลี่ยนระบบภายในของ Misskey เพื่อปฏิบัติต่อบัญชีนี้เป็นบอท"
+flagAsBotDescription: "เปิดใช้งานตัวเลือกนี้หากบัญชีนี้ถูกควบคุมโดยโปรแกรม เมื่อเปิดใช้งาน มันจะทำหน้าที่เป็นแฟล็กสำหรับนักพัฒนารายอื่นในการป้องกันการสร้างห่วงโซ่การโต้ตอบแบบอนันต์กับบอตตัวอื่น และปรับระบบภายในของ Misskey เพื่อจัดการบัญชีนี้ในฐานะบอต"
flagAsCat: "เมี้ยววววววววววววววว!!!!!!!!!!!"
flagAsCatDescription: "เหมียวเหมียวเมี้ยว??"
-flagShowTimelineReplies: "แสดงตอบกลับ ในไทม์ไลน์"
-flagShowTimelineRepliesDescription: "แสดงการตอบกลับของผู้ใช้งานไปยังโน้ตของผู้ใช้งานรายอื่นๆในไทม์ไลน์หากได้เปิดเอาไว้"
-autoAcceptFollowed: "อนุมัติคำขอติดตามโดยอัตโนมัติทันที จากผู้ใช้งานที่คุณกำลังติดตาม"
+flagShowTimelineReplies: "แสดงตอบกลับโน้ตลงไทม์ไลน์"
+flagShowTimelineRepliesDescription: "เมื่อเปิดใช้งาน จะแสดงการตอบกลับของผู้ใช้คนนั้นต่อโน้ตอื่นๆ ในไทม์ไลน์ด้วย"
+autoAcceptFollowed: "อนุมัติคำขอติดตามจากผู้ใช้ที่คุณติดตามอยู่โดยอัตโนมัติ"
addAccount: "เพิ่มบัญชี"
reloadAccountsList: "รีโหลดรายการบัญชีใหม่"
loginFailed: "การเข้าสู่ระบบไม่สำเร็จ"
-showOnRemote: "ดูบนอินสแตนซ์ระยะไกล"
+showOnRemote: "ดูบนเซิร์ฟเวอร์ฝั่งระยะไกล"
+continueOnRemote: "ดำเนินการต่อบนเซิร์ฟเวอร์ฝั่งระยะไกล"
+chooseServerOnMisskeyHub: "เลือกเซิร์ฟเวอร์จาก Misskey Hub"
+specifyServerHost: "ระบุโดเมนของเซิร์ฟเวอร์โดยตรง"
+inputHostName: "โปรดป้อนโดเมน"
general: "ทั่วไป"
wallpaper: "ภาพพื้นหลัง"
setWallpaper: "ตั้งค่าภาพพื้นหลัง"
@@ -185,23 +197,25 @@ searchWith: "ค้นหา: {q}"
youHaveNoLists: "คุณไม่มีรายชื่อใดๆ "
followConfirm: "ต้องการติดตาม {name} ใช่ไหม?"
proxyAccount: "บัญชีพร็อกซี่"
-proxyAccountDescription: "บัญชีพร็อกซี่ คือ บัญชีที่จะทำหน้าที่เป็นผู้ติดตามระยะไกลสำหรับผู้ใช้งานที่อยู่ภายใต้ด้วยเงื่อนไขบางอย่าง ยกตัวอย่าง เช่น เมื่อมีผู้ใช้งานนั้นได้เพิ่มผู้ใช้งานจากระยะไกลลงในรายการ แต่กิจกรรมของผู้ใช้ในระยะไกลนั้นจะไม่ถูกส่งไปยังอินสแตนซ์หากไม่มีผู้ใช้งานในพื้นที่ติดตามผู้ใช้รายนั้น ดังนั้นบัญชีพร็อกซีนี้จะติดตามแทน"
+proxyAccountDescription: "บัญชีพร็อกซี คือ บัญชีที่ทำหน้าที่ติดตาม(ผู้ใช้)ระยะไกลภายใต้เงื่อนไขบางประการ ตัวอย่างเช่น เมื่อผู้ใช้ท้องถิ่นเพิ่มผู้ใช้ระยะไกลลงรายชื่อ หากไม่มีใครติดตามผู้ใช้ระยะไกลในรายชื่อนั้น กิจกรรมก็จะไม่ถูกส่งมายังเซิร์ฟเวอร์ ดังนั้นจึงมีบัญชีพร็อกซีไว้ติดตามผู้ใช้ระยะไกลเหล่านั้น"
host: "โฮสต์"
+selectSelf: "เลือกตัวเอง"
selectUser: "เลือกผู้ใช้งาน"
recipient: "ผู้รับ"
annotation: "หมายเหตุประกอบ"
federation: "สหพันธ์"
-instances: "อินสแตนซ์"
+instances: "เซิร์ฟเวอร์"
registeredAt: "วันที่ลงทะเบียน"
latestRequestReceivedAt: "คำขอล่าสุดที่ได้รับ"
latestStatus: "สถานะล่าสุด"
storageUsage: "พื้นที่จัดเก็บข้อมูลที่ใช้ไป"
-charts: "โดดเด่น"
-perHour: "ทุกชั่วโมง"
+charts: "แผนภูมิ"
+perHour: "ต่อชั่วโมง"
perDay: "ต่อวัน"
stopActivityDelivery: "หยุดส่งกิจกรรม"
-blockThisInstance: "บล็อกอินสแตนซ์นี้"
-silenceThisInstance: "ปิดปากอินสแตนซ์นี้"
+blockThisInstance: "บล็อกเซิร์ฟเวอร์นี้"
+silenceThisInstance: "ปิดปากเซิร์ฟเวอร์นี้"
+mediaSilenceThisInstance: "ปิดปากสื่อของเซิร์ฟเวอร์นี้"
operations: "ดำเนินการ"
software: "ซอฟต์แวร์"
version: "เวอร์ชั่น"
@@ -212,17 +226,21 @@ jobQueue: "คิวงาน"
cpuAndMemory: "ซีพียู และ หน่วยความจำ"
network: "เครือข่าย"
disk: "ดิสก์"
-instanceInfo: "ข้อมูลอินสแตนซ์"
+instanceInfo: "ข้อมูลเซิร์ฟเวอร์"
statistics: "สถิติการใช้งาน"
clearQueue: "ล้างคิว"
clearQueueConfirmTitle: "ต้องการล้างคิวใช่ไหม?"
clearQueueConfirmText: "โพสต์ที่ยังค้างในคิวจะไม่ถูกจัดส่งอีกต่อไป โดยปกติแล้วการดำเนินการนี้ไม่จำเป็น"
clearCachedFiles: "ล้างแคช"
clearCachedFilesConfirm: "ต้องการลบไฟล์ระยะไกลที่แคชไว้ทั้งหมดใช่ไหม?"
-blockedInstances: "อินสแตนซ์ที่ถูกบล็อก"
-blockedInstancesDescription: "ระบุชื่อโฮสต์ของอินสแตนซ์ที่คุณต้องการบล็อก อินสแตนซ์ที่อยู่ในรายการนั้นจะไม่สามารถพูดคุยกับอินสแตนซ์นี้ได้อีกต่อไป"
-silencedInstances: "ปิดปากอินสแตนซ์นี้แล้ว"
-silencedInstancesDescription: "ตั้งค่ารายชื่อโฮสต์ของอินสแตนซ์ที่คุณต้องการปิดปาก บัญชีทั้งหมดของอินสแตนซ์ที่อยู่ในรายชื่อนั้นๆ จะถือว่าถูกปิดปากเช่นกัน ทำได้เฉพาะคำขอติดตามเท่านั้น และไม่สามารถกล่าวถึงบัญชีในพื้นที่ได้หากไม่ได้ติดตาม | สิ่งนี้ไม่มีผลต่ออินสแตนซ์ที่ถูกบล็อก"
+blockedInstances: "เซิร์ฟเวอร์ที่ถูกบล็อก"
+blockedInstancesDescription: "ระบุโฮสต์ของเซิร์ฟเวอร์ที่ต้องการบล็อก คั่นด้วยการขึ้นบรรทัดใหม่ เซิร์ฟเวอร์ที่ถูกบล็อกจะไม่สามารถติดต่อกับอินสแตนซ์นี้ได้"
+silencedInstances: "ปิดปากเซิร์ฟเวอร์นี้แล้ว"
+silencedInstancesDescription: "ระบุโฮสต์ของเซิร์ฟเวอร์ที่ต้องการปิดปาก คั่นด้วยการขึ้นบรรทัดใหม่, บัญชีทั้งหมดของเซิร์ฟเวอร์ดังกล่าวจะถือว่าถูกปิดปากเช่นกัน ทำได้เฉพาะคำขอติดตามเท่านั้น และไม่สามารถกล่าวถึงบัญชีในเซิร์ฟเวอร์นี้ได้หากไม่ได้ถูกติดตามกลับ | สิ่งนี้ไม่มีผลต่ออินสแตนซ์ที่ถูกบล็อก"
+mediaSilencedInstances: "เซิร์ฟเวอร์ที่ถูกปิดปากสื่อ"
+mediaSilencedInstancesDescription: "ระบุโฮสต์ของเซิร์ฟเวอร์ที่ต้องการปิดปากสื่อ คั่นด้วยการขึ้นบรรทัดใหม่, ไฟล์ที่ถูกส่งจากบัญชีของเซิร์ฟเวอร์ดังกล่าวจะถือว่าถูกปิดปาก แล้วจะถูกติดเครื่องหมายว่ามีเนื้อหาละเอียดอ่อน และเอโมจิแบบกำหนดเองก็จะใช้ไม่ได้ด้วย | สิ่งนี้ไม่มีผลต่ออินสแตนซ์ที่ถูกบล็อก"
+federationAllowedHosts: "เซิร์ฟเวอร์ที่เปิดให้บริการแบบเฟเดอเรชั่น"
+federationAllowedHostsDescription: "ระบุชื่อโฮสต์ของเซิร์ฟเวอร์ที่คุณต้องการอนุญาตให้เชื่อมต่อแบบเฟเดอเรชั่น โดยต้องเว้นวรรคแต่ละบรรทัด"
muteAndBlock: "ปิดเสียงและบล็อก"
mutedUsers: "ผู้ใช้ที่ถูกปิดเสียง"
blockedUsers: "ผู้ใช้ที่ถูกบล็อก"
@@ -240,14 +258,14 @@ noCustomEmojis: "ไม่มีเอโมจิ"
noJobs: "ไม่มีงาน"
federating: "สหพันธ์"
blocked: "ถูกบล็อก"
-suspended: "ถูกระงับ"
+suspended: "ระงับการส่ง"
all: "ทั้งหมด"
-subscribing: "สมัครแล้ว"
+subscribing: "กำลังสมัครสมาชิก"
publishing: "กำลังเผยแพร่"
notResponding: "ไม่มีการตอบสนอง"
-instanceFollowing: "กำลังติดตามบนอินสแตนซ์"
-instanceFollowers: "ผู้ติดตามของอินสแตนซ์"
-instanceUsers: "ผู้ใช้งานของอินสแตนซ์นี้"
+instanceFollowing: "กำลังติดตามบนเซิร์ฟเวอร์"
+instanceFollowers: "ผู้ติดตามของเซิร์ฟเวอร์"
+instanceUsers: "ผู้ใช้ของเซิร์ฟเวอร์นี้"
changePassword: "เปลี่ยนรหัสผ่าน"
security: "ความปลอดภัย"
retypedNotMatch: "ทั้งสองป้อนข้อมูลไม่สอดคล้องกัน"
@@ -284,20 +302,20 @@ messageRead: "อ่านแล้ว"
noMoreHistory: "ไม่มีประวัติเพิ่มเติม"
startMessaging: "เริ่มการสนทนา"
nUsersRead: "อ่านโดย {n}"
-agreeTo: "ฉันยอมรับที่จะ {0}"
+agreeTo: "ฉันยอมรับ {0}"
agree: "ยอมรับ"
-agreeBelow: "ฉันยอมรับถึงด้านล่าง"
+agreeBelow: "ยอมรับตามที่ระบุด้านล่าง"
basicNotesBeforeCreateAccount: "หมายเหตุสำคัญ"
termsOfService: "เงื่อนไขการให้บริการ"
start: "เริ่ม"
-home: "หน้าแรก"
-remoteUserCaution: "ข้อมูลอาจไม่สมบูรณ์เนื่องจากผู้ใช้รายนี้มาจากอินสแตนซ์ระยะไกล"
+home: "หน้าหลัก"
+remoteUserCaution: "ข้อมูลอาจไม่สมบูรณ์เนื่องจากผู้ใช้รายนี้มาจากเซิร์ฟเวอร์ระยะไกล"
activity: "กิจกรรม"
images: "รูปภาพ"
image: "รูปภาพ"
birthday: "วันเกิด"
yearsOld: "{age} ปี"
-registeredDate: "วันที่สมัครสมาชิก"
+registeredDate: "วันที่ลงทะเบียน"
location: "ตำแหน่งที่ตั้ง"
theme: "ธีม"
themeForLightMode: "ธีมที่จะใช้ในโหมดสว่าง"
@@ -313,6 +331,7 @@ selectFile: "เลือกไฟล์"
selectFiles: "เลือกไฟล์"
selectFolder: "เลือกโฟลเดอร์"
selectFolders: "เลือกโฟลเดอร์"
+fileNotSelected: "ยังไม่ได้เลือกไฟล์"
renameFile: "เปลี่ยนชื่อไฟล์"
folderName: "ชื่อโฟลเดอร์"
createFolder: "สร้างโฟลเดอร์"
@@ -320,6 +339,7 @@ renameFolder: "เปลี่ยนชื่อโฟลเดอร์"
deleteFolder: "ลบโฟลเดอร์"
folder: "โฟลเดอร์"
addFile: "เพิ่มไฟล์"
+showFile: "แสดงไฟล์"
emptyDrive: "ไดรฟ์ของคุณว่างเปล่านะ"
emptyFolder: "โฟลเดอร์นี้ว่างเปล่า"
unableToDelete: "ไม่สามารถลบออกได้"
@@ -336,15 +356,15 @@ displayOfSensitiveMedia: "แสดงสื่อที่มีเนื้อ
whenServerDisconnected: "เมื่อสูญเสียการเชื่อมต่อกับเซิร์ฟเวอร์"
disconnectedFromServer: "การเชื่อมต่อเซิร์ฟเวอร์ถูกตัด"
reload: "รีโหลด"
-doNothing: "เมิน"
+doNothing: "ช่างมัน"
reloadConfirm: "รีโหลดเลยไหม?"
-watch: "ดู"
-unwatch: "หยุดดู"
+watch: "เพ่งเล็ง"
+unwatch: "เลิกเพ่งเล็ง"
accept: "ยอมรับ"
reject: "ปฏิเสธ"
normal: "ปกติ"
-instanceName: "ชื่ออินสแตนซ์"
-instanceDescription: "คำอธิบายอินสแตนซ์"
+instanceName: "ชื่อเซิร์ฟเวอร์"
+instanceDescription: "คำอธิบายแนะนำเซิร์ฟเวอร์"
maintainerName: "ผู้ดูแล"
maintainerEmail: "อีเมลผู้ดูแลระบบ"
tosUrl: "URL เงื่อนไขการให้บริการ"
@@ -355,16 +375,16 @@ dayX: "{day}"
monthX: "เดือน {month}"
yearX: "{year}"
pages: "หน้าเพจ"
-integration: "รวบรวม"
+integration: "เชื่อมโยง"
connectService: "เชื่อมต่อ"
disconnectService: "ตัดการเชื่อมต่อ"
-enableLocalTimeline: "เปิดใช้งานไทม์ไลน์ในพื้นที่"
+enableLocalTimeline: "เปิดใช้งานไทม์ไลน์ท้องถิ่น"
enableGlobalTimeline: "เปิดใช้งานไทม์ไลน์ทั่วโลก"
disablingTimelinesInfo: "ผู้ดูแลระบบและผู้ควบคุมจะสามารถเข้าถึงไทม์ไลน์ทั้งหมด ถึงแม้ว่าจะไม่ได้เปิดใช้งานก็ตาม"
registration: "ลงทะเบียน"
enableRegistration: "เปิดใช้งานการลงทะเบียนผู้ใช้ใหม่"
invite: "คำเชิญ"
-driveCapacityPerLocalAccount: "ความจุของไดรฟ์ต่อผู้ใช้ภายในเครื่อง"
+driveCapacityPerLocalAccount: "ความจุของไดรฟ์ต่อผู้ใช้ท้องถิ่น"
driveCapacityPerRemoteAccount: "ความจุของไดรฟ์ต่อผู้ใช้ระยะไกล"
inMb: "เป็นเมกะไบต์"
bannerUrl: "URL รูปภาพแบนเนอร์"
@@ -373,7 +393,7 @@ basicInfo: "ข้อมูลเบื้องต้น"
pinnedUsers: "ผู้ใช้ที่ถูกปักหมุด"
pinnedUsersDescription: "ป้อนชื่อผู้ใช้ที่คุณต้องการปักหมุดในหน้า “ค้นพบ” ฯลฯ คั่นด้วยการขึ้นบรรทัดใหม่"
pinnedPages: "หน้าเพจที่ปักหมุด"
-pinnedPagesDescription: "ป้อนเส้นทางของหน้าเพจที่คุณต้องการปักหมุดไว้ที่หน้าแรกของอินสแตนซ์นี้ คั่นด้วยขึ้นบรรทัดใหม่"
+pinnedPagesDescription: "ป้อนเส้นทางของหน้าเพจที่คุณต้องการปักหมุดไว้ที่หน้าแรกของเซิร์ฟเวอร์นี้ คั่นด้วยการขึ้นบรรทัดใหม่"
pinnedClipId: "ID ของคลิปที่จะปักหมุด"
pinnedNotes: "โน้ตที่ปักหมุดไว้"
hcaptcha: "hCaptcha"
@@ -389,11 +409,11 @@ recaptcha: "reCAPTCHA"
enableRecaptcha: "เปิดใช้ reCAPTCHA"
recaptchaSiteKey: "คีย์ไซต์"
recaptchaSecretKey: "คีย์ลับ"
-turnstile: "เทิร์น'สไทล"
-enableTurnstile: "เปิดใช้งาน เทิร์น'สไทล"
+turnstile: "Turnstile"
+enableTurnstile: "เปิดใช้งาน Turnstile"
turnstileSiteKey: "คีย์ไซต์"
turnstileSecretKey: "คีย์ลับ"
-avoidMultiCaptchaConfirm: "การใช้ระบบ Captcha หลายระบบอาจทำให้เกิดการรบกวนหรืออาจจะเกิดข้อผิดพลาดได้ หากต้องการที่จะปิดการใช้งานระบบ Captcha อื่น ๆ แนะนำให้ปิดตัวอื่นๆก่อน ถ้าหากคุณต้องการให้เปิดใช้งานต่อไป ให้ กด ยกเลิก"
+avoidMultiCaptchaConfirm: "การใช้ Captcha หลายตัวอาจทำให้เกิดการรบกวนหรือข้อผิดพลาดได้ ต้องการที่จะปิดการใช้งาน Captcha ตัวอื่นเลยไหม? หากต้องการให้เปิดใช้งานต่อไป ให้กดยกเลิก"
antennas: "เสาอากาศ"
manageAntennas: "จัดการเสาอากาศ"
name: "ชื่อ"
@@ -401,7 +421,7 @@ antennaSource: "แหล่งเสาอากาศ"
antennaKeywords: "คีย์เวิร์ดที่ควรฟัง"
antennaExcludeKeywords: "คีย์เวิร์ดที่จะยกเว้น"
antennaExcludeBots: "ยกเว้นบัญชีบอต"
-antennaKeywordsDescription: "คั่นด้วยช่องว่างสำหรับเงื่อนไข AND หรือด้วยการขึ้นบรรทัดใหม่สำหรับเงื่อนไข OR"
+antennaKeywordsDescription: "คั่นด้วยเว้นวรรคสำหรับเงื่อนไข AND, หรือขึ้นบรรทัดใหม่สำหรับเงื่อนไข OR"
notifyAntenna: "แจ้งเตือนเกี่ยวกับโน้ตใหม่"
withFileAntenna: "เฉพาะโน้ตที่มีไฟล์"
enableServiceworker: "เปิดใช้งานการแจ้งเตือนแบบพุชไปยังเบราว์เซอร์ของคุณ"
@@ -418,7 +438,7 @@ unsilenceConfirm: "ต้องการเลิกปิดปากผู้
popularUsers: "ผู้ใช้ที่เป็นที่นิยม"
recentlyUpdatedUsers: "ผู้ใช้ที่เพิ่งใช้งานล่าสุด"
recentlyRegisteredUsers: "ผู้ใช้ที่เข้าร่วมใหม่"
-recentlyDiscoveredUsers: "ผู้ใช้ที่เพิ่งค้นพบใหม่"
+recentlyDiscoveredUsers: "ผู้ใช้ที่เพิ่งค้นพบล่าสุด"
exploreUsersCount: "มีผู้ใช้ {count} ราย"
exploreFediverse: "สำรวจสหพันธ์"
popularTags: "แท็กยอดนิยม"
@@ -434,8 +454,9 @@ totpDescription: "ใช้แอปยืนยันตัวตนเพื
moderator: "ผู้ควบคุม"
moderation: "การกลั่นกรอง"
moderationNote: "โน้ตการกลั่นกรอง"
+moderationNoteDescription: "คุณสามารถใส่โน้ตส่วนตัวที่เฉพาะผู้ดูแลระบบเท่านั้นที่สามารถเข้าถึงได้"
addModerationNote: "เพิ่มโน้ตการกลั่นกรอง"
-moderationLogs: "ปูมการแก้ไข"
+moderationLogs: "ปูมการควบคุมดูแล"
nUsersMentioned: "กล่าวถึงโดยผู้ใช้ {n} ราย"
securityKeyAndPasskey: "ความปลอดภัยและรหัสผ่าน"
securityKey: "กุญแจความปลอดภัย"
@@ -468,44 +489,49 @@ retype: "พิมพ์รหัสอีกครั้ง"
noteOf: "โน้ตของ {user}"
quoteAttached: "อ้างอิง"
quoteQuestion: "ต้องการที่จะแนบมันเพื่ออ้างอิงใช่ไหม?"
+attachAsFileQuestion: "ข้อความในคลิปบอร์ดยาวเกินไป คุณต้องการแนบเป็นไฟล์ข้อความหรือไม่?"
noMessagesYet: "ยังไม่มีข้อความ"
newMessageExists: "คุณมีข้อความใหม่"
onlyOneFileCanBeAttached: "สามารถแนบไฟล์ได้เพียงไฟล์เดียวต่อ 1 ข้อความ"
-signinRequired: "กรุณาลงทะเบียนหรือลงชื่อเข้าใช้ก่อนดำเนินการต่อ"
+signinRequired: "ก่อนดำเนินการต่อ กรุณาลงทะเบียนหรือเข้าสู่ระบบ"
+signinOrContinueOnRemote: "เพื่อดำเนินการต่อได้ คุณต้องไปที่เซิร์ฟเวอร์ที่คุณใช้งานอยู่ หรือลงทะเบียน/เข้าสู่ระบบเซิร์ฟเวอร์นี้"
invitations: "คำเชิญ"
invitationCode: "รหัสเชิญ"
checking: "Checking"
available: "พร้อมใช้งาน"
unavailable: "ไม่พร้อมใช้"
-usernameInvalidFormat: "คุณสามารถใช้อักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ตัวเลข และขีดล่างได้นะ ( a-z , A-Z , 0-9 , รวมไปถึงอักษรพิเศษเช่น + * / , . - อื่นๆเป็นต้น )"
+usernameInvalidFormat: "สามารถใช้ a~z A~Z 0~9 และ _ ได้"
tooShort: "สั้นเกินไปนะ"
tooLong: "ยาวเกินไปนะ"
-weakPassword: "รหัสผ่าน แย่มาก"
+weakPassword: "รหัสผ่านแย่มาก"
normalPassword: "รหัสผ่านปกติ"
strongPassword: "รหัสผ่านรัดกุมมาก"
passwordMatched: "ถูกต้อง!"
passwordNotMatched: "ไม่ถูกต้อง"
-signinWith: "ลงชื่อเข้าใช้ด้วย {x}"
-signinFailed: "ไม่สามารถลงชื่อผู้เข้าใช้ได้ เนื่องจาก ชื่อผู้ใช้หรือรหัสผ่านที่คุณป้อนนั้นไม่ถูกต้องนะ"
+signinWith: "เข้าสู่ระบบด้วย {x}"
+signinFailed: "ไม่สามารถเข้าสู่ระบบได้ กรุณาตรวจสอบชื่อผู้ใช้และรหัสผ่าน"
or: "หรือ"
language: "ภาษา"
uiLanguage: "ภาษาอินเทอร์เฟซผู้ใช้งาน"
aboutX: "เกี่ยวกับ {x}"
-emojiStyle: "สไตล์เอโมจิ"
+emojiStyle: "สไตล์ของเอโมจิ"
native: "ภาษาแม่"
-disableDrawer: "อย่าใช้ลิ้นชักสไตล์เมนู"
-showNoteActionsOnlyHover: "แสดงการดำเนินการเฉพาะโน้ตเมื่อโฮเวอร์"
+menuStyle: "สไตล์เมนู"
+style: "สไตล์"
+drawer: "ตัววาด"
+popup: "ป๊อปอัพ"
+showNoteActionsOnlyHover: "แสดงการดำเนินการโน้ตเมื่อโฮเวอร์(วางเมาส์เหนือ)เท่านั้น"
showReactionsCount: "แสดงจำนวนรีแอกชั่นในโน้ต"
noHistory: "ไม่มีประวัติ"
signinHistory: "ประวัติการเข้าสู่ระบบ"
enableAdvancedMfm: "เปิดใช้งาน MFM ขั้นสูง"
-enableAnimatedMfm: "เปิดการใช้งาน MFM ด้วยแอนิเมชั่น"
+enableAnimatedMfm: "เปิดการใช้งาน MFM แบบเคลื่อนไหว"
doing: "กำลังประมวลผล......"
category: "หมวดหมู่"
tags: "นามแฝง"
docSource: "ที่มาของเอกสารนี้"
createAccount: "สร้างบัญชี"
-existingAccount: "บัญชีที่มีอยู่"
+existingAccount: "บัญชีที่มีอยู่แล้ว"
regenerate: "สร้างอีกครั้ง"
fontSize: "ขนาดตัวอักษร"
mediaListWithOneImageAppearance: "ความสูงของรายการสื่อที่มีเพียงรูปเดียว"
@@ -513,11 +539,11 @@ limitTo: "จำกัดไว้ที่ {x}"
noFollowRequests: "คุณไม่มีคำขอติดตามที่รอดำเนินการ"
openImageInNewTab: "เปิดรูปภาพในแท็บใหม่"
dashboard: "หน้ากระดานหลัก"
-local: "ในพื้นที่"
+local: "ท้องถิ่น"
remote: "ระยะไกล"
total: "รวมทั้งหมด"
-weekOverWeekChanges: "เปลี่ยนแปลงไปเมื่อสัปดาห์ที่แล้ว"
-dayOverDayChanges: "เปลี่ยนแปลงไปเมื่อวานนี้"
+weekOverWeekChanges: "เทียบกับสัปดาห์ก่อน"
+dayOverDayChanges: "เทียบกับเมื่อวาน"
appearance: "ภาพลักษณ์"
clientSettings: "การตั้งค่าไคลเอนต์"
accountSettings: "ตั้งค่าบัญชี"
@@ -531,19 +557,19 @@ useObjectStorage: "ใช้การจัดเก็บในรูปแบ
objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "URL ที่ใช้เป็นข้อมูลอ้างอิง ระบุ URL ของ CDN หรือ Proxy ถ้าหากคุณใช้อย่างใดอย่างหนึ่ง\n สำหรับการใช้งาน S3 'https://.s3.amazonaws.com' และสำหรับ GCS หรือบริการที่เทียบเท่าใช้ 'https://storage.googleapis.com/', เป็นต้น"
objectStorageBucket: "Bucket"
-objectStorageBucketDesc: "โปรดระบุชื่อที่เก็บข้อมูลที่ใช้กับผู้ให้บริการของคุณ"
+objectStorageBucketDesc: "โปรดระบุชื่อบัคเก็ตของบริการที่ใช้อยู่"
objectStoragePrefix: "คำนำหน้า"
objectStoragePrefixDesc: "ไฟล์ทั้งหมดจะถูกเก็บไว้ภายใต้ไดเร็กทอรีที่มีคำนำหน้านี้"
objectStorageEndpoint: "ปลายทาง"
objectStorageEndpointDesc: "เว้นว่างไว้หากคุณใช้ AWS S3 หรือระบุปลายทางเป็น '' หรือ ':' ทั้งนี้ขึ้นอยู่กับผู้ให้บริการที่คุณใช้อยู่ด้วย"
objectStorageRegion: "ภูมิภาค"
-objectStorageRegionDesc: "ระบุภูมิภาค เช่น 'xx-east-1' ถ้าหากบริการของคุณไม่ได้แยกความแตกต่างระหว่างภูมิภาคก็ให้ เว้นว่างไว้หรือป้อน 'us-east-1'"
+objectStorageRegionDesc: "ระบุภูมิภาค เช่น ‘xx-east-1’ หากบริการของคุณไม่แยกภูมิภาค ให้ระบุเป็น ‘us-east-1’ หรือเว้นวางไว้หากใช้ AWS configuration files / environment variables"
objectStorageUseSSL: "ใช้ SSL"
objectStorageUseSSLDesc: "ปิดการทำงานนี้ไว้ ถ้าหากคุณจะไม่ใช้ HTTPS สำหรับการเชื่อมต่อ API"
objectStorageUseProxy: "เชื่อมต่อผ่านพร็อกซี"
objectStorageUseProxyDesc: "ปิดสิ่งนี้ไว้ถ้าหากคุณจะไม่ใช้ Proxy สำหรับการเชื่อมต่อ API"
objectStorageSetPublicRead: "ตั้งค่าเป็น “public-read” เมื่ออัปโหลด"
-s3ForcePathStyleDesc: "ถ้าหากเปิดใช้งาน s3ForcePathStyle ชื่อบัคเก็ตนั้นอาจจะต้องรวมอยู่ในเส้นทางของ URL ซึ่งตรงข้ามกับชื่อโฮสต์ของ URL คุณอาจจะต้องเปิดใช้งานการตั้งค่านี้เมื่อใช้บริการต่างๆ เช่น อินสแตนซ์ Minio ที่โฮสต์เองนะ"
+s3ForcePathStyleDesc: "เมื่อเปิดใช้งาน s3ForcePathStyle จะบังคับให้ ระบุชื่อบัคเก็ตเป็นส่วนหนึ่งของพาธ แทนที่จะเป็นชื่อโฮสต์ใน URL, อาจจำเป็นต้องเปิดใช้งานตัวเลือกนี้เมื่อใช้กับ Minio ที่โฮสต์เองหรือบริการที่คล้ายกัน"
serverLogs: "ปูมของเซิร์ฟเวอร์"
deleteAll: "ลบทั้งหมด"
showFixedPostForm: "แสดงแบบฟอร์มการโพสต์ที่ด้านบนสุดของไทม์ไลน์"
@@ -575,7 +601,9 @@ sort: "เรียงลำดับ"
ascendingOrder: "เรียงลำดับขึ้น"
descendingOrder: "เรียงลำดับลง"
scratchpad: "Scratchpad"
-scratchpadDescription: "Scratchpad เป็นการจัดเตรียมสภาพแวดล้อมสำหรับการทดลอง AiScript แต่คุณสามารถเขียน ดำเนินการ และตรวจสอบผลลัพธ์ของการโต้ตอบกับ Misskey มันได้ด้วยนะ"
+scratchpadDescription: "Scratchpad ให้สภาพแวดล้อมสำหรับการทดลอง AiScript คุณสามารถเขียนโค้ด/สั่งดำเนินการ/ตรวจสอบผลลัพธ์ ของการโต้ตอบกับ Misskey ได้"
+uiInspector: "ตัวตรวจสอบ UI"
+uiInspectorDescription: "คุณสามารถตรวจสอบรายชื่อเซิร์ฟเวอร์ที่เกี่ยวข้องกับส่วนประกอบอินเตอร์เฟซผู้ใช้ (UI) บนหน่วยความจำของระบบ ส่วนประกอบ UI เหล่านี้จะถูกสร้างขึ้นโดยฟังก์ชัน Ui:C:"
output: "เอาท์พุต"
script: "สคริปต์"
disablePagesScript: "ปิดการใช้งาน AiScript บนเพจ"
@@ -587,15 +615,15 @@ unsetUserBannerConfirm: "ต้องการเลิกตั้งแบน
deleteAllFiles: "ลบไฟล์ทั้งหมด"
deleteAllFilesConfirm: "ต้องการลบไฟล์ทั้งหมดใช่ไหม?"
removeAllFollowing: "เลิกติดตามผู้ใช้ที่ติดตามทั้งหมด"
-removeAllFollowingDescription: "เลิกติดตามทั้งหมดจาก {host} โปรดเรียกใช้สิ่งนี้เมื่ออินสแตนซ์ดังกล่าวได้สูญหายตายจากไปแล้ว"
+removeAllFollowingDescription: "จะเลิกติดตามทั้งหมดจาก {host} โปรดดำเนินการสิ่งนี้เมื่อเซิร์ฟเวอร์ดังกล่าวได้สูญหายตายจากไปแล้ว"
userSuspended: "ผู้ใช้รายนี้ถูกระงับการใช้งาน"
userSilenced: "ผู้ใช้รายนี้ถูกปิดปากอยู่"
yourAccountSuspendedTitle: "บัญชีนี้นั้นถูกระงับ"
yourAccountSuspendedDescription: "บัญชีนี้ถูกระงับ เนื่องจากละเมิดข้อกำหนดในการให้บริการของเซิร์ฟเวอร์หรืออาจจะละเมิดหลักเกณฑ์ชุมชน หรือ อาจจะโดนร้องเรียนเรื่องการละเมิดลิขสิทธิ์และอื่นๆอย่างต่อเนื่องซ้ำๆ หากคุณคิดว่าไม่ได้ทำผิดจริงๆหรือตัดสินผิดพลาด ได้โปรดกรุณาติดต่อผู้ดูแลระบบหากคุณต้องการทราบเหตุผลโดยละเอียดเพิ่มเติม และขอความกรุณาอย่าสร้างบัญชีใหม่"
tokenRevoked: "โทเค็นไม่ถูกต้อง"
-tokenRevokedDescription: "โทเค็นนี้หมดอายุแล้วนะค่ะกรุณาเข้าสู่ระบบอีกครั้งนะ"
+tokenRevokedDescription: "โทเค็นการเข้าสู่ระบบหมดอายุ กรุณาเข้าสู่ระบบใหม่อีกครั้ง"
accountDeleted: "ลบบัญชีแล้ว"
-accountDeletedDescription: "บัญชีนี้ถูกลบไปแล้วนะ"
+accountDeletedDescription: "บัญชีนี้ถูกลบแล้ว"
menu: "เมนู"
divider: "ตัวแบ่ง"
addItem: "เพิ่มรายการ"
@@ -615,14 +643,14 @@ enablePlayer: "เปิดเครื่องเล่นวิดีโอ"
disablePlayer: "ปิดเครื่องเล่นวิดีโอ"
expandTweet: "ขยายทวีต"
themeEditor: "ตัวแก้ไขธีม"
-description: "รายละเอียด"
+description: "คำอธิบาย"
describeFile: "เพิ่มแคปชั่น"
enterFileDescription: "ใส่แคปชั่น"
author: "ผู้เขียน"
leaveConfirm: "มีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก ต้องการละทิ้งมันใช่ไหม?"
manage: "การจัดการ"
plugins: "ปลั๊กอิน"
-preferencesBackups: "ตั้งค่าการสำรองข้อมูล"
+preferencesBackups: "สำรองการตั้งค่า"
deck: "เด็ค"
undeck: "ออกจากเด็ค"
useBlurEffectForModal: "ใช้เอฟเฟกต์เบลอสำหรับโมดอล"
@@ -632,21 +660,21 @@ height: "ความสูง"
large: "ใหญ่"
medium: "ปานกลาง"
small: "เล็ก"
-generateAccessToken: "สร้างการเข้าถึงโทเค็น"
-permission: "การอนุญาต"
+generateAccessToken: "สร้างโทเค็นการเข้าถึง"
+permission: "สิทธิ์"
adminPermission: "สิทธิ์ของผู้ดูแลระบบ"
enableAll: "เปิดใช้งานทั้งหมด"
disableAll: "ปิดการใช้งานทั้งหมด"
tokenRequested: "ให้สิทธิ์การเข้าถึงบัญชี"
-pluginTokenRequestedDescription: "ปลั๊กอินนี้จะสามารถใช้การอนุญาตที่ตั้งค่าไว้ที่นี่นะ"
+pluginTokenRequestedDescription: "ปลั๊กอินนี้จะใช้สิทธิ์ตามที่ตั้งค่าไว้ที่นี่"
notificationType: "ประเภทการแจ้งเตือน"
edit: "แก้ไข"
-emailServer: "อีเมลเซิร์ฟเวอร์"
+emailServer: "เซิร์ฟเวอร์ของอีเมล"
enableEmail: "เปิดใช้งานการกระจายอีเมล"
-emailConfigInfo: "ใช้เพื่อยืนยันอีเมลของคุณระหว่างการสมัครหรือถ้าหากคุณลืมรหัสผ่าน"
+emailConfigInfo: "ใช้สำหรับการยืนยันอีเมลหรือการรีเซ็ตรหัสผ่าน"
email: "อีเมล"
emailAddress: "ที่อยู่อีเมล"
-smtpConfig: "กำหนดค่าเซิร์ฟเวอร์ SMTP"
+smtpConfig: "ตั้งค่าเซิร์ฟเวอร์ SMTP"
smtpHost: "โฮสต์"
smtpPort: "พอร์ต"
smtpUser: "ชื่อผู้ใช้"
@@ -656,10 +684,10 @@ smtpSecure: "ใช้โดยนัย SSL/TLS สำหรับการเ
smtpSecureInfo: "ปิดสิ่งนี้เมื่อใช้ STARTTLS"
testEmail: "ทดสอบการส่งอีเมล"
wordMute: "ปิดเสียงคำ"
-hardWordMute: "ปิดเสียงคำยาก"
-regexpError: "ข้อผิดพลาดของนิพจน์ทั่วไป"
-regexpErrorDescription: "เกิดข้อผิดพลาดในนิพจน์ทั่วไปในบรรทัดที่ {line} ของการปิดเสียงคำ {tab} ของคุณ:"
-instanceMute: "ปิดเสียง อินสแตนซ์"
+hardWordMute: "ปิดเสียงคำแบบแข็งโป๊ก"
+regexpError: "เกิดข้อผิดพลาดใน regular expression"
+regexpErrorDescription: "เกิดข้อผิดพลาดใน regular expression บรรทัดที่ {line} ของการปิดเสียงคำ {tab} :"
+instanceMute: "ปิดเสียงเซิร์ฟเวอร์"
userSaysSomething: "{name} พูดอะไรบางอย่าง"
makeActive: "เปิดใช้งาน"
display: "แสดงผล"
@@ -690,17 +718,14 @@ reportAbuseOf: "รายงาน {name}"
fillAbuseReportDescription: "กรุณากรอกรายละเอียดเกี่ยวกับรายงานนี้ หากเป็นเรื่องเกี่ยวกับโน้ตโดยเฉพาะ ได้โปรดระบุ URL"
abuseReported: "เราได้ส่งรายงานของคุณไปแล้ว ขอบคุณมากๆนะ"
reporter: "ผู้รายงาน"
-reporteeOrigin: "รายงานต้นทาง"
+reporteeOrigin: "ปลายทางรายงาน"
reporterOrigin: "แหล่งผู้รายงาน"
-forwardReport: "ส่งต่อรายงานไปยังอินสแตนซ์ระยะไกล"
-forwardReportIsAnonymous: "ข้อมูลของคุณจะไม่ปรากฏบนอินสแตนซ์ระยะไกลและปรากฏเป็นบัญชีระบบที่ไม่ระบุชื่อ"
send: "ส่ง"
-abuseMarkAsResolved: "ทำเครื่องหมายรายงานว่าแก้ไขแล้ว"
openInNewTab: "เปิดในแท็บใหม่"
openInSideView: "เปิดในมุมมองด้านข้าง"
defaultNavigationBehaviour: "พฤติกรรมการนำทางที่เป็นค่าเริ่มต้น"
editTheseSettingsMayBreakAccount: "การแก้ไขการตั้งค่าเหล่านี้อาจทำให้บัญชีของคุณเสียหายนะ"
-instanceTicker: "ข้อมูลอินสแตนซ์ของโน้ต"
+instanceTicker: "ข้อมูลเซิร์ฟเวอร์ของโน้ต"
waitingFor: "กำลังรอ {x}"
random: "สุ่มค่า"
system: "ระบบ"
@@ -739,7 +764,7 @@ alwaysMarkSensitive: "ทำเครื่องหมายว่ามีเ
loadRawImages: "โหลดภาพต้นฉบับแทนการแสดงภาพขนาดย่อ"
disableShowingAnimatedImages: "ไม่ต้องเล่นภาพเคลื่อนไหว"
highlightSensitiveMedia: "ไฮไลท์สื่อที่มีเนื้อหาละเอียดอ่อน"
-verificationEmailSent: "ส่งอีเมลยืนยันแล้วนะ ได้โปรดกรุณาไปที่ลิงก์ที่รวมไว้เพื่อทำการตรวจสอบให้เสร็จสิ้น"
+verificationEmailSent: "ได้ส่งอีเมลยืนยันแล้ว กรุณาเข้าลิงก์ที่ระบุในอีเมลเพื่อทำการตั้งค่าให้เสร็จสิ้น"
notSet: "ไม่ได้ตั้งค่า"
emailVerified: "อีเมลได้รับการยืนยันแล้ว"
noteFavoritesCount: "จำนวนโน้ตที่ชื่นชอบ"
@@ -750,7 +775,7 @@ useSystemFont: "ใช้ฟอนต์เริ่มต้นของระ
clips: "คลิป"
experimentalFeatures: "ฟังก์ชั่นทดสอบ"
experimental: "ทดลอง"
-thisIsExperimentalFeature: "นี่คือฟีเจอร์ทดลองนะค่ะ ฟังก์ชันการทำงานบางอย่างอาจเปลี่ยนแปลงได้ และอาจไม่ทำงานหรือไม่เสถียรตามที่ตั้งใจไว้นะ"
+thisIsExperimentalFeature: "นี่เป็นฟีเจอร์ทดลอง ซึ่งอาจมีการเปลี่ยนแปลงการทำงาน และอาจไม่ทำงานตามที่ตั้งใจไว้"
developer: "สำหรับนักพัฒนา"
makeExplorable: "ทำให้บัญชีมองเห็นใน “สำรวจ”"
makeExplorableDescription: "ถ้าหากคุณปิดการทำงานนี้ บัญชีของคุณนั้นจะไม่แสดงในส่วน “สำรวจ”"
@@ -761,14 +786,14 @@ center: "กึ่งกลาง"
wide: "กว้าง"
narrow: "ชิด"
reloadToApplySetting: "การตั้งค่านี้จะมีผลหลังจากโหลดหน้าซ้ำเท่านั้น ต้องการที่จะโหลดใหม่เลยไหม?"
-needReloadToApply: "จำเป็นต้องโหลดซ้ำถึงจะมีผลนะ"
+needReloadToApply: "ต้องรีโหลดเพื่อให้การเปลี่ยนแปลงมีผล"
showTitlebar: "แสดงแถบชื่อ"
clearCache: "ล้างแคช"
-onlineUsersCount: "{n} ผู้ใช้คนนี้กำลังออนไลน์"
+onlineUsersCount: "{n} รายกำลังออนไลน์"
nUsers: "{n} ผู้ใช้งาน"
nNotes: "{n} โน้ต"
-sendErrorReports: "ส่งรายงานว่าข้อผิดพลาด"
-sendErrorReportsDescription: "เมื่อเปิดใช้งาน ข้อมูลข้อผิดพลาดโดยรายละเอียดนั้นจะถูกแชร์ให้กับ Misskey เมื่อเกิดปัญหา ซึ่งช่วยปรับปรุงคุณภาพของ Misskey\nซึ่งจะรวมถึงข้อมูล เช่น เวอร์ชั่นของระบบปฏิบัติการ เบราว์เซอร์ที่คุณใช้ กิจกรรมของคุณใน Misskey เป็นต้น"
+sendErrorReports: "ส่งรายงานข้อผิดพลาด"
+sendErrorReportsDescription: "เมื่อเปิดใช้งาน การแจ้งข้อผิดพลาดจะถูกแชร์กับ Misskey เมื่อเกิดปัญหา ซึ่งช่วยในการปรับปรุงคุณภาพของซอฟต์แวร์ ข้อมูลข้อผิดพลาดอาจรวมถึงเวอร์ชันของระบบปฏิบัติการ ประเภทของเบราว์เซอร์ และประวัติการใช้งาน ฯลฯ"
myTheme: "ธีมของฉัน"
backgroundColor: "สีพื้นหลัง"
accentColor: "สีหลัก"
@@ -780,7 +805,7 @@ value: "ค่า"
createdAt: "สร้างเมื่อ"
updatedAt: "อัปเดตล่าสุด"
saveConfirm: "บันทึกเปลี่ยนแปลงมั้ย?"
-deleteConfirm: "ลบจริงๆเหรอ?"
+deleteConfirm: "ต้องการลบใช่ไหม?"
invalidValue: "ค่านี้ไม่ถูกต้อง"
registry: "ทะเบียน"
closeAccount: "ปิด บัญชี"
@@ -793,7 +818,7 @@ capacity: "ความจุ"
inUse: "ใช้แล้ว"
editCode: "แก้ไขโค้ด"
apply: "นำไปใช้"
-receiveAnnouncementFromInstance: "รับการแจ้งเตือนจากอินสแตนซ์นี้"
+receiveAnnouncementFromInstance: "รับการแจ้งเตือนจากเซิร์ฟเวอร์นี้"
emailNotification: "การแจ้งเตือนทางอีเมล"
publish: "เผยแพร่"
inChannelSearch: "ค้นหาในช่อง"
@@ -821,7 +846,7 @@ active: "ใช้งานอยู่"
offline: "ออฟไลน์"
notRecommended: "ไม่แนะนำ"
botProtection: "การป้องกัน Bot"
-instanceBlocking: "อินสแตนซ์ที่ถูกบล็อก"
+instanceBlocking: "เซิร์ฟเวอร์ที่ถูกบล็อก/ปิดปาก"
selectAccount: "เลือกบัญชี"
switchAccount: "สลับบัญชีผู้ใช้"
enabled: "เปิดใช้งาน"
@@ -831,9 +856,10 @@ user: "ผู้ใช้"
administration: "การจัดการ"
accounts: "บัญชีผู้ใช้"
switch: "สลับ"
-noMaintainerInformationWarning: "ข้อมูลผู้ดูแลไม่ได้รับการกำหนดค่านะ"
-noBotProtectionWarning: "ไม่ได้กำหนดค่าการป้องกันบอทนะ"
-configure: "กำหนดค่า"
+noMaintainerInformationWarning: "ยังไม่ได้ตั้งค่าข้อมูลของผู้ดูแลระบบ"
+noInquiryUrlWarning: "ยังไม่ได้ตั้งค่า URL สำหรับการติดต่อสอบถาม"
+noBotProtectionWarning: "ยังไม่ได้ตั้งค่าการป้องกันบอต"
+configure: "ตั้งค่า"
postToGallery: "สร้างโพสต์แกลเลอรี่ใหม่"
postToHashtag: "โพสต์ไปที่แฮชแท็กนี้"
gallery: "แกลเลอรี่"
@@ -870,7 +896,7 @@ accountDeletionInProgress: "กำลังดำเนินการลบบ
usernameInfo: "ชื่อที่ระบุบัญชีของคุณจากผู้อื่นในเซิร์ฟเวอร์นี้ คุณสามารถใช้ตัวอักษร (a~z, A~Z), ตัวเลข (0~9) หรือขีดล่าง (_) ชื่อผู้ใช้ไม่สามารถเปลี่ยนแปลงได้ในภายหลัง"
aiChanMode: "โหมด Ai "
devMode: "โหมดนักพัฒนา"
-keepCw: "เก็บคำเตือนเนื้อหา"
+keepCw: "คงการเตือนเนื้อหาไว้"
pubSub: "บัญชี Pub/Sub"
lastCommunication: "การสื่อสารครั้งสุดท้ายล่าสุด"
resolved: "คลี่คลายแล้ว"
@@ -896,6 +922,7 @@ followersVisibility: "การมองเห็นผู้ที่กำล
continueThread: "ดูความต่อเนื่องเธรด"
deleteAccountConfirm: "การดำเนินการนี้จะลบบัญชีของคุณอย่างถาวรเลยนะ แน่ใจหรอดำเนินการ?"
incorrectPassword: "รหัสผ่านไม่ถูกต้อง"
+incorrectTotp: "รหัสยืนยันตัวตนแบบใช้ครั้งเดียวที่ท่านได้ระบุมานั้น ไม่ถูกต้องหรือหมดอายุลงแล้วค่ะ"
voteConfirm: "ต้องการโหวต “{choice}” ใช่ไหม?"
hide: "ซ่อน"
useDrawerReactionPickerForMobile: "แสดง ตัวจิ้มรีแอคชั่น เป็นแบบลิ้นชัก เมื่อใช้บนมือถือ"
@@ -909,8 +936,8 @@ themeColor: "สีธีม"
size: "ขนาด"
numberOfColumn: "จำนวนคอลัมน์"
searchByGoogle: "ค้นหา"
-instanceDefaultLightTheme: "ธีมสว่างตามค่าเริ่มต้นของอินสแตนซ์"
-instanceDefaultDarkTheme: "ธีมมืดตามค่าเริ่มต้นของอินสแตนซ์"
+instanceDefaultLightTheme: "ธีมสว่างตามค่าเริ่มต้นของเซิร์ฟเวอร์"
+instanceDefaultDarkTheme: "ธีมมืดตามค่าเริ่มต้นของเซิร์ฟเวอร์"
instanceDefaultThemeDescription: "ป้อนรหัสธีมในรูปแบบออบเจ็กต์"
mutePeriod: "ระยะเวลาปิดเสียง"
period: "ระยะเวลา"
@@ -930,7 +957,7 @@ cropNo: "ใช้ตามที่เป็นอยู่"
file: "ไฟล์"
recentNHours: "ล่าสุด {n} ชั่วโมงที่แล้ว"
recentNDays: "ล่าสุด {n} วันที่แล้ว"
-noEmailServerWarning: "ไม่ได้กำหนดค่าเซิร์ฟเวอร์อีเมลนี้"
+noEmailServerWarning: "ยังไม่ได้ตั้งค่าเซิร์ฟเวอร์ของอีเมล"
thereIsUnresolvedAbuseReportWarning: "มีรายงานที่ยังไม่ได้แก้ไข"
recommended: "แนะนำ"
check: "ตรวจสอบ"
@@ -965,7 +992,7 @@ cannotUploadBecauseExceedsFileSizeLimit: "ไม่สามารถอัป
beta: "เบต้า"
enableAutoSensitive: "ทำเครื่องหมายว่ามีเนื้อหาที่ละเอียดอ่อนโดยอัตโนมัติ"
enableAutoSensitiveDescription: "อนุญาตให้ตรวจหาและทำเครื่องหมายสื่อว่ามีเนื้อหาโดยละเอียดอ่อนโดยอัตโนมัติ ผ่าน Machine Learning หากเป็นไปได้ แม้ว่าคุณจะปิดคุณสมบัตินี้ ก็อาจถูกตั้งค่าโดยอัตโนมัติ ทั้งนี้ขึ้นอยู่กับเซิร์ฟเวอร์"
-activeEmailValidationDescription: "เปิดใช้งานการตรวจสอบที่อยู่อีเมลให้มีความเข้มงวดยิ่งขึ้น ซึ่งอาจจะรวมไปถึงการตรวจสอบที่อยู่อีเมล์ที่ใช้แล้วทิ้งและโดยให้พิจารณาว่าสามารถสื่อสารด้วยได้หรือไม่ เมื่อไม่เลือกระบบจะตรวจสอบเฉพาะรูปแบบของอีเมลเท่านั้น"
+activeEmailValidationDescription: "การตรวจสอบอีเมลของผู้ใช้จะเข้มงวดมากขึ้น โดยพิจารณาว่าเป็นอีเมลชั่วคราวหรือไม่ และสามารถติดต่อได้จริงหรือไม่ หากปิดการตรวจสอบนี้ จะตรวจสอบเพียงว่ารูปแบบอีเมลที่ถูกต้องหรือไม่เท่านั้น"
navbar: "แถบนำทาง"
shuffle: "สลับ"
account: "บัญชีผู้ใช้"
@@ -974,7 +1001,7 @@ pushNotification: "การแจ้งเตือนแบบพุช"
subscribePushNotification: "เปิดการแจ้งเตือนแบบพุช"
unsubscribePushNotification: "ปิดการแจ้งเตือนแบบพุช"
pushNotificationAlreadySubscribed: "การแจ้งเตือนแบบพุชได้เปิดใช้งานแล้ว"
-pushNotificationNotSupported: "เบราว์เซอร์หรืออินสแตนซ์ของคุณนั้นไม่รองรับการแจ้งเตือนแบบพุช"
+pushNotificationNotSupported: "เบราว์เซอร์หรือเซิร์ฟเวอร์ไม่รองรับการแจ้งเตือนแบบพุช"
sendPushNotificationReadMessage: "ลบการแจ้งเตือนแบบพุชเมื่ออ่านการแจ้งเตือนหรือข้อความที่เกี่ยวข้องแล้ว"
sendPushNotificationReadMessageCaption: "อาจทำให้อุปกรณ์ของคุณใช้พลังงานมากขึ้น"
windowMaximize: "ขยายใหญ่สุด"
@@ -1017,36 +1044,37 @@ achievements: "ความสำเร็จ"
gotInvalidResponseError: "การตอบสนองเซิร์ฟเวอร์ไม่ถูกต้อง"
gotInvalidResponseErrorDescription: "เซิร์ฟเวอร์อาจไม่สามารถเข้าถึงได้หรืออาจจะกำลังอยู่ในระหว่างปรับปรุง กรุณาลองใหม่อีกครั้งในภายหลังนะคะ"
thisPostMayBeAnnoying: "โน้ตนี้อาจจะเป็นการรบกวนผู้อื่นนะคะ"
-thisPostMayBeAnnoyingHome: "โพสต์ไปยังไทม์ไลน์หน้าแรก"
-thisPostMayBeAnnoyingCancel: "เลิก"
-thisPostMayBeAnnoyingIgnore: "โพสต์ยังไงก็แล้วแต่"
+thisPostMayBeAnnoyingHome: "โพสต์ลงไทม์ไลน์หลักเท่านั้น"
+thisPostMayBeAnnoyingCancel: "ยกเลิก"
+thisPostMayBeAnnoyingIgnore: "โพสต์ไปเลย ไม่ต้องปรับการมองเห็น"
collapseRenotes: "ยุบรีโน้ตที่คุณเคยเห็นแล้ว"
+collapseRenotesDescription: "พับย่อโน้ตที่เคยตอบสนองหรือรีโน้ตแล้ว"
internalServerError: "เซิร์ฟเวอร์ภายในเกิดข้อผิดพลาด"
-internalServerErrorDescription: "เซิร์ฟเวอร์รันค้นพบข้อผิดพลาดที่ไม่คาดคิด"
+internalServerErrorDescription: "เกิดข้อผิดพลาดที่ไม่คาดคิดภายในเซิร์ฟเวอร์"
copyErrorInfo: "คัดลอกรายละเอียดข้อผิดพลาด"
-joinThisServer: "ลงชื่อสมัครใช้ในอินสแตนซ์นี้"
-exploreOtherServers: "มองหาอินสแตนซ์อื่น"
+joinThisServer: "ลงทะเบียนในเซิร์ฟเวอร์นี้"
+exploreOtherServers: "มองหาเซิร์ฟเวอร์อื่น"
letsLookAtTimeline: "มาดูไทม์ไลน์กัน"
-disableFederationConfirm: "ปิดใช้งานสหพันธ์จริงๆหรอแน่ใจแล้วนะ?"
+disableFederationConfirm: "ปิดใช้งานสหพันธ์เลยใช่ไหม?"
disableFederationConfirmWarn: "โพสต์จะยังคงเป็นสาธารณะต่อไป เว้นแต่จะตั้งค่าเป็นอย่างอื่น"
disableFederationOk: "ปิดการใช้งาน"
-invitationRequiredToRegister: "อินสแตนซ์นี้เป็นแบบรับเชิญ เฉพาะผู้ที่มีรหัสเชิญเท่านั้นที่สามารถลงทะเบียนได้"
-emailNotSupported: "อินสแตนซ์นี้ไม่รองรับการส่งอีเมล"
+invitationRequiredToRegister: "เซิร์ฟเวอร์นี้เป็นแบบรับเชิญ เฉพาะผู้มีรหัสเชิญเท่านั้นถึงสามารถลงทะเบียนได้"
+emailNotSupported: "เซิร์ฟเวอร์นี้ไม่รองรับการส่งอีเมล"
postToTheChannel: "โพสต์ลงช่อง"
cannotBeChangedLater: "สิ่งนี้ไม่สามารถเปลี่ยนแปลงได้ในภายหลังนะ"
reactionAcceptance: "การยอมรับรีแอคชั่น"
likeOnly: "ที่ถูกใจเท่านั้น"
-likeOnlyForRemote: "ทั้งหมด (เฉพาะการถูกใจจากอินสแตนซ์ระยะไกล)"
+likeOnlyForRemote: "ทั้งหมด (เฉพาะการถูกใจจากเซิร์ฟเวอร์ระยะไกล)"
nonSensitiveOnly: "เฉพาะไม่มีเนื้อหาละเอียดอ่อน"
nonSensitiveOnlyForLocalLikeOnlyForRemote: "เฉพาะไม่มีเนื้อหาละเอียดอ่อน (เฉพาะการถูกใจจากระยะไกลเท่านั้น)"
rolesAssignedToMe: "บทบาทที่ได้รับมอบหมายให้ฉัน"
-resetPasswordConfirm: "รีเซ็ตรหัสผ่านของคุณจริงๆหรอ?"
+resetPasswordConfirm: "ต้องการรีเซ็ตรหัสผ่านใช่ไหม?"
sensitiveWords: "คำที่มีเนื้อหาละเอียดอ่อน"
-sensitiveWordsDescription: "การเปิดเผยโน้ตทั้งหมดที่มีคำที่กำหนดค่าไว้จะถูกตั้งค่าเป็น \"หน้าแรก\" โดยอัตโนมัติ คุณยังสามารถแสดงหลายรายการได้โดยแยกรายการโดยใช้ตัวแบ่งบรรทัดได้นะ"
-sensitiveWordsDescription2: "การใช้ช่องว่างนั้นอาจจะสร้างนิพจน์ AND และคำหลักที่มีเครื่องหมายทับล้อมรอบจะเปลี่ยนเป็นนิพจน์ทั่วไปนะ"
+sensitiveWordsDescription: "โน้ตที่มีคำที่ระบุไว้จะถูกตั้งค่าการมองเห็นของให้แสดงเฉพาะในหน้าหลักเท่านั้น คั่นคำด้วยการขึ้นบรรทัดใหม่"
+sensitiveWordsDescription2: "ถ้าแยกด้วยเว้นวรรคจะเป็นการระบุ AND และถ้าล้อมคำด้วยสแลช (/) จะเป็นการใช้ regular expression"
prohibitedWords: "คำต้องห้าม"
prohibitedWordsDescription: "จะแจ้งเตือนว่าเกิดข้อผิดพลาดเมื่อพยายามโพสต์โน้ตที่มีคำที่กำหนดไว้ สามารถตั้งได้หลายคำด้วยการขึ้นบรรทัดใหม่"
-prohibitedWordsDescription2: "การใช้ช่องว่างนั้นอาจจะสร้างนิพจน์ AND และคำหลักที่มีเครื่องหมายทับล้อมรอบจะเปลี่ยนเป็นนิพจน์ทั่วไปนะ"
+prohibitedWordsDescription2: "ถ้าแยกด้วยเว้นวรรคจะเป็นการระบุ AND และถ้าล้อมคำด้วยสแลช (/) จะเป็นการใช้ regular expression"
hiddenTags: "แฮชแท็กที่ซ่อนอยู่"
hiddenTagsDescription: "เลือกแท็กที่จะไม่แสดงในรายการเทรนด์ สามารถลงทะเบียนหลายแท็กได้โดยขึ้นบรรทัดใหม่"
notesSearchNotAvailable: "การค้นหาโน้ตไม่พร้อมใช้งาน"
@@ -1058,7 +1086,8 @@ retryAllQueuesNow: "ลองเรียกใช้คิวทั้งหม
retryAllQueuesConfirmTitle: "ลองใหม่ทั้งหมดจริงๆหรอแน่ใจนะ?"
retryAllQueuesConfirmText: "สิ่งนี้จะเพิ่มการโหลดเซิร์ฟเวอร์ชั่วคราวนะ"
enableChartsForRemoteUser: "สร้างแผนภูมิข้อมูลผู้ใช้ระยะไกล"
-enableChartsForFederatedInstances: "สร้างแผนภูมิข้อมูลอินสแตนซ์ระยะไกล"
+enableChartsForFederatedInstances: "สร้างแผนภูมิของเซิร์ฟเวอร์ระยะไกล"
+enableStatsForFederatedInstances: "ดึงข้อมูลสถิติจากเซิร์ฟเวอร์ที่อยู่ห่างไกล"
showClipButtonInNoteFooter: "เพิ่ม “คลิป” ไปยังเมนูสั่งการของโน้ต"
reactionsDisplaySize: "ขนาดของรีแอคชั่น"
limitWidthOfReaction: "จำกัดความกว้างสูงสุดของรีแอคชั่นและแสดงให้เล็กลง"
@@ -1077,7 +1106,7 @@ addMemo: "เพิ่มเมโม"
editMemo: "แก้ไขเมโม"
reactionsList: "รายการรีแอคชั่น"
renotesList: "รายการรีโน้ต"
-notificationDisplay: "การแจ้งเตือน"
+notificationDisplay: "การแสดงการแจ้งเตือน"
leftTop: "บนซ้าย"
rightTop: "บนขวา"
leftBottom: "ล่างซ้าย"
@@ -1087,13 +1116,15 @@ vertical: "แนวตั้ง"
horizontal: "แนวนอน"
position: "ตำแหน่ง"
serverRules: "กฎของเซิร์ฟเวอร์"
-pleaseConfirmBelowBeforeSignup: "โปรดยืนยันที่ด้านล่างก่อนสมัครใช้งาน"
+pleaseConfirmBelowBeforeSignup: "หากต้องการลงทะเบียนในเซิร์ฟเวอร์นี้ คุณต้องตรวจสอบและยอมรับสิ่งต่อไปนี้"
pleaseAgreeAllToContinue: "คุณต้องยอมรับทุกช่องตรงด้านบนเพื่อดำเนินการต่อค่ะ"
continue: "ดำเนินการต่อ"
preservedUsernames: "ชื่อผู้ใช้ที่สงวนไว้"
preservedUsernamesDescription: "ระบุชื่อผู้ใช้ที่จะสงวนชื่อไว้ คั่นด้วยการขึ้นบรรทัดใหม่ ชื่อผู้ใช้ที่ระบุที่นี่จะไม่สามารถใช้งานได้อีกต่อไปเมื่อสร้างบัญชีใหม่ ยกเว้นเมื่อผู้ดูแลระบบสร้างบัญชี นอกจากนี้ บัญชีที่มีอยู่แล้วจะไม่ได้รับผลกระทบ"
createNoteFromTheFile: "เรียบเรียงโน้ตจากไฟล์นี้"
archive: "เก็บถาวร"
+archived: "เก็บถาวรแล้ว"
+unarchive: "เลิกการเก็บถาวร"
channelArchiveConfirmTitle: "ต้องการเก็บถาวรเจ้า {name} ใช่ไหม?"
channelArchiveConfirmDescription: "เมื่อเก็บถาวรแล้ว จะไม่ปรากฏในรายการช่องหรือผลการค้นหาอีกต่อไป และจะไม่สามารถโพสต์ใหม่ได้อีกต่อไป"
thisChannelArchived: "ช่องนี้ถูกเก็บถาวรแล้วนะ"
@@ -1104,6 +1135,9 @@ preventAiLearning: "ปฏิเสธการเรียนรู้ด้ว
preventAiLearningDescription: "ส่งคำร้องขอไม่ให้ใช้ ข้อความในโน้ตที่โพสต์, หรือเนื้อหารูปภาพ ฯลฯ ในการเรียนรู้ของเครื่อง(machine learning) / Predictive AI / Generative AI โดยการเพิ่มแฟล็ก “noai” ลง HTML-Response ให้กับเนื้อหาที่เกี่ยวข้อง แต่ทั้งนี้ ไม่ได้ป้องกัน AI จากการเรียนรู้ได้อย่างสมบูรณ์ เนื่องจากมี AI บางตัวเท่านั้นที่จะเคารพคำขอดังกล่าว"
options: "ตัวเลือกบทบาท"
specifyUser: "ผู้ใช้เฉพาะ"
+lookupConfirm: "ต้องการเรียกดูข้อมูลใช่ไหม?"
+openTagPageConfirm: "ต้องการเปิดหน้าแฮชแท็กใช่ไหม?"
+specifyHost: "ระบุโฮสต์"
failedToPreviewUrl: "ไม่สามารถดูตัวอย่างได้"
update: "อัปเดต"
rolesThatCanBeUsedThisEmojiAsReaction: "บทบาทที่สามารถใช้เอโมจินี้เป็นรีแอคชั่นได้"
@@ -1157,7 +1191,7 @@ notifyNotes: "แจ้งเตือนเกี่ยวกับโพสต
unnotifyNotes: "หยุดการแจ้งเตือนเกี่ยวกับโน้ตใหม่"
authentication: "การตรวจสอบสิทธิ์"
authenticationRequiredToContinue: "กรุณายืนยันตัวตนทางอิเล็กทรอนิกส์เพื่อดำเนินการต่อ"
-dateAndTime: "เวลาประทับ"
+dateAndTime: "วันเวลา"
showRenotes: "แสดงรีโน้ต"
edited: "แก้ไขแล้ว"
notificationRecieveConfig: "การตั้งค่าการแจ้งเตือน"
@@ -1168,11 +1202,11 @@ showRepliesToOthersInTimeline: "แสดงการตอบกลับผู
hideRepliesToOthersInTimeline: "ไม่แสดงการตอบกลับผู้อื่นลงในไทม์ไลน์"
showRepliesToOthersInTimelineAll: "รวมตอบกลับจากทุกคนที่คุณติดตามไว้ในไทม์ไลน์ของคุณ"
hideRepliesToOthersInTimelineAll: "ซ่อนตอบกลับจากทุกคนที่คุณติดตามไปจากไทม์ไลน์ของคุณ"
-confirmShowRepliesAll: "การดำเนินการนี้ไม่สามารถย้อนกลับได้ คุณต้องการแสดงการตอบกลับผู้อื่นจากผู้ใช้ทุกคนที่คุณติดตามอยู่ในไทม์ไลน์ของคุณหรือไม่?"
-confirmHideRepliesAll: "การดำเนินการนี้ไม่สามารถย้อนกลับได้ คุณต้องการซ่อนการตอบกลับผู้อื่นจากผู้ใช้ทุกคนที่คุณติดตามอยู่ในไทม์ไลน์ของคุณหรือไม่?"
+confirmShowRepliesAll: "การดำเนินการนี้ไม่สามารถย้อนกลับได้ คุณต้องการแสดงการตอบกลับผู้อื่นจากผู้ใช้ทุกคนที่คุณติดตามอยู่ ใส่ลงไทม์ไลน์ใช่ไหม?"
+confirmHideRepliesAll: "การดำเนินการนี้ไม่สามารถย้อนกลับได้ คุณต้องการซ่อนการตอบกลับผู้อื่นจากผู้ใช้ทุกคนที่คุณติดตามอยู่ ไปจากไทม์ไลน์ใช่ไหม?"
externalServices: "บริการภายนอก"
sourceCode: "ซอร์สโค้ด"
-sourceCodeIsNotYetProvided: "ซอร์สโค้ดยังไม่พร้อมใช้งาน โปรดติดต่อผู้ดูแลระบบของคุณเพื่อแก้ไขปัญหานี้"
+sourceCodeIsNotYetProvided: "ซอร์สโค้ดยังไม่พร้อมใช้งาน โปรดติดต่อผู้ดูแลระบบเพื่อแก้ไขปัญหานี้"
repositoryUrl: "URL ของ repository"
repositoryUrlDescription: "หากมีที่เก็บซอร์สโค้ดที่เปิดเผยต่อสาธารณะ ให้ป้อน URL ที่เก็บซอร์สโค้ดนั้น แต่หากคุณใช้ Misskey ตามต้นฉบับ (ไม่มีการเปลี่ยนแปลงซอร์สโค้ด) ให้ป้อน https://github.com/misskey-dev/misskey"
repositoryUrlOrTarballRequired: "หากคุณไม่มี repository สาธารณะ คุณจะต้องจัดเตรียม tarball แทน ดู .config/example.yml สำหรับรายละเอียด"
@@ -1227,7 +1261,7 @@ surrender: "ยอมแพ้"
gameRetry: "เริ่มเกมใหม่"
notUsePleaseLeaveBlank: "หากไม่ได้ใช้กรุณาเว้นว่างไว้"
useTotp: "ใช้รหัสผ่านแบบใช้ครั้งเดียว (TOTP)"
-useBackupCode: "ใช้รหัสสำรอง"
+useBackupCode: "ใช้รหัสแบ๊กอัป"
launchApp: "เริ่มแอป"
useNativeUIForVideoAudioPlayer: "ใช้ UI ของเบราว์เซอร์เพื่อเล่นวิดีโอ/เสียง"
keepOriginalFilename: "คงชื่อไฟล์เดิมไว้"
@@ -1235,13 +1269,49 @@ keepOriginalFilenameDescription: "หากปิดการตั้งค่
noDescription: "ไม่มีข้อความอธิบาย"
alwaysConfirmFollow: "แสดงข้อความยืนยันเมื่อกดติดตาม"
inquiry: "ติดต่อเรา"
+tryAgain: "โปรดลองอีกครั้ง"
+confirmWhenRevealingSensitiveMedia: "ตรวจสอบก่อนแสดงสื่อที่มีเนื้อหาละเอียดอ่อน"
+sensitiveMediaRevealConfirm: "สื่อนี้มีเนื้อหาละเอียดอ่อน, ต้องการแสดงใช่ไหม?"
+createdLists: "รายชื่อที่ถูกสร้าง"
+createdAntennas: "เสาอากาศที่ถูกสร้าง"
+fromX: "จาก {x}"
+genEmbedCode: "สร้างรหัสฝัง"
+noteOfThisUser: "โน้ตโดยผู้ใช้นี้"
+clipNoteLimitExceeded: "ไม่สามารถเพิ่มโน้ตเพิ่มเติมในคลิปนี้ได้อีกแล้ว"
+performance: "ประสิทธิภาพ"
+modified: "แก้ไข"
+discard: "ละทิ้ง"
+thereAreNChanges: "มีอยู่ {n} เปลี่ยนแปลง(s)"
+signinWithPasskey: "ลงชื่อเข้าใช้ด้วย Passkey"
+unknownWebAuthnKey: "พาสคีย์ไม่ถูกต้องค่ะ"
+passkeyVerificationFailed: "การยืนยันกุญแจดิจิทัลไม่สำเร็จค่ะ"
+passkeyVerificationSucceededButPasswordlessLoginDisabled: "การยืนยันพาสคีย์สำเร็จแล้ว แต่การลงชื่อเข้าใช้แบบไม่ต้องใส่รหัสผ่านถูกปิดใช้งานแล้ว"
+messageToFollower: "ข้อความถึงผู้ติดตาม"
+target: "เป้า"
+testCaptchaWarning: "ฟังก์ชันนี้มีไว้สำหรับทดสอบ CAPTCHA เท่านั้น\nห้ามนำไปใช้ในระบบจริงโดยเด็ดขาด"
+prohibitedWordsForNameOfUser: "คำนี้ไม่สามารถใช้เป็นชื่อผู้ใช้ได้"
+prohibitedWordsForNameOfUserDescription: "หากมีสตริงใดๆ ในรายการนี้ปรากฏอยู่ในชื่อของผู้ใช้ ชื่อนั้นจะถูกปฏิเสธ ผู้ใช้ที่มีสิทธิ์แต่ผู้ดูแลระบบนั้นจะไม่ได้รับผลกระทบใดๆจากข้อจำกัดนี้ค่ะ"
+yourNameContainsProhibitedWords: "ชื่อของคุณนั้นมีคำที่ต้องห้าม"
+yourNameContainsProhibitedWordsDescription: "ถ้าหากคุณต้องการใช้ชื่อนี้ กรุณาติดต่อผู้ดูแลระบบของเซิร์ฟเวอร์นะค่ะ"
+_abuseUserReport:
+ forward: "ส่งต่อ"
+ forwardDescription: "ส่งรายงานไปยังเซิร์ฟเวอร์ระยะไกลโดยใช้บัญชีระบบที่ไม่ระบุตัวตน"
+ resolve: "แก้ไข"
+ accept: "ยอมรับ"
+ reject: "ปฏิเสธ"
+ resolveTutorial: "ถ้าหากรายงานนี้มีเนื้อหาถูกต้อง ให้เลือก \"ยอมรับ\" เพื่อปิดเคสกรณีนี้โดยถือว่าได้รับการแก้ไขแล้ว\nถ้าหากเนื้อหาในรายงานนี้นั้นไม่ถูกต้อง ให้เลือก \"ปฏิเสธ\" เพื่อปิดเคสกรณีนี้โดยถือว่าไม่ได้รับการแก้ไข"
_delivery:
- stop: "ถูกระงับ"
+ status: "สถานะการจัดส่ง"
+ stop: "ระงับการส่ง"
+ resume: "จัดส่งต่อ"
_type:
none: "กำลังเผยแพร่"
+ manuallySuspended: "หยุดชั่วคราวด้วยตนเอง"
+ goneSuspended: "เซิร์ฟเวอร์ถูกระงับเนื่องจากมีการลบเซิร์ฟเวอร์นี้"
+ autoSuspendedForNotResponding: "เซิร์ฟเวอร์ถูกระงับเนื่องจากไม่ตอบสนอง"
_bubbleGame:
howToPlay: "วิธีเล่น"
- hold: "หยุดชั่วคราว"
+ hold: "ถือไว้"
_score:
score: "คะแนน"
scoreYen: "จำนวนเงินที่ได้รับ"
@@ -1255,27 +1325,27 @@ _bubbleGame:
section2: "เมื่อวัตถุประเภทเดียวกันมารวมกัน พวกมันจะกลายเป็นวัตถุใหม่และคุณจะได้รับคะแนน"
section3: "หากวัตถุล้นออกมาจากกล่อง เกมก็จะจบลง ตั้งเป้าทำคะแนนให้สูงด้วยการหลอมวัตถุต่าง ๆ โดยไม่ทำให้ล้นกล่อง!"
_announcement:
- forExistingUsers: "ผู้ใช้งานที่มีอยู่เท่านั้น"
- forExistingUsersDescription: "การประกาศนี้จะแสดงต่อผู้ใช้ที่มีอยู่ ณ จุดที่เผยแพร่นั้นๆถ้าหากเปิดใช้งาน ถ้าหากปิดใช้งานผู้ที่กำลังสมัครใหม่หลังจากโพสต์แล้วนั้นก็จะเห็นเช่นกัน"
+ forExistingUsers: "ผู้ใช้งานที่มีอยู่ตอนนี้เท่านั้น"
+ forExistingUsersDescription: "หากเปิดใช้งาน การประกาศนี้จะแสดงเฉพาะกับผู้ใช้ที่สร้างบัญชีก่อน/ที่มีอยู่ในขณะที่สร้างประกาศนี้เท่านั้น หากปิดใช้งาน การประกาศนี้จะแสดงกับผู้ใช้ที่สร้างบัญชีหลังจากสร้างประกาศนี้ด้วย"
needConfirmationToRead: "จำเป็นต้องยืนยันว่าอ่านแล้ว"
needConfirmationToReadDescription: "กล่องโต้ตอบการยืนยันจะปรากฏขึ้นเมื่อจะทำเครื่องหมายว่าอ่านแล้ว นอกจากนี้ยังทำให้ประกาศนี้ยังไม่ถูกอ่านเมื่อใช้ฟังก์ชั่น “ทำเครื่องหมายฯ ทั้งหมดว่าอ่านแล้ว”"
end: "เก็บประกาศ"
- tooManyActiveAnnouncementDescription: "การมีประกาศที่ใช้งานมากเกินไปนั้นอาจจะทำให้ประสบการณ์ของผู้ใช้งานนั้นดูแย่ลง โปรดกรุณาพิจารณาการเก็บประกาศที่ล้าสมัยด้วยนะค่ะ"
+ tooManyActiveAnnouncementDescription: "เนื่องจากมีการประกาศที่ยังใช้งานอยู่จำนวนมาก อาจทำให้ UX ลดลง แนะนำให้พิจารณาการเก็บประกาศที่สิ้นสุดไปแล้ว"
readConfirmTitle: "ทำเครื่องหมายว่าอ่านแล้วเลยไหม?"
readConfirmText: "จะทำเครื่องหมายใส่ “{title}” ว่าอ่านแล้ว"
- shouldNotBeUsedToPresentPermanentInfo: "เราขอแนะนำให้ใช้ประกาศเพื่อโพสต์ข้อมูลแบบ flow มากกว่าข้อมูลแบบ stock เนื่องจากมีแนวโน้มที่จะส่งผลเสียต่อ UX โดยเฉพาะสำหรับผู้ใช้ใหม่"
+ shouldNotBeUsedToPresentPermanentInfo: "เนื่องจากมีความเป็นไปได้สูงที่จะส่งผลเสียต่อง UX ของผู้ใช้ใหม่ จึงขอแนะนำให้ใช้ประกาศสำหรับข้อมูลที่ต้องการการตอบสนองในทันที ไม่ใช่ข้อมูลที่ต้องการแสดงตลอดเวลา"
dialogAnnouncementUxWarn: "เราขอแนะนำให้ใช้ด้วยความระมัดระวัง เนื่องจากการแจ้งเตือนแบบกล่องโต้ตอบตั้งแต่ 2 รายการขึ้นไปพร้อมกันอาจส่งผลเสียต่อ UX ได้อย่างมาก"
silence: "ไม่มีการแจ้งเตือน"
silenceDescription: "หากเปิดใช้งาน จะไม่มีการแจ้งเตือนประกาศนี้ และผู้ใช้จะไม่จำเป็นต้องทำเครื่องหมายว่าอ่านแล้ว"
_initialAccountSetting:
- accountCreated: "คุณได้สร้างบัญชีของคุณสำเร็จเรียบร้อยแล้ว!"
+ accountCreated: "สร้างบัญชีเสร็จสมบูรณ์!"
letsStartAccountSetup: "สำหรับผู้เริ่มต้นมาตั้งค่าโปรไฟล์ของคุณกันเถอะ"
letsFillYourProfile: "ก่อนอื่นมาตั้งค่าโปรไฟล์ของคุณ"
profileSetting: "ตั้งค่าโปรไฟล์"
privacySetting: "ตั้งค่าความเป็นส่วนตัว"
theseSettingsCanEditLater: "คุณสามารถเปลี่ยนการตั้งค่าเหล่านี้ได้ในภายหลังได้ตลอดเวลานะ"
- youCanEditMoreSettingsInSettingsPageLater: "ยังมีการตั้งค่าอื่นๆ อีกมากมายที่คุณนั้นสามารถกำหนดค่าได้จาก \"การตั้งค่า\" เพื่อให้แน่ใจว่าได้เยี่ยมชมมันได้ภายหลังนะ"
- followUsers: "ลองติดตามผู้ใช้บางคนที่คุณอาจจะสนใจเพื่อสร้างไทม์ไลน์ของคุณสิ !"
+ youCanEditMoreSettingsInSettingsPageLater: "สามารถตั้งค่าเพิ่มเติมได้ที่หน้า “การตั้งค่า” อย่าลืมไปเยี่ยมชมภายหลังด้วย"
+ followUsers: "ลองติดตามผู้ใช้ที่สนใจเพื่อสร้างไทม์ไลน์ดูสิ"
pushNotificationDescription: "กำลังเปิดใช้งานการแจ้งเตือนแบบพุชจะช่วยให้คุณได้รับการแจ้งเตือนจาก {name} โดยตรงบนอุปกรณ์ของคุณนะ"
initialAccountSettingCompleted: "ตั้งค่าโปรไฟล์เสร็จสมบูรณ์แล้ว!"
haveFun: "ขอให้สนุกกับ {name}!"
@@ -1310,7 +1380,7 @@ _initialTutorial:
description1: "Misskey มีหลายไทม์ไลน์ขึ้นอยู่กับวิธีการใช้งานของคุณ (บางไทม์ไลน์อาจไม่สามารถใช้ได้ขึ้นอยู่กับนโยบายของเซิร์ฟเวอร์)"
home: "คุณสามารถดูโพสต์จากบัญชีที่คุณติดตามได้"
local: "คุณสามารถดูโพสต์จากผู้ใช้ทั้งหมดบนเซิร์ฟเวอร์นี้"
- social: "โพสต์จากทั้งไทม์ไลน์หน้าแรกและไทม์ไลน์ในพื้นที่ของคุณจะปรากฏขึ้น"
+ social: "จะแสดงโพสต์ทั้งจากไทม์ไลน์หลักและไทม์ไลน์ท้องถิ่น"
global: "คุณสามารถดูโพสต์จากเซิร์ฟเวอร์ที่เชื่อมต่ออื่นๆ ทั้งหมดได้"
description2: "คุณสามารถสลับระหว่างแต่ละไทม์ไลน์ได้ตลอดเวลาได้ที่บริเวณด้านบนของหน้าจอ"
description3: "นอกจากนี้ยังมีรายการไทม์ไลน์ ไทม์ไลน์ของช่อง ฯลฯ โปรดดู {link} สำหรับรายละเอียดเพิ่มเติม"
@@ -1320,7 +1390,7 @@ _initialTutorial:
_visibility:
description: "คุณสามารถจำกัดผู้ที่สามารถดูโน้ตของคุณได้นะ"
public: "โน้ตของคุณนั้นจะปรากฏแก่ผู้ใช้งานทุกคน"
- home: "เผยแพร่บนไทม์ไลน์หน้าแรกเท่านั้น ผู้คนที่เข้าชมโปรไฟล์ของคุณ ผ่านผู้ติดตาม และผ่านการรีโน้ตสามารถเห็นได้"
+ home: "เผยแพร่บนไทม์ไลน์หลักเท่านั้น แต่ผู้ติดตาม ผู้ที่เข้ามาดูโปรไฟล์ และผู้ที่เห็นจากรีโน้ตยังสามารถดูโพสต์นี้ได้"
followers: "มองเห็นได้เฉพาะผู้ติดตามเท่านั้น ไม่มีใครอื่นนอกจากตัวคุณเองที่สามารถรีโน้ตได้ และมีเพียงผู้ติดตามของคุณเท่านั้นที่สามารถดูได้"
direct: "เปิดให้เห็นเฉพาะผู้ใช้ที่ระบุเท่านั้น และพวกเขาจะได้รับแจ้งเตือนด้วย คุณสามารถใช้มันแทนข้อความโดยตรง (dm)"
doNotSendConfidencialOnDirect1: "โปรดใช้ความระมัดระวังในการส่งข้อมูลที่ละเอียดอ่อน"
@@ -1328,9 +1398,9 @@ _initialTutorial:
localOnly: "การโพสต์ด้วย flag นี้จะไม่รวมโน้ตไปยังเซิร์ฟเวอร์อื่น ผู้ใช้บนเซิร์ฟเวอร์อื่นจะไม่สามารถดูโน้ตเหล่านี้ได้โดยตรง โดยไม่คำนึงถึงการตั้งค่าการแสดงผลข้างต้น"
_cw:
title: "คำเตือนเกี่ยวกับเนื้อหา"
- description: "เนื้อหาที่เขียนด้วย “คำอธิบายประกอบ” จะแสดงแทนข้อความหลัก คลิก “ดูเพิ่มเติม” เพื่อแสดงข้อความเต็ม"
+ description: "เนื้อหาที่เขียนใน “คำอธิบายประกอบ” จะแสดงแทนเนื้อหาหลัก ต้องคลิก “ดูเพิ่มเติม” เพื่อให้เนื้อหาหลักแสดง"
_exampleNote:
- cw: "นี่อาจจะทำให้คุณหิวอย่างแน่นอน!"
+ cw: " ห้ามดู ระวังหิว"
note: "เพิ่งไปกินโดนัทเคลือบช็อคโกแลตมา 🍩😋"
useCases: "ใช้สิ่งนี้เพื่อระบุโน้ตที่ต้องตามแนวทางปฏิบัติของเซิร์ฟเวอร์ หรือเพื่อควบคุมการสปอยล์และข้อความที่ละเอียดอ่อนด้วยตนเอง"
_howToMakeAttachmentsSensitive:
@@ -1346,17 +1416,17 @@ _initialTutorial:
title: "บทเรียนจบลงแล้วจ้า เย่เย่เย่ 🎉"
description: "คุณสมบัติที่แนะนำในที่นี่เป็นเพียงบางส่วนเท่านั้น หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับวิธีใช้ Misskey โปรดไปที่ {link}"
_timelineDescription:
- home: "บนไทม์ไลน์หน้าแรก คุณสามารถดูโพสต์จากบัญชีที่คุณติดตามได้"
- local: "ไทม์ไลน์ในพื้นที่ช่วยให้คุณเห็นโพสต์จากผู้ใช้ทั้งหมดบนเซิร์ฟเวอร์นี้"
- social: "ไทม์ไลน์โซเชียลจะแสดงโพสต์จากทั้งไทม์ไลน์หน้าแรกและไทม์ไลน์ในพื้นที่"
+ home: "บนไทม์ไลน์หลัก คุณสามารถดูโพสต์จากบัญชีที่ติดตามอยู่ได้"
+ local: "ไทม์ไลน์ท้องถิ่นช่วยให้เห็นโพสต์จากผู้ใช้ทั้งหมดบนเซิร์ฟเวอร์นี้"
+ social: "ไทม์ไลน์โซเชียลจะแสดงโพสต์จากทั้งไทม์ไลน์หลักและไทม์ไลน์ท้องถิ่น"
global: "ในไทม์ไลน์ทั่วโลก คุณสามารถดูโน้ตจากเซิร์ฟเวอร์ที่เชื่อมต่อทั้งหมดได้"
_serverRules:
description: "ชุดของกฎที่จะแสดงก่อนการลงทะเบียนเราขอแนะนำให้ตั้งค่าสรุปข้อกำหนดในการให้บริการ"
_serverSettings:
iconUrl: "URL ไอคอน"
appIconDescription: "ระบุไอคอนที่จะใช้เมื่อ {host} แสดงเป็นแอป"
- appIconUsageExample: "E.g. เป็น PWA หรือเมื่อแสดงผลเป็นบุ๊กมาร์กหน้าจอหลักบนโทรศัพท์"
- appIconStyleRecommendation: "เนื่องจากไอคอนอาจถูกครอบตัดเป็นสี่เหลี่ยมจัตุรัสหรือวงกลม จึงแนะนำให้ใช้ไอคอนที่มีขอบสีรอบๆ เนื้อหา"
+ appIconUsageExample: "ตัวอย่างเช่น เมื่อถูกเพิ่มเป็น PWA หรือบุ๊กมาร์กบนหน้าจอหลักในสมาร์ทโฟน"
+ appIconStyleRecommendation: "เนื่องจากอาจถูกครอบตัดเป็นสี่เหลี่ยมหรือวงกลม จึงแนะนำให้ใช้ภาพที่เผื่อพื้นที่รอบๆ ตัวโลโก้ไอคอนไว้"
appIconResolutionMustBe: "ความละเอียดขั้นต่ำไว้คือ {resolution}."
manifestJsonOverride: "เขียนทับ manifest.json"
shortName: "ชื่อย่อ"
@@ -1364,27 +1434,31 @@ _serverSettings:
fanoutTimelineDescription: "เพิ่มประสิทธิภาพการดึงข้อมูลไทม์ไลน์อย่างมาก และลดภาระในฐานข้อมูลเมื่อเปิดใช้งาน ในทางกลับกัน การใช้หน่วยความจำของ Redis จะเพิ่มขึ้น ลองปิดการใช้งานนี้ในกรณีที่หน่วยความจำเซิร์ฟเวอร์เหลือน้อยหรือเซิร์ฟเวอร์ไม่เสถียร"
fanoutTimelineDbFallback: "ฟอลแบ๊กกลับฐานข้อมูล"
fanoutTimelineDbFallbackDescription: "เมื่อเปิดใช้งาน หากไม่ได้แคชไทม์ไลน์ ไทม์ไลน์จะฟอลแบ๊กไปยังฐานข้อมูลสำหรับการ query เพิ่มเติม การปิดใช้งานจะช่วยลดภาระของเซิร์ฟเวอร์ด้วยการกำจัดกระบวนฟอลแบ๊ก แต่มันก็จะจำกัดช่วงเวลาไทม์ไลน์ที่สามารถดึงข้อมูลได้"
+ reactionsBufferingDescription: "เมื่อเปิดใช้งานฟังก์ชันนี้ก็จะช่วยลด latency ในการสร้างปฏิกิริยา แต่อาจจะส่งผลให้ memory footprint ของ Redis เพิ่มขึ้นนะ"
+ inquiryUrl: "URL สำหรับการติดต่อสอบถาม"
+ inquiryUrlDescription: "ระบุ URL ของหน้าเว็บที่มีแบบฟอร์มสำหรับติดต่อผู้ดูแลเซิร์ฟเวอร์ หรือข้อมูลการติดต่อของผู้ดูแลเซิร์ฟเวอร์"
+ thisSettingWillAutomaticallyOffWhenModeratorsInactive: "ถ้าหากไม่มีการตรวจสอบจากผู้ดูแลระบบหรือไม่มีความเคลื่อนไหวมาเป็นระยะเวลาหนึ่ง ระบบจะทำการปิดใช้งานฟังก์ชันนี้โดยอัตโนมัติ เพื่อลดความเสี่ยงในการถูกโจมตีด้วยสแปมและอื่นๆ"
_accountMigration:
- moveFrom: "ย้ายข้อมูลบัญชีอื่นไปยังอีกบัญชีนี้หนึ่ง"
+ moveFrom: "ย้ายจากบัญชีอื่นมาที่บัญชีนี้"
moveFromSub: "สร้างนามแฝงไปยังบัญชีอื่น"
moveFromLabel: "บัญชีที่จะย้ายจาก #{n}"
- moveFromDescription: "ถ้าหากคุณต้องการโอนข้อมูล คุณจำเป็นต้องสร้างบัญชีสำรองสำหรับการย้ายบัญชี หลังจากนั้นป้อนบัญชีที่จะย้ายไปในรูปแบบต่อไปนี้: @person@instance.com"
- moveTo: "ย้ายข้อมูลบัญชีนี้ไปยังบัญชีอีกหนึ่ง"
+ moveFromDescription: "หากต้องการโอนข้อมูลจากบัญชีอื่นมายังบัญชีนี้ จำเป็นต้องสร้างบัญชีนามแฝง (alias) ไว้ที่นี่ด้วย\nกรุณากรอกบัญชีเดิมในรูปแบบ: @username@server.example.com\nหากต้องการลบ alias, ให้เว้นว่างไว้แล้วบันทึก (ไม่แนะนำ)"
+ moveTo: "ย้ายบัญชีนี้ไปยังบัญชีใหม่"
moveToLabel: "บัญชีที่จะย้ายไปที่:"
moveCannotBeUndone: "ไม่สามารถยกเลิกการโอนย้ายบัญชีได้"
moveAccountDescription: "การดำเนินการนี้จะย้ายบัญชีของคุณไปยังบัญชีอื่น\n・ผู้ที่กำลังติดตามคุณจากบัญชีนี้จะถูกย้ายไปยังบัญชีใหม่โดยอัตโนมัติ\n・บัญชีนี้จะเลิกติดตามผู้ใช้ทั้งหมดที่กำลังติดตามอยู่\n・คุณจะไม่สามารถสร้างโน้ต ฯลฯ ในบัญชีนี้ได้\n\nแม้ว่าการย้ายผู้ที่ติดตามคุณจะเป็นไปโดยอัตโนมัติ แต่คุณต้องเตรียมขั้นตอนบางอย่างด้วยตนเอง เพื่อย้ายรายชื่อผู้ใช้ที่คุณกำลังติดตาม โดยดำเนินการส่งออกรายชื่อแล้วค่อยนำเข้ามาภายหลังในเมนูการตั้งค่าของบัญชีใหม่ ใช้ขั้นตอนเดียวกันนี้ใช้รายชื่อผู้ใช้ที่ถูกปิดเสียงและถูกบล็อก\n\n(คำอธิบายนี้ใช้กับ Misskey v13.12.0 ขึ้นไป, ซอฟต์แวร์ ActivityPub อื่นๆ เช่น Mastodon อาจทำงานแตกต่างออกไป)"
- moveAccountHowTo: "หากต้องการย้ายข้อมูลก่อนอื่นให้สร้างชื่อแทนสำหรับบัญชีนี้ ในบัญชีที่จะต้องการย้ายไป\nหลังจากที่คุณสร้างนามแฝงนั้นแล้ว ให้ป้อนบัญชีที่ต้องการจะย้ายไปในรูปแบบดังต่อไปนี้: @username@server.example.com"
+ moveAccountHowTo: "การย้ายบัญชีจะเริ่มต้นโดยการสร้างบัญชีนามแฝง (alias) ของบัญชีนี้ ณ บัญชีที่เป็นปลายทาง หลังจากสร้างนามแฝงแล้ว ให้ป้อนบัญชีปลายทางในรูปแบบดังนี้: @username@server.example.com"
startMigration: "โอนย้าย"
migrationConfirm: "ยืนยันการย้ายข้อมูลบัญชีนี้ไปที่ {account} เมื่อเริ่มแล้วจะไม่สามารถหยุดหรือนำกลับคืนมาได้ และคุณจะไม่สามารถใช้บัญชีนี้ในสถานะดั้งเดิมได้อีกต่อไป\n\nนอกจากนี้ คุณจำเป็นต้องสร้างบัญชีสำรองสำหรับการย้ายบัญชี"
- movedAndCannotBeUndone: "\nบัญชีนี้ถูกโอนย้ายไปแล้ว\nไม่สามารถย้อนกลับโอนย้ายข้อมูลได้"
- postMigrationNote: "บัญชีนี้จะถูกเลิกติดตามบัญชีทั้งหมดที่กำลังติดตามภายใน 24 ชั่วโมงหลังจากการย้ายข้อมูลนั้นเสร็จสิ้น ทั้งจำนวนผู้ติดตามและผู้ติดตามนั้นจะกลายเป็นศูนย์ เพื่อหลีกเลี่ยงป้องกันไม่ให้ผู้ติดตามของคุณนั้นไม่สามารถเห็นโพสต์เฉพาะผู้ติดตามของบัญชีนี้ได้ แต่อย่างไรก็ตามแล้วพวกเขาจะยังคงติดตามบัญชีนี้ต่อไป"
- movedTo: "บัญชีที่จะย้ายไปที่:"
+ movedAndCannotBeUndone: "\nบัญชีนี้ถูกโอนย้ายไปแล้ว\nไม่สามารถยกเลิกการโอนย้ายได้"
+ postMigrationNote: "บัญชีนี้จะดำเนินการยกเลิกการติดตามทั้งหมดหลังจากการย้ายข้อมูลไปแล้ว 24 ชั่วโมง จำนวนกำลังติดตามและจำนวนผู้ติดตามของบัญชีนี้จะเป็น 0 และเพื่อหลีกเลี่ยงไม่ให้ผู้ติดตามคุณนั้นไม่สามารถเห็นโพสต์เฉพาะผู้ติดตามฯได้ การยกเลิกการติดตามจะไม่กระทบกับผู้ติดตามคุณ ดังนั้นผู้ติดตามคุณยังคงสามารถดูโพสต์ของบัญชีนี้ได้"
+ movedTo: "บัญชีที่จะย้ายไป:"
_achievements:
earnedAt: "ได้รับเมื่อ"
_types:
_notes1:
title: "just setting up my msky"
- description: "โพสต์โน้ตแรกของคุณ"
+ description: "โพสต์โน้ตเป็นครั้งแรก"
flavor: "ขอให้มีช่วงเวลาที่ดีกับ Misskey นะคะ!"
_notes10:
title: "โน้ตไม่กี่ชิ้น"
@@ -1444,15 +1518,15 @@ _achievements:
title: "มือใหม่ III"
description: "เข้าสู่ระบบเป็นเวลารวม 15 วัน"
_login30:
- title: "มิสคิสท์ I"
+ title: "มิสคิสต์ I"
description: "เข้าสู่ระบบเป็นเวลารวม 30 วัน"
_login60:
- title: "มิสคิสท์ II"
+ title: "มิสคิสต์ II"
description: "เข้าสู่ระบบเป็นเวลารวม 60 วัน"
_login100:
- title: "มิสคิสท์ III"
+ title: "มิสคิสต์ III"
description: "เข้าสู่ระบบเป็นเวลารวม 100 วัน"
- flavor: "มิสคิสต์หัวรุนแรง"
+ flavor: "Violent Misskist (ทำไมเหมือนชื่อหนังสักเรื่องจังเลยนะ)"
_login200:
title: "ลูกค้าประจำ I"
description: "เข้าสู่ระบบเป็นเวลารวม 200 วัน"
@@ -1484,19 +1558,19 @@ _achievements:
flavor: "ขอบคุณที่ใช้ Misskey นะ !"
_noteClipped1:
title: "อดไม่ได้ที่จะต้องคลิปมันเอาไว้"
- description: "คลิปโน้ตตัวแรกของคุณ"
+ description: "คลิปโน้ตเป็นครั้งแรก"
_noteFavorited1:
title: "สตาร์เกเซอร์"
- description: "ชื่นชอบโน้ตแรกของคุณ"
+ description: "ใส่โน้ตเป็นรายการโปรดเป็นครั้งแรก"
_myNoteFavorited1:
title: "แสวงหาดวงดาว"
- description: "มีคนอื่นๆที่ชื่นชอบหนึ่งในโน้ตของคุณ"
+ description: "โน้ตตัวเองถูกคนอื่นเพิ่มลงรายการโปรดของเขา"
_profileFilled:
title: "เตรียมตัวอย่างดี"
- description: "ตั้งค่าโปรไฟล์ของคุณ"
+ description: "ตั้งค่าโปรไฟล์"
_markedAsCat:
title: "ฉันเป็นแมว"
- description: "ทำเครื่องหมายบัญชีของคุณว่าเป็นแมว"
+ description: "ตั้งค่าบัญชีเป็นแมวเมี้ยวเมี้ยว"
flavor: "แมวน้อยไร้ชื่อ"
_following1:
title: "ก้าวแรกสู่...กดติดตาม"
@@ -1539,7 +1613,7 @@ _achievements:
description: "ได้รับความสำเร็จ 30 ครั้ง"
_viewAchievements3min:
title: "ชอบบรรลุความสําเร็จ"
- description: "มองดูรายการความสำเร็จของคุณเป็นเวลาอย่างน้อย 3 นาที"
+ description: "มองดูรายการความสำเร็จเป็นเวลานานกว่า 3 นาที"
_iLoveMisskey:
title: "ฉันรัก Misskey"
description: "โพสต์ “I ❤ #Misskey”"
@@ -1566,13 +1640,13 @@ _achievements:
flavor: "โป๊ะ โป๊ะ โป๊ะ ปิ้งงงงง"
_selfQuote:
title: "อ้างอิงตนเอง"
- description: "อ้างโน้ตของคุณเอง"
+ description: "อ้างอิงโน้ตตัวเอง"
_htl20npm:
title: "ไทม์ไลน์ไหล"
- description: "มีการทำความเร็วของไทม์ไลน์หน้าแรกเกิน 20 npm (โน้ตต่อนาที)"
+ description: "มีการทำความเร็วของไทม์ไลน์หลักเกิน 20 npm (โน้ตต่อนาที)"
_viewInstanceChart:
title: "วิเคราะห์"
- description: "ดูแผนภูมิอินสแตนซ์ของคุณ"
+ description: "ดูแผนภูมิของเซิร์ฟเวอร์"
_outputHelloWorldOnScratchpad:
title: "หวัดดีชาวโลก!"
description: "เอาพุต \"hello world\" ใน Scratchpad"
@@ -1593,16 +1667,16 @@ _achievements:
description: "มีโอกาสที่จะได้รับด้วยความน่าจะเป็นไปได้ 0.005% ทุก ๆ 10 วินาที"
_setNameToSyuilo:
title: "คอมเพล็กซ์ของพระเจ้า"
- description: "ตั้งชื่อของคุณเป็น “syuilo”"
+ description: "ตั้งชื่อเป็น “syuilo”"
_passedSinceAccountCreated1:
title: "ครบรอบหนึ่งปี"
- description: "ผ่านไปหนึ่งปีแล้วนะตั้งแต่บัญชีของคุณถูกสร้างขึ้นมาน่ะ"
+ description: "ผ่านไป 1 ปีนับตั้งแต่สร้างบัญชี"
_passedSinceAccountCreated2:
title: "ครบรอบสองปี"
- description: "ผ่านไปสองปีแล้วนะตั้งแต่บัญชีของคุณถูกสร้างขึ้นมาน่ะ"
+ description: "ผ่านไป 2 ปีนับตั้งแต่สร้างบัญชี"
_passedSinceAccountCreated3:
title: "ครบรอบสามปี"
- description: "ผ่านไปสามปีแล้วนะตั้งแต่บัญชีของคุณถูกสร้างขึ้นมาน่ะ"
+ description: "ผ่านไป 3 ปีนับตั้งแต่สร้างบัญชี"
_loggedInOnBirthday:
title: "สุขสันต์วันเกิด"
description: "เข้าสู่ระบบในวันเกิดของคุณ"
@@ -1637,7 +1711,7 @@ _role:
name: "ชื่อบทบาท"
description: "คำอธิบายบทบาท"
permission: "สิทธิ์ตามบทบาท"
- descriptionOfPermission: "ผู้ควบคุม สามารถดำเนินการดูแลขั้นพื้นฐานได้\nผู้ดูแลระบบ สามารถเปลี่ยนการตั้งค่าทั้งหมดของอินสแตนซ์ได้"
+ descriptionOfPermission: "ผู้ควบคุม สามารถดำเนินการดูแลขั้นพื้นฐานได้\nผู้ดูแลระบบ สามารถเปลี่ยนการตั้งค่าทั้งหมดของเซิร์ฟเวอร์ได้"
assignTarget: "มอบหมาย"
descriptionOfAssignTarget: "แบบปรับเอง เพิ่มถอนบทบาทนี้แก่ผู้ใช้ด้วยตัวเอง\nแบบมีเงื่อนไข เพิ่มถอนบทบาทนี้แก่ผู้ใช้โดยอัตโนมัติหากเข้าเงื่อนไขใดต่อไปนี้"
manual: "ปรับเอง"
@@ -1650,8 +1724,8 @@ _role:
descriptionOfIsPublic: "บทบาทจะปรากฏบนโปรไฟล์ของผู้ใช้และเปิดเผยต่อสาธารณะ (ทุกคนสามารถเห็นได้ว่าผู้ใช้รายนี้มีบทบาทนี้)"
options: "ตัวเลือกบทบาท"
policies: "นโยบาย"
- baseRole: "เทมเพลตบทบาท"
- useBaseValue: "ใช้ตามเทมเพลตบทบาท"
+ baseRole: "แม่แบบบทบาท"
+ useBaseValue: "ใช้ตามแม่แบบบทบาท"
chooseRoleToAssign: "เลือกบทบาทที่ต้องการกำหนด"
iconUrl: "URL ไอคอน"
asBadge: "แสดงเป็นตรา"
@@ -1668,11 +1742,11 @@ _role:
middle: "ปานกลาง"
high: "สูง"
_options:
- gtlAvailable: "การดูไทม์ไลน์ทั่วโลก"
- ltlAvailable: "การดูไทม์ไลน์ในท้องถิ่น"
+ gtlAvailable: "สามารถดูไทม์ไลน์ทั่วโลกได้"
+ ltlAvailable: "สามารถดูไทม์ไลน์ท้องถิ่นได้"
canPublicNote: "สามารถโพสต์แบบสาธารณะ"
mentionMax: "จำนวนการกล่าวถึงสูงสุดต่อโน้ต"
- canInvite: "สร้างรหัสเชิญอินสแตนซ์"
+ canInvite: "สร้างรหัสเชิญเข้าเซิร์ฟเวอร์"
inviteLimit: "จำกัดการเชิญ"
inviteLimitCycle: "คูลดาวน์ในการเชิญ"
inviteExpirationTime: "วันหมดอายุของรหัสการเชิญ"
@@ -1680,6 +1754,7 @@ _role:
canManageAvatarDecorations: "จัดการตกแต่งอวตาร"
driveCapacity: "ความจุของไดรฟ์"
alwaysMarkNsfw: "ทำเครื่องหมายไฟล์ว่าเป็น NSFW เสมอ"
+ canUpdateBioMedia: "อนุญาตให้ปรับปรุงไอคอนและแบนเนอร์"
pinMax: "จํานวนสูงสุดของโน้ตที่ปักหมุดไว้"
antennaMax: "จำนวนสูงสุดของเสาอากาศ"
wordMuteMax: "จำนวนอักขระสูงสุดที่อนุญาตในการปิดเสียงคำ"
@@ -1694,9 +1769,14 @@ _role:
canSearchNotes: "การใช้การค้นหาโน้ต"
canUseTranslator: "การใช้งานแปล"
avatarDecorationLimit: "จำนวนการตกแต่งไอคอนสูงสุดที่สามารถติดตั้งได้"
+ canImportAntennas: "อนุญาตให้นำเข้าเสาอากาศ"
+ canImportBlocking: "อนุญาตให้นำเข้าการบล็อก"
+ canImportFollowing: "อนุญาตให้นำเข้ารายการต่อไปนี้"
+ canImportMuting: "อนุญาตให้นำเข้าการปิดกั้น"
+ canImportUserLists: "อนุญาตให้นำเข้ารายการ"
_condition:
roleAssignedTo: "มอบหมายให้มีบทบาทแบบทำมือ"
- isLocal: "ผู้ใช้ในพื้นที่"
+ isLocal: "ผู้ใช้ท้องถิ่น"
isRemote: "ผู้ใช้ระยะไกล"
isCat: "ผู้ใช้ที่เป็นแมว"
isBot: "ผู้ใช้ที่เป็นบอต"
@@ -1755,8 +1835,8 @@ _ad:
adsTooClose: "เนื่องจากช่วงเวลาการแสดงโฆษณาสั้นมาก ประสบการณ์ผู้ใช้จึงอาจลดลงอย่างมาก"
_forgotPassword:
enterEmail: "ป้อนที่อยู่อีเมลที่คุณเคยใช้ในการลงทะเบียนไว้ ลิงก์ที่คุณสามารถรีเซ็ตรหัสผ่านได้นั้นจะถูกส่งไปนะ"
- ifNoEmail: "ถ้าหากคุณไม่ได้ใช้อีเมลระหว่างการลงทะเบียน กรุณาติดต่อผู้ดูแลระบบอินสแตนซ์แทนนะ"
- contactAdmin: "อินสแตนซ์นี้ไม่รองรับการใช้งานที่อยู่อีเมลนี้ กรุณาติดต่อผู้ดูแลระบบอินสแตนซ์เพื่อรีเซ็ตรหัสผ่านของคุณแทน"
+ ifNoEmail: "หากลงทะเบียนแบบไม่ใช้อีเมล โปรดติดต่อผู้ดูแลระบบ"
+ contactAdmin: "เนื่องจากเซิร์ฟเวอร์นี้ไม่รองรับการส่งอีเมล หากต้องการรีเซ็ตรหัสผ่าน กรุณาติดต่อผู้ดูแลระบบ"
_gallery:
my: "แกลลอรี่ของฉัน"
liked: "โพสต์ที่ถูกใจ"
@@ -1774,23 +1854,23 @@ _plugin:
viewSource: "ดูต้นฉบับ"
viewLog: "แสดงปูม"
_preferencesBackups:
- list: "สร้างการสำรองข้อมูล"
- saveNew: "บันทึกข้อมูลสำรองใหม่"
+ list: "การตั้งค่าที่สำรองไว้"
+ saveNew: "บันทึกการตั้งค่าสำรองใหม่"
loadFile: "โหลดจากไฟล์"
apply: "นำไปใช้กับอุปกรณ์นี้"
save: "บันทึก"
- inputName: "กรุณาป้อนชื่อสำหรับข้อมูลสำรองนี้"
+ inputName: "กรุณาป้อนชื่อการตั้งค่าสำรองนี้"
cannotSave: "การบันทึกล้มเหลว"
- nameAlreadyExists: "มีข้อมูลสำรองชื่อ \"{name}\" นี้อยู่แล้ว กรุณาป้อนชื่ออื่นนะ"
- applyConfirm: "คุณต้องการใช้ข้อมูลสำรอง \"{name}\" กับอุปกรณ์นี้อย่างงั้นจริงหรอ การตั้งค่าที่มีอยู่ของอุปกรณ์นี้จะถูกเขียนทับนะ"
- saveConfirm: "บันทึกข้อมูลสำรองเป็น {name} มั้ย?"
- deleteConfirm: "ลบข้อมูลสำรอง {name} มั้ย?"
- renameConfirm: "ต้องการเปลี่ยนชื่อข้อมูลสำรองจาก “{old}” เป็น “{new}” ใช่ไหม?"
- noBackups: "ไม่มีข้อมูลสำรอง สามารถบันทึกการตั้งค่าไคลเอนต์ปัจจุบันไปยังเซิร์ฟเวอร์ด้วย “บันทึกข้อมูลสำรองใหม่”"
+ nameAlreadyExists: "มีการตั้งค่าสำรองชื่อ “{name}” อยู่แล้ว กรุณาป้อนชื่ออื่น"
+ applyConfirm: "ต้องการใช้การตั้งค่าสำรอง “{name}” กับอุปกรณ์นี้ใช่ไหม? การตั้งค่าที่มีอยู่บนอุปกรณ์นี้จะถูกเขียนทับ"
+ saveConfirm: "บันทึกการตั้งค่าสำรองเป็น {name} ใช่ไหม?"
+ deleteConfirm: "ต้องการลบ {name} ใช่ไหม?"
+ renameConfirm: "ต้องการเปลี่ยนชื่อจาก “{old}” เป็น “{new}” ใช่ไหม?"
+ noBackups: "ไม่มีการตั้งค่าสำรอง สามารถบันทึกการตั้งค่าไคลเอนต์ปัจจุบันไปยังเซิร์ฟเวอร์ด้วย “บันทึกการตั้งค่าสำรองใหม่”"
createdAt: "สร้างเมื่อ: {date} {time}"
updatedAt: "อัปเดตเมื่อ: {date} {time}"
cannotLoad: "การโหลดล้มเหลว"
- invalidFile: "รูปแบบไฟล์ไม่ถูกต้องนะ"
+ invalidFile: "รูปแบบไฟล์ไม่ถูกต้อง"
_registry:
scope: "สโคป"
key: "คีย์"
@@ -1841,13 +1921,13 @@ _menuDisplay:
hide: "ซ่อน"
_wordMute:
muteWords: "ปิดเสียงคำ"
- muteWordsDescription: "คั่นด้วยช่องว่างสำหรับเงื่อนไข AND หรือด้วยการขึ้นบรรทัดใหม่สำหรับเงื่อนไข OR นะ"
+ muteWordsDescription: "คั่นด้วยเว้นวรรคสำหรับเงื่อนไข AND, หรือขึ้นบรรทัดใหม่สำหรับเงื่อนไข OR"
muteWordsDescription2: "ล้อมรอบคีย์เวิร์ดด้วยเครื่องหมายทับเพื่อใช้นิพจน์ทั่วไป"
_instanceMute:
- instanceMuteDescription: "การดำเนินการนี้จะปิดเสียง\"โน้ต/รีโน้ต\"จากอินสแตนซ์ที่อยู่ในรายการ รวมถึงบันทึกของผู้ใช้ที่ตอบกลับผู้ใช้จากอินสแตนซ์ที่ปิดเสียง"
+ instanceMuteDescription: "ปิดเสียง “โน้ต/รีโน้ต” ทั้งหมดจากเซิร์ฟเวอร์ที่ระบุไว้ รวมถึงโน้ตของผู้ใช้ที่ตอบกลับผู้ใช้จากเซิร์ฟเวอร์ที่ถูกปิดเสียง"
instanceMuteDescription2: "คั่นด้วยการขึ้นบรรทัดใหม่"
- title: "ซ่อนโน้ตจากอินสแตนซ์ที่มีอยู่ในรายชื่อ"
- heading: "รายชื่ออินสแตนซ์ที่ถูกปิดเสียง"
+ title: "ซ่อนโน้ตจากเซิร์ฟเวอร์ที่มีระบุไว้"
+ heading: "เซิร์ฟเวอร์ที่ถูกปิดเสียง"
_theme:
explore: "สำรวจธีม"
install: "ติดตั้งธีม"
@@ -1911,7 +1991,6 @@ _theme:
buttonBg: "ปุ่มพื้นหลัง"
buttonHoverBg: "ปุ่มพื้นหลัง (โฮเวอร์)"
inputBorder: "เส้นขอบของช่องป้อนข้อมูล"
- listItemHoverBg: "รายการไอเทมพื้นหลัง (โฮเวอร์)"
driveFolderBg: "พื้นหลังโฟลเดอร์ไดรฟ์"
wallpaperOverlay: "วอลล์เปเปอร์ซ้อนทับ"
badge: "ตรา"
@@ -1923,8 +2002,6 @@ _sfx:
note: "โน้ต"
noteMy: "โน้ตของตัวเอง"
notification: "การเเจ้งเตือน"
- antenna: "เสาอากาศ"
- channel: "การแจ้งเตือนช่อง"
reaction: "เมื่อเลือกรีแอคชั่น"
_soundSettings:
driveFile: "ใช้เสียงจากไดรฟ์"
@@ -1932,7 +2009,8 @@ _soundSettings:
driveFileTypeWarn: "ไม่รองรับไฟล์นี้"
driveFileTypeWarnDescription: "กรุณาเลือกไฟล์เสียง"
driveFileDurationWarn: "เสียงยาวเกินไป"
- driveFileDurationWarnDescription: "การใช้เสียงที่ยาวอาจรบกวนการใช้งาน Misskey, ต้องการดำเนินการต่อหรือไม่?"
+ driveFileDurationWarnDescription: "การใช้เสียงที่ยาว อาจรบกวนการใช้งาน Misskey, ต้องการดำเนินการต่อใช่ไหม?"
+ driveFileError: "ไม่สามารถโหลดไฟล์เสียงได้ กรุณาเปลี่ยนแปลงการตั้งค่า"
_ago:
future: "อนาคต"
justNow: "เมื่อกี๊นี้"
@@ -1976,49 +2054,49 @@ _2fa:
removeKey: "ลบคีย์ความปลอดภัยออก"
removeKeyConfirm: "ลบข้อมูลสำรอง {name} มั้ย?"
whyTOTPOnlyRenew: "ไม่สามารถลบแอปตัวรับรองความถูกต้องได้ตราบใดที่มีการลงทะเบียนคีย์ความปลอดภัยไว้แล้ว"
- renewTOTP: "กำหนดค่าแอพตัวตรวจสอบสิทธิ์ใหม่"
+ renewTOTP: "ตั้งค่าแอปยืนยันตัวตน"
renewTOTPConfirm: "วิธีการแบบนี้จะทําให้รหัสยืนยันจากแอพก่อนหน้าของคุณหยุดทํางานเลยนะ"
renewTOTPOk: "ตั้งค่าคอนฟิกใหม่"
renewTOTPCancel: "ไม่เป็นไร"
- checkBackupCodesBeforeCloseThisWizard: "โปรดตรวจสอบรหัสสำรองด้านล่างก่อนที่จะปิดวิซาร์ดนี้"
- backupCodes: "รหัสสำรองข้อมูล"
+ checkBackupCodesBeforeCloseThisWizard: "โปรดตรวจสอบรหัสแบ๊กอัปด้านล่างก่อนที่จะปิดวิซาร์ดนี้"
+ backupCodes: "รหัสแบ๊กอัป"
backupCodesDescription: "หากแอปยืนยันตัวตนของคุณไม่พร้อมใช้งาน คุณสามารถใช้รหัสสำรองด้านล่างเพื่อเข้าถึงบัญชีของคุณได้ อย่าลืมเก็บรหัสเหล่านี้ไว้ในที่ปลอดภัย แต่ละรหัสสามารถใช้ได้เพียงครั้งเดียวเท่านั้น"
- backupCodeUsedWarning: "มีการใช้รหัสสำรองแล้ว โปรดกรุณากำหนดค่าการตรวจสอบสิทธิ์แบบสองปัจจัยโดยเร็วที่สุดถ้าหากคุณยังไม่สามารถใช้งานได้อีก"
- backupCodesExhaustedWarning: "รหัสสำรองทั้งหมดถูกใช้แล้ว ถ้าหากคุณยังสูญเสียการเข้าถึงแอปการตรวจสอบสิทธิ์แบบสองปัจจัยคุณจะยังไม่สามารถเข้าถึงบัญชีนี้ได้ กรุณากำหนดค่าการรับรองความถูกต้องด้วยการยืนยันสองชั้น"
+ backupCodeUsedWarning: "รหัสแบ๊กอัปถูกใช้งานแล้ว หากแอปพลิเคชันการยืนยันตัวตนไม่สามารถใช้งานได้ ให้รีบทำการตั้งค่าแอปฯใหม่โดยเร็วที่สุด"
+ backupCodesExhaustedWarning: "รหัสแบ๊กอัปทั้งหมดถูกใช้งานแล้ว หากยังไม่สามารถใช้แอปพลิเคชันการยืนยันตัวตนได้ก็จะไม่สามารถเข้าถึงบัญชีนี้ได้อีกต่อไป กรุณาลงทะเบียนแอปพลิเคชันการยืนยันตัวตนใหม่"
moreDetailedGuideHere: "คลิกที่นี่เพื่อดูคำแนะนำโดยละเอียด"
_permissions:
- "read:account": "ดูข้อมูลบัญชีของคุณ"
- "write:account": "แก้ไขข้อมูลบัญชีของคุณ"
- "read:blocks": "ดูรายชื่อผู้ใช้ที่ถูกบล็อกของคุณ"
- "write:blocks": "แก้ไขรายชื่อผู้ใช้ที่ถูกบล็อกของคุณ"
- "read:drive": "เข้าถึงไฟล์และโฟลเดอร์ในไดรฟ์ของคุณ"
- "write:drive": "แก้ไขหรือลบไฟล์และโฟลเดอร์ในไดรฟ์ของคุณ"
+ "read:account": "ดูข้อมูลบัญชี"
+ "write:account": "แก้ไขข้อมูลบัญชี"
+ "read:blocks": "ดูรายชื่อผู้ใช้ที่ถูกบล็อก"
+ "write:blocks": "แก้ไขรายชื่อผู้ใช้ที่ถูกบล็อก"
+ "read:drive": "เข้าถึงไดรฟ์"
+ "write:drive": "จัดการไดรฟ์"
"read:favorites": "ดูรายการโปรด"
"write:favorites": "แก้ไขรายการโปรด"
"read:following": "ดูข้อมูลว่าใครที่คุณติดตาม"
"write:following": "ติดตามหรือเลิกติดตามบัญชีอื่น"
- "read:messaging": "ดูแชทของคุณ"
+ "read:messaging": "ดูแชท"
"write:messaging": "เขียนหรือลบข้อความแชท"
- "read:mutes": "ดูรายชื่อผู้ใช้ที่ปิดเสียงของคุณ"
+ "read:mutes": "ดูรายชื่อผู้ใช้ที่ถูกปิดเสียง"
"write:mutes": "แก้ไขรายชื่อผู้ใช้ที่ถูกปิดเสียง"
"write:notes": "เขียนหรือลบโน้ต"
- "read:notifications": "ดูการแจ้งเตือนของคุณ"
- "write:notifications": "จัดการแจ้งเตือนของคุณ"
- "read:reactions": "ดูรีแอคชั่นของคุณ"
- "write:reactions": "แก้ไขรีแอคชั่นของคุณ"
+ "read:notifications": "ดูการแจ้งเตือน"
+ "write:notifications": "จัดการแจ้งเตือน"
+ "read:reactions": "ดูรีแอคชั่น"
+ "write:reactions": "แก้ไขรีแอคชั่น"
"write:votes": "โหวตบนสำรวจความคิดเห็น"
"read:pages": "ดูหน้าเพจ"
- "write:pages": "แก้ไขหรือลบเพจของคุณ"
+ "write:pages": "แก้ไขหรือลบเพจ"
"read:page-likes": "ดูรายการเพจที่ถูกใจไว้"
"write:page-likes": "แก้ไขรายการเพจที่ถูกใจ"
- "read:user-groups": "ดูกลุ่มผู้ใช้ของคุณ"
- "write:user-groups": "แก้ไขหรือลบกลุ่มผู้ใช้ของคุณ"
- "read:channels": "ดูแชนแนลของคุณ"
- "write:channels": "แก้ไขแชนแนลของคุณ"
+ "read:user-groups": "ดูกลุ่มผู้ใช้"
+ "write:user-groups": "แก้ไขหรือลบกลุ่มผู้ใช้"
+ "read:channels": "ดูช่อง"
+ "write:channels": "แก้ไขช่อง"
"read:gallery": "ดูแกลเลอรี่"
- "write:gallery": "แก้ไขแกลเลอรี่ของคุณ"
- "read:gallery-likes": "ดูรายการโพสต์แกลเลอรีที่ถูกใจไว้"
- "write:gallery-likes": "แก้ไขรายการโพสต์แกลเลอรีที่ถูกใจไว้"
+ "write:gallery": "แก้ไขแกลเลอรี"
+ "read:gallery-likes": "ดูแกลเลอรีที่ถูกใจไว้"
+ "write:gallery-likes": "จัดการแกลเลอรีที่ถูกใจไว้"
"read:flash": "ดู Play"
"write:flash": "แก้ไข Play"
"read:flash-likes": "ดูรายการ play ที่ถูกใจไว้"
@@ -2027,20 +2105,20 @@ _permissions:
"write:admin:delete-account": "ลบบัญชีผู้ใช้"
"write:admin:delete-all-files-of-a-user": "ลบไฟล์ทั้งหมดของผู้ใช้"
"read:admin:index-stats": "ดูข้อมูลเกี่ยวกับดัชนีฐานข้อมูล"
- "read:admin:table-stats": "ดูข้อมูลเกี่ยวกับตารางฐานข้อมูล"
+ "read:admin:table-stats": "ดูข้อมูลเกี่ยวกับตารางในฐานข้อมูล"
"read:admin:user-ips": "ดูที่อยู่ IP ของผู้ใช้"
- "read:admin:meta": "ดูข้อมูลเมตาของอินสแตนซ์"
+ "read:admin:meta": "ดูข้อมูลอภิพันธุ์ของอินสแตนซ์"
"write:admin:reset-password": "รีเซ็ตรหัสผ่านของผู้ใช้"
"write:admin:resolve-abuse-user-report": "แก้ไขรายงานจากผู้ใช้"
"write:admin:send-email": "ส่งอีเมล"
"read:admin:server-info": "ดูข้อมูลเซิร์ฟเวอร์"
- "read:admin:show-moderation-log": "ดูปูมการแก้ไข"
+ "read:admin:show-moderation-log": "ดูปูมการควบคุมดูแล"
"read:admin:show-user": "ดูข้อมูลส่วนตัวของผู้ใช้"
"write:admin:suspend-user": "ระงับผู้ใช้"
"write:admin:unset-user-avatar": "ลบอวตารผู้ใช้"
"write:admin:unset-user-banner": "ลบแบนเนอร์ผู้ใช้"
"write:admin:unsuspend-user": "ยกเลิกการระงับผู้ใช้"
- "write:admin:meta": "จัดการข้อมูลเมตาของอินสแตนซ์"
+ "write:admin:meta": "จัดการข้อมูลอภิพันธุ์ของอินสแตนซ์"
"write:admin:user-note": "จัดการโน้ตการกลั่นกรอง"
"write:admin:roles": "จัดการบทบาท"
"read:admin:roles": "ดูบทบาท"
@@ -2067,14 +2145,14 @@ _permissions:
"read:admin:ad": "ดูโฆษณา"
"write:invite-codes": "สร้างรหัสเชิญ"
"read:invite-codes": "รับรหัสเชิญ"
- "write:clip-favorite": "ควบคุมการถูกใจของคลิป"
- "read:clip-favorite": "ดูการถูกใจของคลิป"
+ "write:clip-favorite": "จัดการคลิปที่ถูกใจ"
+ "read:clip-favorite": "ดูคลิปที่ถูกใจ"
"read:federation": "รับข้อมูลเกี่ยวกับสหพันธ์"
"write:report-abuse": "รายงานการละเมิด"
_auth:
shareAccessTitle: "การให้สิทธิ์แอปพลิเคชัน"
shareAccess: "คุณต้องการอนุญาตให้ \"{name}\" เข้าถึงบัญชีนี้เลยมั้ย?"
- shareAccessAsk: "ต้องการอนุญาตให้แอปพลิเคชันนี้เข้าถึงบัญชีของคุณหรือไม่?"
+ shareAccessAsk: "ต้องการอนุญาตให้แอปพลิเคชันนี้เข้าถึงบัญชีของคุณใช่ไหม?"
permission: "{name} ได้ขอสิทธิ์การเข้าถึงดังต่อไปนี้"
permissionAsk: "แอปพลิเคชันนี้ขอสิทธิ์ดังต่อไปนี้"
pleaseGoBack: "กรุณากลับไปที่แอปพลิเคชัน"
@@ -2097,7 +2175,7 @@ _weekday:
saturday: "วันเสาร์"
_widgets:
profile: "โปรไฟล์"
- instanceInfo: "ข้อมูล อินสแตนซ์"
+ instanceInfo: "ข้อมูลเซิร์ฟเวอร์"
memo: "โน้ตแปะ"
notifications: "การเเจ้งเตือน"
timeline: "ไทม์ไลน์"
@@ -2111,7 +2189,7 @@ _widgets:
digitalClock: "นาฬิกาดิจิตอล"
unixClock: "นาฬิกา UNIX"
federation: "สหพันธ์"
- instanceCloud: "อินสแตนซ์คลาวด์"
+ instanceCloud: "กลุ่มเมฆเซิร์ฟเวอร์"
postForm: "แบบฟอร์มการโพสต์"
slideshow: "แสดงภาพนิ่ง"
button: "ปุ่ม"
@@ -2120,7 +2198,7 @@ _widgets:
serverMetric: "ตัวชี้วัดเซิร์ฟเวอร์"
aiscript: " คอนโซล AiScript"
aiscriptApp: "แอป AiScript"
- aichan: "ไอ"
+ aichan: "藍 (ไอ)"
userList: "รายชื่อผู้ใช้"
_userList:
chooseList: "เลือกรายชื่อ"
@@ -2144,7 +2222,7 @@ _poll:
deadlineTime: "เวลา"
duration: "ระยะเวลา"
votesCount: "{n} คะแนนเสียง"
- totalVotes: "{n} คะแนนเสียงทั้งหมด"
+ totalVotes: "ทั้งหมด {n} คะแนนเสียง"
vote: "โหวต"
showResult: "ดูผลลัพธ์"
voted: "โหวตแล้ว"
@@ -2156,14 +2234,14 @@ _poll:
_visibility:
public: "สาธารณะ"
publicDescription: "โน้ตของคุณจะปรากฏแก่ผู้ใช้ทุกคน"
- home: "หน้าแรก"
- homeDescription: "โพสลงไทม์ไลน์ที่บ้านเท่านั้น"
+ home: "หน้าหลัก"
+ homeDescription: "โพสต์ลงไทม์ไลน์หลักเท่านั้น"
followers: "ผู้ติดตาม"
followersDescription: "เฉพาะผู้ติดตามเท่านั้นที่มองเห็นได้"
specified: "ไดเร็ค"
specifiedDescription: "ทำให้มองเห็นได้เฉพาะผู้ใช้ที่ระบุเท่านั้น"
- disableFederation: "ไม่มีสหพันธ์"
- disableFederationDescription: "อย่าส่งไปยังอินสแตนซ์อื่น"
+ disableFederation: "การปิดใช้งานสหพันธ์"
+ disableFederationDescription: "อย่าส่งข้อมูลไปยังเซิร์ฟเวอร์อื่น"
_postForm:
replyPlaceholder: "ตอบกลับโน้ตนี้..."
quotePlaceholder: "อ้างโน้ตนี้..."
@@ -2189,6 +2267,9 @@ _profile:
changeBanner: "เปลี่ยนแบนเนอร์"
verifiedLinkDescription: "หากป้อน URL ที่มีลิงก์ไปยังโปรไฟล์ของคุณ ไอคอนการยืนยันความเป็นเจ้าของจะแสดงถัดจากฟิลด์นั้น ๆ"
avatarDecorationMax: "คุณสามารถเพิ่มการตกแต่งได้สูงสุด {max}"
+ followedMessage: "ส่งข้อความเมื่อมีคนกดติดตาม"
+ followedMessageDescription: "ส่งข้อความเมื่อมีคนกดติดตามแล้ว"
+ followedMessageDescriptionForLockedAccount: "ถ้าหากคุณตั้งค่าให้คนอื่นต้องขออนุญาตก่อนที่จะติดตามคุณ ระบบจะขึ้นข้อความนี้ในตอนที่คุณอนุมัติให้เขาติดตาม"
_exportOrImport:
allNotes: "โน้ตทั้งหมด"
favoritedNotes: "โน้ตที่ถูกใจไว้"
@@ -2199,37 +2280,37 @@ _exportOrImport:
userLists: "รายชื่อ"
excludeMutingUsers: "ยกเว้นผู้ใช้ที่ปิดเสียง"
excludeInactiveUsers: "ยกเว้นผู้ใช้ที่ไม่ได้ใช้งาน"
- withReplies: "รวมการตอบกลับจากผู้ใช้ที่นำเข้าไว้ในไทม์ไลน์"
+ withReplies: "รวมการตอบกลับจากผู้ใช้ที่ถูกนำเข้า ลงไทม์ไลน์"
_charts:
federation: "สหพันธ์"
apRequest: "คำขอ"
- usersIncDec: "ความแตกต่างของจำนวนผู้ใช้งาน"
+ usersIncDec: "การเพิ่มลดของจำนวนผู้ใช้"
usersTotal: "จำนวนผู้ใช้งานทั้งหมด"
activeUsers: "จำนวนผู้ใช้งานที่ยังมีความเคลื่อนไหวอยู่"
- notesIncDec: "ความแตกต่างของจำนวนโน้ต"
- localNotesIncDec: "ความแตกต่างของจำนวนโน้ตท้องถิ่น"
- remoteNotesIncDec: "ความแตกต่างของจำนวนโน้ตระยะไกล"
+ notesIncDec: "การเพิ่มลดของจำนวนโน้ต"
+ localNotesIncDec: "การเพิ่มลดของจำนวนโน้ตท้องถิ่น"
+ remoteNotesIncDec: "การเพิ่มลดของจำนวนโน้ตระยะไกล"
notesTotal: "จำนวนโน้ตทั้งหมด"
- filesIncDec: "ความแตกต่างของจำนวนไฟล์"
+ filesIncDec: "การเพิ่มลดของจำนวนไฟล์"
filesTotal: "จำนวนไฟล์ทั้งหมด"
- storageUsageIncDec: "ความแตกต่างในการใช้พื้นที่เก็บข้อมูล"
+ storageUsageIncDec: "การเพิ่มลดในการใช้พื้นที่เก็บข้อมูล"
storageUsageTotal: "การใช้พื้นที่เก็บข้อมูลทั้งหมด"
_instanceCharts:
requests: "คำขอ"
- users: "ความแตกต่างของจำนวนผู้ใช้งาน"
+ users: "การเพิ่มลดของจำนวนผู้ใช้งาน"
usersTotal: "จำนวนผู้ใช้งานสะสม"
- notes: "ความแตกต่างของจำนวนโน้ต"
+ notes: "การเพิ่มลดของจำนวนโน้ต"
notesTotal: "จำนวนโน้ตสะสม"
- ff: "ความแตกต่างของจำนวนผู้ใช้ที่ติดตาม / ผู้ติดตาม"
- ffTotal: "จำนวนผู้ใช้งานที่ติดตามสะสม / ผู้ติดตาม"
- cacheSize: "ความแตกต่างในขนาดของแคช"
- cacheSizeTotal: "ขนาดแคชรวมที่สะสม"
- files: "ความแตกต่างของจำนวนไฟล์"
+ ff: "การเพิ่มลดของการติดตาม/ผู้ติดตาม"
+ ffTotal: "จำนวนสะสมของการติดตาม/ผู้ติดตาม"
+ cacheSize: "การเพิ่มลดขนาดของแคช"
+ cacheSizeTotal: "ขนาดแคชสะสม"
+ files: "การเพิ่มลดของจำนวนไฟล์"
filesTotal: "จำนวนไฟล์สะสม"
_timelines:
- home: "หน้าแรก"
- local: "ในพื้นที่"
- social: "โซเชี่ยล"
+ home: "หน้าหลัก"
+ local: "ท้องถิ่น"
+ social: "โซเชียล"
global: "ทั่วโลก"
_play:
new: "สร้าง Play"
@@ -2245,7 +2326,7 @@ _play:
featured: "เป็นที่นิยม"
title: "หัวข้อ"
script: "สคริปต์"
- summary: "รายละเอียด"
+ summary: "คำอธิบาย"
visibilityDescription: "หากตั้งค่าเป็นส่วนตัว มันจะไม่ปรากฏในโปรไฟล์อีกต่อไป แต่ผู้ที่ทราบ URL ของมันจะยังสามารถเข้าถึงได้"
_pages:
newPage: "สร้างหน้าเพจใหม่"
@@ -2281,6 +2362,7 @@ _pages:
eyeCatchingImageSet: "ตั้งค่าภาพขนาดย่อ"
eyeCatchingImageRemove: "ลบภาพขนาดย่อ"
chooseBlock: "เพิ่มบล็อค"
+ enterSectionTitle: "ป้อนชื่อหัวข้อ"
selectType: "เลือกชนิด"
contentBlocks: "เนื้อหา"
inputBlocks: "ป้อนข้อมูล"
@@ -2326,6 +2408,8 @@ _notification:
renotedBySomeUsers: "รีโน้ตจากผู้ใช้ {n} ราย"
followedBySomeUsers: "มีผู้ติดตาม {n} ราย"
flushNotification: "ล้างประวัติการแจ้งเตือน"
+ exportOfXCompleted: "การดำเนินการส่งออก {x} ได้เสร็จสิ้นลงแล้ว"
+ login: "มีคนล็อกอิน"
_types:
all: "ทั้งหมด"
note: "โน้ตใหม่"
@@ -2333,13 +2417,16 @@ _notification:
mention: "กล่าวถึง"
reply: "ตอบกลับ"
renote: "รีโน้ต"
- quote: "อ้างคำพูด"
+ quote: "อ้างอิง"
reaction: "รีแอคชั่น"
pollEnded: "โพลสิ้นสุดแล้ว"
receiveFollowRequest: "ได้รับคำร้องขอติดตาม"
followRequestAccepted: "อนุมัติให้ติดตามแล้ว"
roleAssigned: "ให้บทบาท"
achievementEarned: "ปลดล็อกความสำเร็จแล้ว"
+ exportCompleted: "กระบวนการส่งออกข้อมูลได้เสร็จสิ้นสมบูรณ์แล้ว"
+ login: "เข้าสู่ระบบ"
+ test: "ทดสอบระบบแจ้งเตือน"
app: "การแจ้งเตือนจากแอปที่มีลิงก์"
_actions:
followBack: "ติดตามกลับด้วย"
@@ -2349,6 +2436,7 @@ _deck:
alwaysShowMainColumn: "แสดงคอลัมน์หลักเสมอ"
columnAlign: "จัดแนวคอลัมน์"
addColumn: "เพิ่มคอลัมน์"
+ newNoteNotificationSettings: "ตั้งค่าการแจ้งเตือนเมื่อมีโน้ตใหม่"
configureColumn: "ตั้งค่าคอลัมน์"
swapLeft: "ขยับไปทางซ้าย"
swapRight: "ขยับไปทางขวา"
@@ -2373,7 +2461,7 @@ _deck:
antenna: "เสาอากาศ"
list: "รายการ"
channel: "ช่อง"
- mentions: "พูดถึง"
+ mentions: "กล่าวถึงคุณ"
direct: "ไดเร็กต์"
roleTimeline: "บทบาทไทม์ไลน์"
_dialog:
@@ -2387,9 +2475,10 @@ _drivecleaner:
orderByCreatedAtAsc: "วันที่จากน้อยไปหามาก"
_webhookSettings:
createWebhook: "สร้าง Webhook"
+ modifyWebhook: "แก้ไข Webhook"
name: "ชื่อ"
secret: "ความลับ"
- events: "อีเว้นท์ Webhook"
+ trigger: "ทริกเกอร์"
active: "เปิดใช้งาน"
_events:
follow: "เมื่อกำลังติดตามผู้ใช้"
@@ -2399,6 +2488,29 @@ _webhookSettings:
renote: "รีโน้ตแล้วเมื่อ"
reaction: "เมื่อได้รับรีแอคชั่น"
mention: "เมื่อกำลังถูกกล่าวถึง"
+ _systemEvents:
+ abuseReport: "เมื่อมีการรายงานจากผู้ใช้"
+ abuseReportResolved: "เมื่อมีการจัดการกับการรายงานจากผู้ใช้"
+ userCreated: "เมื่อผู้ใช้ถูกสร้างขึ้น"
+ inactiveModeratorsWarning: "เมื่อผู้ดูแลระบบไม่ได้ใช้งานมานานระยะหนึ่ง"
+ inactiveModeratorsInvitationOnlyChanged: "เมื่อผู้ดูแลระบบที่ไม่ได้ใช้งานมานาน และเซิร์ฟเวอร์เปลี่ยนเป็นแบบเชิญเข้าร่วมเท่านั้น"
+ deleteConfirm: "ต้องการลบ Webhook ใช่ไหม?"
+ testRemarks: "คลิกปุ่มทางด้านขวาของสวิตช์เพื่อส่ง Webhook ทดสอบที่มีข้อมูลจำลอง"
+_abuseReport:
+ _notificationRecipient:
+ createRecipient: "เพิ่มปลายทางการแจ้งเตือนการรายงาน"
+ modifyRecipient: "แก้ไขปลายทางการแจ้งเตือนการรายงาน"
+ recipientType: "ประเภทของปลายทางการแจ้งเตือน\n"
+ _recipientType:
+ mail: "อีเมล"
+ webhook: "Webhook"
+ _captions:
+ mail: "ส่งการแจ้งเตือนไปยังที่อยู่อีเมลของผู้ควบคุม (เฉพาะเมื่อได้รับการรายงาน)"
+ webhook: "ส่งการแจ้งเตือนไปยัง SystemWebhook ที่กำหนด (จะส่งเมื่อได้รับการรายงานและเมื่อการรายงานได้รับการแก้ไข)"
+ keywords: "คีย์เวิร์ด"
+ notifiedUser: "ผู้ใช้ที่ได้รับการแจ้งเตือน"
+ notifiedWebhook: "Webhook ที่ใช้"
+ deleteConfirm: "ต้องการลบปลายทางการแจ้งเตือนใช่ไหม?"
_moderationLogTypes:
createRole: "สร้างบทบาทแล้ว"
deleteRole: "ลบบทบาทแล้ว"
@@ -2421,12 +2533,14 @@ _moderationLogTypes:
deleteGlobalAnnouncement: "ลบประกาศทั่วโลกออกแล้ว"
deleteUserAnnouncement: "ลบประกาศผู้ใช้ออกแล้ว"
resetPassword: "รีเซ็ตรหัสผ่าน"
- suspendRemoteInstance: "ระงับอินสแตนซ์ระยะไกล"
- unsuspendRemoteInstance: "เลิกระงับอินสแตนซ์ระยะไกล"
- updateRemoteInstanceNote: "อัปเดตโน้ตการกลั่นกรองของอินสแตนซ์ระยะไกลแล้ว"
+ suspendRemoteInstance: "ระงับเซิร์ฟเวอร์ระยะไกล"
+ unsuspendRemoteInstance: "เลิกระงับเซิร์ฟเวอร์ระยะไกล"
+ updateRemoteInstanceNote: "อัปเดตโน้ตการกลั่นกรองสำหรับเซิร์ฟเวอร์ระยะไกลแล้ว"
markSensitiveDriveFile: "ทำเครื่องหมายไฟล์ว่ามีเนื้อหาละเอียดอ่อน"
unmarkSensitiveDriveFile: "ยกเลิกทำเครื่องหมายไฟล์ว่ามีเนื้อหาละเอียดอ่อน"
resolveAbuseReport: "รายงานได้รับการแก้ไขแล้ว"
+ forwardAbuseReport: "ได้ส่งรายงานไปแล้ว"
+ updateAbuseReportNote: "โน้ตการกลั่นกรองที่รายงานไปนั้น ได้รับการอัปเดตแล้ว"
createInvitation: "สร้างรหัสเชิญ"
createAd: "สร้างโฆษณาแล้ว"
deleteAd: "ลบโฆษณาออกแล้ว"
@@ -2436,6 +2550,16 @@ _moderationLogTypes:
deleteAvatarDecoration: "ลบการตกแต่งไอคอนแล้ว"
unsetUserAvatar: "ลบไอคอนผู้ใช้"
unsetUserBanner: "ลบแบนเนอร์ผู้ใช้"
+ createSystemWebhook: "สร้าง SystemWebhook"
+ updateSystemWebhook: "อัปเดต SystemWebhook"
+ deleteSystemWebhook: "ลบ SystemWebhook"
+ createAbuseReportNotificationRecipient: "สร้างปลายทางการแจ้งเตือนการรายงาน"
+ updateAbuseReportNotificationRecipient: "อัปเดตปลายทางการแจ้งเตือนการรายงาน"
+ deleteAbuseReportNotificationRecipient: "ลบปลายทางการแจ้งเตือนการรายงาน"
+ deleteAccount: "บัญชีถูกลบไปแล้ว"
+ deletePage: "เพจถูกลบออกไปแล้ว"
+ deleteFlash: "Play ถูกลบออกไปแล้ว"
+ deleteGalleryPost: "โพสต์แกลเลอรี่ถูกลบออกแล้ว"
_fileViewer:
title: "รายละเอียดไฟล์"
type: "ประเภทไฟล์"
@@ -2448,10 +2572,10 @@ _externalResourceInstaller:
title: "ติดตั้งจากไซต์ภายนอก"
checkVendorBeforeInstall: "โปรดตรวจสอบให้แน่ใจว่าแหล่งแจกหน่ายมีความน่าเชื่อถือก่อนทำการติดตั้ง"
_plugin:
- title: "ต้องการติดตั้งปลั๊กอินนี้หรือไม่?"
+ title: "ต้องการติดตั้งปลั๊กอินนี้ใช่ไหม?"
metaTitle: "ข้อมูลส่วนเสริม"
_theme:
- title: "ต้องการติดตั้งธีมนี้หรือไม่?"
+ title: "ต้องการติดตั้งธีมนี้ใช่ไหม?"
metaTitle: "ข้อมูลธีม"
_meta:
base: "โทนสีพื้นฐาน"
@@ -2487,7 +2611,7 @@ _externalResourceInstaller:
description: "เกิดปัญหาระหว่างการติดตั้งธีม กรุณาลองอีกครั้ง. รายละเอียดข้อผิดพลาดสามารถดูได้ในคอนโซล Javascript"
_dataSaver:
_media:
- title: "โหลดมีเดีย"
+ title: "โหลดสื่อ"
description: "กันไม่ให้ภาพและวิดีโอโหลดโดยอัตโนมัติ แตะรูปภาพ/วิดีโอที่ซ่อนอยู่เพื่อโหลด"
_avatar:
title: "รูปไอคอน"
@@ -2567,3 +2691,22 @@ _mediaControls:
pip: "รูปภาพในรูปภาม"
playbackRate: "ความเร็วในการเล่น"
loop: "เล่นวนซ้ำ"
+_contextMenu:
+ title: "เมนูเนื้อหา"
+ app: "แอปพลิเคชัน"
+ appWithShift: "แอปฟลิเคชันด้วยปุ่มยกแคร่ (Shift)"
+ native: "UI ของเบราว์เซอร์"
+_embedCodeGen:
+ title: "ปรับแต่งโค้ดฝัง"
+ header: "แสดงส่วนหัว"
+ autoload: "โหลดเพิ่มโดยอัตโนมัติ (เลิกใช้แล้ว)"
+ maxHeight: "ความสูงสุด"
+ maxHeightDescription: "หากถ้าตั้งค่าเป็น 0 จะทำให้ไม่มีการจำกัดความสูงของวิดเจ็ต แต่ควรตั้งค่าเป็นตัวเลขอื่นๆ เพื่อไม่ให้วิดเจ็ตยืดตัวลงไปเรื่อยๆ"
+ maxHeightWarn: "การจำกัดความสูงสูงสุดถูกปิดใช้งาน (0) หากไม่ได้ตั้งใจให้เป็นเช่นนี้ โปรดตั้งค่าความสูงสูงสุดให้เป็นค่าอื่นๆแทน"
+ previewIsNotActual: "การแสดงผลนั้นต่างจากการฝังจริงเพราะเกินขอบเขตที่แสดงบนหน้าจอตัวอย่างนะ"
+ rounded: "ทำให้มันกลม"
+ border: "เพิ่มขอบให้กับกรอบด้านนอก"
+ applyToPreview: "นำไปใช้กับการแสดงตัวอย่าง"
+ generateCode: "สร้างโค้ดสำหรับการฝัง"
+ codeGenerated: "รหัสถูกสร้างขึ้นแล้ว"
+ codeGeneratedDescription: "นำโค้ดที่สร้างแล้วไปวางในเว็บไซต์ของคุณเพื่อฝังเนื้อหา"
diff --git a/locales/tr-TR.yml b/locales/tr-TR.yml
index cf6729a81d..fe2f158ff6 100644
--- a/locales/tr-TR.yml
+++ b/locales/tr-TR.yml
@@ -446,6 +446,7 @@ _notification:
reaction: "Tepkiler"
receiveFollowRequest: "Takip isteği alındı"
followRequestAccepted: "Takip isteği kabul edildi"
+ login: "Giriş Yap "
_actions:
reply: "yanıt"
renote: "vazgeçme"
diff --git a/locales/ug-CN.yml b/locales/ug-CN.yml
index e48f64511c..fef26040a5 100644
--- a/locales/ug-CN.yml
+++ b/locales/ug-CN.yml
@@ -17,3 +17,6 @@ _2fa:
renewTOTPCancel: "ئۇنى توختىتىڭ"
_widgets:
profile: "profile"
+_notification:
+ _types:
+ login: "كىرىش"
diff --git a/locales/uk-UA.yml b/locales/uk-UA.yml
index 661ecf19d7..f2262cd71f 100644
--- a/locales/uk-UA.yml
+++ b/locales/uk-UA.yml
@@ -452,7 +452,6 @@ language: "Мова"
uiLanguage: "Мова інтерфейсу"
aboutX: "Про {x}"
native: "місцевий"
-disableDrawer: "Не використовувати висувні меню"
noHistory: "Історія порожня"
signinHistory: "Історія входів"
enableAdvancedMfm: "Увімкнути розширений MFM"
@@ -631,10 +630,7 @@ abuseReported: "Дякуємо, вашу скаргу було відправл
reporter: "Репортер"
reporteeOrigin: "Про кого повідомлено"
reporterOrigin: "Хто повідомив"
-forwardReport: "Переслати звіт на віддалений інстанс"
-forwardReportIsAnonymous: "Замість вашого облікового запису анонімний системний обліковий запис буде відображатися як доповідач на віддаленому інстансі"
send: "Відправити"
-abuseMarkAsResolved: "Позначити скаргу як вирішену"
openInNewTab: "Відкрити в новій вкладці"
openInSideView: "Відкрити збоку"
defaultNavigationBehaviour: "Поведінка навігації за замовчуванням"
@@ -1306,7 +1302,6 @@ _theme:
buttonBg: "Фон кнопки"
buttonHoverBg: "Фон кнопки (при наведенні)"
inputBorder: "Край поля вводу"
- listItemHoverBg: "Фон елементу в списку (при наведенні)"
driveFolderBg: "Фон папки на диску"
wallpaperOverlay: "Накладання шпалер"
badge: "Значок"
@@ -1318,8 +1313,6 @@ _sfx:
note: "Нотатки"
noteMy: "Мої нотатки"
notification: "Сповіщення"
- antenna: "Прийом антени"
- channel: "Повідомлення каналу"
_ago:
future: "Майбутнє"
justNow: "Щойно"
@@ -1590,6 +1583,7 @@ _notification:
reaction: "Реакції"
receiveFollowRequest: "Запити на підписку"
followRequestAccepted: "Прийняті підписки"
+ login: "Увійти"
app: "Сповіщення від додатків"
_actions:
reply: "Відповісти"
@@ -1622,6 +1616,10 @@ _deck:
_webhookSettings:
name: "Ім'я"
active: "Увімкнено"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "E-mail"
_moderationLogTypes:
suspend: "Призупинити"
resetPassword: "Скинути пароль"
diff --git a/locales/uz-UZ.yml b/locales/uz-UZ.yml
index 4a930626f4..37a550008a 100644
--- a/locales/uz-UZ.yml
+++ b/locales/uz-UZ.yml
@@ -471,7 +471,6 @@ uiLanguage: "Interfeys tili"
aboutX: "{x} haqida"
emojiStyle: "Emoji ko'rinishi"
native: "Mahalliy"
-disableDrawer: "Slayd menyusidan foydalanmang"
showNoteActionsOnlyHover: "Eslatma amallarini faqat sichqonchani olib borganda ko‘rsatish"
noHistory: "Tarix yo'q"
signinHistory: "kirish tarixi"
@@ -630,10 +629,7 @@ abuseReported: "Shikoyatingiz yetkazildi. Ma'lumot uchun rahmat."
reporter: "Shikoyat qiluvchi"
reporteeOrigin: "Xabarning kelib chiqishi"
reporterOrigin: "Xabarchining joylashuvi"
-forwardReport: "Xabarni masofadagi serverga yuborish"
-forwardReportIsAnonymous: "Sizning yuborayotgan xabaringiz o'z akkountingiz emas balki anonim tarzda qoladi"
send: "Yuborish"
-abuseMarkAsResolved: "Yuborilgan xabarni hal qilingan deb belgilash"
openInNewTab: "Yangi tab da ochish"
openInSideView: "Yon panelda ochish"
defaultNavigationBehaviour: "Standart navigatsiya harakati"
@@ -1058,6 +1054,7 @@ _notification:
quote: "Iqtibos keltirish"
reaction: "Reaktsiyalar"
receiveFollowRequest: "Qabul qilingan kuzatuv so'rovlari"
+ login: "Kirish"
_actions:
reply: "Javob berish"
renote: "Qayta qayd qilish"
@@ -1089,6 +1086,10 @@ _webhookSettings:
_events:
renote: "Qayta qayd qilinganda"
mention: "Eslanganda"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "Email"
_moderationLogTypes:
suspend: "To'xtatish"
resetPassword: "Parolni tiklash"
diff --git a/locales/vi-VN.yml b/locales/vi-VN.yml
index acc2e0c6a9..235497d844 100644
--- a/locales/vi-VN.yml
+++ b/locales/vi-VN.yml
@@ -376,6 +376,7 @@ mcaptcha: "mCaptcha"
enableMcaptcha: "Bật mCaptcha"
mcaptchaSiteKey: "Khóa của trang"
mcaptchaSecretKey: "Khóa bí mật"
+mcaptchaInstanceUrl: "URL mCaptcha máy chủ"
recaptcha: "reCAPTCHA"
enableRecaptcha: "Bật reCAPTCHA"
recaptchaSiteKey: "Khóa của trang"
@@ -426,6 +427,7 @@ moderator: "Kiểm duyệt viên"
moderation: "Kiểm duyệt"
moderationNote: "Ghi chú kiểm duyệt"
addModerationNote: "Thêm ghi chú kiểm duyệt"
+moderationLogs: "Nhật kí quản trị"
nUsersMentioned: "Dùng bởi {n} người"
securityKeyAndPasskey: "Mã bảo mật・Passkey"
securityKey: "Khóa bảo mật"
@@ -458,6 +460,7 @@ retype: "Nhập lại"
noteOf: "Tút của {user}"
quoteAttached: "Trích dẫn"
quoteQuestion: "Trích dẫn lại?"
+attachAsFileQuestion: "Văn bản ở trong bộ nhớ tạm rất dài. Bạn có muốn đăng nó dưới dạng một tệp văn bản không?"
noMessagesYet: "Chưa có tin nhắn"
newMessageExists: "Bạn có tin nhắn mới"
onlyOneFileCanBeAttached: "Bạn chỉ có thể đính kèm một tập tin"
@@ -483,7 +486,6 @@ uiLanguage: "Ngôn ngữ giao diện"
aboutX: "Giới thiệu {x}"
emojiStyle: "Kiểu cách Emoji"
native: "Bản xứ"
-disableDrawer: "Không dùng menu thanh bên"
showNoteActionsOnlyHover: "Chỉ hiển thị các hành động ghi chú khi di chuột"
noHistory: "Không có dữ liệu"
signinHistory: "Lịch sử đăng nhập"
@@ -673,10 +675,7 @@ abuseReported: "Báo cáo đã được gửi. Cảm ơn bạn nhiều."
reporter: "Người báo cáo"
reporteeOrigin: "Bị báo cáo"
reporterOrigin: "Máy chủ người báo cáo"
-forwardReport: "Chuyển tiếp báo cáo cho máy chủ từ xa"
-forwardReportIsAnonymous: "Thay vì tài khoản của bạn, một tài khoản hệ thống ẩn danh sẽ được hiển thị dưới dạng người báo cáo ở máy chủ từ xa."
send: "Gửi"
-abuseMarkAsResolved: "Đánh dấu đã xử lý"
openInNewTab: "Mở trong tab mới"
openInSideView: "Mở trong thanh bên"
defaultNavigationBehaviour: "Thao tác điều hướng mặc định"
@@ -1547,7 +1546,6 @@ _theme:
buttonBg: "Nền nút"
buttonHoverBg: "Nền nút (Chạm)"
inputBorder: "Đường viền khung soạn thảo"
- listItemHoverBg: "Nền mục liệt kê (Chạm)"
driveFolderBg: "Nền thư mục Ổ đĩa"
wallpaperOverlay: "Lớp phủ hình nền"
badge: "Huy hiệu"
@@ -1559,8 +1557,6 @@ _sfx:
note: "Tút"
noteMy: "Tút của tôi"
notification: "Thông báo"
- antenna: "Trạm phát sóng"
- channel: "Kênh"
_ago:
future: "Tương lai"
justNow: "Vừa xong"
@@ -1878,6 +1874,7 @@ _notification:
receiveFollowRequest: "Yêu cầu theo dõi"
followRequestAccepted: "Yêu cầu theo dõi được chấp nhận"
achievementEarned: "Hoàn thành Achievement"
+ login: "Đăng nhập"
app: "Từ app liên kết"
_actions:
followBack: "đã theo dõi lại bạn"
@@ -1917,11 +1914,14 @@ _webhookSettings:
createWebhook: "Tạo Webhook"
name: "Tên"
secret: "Mã bí mật"
- events: "Sự kiện Webhook"
active: "Đã bật"
_events:
reaction: "Khi nhận được sự kiện"
mention: "Khi có người nhắc tới bạn"
+_abuseReport:
+ _notificationRecipient:
+ _recipientType:
+ mail: "Email"
_moderationLogTypes:
suspend: "Vô hiệu hóa"
resetPassword: "Đặt lại mật khẩu"
diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml
index f92d997b5a..93804608c2 100644
--- a/locales/zh-CN.yml
+++ b/locales/zh-CN.yml
@@ -8,6 +8,9 @@ search: "搜索"
notifications: "通知"
username: "用户名"
password: "密码"
+initialPasswordForSetup: "初始化密码"
+initialPasswordIsIncorrect: "初始化密码不正确"
+initialPasswordForSetupDescription: "如果是自己安装的 Misskey,请输入配置文件里设好的密码。\n如果使用的是 Misskey 的托管服务等,请输入服务商提供的密码。\n如果没有设置密码,请留空并继续。"
forgotPassword: "忘记密码"
fetchingAsApObject: "在联邦宇宙查询中..."
ok: "OK"
@@ -60,6 +63,7 @@ copyFileId: "复制文件ID"
copyFolderId: "复制文件夹ID"
copyProfileUrl: "复制个人资料URL"
searchUser: "搜索用户"
+searchThisUsersNotes: "搜索用户帖子"
reply: "回复"
loadMore: "查看更多"
showMore: "查看更多"
@@ -89,7 +93,7 @@ followsYou: "正在关注你"
createList: "创建列表"
manageLists: "管理列表"
error: "错误"
-somethingHappened: "出现了一些问题!"
+somethingHappened: "出错了"
retry: "重试"
pageLoadError: "页面加载失败。"
pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。"
@@ -154,6 +158,7 @@ editList: "编辑列表"
selectChannel: "选择频道"
selectAntenna: "选择天线"
editAntenna: "编辑天线"
+createAntenna: "创建天线"
selectWidget: "选择小工具"
editWidgets: "编辑部件"
editWidgetsExit: "完成编辑"
@@ -165,7 +170,7 @@ emojiUrl: "emoji 地址"
addEmoji: "添加表情符号"
settingGuide: "推荐配置"
cacheRemoteFiles: "缓存远程文件"
-cacheRemoteFilesDescription: "启用此设定时,将在此服务器上缓存远程文件。虽然可以加快图片显示的速度,但是相对的会消耗大量的服务器存储空间。用户角色内的网盘容量决定了这个远程用户能在服务器上保留保留多少缓存。当超出了这个限制时,旧的文件将从缓存中被删除,成为链接。当禁用此设定时,则是从一开始就将远程文件保留为链接。此时推荐将 default.yml 的 proxyRemoteFiles 设置为 true 以优化缩略图生成及保护用户隐私。"
+cacheRemoteFilesDescription: "启用此设定时,将在此服务器上缓存远程文件。虽然可以加快图片显示的速度,但是相对的会消耗大量的服务器存储空间。用户角色内的网盘容量决定了这个远程用户能在服务器上保留多少缓存。当超出了这个限制时,旧的文件将从缓存中被删除,成为链接。当禁用此设定时,则是从一开始就将远程文件保留为链接。此时推荐将 default.yml 的 proxyRemoteFiles 设置为 true 以优化缩略图生成及保护用户隐私。"
youCanCleanRemoteFilesCache: "可以使用文件管理的🗑️按钮来删除所有的缓存。"
cacheRemoteSensitiveFiles: "缓存远程敏感媒体文件"
cacheRemoteSensitiveFilesDescription: "如果禁用这项设定,远程服务器的敏感媒体将不会被缓存,而是直接链接。"
@@ -180,6 +185,10 @@ addAccount: "添加账户"
reloadAccountsList: "更新账户列表"
loginFailed: "登录失败"
showOnRemote: "转到所在服务器显示"
+continueOnRemote: "转到所在服务器继续"
+chooseServerOnMisskeyHub: "从 Misskey Hub 选择服务器"
+specifyServerHost: "直接输入服务器域名"
+inputHostName: "请输入域名"
general: "常规设置"
wallpaper: "壁纸"
setWallpaper: "设置壁纸"
@@ -190,6 +199,7 @@ followConfirm: "你确定要关注 {name} 吗?"
proxyAccount: "代理账户"
proxyAccountDescription: "代理账户是在某些情况下替代用户进行远程关注用的账户。 例如说,当用户将一位远程用户放入一个列表中时,如果本地服务器上没有任何人关注这位远程用户,则这位远程用户的账户活动将不会被送到本地服务器上。作为替代,此时将使用代理账户进行关注。"
host: "主机名"
+selectSelf: "选择自己"
selectUser: "选择用户"
recipient: "收件人"
annotation: "注解"
@@ -203,8 +213,9 @@ charts: "图表"
perHour: "每小时"
perDay: "每天"
stopActivityDelivery: "停止发送活动"
-blockThisInstance: "阻止此服务器向本服务器推流"
-silenceThisInstance: "使服务器静音"
+blockThisInstance: "封锁此服务器"
+silenceThisInstance: "静音此服务器"
+mediaSilenceThisInstance: "隐藏此服务器的媒体文件"
operations: "操作"
software: "软件"
version: "版本"
@@ -223,9 +234,13 @@ clearQueueConfirmText: "未送达的帖子将不会被投递。 通常无需执
clearCachedFiles: "清除缓存"
clearCachedFilesConfirm: "确定要清除所有缓存的远程文件?"
blockedInstances: "被封锁的服务器"
-blockedInstancesDescription: "设定要封锁的服务器,以换行来进行分割。被封锁的服务器将无法与本服务器进行交换通讯。子域名也同样会被封锁。"
+blockedInstancesDescription: "设定要封锁的服务器,以换行分隔。被封锁的服务器将无法与本服务器进行交换通讯。子域名也同样会被封锁。"
silencedInstances: "被静音的服务器"
-silencedInstancesDescription: "设置要静音的服务器,以换行符分隔。被静音的服务器内所有的账户将默认处于「静音」状态,仅能发送关注请求,并且在未关注状态下无法提及本地账户。被阻止的实例不受影响。"
+silencedInstancesDescription: "设置要静音的服务器,以换行分隔。被静音的服务器内所有的账户将默认处于「静音」状态,仅能发送关注请求,并且在未关注状态下无法提及本地账户。被阻止的实例不受影响。"
+mediaSilencedInstances: "已隐藏媒体文件的服务器"
+mediaSilencedInstancesDescription: "设置要隐藏媒体文件的服务器,以换行分隔。被设置为隐藏媒体文件服务器内所有账号的文件均按照「敏感内容」处理,且将无法使用自定义表情符号。被阻止的实例不受影响。"
+federationAllowedHosts: "允许联合的服务器"
+federationAllowedHostsDescription: "设定允许联合的服务器,以换行分隔。"
muteAndBlock: "静音/拉黑"
mutedUsers: "已静音用户"
blockedUsers: "已拉黑的用户"
@@ -243,7 +258,7 @@ noCustomEmojis: "没有自定义表情符号"
noJobs: "没有任务"
federating: "联合中"
blocked: "已拉黑"
-suspended: "停止推流"
+suspended: "停止投递"
all: "全部"
subscribing: "已订阅"
publishing: "投递中"
@@ -324,6 +339,7 @@ renameFolder: "重命名文件夹"
deleteFolder: "删除文件夹"
folder: "文件夹"
addFile: "添加文件"
+showFile: "显示文件"
emptyDrive: "网盘中无文件"
emptyFolder: "此文件夹中无文件"
unableToDelete: "无法删除"
@@ -351,7 +367,7 @@ instanceName: "服务器名称"
instanceDescription: "服务器简介"
maintainerName: "管理员名称"
maintainerEmail: "管理员电子邮箱"
-tosUrl: "服务条款 URL"
+tosUrl: "服务条款地址"
thisYear: "今年"
thisMonth: "本月"
today: "今天"
@@ -433,11 +449,12 @@ administrator: "管理员"
token: "Token (令牌)"
2fa: "双因素认证"
setupOf2fa: "设置双因素认证"
-totp: "身份验证应用"
-totpDescription: "使用认证应用输入一次性密码。"
+totp: "验证器"
+totpDescription: "使用验证器输入一次性密码"
moderator: "监察员"
moderation: "管理"
moderationNote: "管理笔记"
+moderationNoteDescription: "可以用来记录仅在管理员之间共享的笔记。"
addModerationNote: "添加管理笔记"
moderationLogs: "管理日志"
nUsersMentioned: "{n} 被提到"
@@ -477,6 +494,7 @@ noMessagesYet: "现在没有新的聊天"
newMessageExists: "新信息"
onlyOneFileCanBeAttached: "只能添加一个附件"
signinRequired: "请先登录"
+signinOrContinueOnRemote: "若要继续,需要转到您所使用的实例,或者在此服务器上注册或登录。"
invitations: "邀请"
invitationCode: "邀请码"
checking: "正在确认"
@@ -498,7 +516,10 @@ uiLanguage: "显示语言"
aboutX: "关于 {x}"
emojiStyle: "表情符号的样式"
native: "原生"
-disableDrawer: "不显示抽屉菜单"
+menuStyle: "菜单样式"
+style: "样式"
+drawer: "抽屉"
+popup: "弹窗"
showNoteActionsOnlyHover: "仅在悬停时显示帖子操作"
showReactionsCount: "显示帖子的回应数"
noHistory: "没有历史记录"
@@ -581,6 +602,8 @@ ascendingOrder: "升序"
descendingOrder: "降序"
scratchpad: "AiScript 控制台"
scratchpadDescription: "AiScript 控制台为 AiScript 提供了实验环境。您可以编写代码与 Misskey 交互,运行并查看结果。"
+uiInspector: "UI 检查器"
+uiInspectorDescription: "查看所有内存中由 UI 组件生成出的实例。UI 组件由 UI:C 系列函数所生成。"
output: "输出"
script: "脚本"
disablePagesScript: "禁用页面脚本"
@@ -683,7 +706,7 @@ useGlobalSettingDesc: "启用时,将使用账户通知设置。关闭时,则
other: "其他"
regenerateLoginToken: "重新生成登录令牌"
regenerateLoginTokenDescription: "重新生成用于登录的内部令牌。通常您不需要这样做。重新生成后,您将在所有设备上登出。"
-theKeywordWhenSearchingForCustomEmoji: "这将是搜素自定义表情符号时的关键词。"
+theKeywordWhenSearchingForCustomEmoji: "这将是搜索自定义表情符号时的关键词。"
setMultipleBySeparatingWithSpace: "您可以使用空格分隔多个项目。"
fileIdOrUrl: "文件 ID 或者 URL"
behavior: "行为"
@@ -697,10 +720,7 @@ abuseReported: "内容已发送。感谢您提交信息。"
reporter: "举报者"
reporteeOrigin: "举报来源"
reporterOrigin: "举报者来源"
-forwardReport: "将该举报信息转发给远程服务器"
-forwardReportIsAnonymous: "在远程实例上显示的报告者是匿名的系统账号,而不是您的账号。"
send: "发送"
-abuseMarkAsResolved: "处理完毕"
openInNewTab: "在新标签页中打开"
openInSideView: "在侧边栏中打开"
defaultNavigationBehaviour: "默认导航"
@@ -837,6 +857,7 @@ administration: "管理"
accounts: "账户"
switch: "切换"
noMaintainerInformationWarning: "管理人员信息未设置。"
+noInquiryUrlWarning: "尚未设置联络地址。"
noBotProtectionWarning: "Bot 防御未设置。"
configure: "设置"
postToGallery: "发送到图库"
@@ -848,7 +869,7 @@ shareWithNote: "在帖子中分享"
ads: "广告"
expiration: "截止时间"
startingperiod: "开始时间"
-memo: "便笺"
+memo: "备注"
priority: "优先级"
high: "高"
middle: "中"
@@ -901,6 +922,7 @@ followersVisibility: "关注者的公开范围"
continueThread: "查看更多帖子"
deleteAccountConfirm: "将要删除账户。是否确认?"
incorrectPassword: "密码错误"
+incorrectTotp: "一次性密码不正确或已过期"
voteConfirm: "确定投给 “{choice}” ?"
hide: "隐藏"
useDrawerReactionPickerForMobile: "在移动设备上使用抽屉显示"
@@ -925,6 +947,9 @@ oneHour: "1 小时"
oneDay: "1 天"
oneWeek: "1 周"
oneMonth: "1 个月"
+threeMonths: "3 个月"
+oneYear: "1 年"
+threeDays: "3 天"
reflectMayTakeTime: "可能需要一些时间才能体现出效果。"
failedToFetchAccountInformation: "获取账户信息失败"
rateLimitExceeded: "已超过速率限制"
@@ -1048,7 +1073,7 @@ nonSensitiveOnlyForLocalLikeOnlyForRemote: "仅限非敏感内容(远程仅点
rolesAssignedToMe: "指派给自己的角色"
resetPasswordConfirm: "确定重置密码?"
sensitiveWords: "敏感词"
-sensitiveWordsDescription: "将包含设置词的帖子的可见范围设置为首页。可以通过用换行符分隔来设置多个。"
+sensitiveWordsDescription: "包含这些词的帖子将只在首页可见。可用换行来设定多个词。"
sensitiveWordsDescription2: "AND 条件用空格分隔,正则表达式用斜线包裹。"
prohibitedWords: "禁用词"
prohibitedWordsDescription: "发布包含设定词汇的帖子时将出错。可用换行设定多个关键字"
@@ -1065,6 +1090,7 @@ retryAllQueuesConfirmTitle: "要再尝试一次吗?"
retryAllQueuesConfirmText: "可能会使服务器负荷在一定时间内增加"
enableChartsForRemoteUser: "生成远程用户的图表"
enableChartsForFederatedInstances: "生成远程服务器的图表"
+enableStatsForFederatedInstances: "获取远程服务器的信息"
showClipButtonInNoteFooter: "在贴文下方显示便签按钮"
reactionsDisplaySize: "回应显示大小"
limitWidthOfReaction: "限制回应的最大宽度,并将其缩小显示"
@@ -1100,6 +1126,8 @@ preservedUsernames: "保留的用户名"
preservedUsernamesDescription: "列出需要保留的用户名,使用换行来作为分割。被指定的用户名在建立账户时无法使用,但由管理员所创建的账户不受该限制。此外,现有的账户也不会受到影响。"
createNoteFromTheFile: "从文件创建帖子"
archive: "归档"
+archived: "已归档"
+unarchive: "取消归档"
channelArchiveConfirmTitle: "要将 {name} 归档吗?"
channelArchiveConfirmDescription: "归档后,在频道列表与搜索结果中不会显示,也无法发布新的贴文。"
thisChannelArchived: "该频道已被归档。"
@@ -1110,6 +1138,9 @@ preventAiLearning: "拒绝接受生成式 AI 的学习"
preventAiLearningDescription: "要求文章生成 AI 或图像生成 AI 不能够以发布的帖子和图像等内容作为学习对象。这是通过在 HTML 响应中包含 noai 标志来实现的,这不能完全阻止 AI 学习你的发布内容,并不是所有 AI 都会遵守这类请求。"
options: "选项"
specifyUser: "用户指定"
+lookupConfirm: "确定查询?"
+openTagPageConfirm: "确定打开话题标签页面?"
+specifyHost: "指定主机名"
failedToPreviewUrl: "无法预览"
update: "更新"
rolesThatCanBeUsedThisEmojiAsReaction: "可以使用表情作为回应的角色"
@@ -1172,15 +1203,15 @@ followingOrFollower: "关注中或关注者"
fileAttachedOnly: "仅限媒体"
showRepliesToOthersInTimeline: "在时间线中包含给别人的回复"
hideRepliesToOthersInTimeline: "在时间线中隐藏给别人的回复"
-showRepliesToOthersInTimelineAll: "在时间线中包含现在关注的所有人的回复"
-hideRepliesToOthersInTimelineAll: "在时间线中隐藏现在关注的所有人的回复"
-confirmShowRepliesAll: "此操作不可撤销。确认要在时间线中包含现在关注的所有人的回复吗?"
-confirmHideRepliesAll: "此操作不可撤销。确认要在时间线中隐藏现在关注的所有人的回复吗?"
+showRepliesToOthersInTimelineAll: "在时间线中显示所有现在关注的人的回复"
+hideRepliesToOthersInTimelineAll: "在时间线中隐藏所有现在关注的人的回复"
+confirmShowRepliesAll: "此操作不可撤销。确认要在时间线中显示所有现在关注的人的回复吗?"
+confirmHideRepliesAll: "此操作不可撤销。确认要在时间线中隐藏所有现在关注的人的回复吗?"
externalServices: "外部服务"
sourceCode: "源代码"
sourceCodeIsNotYetProvided: "还未提供源代码。要解决此问题请联系管理员。"
repositoryUrl: "仓库地址"
-repositoryUrlDescription: "若源代码所在的仓库是公开的,请填入对应的 URL。若是按原样使用 Misskey(并未追加或者修改代码)的情况请填入 https://github.com/misskey-dev/misskey。"
+repositoryUrlDescription: "若源代码所在的仓库是公开的,请填入对应的 URL。若并未追加或者修改 Misskey 的代码,请填入 https://github.com/misskey-dev/misskey。"
repositoryUrlOrTarballRequired: "若仓库并未公开,则需要提供 tarball 作为替代。详情请看 .config/example.yml。"
feedback: "反馈"
feedbackUrl: "反馈地址"
@@ -1241,6 +1272,52 @@ keepOriginalFilenameDescription: "若关闭此设置,上传文件时文件名
noDescription: "没有描述"
alwaysConfirmFollow: "总是确认关注"
inquiry: "联系我们"
+tryAgain: "请再试一次"
+confirmWhenRevealingSensitiveMedia: "显示敏感内容前需要确认"
+sensitiveMediaRevealConfirm: "这是敏感内容。是否显示?"
+createdLists: "已创建的列表"
+createdAntennas: "已创建的天线"
+fromX: "从 {x}"
+genEmbedCode: "生成嵌入代码"
+noteOfThisUser: "此用户的帖子"
+clipNoteLimitExceeded: "无法再往此便签内添加更多帖子"
+performance: "性能"
+modified: "有变更"
+discard: "取消"
+thereAreNChanges: "有 {n} 处更改"
+signinWithPasskey: "使用通行密钥登录"
+unknownWebAuthnKey: "此通行密钥未注册。"
+passkeyVerificationFailed: "验证通行密钥失败。"
+passkeyVerificationSucceededButPasswordlessLoginDisabled: "通行密钥验证成功,但账户未开启无密码登录。"
+messageToFollower: "给关注者的消息"
+target: "对象"
+testCaptchaWarning: "此功能为测试 CAPTCHA 用。请勿在正式环境中使用。"
+prohibitedWordsForNameOfUser: "用户名中禁止的词"
+prohibitedWordsForNameOfUserDescription: "更改用户名时,如果用户名中包含此列表里的词汇,用户的改名请求将被拒绝。持有管理员权限的用户不受此限制。"
+yourNameContainsProhibitedWords: "目标用户名包含违禁词"
+yourNameContainsProhibitedWordsDescription: "用户名内含有违禁词。若想使用此用户名,请联系服务器管理员。"
+thisContentsAreMarkedAsSigninRequiredByAuthor: "根据发帖者的设定,需要登录才能显示"
+lockdown: "锁定"
+pleaseSelectAccount: "请选择帐户"
+_accountSettings:
+ requireSigninToViewContents: "需要登录才能显示内容"
+ requireSigninToViewContentsDescription1: "您发布的所有帖子将变成需要登入后才会显示。有望防止爬虫收集各种信息。"
+ requireSigninToViewContentsDescription2: "没有 URL 预览(OGP)、内嵌网页、引用帖子的功能的服务器也将无法显示。"
+ requireSigninToViewContentsDescription3: "这些限制可能不适用于联合到远程服务器的内容。"
+ makeNotesFollowersOnlyBefore: "可将过去的帖子设为仅关注者可见"
+ makeNotesFollowersOnlyBeforeDescription: "开启此设定时,超过设定的时间或日期后,帖子将变为仅关注者可见。关闭后帖子的公开状态将恢复成原本的设定。"
+ makeNotesHiddenBefore: "将过去的帖子设为私密"
+ makeNotesHiddenBeforeDescription: "开启此设定时,超过设定的时间或日期后,帖子将变为仅自己可见。关闭后帖子的公开状态将恢复成原本的设定。"
+ mayNotEffectForFederatedNotes: "与远程服务器联合的帖子在远端可能会没有效果。"
+ notesHavePassedSpecifiedPeriod: "超过指定时间的帖子"
+ notesOlderThanSpecifiedDateAndTime: "指定日期前的帖子"
+_abuseUserReport:
+ forward: "转发"
+ forwardDescription: "目标是匿名系统账户,将把举报转发给远程服务器。"
+ resolve: "解决"
+ accept: "确认"
+ reject: "拒绝"
+ resolveTutorial: "如果举报内容有理且已解决,选择「确认」将案件以肯定的态度标记为已解决。\n如果举报内容站不住脚,选择「拒绝」将案件以否定的态度标记为已解决。"
_delivery:
status: "投递状态"
stop: "停止投递"
@@ -1375,6 +1452,10 @@ _serverSettings:
fanoutTimelineDescription: "当启用时,可显著提高获取各种时间线时的性能,并减轻数据库的负荷。但是相对的 Redis 的内存使用量将会增加。如果服务器的内存不是很大,又或者运行不稳定的话可以把它关掉。"
fanoutTimelineDbFallback: "回退到数据库"
fanoutTimelineDbFallbackDescription: "当启用时,若时间线未被缓存,则将额外查询数据库。禁用该功能可通过不执行回退处理进一步减少服务器负载,但会限制可检索的时间线范围。"
+ reactionsBufferingDescription: "开启时可显著提高发送回应时的性能,及减轻数据库负荷。但 Redis 的内存用量会相应增加。"
+ inquiryUrl: "联络地址"
+ inquiryUrlDescription: "用来指定诸如向服务运营商咨询的论坛地址,或记载了运营商联系方式之类的网页地址。"
+ thisSettingWillAutomaticallyOffWhenModeratorsInactive: "若在一段时间内没有检测到管理活动,为防止垃圾信息,此设定将自动关闭。"
_accountMigration:
moveFrom: "从别的账号迁移到此账户"
moveFromSub: "为另一个账户建立别名"
@@ -1574,7 +1655,7 @@ _achievements:
_postedAt0min0sec:
title: "报时"
description: "在 0 点发布一篇帖子"
- flavor: "嘣 嘣 嘣 Biu——!"
+ flavor: "嘟 · 嘟 · 嘟 · 哔——"
_selfQuote:
title: "自我引用"
description: "引用了自己的帖子"
@@ -1623,8 +1704,8 @@ _achievements:
flavor: "今年也请对本服务器多多指教!"
_cookieClicked:
title: "点击饼干小游戏"
- description: "点击了可疑的饼干"
- flavor: "是不是软件有问题?"
+ description: "点击了饼干"
+ flavor: "用错软件了?"
_brainDiver:
title: "Brain Diver"
description: "发布了包含 Brain Diver 链接的帖子"
@@ -1641,6 +1722,7 @@ _achievements:
_bubbleGameDoubleExplodingHead:
title: "两个🤯"
description: "你合成出了2个游戏里最大的Emoji"
+ flavor: "大约能 装满 这些便当盒 🤯 🤯 (比划)"
_role:
new: "创建角色"
edit: "编辑角色"
@@ -1670,8 +1752,8 @@ _role:
descriptionOfIsExplorable: "打开后将公开角色时间线。如果角色不是公开的,就无法公开时间线。"
displayOrder: "显示顺序"
descriptionOfDisplayOrder: "数字越大,显示位置越靠前。"
- canEditMembersByModerator: "允许监察者编辑成员"
- descriptionOfCanEditMembersByModerator: "如果选中,监察者和管理员都能够为用户分配/取消分配角色。如果未选中,则只有管理员可以执行此操作。"
+ canEditMembersByModerator: "允许监察员编辑成员"
+ descriptionOfCanEditMembersByModerator: "如果选中,监察员和管理员都能够为用户分配/取消分配角色。如果未选中,则只有管理员可以执行此操作。"
priority: "优先级"
_priority:
low: "低"
@@ -1690,6 +1772,7 @@ _role:
canManageAvatarDecorations: "管理头像挂件"
driveCapacity: "网盘容量"
alwaysMarkNsfw: "总是将文件标记为 NSFW"
+ canUpdateBioMedia: "可以更新头像和横幅"
pinMax: "帖子置顶数量限制"
antennaMax: "可创建的最大天线数量"
wordMuteMax: "屏蔽词的字数限制"
@@ -1704,6 +1787,11 @@ _role:
canSearchNotes: "是否可以搜索帖子"
canUseTranslator: "使用翻译功能"
avatarDecorationLimit: "可添加头像挂件的最大个数"
+ canImportAntennas: "允许导入天线"
+ canImportBlocking: "允许导入拉黑列表"
+ canImportFollowing: "允许导入关注列表"
+ canImportMuting: "允许导入屏蔽列表"
+ canImportUserLists: "允许导入用户列表"
_condition:
roleAssignedTo: "已分配给手动角色"
isLocal: "是本地用户"
@@ -1921,7 +2009,6 @@ _theme:
buttonBg: "按钮背景"
buttonHoverBg: "按钮背景(悬停)"
inputBorder: "输入框边框"
- listItemHoverBg: "下拉列表项目背景(悬停)"
driveFolderBg: "网盘的文件夹背景"
wallpaperOverlay: "壁纸叠加层"
badge: "徽章"
@@ -1933,8 +2020,6 @@ _sfx:
note: "帖子"
noteMy: "我的帖子"
notification: "通知"
- antenna: "天线接收"
- channel: "频道通知"
reaction: "选择回应时"
_soundSettings:
driveFile: "使用网盘内的音频"
@@ -1943,6 +2028,7 @@ _soundSettings:
driveFileTypeWarnDescription: "请选择音频文件"
driveFileDurationWarn: "音频过长"
driveFileDurationWarnDescription: "使用长音频可能会影响 Misskey 的使用。即使这样也要继续吗?"
+ driveFileError: "无法读取声音。请更改设置。"
_ago:
future: "未来"
justNow: "最近"
@@ -1969,7 +2055,7 @@ _time:
day: "日"
_2fa:
alreadyRegistered: "此设备已被注册"
- registerTOTP: "开始设置认证应用"
+ registerTOTP: "开始设置验证器"
step1: "首先,在您的设备上安装验证应用,例如 {a} 或 {b}。"
step2: "然后,扫描屏幕上显示的二维码。"
step2Uri: "如果使用桌面应用程序的话,请输入下面的 URI"
@@ -1978,23 +2064,23 @@ _2fa:
setupCompleted: "设置完成"
step4: "从现在开始,任何登录操作都将要求您提供动态口令。"
securityKeyNotSupported: "您的浏览器不支持安全密钥。"
- registerTOTPBeforeKey: "要注册安全密钥或 Passkey,请先设置验证器应用程序。"
+ registerTOTPBeforeKey: "要注册安全密钥或 Passkey,请先设置验证器。"
securityKeyInfo: "注册兼容 WebAuthn 的密钥,例如支持 FIDO2 的硬件安全密钥、设备上的生物识别功能、PIN 码以及 Passkey 等。"
registerSecurityKey: "注册安全密钥或 Passkey"
securityKeyName: "输入密钥名称"
tapSecurityKey: "请按照浏览器说明操作来注册安全密钥或 Passkey。"
removeKey: "删除安全密钥"
removeKeyConfirm: "您确定要删除 {name} 吗?"
- whyTOTPOnlyRenew: "如果注册了安全密钥,则无法取消验证器应用程序上的设置。"
- renewTOTP: "重置验证器应用程序"
- renewTOTPConfirm: "当前验证器应用程序的验证码将不再有效"
+ whyTOTPOnlyRenew: "当注册了安全密钥时,无法取消使用验证器。"
+ renewTOTP: "重置验证器"
+ renewTOTPConfirm: "当前验证器的验证码及备用代码已失效"
renewTOTPOk: "重新配置"
renewTOTPCancel: "不用,谢谢"
checkBackupCodesBeforeCloseThisWizard: "在关闭此窗口前,请确认下面的备用代码"
backupCodes: "备用代码"
- backupCodesDescription: "如果无法使用认证应用,可以使用以下的备用代码来访问账户。请务必将这些代码保存在安全的地方。每个代码仅可使用一次。"
- backupCodeUsedWarning: "已使用备用代码。如果无法使用认证应用,请尽快重新设定。"
- backupCodesExhaustedWarning: "已使用完所有的备用代码。如果无法使用认证应用,将无法再访问您的账户。请再次设定认证应用。"
+ backupCodesDescription: "如果无法使用验证器,可以使用以下的备用代码来访问账户。请务必将这些代码保存在安全的地方。每个代码仅可使用一次。"
+ backupCodeUsedWarning: "已使用备用代码。若验证器无法使用,请尽快重置验证器。"
+ backupCodesExhaustedWarning: "已使用完所有的备用代码。若验证器无法使用,则无法再访问您的账户。请重置验证器。"
moreDetailedGuideHere: "此处为详细指南"
_permissions:
"read:account": "查看账户信息"
@@ -2089,8 +2175,11 @@ _auth:
permissionAsk: "这个应用程序需要以下权限"
pleaseGoBack: "请返回到应用程序"
callback: "回到应用程序"
+ accepted: "已允许访问"
denied: "拒绝访问"
+ scopeUser: "以下面的用户进行操作"
pleaseLogin: "在对应用进行授权许可之前,请先登录"
+ byClickingYouWillBeRedirectedToThisUrl: "允许访问后将会自动重定向到以下 URL"
_antennaSources:
all: "所有帖子"
homeTimeline: "已关注用户的帖子"
@@ -2199,6 +2288,9 @@ _profile:
changeBanner: "修改横幅"
verifiedLinkDescription: "如果将内容设置为 URL,当链接所指向的网页内包含自己的个人资料链接时,可以显示一个已验证图标。"
avatarDecorationMax: "最多可添加 {max} 个挂件"
+ followedMessage: "被关注时显示的消息"
+ followedMessageDescription: "可以设置被关注时向对方显示的短消息。"
+ followedMessageDescriptionForLockedAccount: "需要批准才能关注的情况下,消息是在请求被批准后显示。"
_exportOrImport:
allNotes: "所有帖子"
favoritedNotes: "收藏的帖子"
@@ -2291,6 +2383,7 @@ _pages:
eyeCatchingImageSet: "设置封面图片"
eyeCatchingImageRemove: "删除封面图片"
chooseBlock: "添加块"
+ enterSectionTitle: "输入会话标题"
selectType: "选择类型"
contentBlocks: "内容"
inputBlocks: "输入"
@@ -2336,6 +2429,8 @@ _notification:
renotedBySomeUsers: "{n} 人转发了"
followedBySomeUsers: "被 {n} 人关注"
flushNotification: "重置通知历史"
+ exportOfXCompleted: "已完成 {x} 个导出"
+ login: "有新的登录"
_types:
all: "全部"
note: "用户的新帖子"
@@ -2350,6 +2445,9 @@ _notification:
followRequestAccepted: "关注请求已通过"
roleAssigned: "授予的角色"
achievementEarned: "取得的成就"
+ exportCompleted: "已完成导出"
+ login: "登录"
+ test: "测试通知"
app: "关联应用的通知"
_actions:
followBack: "回关"
@@ -2398,9 +2496,10 @@ _drivecleaner:
orderByCreatedAtAsc: "按添加日期降序排列"
_webhookSettings:
createWebhook: "创建 Webhook"
+ modifyWebhook: "编辑 webhook"
name: "名称"
secret: "密钥"
- events: "何时运行 Webhook"
+ trigger: "触发器"
active: "已启用"
_events:
follow: "关注时"
@@ -2410,6 +2509,29 @@ _webhookSettings:
renote: "被转发时"
reaction: "被回应时"
mention: "被提及时"
+ _systemEvents:
+ abuseReport: "当收到举报时"
+ abuseReportResolved: "当举报被处理时"
+ userCreated: "当用户被创建时"
+ inactiveModeratorsWarning: "当管理员在一段时间内不活跃时"
+ inactiveModeratorsInvitationOnlyChanged: "当因为管理员在一段时间内不活跃,导致服务器变为邀请制时"
+ deleteConfirm: "要删除 webhook 吗?"
+ testRemarks: "点击开关右侧的按钮,可以发送使用假数据的测试 Webhook。"
+_abuseReport:
+ _notificationRecipient:
+ createRecipient: "新建举报通知"
+ modifyRecipient: "编辑举报通知"
+ recipientType: "通知类型"
+ _recipientType:
+ mail: "邮箱"
+ webhook: "Webhook"
+ _captions:
+ mail: "当收到新举报时,向持有监察员权限的用户发送通知邮件"
+ webhook: "当收到新举报及举报被处理时,使用指定的 SystemWebhook 发送通知"
+ keywords: "关键字"
+ notifiedUser: "通知的用户"
+ notifiedWebhook: "使用的 webhook"
+ deleteConfirm: "要删除通知吗?"
_moderationLogTypes:
createRole: "创建角色"
deleteRole: "删除角色"
@@ -2438,6 +2560,8 @@ _moderationLogTypes:
markSensitiveDriveFile: "标记网盘文件为敏感媒体"
unmarkSensitiveDriveFile: "取消标记网盘文件为敏感媒体"
resolveAbuseReport: "处理举报"
+ forwardAbuseReport: "转发举报"
+ updateAbuseReportNote: "更新举报用管理笔记"
createInvitation: "生成邀请码"
createAd: "创建了广告"
deleteAd: "删除了广告"
@@ -2447,6 +2571,16 @@ _moderationLogTypes:
deleteAvatarDecoration: "删除头像挂件"
unsetUserAvatar: "清除用户头像"
unsetUserBanner: "清除用户横幅"
+ createSystemWebhook: "新建了 SystemWebhook"
+ updateSystemWebhook: "更新了 SystemWebhook"
+ deleteSystemWebhook: "删除了 SystemWebhook"
+ createAbuseReportNotificationRecipient: "新建了举报通知"
+ updateAbuseReportNotificationRecipient: "更新了举报通知"
+ deleteAbuseReportNotificationRecipient: "删除了举报通知"
+ deleteAccount: "删除了账户"
+ deletePage: "删除了页面"
+ deleteFlash: "删除了 Play"
+ deleteGalleryPost: "删除了图库稿件"
_fileViewer:
title: "文件信息"
type: "文件类型"
@@ -2578,3 +2712,28 @@ _mediaControls:
pip: "画中画"
playbackRate: "播放速度"
loop: "循环播放"
+_contextMenu:
+ title: "上下文菜单"
+ app: "应用"
+ appWithShift: "Shift 键应用"
+ native: "浏览器的用户界面"
+_embedCodeGen:
+ title: "自定义嵌入代码"
+ header: "显示标题"
+ autoload: "连续加载(不推荐)"
+ maxHeight: "最大高度"
+ maxHeightDescription: "若将最大值设为 0 则不限制最大高度。为防止小工具无限增高,建议设置一下。"
+ maxHeightWarn: "最大高度限制已禁用(0)。若这不是您想要的效果,请将最大高度设一个值。"
+ previewIsNotActual: "由于超出了预览画面可显示的范围,因此显示内容会与实际嵌入时有所不同。"
+ rounded: "圆角"
+ border: "外边框"
+ applyToPreview: "应用预览"
+ generateCode: "生成嵌入代码"
+ codeGenerated: "已生成代码"
+ codeGeneratedDescription: "将生成的代码贴到网站上来使用。"
+_selfXssPrevention:
+ warning: "警告"
+ title: "「在此处粘贴什么东西」是欺诈行为。"
+ description1: "如果在此处粘贴了什么,恶意用户可能会接管账户或者盗取个人资料。"
+ description2: "如果不能完全理解将要粘贴的内容,%c 请立即停止操作并关闭这个窗口。"
+ description3: "详情请看这里。{link}"
diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml
index aac3f7662c..16afeed0f8 100644
--- a/locales/zh-TW.yml
+++ b/locales/zh-TW.yml
@@ -8,6 +8,9 @@ search: "搜尋"
notifications: "通知"
username: "使用者名稱"
password: "密碼"
+initialPasswordForSetup: "初始設定用的密碼"
+initialPasswordIsIncorrect: "初始設定用的密碼錯誤。"
+initialPasswordForSetupDescription: "如果您自己安裝了 Misskey,請使用您在設定檔中輸入的密碼。\n如果您使用 Misskey 的託管服務之類的服務,請使用提供的密碼。\n如果您尚未設定密碼,請將其留空並繼續。"
forgotPassword: "忘記密碼"
fetchingAsApObject: "從聯邦宇宙取得中..."
ok: "OK"
@@ -60,6 +63,7 @@ copyFileId: "複製檔案 ID"
copyFolderId: "複製資料夾ID"
copyProfileUrl: "複製個人資料網址"
searchUser: "搜尋使用者"
+searchThisUsersNotes: "搜尋這個使用者的貼文"
reply: "回覆"
loadMore: "載入更多"
showMore: "載入更多"
@@ -154,6 +158,7 @@ editList: "編輯清單"
selectChannel: "選擇頻道"
selectAntenna: "選擇天線"
editAntenna: "編輯天線"
+createAntenna: "建立天線"
selectWidget: "選擇小工具"
editWidgets: "編輯小工具"
editWidgetsExit: "完成"
@@ -180,6 +185,10 @@ addAccount: "新增帳戶"
reloadAccountsList: "更新帳戶清單的資訊"
loginFailed: "登入失敗"
showOnRemote: "轉到所在實例顯示"
+continueOnRemote: "在遠端伺服器繼續"
+chooseServerOnMisskeyHub: "從 Misskey Hub 選擇伺服器"
+specifyServerHost: "直接指定伺服器網域"
+inputHostName: "請輸入域名"
general: "一般"
wallpaper: "桌布"
setWallpaper: "設定桌布"
@@ -190,6 +199,7 @@ followConfirm: "你真的要追隨{name}嗎?"
proxyAccount: "代理帳戶"
proxyAccountDescription: "代理帳戶是在特定條件下充當遠端追隨者的帳戶。例如,當使用者新增遠端使用者至其列表時,若沒有本地使用者追隨該遠端使用者,則其活動將不會傳送至伺服器,此時便會由代理帳戶代為追隨以解決問題。"
host: "主機"
+selectSelf: "選擇自己"
selectUser: "選取使用者"
recipient: "收件人"
annotation: "註解"
@@ -205,6 +215,7 @@ perDay: "每日"
stopActivityDelivery: "停止發送活動"
blockThisInstance: "封鎖此伺服器"
silenceThisInstance: "禁言此伺服器"
+mediaSilenceThisInstance: "將這個伺服器的媒體設為禁言"
operations: "操作"
software: "軟體"
version: "版本"
@@ -226,6 +237,10 @@ blockedInstances: "已封鎖的伺服器"
blockedInstancesDescription: "請逐行輸入需要封鎖的伺服器。已封鎖的伺服器將無法與本伺服器進行通訊。"
silencedInstances: "被禁言的伺服器"
silencedInstancesDescription: "設定要禁言的伺服器主機名稱,以換行分隔。隸屬於禁言伺服器的所有帳戶都將被視為「禁言帳戶」,只能發出「追隨請求」,而且無法提及未追隨的本地帳戶。這不會影響已封鎖的實例。"
+mediaSilencedInstances: "媒體被禁言的伺服器"
+mediaSilencedInstancesDescription: "設定您想要對媒體設定禁言的伺服器,以換行符號區隔。來自被媒體禁言的伺服器所屬帳戶的所有檔案都會被視為敏感檔案,且自訂表情符號不能使用。被封鎖的伺服器不受影響。"
+federationAllowedHosts: "允許聯邦通訊的伺服器"
+federationAllowedHostsDescription: "設定允許聯邦通訊的伺服器主機,以換行符號分隔。"
muteAndBlock: "靜音和封鎖"
mutedUsers: "被靜音的使用者"
blockedUsers: "被封鎖的使用者"
@@ -243,10 +258,10 @@ noCustomEmojis: "沒有自訂的表情符號"
noJobs: "沒有任務"
federating: "聯邦運作中"
blocked: "已封鎖"
-suspended: "已凍結"
+suspended: "停止發送"
all: "全部"
subscribing: "訂閱中"
-publishing: "直播中"
+publishing: "發送中"
notResponding: "沒有回應"
instanceFollowing: "追隨的伺服器"
instanceFollowers: "伺服器的追隨者"
@@ -324,6 +339,7 @@ renameFolder: "重新命名資料夾"
deleteFolder: "刪除資料夾"
folder: "資料夾"
addFile: "加入附件"
+showFile: "瀏覽文件"
emptyDrive: "雲端硬碟為空"
emptyFolder: "資料夾為空"
unableToDelete: "無法刪除"
@@ -343,7 +359,7 @@ reload: "重新整理"
doNothing: "無視"
reloadConfirm: "確定要重新整理嗎?"
watch: "關注"
-unwatch: "取消追隨"
+unwatch: "取消關注"
accept: "接受"
reject: "拒絕"
normal: "正常"
@@ -438,6 +454,7 @@ totpDescription: "以驗證應用程式輸入一次性密碼"
moderator: "審查員"
moderation: "審查"
moderationNote: "管理筆記"
+moderationNoteDescription: "您可以編寫僅在審查員之間共用的註解。"
addModerationNote: "新增管理筆記"
moderationLogs: "管理日誌"
nUsersMentioned: "被 {n} 個人提及"
@@ -477,6 +494,7 @@ noMessagesYet: "沒有訊息"
newMessageExists: "有新的訊息"
onlyOneFileCanBeAttached: "只能加入一個附件"
signinRequired: "請先登入"
+signinOrContinueOnRemote: "若要繼續,需前往您所在的伺服器,或者註冊並登入此伺服器"
invitations: "邀請"
invitationCode: "邀請碼"
checking: "確認中"
@@ -498,8 +516,11 @@ uiLanguage: "介面語言"
aboutX: "關於{x}"
emojiStyle: "表情符號的風格"
native: "原生"
-disableDrawer: "不顯示下拉式選單"
-showNoteActionsOnlyHover: "僅在游標停留時顯示貼文的操作選項"
+menuStyle: "選單風格"
+style: "風格"
+drawer: "側邊欄"
+popup: "彈出式視窗"
+showNoteActionsOnlyHover: "僅在游標停留時顯示貼文的"
showReactionsCount: "顯示貼文的反應數目"
noHistory: "沒有歷史紀錄"
signinHistory: "登入歷史"
@@ -581,6 +602,8 @@ ascendingOrder: "昇冪"
descendingOrder: "降冪"
scratchpad: "暫存記憶體"
scratchpadDescription: "AiScript 控制臺為 AiScript 的實驗環境。您可以在此編寫、執行和確認程式碼與 Misskey 互動的結果。"
+uiInspector: "UI 檢查"
+uiInspectorDescription: "您可以看到記憶體中存在的 UI 元件實例的清單。 UI 元件由 Ui:C: 系列函數產生。"
output: "輸出"
script: "腳本"
disablePagesScript: "停用頁面的 AiScript 腳本"
@@ -697,10 +720,7 @@ abuseReported: "檢舉完成。感謝您的報告。"
reporter: "檢舉者"
reporteeOrigin: "檢舉來源"
reporterOrigin: "檢舉者來源"
-forwardReport: "將報告轉送給遠端伺服器"
-forwardReportIsAnonymous: "在遠端實例上看不到您的資訊,顯示的報告者是匿名的系统帳戶。"
send: "發送"
-abuseMarkAsResolved: "處理完畢"
openInNewTab: "在新分頁中開啟"
openInSideView: "在側欄中開啟"
defaultNavigationBehaviour: "預設導航"
@@ -837,6 +857,7 @@ administration: "管理"
accounts: "帳戶"
switch: "切換"
noMaintainerInformationWarning: "尚未設定管理員訊息。"
+noInquiryUrlWarning: "尚未設定聯絡表單網址。"
noBotProtectionWarning: "尚未設定 Bot 防護。"
configure: "設定"
postToGallery: "發佈到相簿"
@@ -901,6 +922,7 @@ followersVisibility: "追隨者的可見性"
continueThread: "查看更多貼文"
deleteAccountConfirm: "將要刪除帳戶。是否確定?"
incorrectPassword: "密碼錯誤。"
+incorrectTotp: "一次性密碼錯誤,或者已過期。"
voteConfirm: "確定投給「{choice}」?"
hide: "隱藏"
useDrawerReactionPickerForMobile: "在移動設備上使用抽屜顯示"
@@ -925,6 +947,9 @@ oneHour: "一小時"
oneDay: "一天"
oneWeek: "一週"
oneMonth: "一個月"
+threeMonths: "3 個月"
+oneYear: "1 年"
+threeDays: "3 日"
reflectMayTakeTime: "可能需要一些時間才會出現效果。"
failedToFetchAccountInformation: "取得帳戶資訊失敗"
rateLimitExceeded: "已超過速率限制"
@@ -997,7 +1022,7 @@ show: "檢視"
neverShow: "不再顯示"
remindMeLater: "以後再說"
didYouLikeMisskey: "您喜歡 Misskey 嗎?"
-pleaseDonate: "Misskey 是由 {host} 使用的免費軟體。請贊助我們,讓開發得以持續!"
+pleaseDonate: "Misskey是由{host}使用的免費軟體。請贊助我們,讓開發的工作能夠持續!"
correspondingSourceIsAvailable: "對應的原始碼可以在 {anchor} 處找到。"
roles: "角色"
role: "角色"
@@ -1065,6 +1090,7 @@ retryAllQueuesConfirmTitle: "要現在重試嗎?"
retryAllQueuesConfirmText: "伺服器的負荷可能會暫時增加。"
enableChartsForRemoteUser: "生成遠端使用者的圖表"
enableChartsForFederatedInstances: "生成遠端伺服器的圖表"
+enableStatsForFederatedInstances: "取得遠端伺服器資訊"
showClipButtonInNoteFooter: "新增摘錄按鈕至貼文"
reactionsDisplaySize: "反應的顯示尺寸"
limitWidthOfReaction: "限制反應的最大寬度,並縮小顯示尺寸。"
@@ -1100,6 +1126,8 @@ preservedUsernames: "保留的使用者名稱"
preservedUsernamesDescription: "換行列舉要保留的使用者名稱。此處出現的名稱將在註冊時禁用,但由管理者建立帳戶則不受此限。此外,既有的帳戶也不受影響。"
createNoteFromTheFile: "由此檔案建立貼文"
archive: "封存"
+archived: "已封存"
+unarchive: "取消封存"
channelArchiveConfirmTitle: "要封存{name}嗎?"
channelArchiveConfirmDescription: "封存後,將不會在頻道列表與搜尋結果中顯示,也無法發佈新貼文。"
thisChannelArchived: "這個頻道已被封存。"
@@ -1110,6 +1138,9 @@ preventAiLearning: "拒絕接受生成式AI的訓練"
preventAiLearningDescription: "要求站外生成式 AI 不使用您發佈的內容訓練模型。此功能會使伺服器於 HTML 回應新增「noai」標籤,而因為要視乎 AI 會否遵守該標籤,所以此功能無法完全阻止所有 AI 使用您的內容。"
options: "選項"
specifyUser: "指定使用者"
+lookupConfirm: "要查詢嗎?"
+openTagPageConfirm: "要開啟標籤的頁面嗎?"
+specifyHost: "指定主機"
failedToPreviewUrl: "無法預覽"
update: "更新"
rolesThatCanBeUsedThisEmojiAsReaction: "可以使用此表情符號為反應的角色"
@@ -1168,8 +1199,8 @@ showRenotes: "顯示其他人的轉發貼文"
edited: "已編輯"
notificationRecieveConfig: "接受通知的設定"
mutualFollow: "互相追隨"
-followingOrFollower: "追隨中或追隨者"
-fileAttachedOnly: "顯示包含附件的貼文"
+followingOrFollower: "追隨中或者追隨者"
+fileAttachedOnly: "只顯示包含附件的貼文"
showRepliesToOthersInTimeline: "顯示給其他人的回覆"
hideRepliesToOthersInTimeline: "在時間軸上隱藏給其他人的回覆"
showRepliesToOthersInTimelineAll: "在時間軸包含追隨中所有人的回覆"
@@ -1239,14 +1270,60 @@ useNativeUIForVideoAudioPlayer: "使用瀏覽器的 UI 播放影片與音訊"
keepOriginalFilename: "保留原始檔名"
keepOriginalFilenameDescription: "如果關閉此設置,上傳時檔案名稱會自動替換為隨機字串。"
noDescription: "沒有說明文字"
-alwaysConfirmFollow: "點擊追隨時總是顯示確認訊息"
+alwaysConfirmFollow: "跟隨時總是確認"
inquiry: "聯絡我們"
+tryAgain: "請再試一次。"
+confirmWhenRevealingSensitiveMedia: "要顯示敏感媒體時需確認"
+sensitiveMediaRevealConfirm: "這是敏感媒體。確定要顯示嗎?"
+createdLists: "已建立的清單"
+createdAntennas: "已建立的天線"
+fromX: "自 {x}"
+genEmbedCode: "產生嵌入程式碼"
+noteOfThisUser: "這個使用者的貼文列表"
+clipNoteLimitExceeded: "沒辦法在這個摘錄中增加更多貼文了。"
+performance: "性能"
+modified: "已變更"
+discard: "取消"
+thereAreNChanges: "有 {n} 處的變更"
+signinWithPasskey: "使用密碼金鑰登入"
+unknownWebAuthnKey: "未註冊的金鑰。"
+passkeyVerificationFailed: "驗證金鑰失敗。"
+passkeyVerificationSucceededButPasswordlessLoginDisabled: "雖然驗證金鑰成功,但是無密碼登入的方式是停用的。"
+messageToFollower: "給追隨者的訊息"
+target: "目標 "
+testCaptchaWarning: "此功能用於 CAPTCHA 的測試。請勿在正式環境中使用。"
+prohibitedWordsForNameOfUser: "禁止使用的字詞(使用者名稱)"
+prohibitedWordsForNameOfUserDescription: "如果使用者名稱包含此清單中的任何字串,則拒絕重新命名使用者。 具有審查員權限的使用者不受此限制的影響。"
+yourNameContainsProhibitedWords: "您嘗試更改的名稱包含禁止的字串"
+yourNameContainsProhibitedWordsDescription: "名稱中包含禁止使用的字串。 如果您想使用此名稱,請聯絡您的伺服器管理員。"
+thisContentsAreMarkedAsSigninRequiredByAuthor: "作者將其設定為需要登入才能顯示。"
+lockdown: "鎖定"
+pleaseSelectAccount: "請選擇帳戶"
+_accountSettings:
+ requireSigninToViewContents: "須登入以顯示內容"
+ requireSigninToViewContentsDescription1: "必須登入才會顯示您建立的貼文等內容。可望有效防止資訊被爬蟲蒐集。"
+ requireSigninToViewContentsDescription2: "來自不支援 URL 預覽 (OGP)、 網頁嵌入和引用貼文的伺服器,也將停止顯示。"
+ requireSigninToViewContentsDescription3: "這些限制可能不適用於被聯邦發送至遠端伺服器的內容。"
+ makeNotesFollowersOnlyBefore: "讓過去的貼文僅對追隨者顯示"
+ makeNotesFollowersOnlyBeforeDescription: "啟用此功能後,超過設定的日期和時間或超過設定時間的貼文將僅對追隨者顯示。 如果您再次停用它,貼文的公開狀態也會恢復原狀。"
+ makeNotesHiddenBefore: "隱藏過去的貼文"
+ makeNotesHiddenBeforeDescription: "啟用此功能後,超過設定的日期和時間或超過設定時間的貼文將僅對自己顯示(私密化)。 如果您再次停用它,貼文的公開狀態也會恢復原狀。"
+ mayNotEffectForFederatedNotes: "聯邦發送至遠端伺服器的貼文可能會不受影響。"
+ notesHavePassedSpecifiedPeriod: "早於指定時間的貼文"
+ notesOlderThanSpecifiedDateAndTime: "指定時間和日期之前的貼文"
+_abuseUserReport:
+ forward: "轉發"
+ forwardDescription: "以匿名系統帳戶將檢舉轉發至遠端伺服器。"
+ resolve: "解決"
+ accept: "接受"
+ reject: "拒絕"
+ resolveTutorial: "如果您已回覆正當的檢舉,請選擇「接受」以將案件標記為已解決。\n 如果檢舉的內容不正當,請選擇「拒絕」將案件標記為已解決。"
_delivery:
status: "傳送狀態"
- stop: "停止傳送"
- resume: "恢復傳送"
+ stop: "停止發送"
+ resume: "恢復發送"
_type:
- none: "直播中"
+ none: "發送中"
manuallySuspended: "手動暫停中"
goneSuspended: "因為伺服器刪除所以暫停中"
autoSuspendedForNotResponding: "因為伺服器沒有回應所以暫停中"
@@ -1375,8 +1452,10 @@ _serverSettings:
fanoutTimelineDescription: "如果啟用的話,檢索各個時間軸的性能會顯著提昇,資料庫的負荷也會減少。不過,Redis 的記憶體使用量會增加。如果伺服器的記憶體容量比較少或者運行不穩定,可以停用。"
fanoutTimelineDbFallback: "資料庫的回退"
fanoutTimelineDbFallbackDescription: "若啟用,在時間軸沒有快取的情況下將執行回退處理以額外查詢資料庫。若停用,可以透過不執行回退處理來進一步減少伺服器的負荷,但會限制可取得的時間軸範圍。"
+ reactionsBufferingDescription: "啟用時,可以顯著提高建立反應時的效能並減少資料庫的負載。 但是,Redis 記憶體使用量會增加。"
inquiryUrl: "聯絡表單網址"
- inquiryUrlDescription: "指定伺服器運營者的聯絡表單網址或包含運營者聯絡資訊網頁的網址。"
+ inquiryUrlDescription: "指定伺服器運營者的聯絡表單網址,或包含運營者聯絡資訊網頁的網址。"
+ thisSettingWillAutomaticallyOffWhenModeratorsInactive: "為了防止 spam,如果一段期間內沒有偵測到審查員的活動,此設定將自動關閉。"
_accountMigration:
moveFrom: "從其他帳戶遷移到這個帳戶"
moveFromSub: "為另一個帳戶建立別名"
@@ -1390,7 +1469,7 @@ _accountMigration:
startMigration: "遷移"
migrationConfirm: "確定要將這個帳戶遷移至 {account} 嗎?一旦遷移就無法撤銷,也就無法以原來的狀態使用這個帳戶。\n另外,請確認在要遷移到的帳戶已經建立了一個別名。"
movedAndCannotBeUndone: "帳戶已遷移。\n遷移無法撤消。"
- postMigrationNote: "在完成遷移的 24 小時後解除此帳戶的追隨。此帳戶的追隨中、追隨者數量變為 0。由於不會解除追隨者,你的追隨者仍然可以繼續檢視這個帳戶發布給追隨者的貼文。"
+ postMigrationNote: "取消追蹤此帳戶將在遷移操作後 24 小時執行。\n 此帳戶有 0 個關注者/關注者。 您的關注者仍然可以看到此帳戶的關注者帖子,因為您不會被取消關注。"
movedTo: "要遷移到的帳戶:"
_achievements:
earnedAt: "獲得日期"
@@ -1510,7 +1589,7 @@ _achievements:
_markedAsCat:
title: "我是貓"
description: "已將帳戶設定為貓"
- flavor: "還沒有名字。"
+ flavor: "沒有名字。"
_following1:
title: "首次追隨"
description: "首次追隨了"
@@ -1524,7 +1603,7 @@ _achievements:
title: "一百位朋友"
description: "追隨超過100人了"
_following300:
- title: "朋友過多"
+ title: "朋友太多"
description: "追隨超過300人了"
_followers1:
title: "第一個追隨者"
@@ -1693,6 +1772,7 @@ _role:
canManageAvatarDecorations: "管理頭像裝飾"
driveCapacity: "雲端硬碟容量"
alwaysMarkNsfw: "總是將檔案標記為NSFW"
+ canUpdateBioMedia: "允許更新大頭貼和橫幅"
pinMax: "置頂貼文的最大數量"
antennaMax: "可建立的天線數量"
wordMuteMax: "靜音文字的最大字數"
@@ -1707,6 +1787,11 @@ _role:
canSearchNotes: "可否搜尋貼文"
canUseTranslator: "使用翻譯功能"
avatarDecorationLimit: "頭像裝飾的最大設置量"
+ canImportAntennas: "允許匯入天線"
+ canImportBlocking: "允許匯入封鎖名單"
+ canImportFollowing: "允許匯入跟隨名單"
+ canImportMuting: "允許匯入靜音名單"
+ canImportUserLists: "允許匯入清單"
_condition:
roleAssignedTo: "手動指派角色完成"
isLocal: "本地使用者"
@@ -1844,7 +1929,7 @@ _channel:
following: "追隨中"
usersCount: "有 {n} 人參與"
notesCount: "有 {n} 篇貼文"
- nameAndDescription: "名稱與說明"
+ nameAndDescription: "名稱"
nameOnly: "僅名稱"
allowRenoteToExternal: "允許在頻道外轉發和引用"
_menuDisplay:
@@ -1924,7 +2009,6 @@ _theme:
buttonBg: "按鈕背景"
buttonHoverBg: "按鈕背景 (漂浮)"
inputBorder: "輸入框邊框"
- listItemHoverBg: "列表物品背景 (漂浮)"
driveFolderBg: "雲端硬碟文件夾背景"
wallpaperOverlay: "壁紙覆蓋層"
badge: "徽章"
@@ -1936,8 +2020,6 @@ _sfx:
note: "貼文"
noteMy: "我的貼文"
notification: "通知"
- antenna: "天線接收"
- channel: "頻道通知"
reaction: "選擇反應時"
_soundSettings:
driveFile: "使用雲端硬碟的音效檔案"
@@ -1946,6 +2028,7 @@ _soundSettings:
driveFileTypeWarnDescription: "請選擇音效檔案"
driveFileDurationWarn: "音效太長了"
driveFileDurationWarnDescription: "使用長音效檔可能會影響 Misskey 的使用體驗。仍要使用此檔案嗎?"
+ driveFileError: "無法載入語音。請變更設定"
_ago:
future: "未來"
justNow: "剛剛"
@@ -2092,8 +2175,11 @@ _auth:
permissionAsk: "此應用程式需要以下權限"
pleaseGoBack: "請返回至應用程式"
callback: "回到應用程式"
+ accepted: "已授予存取權限"
denied: "拒絕訪問"
+ scopeUser: "以下列使用者身分操作"
pleaseLogin: "必須登入以提供應用程式的存取權限。"
+ byClickingYouWillBeRedirectedToThisUrl: "如果授予存取權限,就會自動導向到以下的網址"
_antennaSources:
all: "全部貼文"
homeTimeline: "來自已追隨使用者的貼文"
@@ -2202,6 +2288,9 @@ _profile:
changeBanner: "變更橫幅圖像"
verifiedLinkDescription: "如果輸入包含您個人資料的網站 URL,欄位旁邊將出現驗證圖示。"
avatarDecorationMax: "最多可以設置 {max} 個裝飾。"
+ followedMessage: "被追隨時的訊息"
+ followedMessageDescription: "可以設定被追隨時顯示給對方的訊息。"
+ followedMessageDescriptionForLockedAccount: "如果追隨是需要審核的話,在允許追隨請求之後顯示。"
_exportOrImport:
allNotes: "所有貼文"
favoritedNotes: "「我的最愛」貼文"
@@ -2217,7 +2306,7 @@ _charts:
federation: "聯邦宇宙"
apRequest: "請求"
usersIncDec: "使用者增減"
- usersTotal: "使用者總數"
+ usersTotal: "使用者合計"
activeUsers: "活躍使用者"
notesIncDec: "貼文増減"
localNotesIncDec: "本地貼文増減"
@@ -2294,6 +2383,7 @@ _pages:
eyeCatchingImageSet: "設定封面影像"
eyeCatchingImageRemove: "刪除封面影像"
chooseBlock: "新增方塊"
+ enterSectionTitle: "輸入區段的標題"
selectType: "選擇類型"
contentBlocks: "內容"
inputBlocks: "輸入"
@@ -2339,13 +2429,15 @@ _notification:
renotedBySomeUsers: "{n}人做了轉發"
followedBySomeUsers: "被{n}人追隨了"
flushNotification: "重置通知歷史紀錄"
+ exportOfXCompleted: "{x} 的匯出已完成。"
+ login: "已登入"
_types:
all: "全部 "
note: "使用者的最新貼文"
follow: "追隨中"
mention: "提及"
reply: "回覆"
- renote: "轉發貼文"
+ renote: "轉發"
quote: "引用"
reaction: "反應"
pollEnded: "問卷調查結束"
@@ -2353,6 +2445,9 @@ _notification:
followRequestAccepted: "追隨請求已接受"
roleAssigned: "已授予角色"
achievementEarned: "獲得成就"
+ exportCompleted: "已完成匯出。"
+ login: "登入"
+ test: "通知測試"
app: "應用程式通知"
_actions:
followBack: "追隨回去"
@@ -2401,9 +2496,10 @@ _drivecleaner:
orderByCreatedAtAsc: "按新增日期降序排列"
_webhookSettings:
createWebhook: "建立 Webhook"
+ modifyWebhook: "編輯 Webhook"
name: "名字"
secret: "密鑰"
- events: "何時運行 Webhook"
+ trigger: "觸發器"
active: "已啟用"
_events:
follow: "當你追隨時"
@@ -2413,6 +2509,29 @@ _webhookSettings:
renote: "當被轉發時"
reaction: "當獲得反應時"
mention: "當被提到時"
+ _systemEvents:
+ abuseReport: "當使用者檢舉時"
+ abuseReportResolved: "當處理了使用者的檢舉時"
+ userCreated: "使用者被新增時"
+ inactiveModeratorsWarning: "當審查員在一段時間內沒有活動時"
+ inactiveModeratorsInvitationOnlyChanged: "當審查員在一段時間內不活動時,系統會將模式變更為邀請制"
+ deleteConfirm: "請問是否要刪除 Webhook?"
+ testRemarks: "按下切換開關右側的按鈕,就會將假資料發送至 Webhook。"
+_abuseReport:
+ _notificationRecipient:
+ createRecipient: "新增接收檢舉的通知對象"
+ modifyRecipient: "編輯接收檢舉的通知對象"
+ recipientType: "通知對象的種類"
+ _recipientType:
+ mail: "電子郵件"
+ webhook: "Webhook"
+ _captions:
+ mail: "寄送到擁有監察員權限的使用者電子郵件地址(僅在收到檢舉時)"
+ webhook: "向指定的 SystemWebhook 發送通知(在收到檢舉和解決檢舉時發送)"
+ keywords: "關鍵字"
+ notifiedUser: "通知的使用者"
+ notifiedWebhook: "使用的 Webhook"
+ deleteConfirm: "確定要刪除通知對象嗎?"
_moderationLogTypes:
createRole: "新增角色"
deleteRole: "刪除角色 "
@@ -2441,6 +2560,8 @@ _moderationLogTypes:
markSensitiveDriveFile: "標記為敏感檔案"
unmarkSensitiveDriveFile: "撤銷標記為敏感檔案"
resolveAbuseReport: "解決檢舉"
+ forwardAbuseReport: "轉發檢舉"
+ updateAbuseReportNote: "更新檢舉的審查備註"
createInvitation: "建立邀請碼"
createAd: "建立廣告"
deleteAd: "刪除廣告"
@@ -2450,6 +2571,16 @@ _moderationLogTypes:
deleteAvatarDecoration: "刪除頭像裝飾"
unsetUserAvatar: "移除使用者的大頭貼"
unsetUserBanner: "移除使用者的橫幅圖像"
+ createSystemWebhook: "建立 SystemWebhook"
+ updateSystemWebhook: "更新 SystemWebhook"
+ deleteSystemWebhook: "刪除 SystemWebhook"
+ createAbuseReportNotificationRecipient: "建立接收檢舉的通知對象"
+ updateAbuseReportNotificationRecipient: "更新接收檢舉的通知對象"
+ deleteAbuseReportNotificationRecipient: "刪除接收檢舉的通知對象"
+ deleteAccount: "刪除帳戶"
+ deletePage: "刪除頁面"
+ deleteFlash: "刪除 Play"
+ deleteGalleryPost: "刪除相簿的貼文"
_fileViewer:
title: "檔案詳細資訊"
type: "檔案類型 "
@@ -2581,3 +2712,28 @@ _mediaControls:
pip: "畫中畫"
playbackRate: "播放速度"
loop: "循環播放"
+_contextMenu:
+ title: "內容功能表"
+ app: "應用程式"
+ appWithShift: "Shift 鍵應用程式"
+ native: "瀏覽器的使用者介面"
+_embedCodeGen:
+ title: "自訂嵌入程式碼"
+ header: "檢視標頭 "
+ autoload: "自動繼續載入(不建議)"
+ maxHeight: "最大高度"
+ maxHeightDescription: "設定為 0 時代表沒有最大值。請指定某個值以避免小工具持續在縱向延伸。"
+ maxHeightWarn: "最大高度限制已停用(0)。如果這個變更不是您想要的,請將最大高度設定為某個值。"
+ previewIsNotActual: "由於超出了預覽畫面可顯示的範圍,因此顯示內容會與實際嵌入時有所不同。"
+ rounded: "圓角"
+ border: "給外框加上邊框"
+ applyToPreview: "反映在預覽中"
+ generateCode: "建立嵌入程式碼"
+ codeGenerated: "已產生程式碼"
+ codeGeneratedDescription: "請將產生的程式碼貼到您的網站上。"
+_selfXssPrevention:
+ warning: "警告"
+ title: "「在此畫面貼上一些內容」完全是個騙局。"
+ description1: "如果您在此處貼上任何內容,惡意使用者可能會接管您的帳戶或竊取您的個人資訊。"
+ description2: "如果您不確切知道要貼上的內容,%c 請立即停止工作並關閉此視窗。"
+ description3: "細節請看這裡。{link}"
diff --git a/misskey-assets b/misskey-assets
deleted file mode 160000
index 0179793ec8..0000000000
--- a/misskey-assets
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 0179793ec891856d6f37a3be16ba4c22f67a81b5
diff --git a/package.json b/package.json
index b1786e16f1..55ae092967 100644
--- a/package.json
+++ b/package.json
@@ -1,14 +1,16 @@
{
"name": "misskey",
- "version": "2024.5.0",
+ "version": "2024.10.2-alpha.2",
"codename": "nasubi",
"repository": {
"type": "git",
"url": "https://github.com/misskey-dev/misskey.git"
},
- "packageManager": "pnpm@9.0.6",
+ "packageManager": "pnpm@9.6.0",
"workspaces": [
+ "packages/frontend-shared",
"packages/frontend",
+ "packages/frontend-embed",
"packages/backend",
"packages/sw",
"packages/misskey-js",
@@ -21,7 +23,7 @@
"build-assets": "node ./scripts/build-assets.mjs",
"build": "pnpm build-pre && pnpm -r build && pnpm build-assets",
"build-storybook": "pnpm --filter frontend build-storybook",
- "build-misskey-js-with-types": "pnpm build-pre && pnpm --filter backend... --filter=!misskey-js build && pnpm --filter backend generate-api-json && ncp packages/backend/built/api.json packages/misskey-js/generator/api.json && pnpm --filter misskey-js update-autogen-code && pnpm --filter misskey-js build && pnpm --filter misskey-js api",
+ "build-misskey-js-with-types": "pnpm build-pre && pnpm --filter backend... --filter=!misskey-js build && pnpm --filter backend generate-api-json --no-build && ncp packages/backend/built/api.json packages/misskey-js/generator/api.json && pnpm --filter misskey-js update-autogen-code && pnpm --filter misskey-js build && pnpm --filter misskey-js api",
"start": "pnpm check:connect && cd packages/backend && node ./built/boot/entry.js",
"start:test": "cd packages/backend && cross-env NODE_ENV=test node ./built/boot/entry.js",
"init": "pnpm migrate",
@@ -35,6 +37,7 @@
"cy:open": "pnpm cypress open --browser --e2e --config-file=cypress.config.ts",
"cy:run": "pnpm cypress run",
"e2e": "pnpm start-server-and-test start:test http://localhost:61812 cy:run",
+ "e2e-dev-container": "cp ./.config/cypress-devcontainer.yml ./.config/test.yml && pnpm start-server-and-test start:test http://localhost:61812 cy:run",
"jest": "cd packages/backend && pnpm jest",
"jest-and-coverage": "cd packages/backend && pnpm jest-and-coverage",
"test": "pnpm -r test",
@@ -51,24 +54,26 @@
"cssnano": "6.1.2",
"execa": "8.0.1",
"fast-glob": "3.3.2",
- "ignore-walk": "6.0.4",
+ "ignore-walk": "6.0.5",
"js-yaml": "4.1.0",
- "postcss": "8.4.38",
+ "postcss": "8.4.47",
"tar": "6.2.1",
- "terser": "5.30.3",
- "typescript": "5.4.5",
- "esbuild": "0.20.2",
- "glob": "10.3.12"
+ "terser": "5.33.0",
+ "typescript": "5.6.2",
+ "esbuild": "0.23.1",
+ "glob": "11.0.0"
},
"devDependencies": {
- "@types/node": "20.12.7",
- "@typescript-eslint/eslint-plugin": "7.7.1",
- "@typescript-eslint/parser": "7.7.1",
+ "@misskey-dev/eslint-plugin": "2.0.3",
+ "@types/node": "20.14.12",
+ "@typescript-eslint/eslint-plugin": "7.17.0",
+ "@typescript-eslint/parser": "7.17.0",
"cross-env": "7.0.3",
- "cypress": "13.7.3",
- "eslint": "8.57.0",
+ "cypress": "13.14.2",
+ "eslint": "9.8.0",
+ "globals": "15.9.0",
"ncp": "2.0.0",
- "start-server-and-test": "2.0.3"
+ "start-server-and-test": "2.0.8"
},
"optionalDependencies": {
"@tensorflow/tfjs-core": "4.4.0"
diff --git a/packages/backend/.eslintignore b/packages/backend/.eslintignore
deleted file mode 100644
index 790eb90145..0000000000
--- a/packages/backend/.eslintignore
+++ /dev/null
@@ -1,4 +0,0 @@
-node_modules
-/built
-/.eslintrc.js
-/@types/**/*
diff --git a/packages/backend/.eslintrc.cjs b/packages/backend/.eslintrc.cjs
deleted file mode 100644
index f9fe4814e6..0000000000
--- a/packages/backend/.eslintrc.cjs
+++ /dev/null
@@ -1,32 +0,0 @@
-module.exports = {
- parserOptions: {
- tsconfigRootDir: __dirname,
- project: ['./tsconfig.json', './test/tsconfig.json'],
- },
- extends: [
- '../shared/.eslintrc.js',
- ],
- rules: {
- 'import/order': ['warn', {
- 'groups': ['builtin', 'external', 'internal', 'parent', 'sibling', 'index', 'object', 'type'],
- 'pathGroups': [
- {
- 'pattern': '@/**',
- 'group': 'external',
- 'position': 'after'
- }
- ],
- }],
- 'no-restricted-globals': [
- 'error',
- {
- 'name': '__dirname',
- 'message': 'Not in ESModule. Use `import.meta.url` instead.'
- },
- {
- 'name': '__filename',
- 'message': 'Not in ESModule. Use `import.meta.url` instead.'
- }
- ]
- },
-};
diff --git a/packages/backend/assets/api-doc.html b/packages/backend/assets/api-doc.html
new file mode 100644
index 0000000000..19e0349d47
--- /dev/null
+++ b/packages/backend/assets/api-doc.html
@@ -0,0 +1,20 @@
+
+
+
+ Misskey API
+
+
+
+
+
+
+
+
+
diff --git a/packages/backend/assets/embed.js b/packages/backend/assets/embed.js
new file mode 100644
index 0000000000..24fccc1b6c
--- /dev/null
+++ b/packages/backend/assets/embed.js
@@ -0,0 +1,31 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: MIT
+ */
+//@ts-check
+(() => {
+ /** @type {NodeListOf} */
+ const els = document.querySelectorAll('iframe[data-misskey-embed-id]');
+
+ window.addEventListener('message', function (event) {
+ els.forEach((el) => {
+ if (event.source !== el.contentWindow) {
+ return;
+ }
+
+ const id = el.dataset.misskeyEmbedId;
+
+ if (event.data.type === 'misskey:embed:ready') {
+ el.contentWindow?.postMessage({
+ type: 'misskey:embedParent:registerIframeId',
+ payload: {
+ iframeId: id,
+ }
+ }, '*');
+ }
+ if (event.data.type === 'misskey:embed:changeHeight' && event.data.iframeId === id) {
+ el.style.height = event.data.payload.height + 'px';
+ }
+ });
+ });
+})();
diff --git a/packages/backend/assets/redoc.html b/packages/backend/assets/redoc.html
deleted file mode 100644
index 2557b4532e..0000000000
--- a/packages/backend/assets/redoc.html
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
- Misskey API
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/backend/assets/tabler-badges/login-2.png b/packages/backend/assets/tabler-badges/login-2.png
new file mode 100644
index 0000000000..f3ca8de3dd
Binary files /dev/null and b/packages/backend/assets/tabler-badges/login-2.png differ
diff --git a/packages/backend/eslint.config.js b/packages/backend/eslint.config.js
new file mode 100644
index 0000000000..ae7b2baf49
--- /dev/null
+++ b/packages/backend/eslint.config.js
@@ -0,0 +1,46 @@
+import tsParser from '@typescript-eslint/parser';
+import sharedConfig from '../shared/eslint.config.js';
+
+export default [
+ ...sharedConfig,
+ {
+ ignores: ['**/node_modules', 'built', '@types/**/*', 'migration'],
+ },
+ {
+ files: ['**/*.ts', '**/*.tsx'],
+ languageOptions: {
+ parserOptions: {
+ parser: tsParser,
+ project: ['./tsconfig.json', './test/tsconfig.json', './test-federation/tsconfig.json'],
+ sourceType: 'module',
+ tsconfigRootDir: import.meta.dirname,
+ },
+ },
+ rules: {
+ 'import/order': ['warn', {
+ groups: [
+ 'builtin',
+ 'external',
+ 'internal',
+ 'parent',
+ 'sibling',
+ 'index',
+ 'object',
+ 'type',
+ ],
+ pathGroups: [{
+ pattern: '@/**',
+ group: 'external',
+ position: 'after',
+ }],
+ }],
+ 'no-restricted-globals': ['error', {
+ name: '__dirname',
+ message: 'Not in ESModule. Use `import.meta.url` instead.',
+ }, {
+ name: '__filename',
+ message: 'Not in ESModule. Use `import.meta.url` instead.',
+ }],
+ },
+ },
+];
diff --git a/packages/backend/jest.config.fed.cjs b/packages/backend/jest.config.fed.cjs
new file mode 100644
index 0000000000..fae187bc23
--- /dev/null
+++ b/packages/backend/jest.config.fed.cjs
@@ -0,0 +1,13 @@
+/*
+ * For a detailed explanation regarding each configuration property and type check, visit:
+ * https://jestjs.io/docs/en/configuration.html
+ */
+
+const base = require('./jest.config.cjs');
+
+module.exports = {
+ ...base,
+ testMatch: [
+ '/test-federation/test/**/*.test.ts',
+ ],
+};
diff --git a/packages/backend/migration/1713656541000-abuse-report-notification.js b/packages/backend/migration/1713656541000-abuse-report-notification.js
new file mode 100644
index 0000000000..4a754f81e2
--- /dev/null
+++ b/packages/backend/migration/1713656541000-abuse-report-notification.js
@@ -0,0 +1,62 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class AbuseReportNotification1713656541000 {
+ name = 'AbuseReportNotification1713656541000'
+
+ async up(queryRunner) {
+ await queryRunner.query(`
+ CREATE TABLE "system_webhook" (
+ "id" varchar(32) NOT NULL,
+ "isActive" boolean NOT NULL DEFAULT true,
+ "updatedAt" timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "latestSentAt" timestamp with time zone NULL DEFAULT NULL,
+ "latestStatus" integer NULL DEFAULT NULL,
+ "name" varchar(255) NOT NULL,
+ "on" varchar(128) [] NOT NULL DEFAULT '{}'::character varying[],
+ "url" varchar(1024) NOT NULL,
+ "secret" varchar(1024) NOT NULL,
+ CONSTRAINT "PK_system_webhook_id" PRIMARY KEY ("id")
+ );
+ CREATE INDEX "IDX_system_webhook_isActive" ON "system_webhook" ("isActive");
+ CREATE INDEX "IDX_system_webhook_on" ON "system_webhook" USING gin ("on");
+
+ CREATE TABLE "abuse_report_notification_recipient" (
+ "id" varchar(32) NOT NULL,
+ "isActive" boolean NOT NULL DEFAULT true,
+ "updatedAt" timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "name" varchar(255) NOT NULL,
+ "method" varchar(64) NOT NULL,
+ "userId" varchar(32) NULL DEFAULT NULL,
+ "systemWebhookId" varchar(32) NULL DEFAULT NULL,
+ CONSTRAINT "PK_abuse_report_notification_recipient_id" PRIMARY KEY ("id"),
+ CONSTRAINT "FK_abuse_report_notification_recipient_userId1" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+ CONSTRAINT "FK_abuse_report_notification_recipient_userId2" FOREIGN KEY ("userId") REFERENCES "user_profile"("userId") ON DELETE CASCADE ON UPDATE NO ACTION,
+ CONSTRAINT "FK_abuse_report_notification_recipient_systemWebhookId" FOREIGN KEY ("systemWebhookId") REFERENCES "system_webhook"("id") ON DELETE CASCADE ON UPDATE NO ACTION
+ );
+ CREATE INDEX "IDX_abuse_report_notification_recipient_isActive" ON "abuse_report_notification_recipient" ("isActive");
+ CREATE INDEX "IDX_abuse_report_notification_recipient_method" ON "abuse_report_notification_recipient" ("method");
+ CREATE INDEX "IDX_abuse_report_notification_recipient_userId" ON "abuse_report_notification_recipient" ("userId");
+ CREATE INDEX "IDX_abuse_report_notification_recipient_systemWebhookId" ON "abuse_report_notification_recipient" ("systemWebhookId");
+ `);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`
+ ALTER TABLE "abuse_report_notification_recipient" DROP CONSTRAINT "FK_abuse_report_notification_recipient_userId1";
+ ALTER TABLE "abuse_report_notification_recipient" DROP CONSTRAINT "FK_abuse_report_notification_recipient_userId2";
+ ALTER TABLE "abuse_report_notification_recipient" DROP CONSTRAINT "FK_abuse_report_notification_recipient_systemWebhookId";
+ DROP INDEX "IDX_abuse_report_notification_recipient_isActive";
+ DROP INDEX "IDX_abuse_report_notification_recipient_method";
+ DROP INDEX "IDX_abuse_report_notification_recipient_userId";
+ DROP INDEX "IDX_abuse_report_notification_recipient_systemWebhookId";
+ DROP TABLE "abuse_report_notification_recipient";
+
+ DROP INDEX "IDX_system_webhook_isActive";
+ DROP INDEX "IDX_system_webhook_on";
+ DROP TABLE "system_webhook";
+ `);
+ }
+}
diff --git a/packages/backend/migration/1716197366117-MediaSilenceForHosts.js b/packages/backend/migration/1716197366117-MediaSilenceForHosts.js
new file mode 100644
index 0000000000..10bb7f0255
--- /dev/null
+++ b/packages/backend/migration/1716197366117-MediaSilenceForHosts.js
@@ -0,0 +1,16 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class MediaSilenceForHosts1716197366117 {
+ name = 'MediaSilenceForHosts1716197366117'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" ADD "mediaSilencedHosts" character varying(1024) array NOT NULL DEFAULT '{}'`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "mediaSilencedHosts"`);
+ }
+}
diff --git a/packages/backend/migration/1721666053703-fixDriveUrl.js b/packages/backend/migration/1721666053703-fixDriveUrl.js
new file mode 100644
index 0000000000..d8512fb835
--- /dev/null
+++ b/packages/backend/migration/1721666053703-fixDriveUrl.js
@@ -0,0 +1,24 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class FixDriveUrl1721666053703 {
+ name = 'FixDriveUrl1721666053703'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "drive_file" ALTER COLUMN "url" TYPE character varying(1024), ALTER COLUMN "url" SET NOT NULL`);
+ await queryRunner.query(`COMMENT ON COLUMN "drive_file"."url" IS 'The URL of the DriveFile.'`);
+ await queryRunner.query(`ALTER TABLE "drive_file" ALTER COLUMN "uri" TYPE character varying(1024)`);
+ await queryRunner.query(`COMMENT ON COLUMN "drive_file"."uri" IS 'The URI of the DriveFile. it will be null when the DriveFile is local.'`);
+ await queryRunner.query(`ALTER TABLE "drive_file" ALTER COLUMN "src" TYPE character varying(1024)`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "drive_file" ALTER COLUMN "src" TYPE character varying(512)`);
+ await queryRunner.query(`COMMENT ON COLUMN "drive_file"."uri" IS 'The URI of the DriveFile. it will be null when the DriveFile is local.'`);
+ await queryRunner.query(`ALTER TABLE "drive_file" ALTER COLUMN "uri" TYPE character varying(512)`);
+ await queryRunner.query(`COMMENT ON COLUMN "drive_file"."url" IS 'The URL of the DriveFile.'`);
+ await queryRunner.query(`ALTER TABLE "drive_file" ALTER COLUMN "url" TYPE character varying(512), ALTER COLUMN "url" SET NOT NULL`);
+ }
+}
diff --git a/packages/backend/migration/1723944246767-followedMessage.js b/packages/backend/migration/1723944246767-followedMessage.js
new file mode 100644
index 0000000000..fc9ad1cb85
--- /dev/null
+++ b/packages/backend/migration/1723944246767-followedMessage.js
@@ -0,0 +1,16 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class FollowedMessage1723944246767 {
+ name = 'FollowedMessage1723944246767';
+
+ async up(queryRunner) {
+ await queryRunner.query('ALTER TABLE "user_profile" ADD "followedMessage" character varying(256)');
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query('ALTER TABLE "user_profile" DROP COLUMN "followedMessage"');
+ }
+}
diff --git a/packages/backend/migration/1726804538569-reactions-buffering.js b/packages/backend/migration/1726804538569-reactions-buffering.js
new file mode 100644
index 0000000000..bc19e9cc8a
--- /dev/null
+++ b/packages/backend/migration/1726804538569-reactions-buffering.js
@@ -0,0 +1,16 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class ReactionsBuffering1726804538569 {
+ name = 'ReactionsBuffering1726804538569'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" ADD "enableReactionsBuffering" boolean NOT NULL DEFAULT false`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableReactionsBuffering"`);
+ }
+}
diff --git a/packages/backend/migration/1727318020265-enableStatsForFederatedInstances.js b/packages/backend/migration/1727318020265-enableStatsForFederatedInstances.js
new file mode 100644
index 0000000000..4ff520172b
--- /dev/null
+++ b/packages/backend/migration/1727318020265-enableStatsForFederatedInstances.js
@@ -0,0 +1,16 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class EnableStatsForFederatedInstances1727318020265 {
+ name = 'EnableStatsForFederatedInstances1727318020265'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" ADD "enableStatsForFederatedInstances" boolean NOT NULL DEFAULT true`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableStatsForFederatedInstances"`);
+ }
+}
diff --git a/packages/backend/migration/1727491883993-user-score.js b/packages/backend/migration/1727491883993-user-score.js
new file mode 100644
index 0000000000..7292d5363c
--- /dev/null
+++ b/packages/backend/migration/1727491883993-user-score.js
@@ -0,0 +1,16 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class UserScore1727491883993 {
+ name = 'UserScore1727491883993'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "user" ADD "score" integer NOT NULL DEFAULT '0'`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "score"`);
+ }
+}
diff --git a/packages/backend/migration/1727512908322-meta-federation.js b/packages/backend/migration/1727512908322-meta-federation.js
new file mode 100644
index 0000000000..52c24df4f7
--- /dev/null
+++ b/packages/backend/migration/1727512908322-meta-federation.js
@@ -0,0 +1,18 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class MetaFederation1727512908322 {
+ name = 'MetaFederation1727512908322'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" ADD "federation" character varying(128) NOT NULL DEFAULT 'all'`);
+ await queryRunner.query(`ALTER TABLE "meta" ADD "federationHosts" character varying(1024) array NOT NULL DEFAULT '{}'`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "federationHosts"`);
+ await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "federation"`);
+ }
+}
diff --git a/packages/backend/migration/1728085812127-refine-abuse-user-report.js b/packages/backend/migration/1728085812127-refine-abuse-user-report.js
new file mode 100644
index 0000000000..57cbfdcf6d
--- /dev/null
+++ b/packages/backend/migration/1728085812127-refine-abuse-user-report.js
@@ -0,0 +1,18 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class RefineAbuseUserReport1728085812127 {
+ name = 'RefineAbuseUserReport1728085812127'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD "moderationNote" character varying(8192) NOT NULL DEFAULT ''`);
+ await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD "resolvedAs" character varying(128)`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "resolvedAs"`);
+ await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "moderationNote"`);
+ }
+}
diff --git a/packages/backend/migration/1728550878802-testcaptcha.js b/packages/backend/migration/1728550878802-testcaptcha.js
new file mode 100644
index 0000000000..d8d987c0c1
--- /dev/null
+++ b/packages/backend/migration/1728550878802-testcaptcha.js
@@ -0,0 +1,16 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class Testcaptcha1728550878802 {
+ name = 'Testcaptcha1728550878802'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" ADD "enableTestcaptcha" boolean NOT NULL DEFAULT false`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableTestcaptcha"`);
+ }
+}
diff --git a/packages/backend/migration/1728634286056-prohibitedWordsForNameOfUser.js b/packages/backend/migration/1728634286056-prohibitedWordsForNameOfUser.js
new file mode 100644
index 0000000000..36e698d120
--- /dev/null
+++ b/packages/backend/migration/1728634286056-prohibitedWordsForNameOfUser.js
@@ -0,0 +1,14 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class ProhibitedWordsForNameOfUser1728634286056 {
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" ADD "prohibitedWordsForNameOfUser" character varying(1024) array NOT NULL DEFAULT '{}'`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "prohibitedWordsForNameOfUser"`);
+ }
+}
diff --git a/packages/backend/migration/1729333924409-signinRequiredForShowContents.js b/packages/backend/migration/1729333924409-signinRequiredForShowContents.js
new file mode 100644
index 0000000000..5d4d1fcce2
--- /dev/null
+++ b/packages/backend/migration/1729333924409-signinRequiredForShowContents.js
@@ -0,0 +1,16 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class SigninRequiredForShowContents1729333924409 {
+ name = 'SigninRequiredForShowContents1729333924409'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "user" ADD "requireSigninToViewContents" boolean NOT NULL DEFAULT false`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "requireSigninToViewContents"`);
+ }
+}
diff --git a/packages/backend/migration/1729486255072-makeNotesHiddenBefore.js b/packages/backend/migration/1729486255072-makeNotesHiddenBefore.js
new file mode 100644
index 0000000000..5fe4886b04
--- /dev/null
+++ b/packages/backend/migration/1729486255072-makeNotesHiddenBefore.js
@@ -0,0 +1,18 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class MakeNotesHiddenBefore1729486255072 {
+ name = 'MakeNotesHiddenBefore1729486255072'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "user" ADD "makeNotesFollowersOnlyBefore" integer`);
+ await queryRunner.query(`ALTER TABLE "user" ADD "makeNotesHiddenBefore" integer`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "makeNotesHiddenBefore"`);
+ await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "makeNotesFollowersOnlyBefore"`);
+ }
+}
diff --git a/packages/backend/package.json b/packages/backend/package.json
index e034f75dc5..0dd738a1e6 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -4,7 +4,7 @@
"private": true,
"type": "module",
"engines": {
- "node": "^20.10.0"
+ "node": "^20.10.0 || ^22.0.0"
},
"scripts": {
"start": "node ./built/boot/entry.js",
@@ -19,19 +19,21 @@
"watch": "node ./scripts/watch.mjs",
"restart": "pnpm build && pnpm start",
"dev": "node ./scripts/dev.mjs",
- "typecheck": "tsc --noEmit && tsc -p test --noEmit",
- "eslint": "eslint --quiet \"src/**/*.ts\"",
+ "typecheck": "tsc --noEmit && tsc -p test --noEmit && tsc -p test-federation --noEmit",
+ "eslint": "eslint --quiet \"{src,test-federation}/**/*.ts\"",
"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: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:fed": "node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/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: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-clear": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --clearCache",
"test": "pnpm jest",
"test:e2e": "pnpm build && pnpm build:test && pnpm jest:e2e",
+ "test:fed": "pnpm jest:fed",
"test-and-coverage": "pnpm jest-and-coverage",
"test-and-coverage:e2e": "pnpm build && pnpm build:test && pnpm jest-and-coverage:e2e",
- "generate-api-json": "pnpm build && node ./scripts/generate_api_json.js"
+ "generate-api-json": "node ./scripts/generate_api_json.js"
},
"optionalDependencies": {
"@swc/core-android-arm64": "1.3.11",
@@ -65,43 +67,43 @@
"utf-8-validate": "6.0.3"
},
"dependencies": {
- "@aws-sdk/client-s3": "3.412.0",
- "@aws-sdk/lib-storage": "3.412.0",
- "@bull-board/api": "5.17.0",
- "@bull-board/fastify": "5.17.0",
- "@bull-board/ui": "5.17.0",
- "@discordapp/twemoji": "15.0.3",
- "@fastify/accepts": "4.3.0",
- "@fastify/cookie": "9.3.1",
- "@fastify/cors": "9.0.1",
- "@fastify/express": "3.0.0",
- "@fastify/http-proxy": "9.5.0",
- "@fastify/multipart": "8.2.0",
- "@fastify/static": "7.0.3",
- "@fastify/view": "9.1.0",
+ "@aws-sdk/client-s3": "3.620.0",
+ "@aws-sdk/lib-storage": "3.620.0",
+ "@bull-board/api": "6.0.0",
+ "@bull-board/fastify": "6.0.0",
+ "@bull-board/ui": "6.0.0",
+ "@discordapp/twemoji": "15.1.0",
+ "@fastify/accepts": "5.0.1",
+ "@fastify/cookie": "10.0.1",
+ "@fastify/cors": "10.0.1",
+ "@fastify/express": "4.0.1",
+ "@fastify/http-proxy": "10.0.0",
+ "@fastify/multipart": "9.0.1",
+ "@fastify/static": "8.0.1",
+ "@fastify/view": "10.0.1",
"@misskey-dev/sharp-read-bmp": "1.2.0",
"@misskey-dev/summaly": "5.1.0",
- "@napi-rs/canvas": "^0.1.52",
- "@nestjs/common": "10.3.8",
- "@nestjs/core": "10.3.8",
- "@nestjs/testing": "10.3.8",
+ "@napi-rs/canvas": "0.1.56",
+ "@nestjs/common": "10.4.4",
+ "@nestjs/core": "10.4.4",
+ "@nestjs/testing": "10.4.4",
"@peertube/http-signature": "1.7.0",
- "@sentry/node": "^8.5.0",
- "@sentry/profiling-node": "^8.5.0",
- "@simplewebauthn/server": "10.0.0",
+ "@sentry/node": "8.20.0",
+ "@sentry/profiling-node": "8.20.0",
+ "@simplewebauthn/server": "10.0.1",
"@sinonjs/fake-timers": "11.2.2",
"@smithy/node-http-handler": "2.5.0",
"@swc/cli": "0.3.12",
- "@swc/core": "1.4.17",
+ "@swc/core": "1.6.6",
"@twemoji/parser": "15.1.1",
"accepts": "1.3.8",
- "ajv": "8.13.0",
+ "ajv": "8.17.1",
"archiver": "7.0.1",
"async-mutex": "0.5.0",
"bcryptjs": "2.4.3",
"blurhash": "2.0.5",
- "body-parser": "1.20.2",
- "bullmq": "5.7.8",
+ "body-parser": "1.20.3",
+ "bullmq": "5.15.0",
"cacheable-lookup": "7.0.0",
"cbor": "9.0.2",
"chalk": "5.3.0",
@@ -112,27 +114,28 @@
"content-disposition": "0.5.4",
"date-fns": "2.30.0",
"deep-email-validator": "0.1.21",
- "fastify": "4.26.2",
- "fastify-raw-body": "4.3.0",
+ "fastify": "5.0.0",
+ "fastify-raw-body": "5.0.0",
"feed": "4.2.2",
- "file-type": "19.0.0",
- "fluent-ffmpeg": "2.1.2",
+ "file-type": "19.5.0",
+ "fluent-ffmpeg": "2.1.3",
"form-data": "4.0.0",
- "got": "14.2.1",
- "happy-dom": "10.0.3",
+ "got": "14.4.2",
+ "happy-dom": "15.7.4",
"hpagent": "1.2.0",
"htmlescape": "1.1.1",
"http-link-header": "1.1.3",
"ioredis": "5.4.1",
- "ip-cidr": "3.1.0",
+ "ip-cidr": "4.0.2",
"ipaddr.js": "2.2.0",
- "is-svg": "5.0.0",
+ "is-svg": "5.1.0",
"js-yaml": "4.1.0",
- "jsdom": "24.0.0",
+ "jsdom": "24.1.1",
"json5": "2.2.3",
"jsonld": "8.3.2",
"jsrsasign": "11.1.0",
- "meilisearch": "0.38.0",
+ "meilisearch": "0.42.0",
+ "juice": "11.0.0",
"mfm-js": "0.24.0",
"microformats-parser": "2.0.2",
"mime-types": "2.1.35",
@@ -142,84 +145,82 @@
"nanoid": "5.0.7",
"nested-property": "4.0.0",
"node-fetch": "3.3.2",
- "nodemailer": "6.9.13",
+ "nodemailer": "6.9.15",
"nsfwjs": "2.4.2",
"oauth": "0.10.0",
"oauth2orize": "1.12.0",
"oauth2orize-pkce": "0.1.2",
"os-utils": "0.0.14",
- "otpauth": "9.2.3",
+ "otpauth": "9.3.4",
"parse5": "7.1.2",
- "pg": "8.11.5",
+ "pg": "8.13.0",
"pkce-challenge": "4.1.0",
"probe-image-size": "7.2.3",
"promise-limit": "2.7.0",
- "pug": "3.0.2",
+ "pug": "3.0.3",
"punycode": "2.3.1",
- "qrcode": "1.5.3",
+ "qrcode": "1.5.4",
"random-seed": "0.3.0",
"ratelimiter": "3.4.1",
- "re2": "1.20.10",
+ "re2": "1.21.4",
"redis-lock": "0.1.4",
"reflect-metadata": "0.2.2",
"rename": "1.0.4",
"rss-parser": "3.13.0",
"rxjs": "7.8.1",
- "sanitize-html": "2.13.0",
+ "sanitize-html": "2.13.1",
"secure-json-parse": "2.7.0",
- "sharp": "0.33.3",
+ "sharp": "0.33.5",
"slacc": "0.0.10",
"strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0",
- "systeminformation": "5.22.7",
+ "systeminformation": "5.23.5",
"tinycolor2": "1.6.0",
"tmp": "0.2.3",
- "tsc-alias": "1.8.8",
+ "tsc-alias": "1.8.10",
"tsconfig-paths": "4.2.0",
"typeorm": "0.3.20",
- "typescript": "5.4.5",
+ "typescript": "5.6.2",
"ulid": "2.3.0",
"vary": "1.1.2",
"web-push": "3.6.7",
- "ws": "8.17.0",
+ "ws": "8.18.0",
"xev": "3.0.2"
},
"devDependencies": {
"@jest/globals": "29.7.0",
- "@misskey-dev/eslint-plugin": "1.0.0",
- "@nestjs/platform-express": "10.3.8",
+ "@nestjs/platform-express": "10.4.4",
"@simplewebauthn/types": "10.0.0",
"@swc/jest": "0.2.36",
"@types/accepts": "1.3.7",
"@types/archiver": "6.0.2",
"@types/bcryptjs": "2.4.6",
"@types/body-parser": "1.19.5",
- "@types/color-convert": "2.0.3",
+ "@types/color-convert": "2.0.4",
"@types/content-disposition": "0.5.8",
- "@types/fluent-ffmpeg": "2.1.24",
- "@types/htmlescape": "^1.1.3",
- "@types/http-link-header": "1.0.5",
- "@types/jest": "29.5.12",
+ "@types/fluent-ffmpeg": "2.1.26",
+ "@types/htmlescape": "1.1.3",
+ "@types/http-link-header": "1.0.7",
+ "@types/jest": "29.5.13",
"@types/js-yaml": "4.0.9",
- "@types/jsdom": "21.1.6",
- "@types/jsonld": "1.5.13",
+ "@types/jsdom": "21.1.7",
+ "@types/jsonld": "1.5.15",
"@types/jsrsasign": "10.5.14",
"@types/mime-types": "2.1.4",
"@types/ms": "0.7.34",
- "@types/node": "20.12.7",
- "@types/node-fetch": "3.0.3",
- "@types/nodemailer": "6.4.15",
- "@types/oauth": "0.9.4",
+ "@types/node": "20.14.12",
+ "@types/nodemailer": "6.4.16",
+ "@types/oauth": "0.9.5",
"@types/oauth2orize": "1.11.5",
"@types/oauth2orize-pkce": "0.1.2",
- "@types/pg": "8.11.5",
+ "@types/pg": "8.11.10",
"@types/pug": "2.0.10",
"@types/punycode": "2.1.4",
"@types/qrcode": "1.5.5",
"@types/random-seed": "0.3.5",
"@types/ratelimiter": "3.4.6",
"@types/rename": "1.0.7",
- "@types/sanitize-html": "2.11.0",
+ "@types/sanitize-html": "2.13.0",
"@types/semver": "7.5.8",
"@types/simple-oauth2": "5.0.7",
"@types/sinonjs__fake-timers": "8.1.5",
@@ -227,19 +228,18 @@
"@types/tmp": "0.2.6",
"@types/vary": "1.1.3",
"@types/web-push": "3.6.3",
- "@types/ws": "8.5.10",
- "@typescript-eslint/eslint-plugin": "7.7.1",
- "@typescript-eslint/parser": "7.7.1",
- "aws-sdk-client-mock": "3.0.1",
+ "@types/ws": "8.5.12",
+ "@typescript-eslint/eslint-plugin": "7.17.0",
+ "@typescript-eslint/parser": "7.17.0",
+ "aws-sdk-client-mock": "4.0.1",
"cross-env": "7.0.3",
- "eslint": "8.57.0",
- "eslint-plugin-import": "2.29.1",
- "execa": "8.0.1",
- "fkill": "^9.0.0",
+ "eslint-plugin-import": "2.30.0",
+ "execa": "9.4.0",
+ "fkill": "9.0.0",
"jest": "29.7.0",
"jest-mock": "29.7.0",
- "nodemon": "3.1.0",
+ "nodemon": "3.1.7",
"pid-port": "1.0.0",
- "simple-oauth2": "5.0.0"
+ "simple-oauth2": "5.1.0"
}
}
diff --git a/packages/backend/scripts/check_connect.js b/packages/backend/scripts/check_connect.js
index ba25fd416c..bb149444b5 100644
--- a/packages/backend/scripts/check_connect.js
+++ b/packages/backend/scripts/check_connect.js
@@ -5,11 +5,52 @@
import Redis from 'ioredis';
import { loadConfig } from '../built/config.js';
+import { createPostgresDataSource } from '../built/postgres.js';
const config = loadConfig();
-const redis = new Redis(config.redis);
-redis.on('connect', () => redis.disconnect());
-redis.on('error', (e) => {
- throw e;
-});
+async function connectToPostgres() {
+ const source = createPostgresDataSource(config);
+ await source.initialize();
+ await source.destroy();
+}
+
+async function connectToRedis(redisOptions) {
+ return await new Promise(async (resolve, reject) => {
+ const redis = new Redis({
+ ...redisOptions,
+ lazyConnect: true,
+ reconnectOnError: false,
+ showFriendlyErrorStack: true,
+ });
+ redis.on('error', e => reject(e));
+
+ try {
+ await redis.connect();
+ resolve();
+
+ } catch (e) {
+ reject(e);
+
+ } finally {
+ redis.disconnect(false);
+ }
+ });
+}
+
+// If not all of these are defined, the default one gets reused.
+// so we use a Set to only try connecting once to each **uniq** redis.
+const promises = Array
+ .from(new Set([
+ config.redis,
+ config.redisForPubsub,
+ config.redisForJobQueue,
+ config.redisForTimelines,
+ config.redisForReactions,
+ ]))
+ .map(connectToRedis)
+ .concat([
+ connectToPostgres()
+ ]);
+
+await Promise.allSettled(promises);
diff --git a/packages/backend/scripts/dev.mjs b/packages/backend/scripts/dev.mjs
index 2d0de0f916..a3e0558abd 100644
--- a/packages/backend/scripts/dev.mjs
+++ b/packages/backend/scripts/dev.mjs
@@ -30,6 +30,7 @@ function execStart() {
async function killProc() {
if (backendProcess) {
+ backendProcess.catch(() => {}); // backendProcess.kill()によって発生する例外を無視するためにcatch()を呼び出す
backendProcess.kill();
await new Promise(resolve => backendProcess.on('exit', resolve));
backendProcess = undefined;
@@ -46,6 +47,7 @@ async function killProc() {
],
{
stdio: [process.stdin, process.stdout, process.stderr, 'ipc'],
+ serialization: "json",
})
.on('message', async (message) => {
if (message.type === 'exit') {
diff --git a/packages/backend/scripts/generate_api_json.js b/packages/backend/scripts/generate_api_json.js
index b4769ef801..798e243004 100644
--- a/packages/backend/scripts/generate_api_json.js
+++ b/packages/backend/scripts/generate_api_json.js
@@ -3,11 +3,34 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-import { loadConfig } from '../built/config.js'
-import { genOpenapiSpec } from '../built/server/api/openapi/gen-spec.js'
-import { writeFileSync } from "node:fs";
+import { execa } from 'execa';
+import { writeFileSync, existsSync } from "node:fs";
-const config = loadConfig();
-const spec = genOpenapiSpec(config, true);
+async function main() {
+ if (!process.argv.includes('--no-build')) {
+ await execa('pnpm', ['run', 'build'], {
+ stdout: process.stdout,
+ stderr: process.stderr,
+ });
+ }
-writeFileSync('./built/api.json', JSON.stringify(spec), 'utf-8');
+ if (!existsSync('./built')) {
+ throw new Error('`built` directory does not exist.');
+ }
+
+ /** @type {import('../src/config.js')} */
+ const { loadConfig } = await import('../built/config.js');
+
+ /** @type {import('../src/server/api/openapi/gen-spec.js')} */
+ const { genOpenapiSpec } = await import('../built/server/api/openapi/gen-spec.js');
+
+ const config = loadConfig();
+ const spec = genOpenapiSpec(config, true);
+
+ writeFileSync('./built/api.json', JSON.stringify(spec), 'utf-8');
+}
+
+main().catch(e => {
+ console.error(e);
+ process.exit(1);
+});
diff --git a/packages/backend/src/GlobalModule.ts b/packages/backend/src/GlobalModule.ts
index 09971e8ca0..6ae8ccfbb3 100644
--- a/packages/backend/src/GlobalModule.ts
+++ b/packages/backend/src/GlobalModule.ts
@@ -13,6 +13,8 @@ import { createPostgresDataSource } from './postgres.js';
import { RepositoryModule } from './models/RepositoryModule.js';
import { allSettled } from './misc/promise-tracker.js';
import type { Provider, OnApplicationShutdown } from '@nestjs/common';
+import { MiMeta } from '@/models/Meta.js';
+import { GlobalEvents } from './core/GlobalEventService.js';
const $config: Provider = {
provide: DI.config,
@@ -78,11 +80,76 @@ const $redisForTimelines: Provider = {
inject: [DI.config],
};
+const $redisForReactions: Provider = {
+ provide: DI.redisForReactions,
+ useFactory: (config: Config) => {
+ return new Redis.Redis(config.redisForReactions);
+ },
+ inject: [DI.config],
+};
+
+const $meta: Provider = {
+ provide: DI.meta,
+ useFactory: async (db: DataSource, redisForSub: Redis.Redis) => {
+ const meta = await db.transaction(async transactionalEntityManager => {
+ // 過去のバグでレコードが複数出来てしまっている可能性があるので新しいIDを優先する
+ const metas = await transactionalEntityManager.find(MiMeta, {
+ order: {
+ id: 'DESC',
+ },
+ });
+
+ const meta = metas[0];
+
+ if (meta) {
+ return meta;
+ } else {
+ // metaが空のときfetchMetaが同時に呼ばれるとここが同時に呼ばれてしまうことがあるのでフェイルセーフなupsertを使う
+ const saved = await transactionalEntityManager
+ .upsert(
+ MiMeta,
+ {
+ id: 'x',
+ },
+ ['id'],
+ )
+ .then((x) => transactionalEntityManager.findOneByOrFail(MiMeta, x.identifiers[0]));
+
+ return saved;
+ }
+ });
+
+ async function onMessage(_: string, data: string): Promise {
+ const obj = JSON.parse(data);
+
+ if (obj.channel === 'internal') {
+ const { type, body } = obj.message as GlobalEvents['internal']['payload'];
+ switch (type) {
+ case 'metaUpdated': {
+ for (const key in body.after) {
+ (meta as any)[key] = (body.after as any)[key];
+ }
+ meta.proxyAccount = null; // joinなカラムは通常取ってこないので
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+
+ redisForSub.on('message', onMessage);
+
+ return meta;
+ },
+ inject: [DI.db, DI.redisForSub],
+};
+
@Global()
@Module({
imports: [RepositoryModule],
- providers: [$config, $db, $meilisearch, $redis, $redisForPub, $redisForSub, $redisForTimelines],
- exports: [$config, $db, $meilisearch, $redis, $redisForPub, $redisForSub, $redisForTimelines, RepositoryModule],
+ providers: [$config, $db, $meta, $meilisearch, $redis, $redisForPub, $redisForSub, $redisForTimelines, $redisForReactions],
+ exports: [$config, $db, $meta, $meilisearch, $redis, $redisForPub, $redisForSub, $redisForTimelines, $redisForReactions, RepositoryModule],
})
export class GlobalModule implements OnApplicationShutdown {
constructor(
@@ -91,6 +158,7 @@ export class GlobalModule implements OnApplicationShutdown {
@Inject(DI.redisForPub) private redisForPub: Redis.Redis,
@Inject(DI.redisForSub) private redisForSub: Redis.Redis,
@Inject(DI.redisForTimelines) private redisForTimelines: Redis.Redis,
+ @Inject(DI.redisForReactions) private redisForReactions: Redis.Redis,
) { }
public async dispose(): Promise {
@@ -103,6 +171,7 @@ export class GlobalModule implements OnApplicationShutdown {
this.redisForPub.disconnect(),
this.redisForSub.disconnect(),
this.redisForTimelines.disconnect(),
+ this.redisForReactions.disconnect(),
]);
}
diff --git a/packages/backend/src/NestLogger.ts b/packages/backend/src/NestLogger.ts
index 80f1f7a024..d0be19664f 100644
--- a/packages/backend/src/NestLogger.ts
+++ b/packages/backend/src/NestLogger.ts
@@ -7,7 +7,7 @@ import { LoggerService } from '@nestjs/common';
import Logger from '@/logger.js';
const logger = new Logger('core', 'cyan');
-const nestLogger = logger.createSubLogger('nest', 'green', false);
+const nestLogger = logger.createSubLogger('nest', 'green');
export class NestLogger implements LoggerService {
/**
diff --git a/packages/backend/src/boot/entry.ts b/packages/backend/src/boot/entry.ts
index 04c6ca9723..25375c3015 100644
--- a/packages/backend/src/boot/entry.ts
+++ b/packages/backend/src/boot/entry.ts
@@ -25,7 +25,7 @@ Error.stackTraceLimit = Infinity;
EventEmitter.defaultMaxListeners = 128;
const logger = new Logger('core', 'cyan');
-const clusterLogger = logger.createSubLogger('cluster', 'orange', false);
+const clusterLogger = logger.createSubLogger('cluster', 'orange');
const ev = new Xev();
//#region Events
diff --git a/packages/backend/src/boot/master.ts b/packages/backend/src/boot/master.ts
index 75e1a80cd1..4bc5c799cf 100644
--- a/packages/backend/src/boot/master.ts
+++ b/packages/backend/src/boot/master.ts
@@ -25,7 +25,7 @@ const _dirname = dirname(_filename);
const meta = JSON.parse(fs.readFileSync(`${_dirname}/../../../../built/meta.json`, 'utf-8'));
const logger = new Logger('core', 'cyan');
-const bootLogger = logger.createSubLogger('boot', 'magenta', false);
+const bootLogger = logger.createSubLogger('boot', 'magenta');
const themeColor = chalk.hex('#86b300');
diff --git a/packages/backend/src/boot/worker.ts b/packages/backend/src/boot/worker.ts
index d4a7cd56e5..5d4a15b29f 100644
--- a/packages/backend/src/boot/worker.ts
+++ b/packages/backend/src/boot/worker.ts
@@ -4,13 +4,36 @@
*/
import cluster from 'node:cluster';
+import * as Sentry from '@sentry/node';
+import { nodeProfilingIntegration } from '@sentry/profiling-node';
import { envOption } from '@/env.js';
+import { loadConfig } from '@/config.js';
import { jobQueue, server } from './common.js';
/**
* Init worker process
*/
export async function workerMain() {
+ const config = loadConfig();
+
+ if (config.sentryForBackend) {
+ Sentry.init({
+ integrations: [
+ ...(config.sentryForBackend.enableNodeProfiling ? [nodeProfilingIntegration()] : []),
+ ],
+
+ // Performance Monitoring
+ tracesSampleRate: 1.0, // Capture 100% of the transactions
+
+ // Set sampling rate for profiling - this is relative to tracesSampleRate
+ profilesSampleRate: 1.0,
+
+ maxBreadcrumbs: 0,
+
+ ...config.sentryForBackend.options,
+ });
+ }
+
if (envOption.onlyServer) {
await server();
} else if (envOption.onlyQueue) {
diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts
index 0ac521d409..42f1033b9d 100644
--- a/packages/backend/src/config.ts
+++ b/packages/backend/src/config.ts
@@ -23,7 +23,7 @@ type RedisOptionsSource = Partial & {
* 設定ファイルの型
*/
type Source = {
- url: string;
+ url?: string;
port?: number;
socket?: string;
chmodSocket?: string;
@@ -31,9 +31,9 @@ type Source = {
db: {
host: string;
port: number;
- db: string;
- user: string;
- pass: string;
+ db?: string;
+ user?: string;
+ pass?: string;
disableCache?: boolean;
extra?: { [x: string]: string };
};
@@ -49,6 +49,7 @@ type Source = {
redisForPubsub?: RedisOptionsSource;
redisForJobQueue?: RedisOptionsSource;
redisForTimelines?: RedisOptionsSource;
+ redisForReactions?: RedisOptionsSource;
meilisearch?: {
host: string;
port: string;
@@ -62,6 +63,8 @@ type Source = {
publishTarballInsteadOfProvideRepositoryUrl?: boolean;
+ setupPassword?: string;
+
proxy?: string;
proxySmtp?: string;
proxyBypassHosts?: string[];
@@ -133,7 +136,7 @@ export type Config = {
proxySmtp: string | undefined;
proxyBypassHosts: string[] | undefined;
allowedPrivateNetworks: string[] | undefined;
- maxFileSize: number | undefined;
+ maxFileSize: number;
clusterLimit: number | undefined;
id: string;
outgoingAddress: string | undefined;
@@ -151,6 +154,7 @@ export type Config = {
version: string;
publishTarballInsteadOfProvideRepositoryUrl: boolean;
+ setupPassword: string | undefined;
host: string;
hostname: string;
scheme: string;
@@ -160,8 +164,10 @@ export type Config = {
authUrl: string;
driveUrl: string;
userAgent: string;
- clientEntry: string;
- clientManifestExists: boolean;
+ frontendEntry: string;
+ frontendManifestExists: boolean;
+ frontendEmbedEntry: string;
+ frontendEmbedManifestExists: boolean;
mediaProxy: string;
externalMediaProxyEnabled: boolean;
videoThumbnailGenerator: string | null;
@@ -169,6 +175,7 @@ export type Config = {
redisForPubsub: RedisOptions & RedisOptionsSource;
redisForJobQueue: RedisOptions & RedisOptionsSource;
redisForTimelines: RedisOptions & RedisOptionsSource;
+ redisForReactions: RedisOptions & RedisOptionsSource;
sentryForBackend: { options: Partial; enableNodeProfiling: boolean; } | undefined;
sentryForFrontend: { options: Partial } | undefined;
perChannelMaxNoteCacheCount: number;
@@ -196,19 +203,29 @@ const path = process.env.MISSKEY_CONFIG_YML
export function loadConfig(): Config {
const meta = JSON.parse(fs.readFileSync(`${_dirname}/../../../built/meta.json`, 'utf-8'));
- const clientManifestExists = fs.existsSync(_dirname + '/../../../built/_vite_/manifest.json');
- const clientManifest = clientManifestExists ?
- JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_vite_/manifest.json`, 'utf-8'))
+
+ const frontendManifestExists = fs.existsSync(_dirname + '/../../../built/_frontend_vite_/manifest.json');
+ const frontendEmbedManifestExists = fs.existsSync(_dirname + '/../../../built/_frontend_embed_vite_/manifest.json');
+ const frontendManifest = frontendManifestExists ?
+ JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_frontend_vite_/manifest.json`, 'utf-8'))
: { 'src/_boot_.ts': { file: 'src/_boot_.ts' } };
+ const frontendEmbedManifest = frontendEmbedManifestExists ?
+ JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_frontend_embed_vite_/manifest.json`, 'utf-8'))
+ : { 'src/boot.ts': { file: 'src/boot.ts' } };
+
const config = yaml.load(fs.readFileSync(path, 'utf-8')) as Source;
- const url = tryCreateUrl(config.url);
+ const url = tryCreateUrl(config.url ?? process.env.MISSKEY_URL ?? '');
const version = meta.version;
const host = url.host;
const hostname = url.hostname;
const scheme = url.protocol.replace(/:$/, '');
const wsScheme = scheme.replace('http', 'ws');
+ const dbDb = config.db.db ?? process.env.DATABASE_DB ?? '';
+ const dbUser = config.db.user ?? process.env.DATABASE_USER ?? '';
+ const dbPass = config.db.pass ?? process.env.DATABASE_PASSWORD ?? '';
+
const externalMediaProxy = config.mediaProxy ?
config.mediaProxy.endsWith('/') ? config.mediaProxy.substring(0, config.mediaProxy.length - 1) : config.mediaProxy
: null;
@@ -218,6 +235,7 @@ export function loadConfig(): Config {
return {
version,
publishTarballInsteadOfProvideRepositoryUrl: !!config.publishTarballInsteadOfProvideRepositoryUrl,
+ setupPassword: config.setupPassword,
url: url.origin,
port: config.port ?? parseInt(process.env.PORT ?? '', 10),
socket: config.socket,
@@ -231,7 +249,7 @@ export function loadConfig(): Config {
apiUrl: `${scheme}://${host}/api`,
authUrl: `${scheme}://${host}/auth`,
driveUrl: `${scheme}://${host}/files`,
- db: config.db,
+ db: { ...config.db, db: dbDb, user: dbUser, pass: dbPass },
dbReplications: config.dbReplications,
dbSlaves: config.dbSlaves,
meilisearch: config.meilisearch,
@@ -239,6 +257,7 @@ export function loadConfig(): Config {
redisForPubsub: config.redisForPubsub ? convertRedisOptions(config.redisForPubsub, host) : redis,
redisForJobQueue: config.redisForJobQueue ? convertRedisOptions(config.redisForJobQueue, host) : redis,
redisForTimelines: config.redisForTimelines ? convertRedisOptions(config.redisForTimelines, host) : redis,
+ redisForReactions: config.redisForReactions ? convertRedisOptions(config.redisForReactions, host) : redis,
sentryForBackend: config.sentryForBackend,
sentryForFrontend: config.sentryForFrontend,
id: config.id,
@@ -246,7 +265,7 @@ export function loadConfig(): Config {
proxySmtp: config.proxySmtp,
proxyBypassHosts: config.proxyBypassHosts,
allowedPrivateNetworks: config.allowedPrivateNetworks,
- maxFileSize: config.maxFileSize,
+ maxFileSize: config.maxFileSize ?? 262144000,
clusterLimit: config.clusterLimit,
outgoingAddress: config.outgoingAddress,
outgoingAddressFamily: config.outgoingAddressFamily,
@@ -259,15 +278,17 @@ export function loadConfig(): Config {
deliverJobMaxAttempts: config.deliverJobMaxAttempts,
inboxJobMaxAttempts: config.inboxJobMaxAttempts,
proxyRemoteFiles: config.proxyRemoteFiles,
- signToActivityPubGet: config.signToActivityPubGet,
+ signToActivityPubGet: config.signToActivityPubGet ?? true,
mediaProxy: externalMediaProxy ?? internalMediaProxy,
externalMediaProxyEnabled: externalMediaProxy !== null && externalMediaProxy !== internalMediaProxy,
videoThumbnailGenerator: config.videoThumbnailGenerator ?
config.videoThumbnailGenerator.endsWith('/') ? config.videoThumbnailGenerator.substring(0, config.videoThumbnailGenerator.length - 1) : config.videoThumbnailGenerator
: null,
userAgent: `Misskey/${version} (${config.url})`,
- clientEntry: clientManifest['src/_boot_.ts'],
- clientManifestExists: clientManifestExists,
+ frontendEntry: frontendManifest['src/_boot_.ts'],
+ frontendManifestExists: frontendManifestExists,
+ frontendEmbedEntry: frontendEmbedManifest['src/boot.ts'],
+ frontendEmbedManifestExists: frontendEmbedManifestExists,
perChannelMaxNoteCacheCount: config.perChannelMaxNoteCacheCount ?? 1000,
perUserNotificationsMaxCount: config.perUserNotificationsMaxCount ?? 500,
deactivateAntennaThreshold: config.deactivateAntennaThreshold ?? (1000 * 60 * 60 * 24 * 7),
diff --git a/packages/backend/src/const.ts b/packages/backend/src/const.ts
index a238f4973a..e3a61861f4 100644
--- a/packages/backend/src/const.ts
+++ b/packages/backend/src/const.ts
@@ -8,6 +8,8 @@ export const MAX_NOTE_TEXT_LENGTH = 3000;
export const USER_ONLINE_THRESHOLD = 1000 * 60 * 10; // 10min
export const USER_ACTIVE_THRESHOLD = 1000 * 60 * 60 * 24 * 3; // 3days
+export const PER_NOTE_REACTION_USER_PAIR_CACHE_MAX = 16;
+
//#region hard limits
// If you change DB_* values, you must also change the DB schema.
diff --git a/packages/backend/src/core/AbuseReportNotificationService.ts b/packages/backend/src/core/AbuseReportNotificationService.ts
new file mode 100644
index 0000000000..25e265f2b1
--- /dev/null
+++ b/packages/backend/src/core/AbuseReportNotificationService.ts
@@ -0,0 +1,432 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { Inject, Injectable, type OnApplicationShutdown } from '@nestjs/common';
+import { Brackets, In, IsNull, Not } from 'typeorm';
+import * as Redis from 'ioredis';
+import sanitizeHtml from 'sanitize-html';
+import { DI } from '@/di-symbols.js';
+import { bindThis } from '@/decorators.js';
+import { GlobalEvents, GlobalEventService } from '@/core/GlobalEventService.js';
+import type {
+ AbuseReportNotificationRecipientRepository,
+ MiAbuseReportNotificationRecipient,
+ MiAbuseUserReport,
+ MiMeta,
+ MiUser,
+} from '@/models/_.js';
+import { EmailService } from '@/core/EmailService.js';
+import { RoleService } from '@/core/RoleService.js';
+import { RecipientMethod } from '@/models/AbuseReportNotificationRecipient.js';
+import { ModerationLogService } from '@/core/ModerationLogService.js';
+import { SystemWebhookService } from '@/core/SystemWebhookService.js';
+import { UserEntityService } from '@/core/entities/UserEntityService.js';
+import { IdService } from './IdService.js';
+
+@Injectable()
+export class AbuseReportNotificationService implements OnApplicationShutdown {
+ constructor(
+ @Inject(DI.meta)
+ private meta: MiMeta,
+
+ @Inject(DI.abuseReportNotificationRecipientRepository)
+ private abuseReportNotificationRecipientRepository: AbuseReportNotificationRecipientRepository,
+
+ @Inject(DI.redisForSub)
+ private redisForSub: Redis.Redis,
+
+ private idService: IdService,
+ private roleService: RoleService,
+ private systemWebhookService: SystemWebhookService,
+ private emailService: EmailService,
+ private moderationLogService: ModerationLogService,
+ private globalEventService: GlobalEventService,
+ private userEntityService: UserEntityService,
+ ) {
+ this.redisForSub.on('message', this.onMessage);
+ }
+
+ /**
+ * 管理者用Redisイベントを用いて{@link abuseReports}の内容を管理者各位に通知する.
+ * 通知先ユーザは{@link getModeratorIds}の取得結果に依る.
+ *
+ * @see RoleService.getModeratorIds
+ * @see GlobalEventService.publishAdminStream
+ */
+ @bindThis
+ public async notifyAdminStream(abuseReports: MiAbuseUserReport[]) {
+ if (abuseReports.length <= 0) {
+ return;
+ }
+
+ const moderatorIds = await this.roleService.getModeratorIds({
+ includeAdmins: true,
+ excludeExpire: true,
+ });
+
+ for (const moderatorId of moderatorIds) {
+ for (const abuseReport of abuseReports) {
+ this.globalEventService.publishAdminStream(
+ moderatorId,
+ 'newAbuseUserReport',
+ {
+ id: abuseReport.id,
+ targetUserId: abuseReport.targetUserId,
+ reporterId: abuseReport.reporterId,
+ comment: abuseReport.comment,
+ },
+ );
+ }
+ }
+ }
+
+ /**
+ * Mailを用いて{@link abuseReports}の内容を管理者各位に通知する.
+ * メールアドレスの送信先は以下の通り.
+ * - モデレータ権限所有者ユーザ(設定画面からメールアドレスの設定を行っているユーザに限る)
+ * - metaテーブルに設定されているメールアドレス
+ *
+ * @see EmailService.sendEmail
+ */
+ @bindThis
+ public async notifyMail(abuseReports: MiAbuseUserReport[]) {
+ if (abuseReports.length <= 0) {
+ return;
+ }
+
+ const recipientEMailAddresses = await this.fetchEMailRecipients().then(it => it
+ .filter(it => it.isActive && it.userProfile?.emailVerified)
+ .map(it => it.userProfile?.email)
+ .filter(x => x != null),
+ );
+
+ recipientEMailAddresses.push(
+ ...(this.meta.email ? [this.meta.email] : []),
+ );
+
+ if (recipientEMailAddresses.length <= 0) {
+ return;
+ }
+
+ for (const mailAddress of recipientEMailAddresses) {
+ await Promise.all(
+ abuseReports.map(it => {
+ // TODO: 送信処理はJobQueue化したい
+ return this.emailService.sendEmail(
+ mailAddress,
+ 'New Abuse Report',
+ sanitizeHtml(it.comment),
+ sanitizeHtml(it.comment),
+ );
+ }),
+ );
+ }
+ }
+
+ /**
+ * SystemWebhookを用いて{@link abuseReports}の内容を管理者各位に通知する.
+ * ここではJobQueueへのエンキューのみを行うため、即時実行されない.
+ *
+ * @see SystemWebhookService.enqueueSystemWebhook
+ */
+ @bindThis
+ public async notifySystemWebhook(
+ abuseReports: MiAbuseUserReport[],
+ type: 'abuseReport' | 'abuseReportResolved',
+ ) {
+ if (abuseReports.length <= 0) {
+ return;
+ }
+
+ const usersMap = await this.userEntityService.packMany(
+ [
+ ...new Set([
+ ...abuseReports.map(it => it.reporter ?? it.reporterId),
+ ...abuseReports.map(it => it.targetUser ?? it.targetUserId),
+ ...abuseReports.map(it => it.assignee ?? it.assigneeId),
+ ].filter(x => x != null)),
+ ],
+ null,
+ { schema: 'UserLite' },
+ ).then(it => new Map(it.map(it => [it.id, it])));
+ const convertedReports = abuseReports.map(it => {
+ return {
+ ...it,
+ reporter: usersMap.get(it.reporterId),
+ targetUser: usersMap.get(it.targetUserId),
+ assignee: it.assigneeId ? usersMap.get(it.assigneeId) : null,
+ };
+ });
+
+ const recipientWebhookIds = await this.fetchWebhookRecipients()
+ .then(it => it
+ .filter(it => it.isActive && it.systemWebhookId && it.method === 'webhook')
+ .map(it => it.systemWebhookId)
+ .filter(x => x != null));
+ for (const webhookId of recipientWebhookIds) {
+ await Promise.all(
+ convertedReports.map(it => {
+ return this.systemWebhookService.enqueueSystemWebhook(
+ webhookId,
+ type,
+ it,
+ );
+ }),
+ );
+ }
+ }
+
+ /**
+ * 通報の通知先一覧を取得する.
+ *
+ * @param {Object} [params] クエリの取得条件
+ * @param {Object} [params.method] 取得する通知先の通知方法
+ * @param {Object} [opts] 動作時の詳細なオプション
+ * @param {boolean} [opts.removeUnauthorized] 副作用としてモデレータ権限を持たない送信先ユーザをDBから削除するかどうか(default: true)
+ * @param {boolean} [opts.joinUser] 通知先のユーザ情報をJOINするかどうか(default: false)
+ * @param {boolean} [opts.joinSystemWebhook] 通知先のSystemWebhook情報をJOINするかどうか(default: false)
+ * @see removeUnauthorizedRecipientUsers
+ */
+ @bindThis
+ public async fetchRecipients(
+ params?: {
+ ids?: MiAbuseReportNotificationRecipient['id'][],
+ method?: RecipientMethod[],
+ },
+ opts?: {
+ removeUnauthorized?: boolean,
+ joinUser?: boolean,
+ joinSystemWebhook?: boolean,
+ },
+ ): Promise {
+ const query = this.abuseReportNotificationRecipientRepository.createQueryBuilder('recipient');
+
+ if (opts?.joinUser) {
+ query.innerJoinAndSelect('user', 'user', 'recipient.userId = user.id');
+ query.innerJoinAndSelect('recipient.userProfile', 'userProfile');
+ }
+
+ if (opts?.joinSystemWebhook) {
+ query.innerJoinAndSelect('recipient.systemWebhook', 'systemWebhook');
+ }
+
+ if (params?.ids) {
+ query.andWhere({ id: In(params.ids) });
+ }
+
+ if (params?.method) {
+ query.andWhere(new Brackets(qb => {
+ if (params.method?.includes('email')) {
+ qb.orWhere({ method: 'email', userId: Not(IsNull()) });
+ }
+ if (params.method?.includes('webhook')) {
+ qb.orWhere({ method: 'webhook', userId: IsNull() });
+ }
+ }));
+ }
+
+ const recipients = await query.getMany();
+ if (recipients.length <= 0) {
+ return [];
+ }
+
+ // アサイン有効期限切れはイベントで拾えないので、このタイミングでチェック及び削除(オプション)
+ return (opts?.removeUnauthorized ?? true)
+ ? await this.removeUnauthorizedRecipientUsers(recipients)
+ : recipients;
+ }
+
+ /**
+ * EMailの通知先一覧を取得する.
+ * リレーション先の{@link MiUser}および{@link MiUserProfile}も同時に取得する.
+ *
+ * @param {Object} [opts]
+ * @param {boolean} [opts.removeUnauthorized] 副作用としてモデレータ権限を持たない送信先ユーザをDBから削除するかどうか(default: true)
+ * @see removeUnauthorizedRecipientUsers
+ */
+ @bindThis
+ public async fetchEMailRecipients(opts?: {
+ removeUnauthorized?: boolean
+ }): Promise {
+ return this.fetchRecipients({ method: ['email'] }, { joinUser: true, ...opts });
+ }
+
+ /**
+ * Webhookの通知先一覧を取得する.
+ * リレーション先の{@link MiSystemWebhook}も同時に取得する.
+ */
+ @bindThis
+ public fetchWebhookRecipients(): Promise {
+ return this.fetchRecipients({ method: ['webhook'] }, { joinSystemWebhook: true });
+ }
+
+ /**
+ * 通知先を作成する.
+ */
+ @bindThis
+ public async createRecipient(
+ params: {
+ isActive: MiAbuseReportNotificationRecipient['isActive'];
+ name: MiAbuseReportNotificationRecipient['name'];
+ method: MiAbuseReportNotificationRecipient['method'];
+ userId: MiAbuseReportNotificationRecipient['userId'];
+ systemWebhookId: MiAbuseReportNotificationRecipient['systemWebhookId'];
+ },
+ updater: MiUser,
+ ): Promise {
+ const id = this.idService.gen();
+ await this.abuseReportNotificationRecipientRepository.insert({
+ ...params,
+ id,
+ });
+
+ const created = await this.abuseReportNotificationRecipientRepository.findOneByOrFail({ id: id });
+
+ this.moderationLogService
+ .log(updater, 'createAbuseReportNotificationRecipient', {
+ recipientId: id,
+ recipient: created,
+ });
+
+ return created;
+ }
+
+ /**
+ * 通知先を更新する.
+ */
+ @bindThis
+ public async updateRecipient(
+ params: {
+ id: MiAbuseReportNotificationRecipient['id'];
+ isActive: MiAbuseReportNotificationRecipient['isActive'];
+ name: MiAbuseReportNotificationRecipient['name'];
+ method: MiAbuseReportNotificationRecipient['method'];
+ userId: MiAbuseReportNotificationRecipient['userId'];
+ systemWebhookId: MiAbuseReportNotificationRecipient['systemWebhookId'];
+ },
+ updater: MiUser,
+ ): Promise {
+ const beforeEntity = await this.abuseReportNotificationRecipientRepository.findOneByOrFail({ id: params.id });
+
+ await this.abuseReportNotificationRecipientRepository.update(params.id, {
+ isActive: params.isActive,
+ updatedAt: new Date(),
+ name: params.name,
+ method: params.method,
+ userId: params.userId,
+ systemWebhookId: params.systemWebhookId,
+ });
+
+ const afterEntity = await this.abuseReportNotificationRecipientRepository.findOneByOrFail({ id: params.id });
+
+ this.moderationLogService
+ .log(updater, 'updateAbuseReportNotificationRecipient', {
+ recipientId: params.id,
+ before: beforeEntity,
+ after: afterEntity,
+ });
+
+ return afterEntity;
+ }
+
+ /**
+ * 通知先を削除する.
+ */
+ @bindThis
+ public async deleteRecipient(
+ id: MiAbuseReportNotificationRecipient['id'],
+ updater: MiUser,
+ ) {
+ const entity = await this.abuseReportNotificationRecipientRepository.findBy({ id });
+
+ await this.abuseReportNotificationRecipientRepository.delete(id);
+
+ this.moderationLogService
+ .log(updater, 'deleteAbuseReportNotificationRecipient', {
+ recipientId: id,
+ recipient: entity,
+ });
+ }
+
+ /**
+ * モデレータ権限を持たない(*1)通知先ユーザを削除する.
+ *
+ * *1: 以下の両方を満たすものの事を言う
+ * - 通知先にユーザIDが設定されている
+ * - 付与ロールにモデレータ権限がない or アサインの有効期限が切れている
+ *
+ * @param recipients 通知先一覧の配列
+ * @returns {@lisk recipients}からモデレータ権限を持たない通知先を削除した配列
+ */
+ @bindThis
+ private async removeUnauthorizedRecipientUsers(recipients: MiAbuseReportNotificationRecipient[]): Promise {
+ const userRecipients = recipients.filter(it => it.userId !== null);
+ const recipientUserIds = new Set(userRecipients.map(it => it.userId).filter(x => x != null));
+ if (recipientUserIds.size <= 0) {
+ // ユーザが通知先として設定されていない場合、この関数での処理を行うべきレコードが無い
+ return recipients;
+ }
+
+ // モデレータ権限の有無で通知先設定を振り分ける
+ const authorizedUserIds = await this.roleService.getModeratorIds({
+ includeAdmins: true,
+ excludeExpire: true,
+ });
+ const authorizedUserRecipients = Array.of();
+ const unauthorizedUserRecipients = Array.of();
+ for (const recipient of userRecipients) {
+ // eslint-disable-next-line
+ if (authorizedUserIds.includes(recipient.userId!)) {
+ authorizedUserRecipients.push(recipient);
+ } else {
+ unauthorizedUserRecipients.push(recipient);
+ }
+ }
+
+ // モデレータ権限を持たない通知先をDBから削除する
+ if (unauthorizedUserRecipients.length > 0) {
+ await this.abuseReportNotificationRecipientRepository.delete(unauthorizedUserRecipients.map(it => it.id));
+ }
+ const nonUserRecipients = recipients.filter(it => it.userId === null);
+ return [...nonUserRecipients, ...authorizedUserRecipients].sort((a, b) => a.id.localeCompare(b.id));
+ }
+
+ @bindThis
+ private async onMessage(_: string, data: string): Promise {
+ const obj = JSON.parse(data);
+ if (obj.channel !== 'internal') {
+ return;
+ }
+
+ const { type } = obj.message as GlobalEvents['internal']['payload'];
+ switch (type) {
+ case 'roleUpdated':
+ case 'roleDeleted':
+ case 'userRoleUnassigned': {
+ // 場合によってはキャッシュ更新よりも先にここが呼ばれてしまう可能性があるのでnextTickで遅延実行
+ process.nextTick(async () => {
+ const recipients = await this.abuseReportNotificationRecipientRepository.findBy({
+ userId: Not(IsNull()),
+ });
+ await this.removeUnauthorizedRecipientUsers(recipients);
+ });
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ }
+
+ @bindThis
+ public dispose(): void {
+ this.redisForSub.off('message', this.onMessage);
+ }
+
+ @bindThis
+ public onApplicationShutdown(signal?: string | undefined): void {
+ this.dispose();
+ }
+}
diff --git a/packages/backend/src/core/AbuseReportService.ts b/packages/backend/src/core/AbuseReportService.ts
new file mode 100644
index 0000000000..0b022d3b08
--- /dev/null
+++ b/packages/backend/src/core/AbuseReportService.ts
@@ -0,0 +1,176 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { Inject, Injectable } from '@nestjs/common';
+import { In } from 'typeorm';
+import { DI } from '@/di-symbols.js';
+import { bindThis } from '@/decorators.js';
+import type { AbuseUserReportsRepository, MiAbuseUserReport, MiUser, UsersRepository } from '@/models/_.js';
+import { AbuseReportNotificationService } from '@/core/AbuseReportNotificationService.js';
+import { QueueService } from '@/core/QueueService.js';
+import { InstanceActorService } from '@/core/InstanceActorService.js';
+import { ApRendererService } from '@/core/activitypub/ApRendererService.js';
+import { ModerationLogService } from '@/core/ModerationLogService.js';
+import { IdService } from './IdService.js';
+
+@Injectable()
+export class AbuseReportService {
+ constructor(
+ @Inject(DI.abuseUserReportsRepository)
+ private abuseUserReportsRepository: AbuseUserReportsRepository,
+
+ @Inject(DI.usersRepository)
+ private usersRepository: UsersRepository,
+
+ private idService: IdService,
+ private abuseReportNotificationService: AbuseReportNotificationService,
+ private queueService: QueueService,
+ private instanceActorService: InstanceActorService,
+ private apRendererService: ApRendererService,
+ private moderationLogService: ModerationLogService,
+ ) {
+ }
+
+ /**
+ * ユーザからの通報をDBに記録し、その内容を下記の手段で管理者各位に通知する.
+ * - 管理者用Redisイベント
+ * - EMail(モデレータ権限所有者ユーザ+metaテーブルに設定されているメールアドレス)
+ * - SystemWebhook
+ *
+ * @param params 通報内容. もし複数件の通報に対応した時のために、あらかじめ複数件を処理できる前提で考える
+ * @see AbuseReportNotificationService.notify
+ */
+ @bindThis
+ public async report(params: {
+ targetUserId: MiAbuseUserReport['targetUserId'],
+ targetUserHost: MiAbuseUserReport['targetUserHost'],
+ reporterId: MiAbuseUserReport['reporterId'],
+ reporterHost: MiAbuseUserReport['reporterHost'],
+ comment: string,
+ }[]) {
+ const entities = params.map(param => {
+ return {
+ id: this.idService.gen(),
+ targetUserId: param.targetUserId,
+ targetUserHost: param.targetUserHost,
+ reporterId: param.reporterId,
+ reporterHost: param.reporterHost,
+ comment: param.comment,
+ };
+ });
+
+ const reports = Array.of();
+ for (const entity of entities) {
+ const report = await this.abuseUserReportsRepository.insertOne(entity);
+ reports.push(report);
+ }
+
+ return Promise.all([
+ this.abuseReportNotificationService.notifyAdminStream(reports),
+ this.abuseReportNotificationService.notifySystemWebhook(reports, 'abuseReport'),
+ this.abuseReportNotificationService.notifyMail(reports),
+ ]);
+ }
+
+ /**
+ * 通報を解決し、その内容を下記の手段で管理者各位に通知する.
+ * - SystemWebhook
+ *
+ * @param params 通報内容. もし複数件の通報に対応した時のために、あらかじめ複数件を処理できる前提で考える
+ * @param moderator 通報を処理したユーザ
+ * @see AbuseReportNotificationService.notify
+ */
+ @bindThis
+ public async resolve(
+ params: {
+ reportId: string;
+ resolvedAs: MiAbuseUserReport['resolvedAs'];
+ }[],
+ moderator: MiUser,
+ ) {
+ const paramsMap = new Map(params.map(it => [it.reportId, it]));
+ const reports = await this.abuseUserReportsRepository.findBy({
+ id: In(params.map(it => it.reportId)),
+ });
+
+ for (const report of reports) {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ const ps = paramsMap.get(report.id)!;
+
+ await this.abuseUserReportsRepository.update(report.id, {
+ resolved: true,
+ assigneeId: moderator.id,
+ resolvedAs: ps.resolvedAs,
+ });
+
+ this.moderationLogService
+ .log(moderator, 'resolveAbuseReport', {
+ reportId: report.id,
+ report: report,
+ resolvedAs: ps.resolvedAs,
+ });
+ }
+
+ return this.abuseUserReportsRepository.findBy({ id: In(reports.map(it => it.id)) })
+ .then(reports => this.abuseReportNotificationService.notifySystemWebhook(reports, 'abuseReportResolved'));
+ }
+
+ @bindThis
+ public async forward(
+ reportId: MiAbuseUserReport['id'],
+ moderator: MiUser,
+ ) {
+ const report = await this.abuseUserReportsRepository.findOneByOrFail({ id: reportId });
+
+ if (report.targetUserHost == null) {
+ throw new Error('The target user host is null.');
+ }
+
+ if (report.forwarded) {
+ throw new Error('The report has already been forwarded.');
+ }
+
+ await this.abuseUserReportsRepository.update(report.id, {
+ forwarded: true,
+ });
+
+ const actor = await this.instanceActorService.getInstanceActor();
+ const targetUser = await this.usersRepository.findOneByOrFail({ id: report.targetUserId });
+
+ const flag = this.apRendererService.renderFlag(actor, targetUser.uri!, report.comment);
+ const contextAssignedFlag = this.apRendererService.addContext(flag);
+ this.queueService.deliver(actor, contextAssignedFlag, targetUser.inbox, false);
+
+ this.moderationLogService
+ .log(moderator, 'forwardAbuseReport', {
+ reportId: report.id,
+ report: report,
+ });
+ }
+
+ @bindThis
+ public async update(
+ reportId: MiAbuseUserReport['id'],
+ params: {
+ moderationNote?: MiAbuseUserReport['moderationNote'];
+ },
+ moderator: MiUser,
+ ) {
+ const report = await this.abuseUserReportsRepository.findOneByOrFail({ id: reportId });
+
+ await this.abuseUserReportsRepository.update(report.id, {
+ moderationNote: params.moderationNote,
+ });
+
+ if (params.moderationNote != null && report.moderationNote !== params.moderationNote) {
+ this.moderationLogService.log(moderator, 'updateAbuseReportNote', {
+ reportId: report.id,
+ report: report,
+ before: report.moderationNote,
+ after: params.moderationNote,
+ });
+ }
+ }
+}
diff --git a/packages/backend/src/core/AccountMoveService.ts b/packages/backend/src/core/AccountMoveService.ts
index b6b591d240..24d11f29ff 100644
--- a/packages/backend/src/core/AccountMoveService.ts
+++ b/packages/backend/src/core/AccountMoveService.ts
@@ -9,7 +9,7 @@ import { IsNull, In, MoreThan, Not } from 'typeorm';
import { bindThis } from '@/decorators.js';
import { DI } from '@/di-symbols.js';
import type { MiLocalUser, MiRemoteUser, MiUser } from '@/models/User.js';
-import type { BlockingsRepository, FollowingsRepository, InstancesRepository, MutingsRepository, UserListMembershipsRepository, UsersRepository } from '@/models/_.js';
+import type { BlockingsRepository, FollowingsRepository, InstancesRepository, MiMeta, MutingsRepository, UserListMembershipsRepository, UsersRepository } from '@/models/_.js';
import type { RelationshipJobData, ThinUser } from '@/queue/types.js';
import { IdService } from '@/core/IdService.js';
@@ -22,13 +22,15 @@ import { ApRendererService } from '@/core/activitypub/ApRendererService.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { ProxyAccountService } from '@/core/ProxyAccountService.js';
import { FederatedInstanceService } from '@/core/FederatedInstanceService.js';
-import { MetaService } from '@/core/MetaService.js';
import InstanceChart from '@/core/chart/charts/instance.js';
import PerUserFollowingChart from '@/core/chart/charts/per-user-following.js';
@Injectable()
export class AccountMoveService {
constructor(
+ @Inject(DI.meta)
+ private meta: MiMeta,
+
@Inject(DI.usersRepository)
private usersRepository: UsersRepository,
@@ -57,7 +59,6 @@ export class AccountMoveService {
private perUserFollowingChart: PerUserFollowingChart,
private federatedInstanceService: FederatedInstanceService,
private instanceChart: InstanceChart,
- private metaService: MetaService,
private relayService: RelayService,
private queueService: QueueService,
) {
@@ -273,13 +274,15 @@ export class AccountMoveService {
}
// Update instance stats by decreasing remote followers count by the number of local followers who were following the old account.
- if (this.userEntityService.isRemoteUser(oldAccount)) {
- this.federatedInstanceService.fetch(oldAccount.host).then(async i => {
- this.instancesRepository.decrement({ id: i.id }, 'followersCount', localFollowerIds.length);
- if ((await this.metaService.fetch()).enableChartsForFederatedInstances) {
- this.instanceChart.updateFollowers(i.host, false);
- }
- });
+ if (this.meta.enableStatsForFederatedInstances) {
+ if (this.userEntityService.isRemoteUser(oldAccount)) {
+ this.federatedInstanceService.fetchOrRegister(oldAccount.host).then(async i => {
+ this.instancesRepository.decrement({ id: i.id }, 'followersCount', localFollowerIds.length);
+ if (this.meta.enableChartsForFederatedInstances) {
+ this.instanceChart.updateFollowers(i.host, false);
+ }
+ });
+ }
}
// FIXME: expensive?
diff --git a/packages/backend/src/core/AnnouncementService.ts b/packages/backend/src/core/AnnouncementService.ts
index 40a9db01c0..d4fcf19439 100644
--- a/packages/backend/src/core/AnnouncementService.ts
+++ b/packages/backend/src/core/AnnouncementService.ts
@@ -209,6 +209,13 @@ export class AnnouncementService {
return;
}
+ const announcement = await this.announcementsRepository.findOneBy({ id: announcementId });
+ if (announcement != null && announcement.userId === user.id) {
+ await this.announcementsRepository.update(announcementId, {
+ isActive: false,
+ });
+ }
+
if ((await this.getUnreadAnnouncements(user)).length === 0) {
this.globalEventService.publishMainStream(user.id, 'readAllAnnouncements');
}
diff --git a/packages/backend/src/core/AntennaService.ts b/packages/backend/src/core/AntennaService.ts
index 793d8974b3..e827ffa68c 100644
--- a/packages/backend/src/core/AntennaService.ts
+++ b/packages/backend/src/core/AntennaService.ts
@@ -123,11 +123,14 @@ export class AntennaService implements OnApplicationShutdown {
if (antenna.src === 'home') {
// TODO
} else if (antenna.src === 'list') {
- const listUsers = (await this.userListMembershipsRepository.findBy({
- userListId: antenna.userListId!,
- })).map(x => x.userId);
-
- if (!listUsers.includes(note.userId)) return false;
+ if (antenna.userListId == null) return false;
+ const exists = await this.userListMembershipsRepository.exists({
+ where: {
+ userListId: antenna.userListId,
+ userId: note.userId,
+ },
+ });
+ if (!exists) return false;
} else if (antenna.src === 'users') {
const accts = antenna.users.map(x => {
const { username, host } = Acct.parse(x);
diff --git a/packages/backend/src/core/AvatarDecorationService.ts b/packages/backend/src/core/AvatarDecorationService.ts
index 8b54bbe012..4efd6122b1 100644
--- a/packages/backend/src/core/AvatarDecorationService.ts
+++ b/packages/backend/src/core/AvatarDecorationService.ts
@@ -29,7 +29,7 @@ export class AvatarDecorationService implements OnApplicationShutdown {
private moderationLogService: ModerationLogService,
private globalEventService: GlobalEventService,
) {
- this.cache = new MemorySingleCache(1000 * 60 * 30);
+ this.cache = new MemorySingleCache(1000 * 60 * 30); // 30s
this.redisForSub.on('message', this.onMessage);
}
diff --git a/packages/backend/src/core/CacheService.ts b/packages/backend/src/core/CacheService.ts
index d008e7ec52..6725ebe75b 100644
--- a/packages/backend/src/core/CacheService.ts
+++ b/packages/backend/src/core/CacheService.ts
@@ -56,10 +56,10 @@ export class CacheService implements OnApplicationShutdown {
) {
//this.onMessage = this.onMessage.bind(this);
- this.userByIdCache = new MemoryKVCache(Infinity);
- this.localUserByNativeTokenCache = new MemoryKVCache(Infinity);
- this.localUserByIdCache = new MemoryKVCache(Infinity);
- this.uriPersonCache = new MemoryKVCache(Infinity);
+ this.userByIdCache = new MemoryKVCache(1000 * 60 * 5); // 5m
+ this.localUserByNativeTokenCache = new MemoryKVCache(1000 * 60 * 5); // 5m
+ this.localUserByIdCache = new MemoryKVCache(1000 * 60 * 5); // 5m
+ this.uriPersonCache = new MemoryKVCache(1000 * 60 * 5); // 5m
this.userProfileCache = new RedisKVCache(this.redisClient, 'userProfile', {
lifetime: 1000 * 60 * 30, // 30m
@@ -135,14 +135,14 @@ export class CacheService implements OnApplicationShutdown {
if (user == null) {
this.userByIdCache.delete(body.id);
this.localUserByIdCache.delete(body.id);
- for (const [k, v] of this.uriPersonCache.cache.entries()) {
+ for (const [k, v] of this.uriPersonCache.entries) {
if (v.value?.id === body.id) {
this.uriPersonCache.delete(k);
}
}
} else {
this.userByIdCache.set(user.id, user);
- for (const [k, v] of this.uriPersonCache.cache.entries()) {
+ for (const [k, v] of this.uriPersonCache.entries) {
if (v.value?.id === user.id) {
this.uriPersonCache.set(k, user);
}
diff --git a/packages/backend/src/core/CaptchaService.ts b/packages/backend/src/core/CaptchaService.ts
index f6b7955cd2..206d0dbe0a 100644
--- a/packages/backend/src/core/CaptchaService.ts
+++ b/packages/backend/src/core/CaptchaService.ts
@@ -119,5 +119,18 @@ export class CaptchaService {
throw new Error(`turnstile-failed: ${errorCodes}`);
}
}
+
+ @bindThis
+ public async verifyTestcaptcha(response: string | null | undefined): Promise {
+ if (response == null) {
+ throw new Error('testcaptcha-failed: no response provided');
+ }
+
+ const success = response === 'testcaptcha-passed';
+
+ if (!success) {
+ throw new Error('testcaptcha-failed');
+ }
+ }
}
diff --git a/packages/backend/src/core/ClipService.ts b/packages/backend/src/core/ClipService.ts
index 9fd1ebad87..929a9db064 100644
--- a/packages/backend/src/core/ClipService.ts
+++ b/packages/backend/src/core/ClipService.ts
@@ -41,7 +41,7 @@ export class ClipService {
const currentCount = await this.clipsRepository.countBy({
userId: me.id,
});
- if (currentCount > (await this.roleService.getUserPolicies(me.id)).clipLimit) {
+ if (currentCount >= (await this.roleService.getUserPolicies(me.id)).clipLimit) {
throw new ClipService.TooManyClipsError();
}
@@ -102,7 +102,7 @@ export class ClipService {
const currentCount = await this.clipNotesRepository.countBy({
clipId: clip.id,
});
- if (currentCount > (await this.roleService.getUserPolicies(me.id)).noteEachClipsLimit) {
+ if (currentCount >= (await this.roleService.getUserPolicies(me.id)).noteEachClipsLimit) {
throw new ClipService.TooManyClipNotesError();
}
diff --git a/packages/backend/src/core/CoreModule.ts b/packages/backend/src/core/CoreModule.ts
index be80df6f1c..734d135648 100644
--- a/packages/backend/src/core/CoreModule.ts
+++ b/packages/backend/src/core/CoreModule.ts
@@ -5,6 +5,16 @@
import { Module } from '@nestjs/common';
import { FanoutTimelineEndpointService } from '@/core/FanoutTimelineEndpointService.js';
+import { AbuseReportService } from '@/core/AbuseReportService.js';
+import { SystemWebhookEntityService } from '@/core/entities/SystemWebhookEntityService.js';
+import {
+ AbuseReportNotificationRecipientEntityService,
+} from '@/core/entities/AbuseReportNotificationRecipientEntityService.js';
+import { AbuseReportNotificationService } from '@/core/AbuseReportNotificationService.js';
+import { SystemWebhookService } from '@/core/SystemWebhookService.js';
+import { UserSearchService } from '@/core/UserSearchService.js';
+import { WebhookTestService } from '@/core/WebhookTestService.js';
+import { FlashService } from '@/core/FlashService.js';
import { AccountMoveService } from './AccountMoveService.js';
import { AccountUpdateService } from './AccountUpdateService.js';
import { AiService } from './AiService.js';
@@ -41,6 +51,7 @@ import { PollService } from './PollService.js';
import { PushNotificationService } from './PushNotificationService.js';
import { QueryService } from './QueryService.js';
import { ReactionService } from './ReactionService.js';
+import { ReactionsBufferingService } from './ReactionsBufferingService.js';
import { RelayService } from './RelayService.js';
import { RoleService } from './RoleService.js';
import { S3Service } from './S3Service.js';
@@ -53,10 +64,11 @@ import { UserFollowingService } from './UserFollowingService.js';
import { UserKeypairService } from './UserKeypairService.js';
import { UserListService } from './UserListService.js';
import { UserMutingService } from './UserMutingService.js';
+import { UserRenoteMutingService } from './UserRenoteMutingService.js';
import { UserSuspendService } from './UserSuspendService.js';
import { UserAuthService } from './UserAuthService.js';
import { VideoProcessingService } from './VideoProcessingService.js';
-import { WebhookService } from './WebhookService.js';
+import { UserWebhookService } from './UserWebhookService.js';
import { ProxyAccountService } from './ProxyAccountService.js';
import { UtilityService } from './UtilityService.js';
import { FileInfoService } from './FileInfoService.js';
@@ -144,6 +156,8 @@ import type { Provider } from '@nestjs/common';
//#region 文字列ベースでのinjection用(循環参照対応のため)
const $LoggerService: Provider = { provide: 'LoggerService', useExisting: LoggerService };
+const $AbuseReportService: Provider = { provide: 'AbuseReportService', useExisting: AbuseReportService };
+const $AbuseReportNotificationService: Provider = { provide: 'AbuseReportNotificationService', useExisting: AbuseReportNotificationService };
const $AccountMoveService: Provider = { provide: 'AccountMoveService', useExisting: AccountMoveService };
const $AccountUpdateService: Provider = { provide: 'AccountUpdateService', useExisting: AccountUpdateService };
const $AiService: Provider = { provide: 'AiService', useExisting: AiService };
@@ -181,6 +195,7 @@ const $ProxyAccountService: Provider = { provide: 'ProxyAccountService', useExis
const $PushNotificationService: Provider = { provide: 'PushNotificationService', useExisting: PushNotificationService };
const $QueryService: Provider = { provide: 'QueryService', useExisting: QueryService };
const $ReactionService: Provider = { provide: 'ReactionService', useExisting: ReactionService };
+const $ReactionsBufferingService: Provider = { provide: 'ReactionsBufferingService', useExisting: ReactionsBufferingService };
const $RelayService: Provider = { provide: 'RelayService', useExisting: RelayService };
const $RoleService: Provider = { provide: 'RoleService', useExisting: RoleService };
const $S3Service: Provider = { provide: 'S3Service', useExisting: S3Service };
@@ -193,12 +208,17 @@ const $UserFollowingService: Provider = { provide: 'UserFollowingService', useEx
const $UserKeypairService: Provider = { provide: 'UserKeypairService', useExisting: UserKeypairService };
const $UserListService: Provider = { provide: 'UserListService', useExisting: UserListService };
const $UserMutingService: Provider = { provide: 'UserMutingService', useExisting: UserMutingService };
+const $UserRenoteMutingService: Provider = { provide: 'UserRenoteMutingService', useExisting: UserRenoteMutingService };
+const $UserSearchService: Provider = { provide: 'UserSearchService', useExisting: UserSearchService };
const $UserSuspendService: Provider = { provide: 'UserSuspendService', useExisting: UserSuspendService };
const $UserAuthService: Provider = { provide: 'UserAuthService', useExisting: UserAuthService };
const $VideoProcessingService: Provider = { provide: 'VideoProcessingService', useExisting: VideoProcessingService };
-const $WebhookService: Provider = { provide: 'WebhookService', useExisting: WebhookService };
+const $UserWebhookService: Provider = { provide: 'UserWebhookService', useExisting: UserWebhookService };
+const $SystemWebhookService: Provider = { provide: 'SystemWebhookService', useExisting: SystemWebhookService };
+const $WebhookTestService: Provider = { provide: 'WebhookTestService', useExisting: WebhookTestService };
const $UtilityService: Provider = { provide: 'UtilityService', useExisting: UtilityService };
const $FileInfoService: Provider = { provide: 'FileInfoService', useExisting: FileInfoService };
+const $FlashService: Provider = { provide: 'FlashService', useExisting: FlashService };
const $SearchService: Provider = { provide: 'SearchService', useExisting: SearchService };
const $ClipService: Provider = { provide: 'ClipService', useExisting: ClipService };
const $FeaturedService: Provider = { provide: 'FeaturedService', useExisting: FeaturedService };
@@ -225,6 +245,7 @@ const $ChartManagementService: Provider = { provide: 'ChartManagementService', u
const $AbuseUserReportEntityService: Provider = { provide: 'AbuseUserReportEntityService', useExisting: AbuseUserReportEntityService };
const $AnnouncementEntityService: Provider = { provide: 'AnnouncementEntityService', useExisting: AnnouncementEntityService };
+const $AbuseReportNotificationRecipientEntityService: Provider = { provide: 'AbuseReportNotificationRecipientEntityService', useExisting: AbuseReportNotificationRecipientEntityService };
const $AntennaEntityService: Provider = { provide: 'AntennaEntityService', useExisting: AntennaEntityService };
const $AppEntityService: Provider = { provide: 'AppEntityService', useExisting: AppEntityService };
const $AuthSessionEntityService: Provider = { provide: 'AuthSessionEntityService', useExisting: AuthSessionEntityService };
@@ -258,6 +279,7 @@ const $FlashLikeEntityService: Provider = { provide: 'FlashLikeEntityService', u
const $RoleEntityService: Provider = { provide: 'RoleEntityService', useExisting: RoleEntityService };
const $ReversiGameEntityService: Provider = { provide: 'ReversiGameEntityService', useExisting: ReversiGameEntityService };
const $MetaEntityService: Provider = { provide: 'MetaEntityService', useExisting: MetaEntityService };
+const $SystemWebhookEntityService: Provider = { provide: 'SystemWebhookEntityService', useExisting: SystemWebhookEntityService };
const $ApAudienceService: Provider = { provide: 'ApAudienceService', useExisting: ApAudienceService };
const $ApDbResolverService: Provider = { provide: 'ApDbResolverService', useExisting: ApDbResolverService };
@@ -285,6 +307,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
],
providers: [
LoggerService,
+ AbuseReportService,
+ AbuseReportNotificationService,
AccountMoveService,
AccountUpdateService,
AiService,
@@ -322,6 +346,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
PushNotificationService,
QueryService,
ReactionService,
+ ReactionsBufferingService,
RelayService,
RoleService,
S3Service,
@@ -334,12 +359,17 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
UserKeypairService,
UserListService,
UserMutingService,
+ UserRenoteMutingService,
+ UserSearchService,
UserSuspendService,
UserAuthService,
VideoProcessingService,
- WebhookService,
+ UserWebhookService,
+ SystemWebhookService,
+ WebhookTestService,
UtilityService,
FileInfoService,
+ FlashService,
SearchService,
ClipService,
FeaturedService,
@@ -366,6 +396,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
AbuseUserReportEntityService,
AnnouncementEntityService,
+ AbuseReportNotificationRecipientEntityService,
AntennaEntityService,
AppEntityService,
AuthSessionEntityService,
@@ -399,6 +430,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
RoleEntityService,
ReversiGameEntityService,
MetaEntityService,
+ SystemWebhookEntityService,
ApAudienceService,
ApDbResolverService,
@@ -422,6 +454,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
//#region 文字列ベースでのinjection用(循環参照対応のため)
$LoggerService,
+ $AbuseReportService,
+ $AbuseReportNotificationService,
$AccountMoveService,
$AccountUpdateService,
$AiService,
@@ -459,6 +493,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$PushNotificationService,
$QueryService,
$ReactionService,
+ $ReactionsBufferingService,
$RelayService,
$RoleService,
$S3Service,
@@ -471,12 +506,17 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$UserKeypairService,
$UserListService,
$UserMutingService,
+ $UserRenoteMutingService,
+ $UserSearchService,
$UserSuspendService,
$UserAuthService,
$VideoProcessingService,
- $WebhookService,
+ $UserWebhookService,
+ $SystemWebhookService,
+ $WebhookTestService,
$UtilityService,
$FileInfoService,
+ $FlashService,
$SearchService,
$ClipService,
$FeaturedService,
@@ -503,6 +543,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$AbuseUserReportEntityService,
$AnnouncementEntityService,
+ $AbuseReportNotificationRecipientEntityService,
$AntennaEntityService,
$AppEntityService,
$AuthSessionEntityService,
@@ -536,6 +577,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$RoleEntityService,
$ReversiGameEntityService,
$MetaEntityService,
+ $SystemWebhookEntityService,
$ApAudienceService,
$ApDbResolverService,
@@ -560,6 +602,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
exports: [
QueueModule,
LoggerService,
+ AbuseReportService,
+ AbuseReportNotificationService,
AccountMoveService,
AccountUpdateService,
AiService,
@@ -597,6 +641,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
PushNotificationService,
QueryService,
ReactionService,
+ ReactionsBufferingService,
RelayService,
RoleService,
S3Service,
@@ -609,12 +654,17 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
UserKeypairService,
UserListService,
UserMutingService,
+ UserRenoteMutingService,
+ UserSearchService,
UserSuspendService,
UserAuthService,
VideoProcessingService,
- WebhookService,
+ UserWebhookService,
+ SystemWebhookService,
+ WebhookTestService,
UtilityService,
FileInfoService,
+ FlashService,
SearchService,
ClipService,
FeaturedService,
@@ -640,6 +690,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
AbuseUserReportEntityService,
AnnouncementEntityService,
+ AbuseReportNotificationRecipientEntityService,
AntennaEntityService,
AppEntityService,
AuthSessionEntityService,
@@ -673,6 +724,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
RoleEntityService,
ReversiGameEntityService,
MetaEntityService,
+ SystemWebhookEntityService,
ApAudienceService,
ApDbResolverService,
@@ -696,6 +748,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
//#region 文字列ベースでのinjection用(循環参照対応のため)
$LoggerService,
+ $AbuseReportService,
+ $AbuseReportNotificationService,
$AccountMoveService,
$AccountUpdateService,
$AiService,
@@ -733,6 +787,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$PushNotificationService,
$QueryService,
$ReactionService,
+ $ReactionsBufferingService,
$RelayService,
$RoleService,
$S3Service,
@@ -745,10 +800,14 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$UserKeypairService,
$UserListService,
$UserMutingService,
+ $UserRenoteMutingService,
+ $UserSearchService,
$UserSuspendService,
$UserAuthService,
$VideoProcessingService,
- $WebhookService,
+ $UserWebhookService,
+ $SystemWebhookService,
+ $WebhookTestService,
$UtilityService,
$FileInfoService,
$SearchService,
@@ -776,6 +835,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$AbuseUserReportEntityService,
$AnnouncementEntityService,
+ $AbuseReportNotificationRecipientEntityService,
$AntennaEntityService,
$AppEntityService,
$AuthSessionEntityService,
@@ -809,6 +869,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$RoleEntityService,
$ReversiGameEntityService,
$MetaEntityService,
+ $SystemWebhookEntityService,
$ApAudienceService,
$ApDbResolverService,
diff --git a/packages/backend/src/core/CustomEmojiService.ts b/packages/backend/src/core/CustomEmojiService.ts
index 7e11b9cdca..4566113449 100644
--- a/packages/backend/src/core/CustomEmojiService.ts
+++ b/packages/backend/src/core/CustomEmojiService.ts
@@ -24,7 +24,7 @@ const parseEmojiStrRegexp = /^([-\w]+)(?:@([\w.-]+))?$/;
@Injectable()
export class CustomEmojiService implements OnApplicationShutdown {
- private cache: MemoryKVCache;
+ private emojisCache: MemoryKVCache;
public localEmojisCache: RedisSingleCache